From 30dde55ace7c073847d0fa4fb7e281594629eacc Mon Sep 17 00:00:00 2001 From: Andreas Bielawski Date: Wed, 23 Mar 2022 17:04:52 +0100 Subject: [PATCH] Decompiled v1.9 Mod with dotPeek --- AssemblyInfo.cs | 14 + NUS Downloader/COPYING => LICENSE | 8 +- LocalTestRun.testrunconfig | 5 - NUS Downloader.csproj | 82 + NUS Downloader.pdb | Bin 0 -> 439808 bytes NUS Downloader.sln | 23 +- NUS Downloader.vsmdi | 6 - NUS Downloader/COMTypes.cs | 70 - NUS Downloader/CertificateChain.cs | 518 --- NUS Downloader/CommonKey.cs | 56 - NUS Downloader/ContentIndices.cs | 44 - NUS Downloader/Crystal_Clear_app_ark2.ico | Bin 102134 -> 0 bytes NUS Downloader/Database.cs | 834 ----- NUS Downloader/Form1.Designer.cs | 1199 ------- NUS Downloader/Form1.cs | 3063 ----------------- NUS Downloader/Form1.resx | 2080 ----------- NUS Downloader/Headers.cs | 747 ---- NUS Downloader/IosPatcher.cs | 313 -- NUS Downloader/Latest/NUS Downloader.exe | Bin 470016 -> 0 bytes NUS Downloader/Lz77.cs | 400 --- NUS Downloader/MessageEventArgs.cs | 29 - NUS Downloader/NUS Downloader.csproj | 254 -- NUS Downloader/NusClient.cs | 562 --- NUS Downloader/Program.cs | 69 - NUS Downloader/Properties/AssemblyInfo.cs | 36 - .../Properties/Resources.Designer.cs | 329 -- NUS Downloader/Properties/Resources.resx | 235 -- .../Properties/Settings.Designer.cs | 26 - NUS Downloader/Properties/Settings.settings | 7 - NUS Downloader/Properties/app.manifest | 26 - NUS Downloader/Resources/arrow_down.png | Bin 379 -> 0 bytes NUS Downloader/Resources/arrow_ticker.gif | Bin 847 -> 0 bytes NUS Downloader/Resources/arrow_up.png | Bin 372 -> 0 bytes NUS Downloader/Resources/bin_closed.png | Bin 363 -> 0 bytes NUS Downloader/Resources/box.png | Bin 555 -> 0 bytes NUS Downloader/Resources/bug_add.png | Bin 806 -> 0 bytes NUS Downloader/Resources/bug_error.png | Bin 841 -> 0 bytes NUS Downloader/Resources/bullet_green.png | Bin 295 -> 0 bytes NUS Downloader/Resources/bullet_orange.png | Bin 283 -> 0 bytes NUS Downloader/Resources/bullet_red.png | Bin 287 -> 0 bytes .../Resources/bullet_redgreen-blue.png | Bin 3218 -> 0 bytes NUS Downloader/Resources/bullet_redgreen.png | Bin 3107 -> 0 bytes NUS Downloader/Resources/bullet_redorange.png | Bin 3086 -> 0 bytes NUS Downloader/Resources/connect.png | Bin 748 -> 0 bytes NUS Downloader/Resources/database_save.png | Bin 755 -> 0 bytes NUS Downloader/Resources/disk.png | Bin 620 -> 0 bytes NUS Downloader/Resources/drive_disk.png | Bin 695 -> 0 bytes NUS Downloader/Resources/dsi.png | Bin 3596 -> 0 bytes NUS Downloader/Resources/dsi16x16.png | Bin 3288 -> 0 bytes NUS Downloader/Resources/folder.png | Bin 633 -> 0 bytes NUS Downloader/Resources/folder_table.png | Bin 675 -> 0 bytes NUS Downloader/Resources/help.png | Bin 786 -> 0 bytes NUS Downloader/Resources/help1.png | Bin 786 -> 0 bytes NUS Downloader/Resources/information.png | Bin 778 -> 0 bytes NUS Downloader/Resources/key.png | Bin 612 -> 0 bytes NUS Downloader/Resources/link.png | Bin 343 -> 0 bytes NUS Downloader/Resources/money.png | Bin 743 -> 0 bytes NUS Downloader/Resources/package.png | Bin 853 -> 0 bytes NUS Downloader/Resources/package_add.png | Bin 899 -> 0 bytes NUS Downloader/Resources/package_delete.png | Bin 891 -> 0 bytes NUS Downloader/Resources/package_green.png | Bin 896 -> 0 bytes .../Resources/page_white_magnify.png | Bin 554 -> 0 bytes NUS Downloader/Resources/pencil.png | Bin 450 -> 0 bytes NUS Downloader/Resources/picture_empty.png | Bin 463 -> 0 bytes NUS Downloader/Resources/script_code.png | Bin 859 -> 0 bytes NUS Downloader/Resources/script_code_red.png | Bin 868 -> 0 bytes NUS Downloader/Resources/script_go.png | Bin 839 -> 0 bytes NUS Downloader/Resources/script_start.png | Bin 887 -> 0 bytes NUS Downloader/Resources/server_connect.png | Bin 755 -> 0 bytes NUS Downloader/Resources/server_link.png | Bin 706 -> 0 bytes NUS Downloader/Resources/telephone_add.png | Bin 860 -> 0 bytes NUS Downloader/Resources/wii16x16.png | Bin 3495 -> 0 bytes NUS Downloader/Resources/wilolgoi.png | Bin 3826 -> 0 bytes NUS Downloader/Resources/wrench.png | Bin 617 -> 0 bytes NUS Downloader/Shared.cs | 272 -- NUS Downloader/TMD.cs | 659 ---- NUS Downloader/TODO | 21 - NUS Downloader/Ticket.cs | 626 ---- NUS Downloader/U8.cs | 1120 ------ NUS Downloader/WAD.cs | 1269 ------- NUS Downloader/WaterMarkTextBox.cs | 123 - NUS Downloader/Windows7ProgressBar.cs | 242 -- NUS Downloader/Windows7Taskbar.cs | 72 - NUS Downloader/app.config | 3 - NUS_Downloader/Database.cs | 600 ++++ NUS_Downloader/Form1.cs | 2923 ++++++++++++++++ NUS_Downloader/Form1.resx | 135 + NUS_Downloader/Program.cs | 49 + NUS_Downloader/Properties/Resources.cs | 123 + NUS_Downloader/Properties/Resources.resx | 234 ++ NUS_Downloader/Properties/Settings.cs | 21 + README.md | 14 + libWiiSharp/CertificateChain.cs | 433 +++ libWiiSharp/CommonKey.cs | 27 + libWiiSharp/CommonKeyType.cs | 14 + libWiiSharp/ContentIndices.cs | 33 + libWiiSharp/ContentType.cs | 15 + libWiiSharp/Headers.cs | 589 ++++ libWiiSharp/IosPatcher.cs | 244 ++ libWiiSharp/LowerTitleID.cs | 18 + libWiiSharp/Lz77.cs | 363 ++ libWiiSharp/MessageEventArgs.cs | 19 + libWiiSharp/NusClient.cs | 444 +++ libWiiSharp/Region.cs | 16 + libWiiSharp/Shared.cs | 148 + libWiiSharp/StoreType.cs | 17 + libWiiSharp/TMD.cs | 490 +++ libWiiSharp/TMD_Content.cs | 47 + libWiiSharp/Ticket.cs | 478 +++ libWiiSharp/U8.cs | 735 ++++ libWiiSharp/U8_Header.cs | 47 + libWiiSharp/U8_Node.cs | 51 + libWiiSharp/U8_NodeType.cs | 14 + libWiiSharp/WAD.cs | 922 +++++ libWiiSharp/WAD_Header.cs | 68 + wmgCMS/WaterMarkTextBox.cs | 95 + wyDay/Controls/CTaskbarList.cs | 20 + wyDay/Controls/ITaskbarList3.cs | 40 + wyDay/Controls/ProgressBarState.cs | 15 + wyDay/Controls/ThumbnailProgressState.cs | 17 + wyDay/Controls/Windows7ProgressBar.cs | 154 + wyDay/Controls/Windows7Taskbar.cs | 55 + 122 files changed, 9835 insertions(+), 15334 deletions(-) create mode 100644 AssemblyInfo.cs rename NUS Downloader/COPYING => LICENSE (99%) delete mode 100644 LocalTestRun.testrunconfig create mode 100644 NUS Downloader.csproj create mode 100644 NUS Downloader.pdb delete mode 100644 NUS Downloader.vsmdi delete mode 100644 NUS Downloader/COMTypes.cs delete mode 100644 NUS Downloader/CertificateChain.cs delete mode 100644 NUS Downloader/CommonKey.cs delete mode 100644 NUS Downloader/ContentIndices.cs delete mode 100644 NUS Downloader/Crystal_Clear_app_ark2.ico delete mode 100644 NUS Downloader/Database.cs delete mode 100644 NUS Downloader/Form1.Designer.cs delete mode 100644 NUS Downloader/Form1.cs delete mode 100644 NUS Downloader/Form1.resx delete mode 100644 NUS Downloader/Headers.cs delete mode 100644 NUS Downloader/IosPatcher.cs delete mode 100644 NUS Downloader/Latest/NUS Downloader.exe delete mode 100644 NUS Downloader/Lz77.cs delete mode 100644 NUS Downloader/MessageEventArgs.cs delete mode 100644 NUS Downloader/NUS Downloader.csproj delete mode 100644 NUS Downloader/NusClient.cs delete mode 100644 NUS Downloader/Program.cs delete mode 100644 NUS Downloader/Properties/AssemblyInfo.cs delete mode 100644 NUS Downloader/Properties/Resources.Designer.cs delete mode 100644 NUS Downloader/Properties/Resources.resx delete mode 100644 NUS Downloader/Properties/Settings.Designer.cs delete mode 100644 NUS Downloader/Properties/Settings.settings delete mode 100644 NUS Downloader/Properties/app.manifest delete mode 100644 NUS Downloader/Resources/arrow_down.png delete mode 100644 NUS Downloader/Resources/arrow_ticker.gif delete mode 100644 NUS Downloader/Resources/arrow_up.png delete mode 100644 NUS Downloader/Resources/bin_closed.png delete mode 100644 NUS Downloader/Resources/box.png delete mode 100644 NUS Downloader/Resources/bug_add.png delete mode 100644 NUS Downloader/Resources/bug_error.png delete mode 100644 NUS Downloader/Resources/bullet_green.png delete mode 100644 NUS Downloader/Resources/bullet_orange.png delete mode 100644 NUS Downloader/Resources/bullet_red.png delete mode 100644 NUS Downloader/Resources/bullet_redgreen-blue.png delete mode 100644 NUS Downloader/Resources/bullet_redgreen.png delete mode 100644 NUS Downloader/Resources/bullet_redorange.png delete mode 100644 NUS Downloader/Resources/connect.png delete mode 100644 NUS Downloader/Resources/database_save.png delete mode 100644 NUS Downloader/Resources/disk.png delete mode 100644 NUS Downloader/Resources/drive_disk.png delete mode 100644 NUS Downloader/Resources/dsi.png delete mode 100644 NUS Downloader/Resources/dsi16x16.png delete mode 100644 NUS Downloader/Resources/folder.png delete mode 100644 NUS Downloader/Resources/folder_table.png delete mode 100644 NUS Downloader/Resources/help.png delete mode 100644 NUS Downloader/Resources/help1.png delete mode 100644 NUS Downloader/Resources/information.png delete mode 100644 NUS Downloader/Resources/key.png delete mode 100644 NUS Downloader/Resources/link.png delete mode 100644 NUS Downloader/Resources/money.png delete mode 100644 NUS Downloader/Resources/package.png delete mode 100644 NUS Downloader/Resources/package_add.png delete mode 100644 NUS Downloader/Resources/package_delete.png delete mode 100644 NUS Downloader/Resources/package_green.png delete mode 100644 NUS Downloader/Resources/page_white_magnify.png delete mode 100644 NUS Downloader/Resources/pencil.png delete mode 100644 NUS Downloader/Resources/picture_empty.png delete mode 100644 NUS Downloader/Resources/script_code.png delete mode 100644 NUS Downloader/Resources/script_code_red.png delete mode 100644 NUS Downloader/Resources/script_go.png delete mode 100644 NUS Downloader/Resources/script_start.png delete mode 100644 NUS Downloader/Resources/server_connect.png delete mode 100644 NUS Downloader/Resources/server_link.png delete mode 100644 NUS Downloader/Resources/telephone_add.png delete mode 100644 NUS Downloader/Resources/wii16x16.png delete mode 100644 NUS Downloader/Resources/wilolgoi.png delete mode 100644 NUS Downloader/Resources/wrench.png delete mode 100644 NUS Downloader/Shared.cs delete mode 100644 NUS Downloader/TMD.cs delete mode 100644 NUS Downloader/TODO delete mode 100644 NUS Downloader/Ticket.cs delete mode 100644 NUS Downloader/U8.cs delete mode 100644 NUS Downloader/WAD.cs delete mode 100644 NUS Downloader/WaterMarkTextBox.cs delete mode 100644 NUS Downloader/Windows7ProgressBar.cs delete mode 100644 NUS Downloader/Windows7Taskbar.cs delete mode 100644 NUS Downloader/app.config create mode 100644 NUS_Downloader/Database.cs create mode 100644 NUS_Downloader/Form1.cs create mode 100644 NUS_Downloader/Form1.resx create mode 100644 NUS_Downloader/Program.cs create mode 100644 NUS_Downloader/Properties/Resources.cs create mode 100644 NUS_Downloader/Properties/Resources.resx create mode 100644 NUS_Downloader/Properties/Settings.cs create mode 100644 README.md create mode 100644 libWiiSharp/CertificateChain.cs create mode 100644 libWiiSharp/CommonKey.cs create mode 100644 libWiiSharp/CommonKeyType.cs create mode 100644 libWiiSharp/ContentIndices.cs create mode 100644 libWiiSharp/ContentType.cs create mode 100644 libWiiSharp/Headers.cs create mode 100644 libWiiSharp/IosPatcher.cs create mode 100644 libWiiSharp/LowerTitleID.cs create mode 100644 libWiiSharp/Lz77.cs create mode 100644 libWiiSharp/MessageEventArgs.cs create mode 100644 libWiiSharp/NusClient.cs create mode 100644 libWiiSharp/Region.cs create mode 100644 libWiiSharp/Shared.cs create mode 100644 libWiiSharp/StoreType.cs create mode 100644 libWiiSharp/TMD.cs create mode 100644 libWiiSharp/TMD_Content.cs create mode 100644 libWiiSharp/Ticket.cs create mode 100644 libWiiSharp/U8.cs create mode 100644 libWiiSharp/U8_Header.cs create mode 100644 libWiiSharp/U8_Node.cs create mode 100644 libWiiSharp/U8_NodeType.cs create mode 100644 libWiiSharp/WAD.cs create mode 100644 libWiiSharp/WAD_Header.cs create mode 100644 wmgCMS/WaterMarkTextBox.cs create mode 100644 wyDay/Controls/CTaskbarList.cs create mode 100644 wyDay/Controls/ITaskbarList3.cs create mode 100644 wyDay/Controls/ProgressBarState.cs create mode 100644 wyDay/Controls/ThumbnailProgressState.cs create mode 100644 wyDay/Controls/Windows7ProgressBar.cs create mode 100644 wyDay/Controls/Windows7Taskbar.cs diff --git a/AssemblyInfo.cs b/AssemblyInfo.cs new file mode 100644 index 0000000..84240ed --- /dev/null +++ b/AssemblyInfo.cs @@ -0,0 +1,14 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("NUS Downloader")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("NUS Downloader")] +[assembly: AssemblyCopyright("Copyright © 2009")] +[assembly: AssemblyTrademark("")] +[assembly: ComVisible(false)] +[assembly: Guid("cb4ee0f5-7ba8-4ee6-a09e-7a09d4350582")] +[assembly: AssemblyVersion("1.0.0.0")] diff --git a/NUS Downloader/COPYING b/LICENSE similarity index 99% rename from NUS Downloader/COPYING rename to LICENSE index 94a9ed0..e72bfdd 100644 --- a/NUS Downloader/COPYING +++ b/LICENSE @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. \ No newline at end of file diff --git a/LocalTestRun.testrunconfig b/LocalTestRun.testrunconfig deleted file mode 100644 index 5561d35..0000000 --- a/LocalTestRun.testrunconfig +++ /dev/null @@ -1,5 +0,0 @@ - - - This is a default test run configuration for a local test run. - - \ No newline at end of file diff --git a/NUS Downloader.csproj b/NUS Downloader.csproj new file mode 100644 index 0000000..e255711 --- /dev/null +++ b/NUS Downloader.csproj @@ -0,0 +1,82 @@ + + + + + Debug + AnyCPU + {9DFC0D36-D4CB-4FE3-A1A2-C21B1665D4E1} + WinExe + NUS Downloader + v3.5 + 1.0.0.0 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/NUS Downloader.pdb b/NUS Downloader.pdb new file mode 100644 index 0000000000000000000000000000000000000000..51bc3c3310c7d43a8efb8bf66b052d424411b304 GIT binary patch literal 439808 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 =JYCXp}Pzec0#pZLvoBr1@b&r@ZRqj7`@K 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 - - - - - \ No newline at end of file diff --git a/NUS Downloader/COMTypes.cs b/NUS Downloader/COMTypes.cs deleted file mode 100644 index 49e79e0..0000000 --- a/NUS Downloader/COMTypes.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. - -using System; -using System.Runtime.InteropServices; - -namespace wyDay.Controls -{ - /// - /// Represents the thumbnail progress bar state. - /// - public enum ThumbnailProgressState - { - /// - /// No progress is displayed. - /// - NoProgress = 0, - /// - /// The progress is indeterminate (marquee). - /// - Indeterminate = 0x1, - /// - /// Normal progress is displayed. - /// - Normal = 0x2, - /// - /// An error occurred (red). - /// - Error = 0x4, - /// - /// The operation is paused (yellow). - /// - Paused = 0x8 - } - - //Based on Rob Jarett's wrappers for the desktop integration PDC demos. - [ComImportAttribute()] - [GuidAttribute("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")] - [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] - internal interface ITaskbarList3 - { - // ITaskbarList - [PreserveSig] - void HrInit(); - [PreserveSig] - void AddTab(IntPtr hwnd); - [PreserveSig] - void DeleteTab(IntPtr hwnd); - [PreserveSig] - void ActivateTab(IntPtr hwnd); - [PreserveSig] - void SetActiveAlt(IntPtr hwnd); - - // ITaskbarList2 - [PreserveSig] - void MarkFullscreenWindow( - IntPtr hwnd, - [MarshalAs(UnmanagedType.Bool)] bool fFullscreen); - - // ITaskbarList3 - void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal); - void SetProgressState(IntPtr hwnd, ThumbnailProgressState tbpFlags); - - // yadda, yadda - there's more to the interface, but we don't need it. - } - - [GuidAttribute("56FDF344-FD6D-11d0-958A-006097C9A090")] - [ClassInterfaceAttribute(ClassInterfaceType.None)] - [ComImportAttribute()] - internal class CTaskbarList { } -} \ No newline at end of file diff --git a/NUS Downloader/CertificateChain.cs b/NUS Downloader/CertificateChain.cs deleted file mode 100644 index b2e7634..0000000 --- a/NUS Downloader/CertificateChain.cs +++ /dev/null @@ -1,518 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; -using System.Security.Cryptography; - -namespace libWiiSharp -{ - public class CertificateChain : IDisposable - { - private const string certCaHash = "5B7D3EE28706AD8DA2CBD5A6B75C15D0F9B6F318"; - private const string certCpHash = "6824D6DA4C25184F0D6DAF6EDB9C0FC57522A41C"; - private const string certXsHash = "09787045037121477824BC6A3E5E076156573F8A"; - private SHA1 sha = SHA1.Create(); - private bool[] certsComplete = new bool[3]; - - private byte[] certCa = new byte[0x400]; - private byte[] certCp = new byte[0x300]; - private byte[] certXs = new byte[0x300]; - - /// - /// If false, the Certificate Chain is not complete (i.e. at least one certificate is missing). - /// - public bool CertsComplete { get { return (certsComplete[0] && certsComplete[1] && certsComplete[2]); } } - - #region IDisposable Members - private bool isDisposed = false; - - ~CertificateChain() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing && !isDisposed) - { - sha.Clear(); - sha = null; - - certsComplete = null; - certCa = null; - certCp = null; - certXs = null; - } - - isDisposed = true; - } - #endregion - - #region Public Functions - /// - /// Loads a cert file. - /// - /// - /// - public static CertificateChain Load(string pathToCert) - { - return Load(File.ReadAllBytes(pathToCert)); - } - - /// - /// Loads a cert file. - /// - /// - /// - public static CertificateChain Load(byte[] certFile) - { - CertificateChain c = new CertificateChain(); - MemoryStream ms = new MemoryStream(certFile); - - try { c.parseCert(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - return c; - } - - /// - /// Loads a cert file. - /// - /// - /// - public static CertificateChain Load(Stream cert) - { - CertificateChain c = new CertificateChain(); - c.parseCert(cert); - return c; - } - - /// - /// Grabs certificates from Ticket and Tmd. - /// Ticket and Tmd must contain certs! (They do when they're downloaded from NUS!) - /// - /// - /// - /// - public static CertificateChain FromTikTmd(string pathToTik, string pathToTmd) - { - return FromTikTmd(File.ReadAllBytes(pathToTik), File.ReadAllBytes(pathToTmd)); - } - - /// - /// Grabs certificates from Ticket and Tmd. - /// Ticket and Tmd must contain certs! (They do when they're downloaded from NUS!) - /// - /// - /// - /// - public static CertificateChain FromTikTmd(string pathToTik, byte[] tmdFile) - { - return FromTikTmd(File.ReadAllBytes(pathToTik), tmdFile); - } - - /// - /// Grabs certificates from Ticket and Tmd. - /// Ticket and Tmd must contain certs! (They do when they're downloaded from NUS!) - /// - /// - /// - /// - public static CertificateChain FromTikTmd(byte[] tikFile, byte[] tmdFile) - { - CertificateChain c = new CertificateChain(); - MemoryStream ms = new MemoryStream(tikFile); - - try { c.grabFromTik(ms); } - catch { ms.Dispose(); throw; } - - ms = new MemoryStream(tmdFile); - - try { c.grabFromTmd(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - - if (!c.CertsComplete) throw new Exception("Couldn't locate all certs!"); - - return c; - } - - /// - /// Grabs certificates from Ticket and Tmd. - /// Ticket and Tmd must contain certs! (They do when they're downloaded from NUS!) - /// - /// - /// - /// - public static CertificateChain FromTikTmd(Stream tik, Stream tmd) - { - CertificateChain c = new CertificateChain(); - c.grabFromTik(tik); - c.grabFromTmd(tmd); - return c; - } - - - - /// - /// Loads a cert file. - /// - /// - public void LoadFile(string pathToCert) - { - LoadFile(File.ReadAllBytes(pathToCert)); - } - - /// - /// Loads a cert file. - /// - /// - public void LoadFile(byte[] certFile) - { - MemoryStream ms = new MemoryStream(certFile); - - try { parseCert(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - } - - /// - /// Loads a cert file. - /// - /// - public void LoadFile(Stream cert) - { - parseCert(cert); - } - - /// - /// Grabs certificates from Ticket and Tmd. - /// Ticket and Tmd must contain certs! (They do when they're downloaded from NUS!) - /// - /// - /// - /// - public void LoadFromTikTmd(string pathToTik, string pathToTmd) - { - LoadFromTikTmd(File.ReadAllBytes(pathToTik), File.ReadAllBytes(pathToTmd)); - } - - /// - /// Grabs certificates from Ticket and Tmd. - /// Ticket and Tmd must contain certs! (They do when they're downloaded from NUS!) - /// - /// - /// - /// - public void LoadFromTikTmd(string pathToTik, byte[] tmdFile) - { - LoadFromTikTmd(File.ReadAllBytes(pathToTik), tmdFile); - } - - /// - /// Grabs certificates from Ticket and Tmd. - /// Ticket and Tmd must contain certs! (They do when they're downloaded from NUS!) - /// - /// - /// - public void LoadFromTikTmd(byte[] tikFile, byte[] tmdFile) - { - MemoryStream ms = new MemoryStream(tikFile); - - try { grabFromTik(ms); } - catch { ms.Dispose(); throw; } - - ms = new MemoryStream(tmdFile); - - try { grabFromTmd(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - - if (!CertsComplete) throw new Exception("Couldn't locate all certs!"); - } - - /// - /// Grabs certificates from Ticket and Tmd. - /// Ticket and Tmd must contain certs! (They do when they're downloaded from NUS!) - /// - /// - /// - public void LoadFromTikTmd(Stream tik, Stream tmd) - { - grabFromTik(tik); - grabFromTmd(tmd); - } - - - - /// - /// Saves the Certificate Chain. - /// - /// - public void Save(string savePath) - { - if (File.Exists(savePath)) File.Delete(savePath); - - using (FileStream fs = new FileStream(savePath, FileMode.Create)) - writeToStream(fs); - } - - /// - /// Returns the Certificate Chain as a memory stream. - /// - /// - public MemoryStream ToMemoryStream() - { - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - return ms; - } - - /// - /// Returns the Certificate Chain as a byte array. - /// - /// - public byte[] ToByteArray() - { - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - byte[] res = ms.ToArray(); - ms.Dispose(); - return res; - } - #endregion - - #region Private Functions - private void writeToStream(Stream writeStream) - { - fireDebug("Writing Certificate Chain..."); - - if (!CertsComplete) - { fireDebug(" Certificate Chain incomplete..."); throw new Exception("At least one certificate is missing!"); } - - writeStream.Seek(0, SeekOrigin.Begin); - - fireDebug(" Writing Certificate CA... (Offset: 0x{0})", writeStream.Position.ToString("x8")); - writeStream.Write(certCa, 0, certCa.Length); - - fireDebug(" Writing Certificate CP... (Offset: 0x{0})", writeStream.Position.ToString("x8")); - writeStream.Write(certCp, 0, certCp.Length); - - fireDebug(" Writing Certificate XS... (Offset: 0x{0})", writeStream.Position.ToString("x8")); - writeStream.Write(certXs, 0, certXs.Length); - - fireDebug("Writing Certificate Chain Finished..."); - } - - private void parseCert(Stream certFile) - { - fireDebug("Parsing Certificate Chain..."); - int off = 0; - - for (int i = 0; i < 3; i++) - { - fireDebug(" Scanning at Offset 0x{0}:", off.ToString("x8")); - - try - { - certFile.Seek(off, SeekOrigin.Begin); - byte[] temp = new byte[0x400]; - - certFile.Read(temp, 0, temp.Length); - - fireDebug(" Checking for Certificate CA..."); - if (isCertCa(temp) && !certsComplete[1]) - { fireDebug(" Certificate CA detected..."); certCa = temp; certsComplete[1] = true; off += 0x400; continue; } - - fireDebug(" Checking for Certificate CP..."); - if (isCertCp(temp) && !certsComplete[2]) - { fireDebug(" Certificate CP detected..."); Array.Resize(ref temp, 0x300); certCp = temp; certsComplete[2] = true; off += 0x300; continue; } - - fireDebug(" Checking for Certificate XS..."); - if (isCertXs(temp) && !certsComplete[0]) - { fireDebug(" Certificate XS detected..."); Array.Resize(ref temp, 0x300); certXs = temp; certsComplete[0] = true; off += 0x300; continue; } - } - catch (Exception ex) { fireDebug("Error: {0}", ex.Message); } - - off += 0x300; - } - - if (!CertsComplete) - { fireDebug(" Couldn't locate all Certificates..."); throw new Exception("Couldn't locate all certs!"); } - - fireDebug("Parsing Certificate Chain Finished..."); - } - - private void grabFromTik(Stream tik) - { - fireDebug("Scanning Ticket for Certificates..."); - int off = 676; - - for (int i = 0; i < 3; i++) - { - fireDebug(" Scanning at Offset 0x{0}:", off.ToString("x8")); - - try - { - tik.Seek(off, SeekOrigin.Begin); - byte[] temp = new byte[0x400]; - - tik.Read(temp, 0, temp.Length); - - fireDebug(" Checking for Certificate CA..."); - if (isCertCa(temp) && !certsComplete[1]) - { fireDebug(" Certificate CA detected..."); certCa = temp; certsComplete[1] = true; off += 0x400; continue; } - - fireDebug(" Checking for Certificate CP..."); - if (isCertCp(temp) && !certsComplete[2]) - { fireDebug(" Certificate CP detected..."); Array.Resize(ref temp, 0x300); certCp = temp; certsComplete[2] = true; off += 0x300; continue; } - - fireDebug(" Checking for Certificate XS..."); - if (isCertXs(temp) && !certsComplete[0]) - { fireDebug(" Certificate XS detected..."); Array.Resize(ref temp, 0x300); certXs = temp; certsComplete[0] = true; off += 0x300; continue; } - } - catch { } - - off += 0x300; - } - - fireDebug("Scanning Ticket for Certificates Finished..."); - } - - private void grabFromTmd(Stream tmd) - { - fireDebug("Scanning TMD for Certificates..."); - - byte[] temp = new byte[2]; - tmd.Seek(478, SeekOrigin.Begin); - tmd.Read(temp, 0, 2); - - int numContents = Shared.Swap(BitConverter.ToUInt16(temp, 0)); - int off = 484 + numContents * 36; - - for (int i = 0; i < 3; i++) - { - fireDebug(" Scanning at Offset 0x{0}:", off.ToString("x8")); - - try - { - tmd.Seek(off, SeekOrigin.Begin); - temp = new byte[0x400]; - - tmd.Read(temp, 0, temp.Length); - - fireDebug(" Checking for Certificate CA..."); - if (isCertCa(temp) && !certsComplete[1]) - { fireDebug(" Certificate CA detected..."); certCa = temp; certsComplete[1] = true; off += 0x400; continue; } - - fireDebug(" Checking for Certificate CP..."); - if (isCertCp(temp) && !certsComplete[2]) - { fireDebug(" Certificate CP detected..."); Array.Resize(ref temp, 0x300); certCp = temp; certsComplete[2] = true; off += 0x300; continue; } - - fireDebug(" Checking for Certificate XS..."); - if (isCertXs(temp) && !certsComplete[0]) - { fireDebug(" Certificate XS detected..."); Array.Resize(ref temp, 0x300); certXs = temp; certsComplete[0] = true; off += 0x300; continue; } - } - catch { } - - off += 0x300; - } - - fireDebug("Scanning TMD for Certificates Finished..."); - } - - private bool isCertXs(byte[] part) - { - if (part.Length < 0x300) return false; - else if (part.Length > 0x300) Array.Resize(ref part, 0x300); - - if (part[0x184] == 'X' && part[0x185] == 'S') - { - byte[] newHash = sha.ComputeHash(part); - byte[] oldHash = Shared.HexStringToByteArray(certXsHash); - - if (Shared.CompareByteArrays(newHash, oldHash)) return true; - } - - return false; - } - - private bool isCertCa(byte[] part) - { - if (part.Length < 0x400) return false; - else if (part.Length > 0x400) Array.Resize(ref part, 0x400); - - if (part[0x284] == 'C' && part[0x285] == 'A') - { - byte[] newHash = sha.ComputeHash(part); - byte[] oldHash = Shared.HexStringToByteArray(certCaHash); - - if (Shared.CompareByteArrays(newHash, oldHash)) return true; - } - - return false; - } - - private bool isCertCp(byte[] part) - { - if (part.Length < 0x300) return false; - else if (part.Length > 0x300) Array.Resize(ref part, 0x300); - - if (part[0x184] == 'C' && part[0x185] == 'P') - { - byte[] newHash = sha.ComputeHash(part); - byte[] oldHash = Shared.HexStringToByteArray(certCpHash); - - if (Shared.CompareByteArrays(newHash, oldHash)) return true; - } - - return false; - } - #endregion - - #region Events - /// - /// Fires debugging messages. You may write them into a log file or log textbox. - /// - public event EventHandler Debug; - - private void fireDebug(string debugMessage, params object[] args) - { - EventHandler debug = Debug; - if (debug != null) - debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); - } - #endregion - } -} diff --git a/NUS Downloader/CommonKey.cs b/NUS Downloader/CommonKey.cs deleted file mode 100644 index 13766ee..0000000 --- a/NUS Downloader/CommonKey.cs +++ /dev/null @@ -1,56 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace libWiiSharp -{ - public class CommonKey - { - private static string standardKey = "ebe42a225e8593e448d9c5457381aaf7"; - private static string koreanKey = "63b82bb4f4614e2e13f2fefbba4c9b7e"; - private static string dsiKey = "af1bf516a807d21aea45984f04742861"; - - private static string currentDir = System.IO.Directory.GetCurrentDirectory(); - - private static string standardKeyName = "key.bin"; - private static string koreanKeyName = "kkey.bin"; - private static string dsiKeyName = "dsikey.bin"; - - public static byte[] GetStandardKey() - { - if (System.IO.File.Exists(System.IO.Path.Combine(currentDir, standardKeyName))) - return System.IO.File.ReadAllBytes(System.IO.Path.Combine(currentDir, standardKeyName)); - else - return Shared.HexStringToByteArray(standardKey); - } - - public static byte[] GetKoreanKey() - { - if (System.IO.File.Exists(System.IO.Path.Combine(currentDir, koreanKeyName))) - return System.IO.File.ReadAllBytes(System.IO.Path.Combine(currentDir, koreanKeyName)); - else - return Shared.HexStringToByteArray(koreanKey); - } - - public static byte[] GetDSiKey() - { - if (System.IO.File.Exists(System.IO.Path.Combine(currentDir, dsiKeyName))) - return System.IO.File.ReadAllBytes(System.IO.Path.Combine(currentDir, dsiKeyName)); - else - return Shared.HexStringToByteArray(dsiKey); - } - } -} diff --git a/NUS Downloader/ContentIndices.cs b/NUS Downloader/ContentIndices.cs deleted file mode 100644 index 483d778..0000000 --- a/NUS Downloader/ContentIndices.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace libWiiSharp -{ - internal struct ContentIndices : IComparable - { - private int index; - private int contentIndex; - - public int Index { get { return index; } } - public int ContentIndex { get { return contentIndex; } } - - public ContentIndices(int index, int contentIndex) - { - this.index = index; - this.contentIndex = contentIndex; - } - - public int CompareTo(object obj) - { - if (obj is ContentIndices) return contentIndex.CompareTo(((ContentIndices)obj).contentIndex); - else throw new ArgumentException(); - } - } -} diff --git a/NUS Downloader/Crystal_Clear_app_ark2.ico b/NUS Downloader/Crystal_Clear_app_ark2.ico deleted file mode 100644 index 726d2e1e936b55cefa98792d1a5e26608cbf72e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102134 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 A0ssI2 diff --git a/NUS Downloader/Database.cs b/NUS Downloader/Database.cs deleted file mode 100644 index b30c625..0000000 --- a/NUS Downloader/Database.cs +++ /dev/null @@ -1,834 +0,0 @@ -/////////////////////////////////////////// -// NUS Downloader: Database.cs // -// $Rev:: $ // -// $Author:: $ // -// $Date:: $ // -/////////////////////////////////////////// - -using System; -using System.Windows.Forms; -using System.IO; -using System.Xml; -using System.Drawing; - -namespace NUS_Downloader -{ - class Database - { - private string SystemTag = "SYS"; - private string IosTag = "IOS"; - private string VcTag = "VC"; - private string WwTag = "WW"; - private string UpdateTag = "UPD"; - - private string DSiSystemTag = "DSISYSTEM"; - private string DSiWareTag = "DSIWARE"; - - private string[] VcConsoles = new string[11] { "C64", "GEN", "MSX", "N64", "NEO", "NES", - "SMS", "SNES", "TG16", "TGCD", "ARC" }; - - private string databaseString; - - public static Image green = Properties.Resources.bullet_green; - public static Image orange = Properties.Resources.bullet_orange; - public static Image redgreen = Properties.Resources.bullet_redgreen; - public static Image redorange = Properties.Resources.bullet_redorange; - - public static Image green_blue = Properties.Resources.bullet_green_blue; - public static Image orange_blue = Properties.Resources.bullet_orange_blue; - public static Image redgreen_blue = Properties.Resources.bullet_redgreen_blue; - public static Image redorange_blue = Properties.Resources.bullet_redorange_blue; - - public void LoadDatabaseToStream(string databaseFile) - { - // Does it exist? - if (!File.Exists(databaseFile)) - throw new FileNotFoundException("I couldn't find the database file!", "database.xml"); - - databaseString = File.ReadAllText(databaseFile); - - } - - public string GetDatabaseVersion() - { - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - XmlNodeList DatabaseList = xDoc.GetElementsByTagName("database"); - XmlAttributeCollection Attributes = DatabaseList[0].Attributes; - return Attributes[0].Value; - } - - public static string GetDatabaseVersion(string databaseString) - { - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - XmlNodeList DatabaseList = xDoc.GetElementsByTagName("database"); - XmlAttributeCollection Attributes = DatabaseList[0].Attributes; - return Attributes[0].Value; - } - - public ToolStripMenuItem[] LoadSystemTitles() - { - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - - XmlNodeList SystemTitlesXMLNodes = xDoc.GetElementsByTagName(SystemTag); - - ToolStripMenuItem[] systemTitleCollection = new ToolStripMenuItem[SystemTitlesXMLNodes.Count]; - - for (int x = 0; x < SystemTitlesXMLNodes.Count; x++) - { - ToolStripMenuItem XMLToolStripItem = new ToolStripMenuItem(); - XmlAttributeCollection XMLAttributes = SystemTitlesXMLNodes[x].Attributes; - - string titleID = ""; - string descname = ""; - bool dangerous = false; - bool ticket = true; - - XmlNodeList ChildrenOfTheNode = SystemTitlesXMLNodes[x].ChildNodes; - - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - switch (ChildrenOfTheNode[z].Name) - { - case "name": - descname = ChildrenOfTheNode[z].InnerText; - break; - case "titleID": - titleID = ChildrenOfTheNode[z].InnerText; - break; - case "version": - string[] versions = ChildrenOfTheNode[z].InnerText.Split(','); - // Add to region things? - if (XMLToolStripItem.DropDownItems.Count > 0) - { - for (int b = 0; b < XMLToolStripItem.DropDownItems.Count; b++) - { - if (ChildrenOfTheNode[z].InnerText != "") - { - ToolStripMenuItem regitem = - (ToolStripMenuItem)XMLToolStripItem.DropDownItems[b]; - regitem.DropDownItems.Add("Latest Version"); - for (int y = 0; y < versions.Length; y++) - { - regitem.DropDownItems.Add("v" + versions[y]); - } - //regitem.DropDownItemClicked += new ToolStripItemClickedEventHandler(Application.); - } - } - } - else - { - XMLToolStripItem.DropDownItems.Add("Latest Version"); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < versions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add("v" + versions[y]); - } - } - } - break; - case "region": - string[] regions = ChildrenOfTheNode[z].InnerText.Split(','); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < regions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add(RegionFromIndex(Convert.ToInt32(regions[y]))); - } - } - break; - default: - break; - case "ticket": - ticket = Convert.ToBoolean(ChildrenOfTheNode[z].InnerText); - break; - case "danger": - dangerous = true; - XMLToolStripItem.ToolTipText = ChildrenOfTheNode[z].InnerText; - break; - } - XMLToolStripItem.Image = SelectItemImage(ticket, dangerous); - - if (titleID != "") - { - XMLToolStripItem.Text = String.Format("{0} - {1}", titleID, descname); - } - else - { // Wait what? - XMLToolStripItem.Text = descname; - } - } - //AddToolStripItemToStrip(i, XMLToolStripItem, XMLAttributes); - systemTitleCollection[x] = XMLToolStripItem; - } - - return systemTitleCollection; - } - - public ToolStripMenuItem[] LoadIosTitles() - { - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - XmlNodeList IosTitlesXMLNodes = xDoc.GetElementsByTagName(IosTag); - ToolStripMenuItem[] iosTitleCollection = new ToolStripMenuItem[IosTitlesXMLNodes.Count]; - - for (int x = 0; x < IosTitlesXMLNodes.Count; x++) - { - ToolStripMenuItem XMLToolStripItem = new ToolStripMenuItem(); - XmlAttributeCollection XMLAttributes = IosTitlesXMLNodes[x].Attributes; - - string titleID = ""; - string descname = ""; - bool dangerous = false; - bool ticket = true; - - XmlNodeList ChildrenOfTheNode = IosTitlesXMLNodes[x].ChildNodes; - - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - switch (ChildrenOfTheNode[z].Name) - { - case "name": - descname = ChildrenOfTheNode[z].InnerText; - break; - case "titleID": - titleID = ChildrenOfTheNode[z].InnerText; - break; - case "version": - string[] versions = ChildrenOfTheNode[z].InnerText.Split(','); - XMLToolStripItem.DropDownItems.Add("Latest Version"); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < versions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add("v" + versions[y]); - } - } - break; - case "ticket": - ticket = Convert.ToBoolean(ChildrenOfTheNode[z].InnerText); - break; - case "danger": - dangerous = true; - XMLToolStripItem.ToolTipText = ChildrenOfTheNode[z].InnerText; - break; - default: - break; - } - XMLToolStripItem.Image = SelectItemImage(ticket, dangerous); - - if (titleID != "") - XMLToolStripItem.Text = String.Format("{0} - {1}", titleID, descname); - else - XMLToolStripItem.Text = descname; //Huh - } - - iosTitleCollection[x] = XMLToolStripItem; - } - - return iosTitleCollection; - } - - public ToolStripMenuItem[][] LoadVirtualConsoleTitles() - { - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - XmlNodeList VirtualConsoleXMLNodes = xDoc.GetElementsByTagName(VcTag); - ToolStripMenuItem[][] vcTitleCollection = new ToolStripMenuItem[VcConsoles.Length][]; - - for (int j = 0; j < vcTitleCollection.Length; j++) - { - vcTitleCollection[j] = new ToolStripMenuItem[0]; - } - - for (int x = 0; x < VirtualConsoleXMLNodes.Count; x++) - { - ToolStripMenuItem XMLToolStripItem = new ToolStripMenuItem(); - XmlAttributeCollection XMLAttributes = VirtualConsoleXMLNodes[x].Attributes; - - string titleID = ""; - string descname = ""; - bool dangerous = false; - bool ticket = true; - - XmlNodeList ChildrenOfTheNode = VirtualConsoleXMLNodes[x].ChildNodes; - - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - switch (ChildrenOfTheNode[z].Name) - { - case "name": - descname = ChildrenOfTheNode[z].InnerText; - break; - case "titleID": - titleID = ChildrenOfTheNode[z].InnerText; - break; - case "version": - string[] versions = ChildrenOfTheNode[z].InnerText.Split(','); - // Add to region things? - if (XMLToolStripItem.DropDownItems.Count > 0) - { - for (int b = 0; b < XMLToolStripItem.DropDownItems.Count; b++) - { - if (ChildrenOfTheNode[z].InnerText != "") - { - ToolStripMenuItem regitem = - (ToolStripMenuItem)XMLToolStripItem.DropDownItems[b]; - regitem.DropDownItems.Add("Latest Version"); - for (int y = 0; y < versions.Length; y++) - { - regitem.DropDownItems.Add("v" + versions[y]); - } - //regitem.DropDownItemClicked += new ToolStripItemClickedEventHandler(deepitem_clicked); - } - } - } - else - { - XMLToolStripItem.DropDownItems.Add("Latest Version"); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < versions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add("v" + versions[y]); - } - } - } - break; - case "region": - string[] regions = ChildrenOfTheNode[z].InnerText.Split(','); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < regions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add(RegionFromIndex(Convert.ToInt32(regions[y]))); - } - } - break; - default: - break; - case "ticket": - ticket = Convert.ToBoolean(ChildrenOfTheNode[z].InnerText); - break; - case "danger": - dangerous = true; - XMLToolStripItem.ToolTipText = ChildrenOfTheNode[z].InnerText; - break; - } - XMLToolStripItem.Image = SelectItemImage(ticket, dangerous); - - if (titleID != "") - { - XMLToolStripItem.Text = String.Format("{0} - {1}", titleID, descname); - } - else - { // Wait what? - XMLToolStripItem.Text = descname; - } - } - - for (int a = 0; a < VcConsoles.Length; a++) - { - if (XMLAttributes[0].Value == VcConsoles[a]) - { - Array.Resize(ref vcTitleCollection[a], vcTitleCollection[a].Length + 1); - vcTitleCollection[a][vcTitleCollection[a].Length - 1] = XMLToolStripItem; - } - } - } - - return vcTitleCollection; - } - - public ToolStripMenuItem[] LoadWiiWareTitles() - { - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - XmlNodeList WiiWareTitlesXMLNodes = xDoc.GetElementsByTagName(WwTag); - ToolStripMenuItem[] wwTitleCollection = new ToolStripMenuItem[WiiWareTitlesXMLNodes.Count]; - - for (int x = 0; x < WiiWareTitlesXMLNodes.Count; x++) - { - ToolStripMenuItem XMLToolStripItem = new ToolStripMenuItem(); - XmlAttributeCollection XMLAttributes = WiiWareTitlesXMLNodes[x].Attributes; - - string titleID = ""; - string descname = ""; - bool dangerous = false; - bool ticket = true; - - XmlNodeList ChildrenOfTheNode = WiiWareTitlesXMLNodes[x].ChildNodes; - - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - switch (ChildrenOfTheNode[z].Name) - { - case "name": - descname = ChildrenOfTheNode[z].InnerText; - break; - case "titleID": - titleID = ChildrenOfTheNode[z].InnerText; - break; - case "version": - string[] versions = ChildrenOfTheNode[z].InnerText.Split(','); - // Add to region things? - if (XMLToolStripItem.DropDownItems.Count > 0) - { - for (int b = 0; b < XMLToolStripItem.DropDownItems.Count; b++) - { - if (ChildrenOfTheNode[z].InnerText != "") - { - ToolStripMenuItem regitem = - (ToolStripMenuItem)XMLToolStripItem.DropDownItems[b]; - regitem.DropDownItems.Add("Latest Version"); - for (int y = 0; y < versions.Length; y++) - { - regitem.DropDownItems.Add("v" + versions[y]); - } - //regitem.DropDownItemClicked += new ToolStripItemClickedEventHandler(deepitem_clicked); - } - } - } - else - { - XMLToolStripItem.DropDownItems.Add("Latest Version"); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < versions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add("v" + versions[y]); - } - } - } - break; - case "region": - string[] regions = ChildrenOfTheNode[z].InnerText.Split(','); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < regions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add(RegionFromIndex(Convert.ToInt32(regions[y]))); - } - } - break; - default: - break; - case "ticket": - ticket = Convert.ToBoolean(ChildrenOfTheNode[z].InnerText); - break; - case "danger": - dangerous = true; - XMLToolStripItem.ToolTipText = ChildrenOfTheNode[z].InnerText; - break; - } - XMLToolStripItem.Image = SelectItemImage(ticket, dangerous); - - if (titleID != "") - { - XMLToolStripItem.Text = String.Format("{0} - {1}", titleID, descname); - } - else - { // Wait what? - XMLToolStripItem.Text = descname; - } - } - - wwTitleCollection[x] = XMLToolStripItem; - } - - return wwTitleCollection; - } - - /// - /// Gathers the region based on index - /// - /// The index. - /// XmlDocument with database inside - /// Region desc - private string RegionFromIndex(int index) - { - /* Typical Region XML - * - 41 (All/System) - 44 (German) - 45 (USA/NTSC) - 46 (French) - 4A (Japan) - 4B (Korea) - 4C (Japanese Import to Europe/Australia/PAL) - 4D (American Import to Europe/Australia/PAL) - 4E (Japanese Import to USA/NTSC) - 50 (Europe/PAL) - 51 (Korea w/ Japanese Language) - 54 (Korea w/ English Language) - 58 (Some Homebrew) - - */ - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - - XmlNodeList XMLRegionList = xDoc.GetElementsByTagName("REGIONS"); - XmlNodeList ChildrenOfTheNode = XMLRegionList[0].ChildNodes; - - // For each child node (region node) - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - // Gather attributes (index='x') - XmlAttributeCollection XMLAttributes = ChildrenOfTheNode[z].Attributes; - - // Return value of node if index matches - if (Convert.ToInt32(XMLAttributes[0].Value) == index) - return ChildrenOfTheNode[z].InnerText; - } - - return "XX (Error)"; - } - - /// - /// Selects the database item image. - /// - /// if set to true [ticket]. - /// if set to true [danger]. - /// Correct Image - private System.Drawing.Image SelectItemImage(bool ticket, bool danger) - { - // All is good, go green... - if ((ticket) && (!danger)) - return green; - - // There's no ticket, but danger is clear... - if ((!ticket) && (!danger)) - return orange; - - // DANGER WILL ROBINSON... - if ((ticket) && (danger)) - return redgreen; - - // Double bad... - if ((!ticket) && (danger)) - return redorange; - - return null; - } - - /// - /// Loads the region codes. - /// - public ToolStripMenuItem[] LoadRegionCodes() - { - /* TODO: make this check InvokeRequired... - if (this.InvokeRequired) - { - Debug.Write("TOLDYOUSO!"); - BootChecksCallback bcc = new BootChecksCallback(LoadRegionCodes); - this.Invoke(bcc); - return; - }*/ - - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - - XmlNodeList XMLRegionList = xDoc.GetElementsByTagName("REGIONS"); - XmlNodeList ChildrenOfTheNode = XMLRegionList[0].ChildNodes; - - ToolStripMenuItem[] regionItems = new ToolStripMenuItem[ChildrenOfTheNode.Count]; - - // For each child node (region node) - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - regionItems[z] = new ToolStripMenuItem(); - regionItems[z].Text = ChildrenOfTheNode[z].InnerText; - } - - return regionItems; - } - - public ToolStripMenuItem[] LoadScripts() - { - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - - XmlNodeList ScriptXMLNodes = xDoc.GetElementsByTagName(UpdateTag); - - ToolStripMenuItem[] scriptCollection = new ToolStripMenuItem[ScriptXMLNodes.Count]; - - for (int x = 0; x < ScriptXMLNodes.Count; x++) - { - ToolStripMenuItem XMLToolStripItem = new ToolStripMenuItem(); - XmlAttributeCollection XMLAttributes = ScriptXMLNodes[x].Attributes; - XmlNodeList ChildrenOfTheNode = ScriptXMLNodes[x].ChildNodes; - - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - switch (ChildrenOfTheNode[z].Name) - { - case "name": - XMLToolStripItem.Text = ChildrenOfTheNode[z].InnerText; - break; - case "script": - XMLToolStripItem.ToolTipText = ChildrenOfTheNode[z].InnerText; - break; - default: - break; - } - XMLToolStripItem.Image = Properties.Resources.script_start; - - } - scriptCollection[x] = XMLToolStripItem; - } - - return scriptCollection; - } - - public ToolStripMenuItem[] LoadDSiSystemTitles() - { - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - XmlNodeList DSiSystemTitlesXMLNodes = xDoc.GetElementsByTagName(DSiSystemTag); - ToolStripMenuItem[] dsiSystemTitleCollection = new ToolStripMenuItem[DSiSystemTitlesXMLNodes.Count]; - - for (int x = 0; x < DSiSystemTitlesXMLNodes.Count; x++) - { - ToolStripMenuItem XMLToolStripItem = new ToolStripMenuItem(); - XmlAttributeCollection XMLAttributes = DSiSystemTitlesXMLNodes[x].Attributes; - - string titleID = ""; - string descname = ""; - bool dangerous = false; - bool ticket = true; - - XmlNodeList ChildrenOfTheNode = DSiSystemTitlesXMLNodes[x].ChildNodes; - - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - switch (ChildrenOfTheNode[z].Name) - { - case "name": - descname = ChildrenOfTheNode[z].InnerText; - break; - case "titleID": - titleID = ChildrenOfTheNode[z].InnerText; - break; - case "version": - string[] versions = ChildrenOfTheNode[z].InnerText.Split(','); - // Add to region things? - if (XMLToolStripItem.DropDownItems.Count > 0) - { - for (int b = 0; b < XMLToolStripItem.DropDownItems.Count; b++) - { - if (ChildrenOfTheNode[z].InnerText != "") - { - ToolStripMenuItem regitem = - (ToolStripMenuItem)XMLToolStripItem.DropDownItems[b]; - regitem.DropDownItems.Add("Latest Version"); - for (int y = 0; y < versions.Length; y++) - { - regitem.DropDownItems.Add("v" + versions[y]); - } - //regitem.DropDownItemClicked += new ToolStripItemClickedEventHandler(deepitem_clicked); - } - } - } - else - { - XMLToolStripItem.DropDownItems.Add("Latest Version"); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < versions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add("v" + versions[y]); - } - } - } - break; - case "region": - string[] regions = ChildrenOfTheNode[z].InnerText.Split(','); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < regions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add(RegionFromIndex(Convert.ToInt32(regions[y]))); - } - } - break; - default: - break; - case "ticket": - ticket = Convert.ToBoolean(ChildrenOfTheNode[z].InnerText); - break; - case "danger": - dangerous = true; - XMLToolStripItem.ToolTipText = ChildrenOfTheNode[z].InnerText; - break; - } - XMLToolStripItem.Image = SelectItemImage(ticket, dangerous); - - if (titleID != "") - { - XMLToolStripItem.Text = String.Format("{0} - {1}", titleID, descname); - } - else - { // Wait what? - XMLToolStripItem.Text = descname; - } - } - - dsiSystemTitleCollection[x] = XMLToolStripItem; - } - - return dsiSystemTitleCollection; - } - - public ToolStripMenuItem[] LoadDsiWareTitles() - { - if (databaseString.Length < 1) - { - throw new Exception("Load the database into a memory stream first!"); - } - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(databaseString); - XmlNodeList DSiWareTitlesXMLNodes = xDoc.GetElementsByTagName(DSiWareTag); - ToolStripMenuItem[] DSiWareTitleCollection = new ToolStripMenuItem[DSiWareTitlesXMLNodes.Count]; - - for (int x = 0; x < DSiWareTitlesXMLNodes.Count; x++) - { - ToolStripMenuItem XMLToolStripItem = new ToolStripMenuItem(); - XmlAttributeCollection XMLAttributes = DSiWareTitlesXMLNodes[x].Attributes; - - string titleID = ""; - string descname = ""; - bool dangerous = false; - bool ticket = true; - - XmlNodeList ChildrenOfTheNode = DSiWareTitlesXMLNodes[x].ChildNodes; - - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - switch (ChildrenOfTheNode[z].Name) - { - case "name": - descname = ChildrenOfTheNode[z].InnerText; - break; - case "titleID": - titleID = ChildrenOfTheNode[z].InnerText; - break; - case "version": - string[] versions = ChildrenOfTheNode[z].InnerText.Split(','); - // Add to region things? - if (XMLToolStripItem.DropDownItems.Count > 0) - { - for (int b = 0; b < XMLToolStripItem.DropDownItems.Count; b++) - { - if (ChildrenOfTheNode[z].InnerText != "") - { - ToolStripMenuItem regitem = - (ToolStripMenuItem)XMLToolStripItem.DropDownItems[b]; - regitem.DropDownItems.Add("Latest Version"); - for (int y = 0; y < versions.Length; y++) - { - regitem.DropDownItems.Add("v" + versions[y]); - } - //regitem.DropDownItemClicked += new ToolStripItemClickedEventHandler(deepitem_clicked); - } - } - } - else - { - XMLToolStripItem.DropDownItems.Add("Latest Version"); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < versions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add("v" + versions[y]); - } - } - } - break; - case "region": - string[] regions = ChildrenOfTheNode[z].InnerText.Split(','); - if (ChildrenOfTheNode[z].InnerText != "") - { - for (int y = 0; y < regions.Length; y++) - { - XMLToolStripItem.DropDownItems.Add(RegionFromIndex(Convert.ToInt32(regions[y]))); - } - } - break; - default: - break; - case "ticket": - ticket = Convert.ToBoolean(ChildrenOfTheNode[z].InnerText); - break; - case "danger": - dangerous = true; - XMLToolStripItem.ToolTipText = ChildrenOfTheNode[z].InnerText; - break; - } - XMLToolStripItem.Image = SelectItemImage(ticket, dangerous); - - if (titleID != "") - { - XMLToolStripItem.Text = String.Format("{0} - {1}", titleID, descname); - } - else - { // Wait what? - XMLToolStripItem.Text = descname; - } - } - - DSiWareTitleCollection[x] = XMLToolStripItem; - } - - return DSiWareTitleCollection; - } - } -} diff --git a/NUS Downloader/Form1.Designer.cs b/NUS Downloader/Form1.Designer.cs deleted file mode 100644 index e241734..0000000 --- a/NUS Downloader/Form1.Designer.cs +++ /dev/null @@ -1,1199 +0,0 @@ -/////////////////////////////////////////// -// NUS Downloader: Form1.Designer.cs // -// $Rev:: $ // -// $Author:: $ // -// $Date:: $ // -/////////////////////////////////////////// - -namespace NUS_Downloader -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); - this.Extrasbtn = new System.Windows.Forms.Button(); - this.downloadstartbtn = new System.Windows.Forms.Button(); - this.statusbox = new System.Windows.Forms.RichTextBox(); - this.NUSDownloader = new System.ComponentModel.BackgroundWorker(); - this.label1 = new System.Windows.Forms.Label(); - this.wadnamebox = new System.Windows.Forms.TextBox(); - this.databaseStrip = new System.Windows.Forms.ContextMenuStrip(this.components); - this.SystemMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.systemFakeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.IOSMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.iosFakeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VCMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.C64MenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.GenesisMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.MSXMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.N64MenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.NeoGeoMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.NESMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.SegaMSMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.SNESMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.TurboGrafx16MenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.TurboGrafxCDMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.VCArcadeMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.vcFakeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.WiiWareMenuList = new System.Windows.Forms.ToolStripMenuItem(); - this.wwFakeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.dsiSystemToolStripMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.dsiFakeSystemToolStripMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.dSiWareToolStripMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.dSiWareFakeToolStripMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.RegionCodesList = new System.Windows.Forms.ToolStripMenuItem(); - this.wiiRegionCodesMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.dsiRegionCodesMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.updateDatabaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.extrasStrip = new System.Windows.Forms.ContextMenuStrip(this.components); - this.loadInfoFromTMDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.proxySettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.openNUSDDirectoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.moreExtrasToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.runFolderFixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.wiiBrewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.mainPageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.databasePageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.removeNUSDFilesFoldersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.databaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.localTicketInventoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.donateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.aboutNUSDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.proxyBox = new System.Windows.Forms.GroupBox(); - this.label13 = new System.Windows.Forms.Label(); - this.label12 = new System.Windows.Forms.Label(); - this.ProxyUser = new System.Windows.Forms.TextBox(); - this.SaveProxyBtn = new System.Windows.Forms.Button(); - this.ProxyAssistBtn = new System.Windows.Forms.Button(); - this.ProxyURL = new System.Windows.Forms.TextBox(); - this.ProxyVerifyBox = new System.Windows.Forms.GroupBox(); - this.SaveProxyPwdPermanentBtn = new System.Windows.Forms.Button(); - this.checkBox1 = new System.Windows.Forms.CheckBox(); - this.SaveProxyPwdBtn = new System.Windows.Forms.Button(); - this.label14 = new System.Windows.Forms.Label(); - this.ProxyPwdBox = new System.Windows.Forms.TextBox(); - this.scriptsbutton = new System.Windows.Forms.Button(); - this.scriptsStrip = new System.Windows.Forms.ContextMenuStrip(this.components); - this.scriptsLocalMenuEntry = new System.Windows.Forms.ToolStripMenuItem(); - this.scriptsDatabaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.loadNUSScriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.emulateUpdate = new System.Windows.Forms.ToolStripMenuItem(); - this.uSANTSCToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.europePALToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.japanNTSCJToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.koreaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.iosPatchGroupBox = new System.Windows.Forms.GroupBox(); - this.label2 = new System.Windows.Forms.Label(); - this.iosPatchesListBox = new System.Windows.Forms.CheckedListBox(); - this.iosPatchGroupBoxOKbtn = new System.Windows.Forms.Button(); - this.richPanel = new System.Windows.Forms.Panel(); - this.databaseButton = new System.Windows.Forms.Button(); - this.saveaswadbtn = new System.Windows.Forms.Button(); - this.iosPatchCheckbox = new System.Windows.Forms.CheckBox(); - this.keepenccontents = new System.Windows.Forms.CheckBox(); - this.clearButton = new System.Windows.Forms.Button(); - this.packbox = new System.Windows.Forms.CheckBox(); - this.decryptbox = new System.Windows.Forms.CheckBox(); - this.localuse = new System.Windows.Forms.CheckBox(); - this.serverLbl = new System.Windows.Forms.Label(); - this.titleidbox = new wmgCMS.WaterMarkTextBox(); - this.dlprogress = new wyDay.Controls.Windows7ProgressBar(); - this.titleversion = new wmgCMS.WaterMarkTextBox(); - this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.databaseStrip.SuspendLayout(); - this.extrasStrip.SuspendLayout(); - this.proxyBox.SuspendLayout(); - this.ProxyVerifyBox.SuspendLayout(); - this.scriptsStrip.SuspendLayout(); - this.iosPatchGroupBox.SuspendLayout(); - this.richPanel.SuspendLayout(); - this.SuspendLayout(); - // - // Extrasbtn - // - this.Extrasbtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.Extrasbtn.Location = new System.Drawing.Point(194, 5); - this.Extrasbtn.Name = "Extrasbtn"; - this.Extrasbtn.Size = new System.Drawing.Size(68, 27); - this.Extrasbtn.TabIndex = 2; - this.Extrasbtn.Text = "Extras..."; - this.Extrasbtn.UseVisualStyleBackColor = true; - this.Extrasbtn.Click += new System.EventHandler(this.extrasMenuButton_Click); - // - // downloadstartbtn - // - this.downloadstartbtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.downloadstartbtn.Location = new System.Drawing.Point(12, 64); - this.downloadstartbtn.Name = "downloadstartbtn"; - this.downloadstartbtn.Size = new System.Drawing.Size(250, 25); - this.downloadstartbtn.TabIndex = 5; - this.downloadstartbtn.Text = "Start NUS Download!"; - this.downloadstartbtn.UseVisualStyleBackColor = true; - this.downloadstartbtn.Click += new System.EventHandler(this.DownloadBtn_Click); - // - // statusbox - // - this.statusbox.BackColor = System.Drawing.SystemColors.ControlLightLight; - this.statusbox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.statusbox.Location = new System.Drawing.Point(-2, -2); - this.statusbox.Name = "statusbox"; - this.statusbox.ReadOnly = true; - this.statusbox.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None; - this.statusbox.Size = new System.Drawing.Size(252, 269); - this.statusbox.TabIndex = 0; - this.statusbox.Text = ""; - // - // NUSDownloader - // - this.NUSDownloader.DoWork += new System.ComponentModel.DoWorkEventHandler(this.NUSDownloader_DoWork); - this.NUSDownloader.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.NUSDownloader_RunWorkerCompleted); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.BackColor = System.Drawing.Color.Transparent; - this.label1.Location = new System.Drawing.Point(159, 45); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(13, 13); - this.label1.TabIndex = 0; - this.label1.Text = "v"; - // - // wadnamebox - // - this.wadnamebox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.wadnamebox.Enabled = false; - this.wadnamebox.Location = new System.Drawing.Point(102, 390); - this.wadnamebox.MaxLength = 99999; - this.wadnamebox.Name = "wadnamebox"; - this.wadnamebox.Size = new System.Drawing.Size(161, 20); - this.wadnamebox.TabIndex = 17; - // - // databaseStrip - // - this.databaseStrip.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.databaseStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.SystemMenuList, - this.systemFakeMenuItem, - this.IOSMenuList, - this.iosFakeMenuItem, - this.VCMenuList, - this.vcFakeMenuItem, - this.WiiWareMenuList, - this.wwFakeMenuItem, - this.toolStripSeparator5, - this.dsiSystemToolStripMenu, - this.dsiFakeSystemToolStripMenu, - this.dSiWareToolStripMenu, - this.dSiWareFakeToolStripMenu, - this.toolStripSeparator1, - this.RegionCodesList, - this.toolStripSeparator4, - this.updateDatabaseToolStripMenuItem}); - this.databaseStrip.Name = "databaseStrip"; - this.databaseStrip.ShowItemToolTips = false; - this.databaseStrip.Size = new System.Drawing.Size(164, 330); - this.databaseStrip.Text = "Hidden"; - this.databaseStrip.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.anyStrip_Closed); - // - // SystemMenuList - // - this.SystemMenuList.AutoSize = false; - this.SystemMenuList.Image = ((System.Drawing.Image)(resources.GetObject("SystemMenuList.Image"))); - this.SystemMenuList.Name = "SystemMenuList"; - this.SystemMenuList.Size = new System.Drawing.Size(158, 22); - this.SystemMenuList.Text = "System"; - // - // systemFakeMenuItem - // - this.systemFakeMenuItem.Image = global::NUS_Downloader.Properties.Resources.arrow_ticker; - this.systemFakeMenuItem.Name = "systemFakeMenuItem"; - this.systemFakeMenuItem.Size = new System.Drawing.Size(163, 22); - this.systemFakeMenuItem.Text = "System"; - this.systemFakeMenuItem.Visible = false; - // - // IOSMenuList - // - this.IOSMenuList.Image = ((System.Drawing.Image)(resources.GetObject("IOSMenuList.Image"))); - this.IOSMenuList.Name = "IOSMenuList"; - this.IOSMenuList.Size = new System.Drawing.Size(163, 22); - this.IOSMenuList.Text = "IOS"; - // - // iosFakeMenuItem - // - this.iosFakeMenuItem.Image = global::NUS_Downloader.Properties.Resources.arrow_ticker; - this.iosFakeMenuItem.Name = "iosFakeMenuItem"; - this.iosFakeMenuItem.Size = new System.Drawing.Size(163, 22); - this.iosFakeMenuItem.Text = "IOS"; - this.iosFakeMenuItem.Visible = false; - // - // VCMenuList - // - this.VCMenuList.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.C64MenuList, - this.GenesisMenuList, - this.MSXMenuList, - this.N64MenuList, - this.NeoGeoMenuList, - this.NESMenuList, - this.SegaMSMenuList, - this.SNESMenuList, - this.TurboGrafx16MenuList, - this.TurboGrafxCDMenuList, - this.VCArcadeMenuList}); - this.VCMenuList.Image = ((System.Drawing.Image)(resources.GetObject("VCMenuList.Image"))); - this.VCMenuList.Name = "VCMenuList"; - this.VCMenuList.Size = new System.Drawing.Size(163, 22); - this.VCMenuList.Text = "Virtual Console"; - // - // C64MenuList - // - this.C64MenuList.Name = "C64MenuList"; - this.C64MenuList.Size = new System.Drawing.Size(182, 22); - this.C64MenuList.Text = "Commodore 64"; - // - // GenesisMenuList - // - this.GenesisMenuList.Name = "GenesisMenuList"; - this.GenesisMenuList.Size = new System.Drawing.Size(182, 22); - this.GenesisMenuList.Text = "Mega Drive/Genesis"; - // - // MSXMenuList - // - this.MSXMenuList.Name = "MSXMenuList"; - this.MSXMenuList.Size = new System.Drawing.Size(182, 22); - this.MSXMenuList.Text = "MSX"; - // - // N64MenuList - // - this.N64MenuList.Name = "N64MenuList"; - this.N64MenuList.Size = new System.Drawing.Size(182, 22); - this.N64MenuList.Text = "Nintendo 64"; - // - // NeoGeoMenuList - // - this.NeoGeoMenuList.Name = "NeoGeoMenuList"; - this.NeoGeoMenuList.Size = new System.Drawing.Size(182, 22); - this.NeoGeoMenuList.Text = "NeoGeo"; - // - // NESMenuList - // - this.NESMenuList.Name = "NESMenuList"; - this.NESMenuList.Size = new System.Drawing.Size(182, 22); - this.NESMenuList.Text = "NES"; - // - // SegaMSMenuList - // - this.SegaMSMenuList.Name = "SegaMSMenuList"; - this.SegaMSMenuList.Size = new System.Drawing.Size(182, 22); - this.SegaMSMenuList.Text = "Sega Master System"; - // - // SNESMenuList - // - this.SNESMenuList.Name = "SNESMenuList"; - this.SNESMenuList.Size = new System.Drawing.Size(182, 22); - this.SNESMenuList.Text = "SNES"; - // - // TurboGrafx16MenuList - // - this.TurboGrafx16MenuList.Name = "TurboGrafx16MenuList"; - this.TurboGrafx16MenuList.Size = new System.Drawing.Size(182, 22); - this.TurboGrafx16MenuList.Text = "TruboGrafx-16"; - // - // TurboGrafxCDMenuList - // - this.TurboGrafxCDMenuList.Name = "TurboGrafxCDMenuList"; - this.TurboGrafxCDMenuList.Size = new System.Drawing.Size(182, 22); - this.TurboGrafxCDMenuList.Text = "TurboGrafx-CD"; - // - // VCArcadeMenuList - // - this.VCArcadeMenuList.Name = "VCArcadeMenuList"; - this.VCArcadeMenuList.Size = new System.Drawing.Size(182, 22); - this.VCArcadeMenuList.Text = "Virtual Console Arcade"; - // - // vcFakeMenuItem - // - this.vcFakeMenuItem.Image = global::NUS_Downloader.Properties.Resources.arrow_ticker; - this.vcFakeMenuItem.Name = "vcFakeMenuItem"; - this.vcFakeMenuItem.Size = new System.Drawing.Size(163, 22); - this.vcFakeMenuItem.Text = "Virtual Console"; - this.vcFakeMenuItem.Visible = false; - // - // WiiWareMenuList - // - this.WiiWareMenuList.Image = ((System.Drawing.Image)(resources.GetObject("WiiWareMenuList.Image"))); - this.WiiWareMenuList.Name = "WiiWareMenuList"; - this.WiiWareMenuList.Size = new System.Drawing.Size(163, 22); - this.WiiWareMenuList.Text = "WiiWare"; - // - // wwFakeMenuItem - // - this.wwFakeMenuItem.Image = global::NUS_Downloader.Properties.Resources.arrow_ticker; - this.wwFakeMenuItem.Name = "wwFakeMenuItem"; - this.wwFakeMenuItem.Size = new System.Drawing.Size(163, 22); - this.wwFakeMenuItem.Text = "WiiWare"; - this.wwFakeMenuItem.Visible = false; - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(160, 6); - // - // dsiSystemToolStripMenu - // - this.dsiSystemToolStripMenu.Image = global::NUS_Downloader.Properties.Resources.dsi16x16; - this.dsiSystemToolStripMenu.Name = "dsiSystemToolStripMenu"; - this.dsiSystemToolStripMenu.Size = new System.Drawing.Size(163, 22); - this.dsiSystemToolStripMenu.Text = "System"; - // - // dsiFakeSystemToolStripMenu - // - this.dsiFakeSystemToolStripMenu.Image = global::NUS_Downloader.Properties.Resources.arrow_ticker; - this.dsiFakeSystemToolStripMenu.Name = "dsiFakeSystemToolStripMenu"; - this.dsiFakeSystemToolStripMenu.Size = new System.Drawing.Size(163, 22); - this.dsiFakeSystemToolStripMenu.Text = "System"; - this.dsiFakeSystemToolStripMenu.Visible = false; - // - // dSiWareToolStripMenu - // - this.dSiWareToolStripMenu.Image = global::NUS_Downloader.Properties.Resources.dsi16x16; - this.dSiWareToolStripMenu.Name = "dSiWareToolStripMenu"; - this.dSiWareToolStripMenu.Size = new System.Drawing.Size(163, 22); - this.dSiWareToolStripMenu.Text = "DSiWare"; - // - // dSiWareFakeToolStripMenu - // - this.dSiWareFakeToolStripMenu.Image = global::NUS_Downloader.Properties.Resources.arrow_ticker; - this.dSiWareFakeToolStripMenu.Name = "dSiWareFakeToolStripMenu"; - this.dSiWareFakeToolStripMenu.Size = new System.Drawing.Size(163, 22); - this.dSiWareFakeToolStripMenu.Text = "DSiWare"; - this.dSiWareFakeToolStripMenu.Visible = false; - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(160, 6); - // - // RegionCodesList - // - this.RegionCodesList.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.wiiRegionCodesMenu, - this.dsiRegionCodesMenu}); - this.RegionCodesList.Name = "RegionCodesList"; - this.RegionCodesList.Size = new System.Drawing.Size(163, 22); - this.RegionCodesList.Text = "Region Codes"; - // - // wiiRegionCodesMenu - // - this.wiiRegionCodesMenu.Name = "wiiRegionCodesMenu"; - this.wiiRegionCodesMenu.Size = new System.Drawing.Size(89, 22); - this.wiiRegionCodesMenu.Text = "Wii"; - this.wiiRegionCodesMenu.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.wiiRegionCodesMenu_DropDownItemClicked); - // - // dsiRegionCodesMenu - // - this.dsiRegionCodesMenu.Name = "dsiRegionCodesMenu"; - this.dsiRegionCodesMenu.Size = new System.Drawing.Size(89, 22); - this.dsiRegionCodesMenu.Text = "DSi"; - this.dsiRegionCodesMenu.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.dsiRegionCodesMenu_DropDownItemClicked); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(160, 6); - // - // updateDatabaseToolStripMenuItem - // - this.updateDatabaseToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.database_save; - this.updateDatabaseToolStripMenuItem.Name = "updateDatabaseToolStripMenuItem"; - this.updateDatabaseToolStripMenuItem.Size = new System.Drawing.Size(163, 22); - this.updateDatabaseToolStripMenuItem.Text = "Update Databases"; - this.updateDatabaseToolStripMenuItem.Click += new System.EventHandler(this.updateDatabaseToolStripMenuItem_Click); - // - // extrasStrip - // - this.extrasStrip.AllowMerge = false; - this.extrasStrip.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.extrasStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.loadInfoFromTMDToolStripMenuItem, - this.toolStripSeparator3, - this.proxySettingsToolStripMenuItem, - this.toolStripSeparator6, - this.openNUSDDirectoryToolStripMenuItem, - this.moreExtrasToolStripMenuItem, - this.donateToolStripMenuItem, - this.toolStripSeparator7, - this.aboutNUSDToolStripMenuItem}); - this.extrasStrip.Name = "extrasStrip"; - this.extrasStrip.Size = new System.Drawing.Size(178, 154); - this.extrasStrip.Text = "Hidden"; - this.extrasStrip.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.anyStrip_Closed); - this.extrasStrip.Opening += new System.ComponentModel.CancelEventHandler(this.extrasStrip_Opening); - // - // loadInfoFromTMDToolStripMenuItem - // - this.loadInfoFromTMDToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.page_white_magnify; - this.loadInfoFromTMDToolStripMenuItem.Name = "loadInfoFromTMDToolStripMenuItem"; - this.loadInfoFromTMDToolStripMenuItem.Size = new System.Drawing.Size(177, 22); - this.loadInfoFromTMDToolStripMenuItem.Text = "Load Info from TMD"; - this.loadInfoFromTMDToolStripMenuItem.Click += new System.EventHandler(this.loadInfoFromTMDToolStripMenuItem_Click); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(174, 6); - // - // proxySettingsToolStripMenuItem - // - this.proxySettingsToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.server_link; - this.proxySettingsToolStripMenuItem.Name = "proxySettingsToolStripMenuItem"; - this.proxySettingsToolStripMenuItem.Size = new System.Drawing.Size(177, 22); - this.proxySettingsToolStripMenuItem.Text = "Proxy Settings"; - this.proxySettingsToolStripMenuItem.Click += new System.EventHandler(this.proxySettingsToolStripMenuItem_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(174, 6); - // - // openNUSDDirectoryToolStripMenuItem - // - this.openNUSDDirectoryToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.folder; - this.openNUSDDirectoryToolStripMenuItem.Name = "openNUSDDirectoryToolStripMenuItem"; - this.openNUSDDirectoryToolStripMenuItem.Size = new System.Drawing.Size(177, 22); - this.openNUSDDirectoryToolStripMenuItem.Text = "Open NUSD Directory"; - this.openNUSDDirectoryToolStripMenuItem.Click += new System.EventHandler(this.openNUSDDirectoryToolStripMenuItem_Click); - // - // moreExtrasToolStripMenuItem - // - this.moreExtrasToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.runFolderFixToolStripMenuItem, - this.wiiBrewToolStripMenuItem, - this.removeNUSDFilesFoldersToolStripMenuItem, - this.databaseToolStripMenuItem}); - this.moreExtrasToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.wrench; - this.moreExtrasToolStripMenuItem.Name = "moreExtrasToolStripMenuItem"; - this.moreExtrasToolStripMenuItem.Size = new System.Drawing.Size(177, 22); - this.moreExtrasToolStripMenuItem.Text = "More Extras..."; - this.moreExtrasToolStripMenuItem.Visible = false; - // - // runFolderFixToolStripMenuItem - // - this.runFolderFixToolStripMenuItem.Name = "runFolderFixToolStripMenuItem"; - this.runFolderFixToolStripMenuItem.Size = new System.Drawing.Size(206, 22); - this.runFolderFixToolStripMenuItem.Text = "Run \'FolderFix\'"; - this.runFolderFixToolStripMenuItem.Click += new System.EventHandler(this.runFolderFixToolStripMenuItem_Click); - // - // wiiBrewToolStripMenuItem - // - this.wiiBrewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.mainPageToolStripMenuItem, - this.databasePageToolStripMenuItem}); - this.wiiBrewToolStripMenuItem.Name = "wiiBrewToolStripMenuItem"; - this.wiiBrewToolStripMenuItem.Size = new System.Drawing.Size(206, 22); - this.wiiBrewToolStripMenuItem.Text = "WiiBrew"; - // - // mainPageToolStripMenuItem - // - this.mainPageToolStripMenuItem.Name = "mainPageToolStripMenuItem"; - this.mainPageToolStripMenuItem.Size = new System.Drawing.Size(147, 22); - this.mainPageToolStripMenuItem.Text = "Main Page"; - this.mainPageToolStripMenuItem.Click += new System.EventHandler(this.mainPageToolStripMenuItem_Click); - // - // databasePageToolStripMenuItem - // - this.databasePageToolStripMenuItem.Name = "databasePageToolStripMenuItem"; - this.databasePageToolStripMenuItem.Size = new System.Drawing.Size(147, 22); - this.databasePageToolStripMenuItem.Text = "Database Page"; - this.databasePageToolStripMenuItem.Click += new System.EventHandler(this.databasePageToolStripMenuItem_Click); - // - // removeNUSDFilesFoldersToolStripMenuItem - // - this.removeNUSDFilesFoldersToolStripMenuItem.Name = "removeNUSDFilesFoldersToolStripMenuItem"; - this.removeNUSDFilesFoldersToolStripMenuItem.Size = new System.Drawing.Size(206, 22); - this.removeNUSDFilesFoldersToolStripMenuItem.Text = "Remove NUSD Files\\Folders"; - this.removeNUSDFilesFoldersToolStripMenuItem.Click += new System.EventHandler(this.removeNUSDFilesFoldersToolStripMenuItem_Click); - // - // databaseToolStripMenuItem - // - this.databaseToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.localTicketInventoryToolStripMenuItem}); - this.databaseToolStripMenuItem.Name = "databaseToolStripMenuItem"; - this.databaseToolStripMenuItem.Size = new System.Drawing.Size(206, 22); - this.databaseToolStripMenuItem.Text = "Database"; - // - // localTicketInventoryToolStripMenuItem - // - this.localTicketInventoryToolStripMenuItem.Name = "localTicketInventoryToolStripMenuItem"; - this.localTicketInventoryToolStripMenuItem.Size = new System.Drawing.Size(180, 22); - this.localTicketInventoryToolStripMenuItem.Text = "Local Ticket Inventory"; - this.localTicketInventoryToolStripMenuItem.Click += new System.EventHandler(this.localTicketInventoryToolStripMenuItem_Click); - // - // donateToolStripMenuItem - // - this.donateToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.money; - this.donateToolStripMenuItem.Name = "donateToolStripMenuItem"; - this.donateToolStripMenuItem.Size = new System.Drawing.Size(177, 22); - this.donateToolStripMenuItem.Text = "Donate!"; - this.donateToolStripMenuItem.Visible = false; - this.donateToolStripMenuItem.Click += new System.EventHandler(this.donateToolStripMenuItem_Click); - // - // aboutNUSDToolStripMenuItem - // - this.aboutNUSDToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.information; - this.aboutNUSDToolStripMenuItem.Name = "aboutNUSDToolStripMenuItem"; - this.aboutNUSDToolStripMenuItem.Size = new System.Drawing.Size(177, 22); - this.aboutNUSDToolStripMenuItem.Text = "About NUSD"; - this.aboutNUSDToolStripMenuItem.Click += new System.EventHandler(this.aboutNUSDToolStripMenuItem_Click); - // - // proxyBox - // - this.proxyBox.BackColor = System.Drawing.Color.White; - this.proxyBox.Controls.Add(this.label13); - this.proxyBox.Controls.Add(this.label12); - this.proxyBox.Controls.Add(this.ProxyUser); - this.proxyBox.Controls.Add(this.SaveProxyBtn); - this.proxyBox.Controls.Add(this.ProxyAssistBtn); - this.proxyBox.Controls.Add(this.ProxyURL); - this.proxyBox.Location = new System.Drawing.Point(31, 250); - this.proxyBox.Name = "proxyBox"; - this.proxyBox.Size = new System.Drawing.Size(212, 114); - this.proxyBox.TabIndex = 45; - this.proxyBox.TabStop = false; - this.proxyBox.Text = "Proxy Settings"; - this.proxyBox.Visible = false; - // - // label13 - // - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(6, 55); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(32, 13); - this.label13.TabIndex = 32; - this.label13.Text = "User:"; - // - // label12 - // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(6, 29); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(36, 13); - this.label12.TabIndex = 31; - this.label12.Text = "Proxy:"; - // - // ProxyUser - // - this.ProxyUser.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.ProxyUser.Location = new System.Drawing.Point(55, 53); - this.ProxyUser.Name = "ProxyUser"; - this.ProxyUser.Size = new System.Drawing.Size(151, 20); - this.ProxyUser.TabIndex = 30; - // - // SaveProxyBtn - // - this.SaveProxyBtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.SaveProxyBtn.Location = new System.Drawing.Point(6, 79); - this.SaveProxyBtn.Name = "SaveProxyBtn"; - this.SaveProxyBtn.Size = new System.Drawing.Size(161, 26); - this.SaveProxyBtn.TabIndex = 29; - this.SaveProxyBtn.Text = "Save Proxy Settings"; - this.SaveProxyBtn.UseVisualStyleBackColor = true; - this.SaveProxyBtn.Click += new System.EventHandler(this.SaveProxyBtn_Click); - // - // ProxyAssistBtn - // - this.ProxyAssistBtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.ProxyAssistBtn.Image = global::NUS_Downloader.Properties.Resources.help; - this.ProxyAssistBtn.Location = new System.Drawing.Point(177, 79); - this.ProxyAssistBtn.Name = "ProxyAssistBtn"; - this.ProxyAssistBtn.Size = new System.Drawing.Size(29, 26); - this.ProxyAssistBtn.TabIndex = 28; - this.ProxyAssistBtn.UseVisualStyleBackColor = true; - this.ProxyAssistBtn.Click += new System.EventHandler(this.ProxyAssistBtn_Click); - // - // ProxyURL - // - this.ProxyURL.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.ProxyURL.Location = new System.Drawing.Point(55, 27); - this.ProxyURL.Name = "ProxyURL"; - this.ProxyURL.Size = new System.Drawing.Size(151, 20); - this.ProxyURL.TabIndex = 0; - // - // ProxyVerifyBox - // - this.ProxyVerifyBox.BackColor = System.Drawing.SystemColors.Control; - this.ProxyVerifyBox.Controls.Add(this.SaveProxyPwdPermanentBtn); - this.ProxyVerifyBox.Controls.Add(this.checkBox1); - this.ProxyVerifyBox.Controls.Add(this.SaveProxyPwdBtn); - this.ProxyVerifyBox.Controls.Add(this.label14); - this.ProxyVerifyBox.Controls.Add(this.ProxyPwdBox); - this.ProxyVerifyBox.Location = new System.Drawing.Point(31, 222); - this.ProxyVerifyBox.Name = "ProxyVerifyBox"; - this.ProxyVerifyBox.Size = new System.Drawing.Size(212, 133); - this.ProxyVerifyBox.TabIndex = 46; - this.ProxyVerifyBox.TabStop = false; - this.ProxyVerifyBox.Text = "Verify Credentials"; - this.ProxyVerifyBox.Visible = false; - // - // SaveProxyPwdPermanentBtn - // - this.SaveProxyPwdPermanentBtn.Enabled = false; - this.SaveProxyPwdPermanentBtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.SaveProxyPwdPermanentBtn.Location = new System.Drawing.Point(9, 104); - this.SaveProxyPwdPermanentBtn.Name = "SaveProxyPwdPermanentBtn"; - this.SaveProxyPwdPermanentBtn.Size = new System.Drawing.Size(197, 23); - this.SaveProxyPwdPermanentBtn.TabIndex = 36; - this.SaveProxyPwdPermanentBtn.Text = "Save (To File)"; - this.SaveProxyPwdPermanentBtn.UseVisualStyleBackColor = true; - this.SaveProxyPwdPermanentBtn.Click += new System.EventHandler(this.SaveProxyPwdPermanentBtn_Click); - // - // checkBox1 - // - this.checkBox1.AutoSize = true; - this.checkBox1.Location = new System.Drawing.Point(9, 72); - this.checkBox1.Name = "checkBox1"; - this.checkBox1.Size = new System.Drawing.Size(199, 30); - this.checkBox1.TabIndex = 35; - this.checkBox1.Text = "I understand that NUSD stores proxy\r\npasswords in plain text."; - this.checkBox1.UseVisualStyleBackColor = true; - this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); - // - // SaveProxyPwdBtn - // - this.SaveProxyPwdBtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.SaveProxyPwdBtn.Location = new System.Drawing.Point(9, 43); - this.SaveProxyPwdBtn.Name = "SaveProxyPwdBtn"; - this.SaveProxyPwdBtn.Size = new System.Drawing.Size(197, 23); - this.SaveProxyPwdBtn.TabIndex = 34; - this.SaveProxyPwdBtn.Text = "Save (This Session Only)"; - this.SaveProxyPwdBtn.UseVisualStyleBackColor = true; - this.SaveProxyPwdBtn.Click += new System.EventHandler(this.SaveProxyPwdButton_Click); - // - // label14 - // - this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(6, 21); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(62, 13); - this.label14.TabIndex = 33; - this.label14.Text = "Proxy Pass:"; - // - // ProxyPwdBox - // - this.ProxyPwdBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.ProxyPwdBox.Location = new System.Drawing.Point(71, 19); - this.ProxyPwdBox.Name = "ProxyPwdBox"; - this.ProxyPwdBox.Size = new System.Drawing.Size(135, 20); - this.ProxyPwdBox.TabIndex = 32; - this.ProxyPwdBox.UseSystemPasswordChar = true; - this.ProxyPwdBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ProxyPwdBox_KeyPress); - // - // scriptsbutton - // - this.scriptsbutton.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.scriptsbutton.Location = new System.Drawing.Point(103, 5); - this.scriptsbutton.Name = "scriptsbutton"; - this.scriptsbutton.Size = new System.Drawing.Size(85, 27); - this.scriptsbutton.TabIndex = 1; - this.scriptsbutton.Text = "Scripts..."; - this.scriptsbutton.UseVisualStyleBackColor = true; - this.scriptsbutton.Click += new System.EventHandler(this.scriptsbutton_Click); - // - // scriptsStrip - // - this.scriptsStrip.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.scriptsStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.scriptsLocalMenuEntry, - this.scriptsDatabaseToolStripMenuItem, - this.loadNUSScriptToolStripMenuItem, - this.toolStripSeparator2, - this.emulateUpdate}); - this.scriptsStrip.Name = "scriptsStrip"; - this.scriptsStrip.ShowItemToolTips = false; - this.scriptsStrip.Size = new System.Drawing.Size(206, 98); - this.scriptsStrip.Text = "Hidden"; - this.scriptsStrip.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.anyStrip_Closed); - // - // scriptsLocalMenuEntry - // - this.scriptsLocalMenuEntry.Enabled = false; - this.scriptsLocalMenuEntry.Image = global::NUS_Downloader.Properties.Resources.script_code; - this.scriptsLocalMenuEntry.Name = "scriptsLocalMenuEntry"; - this.scriptsLocalMenuEntry.Overflow = System.Windows.Forms.ToolStripItemOverflow.AsNeeded; - this.scriptsLocalMenuEntry.Size = new System.Drawing.Size(205, 22); - this.scriptsLocalMenuEntry.Text = "Scripts (Local)"; - // - // scriptsDatabaseToolStripMenuItem - // - this.scriptsDatabaseToolStripMenuItem.Enabled = false; - this.scriptsDatabaseToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.script_code_red; - this.scriptsDatabaseToolStripMenuItem.Name = "scriptsDatabaseToolStripMenuItem"; - this.scriptsDatabaseToolStripMenuItem.Size = new System.Drawing.Size(205, 22); - this.scriptsDatabaseToolStripMenuItem.Text = "Scripts (Database)"; - // - // loadNUSScriptToolStripMenuItem - // - this.loadNUSScriptToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.script_go; - this.loadNUSScriptToolStripMenuItem.Name = "loadNUSScriptToolStripMenuItem"; - this.loadNUSScriptToolStripMenuItem.Size = new System.Drawing.Size(205, 22); - this.loadNUSScriptToolStripMenuItem.Text = "Load NUS Script"; - this.loadNUSScriptToolStripMenuItem.Click += new System.EventHandler(this.loadNUSScriptToolStripMenuItem_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(202, 6); - // - // emulateUpdate - // - this.emulateUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.uSANTSCToolStripMenuItem, - this.europePALToolStripMenuItem, - this.japanNTSCJToolStripMenuItem, - this.koreaToolStripMenuItem}); - this.emulateUpdate.Image = global::NUS_Downloader.Properties.Resources.server_connect; - this.emulateUpdate.Name = "emulateUpdate"; - this.emulateUpdate.Size = new System.Drawing.Size(205, 22); - this.emulateUpdate.Text = "Emulate Wii System Update"; - this.emulateUpdate.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.emulateUpdate_DropDownItemClicked); - // - // uSANTSCToolStripMenuItem - // - this.uSANTSCToolStripMenuItem.Name = "uSANTSCToolStripMenuItem"; - this.uSANTSCToolStripMenuItem.Size = new System.Drawing.Size(114, 22); - this.uSANTSCToolStripMenuItem.Text = "USA"; - // - // europePALToolStripMenuItem - // - this.europePALToolStripMenuItem.Name = "europePALToolStripMenuItem"; - this.europePALToolStripMenuItem.Size = new System.Drawing.Size(114, 22); - this.europePALToolStripMenuItem.Text = "EUROPE"; - // - // japanNTSCJToolStripMenuItem - // - this.japanNTSCJToolStripMenuItem.Name = "japanNTSCJToolStripMenuItem"; - this.japanNTSCJToolStripMenuItem.Size = new System.Drawing.Size(114, 22); - this.japanNTSCJToolStripMenuItem.Text = "JAPAN"; - // - // koreaToolStripMenuItem - // - this.koreaToolStripMenuItem.Name = "koreaToolStripMenuItem"; - this.koreaToolStripMenuItem.Size = new System.Drawing.Size(114, 22); - this.koreaToolStripMenuItem.Text = "KOREA"; - // - // iosPatchGroupBox - // - this.iosPatchGroupBox.Controls.Add(this.label2); - this.iosPatchGroupBox.Controls.Add(this.iosPatchesListBox); - this.iosPatchGroupBox.Controls.Add(this.iosPatchGroupBoxOKbtn); - this.iosPatchGroupBox.Location = new System.Drawing.Point(31, 187); - this.iosPatchGroupBox.Name = "iosPatchGroupBox"; - this.iosPatchGroupBox.Size = new System.Drawing.Size(212, 115); - this.iosPatchGroupBox.TabIndex = 55; - this.iosPatchGroupBox.TabStop = false; - this.iosPatchGroupBox.Text = "IOS Patches"; - this.iosPatchGroupBox.Visible = false; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(9, 16); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(184, 26); - this.label2.TabIndex = 2; - this.label2.Text = "Patch the following bugs into any IOS\r\nI download:"; - // - // iosPatchesListBox - // - this.iosPatchesListBox.BackColor = System.Drawing.SystemColors.Menu; - this.iosPatchesListBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.iosPatchesListBox.CheckOnClick = true; - this.iosPatchesListBox.FormattingEnabled = true; - this.iosPatchesListBox.Items.AddRange(new object[] { - "Trucha bug", - "ES_Identify", - "NAND permissions"}); - this.iosPatchesListBox.Location = new System.Drawing.Point(6, 62); - this.iosPatchesListBox.Name = "iosPatchesListBox"; - this.iosPatchesListBox.Size = new System.Drawing.Size(115, 45); - this.iosPatchesListBox.TabIndex = 1; - // - // iosPatchGroupBoxOKbtn - // - this.iosPatchGroupBoxOKbtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.iosPatchGroupBoxOKbtn.Location = new System.Drawing.Point(127, 84); - this.iosPatchGroupBoxOKbtn.Name = "iosPatchGroupBoxOKbtn"; - this.iosPatchGroupBoxOKbtn.Size = new System.Drawing.Size(75, 23); - this.iosPatchGroupBoxOKbtn.TabIndex = 0; - this.iosPatchGroupBoxOKbtn.Text = "OK"; - this.iosPatchGroupBoxOKbtn.UseVisualStyleBackColor = true; - this.iosPatchGroupBoxOKbtn.Click += new System.EventHandler(this.iosPatchGroupBoxOKbtn_Click); - // - // richPanel - // - this.richPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.richPanel.Controls.Add(this.statusbox); - this.richPanel.Location = new System.Drawing.Point(12, 116); - this.richPanel.Name = "richPanel"; - this.richPanel.Size = new System.Drawing.Size(250, 268); - this.richPanel.TabIndex = 56; - // - // databaseButton - // - this.databaseButton.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.databaseButton.Location = new System.Drawing.Point(12, 5); - this.databaseButton.Name = "databaseButton"; - this.databaseButton.Size = new System.Drawing.Size(85, 27); - this.databaseButton.TabIndex = 0; - this.databaseButton.Text = "Database..."; - this.databaseButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.databaseButton.UseVisualStyleBackColor = true; - this.databaseButton.Click += new System.EventHandler(this.DatabaseButton_Click); - // - // saveaswadbtn - // - this.saveaswadbtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.saveaswadbtn.AutoSize = true; - this.saveaswadbtn.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.saveaswadbtn.BackColor = System.Drawing.Color.Transparent; - this.saveaswadbtn.Enabled = false; - this.saveaswadbtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.saveaswadbtn.Image = global::NUS_Downloader.Properties.Resources.disk; - this.saveaswadbtn.Location = new System.Drawing.Point(239, 409); - this.saveaswadbtn.MaximumSize = new System.Drawing.Size(0, 24); - this.saveaswadbtn.MinimumSize = new System.Drawing.Size(0, 24); - this.saveaswadbtn.Name = "saveaswadbtn"; - this.saveaswadbtn.Size = new System.Drawing.Size(24, 24); - this.saveaswadbtn.TabIndex = 11; - this.saveaswadbtn.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.saveaswadbtn.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.saveaswadbtn.UseVisualStyleBackColor = false; - this.saveaswadbtn.Click += new System.EventHandler(this.saveaswadbtn_Click); - this.saveaswadbtn.MouseEnter += new System.EventHandler(this.saveaswadbtn_MouseEnter); - this.saveaswadbtn.MouseLeave += new System.EventHandler(this.saveaswadbtn_MouseLeave); - // - // iosPatchCheckbox - // - this.iosPatchCheckbox.Enabled = false; - this.iosPatchCheckbox.Image = global::NUS_Downloader.Properties.Resources.bug_add; - this.iosPatchCheckbox.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.iosPatchCheckbox.Location = new System.Drawing.Point(11, 487); - this.iosPatchCheckbox.Name = "iosPatchCheckbox"; - this.iosPatchCheckbox.Size = new System.Drawing.Size(104, 24); - this.iosPatchCheckbox.TabIndex = 10; - this.iosPatchCheckbox.Text = "Patch IOS..."; - this.iosPatchCheckbox.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.iosPatchCheckbox.UseVisualStyleBackColor = true; - this.iosPatchCheckbox.CheckedChanged += new System.EventHandler(this.iosPatchCheckbox_CheckedChanged); - // - // keepenccontents - // - this.keepenccontents.Checked = true; - this.keepenccontents.CheckState = System.Windows.Forms.CheckState.Checked; - this.keepenccontents.Image = global::NUS_Downloader.Properties.Resources.package; - this.keepenccontents.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.keepenccontents.Location = new System.Drawing.Point(11, 410); - this.keepenccontents.Name = "keepenccontents"; - this.keepenccontents.Size = new System.Drawing.Size(177, 26); - this.keepenccontents.TabIndex = 8; - this.keepenccontents.Text = "Keep Encrypted Contents"; - this.keepenccontents.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.keepenccontents.UseVisualStyleBackColor = true; - // - // clearButton - // - this.clearButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.clearButton.AutoSize = true; - this.clearButton.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.clearButton.BackColor = System.Drawing.Color.Transparent; - this.clearButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.clearButton.Image = global::NUS_Downloader.Properties.Resources.bin_closed; - this.clearButton.ImageAlign = System.Drawing.ContentAlignment.MiddleRight; - this.clearButton.Location = new System.Drawing.Point(238, 360); - this.clearButton.MaximumSize = new System.Drawing.Size(0, 24); - this.clearButton.MinimumSize = new System.Drawing.Size(0, 24); - this.clearButton.Name = "clearButton"; - this.clearButton.Size = new System.Drawing.Size(24, 24); - this.clearButton.TabIndex = 12; - this.clearButton.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.clearButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.clearButton.UseVisualStyleBackColor = false; - this.clearButton.Click += new System.EventHandler(this.ClearStatusbox); - this.clearButton.MouseEnter += new System.EventHandler(this.clearButton_MouseEnter); - this.clearButton.MouseLeave += new System.EventHandler(this.clearButton_MouseLeave); - // - // packbox - // - this.packbox.Image = global::NUS_Downloader.Properties.Resources.box; - this.packbox.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.packbox.Location = new System.Drawing.Point(11, 388); - this.packbox.Name = "packbox"; - this.packbox.Size = new System.Drawing.Size(98, 22); - this.packbox.TabIndex = 7; - this.packbox.Text = "Pack WAD"; - this.packbox.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.packbox.UseVisualStyleBackColor = true; - this.packbox.CheckedChanged += new System.EventHandler(this.packbox_CheckedChanged); - this.packbox.EnabledChanged += new System.EventHandler(this.packbox_EnabledChanged); - // - // decryptbox - // - this.decryptbox.Image = global::NUS_Downloader.Properties.Resources.package_green; - this.decryptbox.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.decryptbox.Location = new System.Drawing.Point(11, 436); - this.decryptbox.Name = "decryptbox"; - this.decryptbox.Size = new System.Drawing.Size(231, 26); - this.decryptbox.TabIndex = 9; - this.decryptbox.Text = "Create Decrypted Contents (*.app)"; - this.decryptbox.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.decryptbox.UseVisualStyleBackColor = true; - // - // localuse - // - this.localuse.AutoSize = true; - this.localuse.Checked = true; - this.localuse.CheckState = System.Windows.Forms.CheckState.Checked; - this.localuse.Image = global::NUS_Downloader.Properties.Resources.drive_disk; - this.localuse.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.localuse.Location = new System.Drawing.Point(11, 463); - this.localuse.MinimumSize = new System.Drawing.Size(0, 22); - this.localuse.Name = "localuse"; - this.localuse.Size = new System.Drawing.Size(162, 22); - this.localuse.TabIndex = 12; - this.localuse.Text = "Use Local Files If Present"; - this.localuse.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; - this.localuse.UseVisualStyleBackColor = true; - // - // serverLbl - // - this.serverLbl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.serverLbl.Location = new System.Drawing.Point(233, 38); - this.serverLbl.Name = "serverLbl"; - this.serverLbl.Size = new System.Drawing.Size(29, 20); - this.serverLbl.TabIndex = 57; - this.serverLbl.Text = "Wii"; - this.serverLbl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.serverLbl.TextChanged += new System.EventHandler(this.serverLbl_TextChanged); - this.serverLbl.Click += new System.EventHandler(this.serverLbl_Click); - this.serverLbl.MouseEnter += new System.EventHandler(this.serverLbl_MouseEnter); - this.serverLbl.MouseLeave += new System.EventHandler(this.serverLbl_MouseLeave); - // - // titleidbox - // - this.titleidbox.Font = new System.Drawing.Font("Tahoma", 8.25F); - this.titleidbox.Location = new System.Drawing.Point(12, 38); - this.titleidbox.MaxLength = 16; - this.titleidbox.Name = "titleidbox"; - this.titleidbox.Size = new System.Drawing.Size(141, 21); - this.titleidbox.TabIndex = 3; - this.titleidbox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - this.titleidbox.WaterMarkColor = System.Drawing.Color.Silver; - this.titleidbox.WaterMarkText = "Title ID"; - this.titleidbox.TextChanged += new System.EventHandler(this.titleidbox_TextChanged); - // - // dlprogress - // - this.dlprogress.ContainerControl = this; - this.dlprogress.Location = new System.Drawing.Point(12, 95); - this.dlprogress.Name = "dlprogress"; - this.dlprogress.Size = new System.Drawing.Size(250, 15); - this.dlprogress.TabIndex = 47; - // - // titleversion - // - this.titleversion.Font = new System.Drawing.Font("Tahoma", 8.25F); - this.titleversion.Location = new System.Drawing.Point(169, 38); - this.titleversion.MaxLength = 8; - this.titleversion.Name = "titleversion"; - this.titleversion.Size = new System.Drawing.Size(58, 21); - this.titleversion.TabIndex = 4; - this.titleversion.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - this.titleversion.WaterMarkColor = System.Drawing.Color.Silver; - this.titleversion.WaterMarkText = "Version"; - this.titleversion.TextChanged += new System.EventHandler(this.titleversion_TextChanged); - // - // toolStripSeparator7 - // - this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(174, 6); - // - // Form1 - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.ClientSize = new System.Drawing.Size(274, 516); - this.Controls.Add(this.serverLbl); - this.Controls.Add(this.iosPatchGroupBox); - this.Controls.Add(this.ProxyVerifyBox); - this.Controls.Add(this.proxyBox); - this.Controls.Add(this.scriptsbutton); - this.Controls.Add(this.titleidbox); - this.Controls.Add(this.dlprogress); - this.Controls.Add(this.titleversion); - this.Controls.Add(this.databaseButton); - this.Controls.Add(this.iosPatchCheckbox); - this.Controls.Add(this.downloadstartbtn); - this.Controls.Add(this.clearButton); - this.Controls.Add(this.keepenccontents); - this.Controls.Add(this.label1); - this.Controls.Add(this.Extrasbtn); - this.Controls.Add(this.wadnamebox); - this.Controls.Add(this.richPanel); - this.Controls.Add(this.decryptbox); - this.Controls.Add(this.packbox); - this.Controls.Add(this.saveaswadbtn); - this.Controls.Add(this.localuse); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.Name = "Form1"; - this.Text = " "; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); - this.Load += new System.EventHandler(this.Form1_Load); - this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseWheel); - this.databaseStrip.ResumeLayout(false); - this.extrasStrip.ResumeLayout(false); - this.proxyBox.ResumeLayout(false); - this.proxyBox.PerformLayout(); - this.ProxyVerifyBox.ResumeLayout(false); - this.ProxyVerifyBox.PerformLayout(); - this.scriptsStrip.ResumeLayout(false); - this.iosPatchGroupBox.ResumeLayout(false); - this.iosPatchGroupBox.PerformLayout(); - this.richPanel.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Button Extrasbtn; - private System.Windows.Forms.Button downloadstartbtn; - private System.Windows.Forms.RichTextBox statusbox; - private System.Windows.Forms.CheckBox packbox; - private System.Windows.Forms.CheckBox localuse; - private System.ComponentModel.BackgroundWorker NUSDownloader; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox wadnamebox; - private System.Windows.Forms.CheckBox decryptbox; - private System.Windows.Forms.Button databaseButton; - private System.Windows.Forms.ContextMenuStrip databaseStrip; - private System.Windows.Forms.ToolStripMenuItem SystemMenuList; - private System.Windows.Forms.ToolStripMenuItem IOSMenuList; - private System.Windows.Forms.ToolStripMenuItem VCMenuList; - private System.Windows.Forms.ToolStripMenuItem WiiWareMenuList; - private System.Windows.Forms.ToolStripMenuItem C64MenuList; - private System.Windows.Forms.ToolStripMenuItem NeoGeoMenuList; - private System.Windows.Forms.ToolStripMenuItem NESMenuList; - private System.Windows.Forms.ToolStripMenuItem SNESMenuList; - private System.Windows.Forms.ToolStripMenuItem N64MenuList; - private System.Windows.Forms.ToolStripMenuItem MSXMenuList; - private System.Windows.Forms.ToolStripMenuItem TurboGrafx16MenuList; - private System.Windows.Forms.ToolStripMenuItem SegaMSMenuList; - private System.Windows.Forms.ToolStripMenuItem GenesisMenuList; - private System.Windows.Forms.ToolStripMenuItem VCArcadeMenuList; - private System.Windows.Forms.ToolStripMenuItem TurboGrafxCDMenuList; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem RegionCodesList; - private System.Windows.Forms.Button clearButton; - private System.Windows.Forms.ContextMenuStrip extrasStrip; - private System.Windows.Forms.ToolStripMenuItem loadInfoFromTMDToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; - private System.Windows.Forms.ToolStripMenuItem proxySettingsToolStripMenuItem; - private System.Windows.Forms.GroupBox proxyBox; - private System.Windows.Forms.TextBox ProxyUser; - private System.Windows.Forms.Button SaveProxyBtn; - private System.Windows.Forms.Button ProxyAssistBtn; - private System.Windows.Forms.TextBox ProxyURL; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.GroupBox ProxyVerifyBox; - private System.Windows.Forms.Button SaveProxyPwdBtn; - private System.Windows.Forms.Label label14; - private System.Windows.Forms.TextBox ProxyPwdBox; - private wyDay.Controls.Windows7ProgressBar dlprogress; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; - private wmgCMS.WaterMarkTextBox titleidbox; - private wmgCMS.WaterMarkTextBox titleversion; - private System.Windows.Forms.Button scriptsbutton; - private System.Windows.Forms.ContextMenuStrip scriptsStrip; - private System.Windows.Forms.ToolStripMenuItem loadNUSScriptToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem emulateUpdate; - private System.Windows.Forms.ToolStripMenuItem uSANTSCToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem europePALToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem japanNTSCJToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem koreaToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; - private System.Windows.Forms.ToolStripMenuItem updateDatabaseToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem scriptsLocalMenuEntry; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; - private System.Windows.Forms.ToolStripMenuItem scriptsDatabaseToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem aboutNUSDToolStripMenuItem; - private System.Windows.Forms.CheckBox checkBox1; - private System.Windows.Forms.Button SaveProxyPwdPermanentBtn; - private System.Windows.Forms.CheckBox keepenccontents; - private System.Windows.Forms.Button saveaswadbtn; - private System.Windows.Forms.CheckBox iosPatchCheckbox; - private System.Windows.Forms.GroupBox iosPatchGroupBox; - private System.Windows.Forms.CheckedListBox iosPatchesListBox; - private System.Windows.Forms.Button iosPatchGroupBoxOKbtn; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Panel richPanel; - private System.Windows.Forms.ToolStripMenuItem systemFakeMenuItem; - private System.Windows.Forms.ToolStripMenuItem iosFakeMenuItem; - private System.Windows.Forms.ToolStripMenuItem vcFakeMenuItem; - private System.Windows.Forms.ToolStripMenuItem wwFakeMenuItem; - private System.Windows.Forms.ToolStripMenuItem openNUSDDirectoryToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem moreExtrasToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem runFolderFixToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem wiiBrewToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem mainPageToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem databasePageToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem removeNUSDFilesFoldersToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem databaseToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem localTicketInventoryToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem donateToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; - private System.Windows.Forms.ToolStripMenuItem dsiSystemToolStripMenu; - private System.Windows.Forms.ToolStripMenuItem dsiFakeSystemToolStripMenu; - private System.Windows.Forms.ToolStripMenuItem dSiWareToolStripMenu; - private System.Windows.Forms.ToolStripMenuItem dSiWareFakeToolStripMenu; - private System.Windows.Forms.ToolStripMenuItem wiiRegionCodesMenu; - private System.Windows.Forms.ToolStripMenuItem dsiRegionCodesMenu; - private System.Windows.Forms.Label serverLbl; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; - } -} - diff --git a/NUS Downloader/Form1.cs b/NUS Downloader/Form1.cs deleted file mode 100644 index 3711a01..0000000 --- a/NUS Downloader/Form1.cs +++ /dev/null @@ -1,3063 +0,0 @@ -/////////////////////////////////////////// -// NUS Downloader: Form1.cs // -// $Rev:: $ // -// $Author:: $ // -// $Date:: $ // -/////////////////////////////////////////// - -/////////////////////////////////////// -// Copyright (C) 2010 -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see -/////////////////////////////////////// - - -using System; -using System.Windows.Forms; -using System.IO; -using System.Net; -using System.Security.Cryptography; -using System.Xml; -using System.Drawing; -using System.Text.RegularExpressions; -using System.ComponentModel; -using System.Threading; -using System.Text; -using System.Diagnostics; - -namespace NUS_Downloader -{ - partial class Form1 : Form - { - private readonly string CURRENT_DIR = Directory.GetCurrentDirectory(); - -#if DEBUG - private static string svnversion = "$Rev$"; - private static string version = String.Format("SVN r{0}", ((int.Parse(svnversion.Replace("$"+"R"+"e"+"v"+": ","").Replace(" "+"$","")))+1)); -#else - // TODO: Always remember to change version! - private string version = "v1.9"; -#endif - - // Cross-thread Windows Formsing - private delegate void AddToolStripItemToStripCallback( - ToolStripMenuItem menulist, ToolStripMenuItem[] additionitems); - private delegate void WriteStatusCallback(string Update, Color writecolor); - private delegate void BootChecksCallback(); - private delegate void SetEnableForDownloadCallback(bool enabled); - private delegate void SetPropertyThreadSafeCallback(System.ComponentModel.Component what, object setto, string property); - private delegate string OfficialWADNamingCallback(string whut); - - private string WAD_Saveas_Filename; - - // TODO: OOP scripting - /*private string script_filename; - private bool script_mode = false; - private string[] nusentries;*/ - - // Proxy stuff... - private string proxy_url; - private string proxy_usr; - private string proxy_pwd; - - // Database threads - private BackgroundWorker databaseWorker; - private BackgroundWorker dsiDatabaseWorker; - - // Scripts Thread - private BackgroundWorker scriptsWorker; - - // Colours for status box - private System.Drawing.Color normalcolor = Color.FromName("Black"); - private System.Drawing.Color warningcolor = Color.FromName("DarkGoldenrod"); - private System.Drawing.Color errorcolor = Color.FromName("Crimson"); - private System.Drawing.Color infocolor = Color.FromName("RoyalBlue"); - - // Statuses of disabled things - private bool[] disabledStorage = new bool[13]; - - // This is the standard entry to the GUI - public Form1() - { - InitializeComponent(); - - GUISetup(); - - BootChecks(); - } - - // CLI Mode - public Form1(string[] args) - { - InitializeComponent(); - Debug.WriteLine("CLI Parameters passed"); - - GUISetup(); - - if ((args.Length == 1) && (File.Exists(args[0]))) - { - BootChecks(); - - string script_content = File.ReadAllText(args[0]); - FileInfo script_file = new FileInfo(args[0]); - script_content += String.Format(";{0}", script_file.Name.Replace("." + script_file.Extension, "")); - - BackgroundWorker scripter = new BackgroundWorker(); - scripter.DoWork += new DoWorkEventHandler(RunScriptBg); - scripter.RunWorkerAsync(script_content); - } - else if (args.Length >= 2) - { - RunCommandMode(args); - Environment.Exit(0); - //this.Close(); - } - else - { - BootChecks(); - } - } - - private void RunCommandMode(string[] args) - { - // CLI mode, inspired and taken from wiiNinja's mod. - - // Initialize the checkboxes and radio boxes - packbox.Checked = false; // Create wad - default OFF - localuse.Checked = true; // Use local content if already downloaded - default ON - decryptbox.Checked = false; - keepenccontents.Checked = false; - //consoleCBox.SelectedIndex = 0; // 0 is Wii, 1 is DS - - // Clear 3 items in ios patches list. This feature is not supported in the command line version at this time. - iosPatchCheckbox.Checked = false; - iosPatchesListBox.SetItemChecked(0, false); - iosPatchesListBox.SetItemChecked(1, false); - iosPatchesListBox.SetItemChecked(2, false); - - Console.WriteLine("NUS Downloader - v{0}", version); - - if (args.Length < 2) - { - Console.WriteLine("Usage:"); - Console.WriteLine(" nusd [optionalArgs]"); - Console.WriteLine("\nWhere:"); - Console.WriteLine(" titleID = The ID of the title to be downloaded"); - Console.WriteLine(" titleVersion = The version of the title to be downloaded"); - Console.WriteLine(" Use \"*\" (no quotes) to get the latest version"); - Console.WriteLine(" OptionalArgs:"); - Console.WriteLine(" packwad = A wad file will be generated"); - Console.WriteLine(" localuse = Use local contents if available"); - Console.WriteLine(" decrypt = Create decrypted contents"); - Console.WriteLine(" keepencrypt = Keep encrypted contents"); - } - else - { - for (int i = 0; i < args.Length; i++) - { - Console.WriteLine("{0}", args[i]); - switch (i) - { - case 0: - // First command line argument is ALWAYS the TitleID - titleidbox.Text = args[i]; - break; - - case 1: - // Second command line argument is ALWAYS the TitleVersion. - // User may specify a "*" to retrieve the latest version - if (args[i] == "*") - titleversion.Text = ""; - else - titleversion.Text = args[i]; - break; - - default: - // Any other arguments beyond the 2nd one are considered optional - if (args[i] == "packwad") - packbox.Checked = true; - else if (args[i] == "localuse") - localuse.Checked = true; - else if (args[i] == "decrypt") - decryptbox.Checked = true; - else if (args[i] == "keepencrypt") - keepenccontents.Checked = true; - else - Console.WriteLine("\n>>>> Warning: Unrecognized command line argument: {0}. This option is ignored...", args[i]); - break; - } - } - - // Do this to set the wad file name - UpdatePackedName(); - - // Call to get the files from server - NUSDownloader_DoWork(null, null); - - Console.WriteLine("\nSuccessfully downloaded the title {0} version {1}", args[0], args[1]); - } - } - - private void GUISetup() - { - this.Font = new System.Drawing.Font("Tahoma", 8); - this.MaximumSize = this.MinimumSize = this.Size; // Lock size down PATCHOW :D - if (Type.GetType("Mono.Runtime") != null) - { - saveaswadbtn.Text = "Save As"; - clearButton.Text = "Clear"; - keepenccontents.Text = "Keep Enc. Contents"; - clearButton.Left -= 41; - } - else - statusbox.Font = new System.Drawing.Font("Microsoft Sans Serif", 7); - statusbox.SelectionColor = statusbox.ForeColor = normalcolor; - if (version.StartsWith("SVN")) - { - WriteStatus("!!!!! THIS IS A DEBUG BUILD FROM SVN !!!!!"); - WriteStatus("Features CAN and WILL be broken in this build!"); - WriteStatus("Devs: REMEMBER TO CHANGE TO THE RELEASE CONFIGURATION AND CHANGE VERSION NUMBER BEFORE BUILDING!"); - WriteStatus("\r\n"); - } - - // Database BackgroundWorker - this.databaseWorker = new BackgroundWorker(); - this.databaseWorker.DoWork += new DoWorkEventHandler(DoAllDatabaseyStuff); - this.databaseWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DoAllDatabaseyStuff_Completed); - this.databaseWorker.ProgressChanged += new ProgressChangedEventHandler(DoAllDatabaseyStuff_ProgressChanged); - this.databaseWorker.WorkerReportsProgress = true; - - // DSi Database BackgroundWorker - this.dsiDatabaseWorker = new BackgroundWorker(); - this.dsiDatabaseWorker.DoWork += new DoWorkEventHandler(DSiDatabaseWork); - this.dsiDatabaseWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DSiDatabaseWork_Completed); - this.dsiDatabaseWorker.ProgressChanged += new ProgressChangedEventHandler(DSiDatabaseWork_ProgressChanged); - this.dsiDatabaseWorker.WorkerReportsProgress = true; - - // Scripts BGLoader - this.scriptsWorker = new BackgroundWorker(); - this.scriptsWorker.DoWork += new DoWorkEventHandler(OrganizeScripts); - this.scriptsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(scriptsWorker_RunWorkerCompleted); - } - - private void Form1_Load(object sender, EventArgs e) - { - this.Text = String.Format("NUSD - {0}", version); ; - this.Size = this.MinimumSize; - serverLbl.Text = "Wii"; - } - - private bool NUSDFileExists(string filename) - { - return File.Exists(Path.Combine(CURRENT_DIR, filename)); - } - - /// - /// Checks certain file existances, etc. - /// - /// - private void BootChecks() - { - //Check if correct thread... - if (this.InvokeRequired) - { - Debug.WriteLine("InvokeRequired..."); - BootChecksCallback bcc = new BootChecksCallback(BootChecks); - this.Invoke(bcc); - return; - } - - /* Check for DSi common key bin file... - if (NUSDFileExists("dsikey.bin") == true) - { - WriteStatus("DSi Common Key detected."); - dsidecrypt = true; - }*/ - /* - // Check for database.xml - if (NUSDFileExists("database.xml") == false) - { - WriteStatus("Database.xml not found. Title database not usable!"); - DatabaseEnabled(false); - updateDatabaseToolStripMenuItem.Enabled = true; - updateDatabaseToolStripMenuItem.Visible = true; - updateDatabaseToolStripMenuItem.Text = "Download Database"; - } - else - { - Database db = new Database(); - db.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "database.xml")); - string version = db.GetDatabaseVersion(); - WriteStatus("Database.xml detected."); - WriteStatus(" - Version: " + version); - updateDatabaseToolStripMenuItem.Text = "Update Database"; - //databaseButton.Enabled = false; - //databaseButton.Text = "DB Loading"; - databaseButton.Text = " [ ]"; - databaseButton.Image = Properties.Resources.arrow_ticker; - // Load it up... - this.fds.RunWorkerAsync(); - } - - // Check for database.xml - if (NUSDFileExists("dsidatabase.xml") == false) - { - WriteStatus("DSiDatabase.xml not found. DSi database not usable!"); - DatabaseEnabled(false); - updateDatabaseToolStripMenuItem.Enabled = true; - updateDatabaseToolStripMenuItem.Visible = true; - updateDatabaseToolStripMenuItem.Text = "Download Database"; - } - else - { - Database db = new Database(); - db.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "database.xml")); - string version = db.GetDatabaseVersion(); - WriteStatus("Database.xml detected."); - WriteStatus(" - Version: " + version); - updateDatabaseToolStripMenuItem.Text = "Update Database"; - //databaseButton.Enabled = false; - //databaseButton.Text = "DB Loading"; - databaseButton.Text = " [ ]"; - databaseButton.Image = Properties.Resources.arrow_ticker; - // Load it up... - this.fds.RunWorkerAsync(); - }*/ - - if (NUSDFileExists("database.xml") == true) - { - Database db = new Database(); - db.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "database.xml")); - string version = db.GetDatabaseVersion(); - WriteStatus("Database.xml detected."); - WriteStatus(" - Version: " + version); - updateDatabaseToolStripMenuItem.Text = "Update Database"; - databaseButton.Text = " [ ]"; - databaseButton.Image = Properties.Resources.arrow_ticker; - // Load it up... - this.databaseWorker.RunWorkerAsync(); - } - - if (NUSDFileExists("dsidatabase.xml") == true) - { - Database db = new Database(); - db.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "dsidatabase.xml")); - string version = db.GetDatabaseVersion(); - WriteStatus("DSiDatabase.xml detected."); - WriteStatus(" - Version: " + version); - updateDatabaseToolStripMenuItem.Text = "Update Database"; - databaseButton.Text = " [ ]"; - databaseButton.Image = Properties.Resources.arrow_ticker; - // Load it up... - this.dsiDatabaseWorker.RunWorkerAsync(); - } - - // Load scripts (local) - RunScriptOrganizer(); - - // Check for Proxy Settings file... - if (NUSDFileExists("proxy.txt") == true) - { - WriteStatus("Proxy settings detected."); - string[] proxy_file = File.ReadAllLines(Path.Combine(CURRENT_DIR, "proxy.txt")); - proxy_url = proxy_file[0]; - - // If proxy\nuser\npassword - if (proxy_file.Length > 2) - { - proxy_usr = proxy_file[1]; - proxy_pwd = proxy_file[2]; - } - else if (proxy_file.Length > 1) - { - proxy_usr = proxy_file[1]; - SetAllEnabled(false); - ProxyVerifyBox.Visible = true; - ProxyVerifyBox.Enabled = true; - ProxyPwdBox.Enabled = true; - SaveProxyBtn.Enabled = true; - ProxyVerifyBox.Select(); - } - } - } - - private void DoAllDatabaseyStuff(object sender, System.ComponentModel.DoWorkEventArgs e) - { - BackgroundWorker worker = sender as BackgroundWorker; - ClearDatabaseStrip(); - FillDatabaseStrip(worker); - LoadRegionCodes(); - FillDatabaseScripts(); - ShowInnerToolTips(false); - } - - private void DoAllDatabaseyStuff_Completed(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) - { - //this.databaseButton.Enabled = true; - this.databaseButton.Text = "Database..."; - this.databaseButton.Image = null; - /* - if (this.KoreaMassUpdate.HasDropDownItems || this.PALMassUpdate.HasDropDownItems || this.NTSCMassUpdate.HasDropDownItems) - { - this.scriptsbutton.Enabled = true; - }*/ - } - - private void DoAllDatabaseyStuff_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) - { - if (e.ProgressPercentage == 25) - databaseButton.Text = " [. ]"; - else if (e.ProgressPercentage == 50) - databaseButton.Text = " [.. ]"; - else if (e.ProgressPercentage == 75) - databaseButton.Text = " [... ]"; - else if (e.ProgressPercentage == 100) - databaseButton.Text = " [....]"; - } - - private void RunScriptOrganizer() - { - this.scriptsWorker.RunWorkerAsync(); - } - - private void SetAllEnabled(bool enabled) - { - for (int a = 0; a < this.Controls.Count; a++) - { - try - { - this.Controls[a].Enabled = enabled; - } - catch - { - // ... - } - } - } - - /* - /// - /// Gets the database version. - /// - /// The database file. - /// - private string GetDatabaseVersion(string file) - { - // Read version of Database.xml - XmlDocument xDoc = new XmlDocument(); - if (file.Contains("<")) - xDoc.LoadXml(file); - else - { - if (File.Exists(file)) - { - xDoc.Load(file); - } - else - { - return "None Found"; - } - } - XmlNodeList DatabaseList = xDoc.GetElementsByTagName("database"); - XmlAttributeCollection Attributes = DatabaseList[0].Attributes; - return Attributes[0].Value; - }*/ - - private void extrasMenuButton_Click(object sender, EventArgs e) - { - // Show extras menu - extrasStrip.Text = "Showing"; - extrasStrip.Show(Extrasbtn, 2, (2+Extrasbtn.Height)); - - - { - System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); - timer.Interval = 52; - timer.Tick += new EventHandler(contextmenusTimer_Tick); - timer.Start(); - } - } - - /// - /// Loads the title info from TMD. - /// - private void LoadTitleFromTMD() - { - // Show dialog for opening TMD file... - OpenFileDialog opentmd = new OpenFileDialog(); - opentmd.Filter = "TMD Files|*tmd*"; - opentmd.Title = "Open TMD"; - if (opentmd.ShowDialog() != DialogResult.Cancel) - { - libWiiSharp.TMD tmdLocal = new libWiiSharp.TMD(); - tmdLocal.LoadFile(opentmd.FileName); - WriteStatus(String.Format("TMD Loaded ({0} blocks)", tmdLocal.GetNandBlocks())); - - titleidbox.Text = tmdLocal.TitleID.ToString("X16"); - WriteStatus("Title ID: " + tmdLocal.TitleID.ToString("X16")); - - titleversion.Text = tmdLocal.TitleVersion.ToString(); - WriteStatus("Version: " + tmdLocal.TitleVersion); - - if (tmdLocal.StartupIOS.ToString("X") != "0") - WriteStatus("Requires: IOS" + int.Parse(tmdLocal.StartupIOS.ToString("X").Substring(7, 2).ToString(), System.Globalization.NumberStyles.HexNumber)); - - WriteStatus("Content Count: " + tmdLocal.NumOfContents); - - for (int a = 0; a < tmdLocal.Contents.Length; a++) - { - WriteStatus(String.Format(" Content {0}: {1} ({2} bytes)", a, tmdLocal.Contents[a].ContentID.ToString("X8"), tmdLocal.Contents[a].Size.ToString())); - WriteStatus(String.Format(" - Index: {0}", tmdLocal.Contents[a].Index.ToString())); - WriteStatus(String.Format(" - Type: {0}", tmdLocal.Contents[a].Type.ToString())); - WriteStatus(String.Format(" - Hash: {0}...", DisplayBytes(tmdLocal.Contents[a].Hash, String.Empty).Substring(0, 8))); - } - - WriteStatus("TMD information parsed!"); - } - } - - /// - /// Writes the status to the statusbox. - /// - /// The update. - /// The color to use for writing text into the text box. - public void WriteStatus(string Update, Color writecolor) - { - // Check if thread-safe - if (statusbox.InvokeRequired) - { - Debug.WriteLine("InvokeRequired..."); - WriteStatusCallback wsc = new WriteStatusCallback(WriteStatus); - this.Invoke(wsc, new object[] { Update, writecolor }); - return; - } - // Small function for writing text to the statusbox... - int startlen = statusbox.TextLength; - if (statusbox.Text == "") - statusbox.Text = Update; - else - statusbox.AppendText("\r\n" + Update); - int endlen = statusbox.TextLength; - - // Set the color - statusbox.Select(startlen, endlen - startlen); - statusbox.SelectionColor = writecolor; - - // Scroll to end of text box. - statusbox.SelectionStart = statusbox.TextLength; - statusbox.SelectionLength = 0; - statusbox.ScrollToCaret(); - - // Also write to console - Console.WriteLine(Update); - } - - /// - /// Writes the status to the statusbox. - /// - /// The update. - public void WriteStatus(string Update) - { - WriteStatus(Update, normalcolor); - } - - /// - /// Reads the type of the Title ID. - /// - /// The TitleID. - private void ReadIDType(string ttlid) - { - /* Wiibrew TitleID Info... - # 3 00000001: Essential system titles - # 4 00010000 and 00010004 : Disc-based games - # 5 00010001: Downloaded channels - - * 5.1 000010001-Cxxx : Commodore 64 Games - * 5.2 000010001-Exxx : NeoGeo Games - * 5.3 000010001-Fxxx : NES Games - * 5.4 000010001-Hxxx : Channels - * 5.5 000010001-Jxxx : SNES Games - * 5.6 000010001-Nxxx : Nintendo 64 Games - * 5.7 000010001-Wxxx : WiiWare - - # 6 00010002: System channels - # 7 00010004: Game channels and games that use them - # 8 00010005: Downloaded Game Content - # 9 00010008: "Hidden" channels - */ - - if (ttlid.Substring(0, 8) == "00000001") - WriteStatus("ID Type: System Title. BE CAREFUL!", warningcolor); - else if ((ttlid.Substring(0, 8) == "00010000") || (ttlid.Substring(0, 8) == "00010004")) - WriteStatus("ID Type: Disc-Based Game. Unlikely NUS Content!"); - else if (ttlid.Substring(0, 8) == "00010001") - WriteStatus("ID Type: Downloaded Channel. Possible NUS Content."); - else if (ttlid.Substring(0, 8) == "00010002") - WriteStatus("ID Type: System Channel. BE CAREFUL!", warningcolor); - else if (ttlid.Substring(0, 8) == "00010004") - WriteStatus("ID Type: Game Channel. Unlikely NUS Content!"); - else if (ttlid.Substring(0, 8) == "00010005") - WriteStatus("ID Type: Downloaded Game Content. Unlikely NUS Content!"); - else if (ttlid.Substring(0, 8) == "00010008") - WriteStatus("ID Type: 'Hidden' Channel. Unlikely NUS Content!"); - else - WriteStatus("ID Type: Unknown. Unlikely NUS Content!"); - } - - private void DownloadBtn_Click(object sender, EventArgs e) - { - if (titleidbox.Text == String.Empty) - { - // Prevent mass deletion and fail - WriteStatus("Please enter a Title ID!", errorcolor); - return; - } - else if (!(packbox.Checked) && !(decryptbox.Checked) && !(keepenccontents.Checked)) - { - // Prevent pointless running by n00bs. - WriteStatus("Running with your current settings will produce no output!", errorcolor); - WriteStatus(" - To amend this, look below and check an output type.", errorcolor); - return; - }/* - else if (!(script_mode)) - { - try - { - if (!statusbox.Lines[0].StartsWith(" ---")) - SetTextThreadSafe(statusbox, " --- " + titleidbox.Text + " ---"); - } - catch // No lines present... - { - SetTextThreadSafe(statusbox, " --- " + titleidbox.Text + " ---"); - } - } - else - WriteStatus(" --- " + titleidbox.Text + " ---");*/ - - - // Running Downloads in background so no form freezing - NUSDownloader.RunWorkerAsync(); - } - - private void SetTextThreadSafe(System.Windows.Forms.Control what, string setto) - { - SetPropertyThreadSafe(what, "Name", setto); - } - - private void SetPropertyThreadSafe(System.ComponentModel.Component what, object setto, string property) - { - if (this.InvokeRequired) - { - SetPropertyThreadSafeCallback sptscb = new SetPropertyThreadSafeCallback(SetPropertyThreadSafe); - try - { - this.Invoke(sptscb, new object[] { what, setto, property }); - } - catch (Exception) - { - // FFFFF! - } - return; - } - what.GetType().GetProperty(property).SetValue(what, setto, null); - //what.Text = setto; - } - - private void NUSDownloader_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) - { - Control.CheckForIllegalCrossThreadCalls = false; // this function would need major rewriting to get rid of this... - - WriteStatus("Starting NUS Download. Please be patient!", infocolor); - SetEnableforDownload(false); - downloadstartbtn.Text = "Starting NUS Download!"; - - // WebClient configuration - WebClient nusWC = new WebClient(); - nusWC = ConfigureWithProxy(nusWC); - - // Create\Configure NusClient - libWiiSharp.NusClient nusClient = new libWiiSharp.NusClient(); - nusClient.ConfigureNusClient(nusWC); - nusClient.UseLocalFiles = localuse.Checked; - nusClient.ContinueWithoutTicket = true; - - // Server - if (serverLbl.Text == "Wii") - nusClient.SetToWiiServer(); - else if (serverLbl.Text == "DSi") - nusClient.SetToDSiServer(); - - // Events - nusClient.Debug += new EventHandler(nusClient_Debug); - nusClient.Progress += new EventHandler(nusClient_Progress); - - libWiiSharp.StoreType[] storeTypes = new libWiiSharp.StoreType[3]; - if (packbox.Checked) storeTypes[0] = libWiiSharp.StoreType.WAD; else storeTypes[0] = libWiiSharp.StoreType.Empty; - if (decryptbox.Checked) storeTypes[1] = libWiiSharp.StoreType.DecryptedContent; else storeTypes[1] = libWiiSharp.StoreType.Empty; - if (keepenccontents.Checked) storeTypes[2] = libWiiSharp.StoreType.EncryptedContent; else storeTypes[2] = libWiiSharp.StoreType.Empty; - - string wadName; - if (String.IsNullOrEmpty(WAD_Saveas_Filename)) - wadName = wadnamebox.Text; - else - wadName = WAD_Saveas_Filename; - - try - { - nusClient.DownloadTitle(titleidbox.Text, titleversion.Text, Path.Combine(CURRENT_DIR, "titles"), wadName, storeTypes); - } - catch (Exception ex) - { - WriteStatus("Download failed: \"" + ex.Message + " ):\"", errorcolor); - } - - if (iosPatchCheckbox.Checked == true) { // Apply patches then... - bool didpatch = false; - int noofpatches = 0; - string appendpatch = ""; - // Okay, it's checked. - libWiiSharp.IosPatcher iosp = new libWiiSharp.IosPatcher(); - libWiiSharp.WAD ioswad = new libWiiSharp.WAD(); - wadName = wadName.Replace("[v]", nusClient.TitleVersion.ToString()); - if (wadName.Contains(Path.DirectorySeparatorChar.ToString()) || wadName.Contains(Path.AltDirectorySeparatorChar.ToString())) - ioswad.LoadFile(wadName); - else - ioswad.LoadFile(Path.Combine(Path.Combine(Path.Combine(Path.Combine(CURRENT_DIR, "titles"), titleidbox.Text), nusClient.TitleVersion.ToString()), wadName)); - try - { - iosp.LoadIOS(ref ioswad); - } - catch (Exception) - { - WriteStatus("NUS Download Finished.", infocolor); - return; - } - foreach (object checkItem in iosPatchesListBox.CheckedItems) - { - // ensure not 'indeterminate' - if (iosPatchesListBox.GetItemCheckState(iosPatchesListBox.Items.IndexOf(checkItem)).ToString() == "Checked") { - switch (checkItem.ToString()) { - case "Trucha bug": - noofpatches = iosp.PatchFakeSigning(); - if (noofpatches > 0) - { - WriteStatus(" - Patched in fake-signing:", infocolor); - if (noofpatches > 1) - appendpatch = "es"; - else - appendpatch = ""; - WriteStatus(String.Format(" {0} patch{1} applied.", noofpatches, appendpatch)); - didpatch = true; - } - else - WriteStatus(" - Could not patch fake-signing", errorcolor); - break; - case "ES_Identify": - noofpatches = iosp.PatchEsIdentify(); - if (noofpatches > 0) - { - WriteStatus(" - Patched in ES_Identify:", infocolor); - if (noofpatches > 1) - appendpatch = "es"; - else - appendpatch = ""; - WriteStatus(String.Format(" {0} patch{1} applied.", noofpatches, appendpatch)); - didpatch = true; - } - else - WriteStatus(" - Could not patch ES_Identify", errorcolor); - break; - case "NAND permissions": - noofpatches = iosp.PatchNandPermissions(); - if (noofpatches > 0) - { - WriteStatus(" - Patched in NAND permissions:", infocolor); - if (noofpatches > 1) - appendpatch = "es"; - else - appendpatch = ""; - WriteStatus(String.Format(" {0} patch{1} applied.", noofpatches, appendpatch)); - didpatch = true; - } - else - WriteStatus(" - Could not patch NAND permissions", errorcolor); - break; - } - } - else { - // WriteStatus(iosPatchesListBox.GetItemCheckState(iosPatchesListBox.Items.IndexOf(checkItem)).ToString()); - } - } - if (didpatch) - { - wadName = wadName.Replace(".wad",".patched.wad"); - try - { - if (wadName.Contains(Path.DirectorySeparatorChar.ToString()) || wadName.Contains(Path.AltDirectorySeparatorChar.ToString())) - ioswad.Save(wadName); - else - ioswad.Save(Path.Combine(Path.Combine(Path.Combine(Path.Combine(CURRENT_DIR, "titles"), titleidbox.Text), nusClient.TitleVersion.ToString()), wadName)); - WriteStatus(String.Format("Patched WAD saved as: {0}", Path.GetFileName(wadName)), infocolor); - } - catch (Exception ex) - { - WriteStatus(String.Format("Couldn't save patched WAD: \"{0}\" :(",ex.Message), errorcolor); - } - } - } - - WriteStatus("NUS Download Finished."); - - } - - void nusClient_Progress(object sender, ProgressChangedEventArgs e) - { - dlprogress.Value = e.ProgressPercentage; - } - - void nusClient_Debug(object sender, libWiiSharp.MessageEventArgs e) - { - WriteStatus(e.Message); - } - - private void NUSDownloader_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - WAD_Saveas_Filename = String.Empty; - - SetEnableforDownload(true); - downloadstartbtn.Text = "Start NUS Download!"; - dlprogress.Value = 0; - - if (IsWin7()) - dlprogress.ShowInTaskbar = false; - } - - private void packbox_CheckedChanged(object sender, EventArgs e) - { - if (packbox.Checked == true) - { - wadnamebox.Enabled = true; - saveaswadbtn.Enabled = true; - // Change WAD name if applicable - UpdatePackedName(); - } - else - { - wadnamebox.Enabled = false; - saveaswadbtn.Enabled = false; - wadnamebox.Text = String.Empty; - if (iosPatchCheckbox.Checked) - iosPatchCheckbox.Checked = false; - } - } - - private void titleidbox_TextChanged(object sender, EventArgs e) - { - UpdatePackedName(); - EnablePatchIOSBox(); - } - - private void titleversion_TextChanged(object sender, EventArgs e) - { - UpdatePackedName(); - } - - private void EnablePatchIOSBox() - { - iosPatchCheckbox.Enabled = TitleIsIOS(titleidbox.Text); - if (iosPatchCheckbox.Enabled == false) - iosPatchCheckbox.Checked = false; - } - - private bool TitleIsIOS(string titleid) - { - if (titleid.Length != 16) - return false; - - if ((titleid == "0000000100000001") || (titleid == "0000000100000002")) - return false; - - if (titleid.Substring(0, 14) == "00000001000000") - return true; - - return false; - } - - /// - /// Displays the bytes. - /// - /// The bytes. - /// What separates the bytes - /// - public string DisplayBytes(byte[] bytes, string spacer) - { - string output = ""; - for (int i = 0; i < bytes.Length; ++i) - { - output += bytes[i].ToString("X2") + spacer; - } - return output; - } - - private void DatabaseButton_Click(object sender, EventArgs e) - { - // Open Database button menu... - databaseStrip.Text = "Showing"; - databaseStrip.Show(databaseButton, 2, (2+databaseButton.Height)); - - //if (!e.Equals(EventArgs.Empty)) - { - System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); - timer.Interval = 50; - timer.Tick += new EventHandler(contextmenusTimer_Tick); - timer.Start(); - } - } - - void contextmenusTimer_Tick(object sender, EventArgs e) - { - if (SystemMenuList.Pressed || IOSMenuList.Pressed || VCMenuList.Pressed || WiiWareMenuList.Pressed - || RegionCodesList.Pressed || scriptsLocalMenuEntry.Pressed || scriptsDatabaseToolStripMenuItem.Pressed - || emulateUpdate.Pressed) - return; - - if (databaseButton.ClientRectangle.Contains(databaseButton.PointToClient(MousePosition)) && ((System.Windows.Forms.Timer)sender).Interval != 50) - { - databaseStrip.Close(); - scriptsStrip.Close(); - extrasStrip.Close(); - DatabaseButton_Click(sender, EventArgs.Empty); - ((System.Windows.Forms.Timer)sender).Stop(); - } - - if (scriptsbutton.ClientRectangle.Contains(scriptsbutton.PointToClient(MousePosition)) && ((System.Windows.Forms.Timer)sender).Interval != 51) - { - databaseStrip.Close(); - scriptsStrip.Close(); - extrasStrip.Close(); - scriptsbutton_Click(sender, EventArgs.Empty); - ((System.Windows.Forms.Timer)sender).Stop(); - } - - if (Extrasbtn.ClientRectangle.Contains(Extrasbtn.PointToClient(MousePosition)) && ((System.Windows.Forms.Timer)sender).Interval != 52) - { - databaseStrip.Close(); - scriptsStrip.Close(); - extrasStrip.Close(); - extrasMenuButton_Click(sender, EventArgs.Empty); - ((System.Windows.Forms.Timer)sender).Stop(); - } - - //Debug.Write(((databaseStrip.Text == "Hidden").ToString() + (extrasStrip.Text == "Hidden").ToString() + (scriptsStrip.Text == "Hidden").ToString())); - - - if ((databaseStrip.Visible == false) && (extrasStrip.Visible == false) && (scriptsStrip.Visible == false)) - ((System.Windows.Forms.Timer)sender).Stop(); - - - } - - /// - /// Clears the database strip. - /// - private void ClearDatabaseStrip() - { - Control.CheckForIllegalCrossThreadCalls = false; - object[] thingstoclear = new object[] { - SystemMenuList, IOSMenuList, WiiWareMenuList, VCMenuList, - - // Now Virtual Console - C64MenuList, NeoGeoMenuList, NESMenuList, - SNESMenuList, N64MenuList, TurboGrafx16MenuList, - TurboGrafxCDMenuList, MSXMenuList, SegaMSMenuList, - GenesisMenuList, VCArcadeMenuList, - - // DSi Entries - dsiSystemToolStripMenu, dSiWareToolStripMenu - }; - - foreach (System.Windows.Forms.ToolStripMenuItem tsmiclear in thingstoclear) - { - if (tsmiclear.Name != "VCMenuList") // Don't clear the VC Menu... - tsmiclear.DropDownItems.Clear(); - /* - if (tsmiclear.OwnerItem != VCMenuList) // and don't disable the VC menu subparts... - tsmiclear.Enabled = false;*/ - } - } - - /// - /// Fills the database strip with the local database.xml file. - /// - private void FillDatabaseStrip(BackgroundWorker worker) - { - // Something needs to be done to remove this i guess - //Control.CheckForIllegalCrossThreadCalls = false; - - // Set fake items visible and real ones not. Only way to stop buggy enabled stuff. - SetPropertyThreadSafe(SystemMenuList, false, "Visible"); - SetPropertyThreadSafe(IOSMenuList, false, "Visible"); - SetPropertyThreadSafe(VCMenuList, false, "Visible"); - SetPropertyThreadSafe(WiiWareMenuList, false, "Visible"); - - SetPropertyThreadSafe(systemFakeMenuItem, true, "Visible"); - SetPropertyThreadSafe(iosFakeMenuItem, true, "Visible"); - SetPropertyThreadSafe(vcFakeMenuItem, true, "Visible"); - SetPropertyThreadSafe(wwFakeMenuItem, true, "Visible"); - - Database databaseObj = new Database(); - databaseObj.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "database.xml")); - - ToolStripMenuItem[] systemItems = databaseObj.LoadSystemTitles(); - for (int a = 0; a < systemItems.Length; a++) - { - systemItems[a].DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - for (int b = 0; b < systemItems[a].DropDownItems.Count; b++) - { - ToolStripMenuItem syslowerentry = (ToolStripMenuItem)systemItems[a].DropDownItems[b]; - if (syslowerentry.DropDownItems.Count > 0) - { - syslowerentry.DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - } - } - //AddToolStripItemToStrip(SystemMenuList, systemItems[a]); - //SystemMenuList.DropDownItems.Add(systemItems[a]); - } - Array.Sort(systemItems, delegate(ToolStripMenuItem tsmi1, ToolStripMenuItem tsmi2) - { - return tsmi1.Text - .Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)); - }); - AddToolStripItemToStrip(SystemMenuList, systemItems); - - SetPropertyThreadSafe(systemFakeMenuItem, false, "Visible"); - SetPropertyThreadSafe(SystemMenuList, true, "Visible"); - - Debug.WriteLine("Database: SysTitles added"); - worker.ReportProgress(25); - - ToolStripMenuItem[] iosItems = databaseObj.LoadIosTitles(); - for (int a = 0; a < iosItems.Length; a++) - { - iosItems[a].DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - //AddToolStripItemToStrip(IOSMenuList, iosItems[a]); - //IOSMenuList.DropDownItems.Add(iosItems[a]); - } - AddToolStripItemToStrip(IOSMenuList, iosItems); - - SetPropertyThreadSafe(iosFakeMenuItem, false, "Visible"); - SetPropertyThreadSafe(IOSMenuList, true, "Visible"); - Debug.WriteLine("Database: IosTitles added"); - worker.ReportProgress(50); - - ToolStripMenuItem[][] vcItems = databaseObj.LoadVirtualConsoleTitles(); - for (int a = 0; a < vcItems.Length; a++) - { - for (int b = 0; b < vcItems[a].Length; b++) - { - vcItems[a][b].DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - for (int c = 0; c < vcItems[a][b].DropDownItems.Count; c++) - { - ToolStripMenuItem lowerentry = (ToolStripMenuItem)vcItems[a][b].DropDownItems[c]; - lowerentry.DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - } - } - Array.Sort(vcItems[a], delegate(ToolStripMenuItem tsmi1, ToolStripMenuItem tsmi2) - { - return tsmi1.Text - .Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)); - }); - AddToolStripItemToStrip((ToolStripMenuItem)VCMenuList.DropDownItems[a], vcItems[a]); - } - - SetPropertyThreadSafe(vcFakeMenuItem, false, "Visible"); - SetPropertyThreadSafe(VCMenuList, true, "Visible"); - Debug.WriteLine("Database: VCTitles added"); - worker.ReportProgress(75); - - ToolStripMenuItem[] wwItems = databaseObj.LoadWiiWareTitles(); - for (int a = 0; a < wwItems.Length; a++) - { - wwItems[a].DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - for (int b = 0; b < wwItems[a].DropDownItems.Count; b++) - { - ToolStripMenuItem lowerentry = (ToolStripMenuItem)wwItems[a].DropDownItems[b]; - if (lowerentry.DropDownItems.Count > 0) - { - lowerentry.DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - } - - } - //AddToolStripItemToStrip(WiiWareMenuList, wwItems[a]); - //WiiWareMenuList.DropDownItems.Add(wwItems[a]); - } - Array.Sort(wwItems, delegate(ToolStripMenuItem tsmi1, ToolStripMenuItem tsmi2) - { - return tsmi1.Text - .Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)); - }); - AddToolStripItemToStrip(WiiWareMenuList, wwItems); - - SetPropertyThreadSafe(wwFakeMenuItem, false, "Visible"); - SetPropertyThreadSafe(WiiWareMenuList, true, "Visible"); - Debug.WriteLine("Database: WiiWareTitles added"); - worker.ReportProgress(100); - } - - /// - /// Fills the database strip with the local database.xml file. - /// - private void FillDSiDatabaseStrip(BackgroundWorker worker) - { - // Set fake items visible and real ones not. Only way to stop buggy enabled stuff. - SetPropertyThreadSafe(dsiSystemToolStripMenu, false, "Visible"); - SetPropertyThreadSafe(dSiWareToolStripMenu, false, "Visible"); - - SetPropertyThreadSafe(dsiFakeSystemToolStripMenu, true, "Visible"); - SetPropertyThreadSafe(dSiWareFakeToolStripMenu, true, "Visible"); - - Database databaseObj = new Database(); - databaseObj.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "dsidatabase.xml")); - - ToolStripMenuItem[] systemItems = databaseObj.LoadDSiSystemTitles(); - for (int a = 0; a < systemItems.Length; a++) - { - systemItems[a].DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - for (int b = 0; b < systemItems[a].DropDownItems.Count; b++) - { - ToolStripMenuItem syslowerentry = (ToolStripMenuItem)systemItems[a].DropDownItems[b]; - if (syslowerentry.DropDownItems.Count > 0) - { - syslowerentry.DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - } - } - } - Array.Sort(systemItems, delegate(ToolStripMenuItem tsmi1, ToolStripMenuItem tsmi2) - { - return tsmi1.Text - .Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)); - }); - AddToolStripItemToStrip(dsiSystemToolStripMenu, systemItems); - - SetPropertyThreadSafe(dsiFakeSystemToolStripMenu, false, "Visible"); - SetPropertyThreadSafe(dsiSystemToolStripMenu, true, "Visible"); - - Debug.WriteLine("Database: DSiSysTitles added"); - worker.ReportProgress(50); - - ToolStripMenuItem[] dsiWareItems = databaseObj.LoadDsiWareTitles(); - for (int a = 0; a < dsiWareItems.Length; a++) - { - dsiWareItems[a].DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - for (int b = 0; b < dsiWareItems[a].DropDownItems.Count; b++) - { - ToolStripMenuItem lowerentry = (ToolStripMenuItem)dsiWareItems[a].DropDownItems[b]; - if (lowerentry.DropDownItems.Count > 0) - { - lowerentry.DropDownItemClicked += new ToolStripItemClickedEventHandler(DatabaseItem_Clicked); - } - - } - } - Array.Sort(dsiWareItems, delegate(ToolStripMenuItem tsmi1, ToolStripMenuItem tsmi2) - { - return tsmi1.Text - .Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)); - }); - AddToolStripItemToStrip(dSiWareToolStripMenu, dsiWareItems); - - SetPropertyThreadSafe(dSiWareFakeToolStripMenu, false, "Visible"); - SetPropertyThreadSafe(dSiWareToolStripMenu, true, "Visible"); - Debug.WriteLine("Database: DSiWareTitles added"); - worker.ReportProgress(100); - } - - /// - /// Adds the tool strip item to strip. - /// - /// The type. - /// The additionitem. - /// The attributes. - // private void AddToolStripItemToStrip(ToolStripMenuItem menulist, ToolStripMenuItem additionitem) - private void AddToolStripItemToStrip(ToolStripMenuItem menulist, ToolStripMenuItem[] additionitems) - { - //Control.CheckForIllegalCrossThreadCalls = false; - //Debug.WriteLine(String.Format("Adding item")); - - if (this.InvokeRequired) - { - //Debug.WriteLine("InvokeRequired..."); - AddToolStripItemToStripCallback atsitsc = new AddToolStripItemToStripCallback(AddToolStripItemToStrip); - this.Invoke(atsitsc, new object[] { menulist, additionitems }); - return; - - } - - menulist.DropDownItems.AddRange(additionitems); - /* - // Do not sort IOS menu (alphabetization fail) - if (menulist.Text == IOSMenuList.Text) - { - menulist.DropDownItems.Add(additionitem); - return; - } - - if (menulist.DropDownItems.Count < 1) - { - menulist.DropDownItems.Add(additionitem); - return; - } - - // Sorting of items by name 18 chars in... - //try - //{ - for (int a = 0; a < menulist.DropDownItems.Count; a++) - { - if (menulist.DropDownItems[a].Text - .Substring(18, menulist.DropDownItems[a].Text.Length - 19) - .CompareTo(additionitem.Text.Substring(18, additionitem.Text.Length - 19)) == 1) - { - menulist.DropDownItems.Insert((a), additionitem); - return; - } - - - } - //} - - //catch (Exception) - //{ - //Debug.WriteLine("Tryfail at : " + additionitem.Text); - //menulist.DropDownItems.Add(additionitem); - //}*/ - - //menulist.DropDownItems.Add(additionitem); - } - - /// - /// Mods WAD names to be official. - /// - /// The titlename. - public string OfficialWADNaming(string titlename) - { - if (titlename == "MIOS") - titlename = "RVL-mios-[v].wad"; - else if (titlename.Contains("IOS")) - titlename = titlename + "-64-[v].wad"; - else if (titlename.Contains("System Menu")) - titlename = "RVL-WiiSystemmenu-[v].wad"; - else if (titlename.Contains("System Menu")) - titlename = "RVL-WiiSystemmenu-[v].wad"; - else if (titlename == "BC") - titlename = "RVL-bc-[v].wad"; - else if (titlename.Contains("Mii Channel")) - titlename = "RVL-NigaoeNR-[v].wad"; - else if (titlename.Contains("Shopping Channel")) - titlename = "RVL-Shopping-[v].wad"; - else if (titlename.Contains("Weather Channel")) - titlename = "RVL-Weather-[v].wad"; - else - titlename = titlename + "-NUS-[v].wad"; - - if (wadnamebox.InvokeRequired) - { - OfficialWADNamingCallback ownc = new OfficialWADNamingCallback(OfficialWADNaming); - wadnamebox.Invoke(ownc, new object[] { titlename }); - return titlename; - } - - wadnamebox.Text = titlename; - - if (titleversion.Text != "") - wadnamebox.Text = wadnamebox.Text.Replace("[v]", "v" + titleversion.Text); - - return titlename; - } - /* - private void upditem_itemclicked(object sender, ToolStripItemClickedEventArgs e) - { - WriteStatus("Preparing to run download script..."); - //script_mode = true; - SetTextThreadSafe(statusbox, ""); - //WriteStatus("Starting script download. Please be patient!"); - - string[] NUS_Entries = e.ClickedItem.AccessibleDescription.Split('\n'); - // TODO: Find somewhere better to put this. AND FAST! - for (int i = 0; i < NUS_Entries.Length; i++) - { - WriteStatus(NUS_Entries[i]); - } - script_filename = "\000"; - nusentries = NUS_Entries; - BackgroundWorker scripter = new BackgroundWorker(); - scripter.DoWork += new DoWorkEventHandler(RunScript); - scripter.RunWorkerAsync(); - }*/ - - public void DatabaseItem_Clicked(object sender, ToolStripItemClickedEventArgs e) - { - Regex IdandTitle = new Regex(@"[0-9A-Z]*\s-\s.*"); - Regex RegionEntry = new Regex(@"[0-9A-Z][0-9A-Z] \(.*\)"); - Regex VersionEntry = new Regex(@"v[0-9]*.*"); - - object[] wiiMenuLists = new object[] { - SystemMenuList, IOSMenuList, WiiWareMenuList, VCMenuList - }; - object[] dsiMenuLists = new object[] { - dsiSystemToolStripMenu, dSiWareToolStripMenu - }; - - // This item is a Titleid - Descname entry - if (IdandTitle.IsMatch(e.ClickedItem.Text)) - { - string text = e.ClickedItem.Text.Replace(" - ", "~"); - string[] values = text.Split('~'); - titleidbox.Text = values[0]; - statusbox.Text = String.Format(" --- {0} ---", values[1]); - titleversion.Text = String.Empty; - - if ((e.ClickedItem.Image) == (Database.orange) || (e.ClickedItem.Image) == (Database.redorange)) - { - WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); - packbox.Checked = false; - decryptbox.Checked = false; - } - - // Check for danger item - if ((e.ClickedItem.Image) == (Database.redgreen) || (e.ClickedItem.Image) == (Database.redorange)) - WriteStatus("\n" + e.ClickedItem.ToolTipText); - - // Set server selection - foreach (System.Windows.Forms.ToolStripMenuItem tsmi in wiiMenuLists) - { - if (tsmi.Name == e.ClickedItem.OwnerItem.Name) - serverLbl.Text = "Wii"; - } - foreach (System.Windows.Forms.ToolStripMenuItem tsmi in dsiMenuLists) - { - if (tsmi.Name == e.ClickedItem.OwnerItem.Name) - serverLbl.Text = "DSi"; - } - } - - // Region ClickedItem - if (RegionEntry.IsMatch(e.ClickedItem.Text)) - { - string text = e.ClickedItem.OwnerItem.Text.Replace(" - ", "~"); - string[] values = text.Split('~'); - titleidbox.Text = values[0]; - statusbox.Text = String.Format(" --- {0} ---", values[1]); - titleversion.Text = String.Empty; - - // Put 'XX' into title ID - titleidbox.Text = titleidbox.Text.Replace("XX", e.ClickedItem.Text.Substring(0, 2)); - - if ((e.ClickedItem.OwnerItem.Image) == (Database.orange) || (e.ClickedItem.OwnerItem.Image) == (Database.redorange)) - { - WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); - packbox.Checked = false; - decryptbox.Checked = false; - } - - // Check for danger item - if ((e.ClickedItem.OwnerItem.Image) == (Database.redgreen) || (e.ClickedItem.OwnerItem.Image) == (Database.redorange)) - WriteStatus("\n" + e.ClickedItem.OwnerItem.ToolTipText); - - // Set server selection - foreach (System.Windows.Forms.ToolStripMenuItem tsmi in wiiMenuLists) - { - if (tsmi.Name == e.ClickedItem.OwnerItem.OwnerItem.Name) - serverLbl.Text = "Wii"; - } - foreach (System.Windows.Forms.ToolStripMenuItem tsmi in dsiMenuLists) - { - if (tsmi.Name == e.ClickedItem.OwnerItem.OwnerItem.Name) - serverLbl.Text = "DSi"; - } - } - - // Version ClickedItem - if (VersionEntry.IsMatch(e.ClickedItem.Text) || e.ClickedItem.Text == "Latest Version") - { - if (RegionEntry.IsMatch(e.ClickedItem.OwnerItem.Text)) - { - string text = e.ClickedItem.OwnerItem.OwnerItem.Text.Replace(" - ", "~"); - string[] values = text.Split('~'); - titleidbox.Text = values[0]; - statusbox.Text = String.Format(" --- {0} ---", values[1]); - - // Put 'XX' into title ID - titleidbox.Text = titleidbox.Text.Replace("XX", e.ClickedItem.OwnerItem.Text.Substring(0, 2)); - } - else - { - string text = e.ClickedItem.OwnerItem.Text.Replace(" - ", "~"); - string[] values = text.Split('~'); - titleidbox.Text = values[0]; - statusbox.Text = String.Format(" --- {0} ---", values[1]); - } - - // Set version - if (e.ClickedItem.Text == "Latest Version") - titleversion.Text = String.Empty; - else - { - string[] version = e.ClickedItem.Text.Replace("v", "").Split(' '); - titleversion.Text = version[0]; - } - - if (RegionEntry.IsMatch(e.ClickedItem.OwnerItem.Text)) - { - if ((e.ClickedItem.OwnerItem.OwnerItem.Image) == (Database.orange) || (e.ClickedItem.OwnerItem.OwnerItem.Image) == (Database.redorange)) - { - WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); - packbox.Checked = false; - decryptbox.Checked = false; - } - - // Check for danger item - if ((e.ClickedItem.OwnerItem.OwnerItem.Image) == (Database.redgreen) || (e.ClickedItem.OwnerItem.OwnerItem.Image) == (Database.redorange)) - WriteStatus("\n" + e.ClickedItem.OwnerItem.OwnerItem.ToolTipText); - - // Set server selection - foreach (System.Windows.Forms.ToolStripMenuItem tsmi in wiiMenuLists) - { - if (tsmi.Name == e.ClickedItem.OwnerItem.OwnerItem.OwnerItem.Name) - serverLbl.Text = "Wii"; - } - foreach (System.Windows.Forms.ToolStripMenuItem tsmi in dsiMenuLists) - { - if (tsmi.Name == e.ClickedItem.OwnerItem.OwnerItem.OwnerItem.Name) - serverLbl.Text = "DSi"; - } - } - else - { - if ((e.ClickedItem.OwnerItem.Image) == (Database.orange) || (e.ClickedItem.OwnerItem.Image) == (Database.redorange)) - { - WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); - packbox.Checked = false; - decryptbox.Checked = false; - } - - // Check for danger item - if ((e.ClickedItem.OwnerItem.Image) == (Database.redgreen) || (e.ClickedItem.OwnerItem.Image) == (Database.redorange)) - WriteStatus("\n" + e.ClickedItem.OwnerItem.ToolTipText); - - // Set server selection - foreach (System.Windows.Forms.ToolStripMenuItem tsmi in wiiMenuLists) - { - if (tsmi.Name == e.ClickedItem.OwnerItem.OwnerItem.Name) - serverLbl.Text = "Wii"; - } - foreach (System.Windows.Forms.ToolStripMenuItem tsmi in dsiMenuLists) - { - if (tsmi.Name == e.ClickedItem.OwnerItem.OwnerItem.Name) - serverLbl.Text = "DSi"; - } - } - } - } - - /// - /// Gathers the region based on index - /// - /// The index. - /// XmlDocument with database inside - /// Region desc - private string RegionFromIndex(int index, XmlDocument databasexml) - { - /* Typical Region XML - * - 41 (All/System) - 44 (German) - 45 (USA/NTSC) - 46 (French) - 4A (Japan) - 4B (Korea) - 4C (Japanese Import to Europe/Australia/PAL) - 4D (American Import to Europe/Australia/PAL) - 4E (Japanese Import to USA/NTSC) - 50 (Europe/PAL) - 51 (Korea w/ Japanese Language) - 54 (Korea w/ English Language) - 58 (Some Homebrew) - - */ - - XmlNodeList XMLRegionList = databasexml.GetElementsByTagName("REGIONS"); - XmlNodeList ChildrenOfTheNode = XMLRegionList[0].ChildNodes; - - // For each child node (region node) - for (int z = 0; z < ChildrenOfTheNode.Count; z++) - { - // Gather attributes (index='x') - XmlAttributeCollection XMLAttributes = ChildrenOfTheNode[z].Attributes; - - // Return value of node if index matches - if (Convert.ToInt32(XMLAttributes[0].Value) == index) - return ChildrenOfTheNode[z].InnerText; - } - - return "XX (Error)"; - } - - /// - /// Loads the region codes. - /// - private void LoadRegionCodes() - { - // TODO: make this check InvokeRequired... - if (this.InvokeRequired) - { - BootChecksCallback bcc = new BootChecksCallback(LoadRegionCodes); - this.Invoke(bcc); - return; - } - - wiiRegionCodesMenu.DropDownItems.Clear(); - dsiRegionCodesMenu.DropDownItems.Clear(); - - Database databaseObj = new Database(); - databaseObj.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "database.xml")); - - ToolStripMenuItem[] regionItems = databaseObj.LoadRegionCodes(); - - // For each child node (region node) - for (int z = 0; z < regionItems.Length; z++) - { - wiiRegionCodesMenu.DropDownItems.Add(regionItems[z].Text); - } - - Database dsiDatabaseObj = new Database(); - dsiDatabaseObj.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "dsidatabase.xml")); - - ToolStripMenuItem[] dsiRegionItems = dsiDatabaseObj.LoadRegionCodes(); - - // For each child node (region node) - for (int z = 0; z < dsiRegionItems.Length; z++) - { - dsiRegionCodesMenu.DropDownItems.Add(dsiRegionItems[z].Text); - } - } - - /// - /// Removes the illegal characters. - /// - /// removes the illegal chars - /// legal string - private static string RemoveIllegalCharacters(string databasestr) - { - // Database strings must contain filename-legal characters. - foreach (char illegalchar in System.IO.Path.GetInvalidFileNameChars()) - { - if (databasestr.Contains(illegalchar.ToString())) - databasestr = databasestr.Replace(illegalchar, '-'); - } - return databasestr; - } - - private void ClearStatusbox(object sender, EventArgs e) - { - // Clear Statusbox.text - statusbox.Text = ""; - } - - /// - /// Makes everything disabled/enabled. - /// - /// if set to true [enabled]. - private void SetEnableforDownload(bool enabled) - { - if (this.InvokeRequired) - { - SetEnableForDownloadCallback sefdcb = new SetEnableForDownloadCallback(SetEnableforDownload); - this.Invoke(sefdcb, new object[] { enabled }); - return; - } - // Disable things the user should not mess with during download... - if (enabled) - { // we're enabling things that were enabled BEFORE: - downloadstartbtn.Enabled = disabledStorage[0]; - titleidbox.Enabled = disabledStorage[1]; - titleversion.Enabled = disabledStorage[2]; - Extrasbtn.Enabled = disabledStorage[3]; - databaseButton.Enabled = disabledStorage[4]; - packbox.Enabled = disabledStorage[5]; - localuse.Enabled = disabledStorage[6]; - saveaswadbtn.Enabled = disabledStorage[7]; - decryptbox.Enabled = disabledStorage[8]; - keepenccontents.Enabled = disabledStorage[9]; - scriptsbutton.Enabled = disabledStorage[10]; - serverLbl.Enabled = disabledStorage[11]; - iosPatchCheckbox.Enabled = disabledStorage[12]; - } - else - { - disabledStorage[0] = downloadstartbtn.Enabled; - disabledStorage[1] = titleidbox.Enabled; - disabledStorage[2] = titleversion.Enabled; - disabledStorage[3] = Extrasbtn.Enabled; - disabledStorage[4] = databaseButton.Enabled; - disabledStorage[5] = packbox.Enabled; - disabledStorage[6] = localuse.Enabled; - disabledStorage[7] = saveaswadbtn.Enabled; - disabledStorage[8] = decryptbox.Enabled; - disabledStorage[9] = keepenccontents.Enabled; - disabledStorage[10] = scriptsbutton.Enabled; - disabledStorage[11] = serverLbl.Enabled; - disabledStorage[12] = iosPatchCheckbox.Enabled; - - downloadstartbtn.Enabled = enabled; - titleidbox.Enabled = enabled; - titleversion.Enabled = enabled; - Extrasbtn.Enabled = enabled; - databaseButton.Enabled = enabled; - packbox.Enabled = enabled; - localuse.Enabled = enabled; - saveaswadbtn.Enabled = enabled; - decryptbox.Enabled = enabled; - keepenccontents.Enabled = enabled; - scriptsbutton.Enabled = enabled; - serverLbl.Enabled = enabled; - iosPatchCheckbox.Enabled = enabled; - } - } - - /// - /// Makes tooltips disappear in the database, as many contain danger tag info. - /// - /// if set to true [enabled]. - private void ShowInnerToolTips(bool enabled) - { - // Force tooltips to GTFO in sub menus... - foreach (ToolStripItem item in databaseStrip.Items) - { - try - { - ToolStripMenuItem menuitem = (ToolStripMenuItem) item; - menuitem.DropDown.ShowItemToolTips = false; - } - catch (Exception) - { - // Do nothing, some objects will not cast. - } - } - foreach (ToolStripItem item in scriptsStrip.Items) - { - try - { - ToolStripMenuItem menuitem = (ToolStripMenuItem)item; - menuitem.DropDown.ShowItemToolTips = false; - } - catch (Exception) - { - // Do nothing, some objects will not cast. - } - } - } - - /// - /// Updates the name of the packed WAD in the textbox. - /// - private void UpdatePackedName() - { - // Change WAD name if applicable - - string title_name = null; - - if ((titleidbox.Enabled == true) && (packbox.Checked == true)) - { - if (titleversion.Text != "") - { - wadnamebox.Text = titleidbox.Text + "-NUS-v" + titleversion.Text + ".wad"; - } - else - { - wadnamebox.Text = titleidbox.Text + "-NUS-[v]" + titleversion.Text + ".wad"; - } - - if ((File.Exists("database.xml") == true) && (titleidbox.Text.Length == 16)) - title_name = NameFromDatabase(titleidbox.Text); - - if (title_name != null) - { - wadnamebox.Text = wadnamebox.Text.Replace(titleidbox.Text, title_name); - OfficialWADNaming(title_name); - } - } - wadnamebox.Text = RemoveIllegalCharacters(wadnamebox.Text); - } - - /// - /// Determines whether OS is win7. - /// - /// - /// true if OS = win7; otherwise, false. - /// - private static bool IsWin7() - { - return (Environment.OSVersion.VersionString.Contains("6.1") == true); - } - - private byte[] NewIntegertoByteArray(int theInt, int arrayLen) - { - byte[] resultArray = new byte[arrayLen]; - - for (int i = arrayLen - 1; i >= 0; i--) - { - resultArray[i] = (byte) ((theInt >> (8*i)) & 0xFF); - } - Array.Reverse(resultArray); - - // Fix duplication, rewrite extra to 0x00; - if (arrayLen > 4) - { - for (int i = 0; i < (arrayLen - 4); i++) - { - resultArray[i] = 0x00; - } - } - return resultArray; - } - - private WebClient ConfigureWithProxy(WebClient client) - { - // Proxy - if (!(String.IsNullOrEmpty(proxy_url))) - { - WebProxy customproxy = new WebProxy(); - customproxy.Address = new Uri(proxy_url); - if (String.IsNullOrEmpty(proxy_usr)) - customproxy.UseDefaultCredentials = true; - else - { - NetworkCredential cred = new NetworkCredential(); - cred.UserName = proxy_usr; - - if (!(String.IsNullOrEmpty(proxy_pwd))) - cred.Password = proxy_pwd; - - customproxy.Credentials = cred; - } - client.Proxy = customproxy; - WriteStatus(" - Custom proxy settings applied!"); - } - else - { - try - { - client.Proxy = WebRequest.GetSystemWebProxy(); - client.UseDefaultCredentials = true; - } - catch (NotImplementedException) - { - // Linux support - WriteStatus("This operating system does not support automatic system proxy usage. Operating without a proxy..."); - } - } - return client; - } - - /// - /// Retrieves the new database file. - /// - /// Database as a String - private void RetrieveNewDatabase(object sender, DoWorkEventArgs e) - { - // Retrieve Wiibrew/DSiBrew database page source code - WebClient databasedl = new WebClient(); - - // Proxy - //databasedl = ConfigureWithProxy(databasedl); - - string databaseSource = - databasedl.DownloadString(e.Argument.ToString() + "?cachesmash=" + - System.DateTime.Now.ToString()); - - // Strip out HTML - databaseSource = Regex.Replace(databaseSource, @"<(.|\n)*?>", ""); - - // Shrink to fix only the database - string startofdatabase = "<database v"; - string endofdatabase = "</database>"; - databaseSource = databaseSource.Substring(databaseSource.IndexOf(startofdatabase), - databaseSource.Length - databaseSource.IndexOf(startofdatabase)); - databaseSource = databaseSource.Substring(0, databaseSource.IndexOf(endofdatabase) + endofdatabase.Length); - - // Fix ", <, >, and spaces - databaseSource = databaseSource.Replace("<", "<"); - databaseSource = databaseSource.Replace(">", ">"); - databaseSource = databaseSource.Replace(""", '"'.ToString()); - databaseSource = databaseSource.Replace(" ", " "); // Shouldn't occur, but they happen... - - // Return parsed xml database... - e.Result = databaseSource; - } - - private void RetrieveNewDatabase_Completed(object sender, RunWorkerCompletedEventArgs e) - { - string database = e.Result.ToString(); - - string databaseFilename = ""; - if (database.Contains("DSISYSTEM")) - { - databaseFilename = "dsidatabase.xml"; - } - else if (database.Contains("0000000100000002")) - { - databaseFilename = "database.xml"; - } - - try - { - Database db = new Database(); - db.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, databaseFilename)); - string currentversion = db.GetDatabaseVersion(); - string onlineversion = Database.GetDatabaseVersion(database); - WriteStatus(String.Format(" - Database successfully parsed! ({0})", databaseFilename)); - WriteStatus(" - Current Database Version: " + currentversion); - WriteStatus(" - Online Database Version: " + onlineversion); - - if (currentversion == onlineversion) - { - WriteStatus(" - You have the latest database version!"); - return; - } - } - catch (FileNotFoundException) - { - WriteStatus(" - Database does not yet exist."); - WriteStatus(" - Online Database Version: " + Database.GetDatabaseVersion(database)); - } - - bool isCreation = false; - if (File.Exists(databaseFilename)) - { - WriteStatus(" - Overwriting your current database..."); - WriteStatus(String.Format(" - The old database will become 'old{0}' in case the new one is faulty.", databaseFilename)); - - string olddatabase = File.ReadAllText(databaseFilename); - File.WriteAllText("old" + databaseFilename, olddatabase); - File.Delete(databaseFilename); - File.WriteAllText(databaseFilename, database); - } - else - { - WriteStatus(String.Format(" - {0} has been created.", databaseFilename)); - File.WriteAllText(databaseFilename, database); - isCreation = true; - } - - // Load it up... - this.databaseWorker.RunWorkerAsync(); - - if (isCreation) - { - WriteStatus("Database successfully created!"); - databaseButton.Visible = true; - //databaseButton.Enabled = false; - updateDatabaseToolStripMenuItem.Text = "Download Database"; - } - else - { - WriteStatus("Database successfully updated!"); - } - } - - private void updateDatabaseToolStripMenuItem_Click(object sender, EventArgs e) - { - statusbox.Text = ""; - WriteStatus("Updating your databases from Wiibrew/DSibrew"); - - string[] wiibrewValues = new string[] { "http://www.wiibrew.org/wiki/NUS_Downloader/database", "http://www.dsibrew.org/wiki/NUS_Downloader/database" }; - - BackgroundWorker dbFetcher = new BackgroundWorker(); - dbFetcher.DoWork += new DoWorkEventHandler(RetrieveNewDatabase); - dbFetcher.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RetrieveNewDatabase_Completed); - dbFetcher.RunWorkerAsync(wiibrewValues[0]); - - BackgroundWorker dbDsiFetcher = new BackgroundWorker(); - dbDsiFetcher.DoWork += new DoWorkEventHandler(RetrieveNewDatabase); - dbDsiFetcher.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RetrieveNewDatabase_Completed); - dbDsiFetcher.RunWorkerAsync(wiibrewValues[1]); - } - - private void loadInfoFromTMDToolStripMenuItem_Click(object sender, EventArgs e) - { - // Extras menu -> Load TMD... - LoadTitleFromTMD(); - } - - /// - /// Sends the SOAP request to NUS. - /// - /// The Request - /// - public string SendSOAPRequest(string soap_xml) - { - System.Net.HttpWebRequest req = - (System.Net.HttpWebRequest) - System.Net.HttpWebRequest.Create("http://nus.shop.wii.com/nus/services/NetUpdateSOAP"); - - req.Method = "POST"; - req.UserAgent = "wii libnup/1.0"; - req.Headers.Add("SOAPAction", '"' + "urn:nus.wsapi.broadon.com/GetSystemUpdate" + '"'); - - // Proxy - if (!(String.IsNullOrEmpty(proxy_url))) - { - WebProxy customproxy = new WebProxy(); - customproxy.Address = new Uri(proxy_url); - if (String.IsNullOrEmpty(proxy_usr)) - customproxy.UseDefaultCredentials = true; - else - { - NetworkCredential cred = new NetworkCredential(); - cred.UserName = proxy_usr; - - if (!(String.IsNullOrEmpty(proxy_pwd))) - cred.Password = proxy_pwd; - - customproxy.Credentials = cred; - } - req.Proxy = customproxy; - WriteStatus(" - Custom proxy settings applied!"); - } - else - { - req.Proxy = WebRequest.GetSystemWebProxy(); - req.UseDefaultCredentials = true; - } - - UTF8Encoding encoding = new UTF8Encoding(); - byte[] bytes = encoding.GetBytes(soap_xml); - - req.ContentType = "text/xml; charset=utf-8"; - req.ContentLength = bytes.Length; - - Stream writeStream = req.GetRequestStream(); - writeStream.Write(bytes, 0, bytes.Length); - writeStream.Close(); - Application.DoEvents(); - try - { - string result; - System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)req.GetResponse(); - - using (Stream responseStream = resp.GetResponseStream()) - { - using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8)) - { - result = readStream.ReadToEnd(); - } - } - req.Abort(); - Application.DoEvents(); - return result; - } - catch (Exception ex) - { - req.Abort(); - WriteStatus(" --- An Error Occurred: " + ex.Message.ToString()); - return null; // Ugh. - //return ex.Message.ToString(); - } - } - - private void emulateUpdate_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - // Begin Wii System Update - statusbox.Text = ""; - WriteStatus("Starting Wii System Update..."); - - scriptsStrip.Close(); - - /*string deviceID = "4362227774"; - string messageID = "13198105123219138"; - string attr = "2";*/ - string deviceID = "4362227770"; - string messageID = "13198105123219038"; - string attr = "1"; - - string RegionID = e.ClickedItem.Text.Substring(0, 3); - if (RegionID == "JAP") // Japan fix, only region not w/ 1st 3 letters same as ID. - RegionID = "JPN"; - - string CountryCode = RegionID.Substring(0, 2); - - /* [14:26] RegionID: USA, Country: US; - RegionID: JPN, Country: JP; - RegionID: EUR, Country: EU; - RegionID: KOR, Country: KO; */ - - string soap_req = "\n" + - "\n" + - "\n" + - "\n" + - "1.0\n" + - "" + messageID + "\n" + - "" + deviceID + "\n" + - "" + RegionID + "\n" + - "" + CountryCode + "\n" + - "\n" + - "0000000100000001\n" + - "2\n"+ - "\n" + - "\n" + - "0000000100000002\n" + - "33\n"+ - "\n" + - "\n" + - "0000000100000009\n" + - "516\n" + - "\n" + - "" + attr + "\n" + - "\n" + - "\n" + - "\n" + - ""; - - WriteStatus(" - Sending SOAP Request to NUS..."); - WriteStatus(" - Region: " + RegionID); - string update_xml = SendSOAPRequest(soap_req); - if (update_xml != null) - WriteStatus(" - Recieved Update Info!"); - else - { - WriteStatus(" - Fail."); - return; - } - WriteStatus(" - Title information:"); - - string script_text = ""; - - XmlDocument xDoc = new XmlDocument(); - xDoc.LoadXml(update_xml); - XmlNodeList TitleList = xDoc.GetElementsByTagName("TitleVersion"); - for (int a = 0; a < TitleList.Count; a++) - { - XmlNodeList TitleInfo = TitleList[a].ChildNodes; - string TitleID = ""; - string Version = ""; - - for (int b = 0; b < TitleInfo.Count; b++) - { - switch (TitleInfo[b].Name) - { - case "TitleId": - TitleID = TitleInfo[b].InnerText; - break; - case "Version": - Version = TitleInfo[b].InnerText; - break; - default: - break; - } - } - WriteStatus(String.Format(" - {0} [v{1}]", TitleID, Version)); - - if ((NUSDFileExists("database.xml") == true) && ((!(String.IsNullOrEmpty(NameFromDatabase(TitleID)))))) - //statusbox.Text += String.Format(" [{0}]", NameFromDatabase(TitleID)); - WriteStatus(String.Format(" [{0}]", NameFromDatabase(TitleID))); - - script_text += String.Format("{0} {1}\n", TitleID, - DisplayBytes(NewIntegertoByteArray(Convert.ToInt32(Version), 2), "")); - } - - WriteStatus(" - Outputting results to NUS script..."); - - if (!(Directory.Exists(Path.Combine(CURRENT_DIR, "scripts")))) - { - Directory.CreateDirectory(Path.Combine(CURRENT_DIR, "scripts")); - WriteStatus(" - Created 'scripts\' directory."); - } - string time = RemoveIllegalCharacters(DateTime.Now.ToShortTimeString()); - File.WriteAllText( - String.Format(Path.Combine(CURRENT_DIR, Path.Combine("scripts","{0}_Update_{1}_{2}_{3} at {4}.nus")), RegionID, - DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Year, time), script_text); - WriteStatus(" - Script written!"); - scriptsLocalMenuEntry.Enabled = false; - this.scriptsWorker.RunWorkerAsync(); - - WriteStatus(" - Run this script if you feel like downloading the update!"); - // TODO: run the script... - } - - /// - /// Looks for a title's name by TitleID in Database. - /// - /// The titleid. - /// Existing name; else null - private string NameFromDatabase(string titleid) - { - // DANGER: BAD h4x HERE!! - // Fix MIOS/BC naming - if (titleid == "0000000100000101") - return "MIOS"; - else if (titleid == "0000000100000100") - return "BC"; - - XmlDocument xDoc = new XmlDocument(); - xDoc.Load("database.xml"); - - // Variables - string[] XMLNodeTypes = new string[4] {"SYS", "IOS", "VC", "WW"}; - - // Loop through XMLNodeTypes - for (int i = 0; i < XMLNodeTypes.Length; i++) // FOR THE FOUR TYPES OF NODES - { - XmlNodeList XMLSpecificNodeTypeList = xDoc.GetElementsByTagName(XMLNodeTypes[i]); - - for (int x = 0; x < XMLSpecificNodeTypeList.Count; x++) // FOR EACH ITEM IN THE LIST OF A NODE TYPE - { - bool found_it = false; - - // Lol. - XmlNodeList ChildrenOfTheNode = XMLSpecificNodeTypeList[x].ChildNodes; - - for (int z = 0; z < ChildrenOfTheNode.Count; z++) // FOR EACH CHILD NODE - { - switch (ChildrenOfTheNode[z].Name) - { - case "titleID": - if (ChildrenOfTheNode[z].InnerText == titleid) - found_it = true; - else if ((ChildrenOfTheNode[z].InnerText.Substring(0, 14) + "XX") == - (titleid.Substring(0, 14) + "XX") && - (titleid.Substring(0, 14) != "00000001000000")) - found_it = true; - else - found_it = false; - break; - default: - break; - } - } - - if (found_it) - { - for (int z = 0; z < ChildrenOfTheNode.Count; z++) // FOR EACH CHILD NODE - { - switch (ChildrenOfTheNode[z].Name) - { - case "name": - return ChildrenOfTheNode[z].InnerText; - default: - break; - } - } - } - } - } - return null; - } - - private void packbox_EnabledChanged(object sender, EventArgs e) - { - saveaswadbtn.Enabled = packbox.Enabled; - //deletecontentsbox.Enabled = packbox.Enabled; - } - - private void SaveProxyBtn_Click(object sender, EventArgs e) - { - if ((String.IsNullOrEmpty(ProxyURL.Text)) && (String.IsNullOrEmpty(ProxyUser.Text)) && - ((File.Exists(Path.Combine(CURRENT_DIR, "proxy.txt"))))) - { - File.Delete(Path.Combine(CURRENT_DIR, "proxy.txt")); - proxyBox.Visible = false; - proxy_usr = ""; - proxy_url = ""; - proxy_pwd = ""; - WriteStatus("Proxy settings deleted!"); - return; - } - else if ((String.IsNullOrEmpty(ProxyURL.Text)) && (String.IsNullOrEmpty(ProxyUser.Text)) && - ((!(File.Exists(Path.Combine(CURRENT_DIR, "proxy.txt")))))) - { - proxyBox.Visible = false; - WriteStatus("No proxy settings saved!"); - return; - } - - string proxy_file = ""; - - if (!(String.IsNullOrEmpty(ProxyURL.Text))) - { - proxy_file += ProxyURL.Text + "\n"; - proxy_url = ProxyURL.Text; - } - - if (!(String.IsNullOrEmpty(ProxyUser.Text))) - { - proxy_file += ProxyUser.Text; - proxy_usr = ProxyUser.Text; - } - - if (!(String.IsNullOrEmpty(proxy_file))) - { - File.WriteAllText(Path.Combine(CURRENT_DIR, "proxy.txt"), proxy_file); - WriteStatus("Proxy settings saved!"); - } - - proxyBox.Visible = false; - - SetAllEnabled(false); - ProxyVerifyBox.Visible = true; - ProxyVerifyBox.Enabled = true; - ProxyPwdBox.Enabled = true; - SaveProxyBtn.Enabled = true; - ProxyVerifyBox.Select(); - } - - private void proxySettingsToolStripMenuItem_Click(object sender, EventArgs e) - { - // Check for Proxy Settings file... - if (File.Exists(Path.Combine(CURRENT_DIR, "proxy.txt")) == true) - { - string[] proxy_file = File.ReadAllLines(Path.Combine(CURRENT_DIR, "proxy.txt")); - - ProxyURL.Text = proxy_file[0]; - if (proxy_file.Length > 1) - { - ProxyUser.Text = proxy_file[1]; - } - } - - proxyBox.Visible = true; - } - - private void SaveProxyPwdButton_Click(object sender, EventArgs e) - { - proxy_pwd = ProxyPwdBox.Text; - ProxyVerifyBox.Visible = false; - SetAllEnabled(true); - } - - private void ProxyPwdBox_KeyPress(object sender, KeyPressEventArgs e) - { - if (e.KeyChar == Convert.ToChar(Keys.Enter)) - SaveProxyPwdButton_Click("LOLWUT", EventArgs.Empty); - } - - private void ProxyAssistBtn_Click(object sender, EventArgs e) - { - MessageBox.Show("If you are behind a proxy, set these settings to get through to NUS." + - " If you have an alternate port for accessing your proxy, add ':' followed by the port."); - } - - private void loadNUSScriptToolStripMenuItem_Click(object sender, EventArgs e) - { - // Open a NUS script. - OpenFileDialog ofd = new OpenFileDialog(); - ofd.Multiselect = false; - ofd.Filter = "NUS Scripts|*.nus|All Files|*.*"; - if (Directory.Exists(Path.Combine(CURRENT_DIR, "scripts"))) - ofd.InitialDirectory = Path.Combine(CURRENT_DIR, "scripts"); - ofd.Title = "Load a NUS/Wiimpersonator script."; - - if (ofd.ShowDialog() != DialogResult.Cancel) - { - string script_content = File.ReadAllText(ofd.FileName); - FileInfo script_file = new FileInfo(ofd.FileName); - script_content += String.Format(";{0}", script_file.Name.Replace("." + script_file.Extension, "")); - BackgroundWorker scripter = new BackgroundWorker(); - scripter.DoWork += new DoWorkEventHandler(RunScriptBg); - scripter.RunWorkerAsync(script_content); - } - } - - /// - /// Runs a NUS script (BG). - /// - /// The sender. - /// The instance containing the event data. - private void RunScriptBg(object sender, System.ComponentModel.DoWorkEventArgs e) - { - char ArgsSplitChar = ';'; - string[] scriptArgs = e.Argument.ToString().Split(ArgsSplitChar); - - if (scriptArgs.Length < 2) - RunScript(scriptArgs[0], "random"); - else - { - RunScript(scriptArgs[0], RemoveIllegalCharacters(scriptArgs[1])); - } - /* - script_mode = true; - SetTextThreadSafe(statusbox, ""); - WriteStatus("Starting script download. Please be patient!"); - if (!File.Exists(Path.Combine(CURRENT_DIR, "output_" + Path.GetFileNameWithoutExtension(script_filename)))) - Directory.CreateDirectory(Path.Combine(CURRENT_DIR, "output_" + Path.GetFileNameWithoutExtension(script_filename))); - string[] NUS_Entries; - if (script_filename != "\000") - { - NUS_Entries = File.ReadAllLines(script_filename); - } - else - { - NUS_Entries = nusentries; - } - WriteStatus(String.Format(" - Script loaded ({0} Titles)", NUS_Entries.Length)); - - for (int a = 0; a < NUS_Entries.Length; a++) - { - // Download the title - WriteStatus(String.Format("===== Running Download ({0}/{1}) =====", a + 1, NUS_Entries.Length)); - string[] title_info = NUS_Entries[a].Split(' '); - // don't let the delete issue reappear... - if (string.IsNullOrEmpty(title_info[0])) - break; - - // WebClient configuration - WebClient nusWC = new WebClient(); - nusWC = ConfigureWithProxy(nusWC); - nusWC.Headers.Add("User-Agent", "wii libnup/1.0"); // Set UserAgent to Wii value - - // Create\Configure NusClient - libWiiSharp.NusClient nusClient = new libWiiSharp.NusClient(); - nusClient.ConfigureNusClient(nusWC); - nusClient.UseLocalFiles = localuse.Checked; - nusClient.ContinueWithoutTicket = true; - nusClient.Debug += new EventHandler(nusClient_Debug); - - libWiiSharp.StoreType[] storeTypes = new libWiiSharp.StoreType[1]; - // There's no harm in outputting everything i suppose - storeTypes[0] = libWiiSharp.StoreType.All; - - int title_version = int.Parse(title_info[1], System.Globalization.NumberStyles.HexNumber); - - string wadName = NameFromDatabase(title_info[0]); - if (wadName != null) - wadName = OfficialWADNaming(wadName); - else - wadName = title_info[0] + "-NUS-v" + title_version + ".wad"; - - nusClient.DownloadTitle(title_info[0], title_version.ToString(), Path.Combine(CURRENT_DIR, ("output_" + Path.GetFileNameWithoutExtension(script_filename))), wadName, storeTypes); - - /* - SetTextThreadSafe(titleidbox, title_info[0]); - SetTextThreadSafe(titleversion, - Convert.ToString(256* - (byte.Parse(title_info[1].Substring(0, 2), - System.Globalization.NumberStyles.HexNumber)))); - SetTextThreadSafe(titleversion, - Convert.ToString(Convert.ToInt32(titleversion.Text) + - byte.Parse(title_info[1].Substring(2, 2), - System.Globalization.NumberStyles.HexNumber))); - - button3_Click("Scripter", EventArgs.Empty); - - Thread.Sleep(1000); - - while (NUSDownloader.IsBusy) - { - Thread.Sleep(1000); - } - } - script_mode = false; - WriteStatus("Script completed!");*/ - } - - private void scriptsbutton_Click(object sender, EventArgs e) - { - // Show scripts menu - scriptsStrip.Text = "Showing"; - scriptsStrip.Show(scriptsbutton, 2, (2+scriptsbutton.Height)); - - //if (!e.Equals(EventArgs.Empty)) - { - System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); - timer.Interval = 51; - timer.Tick += new EventHandler(contextmenusTimer_Tick); - timer.Start(); - } - } - - private void DatabaseEnabled(bool enabled) - { - for (int a = 0; a < databaseStrip.Items.Count; a++) - { - databaseStrip.Items[a].Enabled = enabled; - databaseStrip.Items[a].Visible = enabled; - } - - for (int b = 0; b < VCMenuList.DropDownItems.Count; b++) - { - VCMenuList.DropDownItems[b].Enabled = true; - VCMenuList.DropDownItems[b].Visible = true; - } - } - - void scriptsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - scriptsLocalMenuEntry.Enabled = true; - } - - void OrganizeScripts(object sender, DoWorkEventArgs e) - { - //throw new NotImplementedException(); - - if (Directory.Exists(Path.Combine(CURRENT_DIR, "scripts")) == false) - { - WriteStatus("Scripts directory not found..."); - WriteStatus("- Creating it."); - Directory.CreateDirectory(Path.Combine(CURRENT_DIR, "scripts")); - } - - // Clear any entries from previous runthrough - if (scriptsLocalMenuEntry.DropDownItems.Count > 0) - { - // TODO: i suppose this is bad amiright - Control.CheckForIllegalCrossThreadCalls = false; - scriptsLocalMenuEntry.DropDownItems.Clear(); - } - - - // Add directories w/ scripts in \scripts\ - foreach (string directory in Directory.GetDirectories(Path.Combine(CURRENT_DIR, "scripts"), "*", SearchOption.TopDirectoryOnly)) - { - if (Directory.GetFiles(directory, "*.nus", SearchOption.TopDirectoryOnly).Length > 0) - { - DirectoryInfo dinfo = new DirectoryInfo(directory); - ToolStripMenuItem folder_item = new ToolStripMenuItem(); - folder_item.Text = dinfo.Name + Path.DirectorySeparatorChar; - folder_item.Image = Properties.Resources.folder_table; - - - foreach (string nusscript in Directory.GetFiles(directory, "*.nus", SearchOption.TopDirectoryOnly)) - { - FileInfo finfo = new FileInfo(nusscript); - ToolStripMenuItem nus_script_item = new ToolStripMenuItem(); - nus_script_item.Text = finfo.Name; - nus_script_item.Image = Properties.Resources.script_start; - folder_item.DropDownItems.Add(nus_script_item); - - nus_script_item.Click += new EventHandler(nus_script_item_Click); - } - - scriptsLocalMenuEntry.DropDownItems.Add(folder_item); - } - } - - // Add scripts in \scripts\ - foreach (string nusscript in Directory.GetFiles(Path.Combine(CURRENT_DIR, "scripts"), "*.nus", SearchOption.TopDirectoryOnly)) - { - FileInfo finfo = new FileInfo(nusscript); - ToolStripMenuItem nus_script_item = new ToolStripMenuItem(); - nus_script_item.Text = finfo.Name; - nus_script_item.Image = Properties.Resources.script_start; - scriptsLocalMenuEntry.DropDownItems.Add(nus_script_item); - - nus_script_item.Click += new EventHandler(nus_script_item_Click); - } - } - - private void aboutNUSDToolStripMenuItem_Click(object sender, EventArgs e) - { - // Display About Text... - statusbox.Text = ""; - WriteStatus("NUS Downloader (NUSD)"); - WriteStatus("You are running version: " + version); - if (version.StartsWith("SVN")) - WriteStatus("SVN BUILD: DO NOT REPORT BROKEN FEATURES!"); - - WriteStatus("This application created by WB3000"); - WriteStatus("Various contributions by lukegb"); - WriteStatus(String.Empty); - - if (NUSDFileExists("key.bin") == true) - WriteStatus("Wii Decryption: Local (key.bin)"); - - - if (NUSDFileExists("kkey.bin") == true) - WriteStatus("Wii Korea Decryption: Local (kkey.bin)"); - - - if (NUSDFileExists("dsikey.bin") == true) - WriteStatus("DSi Decryption: Local (dsikey.bin)"); - - if (NUSDFileExists("database.xml") == false) - WriteStatus("Database (Wii): Need (database.xml)"); - else - WriteStatus("Database (Wii): OK"); - - if (NUSDFileExists("dsidatabase.xml") == false) - WriteStatus("Database (DSi): Need (dsidatabase.xml)"); - else - WriteStatus("Database (DSi): OK"); - - if (IsWin7()) - WriteStatus("Windows 7 Features: Enabled"); - - WriteStatus(""); - WriteStatus("Special thanks to:"); - WriteStatus(" * Crediar for his wadmaker tool + source, and for the advice!"); - WriteStatus(" * Leathl for libWiiSharp."); - WriteStatus(" * SquidMan/Galaxy/comex/Xuzz/#WiiDev for advice."); - WriteStatus(" * Pasta for impressive database contributions."); - WriteStatus(" * Napo7 for testing proxy settings."); - WriteStatus(" * Wyatt O'Day for the Windows7ProgressBar Control."); - WriteStatus(" * Famfamfam for the Silk Icon Set."); - WriteStatus(" * Anyone who has helped beta test!"); - } - - private void checkBox1_CheckedChanged(object sender, EventArgs e) - { - SaveProxyPwdPermanentBtn.Enabled = checkBox1.Checked; - } - - private void SaveProxyPwdPermanentBtn_Click(object sender, EventArgs e) - { - proxy_pwd = ProxyPwdBox.Text; - - string proxy_file = File.ReadAllText(Path.Combine(CURRENT_DIR, "proxy.txt")); - - proxy_file += String.Format("\n{0}", proxy_pwd); - - File.WriteAllText(Path.Combine(CURRENT_DIR, "proxy.txt"), proxy_file); - - ProxyVerifyBox.Visible = false; - SetAllEnabled(true); - WriteStatus("To delete all traces of proxy settings, delete the proxy.txt file!"); - } - - private void clearButton_MouseEnter(object sender, EventArgs e) - { - // expand clear button - /*button3.Left = 194; - button3.Size = new System.Drawing.Size(68, 21);*/ - clearButton.Text = "Clear"; - //button3.ImageAlign = ContentAlignment.MiddleLeft; - } - - private void clearButton_MouseLeave(object sender, EventArgs e) - { - // shrink clear button - /*button3.Left = 239; - button3.Size = new System.Drawing.Size(23, 21);*/ - if (Type.GetType ("Mono.Runtime") == null) - clearButton.Text = String.Empty; - //button3.ImageAlign = ContentAlignment.MiddleCenter; - } - - private void saveaswadbtn_MouseEnter(object sender, EventArgs e) - { - /*saveaswadbtn.Left = 190; - saveaswadbtn.Size = new Size(72, 22);*/ - saveaswadbtn.Text = "Save As"; - /*saveaswadbtn.ImageAlign = ContentAlignment.MiddleLeft;*/ - } - - private void saveaswadbtn_MouseLeave(object sender, EventArgs e) - { - /*saveaswadbtn.Left = 230; - saveaswadbtn.Size = new Size(32, 22);*/ - if (Type.GetType("Mono.Runtime") == null) - saveaswadbtn.Text = String.Empty; - //saveaswadbtn.ImageAlign = ContentAlignment.MiddleCenter; - } - - void nus_script_item_Click(object sender, EventArgs e) - { - ToolStripMenuItem tsmi = (ToolStripMenuItem)sender; - string folderpath = ""; - if (!tsmi.OwnerItem.Equals(this.scriptsLocalMenuEntry)) - { - folderpath = Path.Combine(tsmi.OwnerItem.Text, folderpath); - } - folderpath = Path.Combine(this.CURRENT_DIR, Path.Combine("scripts", Path.Combine(folderpath, tsmi.Text))); - string script_content = File.ReadAllText(folderpath); - script_content += String.Format(";{0}", tsmi.Text.Replace(".nus", "")); - BackgroundWorker scripter = new BackgroundWorker(); - scripter.DoWork += new DoWorkEventHandler(RunScriptBg); - scripter.RunWorkerAsync(script_content); - } - - private void saveaswadbtn_Click(object sender, EventArgs e) - { - SaveFileDialog wad_saveas = new SaveFileDialog(); - wad_saveas.Title = "Save WAD File..."; - wad_saveas.Filter = "WAD Files|*.wad|All Files|*.*"; - wad_saveas.AddExtension = true; - DialogResult dres = wad_saveas.ShowDialog(); - if (dres != DialogResult.Cancel) - WAD_Saveas_Filename = wad_saveas.FileName; - } - - private void Form1_FormClosing(object sender, FormClosingEventArgs e) - { - // This prevents errors when exiting before the database is parsed. - // This is also probably not the best way to accomplish this... - Environment.Exit(0); - } - - private void iosPatchCheckbox_CheckedChanged(object sender, EventArgs e) - { - if (iosPatchCheckbox.Checked == true) - { - //packbox.Enabled = false; - packbox.Checked = true; - SetAllEnabled(false); - iosPatchGroupBox.Visible = true; - iosPatchGroupBox.Enabled = true; - iosPatchesListBox.Enabled = true; - iosPatchGroupBoxOKbtn.Enabled = true; - } - } - - private void iosPatchGroupBoxOKbtn_Click(object sender, EventArgs e) - { - SetAllEnabled(true); - iosPatchGroupBox.Visible = false; - if (iosPatchesListBox.CheckedIndices.Count == 0) - // Uncheck the checkbox to indicate no patches - iosPatchCheckbox.Checked = false; - } - - private void FillDatabaseScripts() - { - SetPropertyThreadSafe(scriptsDatabaseToolStripMenuItem, false, "Visible"); - Database databaseObj = new Database(); - databaseObj.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "database.xml")); - - ToolStripMenuItem[] scriptItems = databaseObj.LoadScripts(); - for (int a = 0; a < scriptItems.Length; a++) - { - scriptItems[a].Click += new EventHandler(ScriptItem_Clicked); - - //AddToolStripItemToStrip(scriptsDatabaseToolStripMenuItem, scriptItems[a]); - //SystemMenuList.DropDownItems.Add(systemItems[a]); - } - AddToolStripItemToStrip(scriptsDatabaseToolStripMenuItem, scriptItems); - SetPropertyThreadSafe(scriptsDatabaseToolStripMenuItem, true, "Enabled"); - SetPropertyThreadSafe(scriptsDatabaseToolStripMenuItem, true, "Visible"); - } - - public void ScriptItem_Clicked(object sender, EventArgs e) - { - // Scripts from database are stored in tooltips... - ToolStripMenuItem tsmi = (ToolStripMenuItem)sender; - string script_content = tsmi.ToolTipText; - script_content += String.Format(";{0}", tsmi.Text); - - BackgroundWorker scripter = new BackgroundWorker(); - scripter.DoWork += new DoWorkEventHandler(RunScriptBg); - scripter.RunWorkerAsync(script_content); - } - - void ReorganizePreviousFolderStructure(object sender, DoWorkEventArgs e) - { - // 0000000000000000v000\* become titles\0000000000000000\v000\* - Regex TitleDirectoryRegex = new Regex(@"[a-zA-Z0-9]{16}v?([0-9]*)?"); - - if (Directory.Exists(Path.Combine(CURRENT_DIR, "titles")) == false) - Directory.CreateDirectory(Path.Combine(CURRENT_DIR, "titles")); - - string[] directories = Directory.GetDirectories(CURRENT_DIR, "*", SearchOption.TopDirectoryOnly); - Debug.WriteLine("Dirs: " + directories.Length); - foreach (string directory in directories) - { - Debug.WriteLine("ff: " + directory); - DirectoryInfo dinfo = new DirectoryInfo(directory); - - // name is XXXXXXXXXXXXXXXXvYYYY - if (TitleDirectoryRegex.IsMatch(dinfo.Name.ToString()) && dinfo.Name.Contains("v")) - { - string[] title_info = dinfo.Name.Split('v'); - string titleid_dir = Path.Combine(Path.Combine(CURRENT_DIR, "titles"), title_info[0]); - string newfull_dir = Path.Combine(titleid_dir, String.Format("{0}", title_info[1])); - - if (Directory.Exists(titleid_dir) == false) - Directory.CreateDirectory(titleid_dir); - - if (Directory.Exists(newfull_dir) == false) - Directory.CreateDirectory(newfull_dir); - - string[] files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly); - foreach (string file in files) - { - FileInfo titlefile = new FileInfo(file); - if (File.Exists(Path.Combine(newfull_dir, titlefile.Name)) == false) - titlefile.MoveTo(Path.Combine(newfull_dir, titlefile.Name)); - } - - if (dinfo.GetFiles().Length <= 0 && dinfo.GetDirectories().Length <= 0) - Directory.Delete(directory); - - - } - else if (TitleDirectoryRegex.IsMatch(dinfo.Name.ToString())) - { - string titleid_dir = Path.Combine(Path.Combine(CURRENT_DIR, "titles"), dinfo.Name.ToString()); - - libWiiSharp.TMD tmdfile = new libWiiSharp.TMD(); - int count = 0; - - string[] tmdfiles = Directory.GetFiles(directory, "*tmd*", SearchOption.TopDirectoryOnly); - if (tmdfiles.Length > 1) - continue; //Too many TMD files ? - - foreach (string file in tmdfiles) - { - if (file.Contains("tmd")) - { - tmdfile.LoadFile(file); - count++; - } - } - if (count == 0) - continue; - - string version = tmdfile.TitleVersion.ToString(); - string newfull_dir = Path.Combine(titleid_dir, String.Format("{0}", version)); - - if (Directory.Exists(titleid_dir) == false) - Directory.CreateDirectory(titleid_dir); - - if (Directory.Exists(newfull_dir) == false) - Directory.CreateDirectory(newfull_dir); - - string[] files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly); - foreach (string file in files) - { - FileInfo titlefile = new FileInfo(file); - if (File.Exists(Path.Combine(newfull_dir, titlefile.Name)) == false) - titlefile.MoveTo(Path.Combine(newfull_dir, titlefile.Name)); - } - - if (dinfo.GetFiles().Length <= 0 && dinfo.GetDirectories().Length <= 0) - Directory.Delete(directory); - - } - } - - } - - void ReorganizePreviousFolderStructure_Completed(object sender, RunWorkerCompletedEventArgs e) - { - WriteStatus(" - Operation complete!"); - } - - private void RunScript(string scriptstr, string scriptname) - { - // Form and folder stuffs - SetTextThreadSafe(statusbox, ""); - WriteStatus("Starting script download. Please be patient!"); - string scriptdir; - if (scriptname == "random") - scriptdir = Path.Combine(Path.Combine(CURRENT_DIR, "scripts"), RandomString(7) + "_output"); - else - scriptdir = Path.Combine(Path.Combine(CURRENT_DIR, "scripts"), scriptname + "_output"); - - if (!File.Exists(scriptdir)) - Directory.CreateDirectory(scriptdir); - - // Parse entries - string[] NUS_Entries = scriptstr.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); - - WriteStatus(String.Format(" - Script loaded ({0} Titles)", NUS_Entries.Length)); - WriteStatus(" - Output: " + scriptdir.Replace(CURRENT_DIR, "")); - - for (int a = 0; a < NUS_Entries.Length; a++) - { - // Download the title - WriteStatus(String.Format("===== Running Download ({0}/{1}) =====", a + 1, NUS_Entries.Length)); - string[] title_info = NUS_Entries[a].Split(' '); - // don't let the delete issue reappear... - if (string.IsNullOrEmpty(title_info[0])) - continue; - - // WebClient configuration - WebClient nusWC = new WebClient(); - nusWC = ConfigureWithProxy(nusWC); - nusWC.Headers.Add("User-Agent", "wii libnup/1.0"); // Set UserAgent to Wii value - - // Create\Configure NusClient - libWiiSharp.NusClient nusClient = new libWiiSharp.NusClient(); - nusClient.ConfigureNusClient(nusWC); - nusClient.UseLocalFiles = localuse.Checked; - nusClient.ContinueWithoutTicket = true; - nusClient.Debug += new EventHandler(nusClient_Debug); - - libWiiSharp.StoreType[] storeTypes = new libWiiSharp.StoreType[1]; - // There's no harm in outputting everything i suppose - storeTypes[0] = libWiiSharp.StoreType.All; - - int title_version = int.Parse(title_info[1], System.Globalization.NumberStyles.HexNumber); - - string wadName = NameFromDatabase(title_info[0]); - if (wadName != null) - wadName = OfficialWADNaming(wadName); - else - wadName = title_info[0] + "-NUS-v" + title_version + ".wad"; - - nusClient.DownloadTitle(title_info[0], title_version.ToString(), scriptdir, wadName, storeTypes); - - } - WriteStatus("Script completed!"); - } - - // Random string function for temp foldernames in RunScript. - // Probably going to be removed TODO - private readonly Random _rng = new Random(); - private const string _chars = "abcdefghijklmnopqrstuvwxyz"; - - private string RandomString(int size) - { - char[] buffer = new char[size]; - - for (int i = 0; i < size; i++) - { - buffer[i] = _chars[_rng.Next(_chars.Length)]; - } - return new string(buffer); - - } - - void Form1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) - { - //Debug.WriteLine("Delta: " + e.Delta.ToString()); - - if (SystemMenuList.DropDown.DisplayRectangle.Contains(e.Location) || - SystemMenuList.DropDown.Bounds.Contains(e.Location) || - WiiWareMenuList.DropDown.DisplayRectangle.Contains(e.Location) || - WiiWareMenuList.DropDown.Bounds.Contains(e.Location) || - VCMenuList.DropDown.DisplayRectangle.Contains(e.Location) || - VCMenuList.DropDown.Bounds.Contains(e.Location) || - IOSMenuList.DropDown.DisplayRectangle.Contains(e.Location) || - IOSMenuList.DropDown.Bounds.Contains(e.Location)) - { - if (e.Delta > 0) - { - System.Windows.Forms.SendKeys.Send("{UP}"); - System.Windows.Forms.SendKeys.Send("{UP}"); - System.Windows.Forms.SendKeys.Send("{UP}"); - System.Windows.Forms.SendKeys.Send("{UP}"); - System.Windows.Forms.SendKeys.Send("{UP}"); - } - else - { - System.Windows.Forms.SendKeys.Send("{DOWN}"); - System.Windows.Forms.SendKeys.Send("{DOWN}"); - System.Windows.Forms.SendKeys.Send("{DOWN}"); - System.Windows.Forms.SendKeys.Send("{DOWN}"); - System.Windows.Forms.SendKeys.Send("{DOWN}"); - } - - } - } - - private void openNUSDDirectoryToolStripMenuItem_Click(object sender, EventArgs e) - { - // Opens the directory NUSD is working in... (CURREND_DIR) - Process.Start(CURRENT_DIR); - } - - private void mainPageToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("http://www.wiibrew.org/wiki/NUS_Downloader"); - } - - private void databasePageToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("http://www.wiibrew.org/wiki/NUS_Downloader/database"); - } - - private void extrasStrip_Opening(object sender, CancelEventArgs e) - { - // Show additional features based on held keys... - #if DEBUG - moreExtrasToolStripMenuItem.Visible = true; - #else - moreExtrasToolStripMenuItem.Visible = Control.ModifierKeys == Keys.Control; // If Ctrl Pressed. - #endif - } - - private void runFolderFixToolStripMenuItem_Click(object sender, EventArgs e) - { - // Run folderfix to make \titles\ - // Organizing folders from past NUSD releases... - BackgroundWorker folder_fixer = new BackgroundWorker(); - folder_fixer.DoWork += new DoWorkEventHandler(ReorganizePreviousFolderStructure); - folder_fixer.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ReorganizePreviousFolderStructure_Completed); - Debug.WriteLine("folderfix active"); - WriteStatus("Organizing your old folder structure..."); - folder_fixer.RunWorkerAsync(); - } - - private void removeNUSDFilesFoldersToolStripMenuItem_Click(object sender, EventArgs e) - { - // Extras thing, remove all of NUSD files... - if (MessageBox.Show("This will delete all the files\folders you have downloaded from NUS! Are you sure you want to do this?", "Wait a second!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != System.Windows.Forms.DialogResult.Yes) - return; - - if (Directory.Exists(Path.Combine(CURRENT_DIR, "titles"))) - Directory.Delete(Path.Combine(CURRENT_DIR, "titles"), true); - if (Directory.Exists(Path.Combine(CURRENT_DIR, "scripts"))) - Directory.Delete(Path.Combine(CURRENT_DIR, "scripts"), true); - - if (File.Exists(Path.Combine(CURRENT_DIR, "database.xml"))) - File.Delete(Path.Combine(CURRENT_DIR, "database.xml")); - if (File.Exists(Path.Combine(CURRENT_DIR, "dsidatabase.xml"))) - File.Delete(Path.Combine(CURRENT_DIR, "dsidatabase.xml")); - if (File.Exists(Path.Combine(CURRENT_DIR, "olddatabase.xml"))) - File.Delete(Path.Combine(CURRENT_DIR, "olddatabase.xml")); - - if (File.Exists(Path.Combine(CURRENT_DIR, "proxy.txt"))) - File.Delete(Path.Combine(CURRENT_DIR, "proxy.txt")); - - if (File.Exists(Path.Combine(CURRENT_DIR, "key.bin"))) - File.Delete(Path.Combine(CURRENT_DIR, "key.bin")); - if (File.Exists(Path.Combine(CURRENT_DIR, "kkey.bin"))) - File.Delete(Path.Combine(CURRENT_DIR, "kkey.bin")); - if (File.Exists(Path.Combine(CURRENT_DIR, "dsikey.bin"))) - File.Delete(Path.Combine(CURRENT_DIR, "dsikey.bin")); - } - - private void anyStrip_Closed(object sender, ToolStripDropDownClosedEventArgs e) - { - ((ContextMenuStrip)sender).Text = "Hidden"; - //Debug.Write(((ContextMenuStrip)sender).Name); - } - - private void localTicketInventoryToolStripMenuItem_Click(object sender, EventArgs e) - { - // Alters icons if tickets exist locally... - WriteStatus("Adding ticket information to database entries..."); - ToolStripMenuItem[] Lists = new ToolStripMenuItem[6] { SystemMenuList, IOSMenuList, VCMenuList, WiiWareMenuList, dsiSystemToolStripMenu, dSiWareToolStripMenu }; - - for (int l = 0; l < Lists.Length; l++) - { - for (int a = 0; a < Lists[l].DropDownItems.Count; a++) - { - if (Lists[l].DropDownItems[a].Text.Length < 16) - continue; - - string itemTitleId = Lists[l].DropDownItems[a].Text.Substring(0, 16); - string itemDir = Path.Combine(Path.Combine(CURRENT_DIR, "titles"), itemTitleId); - - if (Directory.Exists(itemDir) == false) - continue; - - string[] files = Directory.GetFiles(itemDir, "cetk", SearchOption.AllDirectories); - if (files.Length > 0) - { - if (Lists[l].DropDownItems[a].Image == Database.green) - Lists[l].DropDownItems[a].Image = Database.green_blue; - if (Lists[l].DropDownItems[a].Image == Database.orange) - Lists[l].DropDownItems[a].Image = Database.orange_blue; - if (Lists[l].DropDownItems[a].Image == Database.redorange) - Lists[l].DropDownItems[a].Image = Database.redorange_blue; - if (Lists[l].DropDownItems[a].Image == Database.redgreen) - Lists[l].DropDownItems[a].Image = Database.redgreen_blue; - } - } - } - WriteStatus(" - Operation completed!"); - } - - private void donateToolStripMenuItem_Click(object sender, EventArgs e) - { - //TODO: Organize how this will work... - Process.Start("http://wb3000.atspace.name/donations.html"); - } - - private void DSiDatabaseWork(object sender, System.ComponentModel.DoWorkEventArgs e) - { - while (databaseWorker.IsBusy) - { - Thread.Sleep(1000); - } - BackgroundWorker worker = sender as BackgroundWorker; - FillDSiDatabaseStrip(worker); - LoadRegionCodes(); - //FillDatabaseScripts(); - ShowInnerToolTips(false); - } - - private void DSiDatabaseWork_Completed(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) - { - this.databaseButton.Text = "Database..."; - this.databaseButton.Image = null; - } - - private void DSiDatabaseWork_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) - { - if (e.ProgressPercentage == 50) - databaseButton.Text = " [. ]"; - else if (e.ProgressPercentage == 100) - databaseButton.Text = " [..]"; - } - - private void wiiRegionCodesMenu_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - if (titleidbox.Text.Length == 16) - titleidbox.Text = titleidbox.Text.Substring(0, 14) + e.ClickedItem.Text.Substring(0, 2); - } - - private void dsiRegionCodesMenu_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - if (titleidbox.Text.Length == 16) - titleidbox.Text = titleidbox.Text.Substring(0, 14) + e.ClickedItem.Text.Substring(0, 2); - } - - private void serverLbl_MouseEnter(object sender, EventArgs e) - { - serverLbl.Font = new Font(serverLbl.Font, FontStyle.Underline); - } - - private void serverLbl_MouseLeave(object sender, EventArgs e) - { - serverLbl.Font = new Font(serverLbl.Font, FontStyle.Regular); - } - - private void serverLbl_TextChanged(object sender, EventArgs e) - { - if (serverLbl.Text == "Wii") - { - // Can pack WADs / Decrypt - packbox.Enabled = true; - } - if (serverLbl.Text == "DSi") - { - // Cannot Pack WADs - packbox.Checked = false; - packbox.Enabled = false; - wadnamebox.Enabled = false; - wadnamebox.Text = ""; - } - } - - private void serverLbl_Click(object sender, EventArgs e) - { - // Switch what server is displayed in the label, when clicked. - string[] serverLblServers = new string[2] { "Wii", "DSi" }; - - for (int a = 0; a < serverLblServers.Length; a++) - { - if (serverLbl.Text == serverLblServers[a]) - { - if (serverLblServers.Length == (a + 1)) - serverLbl.Text = serverLblServers[0]; - else - serverLbl.Text = serverLblServers[a+1]; - break; - } - } - } - } -} \ No newline at end of file diff --git a/NUS Downloader/Form1.resx b/NUS Downloader/Form1.resx deleted file mode 100644 index af6baad..0000000 --- a/NUS Downloader/Form1.resx +++ /dev/null @@ -1,2080 +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 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH - DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp - bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE - sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs - AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4 - JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR - 3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd - li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF - ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX - wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF - hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55 - 4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ - VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB - 5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC - qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE - j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I - 1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9 - rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG - fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp - B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ - yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC - YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln - yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v - vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp - vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L - Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA - bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z - llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW - ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s - xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6 - eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw - YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR - XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm - WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl - xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2 - dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8 - V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za - Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v - Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb - PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/ - 0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h - /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr - XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS - fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ - tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDgAACw4BQL7hQQAAAthJREFUOE99k8tTUmEY - xrV7OTXTTDXTtHHa5qrpL2jTwl2LNq1ata6mvTMtNG+liBMKqOAl5HoQjuIBJBLxqKijoIhCUgtTAUUQ - uRx4eo+TjqbT4jfzXd7n+d7v/d6vDEDZOdyitRvExUwmW35wkCkXx385FX+e+AIFviK04ciqYcLr6eMc - bvWYy62itXfEzZMHnjGIxePXKOBDcje/OTvLCOyaU2gzuArdXepcNPprifZe/NdgORi6SwEdkbXw3qI/ - iNbJn5CqjRjlvsHhdKeLxaKR9quOTM5kkE7vV2Wz2eFZfirnWdlA/egitPoheCbnoDeypVAo/JvETcR9 - 0eS8GlRvbW0vTHv5oi6whboBDiM2Bzz8LFibC1aWEzKZzBqJ3xIVpwwCgeAVWnyzuhLa5qfmoZzbQFOX - DsMsB/uYB27PFAa0JgSWglmgJF6l8pTB9nbsXjaX63E7XVlvIIoGzg+FWgujiQVj5TDu9cFgtsFmH8sV - CoVeMrhzbMA5XOX7+5knsVjcx0/wJUdkDzV9Nhh0DNXAAo1uCA7XBExDo+CnfXEq5nuxL44NeH76uiAU - Xgf8gc2llQh6/TE0qxhYzOyheGCQAWPhoDNaEfmxHibxs1NFXP8RrdxLp9Q9PX059/gMtHYvlOrBw/T1 - phFiGP0aBppBUzGxs8uT+OGxwTBrv0SpV/v9ywsSqbLEWBwY6Nej+VMbJFIF2mU96CYzmaIPFuuoQM8s - FrDi2ICzOx8IglBrZe0JVb8RZquT0rZC+kUJubIXMrmKxgp8bJRgxjeXI6GEEFu+rCyRSFxOJpNPaTIy - P7+YJEFeJlcXG5vbUVvfgs8SGVqlnZRFN+oaWvB93JsSn/pkJ96mSTXRQGjTqbR7YTEQMltGYkajJatS - fxXo9KKkXS5IpB3C6lpkk+Ke/9vKYjpXCfEfPCZeEjVEZz6f1+zsJvWELpVKMSiVxF/56MjgD6JaHPCi - 71CQAAAAAElFTkSuQmCC - - - - - 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 - 0v9nptL/Z6bS/2am0f9mptH/Y6PQ/3q34P9srNr9SXWSPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGCV - upBoq9r/Y6TU/2Ci0/9fotT/YKLU/16i0/9dodP/XKDT/1yh0v9codL/XKHS/1yh0v9codL/WZ7R/3Oy - 3f9tr93/THqVTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGYvJpkp9j/W5rK/1CTxP9Rk8X/UZPF/1GT - xf9Qk8X/UJPF/1CSxP9QksT/UJLE/1CSxP9Qk8T/TpDC/2+u2v9prNr/V4WlXgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAWadwaVcoNH/To6//z6Dtf8/g7X/P4O1/z+Dtf8/g7X/QIS3/0GEt/9Bhbf/QIS3/0CE - t/8/g7b/PIC0/2ip1f9hpNL/Xo6sbwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmmgw69dotX/XKDR/1+k - 1f9hptj/YabY/2Km2P9iptj/YqbY/2Om2f9jptj/YqbY/2On2f9kp9n/X6HR/2Gk1/9ipdf/apu5fwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAniszKp+tdn/dqvM/3eryv98sM7/frHP/3+yz/+Ass//fa7K/4Cx - zP9+sc//e7DP/3uvz/96r8//eK3N/3qy1P9/uNv/dqnFfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHWo - x2R0qsz/OW+U/zBlh/8xZoj/MmeI/zJmiP8xZIH/eaSo/09+jv8xY4P/M2eI/zJniP8yZ4j/MWWH/0J6 - ov96r8/5cKK9QgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGeeuiV6sNHjQnme/zNqjv8zao7/M2qO/zJs - h/9vq6T/uu/S/67kyv9LiJH/MWmJ/zNqjv8zao7/MmmN/0uFqv+BtNTKbJ26GgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAEl/pA55r9KpWI+w/0Z/oP9Gf6D/Q4OY/1a3l/+H56//ne6+/5XtuP9z2qT/SJ2V/0V+ - nf9Gf6D/RX2e/22jw/1+stWMKn9/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFmoMpueKvH+Gae - uf9anqr/OcWE/0bggv9i5pT/cuif/23nm/9V5Iv/Ndp8/0Cwkf9hmrT/Ypm1/4q72O5fmcROAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYk8Qad63Ndlmhn7wwxHj6Idpp/zngef9P44f/WeWO/1Dj - iP824Hj/FNtj/wvSXf84toPpaqOyn3q12GgqaqoMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAGAGIYaxyqSuRH0nP/VduA/1bfhv9a4ov/XeSO/1zjjf9W4Yj/S9x9/zrUbf8iw1j7BY8xvQA5 - BTEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwATPrFY037Vk/+F25v/bNmL/2zc - jv9s3pD/bOCS/2zgkv9s3o//a9qM/3fakv+B2Jb/a8yC/heKMYMAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAJwANW6djvnS7guJzv4XjUMRv+oHbmP+B3Zr/gd2b/4Hdmv+B3Jn/e9iS/0+7 - bO50vYTidLiA4jSHOHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGnsaHSWD - LCkfayQyQrBY15bbpP+W3KX/lt2m/5bdpf+W3KT/j9id/waLIn8lgywpJXwlKQBqAAwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKTK1Zz6rdsP+q3rH/qt6y/6re - sf+q3bH/odmo/wB8FGcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAKVqtaz77hwP++4cH/vuLB/77iwf++4cD/tdy3/wByBWcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJWKRZzrrZ - uv+62bv/utm7/7rZu/+62br/sdSx/wNoA2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAUTphOvXStdN10rXTddK103XStdN10rXTdZqVmwgZh - BioAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wDwAA8A8AAPAPAADwDwAA8A4AAPAOAA - DwDgAA8A4AAPAOAADwDgAA8A8AAPAPAADwDwAA8A+AAfAPwAPwD8AD8A+AAfAPgAPwD/Af8A/wH/AP8B - /wD/Af8A/wH/ACgAAAAgAAAAQAAAAAEAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABwAAACoAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAA - ADMAAAAzAAAAMwAAADMAAAAzAAAAMwAAADMAAAAzAAAAMgAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAANIi8mQHut11OMuOFSi7bhU4y44VOOuOFVj7jhW5K64VuRuuFYkbrhV5C54VSO - ueFUjrnhVI654VSOueFVjrnhVY654VWOueFVjrnhVIy24VWPueFPibXhLWCLjQAAAAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAACNOcDtpq9n/cLDa/4G62/+FvuH/iMLk/4jC5P+IwuT/iMLl/5DH - 5/+Pxub/jsbm/47G5v+Oxub/ksno/43G5v+Nxeb/jcXm/4vE5v+Budn/fbng/3Sz3P9TkL7BAAAACAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKVZ0RG2u2/90r9T/g7zg/4jB4/+IweP/iMHj/4jB - 4/+IweP/iMHj/4jB4/+IweP/iMHj/4jB4/+IweP/iMHj/4jB4/+IweP/iMHj/4S+4f+JwuT/b63S/1ua - xcwAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1YIRNdLPe/3u44P95td7/e7jg/3u5 - 4P97ueD/e7ng/3u54P97ueD/e7ng/3u54P97ueD/e7ng/3u54P97ueD/e7ng/3u54P97ueD/drXe/4bA - 4/92td7/YZ/K2QAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEN0l1htrtz/frvh/26q - 0/9rp9H/bKjR/2yo0f9sqNH/bKjR/2yo0f9sqNH/bKjR/2yo0f9sqNH/bKjR/2yo0f9tqdL/banS/2yo - 0f9opdD/g77i/3Gx3P9mpc/mAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS3qcYmyt - 3P96uOD/bKzZ/2ut2/9rrdz/a63c/2ut3P9rrdz/bK3c/26w3f9wsd3/cLDd/2+w3f9wsd3/cLHd/26v - 3P9tr9z/a63c/2iq2f+AvOL/ba7a/2mp1PEAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABVhKVsaKva/3Oz3v9ppdL/ZKPP/2Wkz/9lpM//ZaTP/2Wkz/9lpM//ZaTP/2Wkz/9lpM//ZaTP/2Wk - z/9lpM//ZaTP/2Wkz/9lpM//YqHN/3y44P9srdv/ba3Z+wAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAV2NrXlkqNj/ba7c/2Kj1P9ipdb/YaXW/2Gl1/9ipdf/YKTW/2Ck1v9eo9b/XaLV/12j - 1f9do9X/XaPV/12j1f9do9X/XaPV/12j1f9an9P/drTd/2ut3P9wsd3/HCkwJQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABYZKwgWOn2P9oqtj/XpvI/1eVw/9XlcT/V5XE/1eVxP9XlcT/V5XE/1eV - xP9XlcT/V5XE/1eVxP9XlcT/V5XE/1eVxP9XlcT/V5XE/1STwv9yr9r/aKva/2+w3P81UmU1AAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJllrSLYKXY/2Sn1/9Tk8b/SpDE/0uRxf9LkcX/S5HF/0uR - xv9Lkcb/SpHF/0qQxf9Jj8P/SY/D/0mPw/9Jj8P/SY/D/0qQxP9KkMT/R4zB/3Gv2v9iptf/bK7b/05v - gUUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmydvJVantH/XZ/O/0mIuf88gLL/PYCy/z2A - sv89gLL/PYCy/z2Asv89gLL/PoK0/z+Ctf9Ag7X/P4K1/z+Ctf8+grX/PoC0/z2As/86fbH/aqrW/1ia - x/9oq9r/XIGTUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbZ++nVmg1f9UmtH/VJnM/1ed - 0f9ZoNX/WaDV/1mg1f9aoNX/WqDV/1ug1f9boNX/XKHW/1yh1v9dodb/XaLW/16j1/9fo9f/X6PX/1ia - y/9boNT/WZ3S/2Km2P9tlKZiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARyo8CmerXc/4W/ - 4/+EvuH/hcDi/4bB4/+GweP/hsHk/4fB5P+HweT/h8Hk/4bA4/+GwOP/hsDj/3y64f99u+L/fbvi/327 - 4v9+u+L/fbnf/3+84/99uuH/crDZ/2+Yr3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXut - yo2JweP/b6C//2eWtf9olbH/cZ+5/3Whuv92orv/eKO7/3iju/96pLv/dJuv/3mhtf98pbz/e6W8/3ql - vP95pLz/eKS8/3SivP9yoLr/dKbE/4Cwzf+OxeX/d6S+WgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAW4mkOI/G5/9Viq7/KGCH/yVbfv8lW37/JVt+/yVbfv8lW37/JFl7/yNXcP+MtbL/T36K/yBS - c/8lWn7/JVt+/yVbfv8lW37/JVt+/yRZfP8uaZT/ap29/4a/4O8qOUcSAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAHfbbZ1neqyf80bJL/MWiM/zFojP8xaIz/MWiM/y5khv8wan//oNXC/8P0 - 2P/B8db/WJWX/ytff/8vZon/MWiM/zFojP8xaIz/MGaK/zt2nv+Ju9f/c6rMogAAAAIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhnMODibza/0J7n/8/d5n/P3eZ/z53mP88c5T/O3+N/4bb - sv+h78D/r/DK/6bvxP+X7br/V6ma/zpykv89dZb/P3eZ/z93mf89dZf/U42v/5TH5v9RhapFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFhhiqEvN/+WpCu/06Hp/9Oh6f/Toem/0iT - mP9j3Jr/ceie/4bqrf+Q7LT/iuuw/3joo/9m5pn/TraV/0yHo/9Oh6b/Toen/0yEpP9/sMv/dbHW3wAA - AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmSizsuCscr/a6K8/2ui - vP9No5n/Mdh6/zzge/9V44v/ZuaX/27nnP9q5pn/W+SP/0TigP8s33X/N72G/2Gdsv9on7v/Zp24/5LC - 3f9ZlsCKAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXJfHQIK6 - 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 - AB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAdAAAAEgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChIvQUcdQF+DHUBdjB1AXYwdQF2MHUBdjB1A - XYwdQF2MHUBdjB1AXYwdQF2MHUBdjB1AXYwdQF2MHUBdjB1AXYwdQF2MHUBdjB1AXYwdQF2MHUBdjB1A - XYwdQF2MHUBdjB1AXYwdQF2MHUBdjB1AXYwdQF2MHUBdjB1AXYweQV+JFTNLXwAAABYAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBgkFTJrn51Xlsj0aafS9mmn - 0vZlpM32aafQ9mmn0vZpqNL2aqjS9nGt0/Z1r9T2dK7U9nOu1PZxrdT2ca3U9m2q0/ZrqNL2a6jS9mup - 0vZrqdL2a6nS9mup0vZsqdL2bKnS9myp0vZsqdL2banS9m2p0vZppc72banS9m2q0vZfncv1P3+21xg6 - VzUAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEy9MG06N - urNsq9j/ba3Y/3q53/9tp8n/eLTY/3684f9/vOL/f7zi/3+84v9/vOL/f7zi/4S/4/+Oxub/isLk/4rC - 5P+JwuT/icLk/4nC5P+Jw+T/j8fn/4zF5v+HwuT/hsLk/4bB5P+GweT/hcDk/4G94/9pocH/f7zi/3Ox - 2v9zsdv/XaDP6idVeEgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAGjVGHVGPurZzs93/bqvS/4S94f+Rx+X/lMnn/5XJ5/+Vyuf/lcrn/5XK5/+Vyuf/lcrn/5XK - 5/+Vyuf/lcrn/5XK5/+Vyuf/lcrn/5XK5/+Vyuf/lcrn/5XK5/+Vyuf/lcrn/5XK5/+Vyuf/lcrn/5bK - 5/+Tyeb/j8bl/3Ox2f91s9n/ZKXT7S9ehFEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAHjxSIlaSwL5ystz/aKXK/4S+4v94td3/f7zg/4C84f+AveH/gLzh/4C8 - 4f+AveH/gLzh/4C84f+AveH/gLzh/4C84f+AveH/gLzh/4C84f+AveH/gLzh/4C84f+AveH/gLzh/4C8 - 4f+AveH/gLzh/4C84f95tt7/k8nn/3Sz2f9wrdL/aqvW7zhqklsAAAADAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI0BcJFmWwsJ8uN//drXe/4G84f9ysdz/ebjf/3q4 - 4P96uOD/erjg/3q44P96uOD/erjg/3q44P96uOD/erjg/3q44P96uOD/erjg/3q44P96uOD/erjg/3q4 - 4P96uOD/erjg/3q44P96uOD/erjg/3q44P9zstz/kcjn/3e23/94tt//bKvV8j1wlmQAAAAFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkZZKFyYxcd0tN//e7jg/3+5 - 3/9sp9D/cavS/3Ks0/9yrNP/cqzT/3Ks0/9yrNP/cqzT/3Ks0/9yrNP/cqzT/3Ks0/9yrNP/cqzT/3Ks - 0/9yrNP/cqzT/3Ks0/9yrNP/cqzT/3Ks0/9yrNP/cqzT/3Ks0/9rp9D/j8bl/3W03v9zs93/bq7Y9UR4 - n3AAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALktiLGCd - yM5ur9z/fbrh/3y43/9oqNb/bq3Z/2+u2f9vrtn/b67Z/2+u2f9vrtn/b67Z/2+u2f9vrtn/b67Z/2+u - 2f9vrtn/b67Z/2+u2f9vrtn/b67Z/2+u2f9vrtn/cK/a/3Ox2v9xr9r/b67Z/2+u2f9pqNb/jMXl/3Oz - 3f9ur9r/cK/Z+E2CqHsAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAK0xiL2GdyNJtrtz/erjg/3q23/9mp9f/bK3b/2yu3P9srtz/bK7c/2yu3P9srtz/bK7c/2yu - 3P9urtz/cbLe/3Ky3v92td//dbTf/3Ky3f9zs97/dbTf/3S03/90tN//cbHd/3Gx3f9usNz/bK7c/2yu - 3P9mqdj/isPl/3Ky3f9qq9j/bq7Z+lKHq4IAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAANVJqNWWjzttrrdv/drbf/3m13v9qqNT/bqzX/2+t1/9vrdf/b63X/2+t - 1/9vrdf/b63X/2+t1/9vrdf/b63X/2+t1/9vrdf/b63X/2+t1/9vrdf/b63X/2+t1/9vrdf/b63X/2+t - 1/9vrdf/b63X/2+t1/9qqNT/iMHk/2+w3f9qq9n/ba7c/FaMso4AAAALAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABM1NrN2Wkzt1mqdj/ba/c/3Sx2/9Ymcr/WpzM/1ud - zf9bnc3/W53N/1udzf9bnc3/W53N/1udzf9bnc3/W53N/1udzf9bnc3/W53N/1udzf9bnc3/W53N/1ud - zf9bnc3/W53N/1udzf9bnc3/W53N/1udzf9XmMn/hb7j/22u3P9srdv/bK3a/16TuJgAAAANAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO1htPWin0eZjptf/aavb/3Ox - 3P9bn9P/YqbX/2Wo2P9kqNj/ZajY/2eq2f9mqdn/ZKfY/2Km1/9iptf/YaXX/1+k1/9fpNf/X6TX/1+k - 1/9fpNf/X6TX/1+k1/9fpNf/X6TX/1+k1/9fpNf/X6TX/1+k1/9antP/gr3h/2mr2v9srtz/bq/d/2GW - up4AAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACO1pqQWin - 0upkqNj/Y6bW/3Cv2v9Vmc7/W57R/1md0f9YndH/WJ3R/1id0f9YndH/WJ3R/1id0f9YndH/WJ3R/1id - 0f9YndH/WJ3R/1id0f9YndH/WJ3R/1id0f9YndH/WJ3R/1id0f9YndH/WJ3R/1id0f9TmM3/f7rf/2ap - 2P9qrNv/bK7b/2ScvqoXLjoWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAACO1xvRWqp1PBiptj/X6PU/2+s1v9Xkb3/V5K9/1iSvf9Xkr3/V5K9/1iSvf9Xkr3/V5K9/1iS - vf9Xkr3/V5K9/1iSvf9Xkr3/V5K9/1iSvf9Xkr3/V5K9/1iSvf9Xkr3/V5K9/1iSvf9Xkr3/V5K9/1iS - vf9Uj7v/fLfc/2Sn2P9oqtr/aqzb/2mgw7QkQEkcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAADP15wSWur1vVhptj/XaHU/2qp1v9JjML/SpDE/0uRxf9LkcX/S5HF/0uR - xf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9KkcX/SpDF/0qQxf9KkMX/SpDF/0qQxf9KkMX/SpDF/0qQ - xf9KkcX/SpHF/0qQxf9Hi8H/erXc/2Om1/9lqdj/aKva/2igw7swSFAgAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADP11wTW2t2fheotb/XKDT/2Wk0v9Dhrv/RIm9/0aM - v/9Gi77/RYy+/0aMv/9Gi77/Rou//0aLv/9Fi7//RYu//0aMv/9GjMD/Rou//0eMwP9GjMD/RYu//0aM - wP9GjMD/RovA/0WLv/9Gi7//Roq//0SJvv9AhLr/d7LZ/1+j1f9iptb/ZqrZ/2ukx8Q2UF4mAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEP15xUW6u2/9VmMn/UZHA/2Gg - zf87e67/OXyu/zp8rv86fK7/Onyu/zp8rv86fK7/Onyu/zp8rv86fK7/Onyu/zp8rv87fK//O32v/zt9 - r/87fa//O3yv/zt9r/87fa//O32v/zp8r/86fK//Onyv/zp8rv82d6z/banR/1aYxv9Ym8n/ZKfZ/22m - zMxBWWUrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQWJ0Vm6v - 3P9aodX/WJ7T/1Wa0f9YndH/WJ7S/1if1P9Yn9T/WJ/U/1if1P9Yn9T/Wp/U/1mf1P9Zn9X/Wp/V/1ug - 1f9boNX/XaLW/12i1v9dotb/XaLW/16j1/9eo9f/X6PX/1+j1/9fpNf/YKTX/1+i1v9doNP/XKDU/1ic - 0f9eotb/YaXY/22nzdNFYGowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAHVXqOZmus2f9Rl87/UpjP/1ie0/9Pk8T/VZrN/1mh1f9ZodX/WaHV/1qh1f9aodX/WqHV/1qh - 1f9bodb/W6HW/1uh1f9aoNX/WqDV/1qg1f9aoNX/WqDV/1qg1f9aoNX/W6HW/1uh1v9codb/XKHW/1md - 0P9Ulsb/XqLW/1qf1P9VmdD/V5vR/3Gr0t1KZnQ3AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAGWH2TaIe+3v+f0uv/o9bt/6PW7f+j1uz/o9bt/6TX7f+k1+3/pNft/6TX - 7f+k1+7/pdfu/6XX7v+l1+7/pdfu/6XX7v+k1+3/pNbt/6TW7f+k1+3/ls3q/5PL6f+Vzer/lc3q/5XN - 6v+Vzer/ls3q/5XN6v+Vzen/ls7r/5fO6/+WzOr/i8Tk/3yx0uRIZ3k5AAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZY6jVoW+4v2Gv+L/lsPc/5TA2/+Vv9f/mMHY/5rE - 2v+ex9z/oMfc/6LI3f+jyd3/pcrd/6XL3v+nzN//qc3f/6jN3v+kyNj/qszc/6zP3/+rz+D/q8/g/6rO - 4P+pzt//qM3f/6fN3/+lzOD/n8rf/57I3/+cx93/nMjg/5rH4P+dyuT/i8Pj/4i9299ef5AuAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUXqRLIe+3duTyOf/UYWo/yhj - jv8gVHn/IFV5/yNYe/8qXoD/K1+A/ytfgP8rX4D/K1+A/ytfgP8rX4D/KFt8/yZYcv86bHn/JVdt/yZY - d/8qXn//K1+A/ytfgP8rX4D/K1+A/ytfgP8rX4D/K1+A/ytfgP8pXH7/MmyV/zJslP93p8T/j8Xl/4S5 - 1q5Mc38UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPFppEXiu - 0KWVy+j/eKnG/zBrlv8nXIH/J12B/yddgf8nXYH/J12B/yddgf8nXYH/J12B/yddgP8jV3j/IlVw/2yf - nv/O5t//mcC9/yhccv8hU3P/JVt//yddgf8nXYH/J12B/yddgf8nXYH/J12B/yddgf8lWn7/MGyW/zRv - mf+Ww9z/hr/g93aox3IAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAA2ecu2qNw+T1j7/a/z54n/8uZIn/L2aK/y9miv8vZor/L2aK/y9miv8vZor/LmWI/ypf - gP8rYnv/YqKb/8rz3f/C9Nf/xvPa/4vAtf8xan7/KFt7/yxihf8vZon/L2aK/y9miv8vZor/L2aK/y9m - iv8sYob/OHOb/1WLrv+UxuL/frjb5VKCmjUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEp1lTB2s9nikMTi/1qQsf83bpH/OHCT/zhwk/84cJP/OHCT/zhv - kv82bY//M2mK/zV1hv9ut6X/svHN/7fyz/+88tP/tvLP/67wyv+Ax7D/On2J/zJoiP80a4z/N2+R/zhw - k/84cJP/OHCT/zhwk/82a47/Qn6j/26iwf+RxuX/bajOswAVFQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFwtmo8uygrve/3Glw/8/eJr/QXqb/0F6 - m/9Bepv/QHqb/z93mP8+dpb/PX2R/2jBof+Q6rb/me26/6Xvw/+r8Mf/pe/D/5jtuf+M67L/f9aw/z+L - kP89dZX/PnaW/0B5mf9Bepv/QXqb/0F6m/8+dpf/T4qs/4K00v+Lw+X/SHuiVQAAAAMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/dZ1Zerbd/4Cy - z/9Lg6P/S4Sk/0uEpP9LhKT/S4Sj/0qEov9Hipr/VseS/3XppP956aP/h+uu/5Hstf+W7bj/key1/4fr - rv946KP/a+ec/2PUnv9HlZn/SYSh/0qEo/9LhKP/S4Sk/0uEpP9If5//YJm4/5TE4P9vrdXgAAAAEQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAALFSoYZ6bS4Ia41v9bka7/V5Ct/1eQrf9XkK3/VpCs/0ubmv9FyYn/UuSN/1bkjP9n5pj/dOig/3zp - pv9/6qj/fOmm/3PooP9n5pf/VuSM/0rjh/9F04r/RqGV/1SQqf9XkK3/V5Ct/1eQrf9Ti6j/eazH/5HE - 5P9SjLaFAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAHSYi7koq+3v96rcX/dqvD/3Wrw/91q8P/VKSc/y/Lev8l3XD/Mt91/0Th - gP9T44r/X+WS/2bmlv9o55j/ZeaX/1/kkf9T44r/ROGA/zHfdf8e3mv/JtR4/0eulv9spb3/cafC/3Cn - wv9to7//mMPb/3ez2u5BcJM7AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARIKsMXWy2sqMxOTbi8Hf4YO81O9gu6z+Gspp/w3Z - Yf8Q22L/Jd1t/zbgd/9E4n//TuOG/1Pjiv9V5Iv/UeOJ/0rihP8+4Hz/Lt9z/xvdaP8G2l3/AddZ/xTQ - af9SvqP/grzS8om/3eOMwuPciMHi2W+r05g2a5QTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATdtfw4qQ08qFTArXwt/ - QMALwlv7JtRn/zbZcf883Xf/QuF9/0zihP9V44r/XOWP/1/lkf9f5ZH/W+WO/1Ljif9G4oH/M+B2/xzc - aP8I11v/ANJS/wHOUP8FyFj/DZNQ1RRCLHQqOUkxUXSLFlV/fwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA - ABkAAwBRAHEdyAW7Tfs0zmf/Ttd5/0/ZfP9P3H//T9+C/1Dhhf9T4oj/VuSL/1rljf9b5Y7/WuSN/1fj - i/9T44j/T+GE/0vfgP9G23v/NdVs/xPMVf8BxkX/AL9H/gCPNNYAIAVnAAAAIQAAAAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAACQAkA04AdBfSCr1N/zzJY/9a0nv/W9Z//1vYgv9b24T/W92G/1vfiP9b4Yr/W+KL/1vi - i/9b4oz/W+KM/1vii/9b4Yr/W9+I/1vdh/9b24T/W9iB/1rWfv9Fzm3/GsJM/wa5Q/8AhSLiACwFaAAA - ABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAA8AEQB7HJkTsUL9S8Zo/2XQf/9m0oL/ZtWF/2bYh/9m2on/ZtyL/2bd - jP9m343/Zt+P/2bgj/9m4ZD/ZuCP/2bgj/9m3o7/Zt6M/2bci/9m2on/ZtiH/2bVhf9m04L/Y899/0fE - Zf8bt0f/AIwh0QAVACUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAFC6WQaWK1Jf/pd+x/6bhsv+m4rT/peO1/4Lc - mv9s14r/ctuQ/3Lckf9y3ZL/ct6T/3LelP9y35T/ct6U/3Lek/9y3ZL/ctyR/3Lbj/9u2Iz/b9eL/6Pj - s/+m4rT/puGy/6XfsP+b2qb/Oa5Q4gApACwAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAED6MRqCBwYv/i8mX/4vK - mf+LzJv/i86c/1vHe/9i0YD/e9mV/3vblv973Jf/e92Y/3vdmP973Zj/e92Y/3vdmP973Jf/e9uW/3va - lf9w1Yr/PcNk/4vOnf+LzJv/i8qZ/4vJl/+LxpX/RZtM4AAqACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMABSZ/ - K2pGmk7NSp1V0kqgV9JKoVjSSqNb0yqkR+pmzH//htma/4bbm/+G3Jz/htyd/4bdnf+G3Z7/ht2d/4bc - nf+G3Jz/htub/4bZmv961Y//GqxA8kihWtVKoVjSSqBW0kqdVdJKnFPRKoUunwA3AA4AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - OHY4iDh2OIc4dziIOHYugy5vAGUAKwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD/AAAAAf8AAP4AAAAA/wAA/gAAAAD/ - AAD+AAAAAP8AAP4AAAAA/wAA/gAAAAD/AAD+AAAAAP8AAP4AAAAA/wAA/gAAAAB/AAD+AAAAAH8AAP4A - AAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/ - AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4AAAAA/wAA/wAAAAD/AAD/AAAAAP8AAP8A - AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAD/wAA/8AAAAP/AAD/+AAAP/8AAP/wAAAf/wAA/+AAAA// - AAD/wAAAB/8AAP/AAAAH/wAA/8AAAAf/AAD/4AAAB/8AAP//AAH//wAA//8AAf//AAD//wAB//8AAP// - AAH//wAA//8AAf//AAD//wAB//8AAP//AAH//wAA//8AAf//AAD//4AB//8AAP///////wAAKAAAAEAA - AACAAAAAAQAgAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAQAAAANAAAAEwAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA - ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA - ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA - ABMAAAANAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAXAAAAOQAAAE8AAABTAAAAUwAAAFMAAABTAAAAUwAA - AFMAAABTAAAAUwAAAFMAAABTAAAAUwAAAFMAAABTAAAAUwAAAFMAAABTAAAAUwAAAFMAAABTAAAAUwAA - AFMAAABTAAAAUwAAAFMAAABTAAAAUwAAAFMAAABTAAAAUwAAAFMAAABTAAAAUwAAAFMAAABTAAAAUwAA - AFMAAABTAAAAUwAAAFMAAABPAAAAOQAAABgAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICg8PMiJQdpwqXYfAKluFwypb - hcMqW4XDKluFwypbhcMqW4XDKluFwypbhcMqW4XDKluFwypbhcMqW4XDKluFwypbhcMqW4XDKluFwypb - hcMqW4XDKluFwypbhcMqW4XDKluFwypbhcMqW4XDKluFwypbhcMqW4XDKluFwypbhcMqW4XDKluFwypb - hcMqW4XDKluFwypbhcMqW4XDKluFwypbhcMqW4XDKl2HwCFKcJsAAAAzAAAACQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACxU3 - U1NAhcP/ZKXV/3Oz3v9zs97/c7Pe/2+v2P9ystz/c7Pe/3Oz3v9ztN7/c7Te/3i33/+BvOH/gbzh/4C7 - 4f9/u+H/frrh/3y64f98uuH/erjg/3W03/91tN//dbTf/3W13/91td//dbXf/3W13/91td//drXf/3a1 - 3/92td//drXf/3a13/92td//d7Xf/3e13/93td//crDY/3e13/93tt//d7bf/2Ok0/9Gisb/IUxtZQAA - AA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAwnVXlpYKTW/2yq1/9pqdX/ebjf/3m43/9hm73/cK3S/3m43/96ueD/erng/3q5 - 4P96ueD/erng/3q54P96ueD/erng/4bA4/+OxeX/h8Dj/4fA4/+HwOP/hsDj/4bA4/+GwOP/hsDj/4fB - 4/+Oxub/jsbm/4XA4/+EwOP/g8Dj/4O/4/+Dv+P/g7/j/4K+4/98uuH/fLrh/1qRsP98uuH/fLng/2qo - 1P9zsdr/YqbX/ytfhnwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANKll+bWGm1/94tt//c7Lc/22r1/+Uyuj/lcro/5XK - 6P+Vyuj/lcvo/5XL6P+Vy+j/lcvo/5XL6P+Vy+j/lsvp/5bL6f+Wy+n/lsvp/5bL6f+Wy+n/lsvp/5bL - 6f+Wy+n/lsvp/5bL6f+Wy+n/lsvp/5bL6f+Wy+n/lsvp/5bL6f+Wy+n/lsvp/5bL6f+Wy+n/l8zp/5fM - 6f+XzOn/k8no/2up1f95t9//fLrh/2mr2v80Z5KIAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADytZe3BkqNj/dbTc/2Sg - w/+Fv+P/i8Hh/43D4v+TyOX/lMjl/5TI5f+UyOX/lMjl/5TI5f+UyOX/lMjl/5TI5f+UyOX/lMjl/5TI - 5f+UyOX/lMjl/5TI5f+UyOX/lMjl/5TI5f+UyOX/lMjl/5TI5f+UyOX/lMjl/5TI5f+UyOX/lMjl/5TI - 5f+UyOX/lMjl/5TI5f+UyOX/j8Xi/5fL5v96ueD/bqvQ/3Ct0v9qrdr/OHCakgAAABQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - ABA3aZCBaKra/3Sz3P9joMX/hL7j/4K84f9xsNv/e7nf/3y64P98uuD/fLrg/3y64P98uuD/fLrg/3y6 - 4P98uuD/fLrg/3y64P98uuD/fLrg/3y64P98uuD/fLrg/3y64P98uuD/fLrg/3y64P98uuD/fLrg/3y6 - 4P98uuD/fLrg/3y64P98uuD/fLrg/3y64P98uuD/fLng/3Oy3P+YzOj/ebjf/3Ct0v9wrdL/cLHc/0N7 - p6AAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAARPG2Xh2mr2v+Au+D/c7Pd/4K94v+Bu+D/b67b/3m33/95uN//ebjf/3m4 - 3/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m4 - 3/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/9xsNv/lsvo/3i3 - 3/93td7/eLff/3Gx3P9Hf6qpAAAAGgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEz1wlYlrrNv/frrh/3W03v+BvOL/gbrg/3Kw - 2/98uN//fbng/3254P99ueD/fbng/3254P99ueD/fbng/3254P99ueD/fbng/3254P99ueD/fbng/325 - 4P99ueD/fbng/3254P99ueD/fbng/3254P99ueD/fbng/3254P99ueD/fbng/3254P99ueD/fbng/325 - 4P99ueD/c7Lc/5TK5/93td7/c7Lc/3e13v9zs93/TYq3vAAAAB0AAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRJfqiZa63b/2+w - 3f9/u+H/f7vi/3qy1v9fmcH/Zp7F/2efxf9nn8X/Z5/F/2efxf9nn8X/Z5/F/2efxf9nn8X/Z5/F/2ef - xf9nn8X/Z5/F/2efxf9nn8X/Z5/F/2efxf9nn8X/Z5/F/2efxf9nn8X/Z5/F/2efxf9nn8X/Z5/F/2ef - xf9nn8X/Z5/F/2efxf9nn8X/Z5/F/2Gbwv+Tyeb/dbTe/3Sz3f9wsNv/c7Pd/1KOu8MAAAAhAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAWUIetn2yt2/9ur9z/fbrg/3264f96td3/ZqjY/2+v3P9xsd3/cbHd/3Gx3f9xsd3/cbHd/3Gx - 3f9xsd3/cbHd/3Gx3f9xsd3/cbHd/3Gx3f9xsd3/cbHd/3Gx3f9xsd3/cbHd/3Gx3f9xsd3/cbHd/3Gx - 3f9xsd3/cbHd/3Gx3f91td7/dbTe/3Oy3f9xsd3/cbHd/3Gw3f9pqdn/kcjm/3Oz3f9zs93/ba3Z/3Sz - 3f9amMXUAAAAIwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAGFKFq6Jsrdv/ba7c/3q44P98ueD/eLTd/2Ol1v9srdv/ba7c/22u - 3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/2+v3P9zs97/c7Pe/3W03v95t9//eLbf/3Sz - 3v9zst3/drXf/3e23/92td//drXf/3a13/9yst3/crLd/3Ky3f9vsNz/ba7c/22u3P9trtz/ZqjX/4/G - 5v9yst3/crLd/2mq1/9yst3/XpzG2AAAACYAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABtak7u0bK3b/2yt2/93tt//e7jg/3ay - 3P9go9X/aava/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs - 2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs - 2/9qrNv/aqzb/2Kl1v+Oxeb/cLHd/3Cx3f9pqdf/cLHd/2ak0esAAAAqAAAABAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAcYZe/u2us - 2/9qrNv/c7Te/3m34P97tNr/bafP/3Ot0/90rtP/dK7T/3Su0/90rtP/dK7T/3Su0/90rtP/dK7T/3Su - 0/90rtP/dK7T/3Su0/90rtP/dK7T/3Su0/90rtP/dK7T/3Su0/90rtP/dK7T/3Su0/90rtP/dK7T/3Su - 0/90rtP/dK7T/3Su0/90rtP/dK7T/3Su0/9vqND/jMPk/2+v3f9vr93/aarY/26u3P9pp9PuAAAALQAA - AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAACAAAAHmObvrxoq9r/ZajX/2ms2v94tt//banW/0+Rxv9VmMr/VpnL/1aZy/9Wmcv/VpnL/1aZ - y/9Wmcv/VpnL/1aZy/9Wmcv/VpnL/1aZy/9Wmcv/VpnL/1aZy/9Wmcv/VpnL/1aZy/9Wmcv/VpnL/1aZ - y/9Wmcv/VpnL/1aZy/9Wmcv/VpnL/1aZy/9Wmcv/VpnL/1aZy/9Wmcv/UZPG/4nB5P9srdv/ba7c/22t - 2/9rrNr/crLd/wAAADEAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAACFpo8bLZ6ra/2Kl1v9nqtr/d7Xf/3Cu2f9YnNL/YqbX/2ep - 2f9nqdn/ZqnZ/2ap2f9qrNr/aava/2iq2v9mqdn/Y6fY/2Wo2P9kp9j/YqbY/2Gl1/9gpdf/YKTX/2Cl - 1/9gpdf/YKXX/2Cl1/9gpdf/YKXX/2Cl1/9gpdf/YKXX/2Cl1/9gpdf/YKXX/2Cl1/9gpdf/YKXX/1qe - 0v+IweP/Z6nY/2yt2/9trtz/ba7c/3Oz3v8AAAA1AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAjbqjM1GWp2P9kp9f/YaXW/3W0 - 3v9tq9f/U5jO/2Gk1f9dodP/W6DT/1ug0/9boNP/W6DT/1ug0/9boNP/W6DT/1ug0/9boNP/W6DT/1ug - 0/9boNP/W6DT/1ug0/9boNP/W6DT/1ug0/9boNP/W6DT/1ug0/9boNP/W6DT/1ug0/9boNP/W6DT/1ug - 0/9boNP/W6DT/1ug0/9Vmc//hb/i/2Sm1v9qrNv/a6zb/2ut2/91tN7/M1BgUAAAAAoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAJW6n - y9VkqNj/ZKjY/16h0/90tN3/aqjV/06Tyf9Vmc3/VprO/1aazv9Wms7/VprO/1aazv9Wms7/VprO/1aa - zv9Wms7/VprO/1aazv9Wms7/VprO/1aazv9Wms7/VprO/1aazv9Wms7/VprO/1aazv9Wms7/VprO/1aa - zv9Wms7/VprO/1aazv9Wms7/VprO/1aazv9Wms7/T5XK/4O84P9ipNX/aaza/2ms2v9prNr/dLTe/zFM - W1QAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAwAAACd2rtLiYqbY/2Km2P9bn9L/crLd/2ylzP9Ui7b/WJC5/1iQuf9YkLn/WJC5/1iQ - uf9YkLn/WJC5/1iQuf9YkLn/WJC5/1iQuf9YkLn/WJC5/1iQuf9YkLn/WJC5/1iQuf9YkLn/WJC5/1iQ - uf9YkLn/WJC5/1iQuf9YkLn/WJC5/1iQuf9YkLn/WJC5/1iQuf9YkLn/WJC5/1WNuP+But3/YaPV/2iq - 2v9oqtr/aKra/3a13v9Kb4RqAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAApd7HV62Cl1/9hptj/WZ7S/3Gx3f9koc//RYnA/0uQ - xP9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uR - xf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uR - xf9Hi8D/frfc/2ap2f9hpNX/ZqrZ/2aq2f9yst3/TXKGcAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAK3ex1etgpNf/YKTX/1ic - 0f9ur9v/YZ7M/0GFu/9IjcH/S5HE/06Txv9KkMT/SpHE/0ySxv9Lksb/S5DE/0yRxv9Mkcb/TJHG/0qR - xf9KkMX/SpDF/0mPxP9Jj8T/R4zB/0eMwf9HjMH/R4zB/0eMwf9HjMH/R4zB/0eMwf9HjMH/R4zB/0mP - w/9JjsP/SY7D/0iOw/9HjMH/Qoe9/3y12v9kqNj/XaHT/2Wp2P9lqdj/crLc/2CJoIQAAAARAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAA - AC6Bu9/3XqLW/12g1P9antH/aKnY/16ax/87frX/QIW4/0GGuP9Bhrj/QYa4/0GGuP9Bhrj/QYa4/0GG - uP9Bhrj/QYa4/0GGuP9Bhrj/QYa4/0GGuP9Firz/RIm8/0SJvP9IjL//SIy//0aLvv9Eibz/Rou+/0aL - vv9Gi77/RYq+/0SKvf9Dh7v/Q4e7/0OHu/9Chrr/QYa4/zx/tf95s9f/YqbY/1uezv9iptb/Y6fY/26w - 3P9ii5+KAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAUAAAAwf7vh/12h1v9SlMP/Som2/2mq2f9YlMD/NHSo/zh6rP85eqz/OXqs/zl6 - rP85eqz/OXqs/zl6rP85eqz/OXqs/zl6rP85eqz/OXqs/zl6rP85eqz/OXqs/zl6rP85eqz/OXqs/zl6 - rP85eqz/OXqs/zl6rP85eqz/OXqs/zl6rP85eqz/OXqs/zl6rP85eqz/OXqs/zl6rP80dan/bajO/2Gm - 2P9Iha7/Wp3L/2Km2P9srdv/cpuymgAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAM4G84v9bodX/W6HV/1uh1f9VmtH/VJnQ/1yh - 1v9an9T/V57T/1mf1P9YntT/WJ7U/1ie1P9YntT/WJ7U/1qf1P9ZntT/WZ7U/1me1P9ZntT/W6DU/1ug - 1P9boNX/XaLW/16i1v9eotb/XqLW/16i1v9fo9f/X6PX/1+j1/9fo9f/X6PX/2Ck1/9gpNf/YKTX/2Ck - 1/9gpNf/YKTX/12h1f9Tl83/XqLV/2Ck1/9gpNf/Z6rZ/3agtqIAAAAYAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCc2PkKBveL/WaDU/1ee - 0/9Mkcr/VZvR/1qh1f9IibX/UpbH/1qh1f9aodX/WqHV/1qh1f9bodX/W6HV/1uh1f9bodX/W6HV/1uh - 1f9codb/XKHW/1yh1v9boNX/W6DV/1ug1f9boNX/W6DV/1ug1f9boNX/W6DV/1ug1f9boNX/XaLW/12i - 1v9dotb/XqLW/16i1v9eotb/U5PD/0+Ou/9fo9b/X6PX/1GVzP9Wms//X6PX/2Om2P+Dsci1AAAAGwAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAlFW2hOhsDj/0yRyv9Kj8n/V53T/1ie0/9YntP/U5jL/1ac0P9ZoNT/WaDU/1mg1P9ZoNT/WaDU/1mg - 1P9aodX/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/WqDU/1mf1P9Zn9T/WZ/U/1mf1P9ZoNT/WaDU/1mg - 1P9ZoNT/WqDV/1qg1f9an9X/Wp/V/1qf1f9boNX/W6DV/1md0P9YnM//XaHW/12h1v9dotb/VJjP/0yQ - yP9ipdf/ibbLvAAAAB4AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAHQVpnSnqx1f+h0+r/suHy/7Lh8v+y4fL/suHy/7Lh8v+y4fL/suHy/7Lh - 8v+z4fL/s+Hy/7Ph8v+z4fL/s+Hy/7Ph8v+z4fL/s+Hy/7Ph8v+z4fL/s+Hy/7Ph8v+z4fL/s+Hy/7Ph - 8v+z4fL/s+Hy/6PW7v+c0ez/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW - 7v+i1u//otbv/6LW7/+b0ev/gbja/3uryMkAAAAcAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEhmczyLxOX/fLfe/4W+4f+o0un/qtTq/6zU - 6/+u1uv/sdfr/7LZ7P+z2u7/tdvu/7bb7v+43O7/ud3v/7re7/+83+//vd/w/73g8P+/4fH/weLx/8Hj - 8v/C5PL/vuDu/8Tk8v/F5fL/xeXy/8Tk8v/E5PL/w+Ty/8Lj8v/B4/H/wOLx/77h8f+/4vL/vOHy/7be - 8f+03fH/s9zw/7Hb7/+w2u//rtnv/63X7v+m0+z/icHi/4nB4v+Iu9XIAAAAEwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAXhbzd4JPJ - 5/+QxeX/RHqe/yZgjP8mYIz/HE5z/x5Sd/8eUnf/K1+A/zNmhv8zZob/M2aG/zNmhv8zZob/M2aG/zNm - hv8zZob/M2aG/zNmhv8yZIP/LFl0/yRQaf8pVm//MWOB/zNmhv8zZob/M2aG/zNmhv8zZob/M2aG/zNm - hv8zZob/M2aG/zNmhv8zZob/M2aG/zNmhv8yZIT/OnKY/zpymP86cpj/daTB/5XJ5/+Qx+f/eKfChgAA - AAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAC3Klw5GIweT/mczp/26du/8rZpH/K2aQ/yFUd/8jWHv/I1h7/yNYe/8jWHv/I1h7/yNY - e/8jWHv/I1h7/yNYe/8jWHv/I1h7/yNYe/8gU3X/Gkln/yNdav9Xj43/I1pq/xpIZf8eT3D/Ilh7/yNY - e/8jWHv/I1h7/yNYe/8jWHv/I1h7/yNYe/8jWHv/I1h7/yNYe/8jWHv/IVR3/ytmkf8rZpH/K2aR/5bB - 2f+JweL/jMTl/EBdbDQAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARHaoFBg7/j/5jN6f+LudP/Mm2Y/zFslf8mWn7/KF6C/yhe - gv8oXoL/KF6C/yhegv8oXoL/KF6C/yhegv8oXoL/KF6C/yhegf8jVXX/IFBu/zJxeP/H7Nv/7vv0/8no - 3f82b3r/IFBu/yFTcv8mXH//KF6C/yhegv8oXoL/KF6C/yhegv8oXoL/KF6C/yhegv8oXoL/KF6C/yZa - fv8xbZf/Mm2Y/zp1nf+u1+z/h8Di/32y08IAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFHSu09GVyuj/ncrj/z95 - oP83cpr/K2CE/y5lif8uZYn/LmWJ/y5lif8uZYn/LmWJ/y5lif8uZYn/LmWJ/yxihP8oW3r/J1l4/zd/ - f//M8d//zfXe/8Dz1v/I9Nv/ye3c/zd9gP8nWXj/J1l4/ytfgf8uZYn/LmWJ/y5lif8uZYn/LmWJ/y5l - if8uZYn/LmWJ/y5lif8rYIT/N3Ka/zl0nP9rnbv/ns/p/4S+4f9cjqtxAAAABwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAldkreGgbzh/6LS6/9glLP/Pnmf/zJniv81bI//NWyP/zVsj/81bI//NWyP/zVsj/81bI//NWyP/zFm - iP8uYoL/L2KC/0KSiP+/8df/vfLT/77y1f/A89b/vPLT/7Xxzv/B8dn/Qo6J/y5igv8uYoL/L2SF/zRr - jf81bI//NWyP/zVsj/81bI//NWyP/zVsj/81bI//MmeK/z55n/8/e6L/j7vT/47F5f93s9r2FiQzIwAA - AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAADK01lNXOy2/yKw+X/hLDK/0WBpv85bpH/PHSW/zx0lv88dJb/PHSW/zx0 - lv88dJb/O3KU/zdujv82bY3/N22M/0Ohif+v783/pO/C/6vwx/+18c7/uPHQ/7LxzP+m78T/nu6+/6nu - yv9Jn5D/N22N/zZtjf82bY3/OXGS/zx0lv88dJb/PHSW/zx0lv88dJb/PHSW/zlukf9Fgab/SoWq/6TN - 5f+Qx+f/ZqHHrQAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJlo83Je7fd/5rF3P9MiKz/PnaX/0J7 - nP9Ce5z/Qnuc/0J7nP9Ce5z/QHmZ/z93l/8/d5f/PneU/0SsiP+e7sP/iuuw/5Xst/+f7r//p+/E/6jv - xf+k78L/m+28/5Drs/+E6qz/mO2//0Wpi/8+d5b/P3eX/z93l/9AeJj/Qnub/0J7nP9Ce5z/Qnuc/0J7 - nP8+dpf/Soap/3Omw/+Vx+X/h8Hk/z5vlVcAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIRH2oeHaz - 3P+jz+f/WpO0/0Z9nf9Kg6P/SoOj/0qDo/9Kg6P/SoOi/0mCof9JgqH/SIKd/0m3if+E67L/ceee/33p - pv+I667/key1/5fsuf+Z7br/ley3/47rs/+E6qv/eOij/2vmmv+A67H/SrSP/0aDnf9JgqH/SYKh/0mC - of9Kg6L/SoOj/0qDo/9Kg6P/Rn2d/1KOr/+dxdr/iMDi/2+s1eYAAAAXAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAhMsPiloqtf5jsLj/3mqw/9OhaT/U4uq/1OLqv9Ti6r/U4uq/1OLqv9Ti6r/Toyh/0G7 - gf9q6KL/VuOM/2Tmlv9x557/e+il/4Lpqv+H6q3/iOuu/4XqrP9/6aj/d+ii/2zmm/9f5ZL/UOKI/2Ln - nf9Gu4z/TIyh/1OLqv9Ti6r/U4uq/1OLqv9Ti6r/U4uq/06FpP9el7f/sNbq/4K84P9Pi7iYAAAACwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARV5XFvHm03P+YwNX/Vo6q/1yUsP9clLD/XJSw/1yU - sP9clLD/UJSf/zu/fP9K5I7/POB6/0rihP9X44z/YuWU/2zmmv9y55//duei/3foov9156H/cOed/2jm - mP9e5ZH/UuOJ/0ThgP8133f/QuOJ/zy9g/9PlKD/XJSw/1yUsP9clLD/XJSw/1yUsP9Wjqr/gLDI/6HQ - 6v9wrtr/I05yQQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzBvpnBzsdv/oszi/3ir - xP97r8f/e6/H/3qvx/96r8f/WqGg/zDDdv8l33f/Hdxo/y7ecv884Hv/SOGD/1Pjiv9b5I//YeWT/2Xl - lf9l5pb/Y+WV/1/kkv9Z443/T+KH/0ThgP824Hj/J91v/xXcZP8e3nL/M8WB/1egpP91qsX/darF/3Sq - xf90qsX/cabC/5/H3P+JweP/WJvL1QAAABIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAETTHEbZ6fU3oS/4v+Px+f/kcjn/5HJ6P+Syej/armx/yDEbP8R2Wf/ANhZ/wzbYP8e3Gn/LN5x/zjg - ef9C4X7/SuKE/0/ih/9S44n/U+OK/1Hiif9N4ob/R+GC/z7gfP8033b/J91u/xfcZf8F2lz/ANdY/w7Y - ZP8jxnf/bbq7/5LJ5/+RyOf/j8fn/47G5v+MxeX/gLvf+0aFu20AAAAFAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAASBAYAhilrcnVXqVMDtTZEomOkVzF28/yRDGaP8K0lv/H9Zk/yna - a/8x3XL/OuB5/0fhgf9Q4of/V+OL/13kj/9g5ZL/YOWS/17kkf9Y5I3/UOOH/0ThgP8033b/Id1r/xTc - ZP8E2Vz/ANdY/wDUVf8A0FH/BdFY/w3DaP8cakbBKz1GcTxYakhcgpgvaZ23J2GSqhUAAAACAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAADAAAACsAAABbAGMZxADE - Xv8Jy1P/PdVv/0jYef9I3Hv/SN19/0jgf/9K4oL/T+KG/1bji/9b5I3/XuWQ/2Dlkf9g5ZH/YOWR/13k - j/9Z44z/VOOJ/0rig/8433f/Idpp/w3VW/8A0FH/AM1N/wDKSv8AyUz/A8Ng/wFdHbsAAABYAAAAKAAA - AAsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAADAAA - AC8ABQBjAGoV0wC+VP8OxUz/R9Fx/1HWev9R2Hz/Udp+/1HcgP9R3oL/UeCE/1Hhhv9T4oj/VeOK/1nk - i/9a5I3/WuSN/1nkjP9X44v/VeOJ/1Lih/9R4YX/UeCE/1Hdgv9R3ID/RNd1/yfQYv8IyEv/AMRD/wDB - Qv8AvVH/AGkYygAFAF8AAAAsAAAACwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABAAAACIADwBjAG8Q3wC7Tf8XwEr/U890/1rSe/9a1X7/WteA/1rZgv9a24T/Wt2F/1re - h/9a4Ij/WuGK/1riiv9a4ov/WuKL/1rii/9a4ov/WuKL/1rhiv9a4Yn/Wt+I/1reh/9a3IX/WtqD/1rY - gf9a13//V9R8/zvLZv8PwEX/ALk5/wC4Sf8AaxHUABAAYAAAACAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcADgA4AHsU4gC1Qv8ivEr/Xs15/2LRfv9i0oD/YtWC/2LX - hP9i2Ib/YtqI/2Lcif9i3Yr/Yt6L/2LfjP9i4I3/YuGN/2Lhjv9i4Y7/YuGO/2Lhjf9i4Iz/Yt+M/2Le - i/9i3Yr/YtyJ/2LZh/9i2IX/YtaD/2LUgf9i0n//YM98/z/EYf8JtTf/ALQ//wB2E9sABQA0AAAABwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAC4ATgCsNP8vuk3/acx+/2vO - gf9r0YP/a9KF/2vUh/9r1oj/a9iK/2vZi/9r24z/a9yN/2vdj/9r3o//a96Q/2vfkf9r35H/a+CR/2vf - kf9r35H/a96Q/2vdj/9r3Y7/a9yN/2vai/9r2Yv/a9eJ/2vWiP9r04b/a9KE/2vQgv9rzYD/Zcp6/yq3 - SP8AqjL/AC4ATgAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAu - AE5LuVz/ruC2/7Hiuv+x47v/seS8/7Hlvf+x5r7/quW5/2HUgf9u14v/c9qQ/3Pbkf9z3JL/c92T/3Pd - lP9z3ZT/c96U/3PelP9z3pT/c92U/3PdlP9z3ZL/c9yS/3Pbkf9z2Y//bteL/2TUg/+q5bn/seW+/7Hl - vf+x5Lv/seO6/7Hhuf+u37b/Srlc/wAuAE4AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAcAMwBGVade/5TMnv+Uzp//lM6g/5TPov+U0aP/lNKk/5TTpf8swVn/bdWI/3rZ - lP962pX/etuW/3rclv963Zf/et2X/3rdl/963Zf/et2X/3rdl/963Zf/etyW/3rblv962pX/etmT/23U - iP8wwlv/lNOl/5TSpP+U0KP/lM+h/5TOoP+UzZ//lMud/0yiVP8AMwBGAAAABgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAEUAND2WRf9hrW3/Ya9v/2Gxcf9hs3P/YbR1/2G2 - dv9ht3j/IbZM/3TUjP+C2Zj/gtqY/4Lbmf+C3Jn/gtya/4Ldm/+C3Zv/gt2b/4Ldm/+C3Jv/gtya/4Lb - mf+C25j/gtqY/4LYl/901Iv/JLlO/2G3d/9htXb/YbN0/2Gycv9hsHD/Ya5u/2Gsbf86k0D/AEAAMAAA - AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYNcg95KIYvpCiF - LqUohjClKIgxpSiIMaUoiTOmIn8tswKeJfd704//itmc/4ranf+K257/ituf/4rcn/+K3J//it2g/4rd - oP+K3Z//ityf/4rcn/+K257/itqe/4rZnP+K2Jz/e9OP/wKlK+8jgS6wKIczpiiIMaUohjClKIYwpSiF - LqUohC2kDXEPdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAABQAAACkAlh3qgtOT/5LZoP+S2qH/ktui/5Lb - ov+S3KL/ktyj/5Lco/+S3KP/ktyj/5Lco/+S3KL/ktui/5Lbov+S2qH/ktmg/4LTkv8AnibUAAAAIwAA - AAQAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAoAJQa6onT - lv+Z2qX/mdqm/5nbpv+Z3Kf/mdyn/5ncp/+Z3aj/md2o/5ndqP+Z3Kf/mdyn/5nbp/+Z26b/mdql/5nZ - pf+J05b/AJki1AAAACIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAEAAAAKACQFuqP05r/oNqq/6Dbqv+g3Kv/oNyr/6Dcq/+g3av/oN2r/6Ddq/+g3av/oN2r/6Dc - q/+g3Kv/oNur/6Dbqv+g2qr/j9Oa/wCWHdQAAAAiAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAjRLqltSe/6jbr/+o3K//qN2w/6jdsP+o3bD/qN2x/6jd - sf+o3bH/qN2x/6jdsP+o3bD/qN2w/6jcr/+o3K//qNuu/5bTnv8AkhjUAAAAIgAAAAIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAoAIoO6pzUov+v3bP/r920/6/d - tP+v3bT/r921/6/etf+v3rX/r961/6/etf+v3rX/r921/6/dtP+v3bT/r920/6/cs/+c1KL/AI4T1AAA - ACIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAKACH - Cuqi1ab/tt25/7beuv+23rr/tt66/7bfuv+237r/tt+6/7bfuv+237r/tt+6/7bfuv+23rr/tt66/7be - uf+23bn/otWm/wCKDdQAAAAiAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABAAAACgAgwXqqdar/73fvv+94L//veC//73gv/+94cD/veHA/73hwP+94cD/veHA/73h - wP+94cD/veC//73gv/+94L//vd++/6nWq/8AhQbUAAAAIgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAoAIAC6q/Xr//E4cT/xOLE/8Tixf/E4sX/xOLF/8Ti - xf/E4sX/xOLF/8Tixf/E4sX/xOLF/8Tixf/E4sT/xOLE/8ThxP+v16//AIIB1AAAACIAAAACAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAKAB/AOq/37//2+zb/9vs - 2//b7Nv/2+3b/9vt2//b7dz/2+3c/9vt3P/b7dz/2+3c/9vt2//b7dv/2+zb/9vs2//b7Nv/v96//wCA - ANQAAAAiAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAA - ACUDeQPqvdy9/9To1P/U6NT/1OjU/9To1P/U6NT/1OjU/9To1P/U6NT/1OjU/9To1P/U6NT/1OjU/9To - 1P/U6NT/1OjU/67Vrv8AdQDTAAAAHwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAIAAAAZFHcU5nWsdf91rHX/dax1/3Wsdf91rHX/dax1/3Wsdf91rHX/dax1/3Ws - df91rHX/dax1/3Wsdf91rHX/dax1/3Wsdf91rHX/FHIUzQAAABYAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQdxB7k/jz//RpNG/0aTRv9Gk0b/RpNG/0aT - Rv9Gk0b/RpNG/0aTRv9Gk0b/RpNG/0aTRv9Gk0b/RpNG/0aTRv9Gk0b/Po8+/wNuA6cAAAAIAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAJAAHAFwAJABe - ACYAXgAmAF4AJgBeACYAXgAmAF4AJgBeACYAXgAmAF4AJgBeACYAXgAmAF4AJgBeACYAXgAmAGAAJQBc - ACQAJAAHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////8AAAAAA - B///wAAAAAAH///AAAAAAAf//8AAAAAAA///wAAAAAAD//+AAAAAAAP//4AAAAAAA///gAAAAAAD//+A - AAAAAAP//4AAAAAAA///gAAAAAAD//+AAAAAAAP//4AAAAAAA///gAAAAAAD//+AAAAAAAP//4AAAAAA - A///gAAAAAAD//+AAAAAAAP//4AAAAAAA///gAAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAB//+A - AAAAAAH//4AAAAAAAf//gAAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAD///AAAAAAAP//8AAAAAA - B///wAAAAAAH///gAAAAAAf//+AAAAAAD///8AAAAAAP///wAAAAAA////AAAAAAH///+AAAAAAf///4 - AAAAAD/////AAAAH/////4AAAAP/////AAAAAf////4AAAAA/////AAAAAB////8AAAAAH////wAAAAA - f////AAAAAB////8AAAAAH////4AAAAA//////wAAH///////AAAf//////8AAB///////wAAH////// - /AAAf//////8AAB///////wAAH///////AAAf//////8AAB///////wAAH///////AAAf//////8AAB/ - /////////////ygAAACAAAAAAAEAAAEAIAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAABAAAAAwAAAAUAAAAHAAAACQAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA - AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACQAAAAcAAAAFAAAAAwAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAUAAAAKAAAAEgAAABcAAAAcAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAA - AB8AAAAfAAAAHwAAAB4AAAAcAAAAFwAAABEAAAAKAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAEAAAADAAAABcAAAAkAAAAMAAAADkAAAA9AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAA - AD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAA - AD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAA - AD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAA - AD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAA - AD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPQAAADkAAAAwAAAAJAAA - ABcAAAAMAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAgAAAAUAAAAKAAAAD8AAABSAAAAYAAA - AGYAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAA - AGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAA - AGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAA - AGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAA - AGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAA - AGgAAABoAAAAaAAAAGgAAABmAAAAYAAAAFMAAAA/AAAAKAAAABUAAAAIAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAACAAAADAAAAB4AAAA4AAAAVwAAAG8AAAB+AAAAhQAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAA - AIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAA - AIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAA - AIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAA - AIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAA - AIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIcAAACHAAAAhwAAAIUAAAB/AAAAcAAA - AFkAAAA7AAAAIAAAAA0AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAPAAAAJR0mMFApXYu0O4fF90CN - zP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CN - zP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CN - zP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CN - zP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CN - zP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CN - zP9Ajcz/QI3M/0CNzP9Ajcz/QI3M/0CNzP87hML3JVF/rAAAAEoAAAAoAAAAEgAAAAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABAAAABIAAAAqHUlxejBzuf80ebv/XqLV/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u - 3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22v3P9tr9z/ba/c/22v3P9tr9z/bq/c/26v - 3P9ur9z/bq/c/26v3P9ur9z/bq/d/26v3f9ur93/bq/d/26v3f9ur93/bq/d/26v3f9ur93/bq/d/26v - 3f9ur93/bq/d/26v3f9ur93/bq/d/26w3f9usN3/brDd/2+w3f9vsN3/b7Dd/2+w3f9vsN3/b7Dd/2+w - 3f9vsN3/b7Dd/2+w3f9vsN3/b7Dd/2+w3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cx - 3f9wsd3/cLHd/3Cx3f9wsd3/cLHd/3Cx3f9wsd3/cLHd/3Cx3f9wsd3/cLHd/3Cx3f9wsd3/XqHS/zB0 - t/80erz/JVd+iQAAAC8AAAAVAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFAAAAC0jTXJ9RY/N/1eZ - zP9Qkcb/d7Xd/3q54P96ueD/erng/3q54P96ueD/erng/3q54P9rp8v/d7Tb/3q54P96ueD/erng/3q5 - 4P96ueD/erng/3q54P96ueD/erng/3q54P+NxuX/lMnn/5TJ5/+Uyef/lMnn/5PI5v+SyOb/kcfm/5DH - 5v+Px+b/jcbm/4zG5v+LxuX/i8Xl/4rF5f+JxOX/g7/k/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y6 - 4f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f99uuH/fbrh/3264f99uuH/fbrh/326 - 4f99uuH/fbrh/3264f99uuH/fbrh/3664f9+uuH/frrh/3664f9+uuH/frrh/3664f92stb/c67S/366 - 4f9+uuH/f7vi/3+74v9/u+L/f7vi/3Gv2f9Pj8X/b67Z/0WPzf8ybp6sAAAAMwAAABcAAAAHAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAUAAAAUAAAALjBqmJ5Gkc7/ebjf/3Gv2v9Qkcb/ca/a/3q54P96ueD/erng/3q5 - 4P96ueD/a6fL/zhrgv9Zk7L/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q5 - 4P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P97ueD/e7ng/3u5 - 4P97ueD/e7ng/3u54P97ueD/e7ng/3u54P97ueD/e7ng/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y6 - 4f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/326 - 4f99uuH/fbrh/3264f99uuH/fbrh/0p/mf87bIL/fbrh/3264f99uuH/frrh/3664f9npdL/WpnK/3q5 - 3/9+uuH/RpHO/zJsna4AAAA1AAAAGQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAABUAAAAvNXGhqUmT - z/95t9//ebff/3a03f9Wl8n/ZqXT/3m43/95uN//ebjf/3m43/95uN//aaXJ/3Wy2f95uN//ebjf/3q5 - 4P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q5 - 4P96ueD/k8jn/5PI5/+f0Or/ptTs/5PI5/+TyOf/k8jn/5PI5/+TyOf/k8jn/5PI5/+SyOf/ksjn/5LH - 5v+Rx+b/kcfm/5DH5v+Qx+b/kMfm/5TK5/+h0+z/odPs/6HS7P+g0uz/ksnn/43G5v+Mxub/jMbm/4vG - 5f+Lxub/i8bm/4vF5f+Lxeb/i8Xm/4rF5v+Kxeb/icTm/4fB5f98uuH/fLrh/3y64f98uuH/dLDV/3Cs - 0P98uuH/fLrh/3y64f96uN7/XJvM/2em0v99uuH/fbrh/3264f9Jk8//P4K51wAAADcAAAAbAAAACAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAFAAAAFQAAADA5c6KqSpXQ/3i33/94t9//eLff/3i33/9mpdP/W5vN/3m3 - 3/95t9//ebff/3m33/95t9//ebff/3m33/95t9//ebff/3m43/95uN//ebjf/3m43/95uN//ebjf/3m4 - 3/95uN//ebjf/3m43/95uN//erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q5 - 4P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q5 - 4P96ueD/erng/3q54P96ueD/erng/3q54P97ueD/e7ng/3u54P97ueD/e7ng/3u54P97ueD/e7ng/3u5 - 4P97ueD/e7ng/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/erfe/1yazP9zsdv/fLrh/3y6 - 4f98uuH/fLrh/1Sb0v9Dg7rXAAAAOQAAABsAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAWAAAAMTdz - oatMl9H/eLbf/3i23/94tt//eLbf/3i23/9vrtr/ca3W/63c8P+y3vL/st7y/7Le8v+y3vL/st7y/7Le - 8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le - 8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le - 8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le - 8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le - 8v+y3vL/st7y/6TU7P9fns7/ebfe/3u54P97ueD/fLrh/3y64f98uuH/WZ/U/0KEuNgAAAA7AAAAHQAA - AAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAABcAAAAzOHOgrE6Y0v93tt7/d7be/3e23v93tt7/d7be/3e2 - 3v+Uyuj/jcTi/53P6f+t3PH/rt3x/7Dd8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He - 8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He - 8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He - 8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He - 8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/r93x/63d8f+Xy+b/mMzn/3q54P96ueD/erng/3q5 - 4P96ueD/e7ng/3u54P9aodX/Q4a42QAAAD0AAAAeAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAGQAA - ADQ7dJ+tWJ7T/3a13v92td7/crHZ/0h+m/9alrf/drXe/5PK6P+dz+n/ZaLQ/2uo0v9xrdX/drLY/3iz - 2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz - 2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz - 2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz - 2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz - 2P90sNb/bKrS/3242/+x3fH/erng/3q54P96ueD/TISg/1KKqf96ueD/erng/1yh1v9Mk8v2AAAAPwAA - ACAAAAALAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAZAAAANUOBsMJbodb/dbTe/3W03v9xsNn/SYCf/1yY - u/91tN7/k8ro/53Q6/9pqdb/b67a/3Wy3f96ud7/fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y6 - 3/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y6 - 3/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y6 - 3/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y6 - 3/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLnf/3e13f9xsNv/gLvg/7Dd8f96ueD/erng/3q5 - 4P9UjKv/Vo6s/3q54P96ueD/Z6ra/1Ob0v8AAABBAAAAIQAAAAwAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAA - ABoAAAA3Soq81l2i1v91tN7/dbTe/3W03v91tN7/dbTe/3W03v+Tyej/ndDr/2io2P9urdr/dbPd/3q4 - 3/98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y6 - 4f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y6 - 4f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y6 - 4f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y6 - 4f98uuH/d7Xd/3Cv3P+Au+H/sN3x/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/9nqtr/VZvS/wAA - AEQAAAAjAAAADQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGwAAADdLir3XXqPX/3Sz3f90s93/h8Di/3Sz - 3f90s93/dLPd/5LJ5/+d0Ov/Z6fX/22s2v9zst3/ebff/3q54P96ueD/erng/3q54P96ueD/erng/3q5 - 4P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q5 - 4P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q5 - 4P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q5 - 4P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P92tN3/b67b/3664f+v3fH/ebff/3m3 - 3/95t9//ebff/3m33/95t9//ebff/2ir2v9XndP/AAAARgAAACUAAAAOAAAAAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAgAAAAbAAAAOU2MvddgpNf/c7Pd/3Oz3f+TyOb/c7Pd/3Oz3f9zs93/kcjn/5zP6/9mptb/a6vZ/3Kx - 3f94tt7/ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m4 - 3/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m4 - 3/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m4 - 3/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m4 - 3/95uN//ebjf/3Wz3f9trNr/fbng/67d8f94t9//eLff/3i33/90st3/eLff/3i33/94t9//a6zb/1mf - 1P8gOlBgAAAAJwAAABAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAB0AAAA7To6+2GKm2P9yst3/crLd/4vE - 5f9yst3/crLd/3Ky3f+Qx+f/m8/q/2Wl1v9qqtn/cK/c/3a03v94t9//eLff/3i33/94t9//eLff/3i3 - 3/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i3 - 3/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i3 - 3/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i3 - 3/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94tt//c7Ld/2us2v98ud//rt3x/3i2 - 3/94tt//eLbf/3Cw2/94tt//eLbf/3i23/9wsd3/W6HV/zBbeHkAAAApAAAAEQAAAAMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAKAAAAHgAAADxPj7/YZ6ra/3Gx3f9xsd3/i8Tl/3664f9yst3/crLd/5DH5/+azur/aqjX/3ay - 3P97t97/gLrg/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O8 - 4v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O8 - 4v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O8 - 4v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O8 - 4v+DvOL/g7zi/4O84v99ud//dLHc/3q43v+t3PH/drXe/3e23v93tt7/b6/a/3W03f93tt7/d7be/3Cx - 3f9dotb/MFx5egAAACsAAAASAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAfAAAAPViZy+xoq9r/cLHd/3Cx - 3f9wsd3/isLk/3Gx3f9xsd3/j8fn/5jN6v9sn7//bJ66/2+hvP9zpL7/dKW//3Slv/90pb//dKW//3Sl - v/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Sl - v/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Sl - v/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Sl - v/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Slv/90pb//dKW//3Givf9tn7v/frnd/63d - 8f91tN7/dbTe/3a13v9yst3/bq7a/3a13v92td7/cLHd/2Ck1/8zWnl8AAAALQAAABQAAAAFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAACgAAAB8AAAA+YaXY/2ir2v9vsN3/b7Dd/2+w3f+Tyef/cLHd/3Cx3f+Nxuf/mM3q/06P - x/9OkMf/VJXJ/1iYy/9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZ - zP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZ - zP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZ - zP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZzP9amcz/WpnM/1qZ - zP9amcz/WpnM/1qZzP9amcz/VpfK/1OUyf91stz/rdzx/3W03v91tN7/dbTe/3W03v9oqdb/dbTe/3W0 - 3v9yst3/YaXY/0BukpQAAAAuAAAAFQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAALAAAAIAAAAEBjp9j/aazb/2+v - 3f9vr93/b6/d/4XA4/9vr93/b7Dd/43G5/+XzOn/X6DT/2Wn1/9qq9n/b6/c/3Ky3f9yst3/crLd/3Ky - 3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky - 3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky - 3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky - 3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Ky3f9yst3/crLd/3Kx3f9trNr/Z6jY/3e1 - 3f+s3PH/dLPd/3Sz3f90s93/dLPd/2eo1f91tN7/dbTe/3W03v9jp9j/TIGoqgAAADAAAAAWAAAABgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAwAAAAhAAAAQWWp2P9qrNv/bq/c/26v3P9ur9z/lMrn/26v3P9ur9z/jMbm/5fM - 6P9en9L/Y6XX/2mq2f9trtz/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw - 3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw - 3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw - 3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/3m43/95uN//ebjf/3m33/95t9//cLDd/3Cw - 3f9wsN3/cLDd/3Cw3f9wsN3/cLDd/2us2v9lp9j/d7Td/6zb8P9zs93/c7Pd/3Oz3f9zs93/ZabU/3Sz - 3f90s93/dLPd/2Wp2P9KgKerAAAAMgAAABcAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAADQAAACMAAABEZ6ra/2yt - 2/9trtz/ba7c/22u3P+GweT/ba7c/22u3P+LxuX/lsvo/1ye0v9ipNb/Z6nY/2ys2/9ur9z/bq/c/26v - 3P9ur9z/bq/c/26v3P9ur9z/bq/c/26v3P9ur9z/bq/c/26v3P9ur9z/bq/c/26v3P9ur9z/bq/c/26v - 3P9ur9z/bq/c/26v3P9ur9z/dLPd/3q54P96uOD/erjg/3q44P95uN//gb7i/4XA4/+FwOP/hMDj/4S/ - 4/99uuH/ebff/3m33/95t9//fLrh/4O+4/+BvuP/gb7i/4G+4v+AveL/gL3i/4C94v+AveL/f7zi/3i2 - 3v93tt7/d7be/3e23v93tt7/d7be/3e23v9ur9z/bq/c/26v3P9ur9z/bq/c/26v3P9ur9z/aqzZ/2Ol - 1/92s93/q9vw/3Ky3f9yst3/crLd/3Ky3f9pqtj/a6vY/3Oz3f9zs93/Z6ra/02Apq0AAAA0AAAAGAAA - AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAIAAAAOAAAAJAAAAEZprNr/bK7c/22u3P9trtz/ba7c/4nE5f9trtz/ba7c/4vF - 5f+Vy+j/W57S/2Ci1f9mqNj/a6zb/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u - 3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u - 3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u - 3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9trtz/ba7c/22u - 3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9pq9n/YqTW/3Sy3f+q2vD/crLd/3Ky3f9yst3/crLd/26u - 2/9lptT/crLd/3Ky3f9srdv/UoiutwAAADYAAAAZAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAA8AAAAmJkNTX2ut - 2/9srdv/ba7c/22u3P9trtz/fbvi/3W13/9trtz/i8Tl/5TK5/9anNL/X6HU/2Sm2P9pq9r/a63b/2ut - 2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut - 2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut - 2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut - 2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2ut2/9rrdv/a63b/2eq - 2P9gotX/c7Ld/6ra8P9xsd3/cbHd/3Gx3f9xsd3/cbHd/2Ki0v9xsd3/cbHd/22u3P9emcTXAAAAOAAA - ABsAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAADAAAAEAAAACc8Zn92ba7c/2yt2/9srdv/bK3b/2yt2/9vsN3/e7rh/2yt - 2/+KxOX/lMnn/1mc0v9doNP/Y6XX/2iq2f9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs - 2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs - 2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs - 2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs - 2/9qrNv/aqzb/2qs2/9qrNv/aqzb/2qs2/9qrNv/ZajY/1+h1P9ysd3/qdnw/3Cx3f9wsd3/cLHd/3Cx - 3f9wsd3/YaHS/3Cx3f9wsd3/ba/c/16ZxNgAAAA6AAAAHAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAQAAAAKD5i - gHdvr93/bK3b/2ut2/9rrdv/a63b/2ut2/+AwOT/a63b/4nD5f+Tyef/WJrS/1yf0/9hpNb/ZqnZ/2ir - 2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir - 2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir - 2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir - 2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir2v9oq9r/aKva/2ir - 2v9kp9j/XqHU/3Gw3P+o2e//b7Dd/2+w3f9vsN3/b7Dd/2+w3f9godL/b7Dd/2+w3f9vsN3/YZvE2AAA - ADwAAAAdAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAABEAAAApQmZ/eHGx3f9rrNv/aqzb/2qs2/9qrNv/aqzb/3i5 - 4f9qrNv/iMLl/5LI5/9ypcj/eqvK/32uzP+Ascz/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gy - zf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gy - zf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gy - zf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gy - zf+Bss3/gbLN/4Gyzf+Bss3/gbLN/4Gyzf+Bss3/gbLN/3+vzP97rMr/ca7Y/6jY7/9vr93/b6/d/2+v - 3f9vr93/b6/d/2eo1/9rrNr/b6/d/3Cw3f9loMriAAAAPgAAAB8AAAAKAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEgAA - ACo/Zn16c7Pd/2ms2v9prNr/aaza/2Wn1/9qrNv/aqzb/2qs2/+IwuX/kcfn/0GCuv9Bgbn/Roa6/0mK - vP9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qL - vv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qL - vv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qL - vv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qLvv9Ki77/Sou+/0qL - vv9Ki77/R4i6/0SDuf9rqtj/p9jv/22u3P9ur9z/bq/c/26v3P9ur9z/bKza/2ao1v9ur9z/cbHd/3Oz - 3f8AAABAAAAAIQAAAAsAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAATAAAALEBlfHt1tN7/aKva/2ir2v9oq9r/YaPU/2ms - 2v9prNr/aaza/4fB5f+Rx+f/VJfQ/1ic0v9dodT/YaXX/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On - 2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On - 2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On - 2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On - 2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9jp9j/Y6fY/2On2P9fo9X/Wp7S/22s2v+n2O//aqvZ/22u - 3P9trtz/ba7c/22u3P9trtz/ba7c/22u3P9xst3/dbTe/wAAAEIAAAAiAAAADAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAA - ABQAAAAuR3KLiHe23/9oqtr/aKra/2iq2v9fodP/aKra/2ir2v9oq9r/h8Hk/5DH5v9Sl8//V5vS/1yg - 1P9gpNf/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km - 2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km - 2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km - 2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km2P9iptj/YqbY/2Km - 2P9iptj/YqbY/16h1f9ZnNL/bKza/6bY7v9oqtj/aarZ/22u3P9trtz/ba7c/22u3P9trtz/ba7c/3Cx - 3f93tt//AAAARQAAACQAAAAOAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFQAAAC5cj62pebjf/2eq2v9nqtr/Z6ra/12g - 0v9nqtr/Z6ra/2iq2v+GwOT/j8bl/0+Uzf9VmdD/Wp7S/12i1P9rrNr/ba7b/22t2/9srdv/bK3b/2yt - 2/9rrNr/a6za/2yt2/90s93/crLd/3Gx3f9wsN3/b6/c/26u3P9srdv/aaza/2Wp2P9mqtn/aaza/2ir - 2f9nqtn/ZanY/2So2P9jp9j/YqbY/2Gl1/9gpdf/X6TW/1+j1v9fo9b/X6TW/1+k1v9fpNb/X6TW/1+k - 1v9fpNb/X6TW/1+k1v9fpNb/X6TW/1+k1v9fpNb/X6TW/1+k1v9fpNb/X6TW/1+k1v9fpNb/X6TW/1+k - 1v9fpNb/X6TW/1+k1v9fpNb/X6TW/1+k1v9fpNb/X6TW/1+k1v9fpNb/XKHT/1aa0f9qq9j/ptfu/2ep - 2P9nqdj/bK3b/22u3P9trtz/ba7c/22u3P9trtz/b7Dd/3m43/8AAABHAAAAJgAAAA8AAAACAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAUAAAAVAAAAMF6Qsap6ueD/ZqrZ/2aq2f9mqtn/YaPV/2Gk1f9mqtn/ZqrZ/4bA5P+PxuX/TZLM/1OX - zv9Xm9L/Z6nY/2us2f9kp9f/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h - 1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h - 1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h - 1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h1P9dodT/XaHU/12h - 1P9dodT/XaHU/12h1P9antL/VJjP/2ip1/+l1+7/aKvZ/2Gj0/9rrdv/a63b/2yt2/9srdv/bK3b/2yt - 2/9vsN3/erng/0Rrg3cAAAAoAAAAEAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAABYAAAAxYZOxqne23/9lqdj/ZanY/2Wp - 2P9kqNj/W5/S/2Wp2P9lqdj/hcDk/43F5f9LkMn/T5XM/1WZzv9YndH/Wp/S/1qf0v9an9L/Wp/S/1qf - 0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf - 0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf - 0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf - 0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1qf0v9an9L/Wp/S/1aaz/9Sl8z/ZqfV/6TW - 7v9qrNv/X6HS/2qs2/9qrNv/aqzb/2ut2/9rrdv/a63b/2+w3f98uuH/RWuAeQAAACoAAAASAAAAAwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAHAAAAFwAAADJfj62rebff/2Wp2P9lqdj/ZanY/2Wp2P9Yms//ZanY/2Wp2P+FwOT/jMTk/0qO - x/9Nk8n/UpfM/1aazv9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ec - z/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ec - z/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ec - z/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ecz/9XnM//V5zP/1ec - z/9XnM//V5zP/1ecz/9XnM//VJnM/06Uyv9kpdP/pNXu/2qs2/9Ymc7/aqzb/2qs2/9qrNv/aqzb/2qs - 2/9qrNv/a63b/3664f9EaH57AAAALAAAABIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAYAAAANGCPrq15uN//ZKjY/2So - 2P9kqNj/ZKjY/1eZzv9kqNj/ZKjY/4TA4/+LxOT/SIzG/0yQx/9Plcr/VJjM/1WZzf9Vmc3/VZnN/1WZ - zf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZ - zf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZ - zf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZ - zf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Vmc3/VZnN/1WZzf9Ql8v/TJHH/2Oj - 0v+j1e7/aaza/12g0v9prNr/aaza/2ms2v9prNr/aaza/2qs2/9qrNv/gL3i/0Vofn0AAAAuAAAAFAAA - AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABwAAABkAAAA1Z5a1t3q54P9jp9j/Y6fY/2On2P9jp9j/V5rP/2Gl1/9jp9j/g7/j/4vC - 4v9upMz/eKvO/3qs0P98sNL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x - 0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x - 0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x - 0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x0v99sdL/fbHS/32x - 0v99sdL/fbHS/32x0v99sdL/fbHS/3qu0f95rM//ZaTS/6HU7f9oq9r/WJnO/2ir2v9oq9r/aKva/2ir - 2v9oq9r/aKva/2ms2v+Dv+P/XYulnwAAADAAAAAVAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGgAAADZ4rMzWe7ng/2Km - 2P9iptj/YqbY/2Km2P9coNL/Wp7S/2Km2P+BvuP/isLi/zBso/8vaZ3/MGyf/zNvof80cKH/NHCh/zRw - of80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRw - of80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRw - of80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRw - of80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/NHCh/zRwof80cKH/Mm6g/zBs - of9dnMv/odTt/2iq2v9eodL/aKra/2iq2v9oqtr/aKra/2iq2v9oqtr/aKra/4bA5P9nlbCrAAAAMQAA - ABYAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAgAAAAbAAAAN3itytd5uN//YabY/2Gm2P9iptj/YqbY/2Ck1/9Vmc7/YqbY/4G+ - 4/+JweL/QIS+/0WJwP9IjML/S5HF/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0yS - xv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0yS - xv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0yS - xv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9Mksb/TJLG/0yS - xv9Mksb/TJLG/0ySxv9Mksb/TJLG/0ySxv9KjsP/RorA/12dzP+h0+3/Z6ra/2Wp2P9go9T/Z6ra/2eq - 2v9nqtr/Z6ra/2eq2v9nqtr/frrh/2aUr6wAAAAzAAAAFwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABsAAAA4ea7N13W0 - 3v9gpdf/YKXX/2Gm2P9hptj/YabY/1CVy/9hptj/gL3i/4nA4f8/gbz/Q4a//0eLwP9KjsP/S5HF/0uR - xf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uR - xf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uR - xf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uR - xf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0uRxf9LkcX/S5HF/0iM - wf9EiL//XJvM/6HT7f9mqtn/ZqrZ/1iaz/9mqtn/ZqrZ/2aq2f9mqtn/ZqrZ/2aq2f9/u+L/Z5WxrQAA - ADUAAAAZAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAJAAAAHAAAADp6rMvYdbTe/2Ck1/9gpNf/YKTX/2Cl1/9gpdf/T5PK/2Cl - 1/9/u+L/iL/g/z2Auv9AhLv/RIi+/0eMwP9JjsL/SY7C/0mOwv9JjsL/SY7C/0mOwv9JjsL/SY7C/0yT - xv9OlMf/TpTH/02Ux/9NlMf/TpXH/1KYzP9SmMz/UpjM/1KYzP9SmMz/UpjM/1SZz/9Ql8v/T5fL/0+X - y/9Olsv/TpbL/06Wy/9MlMf/TZXK/02Vyv9Lksf/SY7C/0mOwv9JjsL/SY7C/0mOwv9JjsL/SY7C/0mO - wv9JjsL/SY7C/0mOwv9JjsL/SY7C/0mOwv9JjsL/SY7C/0mOwv9JjsL/SY7C/0mOwv9JjsL/SY7C/0mO - wv9JjsL/SY7C/0mOwv9JjsL/SY7C/0mOwv9JjsL/RovA/0CGvP9amsr/oNLt/2Wp2P9lqdj/V5nO/2Wp - 2P9lqdj/ZanY/2Wp2P9lqdj/ZanY/4G+4v95q8fMAAAANwAAABoAAAAIAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAdAAAAPHuw - y9h3td7/YKTX/2Ck1/9gpNf/YKTX/2Ck1/9Tl8z/XaHU/3+74v+Gv9//O324/z+Cuv9Bhrz/RYu//0uR - xf9Nk8b/T5XH/1WZzP9Sl8n/TJLG/0ySxv9LksX/S5HF/0uRxf9LkcX/S5HF/0qRxf9Gi8D/RovA/0aL - wP9Gi8D/RovA/0aLwP9Gi8D/RovA/0aLwP9Gi8D/RovA/0aLwP9Gi8D/RovA/0aLwP9Gi8D/RovA/0aL - wP9Gi8D/RovA/0aLwP9Gi8D/RovA/0aLwP9Gi8D/RovA/0aLwP9Gi8D/RovA/0aLwP9Gi8D/RovA/0aL - wP9Gi8D/RovA/0aLwP9Gi8D/RovA/0qQxf9KkMX/So/F/0qPxf9Kj8X/SY/F/0mPxf9IjsP/RovA/0aL - wP9Eib7/P4O6/1iZyP+f0uz/ZKjY/2So2P9Wmc7/ZanY/2Wp2P9lqdj/ZanY/2Wp2P9lqdj/fbrh/3uv - zdcAAAA5AAAAGwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAB8AAAA9grbT4ne13v9fo9f/X6PX/1+j1/9fo9f/X6PX/1md - 0v9XmtH/frvi/4a+3/86fLb/PX+5/z+Euv9DiLz/RYq9/0WKvf9Fir3/RYq9/0WKvf9Fir3/RYq9/0WK - vf9Fir3/RYq9/0WKvf9Fir3/RYq9/0WKvf9Fir3/RYq9/0WKvf9Fir3/RYq9/0WKvf9Fir3/RYq9/0WK - vf9Fir3/RYq9/0WKvf9Fir3/TJLF/0ySxf9MksX/S5HF/0uRxf9LkcX/U5jK/1OXyv9Sl8r/UpfK/1KX - yv9Mksb/SpDE/0qQxP9OlMf/T5bJ/0+Vyf9Olcj/TpXI/06UyP9NlMj/TZPI/02UyP9KkMb/SY3C/0iN - wv9IjML/SIzC/0iMwv9IjML/SIzC/0aLwP9Fir3/RYq9/0GGu/8+gLn/V5fG/5/S7P9jp9j/Y6fY/1ib - 0P9kqNj/ZKjY/2So2P9kqNj/ZKjY/2So2P96uOD/fbHM2AAAADsAAAAdAAAACQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAHwAA - AD6RyOf/eLbf/16i1v9eotb/XqLW/1iazP9Ul8b/XqLW/1CVzP99uuH/hLvd/zR2rf83eq//On2y/z2A - s/8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6C - tP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6C - tP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6C - tP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6CtP8+grT/PoK0/z6C - tP8+grT/PH6y/zd6sP9Sk8D/n9Ls/2Km2P9iptj/W5/S/1WWwf9go9L/Y6fY/2On2P9jp9j/Y6fY/3q5 - 4P9/ss3YAAAAPQAAAB4AAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAgAAAAP5PK6P9rrNv/XaLW/12i1v9dotb/O3ab/ypd - ev9antH/UJbM/3y64f+Butr/L22h/zJxo/80c6X/N3en/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4 - qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4 - qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4 - qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4 - qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP83eKj/N3io/zd4qP81dab/MnGk/02LuP+e0uz/YqbY/2Km - 2P9Mjbz/LV97/0mGrf9iptj/YqbY/2Km2P9iptj/erng/4q+2ewAAAA+AAAAHwAAAAoAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACwAA - ACEAAABAlcvo/2us2/9dodb/XaHW/12h1v9Ul8f/Sou4/12h1v9dodb/fLrh/4G63P8ycqr/NHWs/zd5 - rf86fLD/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9 - sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9 - sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9 - sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9sf87fbH/O32x/zt9 - sf87fbH/O32x/zd6rv81dqz/QYGz/4vD4v9hptj/YabY/16h0v9KirL/X6LS/2Gm2P9iptj/YqbY/2Km - 2P9yst3/lcvo/wAAAEEAAAAhAAAADAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAAIgAAAEKXzOn/a6zb/1yh1v9codb/XKHW/1yh - 1v9codb/XKHW/1yh1v9codb/TJHK/1WZ0P9dodb/XaHW/12h1v9YntP/WJ7T/1ie0/9dodb/XaHW/12h - 1v9dodb/XaLW/12i1v9dotb/XaLW/12i1v9dotb/XaLW/12i1v9dotb/XaLW/12i1v9eotb/XqLW/16i - 1v9eotb/XqLW/16i1v9eotb/XqLW/16i1v9eotb/XqLW/1+j1/9fo9f/X6PX/1+j1/9fo9f/X6PX/1+j - 1/9fo9f/X6PX/1+j1/9fo9f/YKTX/2Ck1/9gpNf/YKTX/2Ck1/9gpNf/YKTX/2Ck1/9gpNf/YKTX/2Ck - 1/9gpNf/YKTX/2Ck1/9gpNf/YKTX/2Ck1/9gpNf/YKTX/2Ck1/9gpNf/YKXX/2Cl1/9gpdf/VpnP/0uP - x/9eotX/YKXX/2Cl1/9gpdf/YKXX/2Cl1/9hptj/YabY/26v3P+XzOn/AAAARAAAACMAAAANAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA - AA4AAAAkAAAARZjN6v9qrNv/W6HV/1uh1f9bodX/W6HV/1uh1f9bodX/VpvS/0iLxv9Wm9L/W6HV/1yh - 1v9codb/XKHW/1ee0/9XntP/V57T/1ee0/9WndP/VJvS/1Sb0v9Um9L/VJvS/1Ob0v9Tm9L/VJvS/1Sb - 0v9Um9L/VJvS/1ad0/9YntP/VZzS/1Sb0v9Um9L/VJvS/1Sb0v9Um9L/VJvS/1Sb0v9Yn9P/WJ7T/1ie - 0/9YntP/WJ7T/1ie0/9bodX/XqLW/16i1v9eotb/XqLW/16i1v9eotb/XqLW/16i1v9eotb/X6PX/1+j - 1/9fo9f/X6PX/1+j1/9fo9f/X6PX/1+j1/9fo9f/X6PX/2Ck1/9gpNf/YKTX/2Ck1/9gpNf/YKTX/2Ck - 1/9gpNf/YKTX/2Ck1/9gpNf/YKTX/2Ck1/9gpNf/XaHU/0iLxf9YnNH/YKTX/2Ck1/9gpNf/YKTX/2Ck - 1/9gpdf/bq/c/5jN6v8AAABGAAAAJQAAAA4AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAADgAAACYAAABHm9Ds/2us2/9aodX/WqHV/1qh - 1f9aodX/WqHV/0eLxv9Hi8b/WqHV/1qh1f9aodX/WqHV/02RwP9XnND/W6HV/1uh1f9bodX/W6HV/1uh - 1f9bodX/W6HV/1uh1f9bodX/XKHW/1yh1v9codb/XKHW/1yh1v9codb/XKHW/1yh1v9codb/XKHW/1yh - 1v9dodb/XaHW/12h1v9dodb/XaHW/12h1v9dodb/XaHW/12h1v9dodb/XaHW/12i1v9dotb/XaLW/12i - 1v9dotb/XaLW/12i1v9dotb/XaLW/12i1v9eotb/XqLW/16i1v9eotb/XqLW/16i1v9eotb/XqLW/16i - 1v9eotb/XqLW/1+j1/9fo9f/X6PX/1+j1/9fo9f/X6PX/1+j1/9fo9f/WZvM/1WXxv9fo9f/YKTX/2Ck - 1/9gpNf/YKTX/0qOx/9Kjsf/YKTX/2Ck1/9gpNf/YKTX/2Ck1/9ur9z/m9Ds/zhRW18AAAAmAAAAEAAA - AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAMAAAAPAAAAJll5inad0uz/YabY/1mf1P9aodX/WqHV/0+Wzf8/g8D/U5jQ/1qh1f9aodX/WqHV/1qh - 1f9Slcb/Kl57/z56o/9aodX/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/W6HV/1uh - 1f9bodX/W6HV/1uh1f9bodX/W6HV/1uh1f9bodX/W6HV/1uh1f9codb/XKHW/1yh1v9codb/XKHW/1yh - 1v9bodb/WZ/U/1mf1P9Zn9T/WZ/U/1mf1P9Zn9T/WZ/U/1mf1P9Zn9T/WZ/U/1mf1P9Zn9T/WZ/U/1mf - 1P9Zn9T/WZ/U/1mf1P9Zn9T/WZ/U/12i1v9dotb/XaLW/12i1v9dotb/XaLW/16i1v9eotb/XqLW/16i - 1v9eotb/XqLW/16i1v83b5P/LF98/16i1v9eotb/X6PX/1+j1/9fo9f/X6PX/1KXzP8/gb7/Wp/S/1+j - 1/9fo9f/X6PX/1+j1/+d0uz/WXmIeAAAACgAAAAQAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAABAAAAAnW3mKdp/S7P9mqtn/WJ7T/1ab - 0v9EiMT/RIfD/1ab0v9Zn9T/WZ/U/1mf1P9Zn9T/WZ/U/1mf1P9FhbL/UJTG/1qh1f9aodX/WqHV/1qh - 1f9aodX/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/WqHV/1qh - 1f9aodX/WqHV/1qh1f9bodX/W6HV/1uh1f9bodX/W6HV/1uh1f9ZoNT/WJ7T/1ie0/9YntP/WJ7T/1ie - 0/9YntP/WJ7T/1if1P9Yn9T/WJ/U/1if1P9Yn9T/WJ/U/1if1P9Yn9T/WJ/U/1if1P9Zn9T/WZ/U/1mf - 1P9ZntT/WZ7U/1me1P9ZntT/WZ7U/1mf1P9Zn9T/WZ/U/1mf1P9bodX/XaLW/1CTwf9Mj7z/XaLW/12i - 1v9dotb/XqLW/16i1v9eotb/XqLW/1md0v8/gL7/TJHI/16i1v9eotb/XqLW/5/S7P9aeYZ6AAAAKgAA - ABIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAADAAAADwAAACZbeYp2oNPt/3Oz3f9Lksr/Ony7/0uRyv9YntP/WJ7T/1ie0/9YntP/WJ7T/1ie - 0/9YntP/WJ7T/1ie0/9YntP/WJ7T/1mf1P9Zn9T/WZ/U/1mf1P9Zn9T/WZ/U/1mf1P9Zn9T/WZ/U/1mf - 1P9Zn9T/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/WqHV/1qh - 1f9aodX/WqHV/1qh1f9aodX/WqHV/1qh1f9aodX/WqHV/1uh1f9bodX/W6HV/1uh1f9bodX/W6HV/1uh - 1f9bodX/W6HV/1uh1f9codb/XKHW/1yh1v9codb/XKHW/1yh1v9codb/XKHW/1yh1v9codb/XKHW/12h - 1v9dodb/XaHW/12h1v9dodb/XaHW/12h1v9dodb/XaHW/12h1v9dodb/XaLW/12i1v9dotb/XaLW/12i - 1v9GisT/QYXA/1ug1P9yst3/oNPt/1p5hnoAAAArAAAAEgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAOAAAAJF59jHSYy+b/mMbf/4nA - 3f+95/X/w+z3/8Ps9//D7Pf/w+z3/8Ps9//D7Pf/w+z3/8Ps9//D7Pf/w+z3/8Ps9//D7Pf/w+z3/8Ps - 9//D7Pf/w+z3/8Xs9//F7Pf/xez3/8Xs9//F7Pf/xez3/8Xs9//F7Pf/xez3/8Xs9//F7Pf/xez3/8Xs - 9//F7Pf/xez3/8Xs9//F7Pf/xez3/8Xs9//F7Pf/xez3/8Xs9//F7Pf/xez3/8Xs9//F7Pf/xez3/8Xs - 9//F7Pf/xez3/8Xs9//F7Pf/xez3/8Xs9/+l1+7/pdfu/6XX7v+m2O7/ptju/6bY7v+m2O7/ptju/6bY - 7v+m2O7/ptju/6bY7v+m2O7/ptju/6bY7v+m2O7/ptju/6bY7v+m2O7/ptju/6bY7v+m2O7/ptju/6bY - 7v+m2O7/p9jv/6fY7/+n2O//p9jv/6fY7/+n2O//p9jv/6fY7/+MxOH/Y6HN/6TS5/+n1ez/XYGVhAAA - ACoAAAASAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAwAAAAhTW+GcFSRwv9mos3/nc/o/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW - 7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW - 7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW - 7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW7v+h1u7/odbu/6HW - 7v+h1u7/j8jo/5bP7P+c1O//nNTv/5zU7/+c1O//nNTv/5zU7/+c1O//nNTv/5zU7/+c1O//nNTv/5zU - 7/+c1O//nNTv/53U7/+d1O//ndTv/53U7/+d1O//ndTv/53U7/+d1O//ndTv/53U7/+d1O//ndXv/53V - 7/+d1e//ndXv/53V7/+bz+n/ZKHL/2eizP9xnbakAAAAJgAAABAAAAADAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACQAAABtgh5VqmM3q/366 - 4P90sdn/cq7Y/4O94v+Jw+X/i8Tl/4vF5f+Mxub/jcbn/5DH5/+RyOf/k8ro/5bM6f+XzOn/l8zp/5jN - 6v+az+v/m9Ds/5zR7P+d0ez/ntLs/5/S7P+f0uz/oNLs/6HT7f+h1O3/odTu/6TV7v+k1u7/ptfu/6fY - 7/+n2O//qdjv/6nZ8P+q2vD/q9vw/6zb8f+t3PH/rd3x/63d8f+u3fH/r93x/7Dd8f+x3fH/sd3y/7He - 8v+y3vL/st7y/7Pg8/+z4PP/st7y/7Le8v+y3vL/sd7y/7Hd8f+w3fH/sN3x/6/d8f+u3fH/rd3x/63d - 8f+t3PH/rNvx/6va8P+q2vD/qdnw/6jY7/+n2O//ptju/6XX7v+k1u7/pNXu/6HU7v+h1O3/oNPt/6DS - 7P+f0uz/n9Ls/57S7P+c0ez/nNHs/5rP6/+az+v/mM3q/5fM6f+XzOn/icHi/3653f+EvN//jMXj/3qk - t5QAAAAhAAAADAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAGAAAAFVZ6i1aTyuj/hMDj/4bA5P+FwOP/erfd/5HE4v/G3+7/x+Hv/8fi - 7//I4u//yOLv/8ni7//J4u7/yeLu/8vj7v/L4+7/zOTv/8zk7//M5PD/zOXw/83l8f/N5fH/zuXx/87l - 8f/Q5vH/0Obx/9Hn8f/R5/H/0efx/9Ln8f/S5/H/0ufx/9Ln8f/S6PH/0ujx/9Lo8v/T6PL/0+ny/9Xp - 8v/V6fL/1erz/9bq8//W6/P/1uvz/9Ln8P/H3+f/1+vz/9fr8//Y7PP/2Ozz/9js8//Y7PP/2Ozz/9fr - 8//X6/P/1+vz/9fr8//W6/P/1uvz/9bq8//V6vP/1eny/9Xp8v/T6fP/0+nz/9Pp8//T6fP/2e73/9nu - 9//N6fX/yOb1/8fm9f/H5vX/xuX0/8bl9P/G5fT/xeTz/8Pk8//D4/P/wuLz/8Hi8v/A4vL/wODx/8Dh - 8f++3/H/q9Xs/4fA4v9/ud3/ksnn/5HH5/+Vy+j/eqe8jgAAABoAAAAIAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAPAAAAJozA - 3+iFwOP/hsDk/6HS7P+HweT/mMjk/06Do/8mX4v/Jl+L/yZfi/8mX4v/Jl+L/xpJbv8eUHb/HlB2/x5Q - dv8eUHb/HlB2/yhcff9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5 - lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0d3kP8+an//Ml1y/zJd - cv82YXb/RHKJ/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5 - lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5lP9IeZT/SHmU/0h5 - lP9IeZT/SHmU/06Do/9Og6P/ToOj/06Do/9Og6P/ToOj/06Do/+bxt3/odHr/4vD5P+RyOf/kMfn/5PK - 6P8pQEk4AAAAEwAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAoAAAAdeafBnIjC5f+FwOP/odLs/4fB5P+dzen/d6S9/ydi - jf8nYo3/J2KN/ydijf8nYo3/G0xw/x9UeP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9U - eP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9U - eP8fVHj/H1R4/x9UeP8bTG//FkNh/xZDYP8WQ2D/FkNg/xZDYP8WQ2D/GUdm/x5Tdv8fVHj/H1R4/x9U - eP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9U - eP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9UeP8fVHj/H1R4/x9UeP8bTHD/J2KN/ydijf8nYo3/J2KN/ydi - jf8nYo3/LmmU/73e8f+k0uz/hr/h/5HI5/+Qx+f/gbTRwwAAACEAAAAMAAAAAwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAA - ABVAXG5IicPl/4XA4/+Rx+f/odLs/5DH5v+hxtn/KmWQ/yplkP8qZZD/KmWQ/yplj/8eT3L/Ild6/yJX - ev8iV3r/Ild6/yJXev8iV3r/Ild6/yJXev8iV3r/Ild6/yJXev8iV3r/Ild6/yJXev8iV3r/Ild6/yJX - ev8iV3r/Ild6/yJXev8iV3r/Ild6/yJXev8iV3r/Ild6/yJXev8iVnr/G0tr/xlGY/8ZRmP/HkBi/yA9 - Yf8eP2L/G0Ni/xlGY/8ZRmP/GkZl/x5Ocf8iV3r/Ild6/yJXev8iV3r/Ild6/yJXev8iV3r/Ild6/yJX - ev8iV3r/Ild6/yJXev8iV3r/Ild6/yJXev8iV3r/Ild6/yJXev8iV3r/Ild6/yJXev8iV3r/Ild6/yJX - ev8iV3r/Ild6/x5Pcv8qZZD/KmWQ/yplkP8qZZD/KmWQ/yplkP9blLX/w+Ly/5XL6P9/ut7/kcfn/43G - 5/9ql7GAAAAAGAAAAAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADgAAACR8ttbchcDj/4bA5P+r2O7/iMLl/6nO - 4v9HfqH/LWiT/y1ok/8taJP/LGaO/yBSdf8kWn3/JFp9/yRaff8kWn3/JFp9/yRaff8kWn3/JFp9/yRa - ff8kWn3/JFp9/yRaff8kWn3/JFp9/yRaff8kWn3/JFp9/yRaff8kWn3/JFp9/yRaff8kWn3/JFp9/yRa - ff8kWn3/IlZ3/x1Laf8bSmf/G0pn/x9NZv84pID/keC6/5Dguv86m3//IEVm/xtKZ/8bSmf/G0pn/x5O - bv8jWXv/JFp9/yRaff8kWn3/JFp9/yRaff8kWn3/JFp9/yRaff8kWn3/JFp9/yRaff8kWn3/JFp9/yRa - ff8kWn3/JFp9/yRaff8kWn3/JFp9/yRaff8kWn3/JFp9/yRaff8kWn3/IFJ1/y1ok/8taJP/LWiT/y1o - k/8taJP/LWiT/4m30P+z2u7/ksnn/3653f+Qx+f/gbze9AAAACgAAAARAAAABAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAJAAAAG2eZto+EwOP/hsDk/6jX7f+LxeX/qdLq/2OVsv8wbJf/MGyX/zBsl/8vaZL/IlV5/ydd - gf8nXYH/J12B/yddgf8nXYH/J12B/yddgf8nXYH/J12B/yddgf8nXYH/J12B/yddgf8nXYH/J12B/ydd - gf8nXYH/J12B/yddgf8nXYH/J12B/yddgf8nXYH/Jlx//yJTc/8eTWz/Hk1s/x5NbP8jUGv/RsCL//H7 - 9f/+/v7//v7+/+/69f9Ir4v/IlJr/x5NbP8eTWz/Hk1s/x9Obv8kWXr/J12B/yddgf8nXYH/J12B/ydd - gf8nXYH/J12B/yddgf8nXYH/J12B/yddgf8nXYH/J12B/yddgf8nXYH/J12B/yddgf8nXYH/J12B/ydd - gf8nXYH/J12B/yddgf8iVXn/MGyX/zBsl/8wbJf/MGyX/zBsl/8wbJf/udzt/6XS7P+Lw+T/hb7h/4zG - 5v90qMi2AAAAHgAAAAsAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAAUOlttRn+84v+FwOP/j8fn/6HS - 7P+ezun/hbDH/zRvmf80b5n/NG+Z/zJslP8mWHv/KmCE/ypghP8qYIT/KmCE/ypghP8qYIT/KmCE/ypg - hP8qYIT/KmCE/ypghP8qYIT/KmCE/ypghP8qYIT/KmCE/ypghP8qYIT/KmCE/ypghP8qYIT/KmCE/yhe - gP8iVHP/IlNx/yJTcf8jU3H/I2Ru/2XFnP/x+vX/9vz5/9/56v/e+Or/9fz5//n9+/9yyKT/JlZw/yJT - cf8iU3H/IlNx/yJTcf8kV3f/KV+D/ypghP8qYIT/KmCE/ypghP8qYIT/KmCE/ypghP8qYIT/KmCE/ypg - hP8qYIT/KmCE/ypghP8qYIT/KmCE/ypghP8qYIT/KmCE/ypghP8qYIT/KmCE/yZYe/8zbpf/NG+Z/zRv - mf80b5n/NG+Z/1WOsP/G4/L/lcvo/4jA4v+HwOL/hcDk/0ZshFcAAAAWAAAABwAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAwAAAA4AAAAjbKXIxIO/4/+GwOT/qNju/5HH5v+pzN3/N3Kb/zdym/83cpv/NW+X/yha - fv8tY4j/LWOI/y1jiP8tY4j/LWOI/y1jiP8tY4j/LWOI/y1jiP8tY4j/LWOI/y1jiP8tY4j/LWOI/y1j - iP8tY4j/LWOI/y1jiP8tY4j/LWOI/y1ih/8pXX7/Jld3/yZXd/8mV3f/JlZ3/ydmcv9u1aL/9/36//H8 - 9v/E9Nj/wPPW/8Dz1v/C9Nj/5fru//H89/9wxqL/KGB0/yZXd/8mV3f/Jld3/yZXd/8mWHf/KmCD/y1j - iP8tY4j/LWOI/y1jiP8tY4j/LWOI/y1jiP8tY4j/LWOI/y1jiP8tY4j/LWOI/y1jiP8tY4j/LWOI/y1j - iP8tY4j/LWOI/y1jiP8tY4j/KFp+/zVvl/83cpv/N3Kb/zdym/83cpv/ibbO/7Xc7/+Syef/h8Di/4a/ - 4f90sNXoAAAAJQAAAA8AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACAAAABpWiamCfbrh/4XA - 4/+h0+z/i8Tl/7DS5v9Ui6z/O3ae/zt2nv83c5n/Kl6B/zBni/8wZ4v/MGeL/zBni/8wZ4v/MGeL/zBn - i/8wZ4v/MGeL/zBni/8wZ4v/MGeL/zBni/8wZ4v/MGeL/zBni/8wZ4v/MGeL/zBni/8uZYf/KV58/ylc - ev8pXHr/KVx6/ypbev8ncHT/atOg/+/89f/f+ev/v/PV/8Dz1v/A89b/wPPW/8Dz1v+68tL/2vjn/+n7 - 8/9o05//KGp2/ylcev8pXHr/KVx6/ylcev8pXHr/LGCA/y9niv8wZ4v/MGeL/zBni/8wZ4v/MGeL/zBn - i/8wZ4v/MGeL/zBni/8wZ4v/MGeL/zBni/8wZ4v/MGeL/zBni/8wZ4v/MGeL/zBni/8qXoH/N3OZ/zt2 - nv87dp7/O3ae/zt2nv+z1uj/odDp/5LJ5/99ud3/h8Hk/2CWt5wAAAAcAAAACgAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAAFAAAAEyA3RDh1tN7/gb3i/4vE5f+c0ez/rtbt/2+guv8+eqH/Pnqh/zx3 - nP8uYoX/NGuO/zRrjv80a47/NGuO/zRrjv80a47/NGuO/zRrjv80a47/NGuO/zRrjv80a47/NGuO/zRr - jv80a47/NGuO/zRrjv8zao3/MGWH/yxgf/8sYH//LGB//yxgf/8uXn7/JoB0/37frP/m+vH/1/fl/7ny - 0f+/89X/wPPW/8Dz1v/A89b/wPPW/7ry0v+y8cz/yfXd/+D67v+X37z/KXR4/yxgf/8sYH//LGB//yxg - f/8sYH//LGGA/zJoi/80a47/NGuO/zRrjv80a47/NGuO/zRrjv80a47/NGuO/zRrjv80a47/NGuO/zRr - jv80a47/NGuO/zRrjv80a47/NGuO/y5ihf88d5z/Pnqh/z56of8+eqH/Toms/8fk8v+MxOT/kcjn/3q2 - 3P96ueD/MlNsRwAAABQAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAMAAAAIV+b - xMN+uuH/e7je/6DT7f+fzun/k7rQ/0B8o/9AfKP/P3qf/zBkh/83bpH/N26R/zdukf83bpH/N26R/zdu - kf83bpH/N26R/zdukf83bpH/N26R/zdukf83bpH/N26R/zdukf83bpH/NWyP/zJniP8wZYX/MGWF/zBl - hf8wZYX/NGOF/ySIdf+R5Ln/3Prs/7701f+v8cr/tvHP/7zy0//A89b/wPPW/8Dz1v++89T/uPLQ/7Dx - y/+p8Mb/uPPR/9f56f+N5Lf/J4J3/zBlhf8wZYX/MGWF/zBlhf8wZYX/MGWF/zNpi/82bpD/N26R/zdu - kf83bpH/N26R/zdukf83bpH/N26R/zdukf83bpH/N26R/zdukf83bpH/N26R/zdukf83bpH/MGSH/z96 - n/9AfKP/QHyj/0B8o/99rcf/rdPq/4vE5f+Rx+f/gLvg/2ajztsAAAAjAAAADgAAAAMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAgAAAAZToOpgHi23/93s9v/ls3q/5DG5v+00+T/RYCn/0WA - p/9DfqL/NGiL/ztylf87cpX/O3KV/ztylf87cpX/O3KV/ztylf87cpX/O3KV/ztylf87cpX/O3KV/zty - lf87cpX/O3KV/zdvj/81a4v/NWuL/zVri/81a4v/NWuL/zhoiv8dmm3/i+Kz/9L45/+z8s7/pO/C/6vw - x/+y8cz/t/HQ/7vy0v+989T/u/LT/7jy0f+y8cz/rPDI/6bvw/+f7r7/rvHL/8n34f+H4rL/J4p3/zVr - i/81a4v/NWuL/zVri/81a4v/NWuL/zZsi/84cJL/O3KV/ztylf87cpX/O3KV/ztylf87cpX/O3KV/zty - lf87cpX/O3KV/ztylf87cpX/O3KV/ztylf80aIv/Q36i/0WAp/9FgKf/RYCn/7DS5P+UxOL/kcfn/5DH - 5/96uN7/TYKogQAAABkAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAA - ABIAAAAqZqfU9Hq43f9/u+H/hsDk/7jY6v9il7b/SYWq/0aBpf83a43/PnaX/z52l/8+dpf/PnaX/z52 - l/8+dpf/PnaX/z52l/8+dpf/PnaX/z52l/8+dpf/PnaX/zx1lv86cZH/OHCP/zhwj/84cI//OHCP/zhw - j/86cIv/LJ92/47kt//E9t7/ne6//5ntuv+g7sD/pu/E/6zwx/+x8cv/s/HN/7Xxzv+08c3/svHM/63x - yP+o78X/oe7A/5rtu/+U7Lb/l+26/7/12/+f68X/Kp15/zpwj/84cI//OHCP/zhwj/84cI//OHCP/zhw - j/87c5P/PXaX/z52l/8+dpf/PnaX/z52l/8+dpf/PnaX/z52l/8+dpf/PnaX/z52l/8+dpf/PnaX/zdr - jf9GgaX/SYWq/0mFqv9XkLL/y+X0/4G63f+Qx+f/j8fn/26v3f8cM0U3AAAAEgAAAAUAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAADAAAACBTkL22fbrh/3Sx2f+GwOT/r9ft/3yr - xP9LiKz/SoWp/zhvkP9Aepv/QHqb/0B6m/9Aepv/QHqb/0B6m/9Aepv/QHqb/0B6m/9Aepv/QHqb/0B6 - m/8/eJj/PXWV/z11lf89dZX/PXWV/z11lf89dZX/P3SR/yCsav+a6sH/ufXY/5Lst/+N7LL/ley3/5vt - u/+h7sD/pe/D/6rwxv+s8Mj/rfHJ/6zwyP+q8Mb/pu/E/6HuwP+c7bz/luy4/4/ss/+I667/jOyz/7H0 - 0v+W6cD/LJ54/zt4kf89dZX/PXWV/z11lf89dZX/PXWV/z11lf8+dpf/QHmZ/0B6m/9Aepv/QHqb/0B6 - m/9Aepv/QHqb/0B6m/9Aepv/QHqb/0B6m/9Aepv/OG+Q/0aBpP9LiKz/S4is/4Oyy/+43fD/erTb/4/H - 5/+IwuX/U5C9tgAAACAAAAAMAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAHAAAAFz90mnJvr93/cq/Y/4O+4v+gzur/nsTY/0+LsP9MiKv/PXOT/0V9nv9FfZ7/RX2e/0V9 - nv9FfZ7/RX2e/0V9nv9FfZ7/RX2e/0V9nv9FfZ3/Q3qZ/0F6mf9Bepn/QXqZ/0F6mf9Bepn/QXqZ/0B7 - kP8gqmj/kei9/6fyzP9/6qn/guqq/4nrr/+P7LP/ley4/5rtu/+f7r7/ou7A/6Tvwv+l78P/pO/C/6Lv - wf+g7r//m+28/5fsuf+Q7LT/i+uw/4Pqq/986ab/eumk/6Lxyf+N57r/IKpr/z97lf9Bepn/QXqZ/0F6 - mf9Bepn/QXqZ/0F6mf9Bepn/Q3ub/0V9nv9FfZ7/RX2e/0V9nv9FfZ7/RX2e/0V9nv9FfZ7/RX2e/0V9 - nv89c5P/SoSn/0+LsP9Pi7D/stPl/6nU7P98ud3/jcbn/3i33/8/dJpyAAAAFwAAAAcAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAAKFmc0PR8ud//eLTc/5DG - 5v+92un/VI+y/1CMrv9Adpf/SYGh/0mBof9JgaH/SYGh/0mBof9JgaH/SYGh/0mBof9JgaH/SYGh/0d/ - n/9Hf5//R3+f/0d/n/9Hf5//R3+f/0d/n/9BgpH/LLlt/4jnuP+c8cb/c+eh/3boov996af/g+qr/4rr - r/+O7LP/lOy2/5ftuf+a7bv/nO69/53uvf+d7r3/m+27/5jtuf+V7Lf/kOy0/4vrsP+F6qz/fumo/3jo - o/9x557/beec/5PwwP+U7sT/NLJ5/0SAm/9Hf5//R3+f/0d/n/9Hf5//R3+f/0d/n/9Hf5//SICg/0mB - of9JgaH/SYGh/0mBof9JgaH/SYGh/0mBof9JgaH/SYGh/0B2l/9Niar/VI+y/2CYuP/M5fL/kMbl/4W/ - 4v+Nxuf/Wp3R9AAAACcAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAgAAAAsAAAAeRIOyqXq44P9sqtX/hcDj/73d7f9wo8D/VI6w/0R6mv9MhqX/TIal/0yG - pf9MhqX/TIal/0yGpf9MhqX/TIal/0yGpf9MhqT/TIak/0yGpP9MhqT/TIak/0yGpP9MhqT/R4aV/ym2 - af+O7cD/he21/2fnmP9q55n/ceee/3joov996af/g+qq/4jrrv+M7LL/kOy0/5Pstv+U7Lf/ley4/5Xs - t/+T7Lb/kOy0/43ssv+J66//hOqr/37pqP956KP/cuef/2vnmv9k5pb/XeSQ/3/ssv+K7L//KLVs/z6I - lf9MhqT/TIak/0yGpP9MhqT/TIak/0yGpP9MhqT/TIak/0yGpf9MhqX/TIal/0yGpf9MhqX/TIal/0yG - pf9MhqX/RHqa/1KMrP9YlLb/ibfP/8Hh8f+HwOL/hL7i/4G+4v9Eg7KpAAAAHgAAAAoAAAACAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABwAAABYpVHdYZanY/3Ow - 2v98ud//sdft/4u5zv9XkLD/SH2d/1KKqf9Siqn/Uoqp/1KKqf9Siqn/Uoqp/1KKqf9Siqn/Uoqp/1KK - qf9Siqn/Uoqp/1KKqf9Siqn/U4qp/zyPhv8it2D/hOy7/3rsr/9W44z/XeWR/2Tmlv9r55r/cuef/3fo - ov986ab/geqq/4XqrP+I667/i+uw/4zssv+M7LL/jOyy/4vrsf+J66//huqs/4Lqqv996af/eOij/3Pn - oP9s55v/ZuaX/1/lkv9Y5I3/T+KI/3DqqP9/7Ln/J7Np/0OLmP9Siqn/Uoqp/1KKqf9Siqn/Uoqp/1KK - qf9Siqn/Uoqp/1KKqf9Siqn/Uoqp/1KKqf9Siqn/Uoqp/1KKqf9IfZ3/V5Cw/12Xuf+11eX/qdTs/365 - 3v+Gv+L/aaza/ypWelYAAAAVAAAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAADAAAAEAAAACZLksnofbrg/26s1/+gzun/qsze/1uVs/9LgaD/VY2r/1WN - q/9Vjav/VY2r/1WNq/9Vjav/VY2r/1WNq/9Vjav/VY2r/1WNq/9Vjav/VY2r/1WMq/8/kIf/Lr1r/3rr - tv9h55v/SeKD/1Diif9Y5I3/XuWS/2Xmlv9r55r/cOee/3Xoof966KT/femn/4Dpqf+C6qr/hOqr/4Tq - q/+E6qv/g+qq/4Dpqf996af/euik/3boof9x55//bOeb/2bml/9g5ZL/WeSO/1Ljiv9K4oT/Q+F//1fm - lP967rn/NMB2/zeRif9Vjav/VY2r/1WNq/9Vjav/VY2r/1WNq/9Vjav/VY2r/1WNq/9Vjav/VY2r/1WN - q/9Vjav/VY2r/0uBoP9blbP/bKPA/83l8f+Vyuf/erXc/4vF5f9Nk8noAAAAJQAAAA8AAAADAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAKAAAAHjl5 - sKl2td7/bKrV/4/F5f/F3uz/X5i3/0+Go/9ak6//WpOv/1qTr/9ak6//WpOv/1qTr/9ak6//WpOv/1qT - r/9ak6//WpOv/1qTr/9bkq//LZds/zK/bv917bf/T+WQ/zvgev9D4X//SuKE/1Ljif9Y5I3/XuWR/2Tm - lv9p5pj/buec/3Lnn/916KH/eOij/3ropP976aX/e+mm/3vppf966KX/eeij/3boof9z56D/b+ec/2rn - mf9l5pb/X+WS/1nkjv9T44r/S+KF/0XigP894Hv/NN93/0nkjP9v7bT/L75v/zqTi/9ak6//WpOv/1qT - r/9ak6//WpOv/1qTr/9ak6//WpOv/1qTr/9ak6//WpOv/1qTr/9ak6//T4aj/16Xtf+QvNL/w+Hx/4zG - 5v91sdn/dbTe/zNvo5AAAAAcAAAACgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAWGD9eSV2h1v9zsNr/drPc/8Lf7v96q8T/U4mm/16W - sv9elrL/Xpay/16Wsv9elrL/Xpay/16Wsv9elrL/Xpay/16Wsv9elrL/YJWy/y6XbP8svWr/ZOyt/zji - f/8t3nL/Nd93/z3ge/9E4YD/SuKF/1Ljif9X44z/XeSQ/2HllP9m5pf/aueZ/23nm/9w553/cuef/3Pn - oP9z56D/c+eg/3Lnn/9w557/buec/2vnmf9n5pf/YuWU/17lkf9Y5I3/U+OK/0zihf9F4oH/PuF8/zbf - eP8u3nP/Jt1u/y3fd/9f66r/Kbtr/yqWcv9elrL/Xpay/16Wsv9elrL/Xpay/16Wsv9elrL/Xpay/16W - sv9elrL/Xpay/16Wsv9Tiab/YZm2/7TU5P+q1Oz/i8Xl/3m03P9dodb/GUJiRgAAABQAAAAGAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAA - AA8AAAAjP4fB24C94v9urNf/stjt/5W+0v9Xi6r/Ypm2/2KZtv9imbb/Ypm2/2KZtv9imbb/Ypm2/2KZ - tv9imbb/Ypm2/16Xr/8bmFP/MMRz/1jqp/8k3nL/Hd1o/ybdbv8u3nP/Nd93/z3ge/9E4YD/SuKE/0/i - iP9V44v/WuSO/17lkf9i5ZT/ZeaW/2fml/9p5pj/aueZ/2rnmv9q55n/aeeY/2fml/9l5pf/YuWU/1/l - kv9b5I//VuOL/1Diif9L4oX/ReKA/z7hfP834Hj/L950/yfdb/8e3Wn/FNxk/x3ebv9T6aT/Ns2A/yyW - c/9imbb/Ypm2/2KZtv9imbb/Ypm2/2KZtv9imbb/Ypm2/2KZtv9imbb/Ypm2/1eLqv9robv/0efy/5TJ - 5/+LxeX/erfd/zqBucIAAAAgAAAADgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABYvd7ivaqzb/3Sx2/+Rw+L/stfn/5TG - 2f+Uxdn/lMXZ/5TF2f+Uxdn/lMXZ/5TF2f+Txdn/k8XZ/5PF2f+Kvs//HpZO/zLMe/9D55f/ENxl/wvb - X/8U3GT/Ht1p/yfdbv8u3nP/Nd93/zzge/9B4X//SOKD/03ihv9S44n/VuOL/1nkjv9c5JD/XuWR/2Dl - k/9h5ZP/YeWU/2HllP9g5ZP/X+WS/1zkkP9a5I7/V+OM/1Pjiv9N4of/SeKD/0ThgP894Hv/NuB4/y/f - dP8o3W//H91q/xfcZf8N22D/Atpb/wjZXv8+5pb/Lct7/x2WXP99uMv/iLzV/4i81f+IvNT/iLzU/4i8 - 1P+Hu9T/h7vU/4e71P+Hu9T/hrvU/5DB2f+x1er/gLvg/4W+4v9rrdv/LXOulAAAABQAAAAIAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEAAAAFAAAADCJjm1JMk8z/bqzX/3y53/+XzOj/nNHs/53R7P+d0ez/ndLs/53S7P+d0uz/ntLs/57S - 7P+e0uz/h8bQ/xOYPv8oynf/OOWS/wjYXP8A2Fn/Atpb/w3bYP8W3GX/Ht1p/yfdbv8t3nL/NN92/zrg - ev8/4X3/ReKA/0nig/9N4ob/UOKI/1Pjiv9V44v/V+SM/1jkjf9Y5I3/WOSN/1fkjP9W44v/VOOL/1Di - if9N4of/SuKE/0bigf9A4X3/O+B6/zXfd/8v3nP/KN1v/yDdav8X3Gb/Dtth/wTaXP8A2Fr/ANdY/wbX - W/8z5JD/Jsl3/yecZv+NyOD/lszp/5XL6f+Vy+j/lMro/5PK6P+Tyuj/k8no/5LJ5/+SyOf/kcjn/4zG - 5v+Au+D/c7DY/0aLxv8ybJtCAAAACwAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAC2GbxXt/u+L/f7vi/4C9 - 4v+DvuP/g7/j/4TA4/+GwOT/hsDk/4bA5P+HweT/iMLl/3S2yf8RmED/IM14/yfhhP8G1Vn/ANVW/wDX - WP8A2Fn/Atpc/w3bYP8W3GX/Ht1p/yTdbf8s3nH/Mt91/zfgeP884Hr/QOF9/0TigP9H4oL/SuKE/0zi - hf9N4of/TuKH/0/iiP9O4of/TeKH/0zihv9K4oT/SOKD/0XigP9B4X7/PeB7/zfgef8z33X/Ld5y/ybd - bv8f3Wr/F9xl/w7bYf8E2lz/ANla/wDYWP8A1lb/ANNV/wDSU/8f3n3/ItaD/x6ZW/92vMr/kcfn/5DH - 5/+Px+f/j8fn/43G5/+Mxub/i8Xl/4vF5f+LxOX/isPl/4nD5f+EveDxXZjDawAAAAoAAAAFAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAADAAAABz1whRlpocRJaaDCS2qcuU1jlbFSXYukWld9mGZLb4d3Q2J2ijxZ - aZ0teWLVEJY8/xrWfv8a3Xr/ANBQ/wDSU/8A01X/ENdd/xTYYP8f3Gj/JN1s/yneb/864Hn/QeF9/0bi - gP9K4oT/TuKG/1Pjif9W44v/WeSN/1zkjv9e5JD/X+WS/17lkf9Y5Iz/WeSN/1bji/9O4of/SuKE/0Hh - fv8+4Xz/O+B6/zfgef8033b/L95z/ynecP8j3Wz/Hd1p/xbcZf8N22D/BNpc/wDZWv8A2Fj/ANZX/wDU - Vf8A0lP/ANFQ/wDPT/8W3Xn/FNR9/xSUSv8za2W/Ql1rmktneIhRc4d1W4OaZWSSqVlrmrZRcKK9TXKh - v0xypcRKc6jHSQAAAAkAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAA - AAMAAAAGAAAADAAAABcAAAApAAAAQAAAAFoAAABzAEwStQCPKf8L1Hn/Ddhu/wDNTf8Q0Vf/O9hy/0Hb - d/9B3Hj/Qd16/0Heev9B4Hv/QeF9/0Xif/9K4oP/TuKG/1LjiP9W44v/WeSM/1zkj/9e5ZD/YeWS/2Lm - k/9k5pT/ZeaV/2bmlv9m5pb/ZuaW/2Xmlf9k5pT/Y+aT/17lkf9V44r/SeKD/z3he/8z33X/IN1q/xrd - Z/8T3GP/C9tf/wLaXP8A2Fr/ANhY/wDWV/8A1FX/ANJT/wDRUv8Az0//AM1N/wDMS/8G02P/CNJ4/wWH - NfgBTRyzAAAAcAAAAFcAAAA9AAAAJgAAABUAAAALAAAABQAAAAMAAAACAAAAAQAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAoAAAAXAAAAKQAAAEAAAABaAAAAcwBe - E8sAlzP/ANV4/wLSYf8Aykr/G89Z/0PXdP9G2Hj/Rtp5/0bcev9G3Xv/Rt18/0bfff9G4H7/RuF//0ji - gf9M4oT/T+KG/1Pjif9W5Iv/WeSM/1vkjv9d5Y//X+WQ/2Hlkv9i5ZP/YuWT/2Lmk/9i5ZP/YuWT/2Hl - kv9f5ZH/XuWQ/1zkjv9Z5Iz/V+SL/1Tjif9Q44f/P+F8/zDfc/8d3Gf/ANhZ/wDXWP8A1lb/ANRV/wDS - U/8A0VL/AM9P/wDNTf8AzEz/AMpK/wDISP8A0V//Atp9/wqWPv8BShizAAAAcQAAAFcAAAA9AAAAJgAA - ABUAAAAJAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAUAAAAMAAAAGQAAACwAAABDAAAAXgAAAHYAYxPTAJQu/wDXdv8AzVn/AMZH/yLNWv9L1nf/S9h5/0vY - ev9L2Xr/S9t8/0vcff9L3X7/S95//0vfgP9L4IH/S+KC/0vig/9N4oX/UOOH/1Tjiv9X44v/WeSM/1vk - jf9c5Y//XuWQ/1/lkP9f5ZD/YOWQ/1/lkP9f5ZD/XuWQ/13lj/9b5I7/WeSM/1fji/9V44r/UuOI/07i - hv9M4oP/S+KC/0vhgf9L34D/PN12/yfYaP8N01n/ANFS/wDPT/8AzU7/AMxM/wDKSv8AyEn/AMZH/wDF - Rf8AylP/ANV0/wSVMv8BXRjLAAAAcwAAAFoAAABAAAAAKAAAABYAAAAKAAAABAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAADAAAABoAAAAuAAAARgAAAGEAEACBAGoQ4gCX - MP8A03H/AMZN/wDDQ/8ozFz/T9R4/0/Wev9P13r/T9h7/0/ZfP9P2n3/T9x//0/df/9P3YH/T96C/0/f - gv9P4YP/T+KE/0/ihf9P4ob/UuOI/1Tjif9W44v/WOSL/1rkjP9b5I3/XOSO/1zkjv9c5Y7/XOWO/1zk - jv9b5I7/WuSM/1jki/9W5Iv/VeOJ/1LjiP9Q4ob/T+KF/0/ihP9P4YT/T+CD/0/fgv9P3YH/T92A/0/c - f/9D2Hb/KNNj/w7NU/8Ay0r/AMlJ/wDHR/8AxkX/AMRE/wDCQf8AxUv/ANJv/wCSKv8AXxDTAAAAdgAA - AF0AAABCAAAAKwAAABcAAAALAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAA - AAoAAAAYAAAALgAAAEgAAABjAA8AhABsBeoAmjT/AM5n/wDDSf8AwD//OMxk/1TSef9U1Hr/VNV6/1TX - fP9U2H3/VNh+/1Taf/9U24D/VNyB/1Tdgv9U3YP/VN+E/1Tfhf9U4IX/VOGG/1Tih/9U4oj/VOKI/1Tj - if9V44r/V+SL/1jki/9Y5Iz/WeSM/1nkjP9Z5Iz/WOSM/1jki/9X5Iv/VuOL/1Xjif9U44j/VOKI/1Ti - h/9U4of/VOGG/1Tghf9U34T/VN6D/1Tdgv9U3IL/VNuA/1Taf/9U2X7/VNh9/z3Sbv8gzFn/AMZG/wDE - RP8AwkH/AMA//wC/Pv8AwET/ANBo/wCfOP8AagniABAAgAAAAF8AAABEAAAAKwAAABYAAAAKAAAAAwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAEgAAACcAAABEAAAAYgApAJUAawHxAKE7/wDN - Zf8AvT7/CL5A/zzKZP9Y0nr/WNJ6/1jUe/9Y1X3/WNZ+/1jYf/9Y2ID/WNmB/1jagv9Y24P/WN2E/1jd - hf9Y3oX/WN+G/1jfh/9Y4Ij/WOGI/1jiif9Y4or/WOKK/1jii/9Y44v/WOOL/1jji/9Y44v/WOOL/1jj - i/9Y44v/WOOL/1jji/9Y4ov/WOKK/1jiiv9Y4on/WOGI/1jgiP9Y4If/WN+H/1jehv9Y3YX/WN2E/1jc - g/9Y2oL/WNmB/1jYgP9Y2H//WNd+/1jVff9O0nb/Mstg/wjCRP8Avz7/AL08/wC7O/8Auzz/AMxj/wCb - NP8AaQPqABAAgQAAAF4AAABAAAAAJAAAABEAAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA - AAoAAAAbAAAANQAAAFgAKgCQAG4A+ACfOP8AyF3/ALk6/wq6Pf9NzG//XNB6/1zRe/9c0nz/XNN+/1zV - fv9c1oD/XNeB/1zYgv9c2YP/XNqE/1zbhf9c3Ib/XN2G/1zdh/9c3oj/XN+I/1zfif9c4Ir/XOGL/1zh - i/9c4ov/XOKL/1zii/9c4oz/XOKM/1zijP9c4oz/XOKM/1zijP9c4oz/XOKL/1zii/9c4ov/XOGL/1zh - i/9c4Ir/XN+J/1zfif9c3oj/XN2H/1zdhv9c3Ib/XNuF/1zahP9c2YP/XNiC/1zXgf9c1oD/XNV//1zU - fv9c0nz/V9B5/zTHXf8KvT//ALk4/wC4Nv8AuDj/AMNV/wCdNf8AZwDpACsAjgAAAFUAAAAzAAAAGQAA - AAkAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAADAAAACEAAABAAEIAlgBvAPcApz//AMFS/wC0 - M/8RuT7/Uspv/2DPe/9g0H3/YNJ+/2DSf/9g04D/YNWB/2DWgv9g14P/YNiE/2DYhf9g2Yb/YNqH/2Db - iP9g3Ij/YN2J/2Ddiv9g3ov/YN6L/2Dfi/9g4Iv/YOCM/2DhjP9g4Y3/YOKN/2Dijf9g4o3/YOKN/2Di - jf9g4o3/YOKN/2Dijf9g4o3/YOGN/2DhjP9g4Iz/YOCL/2Dfi/9g34v/YN6L/2Ddiv9g3Yn/YN2I/2Dc - iP9g2of/YNqG/2DYhf9g2IT/YNeD/2DWgv9g1YH/YNSA/2DSf/9g0n7/YNF9/1vOeP83w1v/Crg6/wC1 - M/8AsjD/AMBP/wCpQP8AbgD3AC0AgQAAAD4AAAAgAAAADAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAMAAAAOAAAAJQApAF0AdgT/AKxE/wC8Sf8AsS//GrhA/1/MeP9kzn3/ZM9+/2TQf/9k0oD/ZNKB/2TT - gv9k1IP/ZNWE/2TXhf9k2Ib/ZNiH/2TZiP9k2on/ZNuK/2Tciv9k3Yv/ZN2L/2Tdi/9k3oz/ZN6N/2Tf - jf9k4I3/ZOCO/2Tgjv9k4Y7/ZOGP/2Thj/9k4Y//ZOGP/2Thj/9k4Y//ZOGP/2Thjv9k4I7/ZOCO/2Tg - jf9k343/ZN6N/2TejP9k3Yv/ZN2L/2Tdi/9k3Ir/ZNuK/2Taif9k2Yj/ZNiH/2TYhv9k14b/ZNaE/2TU - hP9k04L/ZNKC/2TSgP9k0X//ZM9+/2TOff9aynT/J7tK/wCyL/8AsC3/ALhB/wCpQP8AbgD2ABYAUQAA - ACQAAAAOAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAABAAAAAmAD8AdgCgNf8AtDz/AK4q/yK3 - Q/9jy3r/ac1+/2nOgP9pz4D/adCC/2nSg/9p0oT/adOF/2nUhv9p1Yb/adaH/2nYiP9p2In/adiK/2nZ - i/9p2ov/aduL/2ncjP9p3Y3/ad2N/2ndjv9p3o//ad6P/2nfj/9p35D/ad+Q/2ngkP9p4JH/aeCR/2ng - kf9p4JH/aeCR/2ngkf9p4JH/aeCR/2ngkP9p35D/ad+P/2nej/9p3o//ad2O/2ndjf9p3Y3/adyM/2nb - i/9p2ov/adqL/2nZiv9p2In/adiI/2nXiP9p1of/adSG/2nThf9p0oT/adKD/2nRgv9pz4H/ac6A/2nN - fv9pzH7/U8Vr/xOyNv8ArCn/ALI6/wCfNP8APwB2AAAAJgAAABAAAAADAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAADAAAAEAAAACcAQAB3ALI6/wCqJ/8wuEv/bct//23MgP9tzYH/bc6C/23Pg/9t0IT/bdKF/23S - hv9t04f/bdSI/23Vif9t1or/bdeK/23Yi/9t2Iv/bdmM/23ajP9t243/bduO/23cjv9t3Y//bd2Q/23d - kP9t3ZD/bd6R/23ekf9t35L/bd+S/23fkv9t35L/bd+S/23gkv9t4JL/bd+S/23fkv9t35L/bd+S/23e - kf9t3pH/bd6Q/23dkP9t3ZD/bd2P/23cjv9t247/bduN/23ajP9t2Yz/bdiL/23Yi/9t14v/bdaK/23V - if9t1Ij/bdOH/23Shv9t0oX/bdGE/23Pg/9tzoL/bc2B/23MgP9tzH//Z8h6/zC2Sv8AqSb/ALE3/wBA - AHcAAAAnAAAAEAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAQAAAAJwBAAHcNqir/iNKU/7rk - wf+65cH/uuXC/7rmwv+65sP/uufD/7rnxP+658T/uujF/7roxf+66cb/uunG/7rqxv+66sb/i96h/3HY - jf9x2Y7/cdmO/3Haj/9x25D/cdyQ/3Hckf9x3ZL/cd2S/3Hdkv9x3ZP/cd2T/3Hek/9x3pP/cd6T/3Hf - lP9x35T/cd+U/3HflP9x35T/cd6T/3Hek/9x3pP/cd2T/3Hdk/9x3ZL/cd2S/3Hdkv9x3JH/cdyQ/3Hb - kP9x2o//cdmO/3HZjv9x2I3/cdiM/5Xgqf+66sb/uunG/7rpxv+66cX/uujF/7roxf+658T/uufD/7rn - w/+65sL/uuXC/7rlwf+65MH/uuTA/4bQkv8NqCn/AD8AdgAAACcAAAAQAAAAAwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAwAAAA8AAAAmAD8AdiOhNP90yYH/ntmn/6nesv+p3rL/qd+y/6ngs/+p4bT/qeG0/6ni - tf+p4rX/qeK2/6njt/+p5Lf/qeS4/4zdof9n1IX/JMZU/2LUgv912ZD/ddqR/3Xakv9125L/ddyT/3Xc - k/913ZP/dd2U/3XdlP913ZX/dd2V/3Xdlf913pX/dd6V/3Xelf913pX/dd6V/3Xelf913pX/dd2V/3Xd - lf913ZX/dd2V/3XdlP913ZP/ddyT/3Xck/9125L/dduS/3Xakf912ZD/ddiQ/2LTgf8kxVP/Z9OE/4zd - of+p5Lf/qeO3/6nitv+p4rX/qeK1/6nhtP+p4bT/qeCz/6nfs/+p3rL/qd6y/6ndsf+e2Kf/dMiA/yOn - Nv8AQQB1AAAAJgAAAA8AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAADgAAACMARABxFIUg/5rS - ov+q27L/qtuz/6rcs/+q3bT/qt20/6rdtf+q3rX/qt62/6rft/+q4Lf/quC3/6rguP+q4bn/qOC3/03I - b/8AvT3/X9J+/3nZkv952ZP/edqU/3nblP9525X/edyV/3nclf953Zb/ed2W/3ndl/953Zf/ed2X/3nd - l/953Zf/ed2X/3ndl/953Zf/ed2X/3ndl/953Zf/ed2X/3ndl/953Zb/ed2W/3nclf953JX/eduV/3nb - lP952pT/edmT/3nZkv952JL/X9F9/wC8PP9czXr/qeC3/6rhuP+q4Lj/quC3/6rft/+q3rb/qt62/6rd - tf+q3bX/qt20/6rcs/+q27P/qtuy/6rasv+Tzpz/AH0L/wBEAHEAAAAjAAAADQAAAAIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAIAAAALAAAAHQBGAGooizD/f7yJ/3+9iv9/vov/f7+L/3/AjP9/wI3/f8CN/3/B - jv9/wo//f8OQ/3/Ekf9/xJH/f8WS/3/Gk/9/xpT/ZMR+/wC7O/9i0n//fNiU/3zZlf982pb/fNqW/3zb - lv9825f/fNyX/3zcl/983Jf/fN2X/3zdmP983Zj/fN2Y/3zdmP983Zj/fN2Y/3zdmP983Zj/fN2Y/3zd - mP983Zj/fN2Y/3zdl/983Jf/fNyX/3zbl/9825f/fNqW/3zalv982ZX/fNmU/3zYlP9i0X7/ALo6/2TH - fv9/xpP/f8WS/3/Fkf9/xJH/f8OQ/3/Cj/9/wY7/f8CO/3/Ajf9/wIz/f7+L/3++i/9/vYr/f7yJ/3+7 - iP8fgiP/AEYAaQAAAB0AAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAVAEsAXyKI - Kv9rsXb/a7J3/2uzeP9rtHn/a7V6/2u2ev9rt3v/a7h8/2u5ff9ruX7/a7p//2u7gP9ru4D/a7yB/2u9 - gv9VvHH/ALk4/2XRgP+A2Jf/gNmX/4DZl/+A2pf/gNuX/4DbmP+A25j/gNyY/4Dcmf+A3Jn/gN2a/4Dd - mv+A3Zr/gN2a/4Ddmv+A3Zr/gN2a/4Ddmv+A3Zr/gN2a/4Ddmv+A3Zn/gNyZ/4DcmP+A25j/gNuY/4Db - l/+A2pf/gNqX/4DZl/+A2Jf/gNiW/2XQf/8AuTf/VcBx/2u8gf9rvIH/a7uA/2u6f/9ruX7/a7l9/2u4 - fP9rt3z/a7Z6/2u1ev9rtHn/a7N5/2uyeP9rsnf/a7F2/yKDJv8ATwBeAAAAFAAAAAcAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAwAVgBTEHwU/1emYv9Xp2P/V6hk/1eqZf9Xqmb/V6tn/1es - aP9XrWn/V65q/1eva/9XsGz/V7Ft/1eybv9Xsm//V7Nw/zKuVP8Atzb/aNCB/4TYmP+E2Zn/hNqZ/4Ta - mv+E2pr/hNua/4Tbm/+E3Jv/hNyb/4Tcm/+E3Jz/hN2c/4TdnP+E3Zz/hN2c/4TdnP+E3Zz/hN2c/4Td - nP+E3Zz/hNyc/4TcnP+E3Jv/hNyb/4Tbm/+E25r/hNua/4Tamv+E2pn/hNmZ/4TZmP+E2Jj/aNCB/wC2 - Nf87t1v/V7Jv/1eybv9XsW3/V7Bs/1eva/9Xrmv/V61p/1esaP9Xq2f/V6pm/1eqZf9XqWT/V6dj/1em - Yv9Tolz/CngL/wBQAEMAAAAMAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAA - AAwAawCnG38d/zWPO/81kT3/NZE9/zWSPv81kj//NZM//zWUQP81lED/NZVB/zWVQf81lkP/NZZD/zWX - RP8ulD3/CJMm/wC1M/9r0IP/iNib/4jZm/+I2Zv/iNqc/4janf+I253/iNud/4jcnv+I3J7/iNye/4jc - nv+I3Z7/iN2e/4jdn/+I3Z//iN2f/4jdn/+I3Z//iN2e/4jdnv+I3J7/iNye/4jcnv+I3J7/iNud/4jb - nf+I253/iNqc/4jZm/+I2Zv/iNib/4jYmv9rz4L/ALQz/wieKv8ukz3/NZZD/zWWQ/81lUH/NZVB/zWU - QP81lED/NZM//zWTP/81kj7/NZE9/zWRPf81kDz/NY87/xt/Hf8AawCnAAAADAAAAAUAAAACAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAABAAAAAcAWwA4AGAASgBfAEsAXgBMAF4ATABe - AEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAWABRAE8AXQBEAHEAewriALIw/2/PhP+M2J3/jNme/4za - nv+M2p7/jNqf/4zbn/+M25//jNug/4zcoP+M3KD/jNyg/4zcoP+M3aH/jN2h/4zdof+M3aH/jN2h/4zd - of+M3aH/jNyg/4zcoP+M3KD/jNyg/4zcoP+M25//jNuf/4zan/+M2p7/jNqe/4zZnv+M2Z3/jNid/2/P - g/8AsjD/AIkcwQBFAGsAVQBaAFoATwBeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABf - AEsAYABKAFEAKQAAAAcAAAAEAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAQAAAAEAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAA - AAoAAAAcAAAAOAB5DdcAsS7/cs+F/5DZoP+Q2aD/kNqg/5Daof+Q26H/kNuh/5Dbof+Q26H/kNyh/5Dc - of+Q3KL/kNyi/5Dcov+Q3aL/kN2i/5Ddov+Q3aL/kN2i/5Dcov+Q3KL/kNyi/5Dcof+Q3KH/kNuh/5Db - of+Q26H/kNuh/5Daof+Q2qD/kNmg/5DZoP+Q2J//cs6F/wCwLv8Ahx+qAAAAMQAAABcAAAAIAAAAAwAA - AAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAABAAAAAQAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABoAAAA3AHgM1gCvLP91zof/lNmh/5TZ - of+U2qL/lNqi/5Tao/+U26P/lNuj/5Tbo/+U3KT/lNyk/5TcpP+U3KT/lNyk/5TcpP+U3KT/lNyk/5Tc - pP+U3KT/lNyk/5TcpP+U3KT/lNyk/5TcpP+U3KP/lNuj/5Tbo/+U26P/lNqi/5Taov+U2aH/lNmh/5TY - of91zob/AK4s/wCGHakAAAAvAAAAFQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAIAAAAGgAAADcAeArWAKwp/3jOiP+X2aP/l9qk/5fapP+X2qX/l9ul/5fbpf+X26X/l9ym/5fc - pv+X3Kb/l9ym/5fcpv+X3af/l92n/5fdp/+X3af/l92n/5fdp/+X3af/l9yn/5fcpv+X3Kb/l9ym/5fc - pv+X26b/l9ul/5fbpf+X2qX/l9qk/5fapP+X2aT/l9mj/3jNiP8Aqyj/AIMdqQAAAC8AAAAVAAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAaAAAANwB4CtYAqif/es6K/5vZ - pv+b2qf/m9qn/5vbp/+b26f/m9uo/5vcqP+b3Kj/m9yo/5vcqf+b3Kn/m92p/5vdqf+b3an/m92p/5vd - qf+b3an/m92p/5vdqf+b3an/m9yp/5vcqf+b3Kj/m9yo/5vcqP+b26j/m9un/5vbp/+b2qf/m9qn/5vZ - pv+b2ab/es2J/wCqJv8AghqpAAAALwAAABUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAACAAAABoAAAA3AHgH1gCoJP99zYv/n9qp/5/aqf+f26n/n9uq/5/bqv+f3Kr/n9yq/5/c - qv+f3Kr/n9yq/5/dqv+f3ar/n92q/5/dqv+f3ar/n92r/5/dqv+f3ar/n92q/5/dqv+f3ar/n92q/5/c - qv+f3Kr/n9yq/5/cqv+f26r/n9uq/5/bqf+f2qn/n9qp/5/ZqP99zYv/AKcj/wCAGKkAAAAvAAAAFQAA - AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGgAAADcAdwfWAKYi/4DN - jP+i2qv/otur/6Lbq/+i26v/otys/6LcrP+i3Kz/otys/6LdrP+i3a3/ot2t/6Ldrf+i3a3/ot2t/6Ld - rf+i3a3/ot2t/6Ldrf+i3a3/ot2t/6Ldrf+i3a3/ot2s/6LcrP+i3Kz/otys/6LcrP+i26v/otur/6Lb - q/+i2qv/otqq/4DNi/8ApSD/AH8VqQAAAC8AAAAVAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAgAAAAaAAAANwB2BtYAox//g82N/6bbrf+m263/ptuu/6bcrv+m3K7/pt2v/6bd - r/+m3a//pt2v/6bdr/+m3a//pt2w/6bdsP+m3bD/pt2w/6bdsP+m3bD/pt2w/6bdsP+m3bD/pt2v/6bd - r/+m3a//pt2v/6bdr/+m3a//ptyu/6bcrv+m3K7/ptut/6bbrf+m263/g8yN/wCjHv8AfRSpAAAALwAA - ABUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABoAAAA3AHUG1gCh - Hf+GzY//qtuw/6rcsP+q3LH/qt2x/6rdsf+q3bH/qt2y/6rdsv+q3bL/qt2y/6rdsv+q3bL/qt2y/6rd - sv+q3bL/qt2y/6rdsv+q3bL/qt2y/6rdsv+q3bL/qt2y/6rdsv+q3bL/qt2y/6rdsf+q3bH/qt2x/6rc - sf+q3LD/qtuw/6rbsP+GzI7/AKEb/wB6D6kAAAAvAAAAFQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAIAAAAGgAAADcAcgTWAJ8a/4nNkP+t3LL/rd2y/63dsv+t3bP/rd2z/63d - s/+t3bP/rd2z/63ds/+t3bT/rd60/63etP+t3rT/rd60/63etP+t3rT/rd60/63etP+t3rT/rd60/63e - tP+t3bT/rd20/63ds/+t3bP/rd2z/63ds/+t3bP/rd2z/63dsv+t3LL/rdyy/4nMkP8Anxn/AHkPqQAA - AC8AAAAVAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAaAAAANwBy - BNYAnRb/i82S/7Hdtf+x3bX/sd21/7Hdtv+x3bb/sd22/7Hdtv+x3rb/sd62/7Het/+x3rf/sd63/7He - t/+x37f/sd+3/7Hft/+x37f/sd+3/7Het/+x3rf/sd63/7Het/+x3rb/sd62/7Hdtv+x3bb/sd22/7Hd - tv+x3bX/sd21/7Hdtf+x3bX/i8yS/wCcFv8AeQupAAAALwAAABUAAAAFAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABoAAAA3AHIE1gCaE/+OzZT/tN24/7TduP+03bj/tN65/7Te - uf+03rn/tN65/7Teuf+03rn/tN+5/7Tfuf+037n/tN+5/7Tfuf+037n/tN+5/7Tfuf+037n/tN+5/7Tf - uf+037n/tN+5/7Tfuf+03rn/tN65/7Teuf+03rn/tN65/7TduP+03bj/tN24/7TduP+OzJP/AJoT/wB2 - C6kAAAAvAAAAFQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGgAA - ADcAcgHWAJgQ/5HNlf+43rr/uN66/7jeu/+437v/uN+7/7jfu/+437v/uN+7/7jgvP+44Lz/uOC8/7jg - vP+44Lz/uOC8/7jgvP+44Lz/uOC8/7jgvP+44Lz/uOC8/7jgvP+44Lz/uOC8/7jfu/+437v/uN+7/7jf - u/+437v/uN+7/7jeuv+43rr/uN66/5HNlf8AlxD/AHQFqQAAAC8AAAAVAAAABQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAaAAAANwBxANYAlg3/lM2X/7vfvf+7373/u9++/7vg - vv+74L7/u+C+/7vgvv+74L7/u+C+/7vhv/+74b//u+G//7vhv/+74b//u+G//7vhv/+74b//u+G//7vh - v/+74b//u+G//7vhv/+74L//u+C+/7vgvv+74L7/u+C+/7vgvv+7377/u9+9/7vfvf+7373/lM2X/wCW - C/8AcwWpAAAALwAAABUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAA - ABoAAAA3AHAA1gCUCv+XzZj/v+DA/7/gwP+/4MD/v+HA/7/hwP+/4cD/v+HB/7/hwf+/4sH/v+LB/7/i - wf+/4sH/v+LB/7/iwf+/4sH/v+LB/7/iwf+/4sH/v+LB/7/iwf+/4sH/v+LB/7/iwf+/4cH/v+HB/7/h - wP+/4cD/v+HA/7/hwP+/4MD/v+DA/7/gwP+XzZj/AJMI/wBwAKkAAAAvAAAAFQAAAAUAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGgAAADcAcADWAJEG/5nNmv/C4cP/wuHD/8Li - w//C4sP/wuLD/8LixP/C4sT/wuLE/8LixP/C4sT/wuLE/8LixP/C4sT/wuLE/8LixP/C4sT/wuLE/8Li - xP/C4sT/wuLE/8LixP/C4sT/wuLE/8LixP/C4sT/wuLE/8Liw//C4sP/wuLD/8Lhw//C4cP/wuHD/5nN - mv8AkQT/AHAAqQAAAC8AAAAVAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAgAAAAaAAAANwBvANYAjwL/nM6c/8bixv/G4sb/xuLG/8bixv/G4sb/xuLG/8bixv/G48b/xuPG/8bj - xv/G48b/xuPH/8bjx//G48f/xuPH/8bjx//G48f/xuPH/8bjx//G48f/xuPG/8bjxv/G48b/xuPG/8bj - xv/G4sb/xuLG/8bixv/G4sb/xuLG/8bixv/G4sb/nM6c/wCOAP8AbQCpAAAALwAAABUAAAAFAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABoAAAA3AG8A1gCOAP+ez57/yOPI/8jj - yP/I48j/yOPI/8jjyP/I48n/yOPJ/8jkyf/I5Mn/yOTJ/8jkyf/I5Mn/yOTJ/8jkyf/I5Mn/yOTJ/8jk - yf/I5Mn/yOTJ/8jkyf/I5Mn/yOTJ/8jkyf/I5Mn/yOTJ/8jjyf/I48n/yOPI/8jjyP/I48j/yOPI/8jj - yP+ez57/AI4A/wBtAKkAAAAvAAAAFQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAIAAAAGgAAADYAbwDWAI4A/6rVqv/u9u7/7vbu/+727v/u9u7/7vbu/+727v/u9u7/7vbu/+72 - 7v/u9u7/7vbu/+727//u9u//7vbv/+727//u9u//7vbv/+727//u9u//7vbv/+727//u9u7/7vbu/+72 - 7v/u9u7/7vbu/+727v/u9u7/7vbu/+727v/u9u7/7vbu/6jTqP8AjgD/AG0AqQAAAC8AAAAVAAAABQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAZAAAANQBsANYAjgD/rNas//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ - /v/+/v7/iMSI/wCOAP8AYACpAAAALgAAABQAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAABwAAABcAAAAxAGcA1A6ADv+hzKH/qtKq/6rSqv+q0qr/qtKq/6rSqv+q0qr/qtKq/6rS - qv+q0qr/qtKq/6rSqv+q0qr/qtKq/6rSqv+q0qr/qtKq/6rSqv+q0qr/qtKq/6rSqv+q0qr/qtKq/6rS - qv+q0qr/qtKq/6rSqv+q0qr/qtKq/6rSqv+q0qr/qtKq/6rSqv+Lwov/AH4A/wBbAKYAAAAqAAAAEgAA - AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEgAAACkAaADRKIQo/3+y - f/9/sn//f7J//3+yf/9/sn//f7J//3+yf/9/sn//f7J//3+yf/9/sn//f7J//3+yf/9/sn//f7J//3+y - f/9/sn//f7J//3+yf/9/sn//f7J//3+yf/9/sn//f7J//3+yf/9/sn//f7J//3+yf/9/sn//f7J//3+y - f/9/sn//f7J//3+yf/8ffx//AFsAoAAAACQAAAAPAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAMAAAANAAAAHgBrAMwigSL/bKds/2ynbP9sp2z/bKds/2ynbP9sp2z/bKds/2yn - bP9sp2z/bKds/2ynbP9sp2z/bKds/2ynbP9sp2z/bKds/2ynbP9sp2z/bKds/2ynbP9sp2z/bKds/2yn - bP9sp2z/bKds/2ynbP9sp2z/bKds/2ynbP9sp2z/bKds/2ynbP9sp2z/bKds/yKBIv8AYQCYAAAAGwAA - AAsAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAcAAAASAGsAuRZ7 - Fv9XnFf/V5xX/1ecV/9XnFf/V5xX/1ecV/9XnFf/V5xX/1ecV/9XnFf/V5xX/1ecV/9XnFf/V5xX/1ec - V/9XnFf/V5xX/1ecV/9XnFf/V5xX/1ecV/9XnFf/V5xX/1ecV/9XnFf/V5xX/1ecV/9XnFf/V5xX/1ec - V/9XnFf/V5xX/1ecV/9TmVP/CncK/wBmAI8AAAAQAAAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAgAWAA9AHAA8Rt9G/81ijX/NYo1/zWKNf81ijX/NYo1/zWK - Nf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWK - Nf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/xt9G/8AbgDiAFUALQAA - AAgAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAA - AAUAQAAYAF4ASQBgAEoAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABe - AEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABe - AEwAXgBMAF4ATABfAEsAYABKAF4ASQBDABcAAAAFAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA//////////////////////////////////////////////////////////////////////// - /////////////////gAAAAAAAAAAAAH///////AAAAAAAAAAAAAAP//////wAAAAAAAAAAAAAB////// - 8AAAAAAAAAAAAAAf/////+AAAAAAAAAAAAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAAf - /////+AAAAAAAAAAAAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAAf/////+AAAAAAAAAA - AAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAAf/////+AAAAAAAAAAAAAAH//////gAAAA - AAAAAAAAAB//////4AAAAAAAAAAAAAAf/////+AAAAAAAAAAAAAAH//////gAAAAAAAAAAAAAA////// - 4AAAAAAAAAAAAAAP/////+AAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAP - /////+AAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAP/////+AAAAAAAAAA - AAAAD//////gAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAP/////8AAAAAAAAAAAAAAD//////AAAAA - AAAAAAAAAA//////wAAAAAAAAAAAAAAP/////8AAAAAAAAAAAAAAD//////AAAAAAAAAAAAAAA////// - wAAAAAAAAAAAAAAP/////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAH - /////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAA - AAAAB//////AAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAAAAAAB//////AAAAA - AAAAAAAAAAf/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf///// - wAAAAAAAAAAAAAAH/////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD - /////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAA - AAAAB//////gAAAAAAAAAAAAAAf/////4AAAAAAAAAAAAAAP/////+AAAAAAAAAAAAAAD//////wAAAA - AAAAAAAAAB//////8AAAAAAAAAAAAAAf//////AAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAD////// - +AAAAAAAAAAAAAA///////gAAAAAAAAAAAAAP//////8AAAAAAAAAAAAAH///////AAAAAAAAAAAAAB/ - //////4AAAAAAAAAAAAA///////+AAAAAAAAAAAAAP///////gAAAAAAAAAAAAD///////8AAAAAAAAA - AAAB////////AAAAAAAAAAAAAf///////wAAAAAAAAAAAAH///////+AAAAAAAAAAAAD////////gAAA - AAAAAAAAA////////4AAAAAAAAAAAAP////////AAAAAAAAAAAAH////////4AAAAAAAAAAAD/////// - ///gAAAAAAAAH///////////8AAAAAAAAD///////////+AAAAAAAAAf///////////AAAAAAAAAD/// - ////////AAAAAAAAAAf//////////gAAAAAAAAAB//////////wAAAAAAAAAAP/////////4AAAAAAAA - AAB/////////8AAAAAAAAAAAP/////////AAAAAAAAAAAD/////////wAAAAAAAAAAA/////////8AAA - AAAAAAAAP/////////AAAAAAAAAAAD/////////wAAAAAAAAAAA/////////8AAAAAAAAAAAP/////// - //AAAAAAAAAAAD/////////wAAAAAAAAAAA/////////8AAAAAAAAAAAP/////////AAAAAAAAAAAD// - //////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAA - P//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////w - AAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////wAAAAAD////////// - ////8AAAAAA///////////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///// - //////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAA - P//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////w - AAAAAD//////////////8AAAAAA///////////////gAAAAAf/////////////////////////////// - //////////////////8= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH - DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp - bGUAAEjHnZZ3VFTXFofPvXd6oc0wAlKG3rvAANJ7k15FYZgZYCgDDjM0sSGiAhFFRJoiSFDEgNFQJFZE - sRAUVLAHJAgoMRhFVCxvRtaLrqy89/Ly++Osb+2z97n77L3PWhcAkqcvl5cGSwGQyhPwgzyc6RGRUXTs - AIABHmCAKQBMVka6X7B7CBDJy82FniFyAl8EAfB6WLwCcNPQM4BOB/+fpFnpfIHomAARm7M5GSwRF4g4 - JUuQLrbPipgalyxmGCVmvihBEcuJOWGRDT77LLKjmNmpPLaIxTmns1PZYu4V8bZMIUfEiK+ICzO5nCwR - 3xKxRoowlSviN+LYVA4zAwAUSWwXcFiJIjYRMYkfEuQi4uUA4EgJX3HcVyzgZAvEl3JJS8/hcxMSBXQd - li7d1NqaQffkZKVwBALDACYrmcln013SUtOZvBwAFu/8WTLi2tJFRbY0tba0NDQzMv2qUP91829K3NtF - ehn4uWcQrf+L7a/80hoAYMyJarPziy2uCoDOLQDI3fti0zgAgKSobx3Xv7oPTTwviQJBuo2xcVZWlhGX - wzISF/QP/U+Hv6GvvmckPu6P8tBdOfFMYYqALq4bKy0lTcinZ6QzWRy64Z+H+B8H/nUeBkGceA6fwxNF - hImmjMtLELWbx+YKuGk8Opf3n5r4D8P+pMW5FonS+BFQY4yA1HUqQH7tBygKESDR+8Vd/6NvvvgwIH55 - 4SqTi3P/7zf9Z8Gl4iWDm/A5ziUohM4S8jMX98TPEqABAUgCKpAHykAd6ABDYAasgC1wBG7AG/iDEBAJ - VgMWSASpgA+yQB7YBApBMdgJ9oBqUAcaQTNoBcdBJzgFzoNL4Bq4AW6D+2AUTIBnYBa8BgsQBGEhMkSB - 5CEVSBPSh8wgBmQPuUG+UBAUCcVCCRAPEkJ50GaoGCqDqqF6qBn6HjoJnYeuQIPQXWgMmoZ+h97BCEyC - qbASrAUbwwzYCfaBQ+BVcAK8Bs6FC+AdcCXcAB+FO+Dz8DX4NjwKP4PnEIAQERqiihgiDMQF8UeikHiE - j6xHipAKpAFpRbqRPuQmMorMIG9RGBQFRUcZomxRnqhQFAu1BrUeVYKqRh1GdaB6UTdRY6hZ1Ec0Ga2I - 1kfboL3QEegEdBa6EF2BbkK3oy+ib6Mn0K8xGAwNo42xwnhiIjFJmLWYEsw+TBvmHGYQM46Zw2Kx8lh9 - rB3WH8vECrCF2CrsUexZ7BB2AvsGR8Sp4Mxw7rgoHA+Xj6vAHcGdwQ3hJnELeCm8Jt4G749n43PwpfhG - fDf+On4Cv0CQJmgT7AghhCTCJkIloZVwkfCA8JJIJKoRrYmBRC5xI7GSeIx4mThGfEuSIemRXEjRJCFp - B+kQ6RzpLuklmUzWIjuSo8gC8g5yM/kC+RH5jQRFwkjCS4ItsUGiRqJDYkjiuSReUlPSSXK1ZK5kheQJ - yeuSM1J4KS0pFymm1HqpGqmTUiNSc9IUaVNpf+lU6RLpI9JXpKdksDJaMm4ybJkCmYMyF2TGKQhFneJC - YVE2UxopFykTVAxVm+pFTaIWU7+jDlBnZWVkl8mGyWbL1sielh2lITQtmhcthVZKO04bpr1borTEaQln - yfYlrUuGlszLLZVzlOPIFcm1yd2WeydPl3eTT5bfJd8p/1ABpaCnEKiQpbBf4aLCzFLqUtulrKVFS48v - vacIK+opBimuVTyo2K84p6Ss5KGUrlSldEFpRpmm7KicpFyufEZ5WoWiYq/CVSlXOavylC5Ld6Kn0Cvp - vfRZVUVVT1Whar3qgOqCmrZaqFq+WpvaQ3WCOkM9Xr1cvUd9VkNFw08jT6NF454mXpOhmai5V7NPc15L - Wytca6tWp9aUtpy2l3audov2Ax2yjoPOGp0GnVu6GF2GbrLuPt0berCehV6iXo3edX1Y31Kfq79Pf9AA - bWBtwDNoMBgxJBk6GWYathiOGdGMfI3yjTqNnhtrGEcZ7zLuM/5oYmGSYtJoct9UxtTbNN+02/R3Mz0z - llmN2S1zsrm7+QbzLvMXy/SXcZbtX3bHgmLhZ7HVosfig6WVJd+y1XLaSsMq1qrWaoRBZQQwShiXrdHW - ztYbrE9Zv7WxtBHYHLf5zdbQNtn2iO3Ucu3lnOWNy8ft1OyYdvV2o/Z0+1j7A/ajDqoOTIcGh8eO6o5s - xybHSSddpySno07PnU2c+c7tzvMuNi7rXM65Iq4erkWuA24ybqFu1W6P3NXcE9xb3Gc9LDzWepzzRHv6 - eO7yHPFS8mJ5NXvNelt5r/Pu9SH5BPtU+zz21fPl+3b7wX7efrv9HqzQXMFb0ekP/L38d/s/DNAOWBPw - YyAmMCCwJvBJkGlQXlBfMCU4JvhI8OsQ55DSkPuhOqHC0J4wybDosOaw+XDX8LLw0QjjiHUR1yIVIrmR - XVHYqLCopqi5lW4r96yciLaILoweXqW9KnvVldUKq1NWn46RjGHGnIhFx4bHHol9z/RnNjDn4rziauNm - WS6svaxnbEd2OXuaY8cp40zG28WXxU8l2CXsTphOdEisSJzhunCruS+SPJPqkuaT/ZMPJX9KCU9pS8Wl - xqae5Mnwknm9acpp2WmD6frphemja2zW7Fkzy/fhN2VAGasyugRU0c9Uv1BHuEU4lmmfWZP5Jiss60S2 - dDYvuz9HL2d7zmSue+63a1FrWWt78lTzNuWNrXNaV78eWh+3vmeD+oaCDRMbPTYe3kTYlLzpp3yT/LL8 - V5vDN3cXKBVsLBjf4rGlpVCikF84stV2a9021DbutoHt5turtn8sYhddLTYprih+X8IqufqN6TeV33za - Eb9joNSydP9OzE7ezuFdDrsOl0mX5ZaN7/bb3VFOLy8qf7UnZs+VimUVdXsJe4V7Ryt9K7uqNKp2Vr2v - Tqy+XeNc01arWLu9dn4fe9/Qfsf9rXVKdcV17w5wD9yp96jvaNBqqDiIOZh58EljWGPft4xvm5sUmoqb - PhziHRo9HHS4t9mqufmI4pHSFrhF2DJ9NProje9cv+tqNWytb6O1FR8Dx4THnn4f+/3wcZ/jPScYJ1p/ - 0Pyhtp3SXtQBdeR0zHYmdo52RXYNnvQ+2dNt293+o9GPh06pnqo5LXu69AzhTMGZT2dzz86dSz83cz7h - /HhPTM/9CxEXbvUG9g5c9Ll4+ZL7pQt9Tn1nL9tdPnXF5srJq4yrndcsr3X0W/S3/2TxU/uA5UDHdavr - XTesb3QPLh88M+QwdP6m681Lt7xuXbu94vbgcOjwnZHokdE77DtTd1PuvriXeW/h/sYH6AdFD6UeVjxS - fNTws+7PbaOWo6fHXMf6Hwc/vj/OGn/2S8Yv7ycKnpCfVEyqTDZPmU2dmnafvvF05dOJZ+nPFmYKf5X+ - tfa5zvMffnP8rX82YnbiBf/Fp99LXsq/PPRq2aueuYC5R69TXy/MF72Rf3P4LeNt37vwd5MLWe+x7ys/ - 6H7o/ujz8cGn1E+f/gUDmPP8usTo0wAAAAlwSFlzAAALDwAACw8BkvkDpQAAAthJREFUOE99k8tTUmEY - xrV7OTXTTDXTtHHa5qrpL2jTwl2LNq1ata6mvTMtNG+liBMKqOAl5HoQjuIBJBLxqKijoIhCUgtTAUUQ - uRx4eo+TjqbT4jfzXd7n+d7v/d6vDEDZOdyitRvExUwmW35wkCkXx385FX+e+AIFviK04ciqYcLr6eMc - bvWYy62itXfEzZMHnjGIxePXKOBDcje/OTvLCOyaU2gzuArdXepcNPprifZe/NdgORi6SwEdkbXw3qI/ - iNbJn5CqjRjlvsHhdKeLxaKR9quOTM5kkE7vV2Wz2eFZfirnWdlA/egitPoheCbnoDeypVAo/JvETcR9 - 0eS8GlRvbW0vTHv5oi6whboBDiM2Bzz8LFibC1aWEzKZzBqJ3xIVpwwCgeAVWnyzuhLa5qfmoZzbQFOX - DsMsB/uYB27PFAa0JgSWglmgJF6l8pTB9nbsXjaX63E7XVlvIIoGzg+FWgujiQVj5TDu9cFgtsFmH8sV - CoVeMrhzbMA5XOX7+5knsVjcx0/wJUdkDzV9Nhh0DNXAAo1uCA7XBExDo+CnfXEq5nuxL44NeH76uiAU - Xgf8gc2llQh6/TE0qxhYzOyheGCQAWPhoDNaEfmxHibxs1NFXP8RrdxLp9Q9PX059/gMtHYvlOrBw/T1 - phFiGP0aBppBUzGxs8uT+OGxwTBrv0SpV/v9ywsSqbLEWBwY6Nej+VMbJFIF2mU96CYzmaIPFuuoQM8s - FrDi2ICzOx8IglBrZe0JVb8RZquT0rZC+kUJubIXMrmKxgp8bJRgxjeXI6GEEFu+rCyRSFxOJpNPaTIy - P7+YJEFeJlcXG5vbUVvfgs8SGVqlnZRFN+oaWvB93JsSn/pkJ96mSTXRQGjTqbR7YTEQMltGYkajJatS - fxXo9KKkXS5IpB3C6lpkk+Ke/9vKYjpXCfEfPCZeEjVEZz6f1+zsJvWELpVKMSiVxF/56MjgD6JaHPCi - 71CQAAAAAElFTkSuQmCC - - - - - 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 - 71CQAAAAAElFTkSuQmCC - - - - - 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 - 71CQAAAAAElFTkSuQmCC - - - \ No newline at end of file diff --git a/NUS Downloader/Headers.cs b/NUS Downloader/Headers.cs deleted file mode 100644 index 7faa41a..0000000 --- a/NUS Downloader/Headers.cs +++ /dev/null @@ -1,747 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; -using System.Security.Cryptography; - -namespace libWiiSharp -{ - public class Headers - { - private static uint imd5Magic = 0x494d4435; - private static uint imetMagic = 0x494d4554; - - /// - /// Convert HeaderType to int to get it's Length. - /// - public enum HeaderType - { - None = 0, - /// - /// Used in opening.bnr - /// - ShortIMET = 1536, - /// - /// Used in 00000000.app - /// - IMET = 1600, - /// - /// Used in banner.bin / icon.bin - /// - IMD5 = 32, - } - - #region Public Functions - /// - /// Checks a file for Headers. - /// - /// - /// - public static HeaderType DetectHeader(string pathToFile) - { - return DetectHeader(File.ReadAllBytes(pathToFile)); - } - - /// - /// Checks the byte array for Headers. - /// - /// - /// - public static HeaderType DetectHeader(byte[] file) - { - if (file.Length > 68) - if (Shared.Swap(BitConverter.ToUInt32(file, 64)) == imetMagic) - return HeaderType.ShortIMET; - if (file.Length > 132) - if (Shared.Swap(BitConverter.ToUInt32(file, 128)) == imetMagic) - return HeaderType.IMET; - if (file.Length > 4) - if (Shared.Swap(BitConverter.ToUInt32(file, 0)) == imd5Magic) - return HeaderType.IMD5; - - return HeaderType.None; - } - - /// - /// Checks the stream for Headers. - /// - /// - /// - public static HeaderType DetectHeader(Stream file) - { - byte[] tmp = new byte[4]; - - if (file.Length > 68) - { - file.Seek(64, SeekOrigin.Begin); - file.Read(tmp, 0, tmp.Length); - if (Shared.Swap(BitConverter.ToUInt32(tmp, 0)) == imetMagic) - return HeaderType.ShortIMET; - } - if (file.Length > 132) - { - file.Seek(128, SeekOrigin.Begin); - file.Read(tmp, 0, tmp.Length); - if (Shared.Swap(BitConverter.ToUInt32(tmp, 0)) == imetMagic) - return HeaderType.IMET; - } - if (file.Length > 4) - { - file.Seek(0, SeekOrigin.Begin); - file.Read(tmp, 0, tmp.Length); - if (Shared.Swap(BitConverter.ToUInt32(tmp, 0)) == imd5Magic) - return HeaderType.IMD5; - } - - return HeaderType.None; - } - #endregion - - public class IMET - { - private bool hashesMatch = true; - private bool isShortImet = false; - - private byte[] additionalPadding = new byte[64]; - private byte[] padding = new byte[64]; - private uint imetMagic = 0x494d4554; - private uint sizeOfHeader = 0x00000600; //Without additionalPadding - private uint unknown = 0x00000003; - private uint iconSize; - private uint bannerSize; - private uint soundSize; - private uint flags = 0x00000000; - private byte[] japaneseTitle = new byte[84]; - private byte[] englishTitle = new byte[84]; - private byte[] germanTitle = new byte[84]; - private byte[] frenchTitle = new byte[84]; - private byte[] spanishTitle = new byte[84]; - private byte[] italianTitle = new byte[84]; - private byte[] dutchTitle = new byte[84]; - private byte[] unknownTitle1 = new byte[84]; - private byte[] unknownTitle2 = new byte[84]; - private byte[] koreanTitle = new byte[84]; - private byte[] padding2 = new byte[588]; - private byte[] hash = new byte[16]; - - /// - /// Short IMET has a padding of 64 bytes at the beginning while Long IMET has 128. - /// - public bool IsShortIMET { get { return isShortImet; } set { isShortImet = value; } } - /// - /// The size of uncompressed icon.bin - /// - public uint IconSize { get { return iconSize; } set { iconSize = value; } } - /// - /// The size of uncompressed banner.bin - /// - public uint BannerSize { get { return bannerSize; } set { bannerSize = value; } } - /// - /// The size of uncompressed sound.bin - /// - public uint SoundSize { get { return soundSize; } set { soundSize = value; } } - /// - /// The japanese Title. - /// - public string JapaneseTitle { get { return returnTitleAsString(japaneseTitle); } set { setTitleFromString(value, 0); } } - /// - /// The english Title. - /// - public string EnglishTitle { get { return returnTitleAsString(englishTitle); } set { setTitleFromString(value, 1); } } - /// - /// The german Title. - /// - public string GermanTitle { get { return returnTitleAsString(germanTitle); } set { setTitleFromString(value, 2); } } - /// - /// The french Title. - /// - public string FrenchTitle { get { return returnTitleAsString(frenchTitle); } set { setTitleFromString(value, 3); } } - /// - /// The spanish Title. - /// - public string SpanishTitle { get { return returnTitleAsString(spanishTitle); } set { setTitleFromString(value, 4); } } - /// - /// The italian Title. - /// - public string ItalianTitle { get { return returnTitleAsString(italianTitle); } set { setTitleFromString(value, 5); } } - /// - /// The dutch Title. - /// - public string DutchTitle { get { return returnTitleAsString(dutchTitle); } set { setTitleFromString(value, 6); } } - /// - /// The korean Title. - /// - public string KoreanTitle { get { return returnTitleAsString(koreanTitle); } set { setTitleFromString(value, 7); } } - /// - /// All Titles as a string array. - /// - public string[] AllTitles { get { return new string[] { JapaneseTitle, EnglishTitle, GermanTitle, FrenchTitle, SpanishTitle, ItalianTitle, DutchTitle, KoreanTitle }; } } - /// - /// When parsing an IMET header, this value will turn false if the hash stored in the header doesn't match the headers hash. - /// - public bool HashesMatch { get { return hashesMatch; } } - - #region Public Functions - /// - /// Loads the IMET Header of a file. - /// - /// - /// - public static IMET Load(string pathToFile) - { - return Load(File.ReadAllBytes(pathToFile)); - } - - /// - /// Loads the IMET Header of a byte array. - /// - /// - /// - public static IMET Load(byte[] fileOrHeader) - { - HeaderType type = DetectHeader(fileOrHeader); - if (type != HeaderType.IMET && type != HeaderType.ShortIMET) - throw new Exception("No IMET Header found!"); - - IMET s = new IMET(); - if (type == HeaderType.ShortIMET) s.isShortImet = true; - - MemoryStream ms = new MemoryStream(fileOrHeader); - try { s.parseHeader(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - return s; - } - - /// - /// Loads the IMET Header of a stream. - /// - /// - /// - public static IMET Load(Stream fileOrHeader) - { - HeaderType type = DetectHeader(fileOrHeader); - if (type != HeaderType.IMET && type != HeaderType.ShortIMET) - throw new Exception("No IMET Header found!"); - - IMET s = new IMET(); - if (type == HeaderType.ShortIMET) s.isShortImet = true; - - s.parseHeader(fileOrHeader); - return s; - } - - /// - /// Creates a new IMET Header. - /// - /// - /// - /// - /// - /// - /// - public static IMET Create(bool isShortImet, int iconSize, int bannerSize, int soundSize, params string[] titles) - { - IMET s = new IMET(); - s.isShortImet = isShortImet; - - for (int i = 0; i < titles.Length; i++) - s.setTitleFromString(titles[i], i); - - for (int i = titles.Length; i < 8; i++) - s.setTitleFromString((titles.Length > 1) ? titles[1] : titles[0], i); - - s.iconSize = (uint)iconSize; - s.bannerSize = (uint)bannerSize; - s.soundSize = (uint)soundSize; - - return s; - } - - /// - /// Removes the IMET Header of a file. - /// - /// - public static void RemoveHeader(string pathToFile) - { - byte[] fileWithoutHeader = RemoveHeader(File.ReadAllBytes(pathToFile)); - File.Delete(pathToFile); - - File.WriteAllBytes(pathToFile, fileWithoutHeader); - } - - /// - /// Removes the IMET Header of a byte array. - /// - /// - /// - public static byte[] RemoveHeader(byte[] file) - { - HeaderType type = DetectHeader(file); - if (type != HeaderType.IMET && type != HeaderType.ShortIMET) - throw new Exception("No IMET Header found!"); - - byte[] fileWithoutHeader = new byte[file.Length - (int)type]; - Array.Copy(file, (int)type, fileWithoutHeader, 0, fileWithoutHeader.Length); - - return fileWithoutHeader; - } - - - - /// - /// Sets all title to the given string. - /// - /// - public void SetAllTitles(string newTitle) - { - for (int i = 0; i < 10; i++) - setTitleFromString(newTitle, i); - } - - /// - /// Returns the Header as a memory stream. - /// - /// - public MemoryStream ToMemoryStream() - { - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - return ms; - } - - /// - /// Returns the Header as a byte array. - /// - /// - public byte[] ToByteArray() - { - return ToMemoryStream().ToArray(); - } - - /// - /// Writes the Header to the given stream. - /// - /// - public void Write(Stream writeStream) - { - writeToStream(writeStream); - } - - /// - /// Changes the Titles. - /// - /// - public void ChangeTitles(params string[] newTitles) - { - for (int i = 0; i < newTitles.Length; i++) - setTitleFromString(newTitles[i], i); - - for (int i = newTitles.Length; i < 8; i++) - setTitleFromString((newTitles.Length > 1) ? newTitles[1] : newTitles[0], i); - } - - /// - /// Returns a string array with the Titles. - /// - /// - public string[] GetTitles() - { - return new string[] { JapaneseTitle, EnglishTitle, GermanTitle, FrenchTitle, SpanishTitle, ItalianTitle, DutchTitle, KoreanTitle }; - } - #endregion - - #region Private Functions - private void writeToStream(Stream writeStream) - { - writeStream.Seek(0, SeekOrigin.Begin); - - if (!isShortImet) writeStream.Write(additionalPadding, 0, additionalPadding.Length); - - writeStream.Write(padding, 0, padding.Length); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(imetMagic)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(sizeOfHeader)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(unknown)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(iconSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(bannerSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(soundSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(flags)), 0, 4); - - writeStream.Write(japaneseTitle, 0, japaneseTitle.Length); - writeStream.Write(englishTitle, 0, englishTitle.Length); - writeStream.Write(germanTitle, 0, germanTitle.Length); - writeStream.Write(frenchTitle, 0, frenchTitle.Length); - writeStream.Write(spanishTitle, 0, spanishTitle.Length); - writeStream.Write(italianTitle, 0, italianTitle.Length); - writeStream.Write(dutchTitle, 0, dutchTitle.Length); - writeStream.Write(unknownTitle1, 0, unknownTitle1.Length); - writeStream.Write(unknownTitle2, 0, unknownTitle2.Length); - writeStream.Write(koreanTitle, 0, koreanTitle.Length); - writeStream.Write(padding2, 0, padding2.Length); - - int hashPos = (int)writeStream.Position; - hash = new byte[16]; - writeStream.Write(hash, 0, hash.Length); - - byte[] toHash = new byte[writeStream.Position]; - writeStream.Seek(0, SeekOrigin.Begin); - writeStream.Read(toHash, 0, toHash.Length); - - computeHash(toHash, isShortImet ? 0 : 0x40); - - writeStream.Seek(hashPos, SeekOrigin.Begin); - writeStream.Write(hash, 0, hash.Length); - } - - private void computeHash(byte[] headerBytes, int hashPos) - { - MD5 md5 = MD5.Create(); - hash = md5.ComputeHash(headerBytes, hashPos, 0x600); - md5.Clear(); - } - - private void parseHeader(Stream headerStream) - { - headerStream.Seek(0, SeekOrigin.Begin); - byte[] tmp = new byte[4]; - - if (!isShortImet) headerStream.Read(additionalPadding, 0, additionalPadding.Length); - headerStream.Read(padding, 0, padding.Length); - - headerStream.Read(tmp, 0, 4); - if (Shared.Swap(BitConverter.ToUInt32(tmp, 0)) != imetMagic) - throw new Exception("Invalid Magic!"); - - headerStream.Read(tmp, 0, 4); - if (Shared.Swap(BitConverter.ToUInt32(tmp, 0)) != sizeOfHeader) - throw new Exception("Invalid Header Size!"); - - headerStream.Read(tmp, 0, 4); - unknown = Shared.Swap(BitConverter.ToUInt32(tmp, 0)); - - headerStream.Read(tmp, 0, 4); - iconSize = Shared.Swap(BitConverter.ToUInt32(tmp, 0)); - - headerStream.Read(tmp, 0, 4); - bannerSize = Shared.Swap(BitConverter.ToUInt32(tmp, 0)); - - headerStream.Read(tmp, 0, 4); - soundSize = Shared.Swap(BitConverter.ToUInt32(tmp, 0)); - - headerStream.Read(tmp, 0, 4); - flags = Shared.Swap(BitConverter.ToUInt32(tmp, 0)); - - headerStream.Read(japaneseTitle, 0, japaneseTitle.Length); - headerStream.Read(englishTitle, 0, englishTitle.Length); - headerStream.Read(germanTitle, 0, germanTitle.Length); - headerStream.Read(frenchTitle, 0, frenchTitle.Length); - headerStream.Read(spanishTitle, 0, spanishTitle.Length); - headerStream.Read(italianTitle, 0, italianTitle.Length); - headerStream.Read(dutchTitle, 0, dutchTitle.Length); - headerStream.Read(unknownTitle1, 0, unknownTitle1.Length); - headerStream.Read(unknownTitle2, 0, unknownTitle2.Length); - headerStream.Read(koreanTitle, 0, koreanTitle.Length); - - headerStream.Read(padding2, 0, padding2.Length); - headerStream.Read(hash, 0, hash.Length); - - headerStream.Seek(-16, SeekOrigin.Current); - headerStream.Write(new byte[16], 0, 16); - - byte[] temp = new byte[headerStream.Length]; - headerStream.Seek(0, SeekOrigin.Begin); - headerStream.Read(temp, 0, temp.Length); - - MD5 m = MD5.Create(); - byte[] newHash = m.ComputeHash(temp, (isShortImet) ? 0 : 0x40, 0x600); - m.Clear(); - - hashesMatch = Shared.CompareByteArrays(newHash, hash); - } - - private string returnTitleAsString(byte[] title) - { - string tempStr = string.Empty; - - for (int i = 0; i < 84; i += 2) - { - char tempChar = BitConverter.ToChar(new byte[] { title[i + 1], title[i] }, 0); - if (tempChar != 0x00) tempStr += tempChar; - } - - return tempStr; - } - - private void setTitleFromString(string title, int titleIndex) - { - byte[] tempArray = new byte[84]; - - for (int i = 0; i < title.Length; i++) - { - byte[] tempBytes = BitConverter.GetBytes(title[i]); - tempArray[i * 2 + 1] = tempBytes[0]; - tempArray[i * 2] = tempBytes[1]; - } - - switch (titleIndex) - { - case 0: - japaneseTitle = tempArray; - break; - case 1: - englishTitle = tempArray; - break; - case 2: - germanTitle = tempArray; - break; - case 3: - frenchTitle = tempArray; - break; - case 4: - spanishTitle = tempArray; - break; - case 5: - italianTitle = tempArray; - break; - case 6: - dutchTitle = tempArray; - break; - case 7: - koreanTitle = tempArray; - break; - } - } - #endregion - } - - public class IMD5 - { - private uint imd5Magic = 0x494d4435; - private uint fileSize; - private byte[] padding = new byte[8]; - private byte[] hash = new byte[16]; - - /// - /// The size of the file without the IMD5 Header. - /// - public uint FileSize { get { return fileSize; } } - /// - /// The hash of the file without the IMD5 Header. - /// - public byte[] Hash { get { return hash; } } - - private IMD5() { } - - #region Public Functions - /// - /// Loads the IMD5 Header of a file. - /// - /// - /// - public static IMD5 Load(string pathToFile) - { - return Load(File.ReadAllBytes(pathToFile)); - } - - /// - /// Loads the IMD5 Header of a byte array. - /// - /// - /// - public static IMD5 Load(byte[] fileOrHeader) - { - HeaderType type = DetectHeader(fileOrHeader); - if (type != HeaderType.IMD5) - throw new Exception("No IMD5 Header found!"); - - IMD5 h = new IMD5(); - MemoryStream ms = new MemoryStream(fileOrHeader); - - try { h.parseHeader(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - return h; - } - - /// - /// Loads the IMD5 Header of a stream. - /// - /// - /// - public static IMD5 Load(Stream fileOrHeader) - { - HeaderType type = DetectHeader(fileOrHeader); - if (type != HeaderType.IMD5) - throw new Exception("No IMD5 Header found!"); - - IMD5 h = new IMD5(); - h.parseHeader(fileOrHeader); - return h; - } - - /// - /// Creates a new IMD5 Header. - /// - /// - /// - public static IMD5 Create(byte[] file) - { - IMD5 h = new IMD5(); - - h.fileSize = (uint)file.Length; - h.computeHash(file); - - return h; - } - - /// - /// Adds an IMD5 Header to a file. - /// - /// - public static void AddHeader(string pathToFile) - { - byte[] fileWithHeader = AddHeader(File.ReadAllBytes(pathToFile)); - File.Delete(pathToFile); - - using (FileStream fs = new FileStream(pathToFile, FileMode.Create)) - fs.Write(fileWithHeader, 0, fileWithHeader.Length); - } - - /// - /// Adds an IMD5 Header to a byte array. - /// - /// - /// - public static byte[] AddHeader(byte[] file) - { - IMD5 h = IMD5.Create(file); - - MemoryStream ms = new MemoryStream(); - h.writeToStream(ms); - ms.Write(file, 0, file.Length); - - byte[] res = ms.ToArray(); - ms.Dispose(); - return res; - } - - /// - /// Removes the IMD5 Header of a file. - /// - /// - public static void RemoveHeader(string pathToFile) - { - byte[] fileWithoutHeader = RemoveHeader(File.ReadAllBytes(pathToFile)); - File.Delete(pathToFile); - - using (FileStream fs = new FileStream(pathToFile, FileMode.Create)) - fs.Write(fileWithoutHeader, 0, fileWithoutHeader.Length); - } - - /// - /// Removes the IMD5 Header of a byte array. - /// - /// - /// - public static byte[] RemoveHeader(byte[] file) - { - MemoryStream ms = new MemoryStream(); - ms.Write(file, 32, file.Length - 32); - - byte[] ret = ms.ToArray(); - ms.Dispose(); - - return ret; - } - - - - /// - /// Returns the IMD5 Header as a memory stream. - /// - /// - public MemoryStream ToMemoryStream() - { - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - return ms; - } - - /// - /// Returns the IMD5 Header as a byte array. - /// - /// - public byte[] ToByteArray() - { - return ToMemoryStream().ToArray(); - } - - /// - /// Writes the IMD5 Header to the given stream. - /// - /// - public void Write(Stream writeStream) - { - writeToStream(writeStream); - } - #endregion - - #region Private Functions - private void writeToStream(Stream writeStream) - { - writeStream.Seek(0, SeekOrigin.Begin); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(imd5Magic)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(fileSize)), 0, 4); - writeStream.Write(padding, 0, padding.Length); - writeStream.Write(hash, 0, hash.Length); - } - - private void computeHash(byte[] bytesToHash) - { - MD5 md5 = MD5.Create(); - hash = md5.ComputeHash(bytesToHash); - md5.Clear(); - } - - private void parseHeader(Stream headerStream) - { - headerStream.Seek(0, SeekOrigin.Begin); - byte[] tmp = new byte[4]; - - headerStream.Read(tmp, 0, 4); - if (Shared.Swap(BitConverter.ToUInt32(tmp, 0)) != imd5Magic) - throw new Exception("Invalid Magic!"); - - headerStream.Read(tmp, 0, 4); - fileSize = Shared.Swap(BitConverter.ToUInt32(tmp, 0)); - - headerStream.Read(padding, 0, padding.Length); - headerStream.Read(hash, 0, hash.Length); - } - #endregion - } - } -} diff --git a/NUS Downloader/IosPatcher.cs b/NUS Downloader/IosPatcher.cs deleted file mode 100644 index 00121fa..0000000 --- a/NUS Downloader/IosPatcher.cs +++ /dev/null @@ -1,313 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -//Patches based on Dop-Mii - Thanks to Arikado and Lunatik - -using System; -using System.ComponentModel; -using System.Text; - -namespace libWiiSharp -{ - /// - /// An IOS patcher which can patch fakesigning, es_identify and nand permissions. - /// - public class IosPatcher - { - private WAD wadFile; - private int esIndex = -1; - - #region Public Functions - /// - /// Loads an IOS wad to patch the es module. - /// - /// - public void LoadIOS(ref WAD iosWad) - { - if ((iosWad.TitleID >> 32) != 1 || - (iosWad.TitleID & 0xFFFFFFFF) < 3 || - (iosWad.TitleID & 0xFFFFFFFF) > 255) - throw new Exception("Only IOS WADs can be patched!"); - - wadFile = iosWad; - getEsIndex(); - } - - /// - /// Patches fakesigning. - /// Returns the number of applied patches. - /// - /// - public int PatchFakeSigning() - { - if (esIndex < 0) return -1; - return patchFakeSigning(ref wadFile.Contents[esIndex]); - } - - /// - /// Patches es_identify. - /// Returns the number of applied patches. - /// - /// - public int PatchEsIdentify() - { - if (esIndex < 0) return -1; - return patchEsIdentify(ref wadFile.Contents[esIndex]); - } - - /// - /// Patches nand permissions. - /// Returns the number of applied patches. - /// - /// - public int PatchNandPermissions() - { - if (esIndex < 0) return -1; - return patchNandPermissions(ref wadFile.Contents[esIndex]); - } - - /// - /// Patches fakesigning, es_identify and nand permissions. - /// Returns the number of applied patches. - /// - /// - public int PatchAll() - { - if (esIndex < 0) return -1; - return patchAll(ref wadFile.Contents[esIndex]); - } - - /// - /// Patches fakesigning. - /// Returns the number of applied patches. - /// - /// - public int PatchFakeSigning(ref byte[] esModule) - { - return patchFakeSigning(ref esModule); - } - - /// - /// Patches es_identify. - /// Returns the number of applied patches. - /// - /// - public int PatchEsIdentify(ref byte[] esModule) - { - return patchEsIdentify(ref esModule); - } - - /// - /// Patches nand permissions. - /// Returns the number of applied patches. - /// - /// - public int PatchNandPermissions(ref byte[] esModule) - { - return patchNandPermissions(ref esModule); - } - - /// - /// Patches fakesigning, es_identify and nand permissions. - /// Returns the number of applied patches. - /// - /// - public int PatchAll(ref byte[] esModule) - { - return patchAll(ref esModule); - } - #endregion - - #region Private Functions - private int patchFakeSigning(ref byte[] esModule) - { - fireDebug("Patching Fakesigning..."); - int patchCount = 0; - - byte[] oldHashCheck = { 0x20, 0x07, 0x23, 0xA2 }; - byte[] newHashCheck = { 0x20, 0x07, 0x4B, 0x0B }; - - for (int i = 0; i < esModule.Length - 4; i++) - { - fireProgress((i + 1) * 100 / esModule.Length); - - if (Shared.CompareByteArrays(esModule, i, oldHashCheck, 0, 4) || - Shared.CompareByteArrays(esModule, i, newHashCheck, 0, 4)) - { - fireDebug(" Patching at Offset: 0x{0}", i.ToString("x8").ToUpper()); - esModule[i + 1] = 0x00; - i += 4; - patchCount++; - } - } - - fireDebug("Patching Fakesigning Finished... (Patches applied: {0})", patchCount); - return patchCount; - } - - private int patchEsIdentify(ref byte[] esModule) - { - fireDebug("Patching ES_Identify..."); - int patchCount = 0; - - byte[] identifyCheck = { 0x28, 0x03, 0xD1, 0x23 }; - - for (int i = 0; i < esModule.Length - 4; i++) - { - fireProgress((i + 1) * 100 / esModule.Length); - - if (Shared.CompareByteArrays(esModule, i, identifyCheck, 0, 4)) - { - fireDebug(" Patching at Offset: 0x{0}", i.ToString("x8").ToUpper()); - esModule[i + 2] = 0x00; - esModule[i + 3] = 0x00; - i += 4; - patchCount++; - } - } - - fireDebug("Patching ES_Identify Finished... (Patches applied: {0})", patchCount); - return patchCount; - } - - private int patchNandPermissions(ref byte[] esModule) - { - fireDebug("Patching NAND Permissions..."); - int patchCount = 0; - - byte[] permissionTable = { 0x42, 0x8B, 0xD0, 0x01, 0x25, 0x66 }; - - for (int i = 0; i < esModule.Length - 6; i++) - { - fireProgress((i + 1) * 100 / esModule.Length); - - if (Shared.CompareByteArrays(esModule, i, permissionTable, 0, 6)) - { - fireDebug(" Patching at Offset: 0x{0}", i.ToString("x8").ToUpper()); - esModule[i + 2] = 0xE0; - i += 6; - patchCount++; - } - } - - fireDebug("Patching NAND Permissions Finished... (Patches applied: {0})", patchCount); - return patchCount; - } - - private int patchAll(ref byte[] esModule) - { - fireDebug("Patching Fakesigning, ES_Identify and NAND Permissions..."); - int patchCount = 0; - - byte[] oldHashCheck = { 0x20, 0x07, 0x23, 0xA2 }; - byte[] newHashCheck = { 0x20, 0x07, 0x4B, 0x0B }; - byte[] identifyCheck = { 0x28, 0x03, 0xD1, 0x23 }; - byte[] permissionTable = { 0x42, 0x8B, 0xD0, 0x01, 0x25, 0x66 }; - - for (int i = 0; i < esModule.Length - 6; i++) - { - fireProgress((i + 1) * 100 / esModule.Length); - - if (Shared.CompareByteArrays(esModule, i, oldHashCheck, 0, 4) || - Shared.CompareByteArrays(esModule, i, newHashCheck, 0, 4)) - { - fireDebug(" Patching Fakesigning at Offset: 0x{0}", i.ToString("x8").ToUpper()); - esModule[i + 1] = 0x00; - i += 4; - patchCount++; - } - else if (Shared.CompareByteArrays(esModule, i, identifyCheck, 0, 4)) - { - fireDebug(" Patching ES_Identify at Offset: 0x{0}", i.ToString("x8").ToUpper()); - esModule[i + 2] = 0x00; - esModule[i + 3] = 0x00; - i += 4; - patchCount++; - } - else if (Shared.CompareByteArrays(esModule, i, permissionTable, 0, 6)) - { - fireDebug(" Patching NAND Permissions at Offset: 0x{0}", i.ToString("x8").ToUpper()); - esModule[i + 2] = 0xE0; - i += 6; - patchCount++; - } - } - - fireDebug("Patching Fakesigning, ES_Identify and NAND Permissions Finished... (Patches applied: {0})", patchCount); - return patchCount; - } - - private void getEsIndex() - { - fireDebug("Scanning for ES Module..."); - string iosTag = "$IOSVersion:"; - - for (int i = wadFile.NumOfContents - 1; i >= 0; i--) - { - fireDebug(" Scanning Content #{0} of {1}...", i + 1, wadFile.NumOfContents); - fireProgress((i + 1) * 100 / wadFile.NumOfContents); - - for (int j = 0; j < wadFile.Contents[i].Length - 64; j++) - { - if (ASCIIEncoding.ASCII.GetString(wadFile.Contents[i], j, 12) == iosTag) - { - int curIndex = j + 12; - while (wadFile.Contents[i][curIndex] == ' ') { curIndex++; } - - if (ASCIIEncoding.ASCII.GetString(wadFile.Contents[i], curIndex, 3) == "ES:") - { - fireDebug(" -> ES Module found!"); - fireDebug("Scanning for ES Module Finished..."); - esIndex = i; - fireProgress(100); - return; - } - } - } - } - - fireDebug(@"/!\/!\/!\ ES Module wasn't found! /!\/!\/!\"); - throw new Exception("ES module wasn't found!"); - } - #endregion - - #region Events - /// - /// Fires the Progress of various operations - /// - public event EventHandler Progress; - /// - /// Fires debugging messages. You may write them into a log file or log textbox. - /// - public event EventHandler Debug; - - private void fireDebug(string debugMessage, params object[] args) - { - EventHandler debug = Debug; - if (debug != null) - debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); - } - - private void fireProgress(int progressPercentage) - { - EventHandler progress = Progress; - if (progress != null) - progress(new object(), new ProgressChangedEventArgs(progressPercentage, string.Empty)); - } - #endregion - } -} diff --git a/NUS Downloader/Latest/NUS Downloader.exe b/NUS Downloader/Latest/NUS Downloader.exe deleted file mode 100644 index cb3590accb21ef6a54e0304fd98b3c10141ccabd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470016 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

1z;{>6vM^i&{m4 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 F{4cRx%838~ diff --git a/NUS Downloader/Lz77.cs b/NUS Downloader/Lz77.cs deleted file mode 100644 index 809ed6f..0000000 --- a/NUS Downloader/Lz77.cs +++ /dev/null @@ -1,400 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -//Lz77 (de-)compression algorithm based on gbalzss by Andre Perrot (Thanks!) - -using System; -using System.IO; - -namespace libWiiSharp -{ - public class Lz77 - { - private static uint lz77Magic = 0x4c5a3737; - private const int N = 4096; - private const int F = 18; - private const int threshold = 2; - private int[] leftSon = new int[N + 1]; - private int[] rightSon = new int[N + 257]; - private int[] dad = new int[N + 1]; - private ushort[] textBuffer = new ushort[N + 17]; - private int matchPosition = 0, matchLength = 0; - - ///

- /// Lz77 Magic. - /// - public static uint Lz77Magic { get { return lz77Magic; } } - - #region Public Functions - /// - /// Checks whether a file is Lz77 compressed or not. - /// - /// - /// - public static bool IsLz77Compressed(string file) - { - return IsLz77Compressed(File.ReadAllBytes(file)); - } - - /// - /// Checks whether a file is Lz77 compressed or not. - /// - /// - /// - public static bool IsLz77Compressed(byte[] file) - { - Headers.HeaderType h = Headers.DetectHeader(file); - return (Shared.Swap(BitConverter.ToUInt32(file, (int)h)) == lz77Magic) ; - } - - /// - /// Checks whether a file is Lz77 compressed or not. - /// - /// - /// - public static bool IsLz77Compressed(Stream file) - { - Headers.HeaderType h = Headers.DetectHeader(file); - byte[] temp = new byte[4]; - file.Seek((long)h, SeekOrigin.Begin); - file.Read(temp, 0, temp.Length); - return (Shared.Swap(BitConverter.ToUInt32(temp, 0)) == lz77Magic); - } - - - - /// - /// Compresses a file using the Lz77 algorithm. - /// - /// - /// - public void Compress(string inFile, string outFile) - { - Stream compressedFile; - - using (FileStream fsIn = new FileStream(inFile, FileMode.Open)) - compressedFile = compress(fsIn); - - byte[] output = new byte[compressedFile.Length]; - compressedFile.Read(output, 0, output.Length); - - if (File.Exists(outFile)) File.Delete(outFile); - - using (FileStream fs = new FileStream(outFile, FileMode.Create)) - fs.Write(output, 0, output.Length); - } - - /// - /// Compresses the byte array using the Lz77 algorithm. - /// - /// - /// - public byte[] Compress(byte[] file) - { - return ((MemoryStream)compress(new MemoryStream(file))).ToArray(); - } - - /// - /// Compresses the stream using the Lz77 algorithm. - /// - /// - /// - public Stream Compress(Stream file) - { - return compress(file); - } - - /// - /// Decompresses a file using the Lz77 algorithm. - /// - /// - /// - public void Decompress(string inFile, string outFile) - { - Stream compressedFile; - - using (FileStream fsIn = new FileStream(inFile, FileMode.Open)) - compressedFile = decompress(fsIn); - - byte[] output = new byte[compressedFile.Length]; - compressedFile.Read(output, 0, output.Length); - - if (File.Exists(outFile)) File.Delete(outFile); - - using (FileStream fs = new FileStream(outFile, FileMode.Create)) - fs.Write(output, 0, output.Length); - } - - /// - /// Decompresses the byte array using the Lz77 algorithm. - /// - /// - /// - public byte[] Decompress(byte[] file) - { - return ((MemoryStream)decompress(new MemoryStream(file))).ToArray(); - } - - public Stream Decompress(Stream file) - { - return decompress(file); - } - #endregion - - #region Private Functions - private Stream decompress(Stream inFile) - { - if (!Lz77.IsLz77Compressed(inFile)) return inFile; - inFile.Seek(0, SeekOrigin.Begin); - - int i, j, k, r, c, z; - uint flags, decompressedSize, currentSize = 0; - - Headers.HeaderType h = Headers.DetectHeader(inFile); - - byte[] temp = new byte[8]; - inFile.Seek((int)h, SeekOrigin.Begin); - inFile.Read(temp, 0, 8); - - if (Shared.Swap(BitConverter.ToUInt32(temp, 0)) != lz77Magic) - { inFile.Dispose(); throw new Exception("Invaild Magic!"); } - if (temp[4] != 0x10) - { inFile.Dispose(); throw new Exception("Unsupported Compression Type!"); } - - decompressedSize = (BitConverter.ToUInt32(temp, 4)) >> 8; - - for (i = 0; i < N - F; i++) textBuffer[i] = 0xdf; - r = N - F; flags = 7; z = 7; - - MemoryStream outFile = new MemoryStream(); - while (true) - { - flags <<= 1; - z++; - - if (z == 8) - { - if ((c = inFile.ReadByte()) == -1) break; - - flags = (uint)c; - z = 0; - } - - if ((flags & 0x80) == 0) - { - if ((c = inFile.ReadByte()) == inFile.Length - 1) break; - if (currentSize < decompressedSize) outFile.WriteByte((byte)c); - - textBuffer[r++] = (byte)c; - r &= (N - 1); - currentSize++; - } - else - { - if ((i = inFile.ReadByte()) == -1) break; - if ((j = inFile.ReadByte()) == -1) break; - - j = j | ((i << 8) & 0xf00); - i = ((i >> 4) & 0x0f) + threshold; - for (k = 0; k <= i; k++) - { - c = textBuffer[(r - j - 1) & (N - 1)]; - if (currentSize < decompressedSize) outFile.WriteByte((byte)c); textBuffer[r++] = (byte)c; r &= (N - 1); currentSize++; - } - } - } - - return outFile; - } - - private Stream compress(Stream inFile) - { - if (Lz77.IsLz77Compressed(inFile)) return inFile; - inFile.Seek(0, SeekOrigin.Begin); - - int textSize = 0; - int codeSize = 0; - - int i, c, r, s, length, lastMatchLength, codeBufferPointer, mask; - int[] codeBuffer = new int[17]; - - uint fileSize = ((Convert.ToUInt32(inFile.Length)) << 8) + 0x10; - MemoryStream outFile = new MemoryStream(); - - outFile.Write(BitConverter.GetBytes(Shared.Swap(lz77Magic)), 0, 4); - outFile.Write(BitConverter.GetBytes(fileSize), 0, 4); - - InitTree(); - codeBuffer[0] = 0; - codeBufferPointer = 1; - mask = 0x80; - s = 0; - r = N - F; - - for (i = s; i < r; i++) textBuffer[i] = 0xffff; - - for (length = 0; length < F && (c = (int)inFile.ReadByte()) != -1; length++) - textBuffer[r + length] = (ushort)c; - - if ((textSize = length) == 0) return inFile; - - for (i = 1; i <= F; i++) InsertNode(r - i); - InsertNode(r); - - do - { - if (matchLength > length) matchLength = length; - - if (matchLength <= threshold) - { - matchLength = 1; - codeBuffer[codeBufferPointer++] = textBuffer[r]; - } - else - { - codeBuffer[0] |= mask; - - codeBuffer[codeBufferPointer++] = (char) - (((r - matchPosition - 1) >> 8) & 0x0f) | - ((matchLength - (threshold + 1)) << 4); - - codeBuffer[codeBufferPointer++] = (char)((r - matchPosition - 1) & 0xff); - } - - if ((mask >>= 1) == 0) - { - for (i = 0; i < codeBufferPointer; i++) - outFile.WriteByte((byte)codeBuffer[i]); - - codeSize += codeBufferPointer; - codeBuffer[0] = 0; codeBufferPointer = 1; - mask = 0x80; - } - - lastMatchLength = matchLength; - for (i = 0; i < lastMatchLength && (c = (int)inFile.ReadByte()) != -1; i++) - { - DeleteNode(s); - - textBuffer[s] = (ushort)c; - if (s < F - 1) textBuffer[s + N] = (ushort)c; - s = (s + 1) & (N - 1); r = (r + 1) & (N - 1); - - InsertNode(r); - } - - while (i++ < lastMatchLength) - { - DeleteNode(s); - - s = (s + 1) & (N - 1); r = (r + 1) & (N - 1); - if (--length != 0) InsertNode(r); - } - } while (length > 0); - - - if (codeBufferPointer > 1) - { - for (i = 0; i < codeBufferPointer; i++) outFile.WriteByte((byte)codeBuffer[i]); - codeSize += codeBufferPointer; - } - - if (codeSize % 4 != 0) - for (i = 0; i < 4 - (codeSize % 4); i++) - outFile.WriteByte(0x00); - - return outFile; - } - - private void InitTree() - { - int i; - for (i = N + 1; i <= N + 256; i++) rightSon[i] = N; - for (i = 0; i < N; i++) dad[i] = N; - } - - private void InsertNode(int r) - { - int i, p, cmp; - cmp = 1; - p = N + 1 + (textBuffer[r] == 0xffff ? 0 : (int)textBuffer[r]); - rightSon[r] = leftSon[r] = N; matchLength = 0; - - for (; ; ) - { - if (cmp >= 0) - { - if (rightSon[p] != N) p = rightSon[p]; - else { rightSon[p] = r; dad[r] = p; return; } - } - else - { - if (leftSon[p] != N) p = leftSon[p]; - else { leftSon[p] = r; dad[r] = p; return; } - } - - for (i = 1; i < F; i++) - if ((cmp = textBuffer[r + i] - textBuffer[p + i]) != 0) break; - - if (i > matchLength) - { - matchPosition = p; - if ((matchLength = i) >= F) break; - } - } - - dad[r] = dad[p]; leftSon[r] = leftSon[p]; rightSon[r] = rightSon[p]; - dad[leftSon[p]] = r; dad[rightSon[p]] = r; - - if (rightSon[dad[p]] == p) rightSon[dad[p]] = r; - else leftSon[dad[p]] = r; - - dad[p] = N; - } - - private void DeleteNode(int p) - { - int q; - - if (dad[p] == N) return; - - if (rightSon[p] == N) q = leftSon[p]; - else if (leftSon[p] == N) q = rightSon[p]; - else - { - q = leftSon[p]; - - if (rightSon[q] != N) - { - do { q = rightSon[q]; } while (rightSon[q] != N); - rightSon[dad[q]] = leftSon[q]; dad[leftSon[q]] = dad[q]; - leftSon[q] = leftSon[p]; dad[leftSon[p]] = q; - } - - rightSon[q] = rightSon[p]; dad[rightSon[p]] = q; - } - - dad[q] = dad[p]; - - if (rightSon[dad[p]] == p) rightSon[dad[p]] = q; - else leftSon[dad[p]] = q; - - dad[p] = N; - } - #endregion - } -} diff --git a/NUS Downloader/MessageEventArgs.cs b/NUS Downloader/MessageEventArgs.cs deleted file mode 100644 index 7191ea0..0000000 --- a/NUS Downloader/MessageEventArgs.cs +++ /dev/null @@ -1,29 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; - -namespace libWiiSharp -{ - public class MessageEventArgs : EventArgs - { - private string message; - public string Message { get { return message; } } - - public MessageEventArgs(string message) { this.message = message; } - } -} diff --git a/NUS Downloader/NUS Downloader.csproj b/NUS Downloader/NUS Downloader.csproj deleted file mode 100644 index d5415aa..0000000 --- a/NUS Downloader/NUS Downloader.csproj +++ /dev/null @@ -1,254 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {DB1289FA-BA83-408F-A576-326E5EC4CC6D} - WinExe - Properties - NUS_Downloader - NUS Downloader - v2.0 - 512 - Crystal_Clear_app_ark2.ico - false - 1555E408E7D4078FB64D4CC67B4156C20E540209 - NUS Downloader_TemporaryKey.pfx - true - false - LocalIntranet - Properties\app.manifest - - - - - 3.5 - - C:\Users\Windows7\Documents\Visual Studio 2010\Projects\NUS Downloader\NUS Downloader\publish\ - true - Disk - false - Foreground - 7 - Days - false - false - false - false - 14 - 1.0.0.%2a - false - true - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - AnyCPU - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - PreserveNewest - Form - - - Form1.cs - PreserveNewest - - - - - - - - - - Form1.cs - Designer - PreserveNewest - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - Designer - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - Component - - - Component - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - false - - - - - False - - - - - Exclude - True - File - - - False - - - - - Exclude - True - File - - - - - copy "$(TargetPath)" "$(ProjectDir)\Latest\" - - - \ No newline at end of file diff --git a/NUS Downloader/NusClient.cs b/NUS Downloader/NusClient.cs deleted file mode 100644 index 97de08e..0000000 --- a/NUS Downloader/NusClient.cs +++ /dev/null @@ -1,562 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.ComponentModel; -using System.IO; -using System.Net; -using System.Security.Cryptography; - -namespace libWiiSharp -{ - public enum StoreType - { - EncryptedContent = 0, - DecryptedContent = 1, - WAD = 2, - All = 3, - Empty = 4 - } - - public class NusClient : IDisposable - { - private const string WII_NUS_URL = "http://nus.cdn.shop.wii.com/ccs/download/"; - private const string DSI_NUS_URL = "http://nus.cdn.t.shop.nintendowifi.net/ccs/download/"; - - private const string WII_USER_AGENT = "wii libnup/1.0"; - private const string DSI_USER_AGENT = "Opera/9.50 (Nintendo; Opera/154; U; Nintendo DS; en)"; - - private string nusUrl = WII_NUS_URL; - private WebClient wcNus = new WebClient(); - private bool useLocalFiles = false; - private bool continueWithoutTicket = false; - - private int titleversion; - - public int TitleVersion { get { return titleversion; } } - - /// - /// If true, existing local files will be used. - /// - public bool UseLocalFiles { get { return useLocalFiles; } set { useLocalFiles = value; } } - /// - /// If true, the download will be continued even if no ticket for the title is avaiable (WAD packaging and decryption are disabled). - /// - public bool ContinueWithoutTicket { get { return continueWithoutTicket; } set { continueWithoutTicket = value; } } - - #region IDisposable Members - private bool isDisposed = false; - - ~NusClient() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing && !isDisposed) - { - wcNus.Dispose(); - } - - isDisposed = true; - } - #endregion - - #region Public Functions - - public void ConfigureNusClient(WebClient wcReady) - { - wcNus = wcReady; - } - - public void SetToWiiServer() - { - nusUrl = WII_NUS_URL; - wcNus.Headers.Add("User-Agent", WII_USER_AGENT); - } - - public void SetToDSiServer() - { - nusUrl = DSI_NUS_URL; - wcNus.Headers.Add("User-Agent", DSI_USER_AGENT); - } - - /// - /// Grabs a title from NUS, you can define several store types. - /// Leave the title version empty for the latest. - /// - /// - /// - /// - /// - public void DownloadTitle(string titleId, string titleVersion, string outputDir, string wadName, params StoreType[] storeTypes) - { - if (titleId.Length != 16) throw new Exception("Title ID must be 16 characters long!"); - downloadTitle(titleId, titleVersion, outputDir, wadName, storeTypes); - } - - /// - /// Grabs a TMD from NUS. - /// Leave the title version empty for the latest. - /// - /// - /// - /// - public TMD DownloadTMD(string titleId, string titleVersion) - { - if (titleId.Length != 16) throw new Exception("Title ID must be 16 characters long!"); - return downloadTmd(titleId, titleVersion); - } - - /// - /// Grabs a Ticket from NUS. - /// - /// - /// - public Ticket DownloadTicket(string titleId) - { - if (titleId.Length != 16) throw new Exception("Title ID must be 16 characters long!"); - return downloadTicket(titleId); - } - - /// - /// Grabs a single content file and decrypts it. - /// Leave the title version empty for the latest. - /// - /// - /// - /// - /// - public byte[] DownloadSingleContent(string titleId, string titleVersion, string contentId) - { - if (titleId.Length != 16) throw new Exception("Title ID must be 16 characters long!"); - return downloadSingleContent(titleId, titleVersion, contentId); - } - - /// - /// Grabs a single content file and decrypts it. - /// Leave the title version empty for the latest. - /// - /// - /// - /// - /// - public void DownloadSingleContent(string titleId, string titleVersion, string contentId, string savePath) - { - if (titleId.Length != 16) throw new Exception("Title ID must be 16 characters long!"); - if (!Directory.Exists(Path.GetDirectoryName(savePath))) Directory.CreateDirectory(Path.GetDirectoryName(savePath)); - if (File.Exists(savePath)) File.Delete(savePath); - - byte[] content = downloadSingleContent(titleId, titleVersion, contentId); - File.WriteAllBytes(savePath, content); - } - #endregion - - #region Private Functions - private byte[] downloadSingleContent(string titleId, string titleVersion, string contentId) - { - uint cId = uint.Parse(contentId, System.Globalization.NumberStyles.HexNumber); - contentId = cId.ToString("x8"); - - fireDebug("Downloading Content (Content ID: {0}) of Title {1} v{2}...", contentId, titleId, (string.IsNullOrEmpty(titleVersion)) ? "[Latest]" : titleVersion); - - fireDebug(" Checking for Internet connection..."); - if (!CheckInet()) - { fireDebug(" Connection not found..."); throw new Exception("You're not connected to the internet!"); } - - fireProgress(0); - - string tmdFile = "tmd" + (string.IsNullOrEmpty(titleVersion) ? string.Empty : string.Format(".{0}", titleVersion)); - string titleUrl = string.Format("{0}{1}/", nusUrl, titleId); - string contentIdString = string.Empty; - int cIndex = 0; - - //Download TMD - fireDebug(" Downloading TMD..."); - byte[] tmdArray = wcNus.DownloadData(titleUrl + tmdFile); - fireDebug(" Parsing TMD..."); - TMD tmd = TMD.Load(tmdArray); - - fireProgress(20); - - //Search for Content ID in TMD - fireDebug(" Looking for Content ID {0} in TMD...", contentId); - bool foundContentId = false; - for (int i = 0; i < tmd.Contents.Length; i++) - if (tmd.Contents[i].ContentID == cId) - { - fireDebug(" Content ID {0} found in TMD...", contentId); - foundContentId = true; - contentIdString = tmd.Contents[i].ContentID.ToString("x8"); - cIndex = i; - break; - } - - if (!foundContentId) - { fireDebug(" Content ID {0} wasn't found in TMD...", contentId); throw new Exception("Content ID wasn't found in the TMD!"); } - - //Download Ticket - fireDebug(" Downloading Ticket..."); - byte[] tikArray = wcNus.DownloadData(titleUrl + "cetk"); - fireDebug(" Parsing Ticket..."); - Ticket tik = Ticket.Load(tikArray); - - fireProgress(40); - - //Download and Decrypt Content - fireDebug(" Downloading Content... ({0} bytes)", tmd.Contents[cIndex].Size); - byte[] encryptedContent = wcNus.DownloadData(titleUrl + contentIdString); - - fireProgress(80); - - fireDebug(" Decrypting Content..."); - byte[] decryptedContent = decryptContent(encryptedContent, cIndex, tik, tmd); - Array.Resize(ref decryptedContent, (int)tmd.Contents[cIndex].Size); - - //Check SHA1 - SHA1 s = SHA1.Create(); - byte[] newSha = s.ComputeHash(decryptedContent); - - if (!Shared.CompareByteArrays(newSha, tmd.Contents[cIndex].Hash)) - { fireDebug(@"/!\ /!\ /!\ Hashes do not match /!\ /!\ /!\"); throw new Exception("Hashes do not match!"); } - - fireProgress(100); - - fireDebug("Downloading Content (Content ID: {0}) of Title {1} v{2} Finished...", contentId, titleId, (string.IsNullOrEmpty(titleVersion)) ? "[Latest]" : titleVersion); - return decryptedContent; - } - - private Ticket downloadTicket(string titleId) - { - if (!CheckInet()) - throw new Exception("You're not connected to the internet!"); - - string titleUrl = string.Format("{0}{1}/", nusUrl, titleId); - byte[] tikArray = wcNus.DownloadData(titleUrl + "cetk"); - - return Ticket.Load(tikArray); - } - - private TMD downloadTmd(string titleId, string titleVersion) - { - if (!CheckInet()) - throw new Exception("You're not connected to the internet!"); - - string titleUrl = string.Format("{0}{1}/", nusUrl, titleId); - string tmdFile = "tmd" + (string.IsNullOrEmpty(titleVersion) ? string.Empty : string.Format(".{0}", titleVersion)); - - byte[] tmdArray = wcNus.DownloadData(titleUrl + tmdFile); - - return TMD.Load(tmdArray); - } - - private void downloadTitle(string titleId, string titleVersion, string outputDir, string wadName, StoreType[] storeTypes) - { - fireDebug("Downloading Title {0} v{1}...", titleId, (string.IsNullOrEmpty(titleVersion)) ? "[Latest]" : titleVersion); - - if (storeTypes.Length < 1) - { fireDebug(" No store types were defined..."); throw new Exception("You must at least define one store type!"); } - - string titleUrl = string.Format("{0}{1}/", nusUrl, titleId); - bool storeEncrypted = false; - bool storeDecrypted = false; - bool storeWad = false; - - fireProgress(0); - - foreach (StoreType st in storeTypes) - { - switch (st) - { - case StoreType.DecryptedContent: - fireDebug(" [=] Storing Decrypted Content..."); - storeDecrypted = true; - break; - case StoreType.EncryptedContent: - fireDebug(" [=] Storing Encrypted Content..."); - storeEncrypted = true; - break; - case StoreType.WAD: - fireDebug(" [=] Storing WAD..."); - storeWad = true; - break; - case StoreType.All: - fireDebug(" [=] Storing Decrypted Content..."); - fireDebug(" [=] Storing Encrypted Content..."); - fireDebug(" [=] Storing WAD..."); - storeDecrypted = true; - storeEncrypted = true; - storeWad = true; - break; - case StoreType.Empty: - break; - } - } - /* - fireDebug(" - Checking for Internet connection..."); - if (!CheckInet()) - { fireDebug(" + Connection not found..."); throw new Exception("You're not connected to the internet!"); } - */ - - if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir); - if (!Directory.Exists(Path.Combine(outputDir, titleId))) Directory.CreateDirectory(Path.Combine(outputDir, titleId)); - outputDir = Path.Combine(outputDir, titleId); - - string tmdFile = "tmd" + (string.IsNullOrEmpty(titleVersion) ? string.Empty : string.Format(".{0}", titleVersion)); - - //Download TMD - fireDebug(" - Downloading TMD..."); - TMD tmd; - byte[] tmdFileWithCerts; - try - { - tmdFileWithCerts = wcNus.DownloadData(titleUrl + tmdFile); - tmd = TMD.Load(tmdFileWithCerts); - } - catch (Exception ex) { fireDebug(" + Downloading TMD Failed..."); throw new Exception("Downloading TMD Failed:\n" + ex.Message); } - - //Parse TMD - fireDebug(" - Parsing TMD..."); - - if (string.IsNullOrEmpty(titleVersion)) { fireDebug(" + Title Version: {0}", tmd.TitleVersion); } - fireDebug(" + {0} Contents", tmd.NumOfContents); - - if (!Directory.Exists(Path.Combine(outputDir, tmd.TitleVersion.ToString()))) Directory.CreateDirectory(Path.Combine(outputDir, tmd.TitleVersion.ToString())); - outputDir = Path.Combine(outputDir, tmd.TitleVersion.ToString()); - - this.titleversion = tmd.TitleVersion; - - File.WriteAllBytes(Path.Combine(outputDir, tmdFile), tmd.ToByteArray()); - - fireProgress(5); - - //Download cetk - fireDebug(" - Downloading Ticket..."); - try - { - wcNus.DownloadFile(Path.Combine(titleUrl, "cetk"), Path.Combine(outputDir, "cetk")); - } - catch (Exception ex) - { - if (!continueWithoutTicket || !storeEncrypted) - { - fireDebug(" + Downloading Ticket Failed..."); - throw new Exception("Downloading Ticket Failed:\n" + ex.Message); - } - - if (!(File.Exists(Path.Combine(outputDir, "cetk")))) - { - storeDecrypted = false; - storeWad = false; - } - } - - fireProgress(10); - - // Parse Ticket - Ticket tik = new Ticket(); - - if (File.Exists(Path.Combine(outputDir, "cetk"))) - { - fireDebug(" + Parsing Ticket..."); - tik = Ticket.Load(Path.Combine(outputDir, "cetk")); - - // DSi ticket? Must make sure to use DSi Key :D - if (nusUrl == DSI_NUS_URL) - tik.DSiTicket = true; - } - else - { - fireDebug(" + Ticket Unavailable..."); - } - - string[] encryptedContents = new string[tmd.NumOfContents]; - - //Download Content - for (int i = 0; i < tmd.NumOfContents; i++) - { - fireDebug(" - Downloading Content #{0} of {1}... ({2} bytes)", i + 1, tmd.NumOfContents, tmd.Contents[i].Size); - fireProgress(((i + 1) * 60 / tmd.NumOfContents) + 10); - - if (useLocalFiles && File.Exists(Path.Combine(outputDir, tmd.Contents[i].ContentID.ToString("x8")))) - { fireDebug(" + Using Local File, Skipping..."); continue; } - - try - { - wcNus.DownloadFile(titleUrl + tmd.Contents[i].ContentID.ToString("x8"), - Path.Combine(outputDir, tmd.Contents[i].ContentID.ToString("x8"))); - - encryptedContents[i] = tmd.Contents[i].ContentID.ToString("x8"); - } - catch (Exception ex) { fireDebug(" - Downloading Content #{0} of {1} failed...", i + 1, tmd.NumOfContents); throw new Exception("Downloading Content Failed:\n" + ex.Message); } - } - - //Decrypt Content - if (storeDecrypted || storeWad) - { - SHA1 s = SHA1.Create(); - - for (int i = 0; i < tmd.NumOfContents; i++) - { - fireDebug(" - Decrypting Content #{0} of {1}...", i + 1, tmd.NumOfContents); - fireProgress(((i + 1) * 20 / tmd.NumOfContents) + 75); - - //Decrypt Content - byte[] decryptedContent = - decryptContent(File.ReadAllBytes(Path.Combine(outputDir, tmd.Contents[i].ContentID.ToString("x8"))), i, tik, tmd); - Array.Resize(ref decryptedContent, (int)tmd.Contents[i].Size); - - //Check SHA1 - byte[] newSha = s.ComputeHash(decryptedContent); - if (!Shared.CompareByteArrays(newSha, tmd.Contents[i].Hash)) - { - fireDebug(@" + Hashes do not match! (Invalid Output)"); - //throw new Exception(string.Format("Content #{0}: Hashes do not match!", i)); - } - - //Write Decrypted Content - File.WriteAllBytes(Path.Combine(outputDir, (tmd.Contents[i].ContentID.ToString("x8") + ".app")), decryptedContent); - } - - s.Clear(); - } - - //Pack Wad - if (storeWad) - { - fireDebug(" - Building Certificate Chain..."); - CertificateChain cert = CertificateChain.FromTikTmd(Path.Combine(outputDir, "cetk"), tmdFileWithCerts); - - byte[][] contents = new byte[tmd.NumOfContents][]; - - for (int i = 0; i < tmd.NumOfContents; i++) - contents[i] = File.ReadAllBytes(Path.Combine(outputDir, (tmd.Contents[i].ContentID.ToString("x8") + ".app"))); - - fireDebug(" - Creating WAD..."); - WAD wad = WAD.Create(cert, tik, tmd, contents); - wad.RemoveFooter(); - wadName = wadName.Replace("[v]", "v" + this.TitleVersion.ToString()); // fix by madri2 - if (Path.DirectorySeparatorChar.ToString() != "/" && Path.AltDirectorySeparatorChar.ToString() != "/") - wadName = wadName.Replace("/", ""); - if (wadName.Contains(Path.DirectorySeparatorChar.ToString()) || wadName.Contains(Path.AltDirectorySeparatorChar.ToString())) - wad.Save(wadName); - else - wad.Save(Path.Combine(outputDir, wadName)); - } - - //Delete not wanted files - if (!storeEncrypted) - { - fireDebug(" - Deleting Encrypted Contents..."); - for (int i = 0; i < encryptedContents.Length; i++) - if (File.Exists(Path.Combine(outputDir, encryptedContents[i]))) File.Delete(Path.Combine(outputDir, encryptedContents[i])); - } - - if (storeWad && !storeDecrypted) - { - fireDebug(" - Deleting Decrypted Contents..."); - for (int i = 0; i < encryptedContents.Length; i++) - if (File.Exists(Path.Combine(outputDir, (encryptedContents[i] + ".app")))) File.Delete(Path.Combine(outputDir, (encryptedContents[i] + ".app"))); - } - - if (!storeDecrypted && !storeEncrypted) - { - fireDebug(" - Deleting TMD and Ticket..."); - File.Delete(Path.Combine(outputDir, tmdFile)); - File.Delete(Path.Combine(outputDir, "cetk")); - } - - fireDebug("Downloading Title {0} v{1} Finished...", titleId, tmd.TitleVersion /*(string.IsNullOrEmpty(titleVersion)) ? "[Latest]" : titleVersion*/); - fireProgress(100); - } - - private byte[] decryptContent(byte[] content, int contentIndex, Ticket tik, TMD tmd) - { - Array.Resize(ref content, Shared.AddPadding(content.Length, 16)); - byte[] titleKey = tik.TitleKey; - byte[] iv = new byte[16]; - - byte[] tmp = BitConverter.GetBytes(tmd.Contents[contentIndex].Index); - iv[0] = tmp[1]; - iv[1] = tmp[0]; - - RijndaelManaged rm = new RijndaelManaged(); - rm.Mode = CipherMode.CBC; - rm.Padding = PaddingMode.None; - rm.KeySize = 128; - rm.BlockSize = 128; - rm.Key = titleKey; - rm.IV = iv; - - ICryptoTransform decryptor = rm.CreateDecryptor(); - - MemoryStream ms = new MemoryStream(content); - CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read); - - byte[] decCont = new byte[content.Length]; - cs.Read(decCont, 0, decCont.Length); - - cs.Dispose(); - ms.Dispose(); - - return decCont; - } - - private bool CheckInet() - { - try - { - System.Net.IPHostEntry ipHost = System.Net.Dns.GetHostEntry("www.google.com"); - return true; - } - catch { return false; } - } - #endregion - - #region Events - /// - /// Fires the Progress of various operations - /// - public event EventHandler Progress; - /// - /// Fires debugging messages. You may write them into a log file or log textbox. - /// - public event EventHandler Debug; - - private void fireDebug(string debugMessage, params object[] args) - { - EventHandler debug = Debug; - if (debug != null) - debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); - } - - private void fireProgress(int progressPercentage) - { - EventHandler progress = Progress; - if (progress != null) - progress(new object(), new ProgressChangedEventArgs(progressPercentage, string.Empty)); - } - #endregion - } -} diff --git a/NUS Downloader/Program.cs b/NUS Downloader/Program.cs deleted file mode 100644 index 9d7bd6e..0000000 --- a/NUS Downloader/Program.cs +++ /dev/null @@ -1,69 +0,0 @@ -/////////////////////////////////////////// -// NUS Downloader: Program.cs // -// $Rev:: $ // -// $Author:: $ // -// $Date:: $ // -/////////////////////////////////////////// - - -using System; -using System.Windows.Forms; -using System.Runtime.InteropServices; - -namespace NUS_Downloader -{ - static class Program - { - [DllImport("user32.dll")] - public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); - - [DllImport("user32.dll")] - static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main(string[] args) - { - //Console.Title = "NUSD"; - - // hide the console window - //setConsoleWindowVisibility(false, Console.Title); - - if (args.Length != 0) - { - // hide the console window - //setConsoleWindowVisibility(true, Console.Title); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1(args)); - } - else - { - // hide the console window - //setConsoleWindowVisibility(false, Console.Title); - - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); - } - } - - public static void setConsoleWindowVisibility(bool visible, string title) - { - //Sometimes System.Windows.Forms.Application.ExecutablePath works for the caption depending on the system you are running under. - IntPtr hWnd = FindWindow(null, title); - - if (hWnd != IntPtr.Zero) - { - if (!visible) - //Hide the window - ShowWindow(hWnd, 0); // 0 = SW_HIDE - else - //Show window again - ShowWindow(hWnd, 1); //1 = SW_SHOWNORMA - } - } - } -} diff --git a/NUS Downloader/Properties/AssemblyInfo.cs b/NUS Downloader/Properties/AssemblyInfo.cs deleted file mode 100644 index c043efd..0000000 --- a/NUS Downloader/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("NUS Downloader")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("NUS Downloader")] -[assembly: AssemblyCopyright("Copyright © 2009")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("cb4ee0f5-7ba8-4ee6-a09e-7a09d4350582")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// 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.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NUS Downloader/Properties/Resources.Designer.cs b/NUS Downloader/Properties/Resources.Designer.cs deleted file mode 100644 index 5c5152d..0000000 --- a/NUS Downloader/Properties/Resources.Designer.cs +++ /dev/null @@ -1,329 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace NUS_Downloader.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NUS_Downloader.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - internal static System.Drawing.Bitmap arrow_ticker { - get { - object obj = ResourceManager.GetObject("arrow_ticker", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bin_closed { - get { - object obj = ResourceManager.GetObject("bin_closed", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap box { - get { - object obj = ResourceManager.GetObject("box", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bug_add { - get { - object obj = ResourceManager.GetObject("bug_add", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bullet_green { - get { - object obj = ResourceManager.GetObject("bullet_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bullet_green_blue { - get { - object obj = ResourceManager.GetObject("bullet_green_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bullet_orange { - get { - object obj = ResourceManager.GetObject("bullet_orange", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bullet_orange_blue { - get { - object obj = ResourceManager.GetObject("bullet_orange_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bullet_red { - get { - object obj = ResourceManager.GetObject("bullet_red", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bullet_redgreen { - get { - object obj = ResourceManager.GetObject("bullet_redgreen", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bullet_redgreen_blue { - get { - object obj = ResourceManager.GetObject("bullet_redgreen_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bullet_redorange { - get { - object obj = ResourceManager.GetObject("bullet_redorange", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap bullet_redorange_blue { - get { - object obj = ResourceManager.GetObject("bullet_redorange_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap connect { - get { - object obj = ResourceManager.GetObject("connect", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap database_save { - get { - object obj = ResourceManager.GetObject("database_save", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap disk { - get { - object obj = ResourceManager.GetObject("disk", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap drive_disk { - get { - object obj = ResourceManager.GetObject("drive_disk", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap dsi16x16 { - get { - object obj = ResourceManager.GetObject("dsi16x16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap folder { - get { - object obj = ResourceManager.GetObject("folder", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap folder_table { - get { - object obj = ResourceManager.GetObject("folder_table", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap help { - get { - object obj = ResourceManager.GetObject("help", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap information { - get { - object obj = ResourceManager.GetObject("information", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap key { - get { - object obj = ResourceManager.GetObject("key", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap money { - get { - object obj = ResourceManager.GetObject("money", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap package { - get { - object obj = ResourceManager.GetObject("package", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap package_add { - get { - object obj = ResourceManager.GetObject("package_add", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap package_delete { - get { - object obj = ResourceManager.GetObject("package_delete", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap package_green { - get { - object obj = ResourceManager.GetObject("package_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap page_white_magnify { - get { - object obj = ResourceManager.GetObject("page_white_magnify", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap picture_empty { - get { - object obj = ResourceManager.GetObject("picture_empty", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap script_code { - get { - object obj = ResourceManager.GetObject("script_code", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap script_code_red { - get { - object obj = ResourceManager.GetObject("script_code_red", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap script_go { - get { - object obj = ResourceManager.GetObject("script_go", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap script_start { - get { - object obj = ResourceManager.GetObject("script_start", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap server_connect { - get { - object obj = ResourceManager.GetObject("server_connect", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap server_link { - get { - object obj = ResourceManager.GetObject("server_link", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap wii16x16 { - get { - object obj = ResourceManager.GetObject("wii16x16", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap wrench { - get { - object obj = ResourceManager.GetObject("wrench", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} diff --git a/NUS Downloader/Properties/Resources.resx b/NUS Downloader/Properties/Resources.resx deleted file mode 100644 index 87be064..0000000 --- a/NUS Downloader/Properties/Resources.resx +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\server_connect.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\package_delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bullet_redorange.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\wii16x16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bullet_redgreen.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\folder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\script_go.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\package_green.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\key.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\page_white_magnify.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\money.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\script_code_red.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bullet_red.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\disk.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\server_link.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\arrow_ticker.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\script_start.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bin_closed.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bullet_redorange-blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\connect.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bullet_redgreen-blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\package.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\folder_table.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\database_save.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bullet_green.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bullet_orange.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\box.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\picture_empty.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bullet_green-blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bug_add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\wrench.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\script_code.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bullet_orange-blue.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\package_add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\drive_disk.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\information.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\dsi16x16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/NUS Downloader/Properties/Settings.Designer.cs b/NUS Downloader/Properties/Settings.Designer.cs deleted file mode 100644 index 3ef900c..0000000 --- a/NUS Downloader/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace NUS_Downloader.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/NUS Downloader/Properties/Settings.settings b/NUS Downloader/Properties/Settings.settings deleted file mode 100644 index abf36c5..0000000 --- a/NUS Downloader/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/NUS Downloader/Properties/app.manifest b/NUS Downloader/Properties/app.manifest deleted file mode 100644 index c0fffea..0000000 --- a/NUS Downloader/Properties/app.manifest +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NUS Downloader/Resources/arrow_down.png b/NUS Downloader/Resources/arrow_down.png deleted file mode 100644 index 2c4e279377bf348f9cf53894e76bb673ccf067bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmV->0fhdEP)RB*?~^j!LKVQ>(O&A{Xr%)RXLn#U zs4LtZ6rCMFY5|B2$)yG$6aaIFX^fL3(@);C=vT$+%Rq23i0XdR^H9$e3FC}x{QUj43MXi>ERcmL6 z9GfU*+VFwxW=BJGFN+ORW^2GifmX)O)N&2wMW6}hRmKCOIvK5`C z*$OtoBA+T{kG}7B!e&W^f|%oaGW?8v}v z6JTz@Zo|paV89p2W}(H)*{-aJ&GH1G50yVp(6}Yyp~ZD1K!j6wNxR{D<3=tk=hKGX zTRd8t9WVPo8~YoIz36SXK38c zv~Pm4Ym-HlQ(#0x^6uP4W!yqa3l&}-TAa|B(8e3;woJ0~m3vD+v*af;+Oqdj&Yv@QUb5l(8V2B8w!O@s&x@0S3 zl8eU{HilI@6O(kf`cxYVjKz|VC~r{z!TUyu-Nej1Kus$`zd@s?R|Tu3@lZ=WfF9#m z=3v5bXwxxACC`Z*8)hv`;IPYUW%V>r>5%A^^ETha>!HJbuv53BS*xkpRZ2u)$zk1# r2`f4h4lw-`Fzn=z*f8CppU>GmgG1ktC5<&kv%5!4k--|2Ji!0}Nl*6w#wHUuW*nL5>vZR zlg{G&%mT~|kL3ei%GW0*UOHUMs5XI$4uxe-L?I@SAefq*207}Iqtjm#e5*fP53AiC z)C|RQfwzxx<#_WfANRGZx{+tFDl8~Q?;~Ve=lM^*8UTTnVL?HTDz8uta0D@d28E9S z_)i8aLz^UE6PPKymi;2GJ`34{eIia-CtfAt0H61rk0 SPTNud0000C#5QQ<|d}62BjvZR2H60wE-&n>*?YcA|c6o&|A+rkb&Vsas2(@ zRZChzd<-rL%s+C)K`AUj&@4exERnTGr7g|ufjFlYo2X-lQc?WBS5|%h$H~-pP=>{CWcO1^&sC zas{(rHNEeVX?R|+D*2koKAT-1TVxuXF7Gt2pCrhe%W27Qah0e`>%4W-qEi^2ys8L$ zkzFy>C52%M!-~#H9Xt(|Evme3 znsTM3@O9jy7lMk63GZ(u8Hac+{l2Nv{)WYyc2KzeV81veQkLz}aZs=_c)I$ztaD0e F0sv?9ij)8V diff --git a/NUS Downloader/Resources/box.png b/NUS Downloader/Resources/box.png deleted file mode 100644 index 8443c23eb944cf8ef49c9d13cd496502f46f1885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 555 zcmV+`0@VG9P)i3lOYrtSl@<#7b-w zf}j{s!5HvocfT|9z82@(O@vrwU^wRt=bd>tXQpGD!`Kvuv@XEI8~tgUP2L`{+*)U@I@ zrVtr5X14??iAF(=0+k>q)v`Scm$9&=i`*knBsnaUVL1>ti*O1xfzmiD$%Md-h*6M( z@*iB)icu3eU424Ok{kp%Y!1dvp%f0`ac9vcupx^$vU0xuKpJcBvej0UYk%)EV>mIx2hV}QRf#LX^Uh(%`7hZ~|KEf#uQ31s002ovPDHLkV1hgQ{`mj^ diff --git a/NUS Downloader/Resources/bug_add.png b/NUS Downloader/Resources/bug_add.png deleted file mode 100644 index ced78174740958c5e11583682dac645197c09e78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 806 zcmV+>1KIqEP)`=&gfiynuLKNZXG^E&{Pmo=c@q3lv(pO2HUs^S=b~RK*#7&0iej;CY0$=&!}s zlPnn>f-S)ydndO_sP#!8nj+R?CkfAP%XVTzFwO9TP1xb;uc#KsVI@l}Q45e-dhki*R$I z2-9muy!q^gVO|BPfeBvOF`d^nvNfldX*DM?__P--&T^EHL~V~MQP7!$$#>nDeBT4g zbPGxt7D_0BtwZmh)yP<8H860+R0_4Z46G^!QX3=jcx?dt&Gptu5gh%A!qs$BNJZe! zpi8Gf>I6~l|Lc}p0gYR}o2;3W`|jYN2NngaMkxJ}tqVn$`{Hh8DpL5+419Tj?8J72 k;<$%Q*reM26FaHB-^i)=%W9=Qq(u(JWYNwrWtb6iNXdC)5JnjzyOGW5U1t#% zyK2%*!%WOHwJ5_>j#0e3nAxj$HHlh%xaN88ndiRl`*%GS04$D@XD=U~-8_-$?$PQN z;7+>g|9*3*5Df?z2Ww#`0gpDf&X^KkD?yV>6#uF7_x~E4Hcjl|CH=15Rc;1Bv+HW~ z-E&I+e7>Gv!!?H75EL9~AnYR6Jvs=(-pVAg!EbZ{Pw5O^tur#T3DC~BA+;z1;wa8d zvj#M$$i2lC!X{$fhdc|_lpKBU>QOS92iARCMD+Thd8`sn#i!s{U=N2pCOx%-*q}N0 z*=bIrr;>-p@lxbImm?CTA=Qa1uKIIW}3~WU9xrDp$v#eTtjG60E!0V5Z^3Dn8FJ|br;Y# z5Qk+thuzI-OtuHZH=7OH#1qDo@eJ6+TKx&o?Ez=&no5eYp%h3Sdm~WcgR1TXOtfBv zVYwTI&m~x!>4D;*5aLw(ef43{&%10 z`rmr0`TyJtv;LcOX%laN^>UMjsi!CYUwmcZ|JfI2{-1ED=f8fLD)C;hoM$LyFlFzu{izqk|8%^q0F(5@h6w@ zuSbE=i9QOwKvPc#-iPCap~BwXFHIr_gU^WCH%x0(Cm8h3e{9o}5`YUO%{ zPiLR-*D%CfK42<(c~V-?1q(}8{p2N#A`c~!wa4X-$LfsZ0%WH-1^Zy?%r3<3e~Rbycg=S_Egdz d?>~Yc*m~Z+JF!m3&mHJ+22WQ%mvv4FO#s^$Z2kZM diff --git a/NUS Downloader/Resources/bullet_red.png b/NUS Downloader/Resources/bullet_red.png deleted file mode 100644 index 0cd803115831933aa171497cfe9c1af983035f86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=8^mK6yu{izqk}mh50EX6wkMFui zZg|fh<-*g%H9O|;u|DY#DW^u;K&o-|vHe`x?xbw1zYx$2><(A#;6QU!sSfhO( ioL~suuJh6Vfb_?jd)=>7iZy|bXYh3Ob6Mw<&;$Tq>~Ep~ diff --git a/NUS Downloader/Resources/bullet_redgreen-blue.png b/NUS Downloader/Resources/bullet_redgreen-blue.png deleted file mode 100644 index 63b0f75ba5e94c713bd8792ee7b6b9d445119a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3218 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 diff --git a/NUS Downloader/Resources/bullet_redorange.png b/NUS Downloader/Resources/bullet_redorange.png deleted file mode 100644 index 339d374d86c35a8cf3a90a8a4610e7a39ce49fe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3086 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 diff --git a/NUS Downloader/Resources/drive_disk.png b/NUS Downloader/Resources/drive_disk.png deleted file mode 100644 index 5a51e81988a96ea36d999f1cd6c16f6def894aa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 695 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 Wnm}l+Cr$SN00001E&K(M?16?t{3l*Apfq5 zFU?(L8=tPXaE%q-pI#N-Mh+1N{~<;DROCQ&0x`weLEzIqpr_8>yK7akHQ(cG&iB}V zDKGX}+v$6y{F`GJL&0oR4m=C?RszP_2#obHn57v6u0$>!fu|A5-rlVNK6AubE*lD_ zIMrtgg_F>Wqfo#1V>f*p)rA)3jweoYRw$S}!5ZiHZNdaRqY?B>0d_eFYjXhR&t4dXThN8e z@bnzSiD-*poO1%tgr|OnD}4a_H3Mho1qC0&Tz>$w7=w|&0{zE%XqhwcG#=tutKd0j z`%DGfO~I*5Q0o&|8`Qd1Z@mdUcL`ed9Mo^8pe!AQtA2&}tW}VVS^<+NJPvz%1Xih^ z!f_bl4GLeN*0WIglTa3qKwdaZf;2?RH2*<9alFjrqO7mJ^7X+@3 diff --git a/NUS Downloader/Resources/folder_table.png b/NUS Downloader/Resources/folder_table.png deleted file mode 100644 index 473cee355da7a5ab249eef48757e5152e054b27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 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 diff --git a/NUS Downloader/Resources/money.png b/NUS Downloader/Resources/money.png deleted file mode 100644 index 4e6773e489399d00ee526ae743f55230419797b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmV?P)OE1uY zN}(-LDq!3wgOs8%ap%SqiJ-6No<<@vba6KKp7;5l^L^)V0B|y`mRM6tJtaS~*S?J5 z=BP4dnb$)VmO&D%-vv1k@HnDKnddv<|2zWYtPUc79cq~SJ0SZ4h;qs_$A%d=SNh;v z8;15(D+JzZR1MwPhU^JwnruuN=XCIY^5Xf&J~$RFs2devH0eQWOpQusId1lsQOGWU zDlAPIX0`BcaHLPA`%m2Cc<2sO~f+fT?}ihp*+pU|^5M^!Xzh;||QEdg~@4)5v^ zq~k)iGRk^OaoNf}L=ANDHnE&2b^ zk^)#I-Ap^iNP`BKd+AwwJ{X`N+UkfL!-*k?gY~Fz-=g8^FA;>-g5a79a8a9ml%t%G z+R1|TtpOv+7pNKGqx-!ceT&^B?4;Fd#~+Yz3}ed-ssoi9r9CCc(PRssYX+!{l4Jiw9=W4b5~53JrO|yv`g=jwb8)jwUwv9$M`4RtOkAw6ELX zS#d(>tHmWt5rhQ7H5Vod^ttDAbr(+k{~qWRY8d{>#*k<$wCcw_R|NGZbhevs{(czb|%`iA4$92r$^rsw_d Z|35gq%o~F`HW>f_002ovPDHLkV1fzPQ=k9< diff --git a/NUS Downloader/Resources/package.png b/NUS Downloader/Resources/package.png deleted file mode 100644 index da3c2a2d74bab159ba0f65d7db601768258afcb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)5TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY diff --git a/NUS Downloader/Resources/package_add.png b/NUS Downloader/Resources/package_add.png deleted file mode 100644 index 9c8a9da4ae49b7fb02af2eaf6e03e0f6c91ba01a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 899 zcmV-}1AP36P)i-HS{zx9u^IUGw>*=$qi z4z(fju8Kxf4E>slBg^es4|nAN~@NV_SFj zT24(nZf1>C;s&Oa#mmJBSw-p_cY~Y6U)hMyiI9#@b2~OpJ~{tQK#e@V>&ZUL%dC-& z4K3ksgdE?;g2XJ7a-IC z{t7T9P!AB)6MkIq=xo`8@fr4Pe+pxHJkq|8i#gBoi7`)S7Dry495@-9|NUzWL5S=I zI}8e@=#j{*V_TIRYJCHM<4>HSsjdT~`23%KH*e}YU%C<>JM(QmG2_K2&b4Ftok-)u zSoT&#!hAJ4MD=!?;n}ksXzJm;^DmMqtaEL0%KcAFfAn>=sgaW^@?6tnFI$DxIX=HQ z$n|KMeH{mAuJ2-I1BCpEP)*e`r0GmDdCv3B-24AN7nLkDp7r6!fpdkQ_POs-o|x$lEQQg9%evW;K1esG{Gik*}W^x_p02 zz@7605mh~*BB$cp`?|L6d!3LNikV3wPMD?CDC_s8?yATc75TAuc)YR+NS+_)L-b>( zsrQ9#j~&5n>ISV5tlihzvj6 zHDtNXPvRAp*~s0*)Qb3}431T$tz$2EYlIs*2)S|cnIwy;Davbif3elb@jZvmT7F@f zVrCSn<#Eb6%J~fW`2`LReM=-(52Z9(N@3-bw6yQ1u^Fa+pFL`;NJ+68qpm}|xr0jX z26asd5=}8;l);+=69sPpD)W@H6BN@|aCaR+jg)K^0RgNik;ZN!P8@G(5-Bbb34>Lh zfsj(mUZRj+Cx|5=>Y#prieRe|9`s;9t61=5{Se?kq8ij zU+()P`Q4A8{?PogZ2858X21%`-aNe960R|t^-p8 z^#MVBA#){3_e)1{XGXDpK1SW_uk7k*rZ%@8*ka79h57N}Tj{Y=&7Ft39^KzhIKCIk zDey{|s*hQ#;kNCD{`WQ~Y=8O)Ay1smDNq0KY^#dAt47{xe`+An-rEnpM}Gb))1Q6G zGp`I%KX;C5B}*A7;LY2^-NEnihO`bR7JkxdbOvtdjHL^v38oUE+~BW@`d1wzX5cwxst&W RBUk_c002ovPDHLkV1h=xq}~7k diff --git a/NUS Downloader/Resources/package_green.png b/NUS Downloader/Resources/package_green.png deleted file mode 100644 index 25b28bb6aab661d06764c3f5df40447eafdc0611..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmV-`1AqL9P)KI|MAoju4i{u@{tJy)-y@2kjrH7x^`PJV~I)v=6C z`lgBuhno6Z8#*uI5{FE53a{TyEIdwPb9zlhuByn*o}qjBCxNBA=lc=8;;-uIZRogw zS=9zw#NJ=#@9`0ibe+Ogc8o$c&USd3bbMh_9cSdZw3#-bprFL3#cPmkBXQjDd5M8x1tTNKZF&VLNYPDZZL9>z@-$o zek7erUNs|}ub$=P&x}PsA(FiZTEG)*B6PT&oEM6I6T4uO&RP6Yi1D2#!M@?3 zj;KdPT+QWuH26CBX>*w061S-HHgF>FB0;keTcKdt%%qe2>11#Wc&Yqlx{|^}k)r#Z zfn$A{-OZ-=^|@K>LVUuw z|4pw?MTXRo;p&#ttVb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$fRq1}l<=psl5*5Xz9i;M}s*NP=ugs7Q#8Z;Dyx|}!`#}xw_C3!B-yaPC&0j)XcpuX@rNfq|q}N(wJOjA& z>u+z?dfJEuLePrqzy!)73pvLjxk4d6XNZt?hm_iYES{i}J5y3l?}PPNYDBR7oPc~6 zL^d)Bi4Q2L3pnp!nFxN9c2E+=@XAl&+;2m6a~kZj1r3Mz3C=hmUG<{+vWR@t4q?fJ zhFc(ozZD#Mx`^Q~g1v=K6!QnfuqyD4>U4EjF0eamL}Jx| z%&`kR-H+3GBYr*Qx}frLU4`%n9(`uSomzw)t%%NagXkA*R5Mbv9VLDp1wMo$cOMa~ s3Wm%r7^bwK$2$}-<~D8p`#1iScU4^XCLAA~0ssI207*qoM6N<$g3sK(Qvd(} diff --git a/NUS Downloader/Resources/picture_empty.png b/NUS Downloader/Resources/picture_empty.png deleted file mode 100644 index abd2b9bb48252338e831bb54f2fd76037b1bdeef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 463 zcmV;=0WkiFP)h0wrhpX|Hs7;Pt55ta+?_WPZ?E%ty zcl7GX<6#&ib$G%g0Kx`)KASRL^ZnUGrx zCTlifW8bF0Zh;X~MQ7g4Lm|_~ykU(Cppw z+zc^}2l`HK1P^+B{r2nc%R}+A|9PB!2fN@?ZS6gu^9@CduRn)+FfsrD002ovPDHLk FV1m%L!2$pP diff --git a/NUS Downloader/Resources/script_code.png b/NUS Downloader/Resources/script_code.png deleted file mode 100644 index 63fe6ceff5bfcedb9670279d4bb8d25807f6ecee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 859 zcmV-h1El5>jf6w4x#gTU%_MMNlkNp$oSbvBp&uHw9M;u0-4@=t5BI zP6Hx#-C_{5RMJ z0_P+Xkumexn8%)S+Y)#l(gR;YJP<6#1-=jjK0LONWPdJQIR8uK1HpvVIxBIQ2ztt+ zqoEx_X9S%QGMe=~(k#sebCL-an)%CR%a7YtUOQUgv+G>~?N~XSWhx=? z@$fx}0MB;$`JWcQ-Re{XV~5|{DvU(#*+NF*g)j^qk#b~G9_O!i*y&mZVZ=a3;Go(K z`DkskYn56Nhu+k@1Ke*uY|x zI&k6j$JfNe_a{GH%=n2rZOz$Z8R9V?Pe36hIk}jo+A-`;dt9vyvBu#Xm@veu&@v`| zzt%mwc_$nd0-sMVx2d)b0!MqGxmfCumx7yB#nIUWvA{!HOMfslMyW1iV&nY>zxwyj z8^JfLN|kT z4m^Q1mhO(_r4w@`V?H=YNkOf(i&bHT3Auc3bryK1_{hDSetLoLN{VLB^78ULiNFy^ zkUqqG$fjVkJj5tfWkOn|P5`HVEp5@-mGnc0wvJGHC=+39MC2TWT#i?t*~fNch*he_ zgtS^8dH$(KlW)EF1b4Fzv~?&0IQaNdg;W5&{t&Bmg9&N1-rBBr_;Rg8ekw^mn;@T# zlS{|Rq+-Nlg18i%UY;i|q1NnSwf>I@85#4U4002ovPDHLkV1mEDi4_0< diff --git a/NUS Downloader/Resources/script_code_red.png b/NUS Downloader/Resources/script_code_red.png deleted file mode 100644 index 8fcf0f09ae3046a7bace82cdd583ebcb2bb58beb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868 zcmV-q1DpJbP)r^f`W}XqzY0MJb1LFP|{o!^ss14Q0vK;LyO=G zl>{$>EqZ7VQmVn=L0C~*jNqY3H8#?%q3Q0roqd^|`M-KFiSY;D>*w+ z0Uz8~N>7H;5K4nIhJi8x&;^=+2HHRi_#F7wV{=BSiHAq?ldnB7%+B?NDTcxn+mRj< z61uVG&t{Kr{^%b7syl&^Lec@Cep}-^4xR%E4^qC%y(yQ3>*6Qik+BTBin;Qqm)75R zw*W0=p=2VIfv#`}By>6vK?FertpVKXX#ie7d!5Njjt7SP;cXxv1|$2wnnxX-rXOi4 zCubS@>|?^9Pd7I7BFjL40UX`or)zDNt_SNbfH*o`o?ZIlnVdI3Iv!zck$CuY8J#~x z)b7%c4Si|A!bT_N!^PE(7Gl~JM~)mcVf5GNuwOLw7WHHApn#=ARm6>eq|;~bu^Cde z?}?Oyv7mj85~6bc<;NCXGl=HnedB4fv;xOx>Ez2eF6cs;-(PqIez}UA80Vh3leki1 zEvPs~i&z7=CLFw&__`LE$}XG}Z(?sXaIqwVCY8B&QG4#jxmcq)!WE?ipr}qVB!Avj*}>Ogl)r>xpM?l2gvx)>cyy7Y%IL>tOalZ z7KZkUkERae#gJ$;z;SV#4Z;A{PMkvKieMq@xis1Xw20TYuIEiv&kg}^KR7u~uX={> zmIb-4=EqMikoGOU2g$_06|%5e4^cvFYy(<|r-0{vUS6X;@aV-BsV%W|5Xzvm!B|VV zSmdRrN4ePw(Lyx-1EhTP`6nOBym9#P|NVfrAhks(z{2T;b+SHmdm&oN)=psUW;5W- z;xeUthEgF-DVL&{OL0dwNh;}*@>~v0jga!7@pl(3<&AB?D0QxOd1b72d1W_n*JgKa uR!k>-Kb`g|z22yyMI`&M<>aiqax`m<9PjBq5ZbMGKcLk`}FvHr3V$f&yJ7L`0OE zD5_PFU=K#J5rqiU9y&S`lcwW%=XuXL|9?*3mo!ZSj(s_|2Pbz7_w8S+YHL-ks%z_^ z?qC`B5V42_e2VXLfI5V|PfiT%fBo4p0I*utLu+L{wAhW4WyNw4-MqKr+v}@`aXbg8 zLl__INxC)-4u+D!g5xjY3*8c5nkB_#-a)4M>BO7~Cs|BmwC`}VNvWzq%lgJWkByq`w8;dT_ zcII<{SeD~M{h7{suvRqEw2`HxF_EQY8d-)Wb7!e=>g?Z3IFx592OOQh-%CUC4Pnu9e!`IV? zHFZ$dK^cQBn;y1vVz1@ys{8A&=G{=VxxbP_EQ<|!yGNdqrHNQ4LR~ui*vn#5i*;0M z%y;HIF?qmBx$e^JPn}(Frz82n<7Y;3V$UO6-Ck z`Rh}6%iu^JtLo_&5AEuI>!p1F;OObXC%?R>tV`Wc+A;d5eLIf0cx%eJKYm^+r3U6{oTe5J$idmy?N@HcLyYCzv&ylY2Q6|YUcC@ zS0JxL_+skfwaKZA*S29ZHe(YuVW_XC)#~eO>5Nu>`140Y|GY7ihq12!{s-FVb;8HC R$Nc~R002ovPDHLkV1iD+kv;$b diff --git a/NUS Downloader/Resources/script_start.png b/NUS Downloader/Resources/script_start.png deleted file mode 100644 index 31c1e5199508592ba0ba5c7e8718ae2497b9f3fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 887 zcmV--1Bm>IP)#Ah#ULYT6y%(0u7oG1f2LbOI?t zB4byWoR|z7GfS&@{#idtpWD|HloooV?El$i8>%Ehp;wtA@>GV(JO-IDs4`Gr;X_%# zAG$j@cZ2;QusJXEQ?TVw6;nczsx2EpGP8zQ8dzMlv$0nmM$ugD$Ic?PSXoC9D)2Dq zl%!{DFh&Y!U#5zTAVY#oiijVQtzqCx0z=W{+&==-EDiW%B-0jBhD!u4Nv335%06Yd zSu(gX7BmAl`=>SG{a*shG^&5md|#jEGIu-p;SefC0N86TnUp4y-@vLjK@Z3DpN2`6KD2Z z#JBl(*iu^QH7tIc9c+JCLZm-0==3<6Ch_Bc*fiwsD55$c)%|jeaT_fO}qrK@C zhQAIV!_69n+INIR9FI(VMIx)~C#&bEF3-2vjj^x`=@8oh(^k}a4_zo$8nas5pjszV1b_$iVxIlmx> z>yB*;2K*;tD;&{99gA89T8dLu7a@NU;@U4v%nf5l`5t_jeFdMl43X&(J~Tbv9l1Jw zU#f5GDH6AeP(|33LokPc*Q2WW!6fA30hrPf^i{>M^^)_E?#K6p(%*?UYyAgrNech~ N002ovPDHLkV1hNsi1Ppd diff --git a/NUS Downloader/Resources/server_connect.png b/NUS Downloader/Resources/server_connect.png deleted file mode 100644 index 49b269145afbb97ddd03fcfa844ea832c947fdd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 zcmVwYT0AgCL27sE1k% zB#Vk*Q+6?;e9+Vt!L4!K*`1ktXYNe*UVlWT^w7ZN+<|kx?>px^H{km|{^wKwm9Vg| zaNl*^8;;|sJc37gD5WAk3LK@NP$bk5Y$CIXlI%=4cd(q9B*cVPIfT zN-yMdJTl47IAHqHm0t=ttI8)@h=c;2s@8%}%bVy(RAhosz?g^LzLS!DUxmLngP`ow zrfn8+J7Zx$33yPOy6}EAf^^3q=H^}@`{F5>9HNI({R$?_cfm&~2_!((r0s!M>3g`lJ{4?wIwATQp;6yHt2^& zKYuq+Eb5L^v&R{AmzYgUE~OhIXUe@VXP)2T#eMsaNyJ@y*%#F`%&V0x=ZR~P^R7jY l<)&}aKbCWipX^bu^(V1WxGAiK0S5p8002ovPDHLkV1nEbSAPHi diff --git a/NUS Downloader/Resources/server_link.png b/NUS Downloader/Resources/server_link.png deleted file mode 100644 index e8821dfd88a4a178df1581e12832925c401a78c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmV;z0zLhSP)?mgenukSf$Ow%;{&(Qz*V`F0@b#ij@ zxZm&VX$7rf9v>g``Z^Q}JsL?+C={#&cxkiQLb7}jJpw^hA^ed`yWNI#dL>L>e-q^M z`Fjj@I2>0@CKGnPR>A73szKFMBGRA`S+Ca{9f68h+-|q{(d{0gPvFmm91*Ce^UmFA z5o06)XEYcLXt&z~WkrF1>Y7m3eyMY_&vn4e3W2zY4~4B4@}Fo`ggWoJX72yn!Jt=~ zC}x7Gz;&TMbfKNo1KrTUkU)^IvNFituckW41Kdc8hGB^|5P zDhq;WG2$IrNz43AeK;CB`x^az|5dNo zn+^tpmuW~wqY?Fb9i>u9WcPSHn3$O0UhR>XE|bZ8|Bb-s^GTFBK#I#m;3Sa5N8M~T opRypm6;{4LkrnDigB(5h2_j2`gUi>R_y7O^07*qoM6N<$f)SrU?*IS* diff --git a/NUS Downloader/Resources/telephone_add.png b/NUS Downloader/Resources/telephone_add.png deleted file mode 100644 index 5591cfc4acb98187a6a5e35eda75c8420b33fdc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 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 V9Ppy=P>=us002ovPDHLkV1m&Zno|G( diff --git a/NUS Downloader/Resources/wilolgoi.png b/NUS Downloader/Resources/wilolgoi.png deleted file mode 100644 index d1e2810b37465b989daffc23f5d7b4391a16c3f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3826 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. - */ - -using System; -using System.Collections.Generic; -using System.Net; - -namespace libWiiSharp -{ - public static class Shared - { - /// - /// Merges two string arrays into one without double entries. - /// - /// - /// - /// - public static string[] MergeStringArrays(string[] a, string[] b) - { - List sList = new List(a); - - foreach (string currentString in b) - if (!sList.Contains(currentString)) sList.Add(currentString); - - sList.Sort(); - return sList.ToArray(); - } - - /// - /// Compares two byte arrays. - /// - /// - /// - /// - /// - /// - /// - public static bool CompareByteArrays(byte[] first, int firstIndex, byte[] second, int secondIndex, int length) - { - if (first.Length < length || second.Length < length) return false; - - for (int i = 0; i < length; i++) - if (first[firstIndex + i] != second[secondIndex + i]) return false; - - return true; - } - - /// - /// Compares two byte arrays. - /// - /// - /// - /// - public static bool CompareByteArrays(byte[] first, byte[] second) - { - if (first.Length != second.Length) return false; - else - for (int i = 0; i < first.Length; i++) - if (first[i] != second[i]) return false; - - return true; - } - - /// - /// Turns a byte array into a string, default separator is a space. - /// - /// - /// - /// - public static string ByteArrayToString(byte[] byteArray, char separator = ' ') - { - string res = string.Empty; - - foreach (byte b in byteArray) - res += b.ToString("x2").ToUpper() + separator; - - return res.Remove(res.Length - 1); - } - - /// - /// Turns a hex string into a byte array. - /// - /// - /// - public static byte[] HexStringToByteArray(string hexString) - { - byte[] ba = new byte[hexString.Length / 2]; - - for (int i = 0; i < hexString.Length / 2; i++) - ba[i] = byte.Parse(hexString.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); - - return ba; - } - - /// - /// Counts how often the given char exists in the given string. - /// - /// - /// - /// - public static int CountCharsInString(string theString, char theChar) - { - int count = 0; - - foreach (char thisChar in theString) - if (thisChar == theChar) - count++; - - return count; - } - - /// - /// Pads the given value to a multiple of the given padding value, default padding value is 64. - /// - /// - /// - public static long AddPadding(long value) - { - return AddPadding(value, 64); - } - - /// - /// Pads the given value to a multiple of the given padding value, default padding value is 64. - /// - /// - /// - /// - public static long AddPadding(long value, int padding) - { - if (value % padding != 0) - { - value = value + (padding - (value % padding)); - } - - return value; - } - - /// - /// Pads the given value to a multiple of the given padding value, default padding value is 64. - /// - /// - /// - public static int AddPadding(int value) - { - return AddPadding(value, 64); - } - - /// - /// Pads the given value to a multiple of the given padding value, default padding value is 64. - /// - /// - /// - /// - public static int AddPadding(int value, int padding) - { - if (value % padding != 0) - { - value = value + (padding - (value % padding)); - } - - return value; - } - - /// - /// Swaps endianness. - /// - /// - /// - public static ushort Swap(ushort value) - { - return (ushort)IPAddress.HostToNetworkOrder((short)value); - } - - /// - /// Swaps endianness. - /// - /// - /// - public static uint Swap(uint value) - { - return (uint)IPAddress.HostToNetworkOrder((int)value); - } - - /// - /// Swaps endianness - /// - /// - /// - public static ulong Swap(ulong value) - { - return (ulong)IPAddress.HostToNetworkOrder((long)value); - } - - /// - /// Turns a ushort array into a byte array. - /// - /// - /// - public static byte[] UShortArrayToByteArray(ushort[] array) - { - List results = new List(); - foreach (ushort value in array) - { - byte[] converted = BitConverter.GetBytes(value); - results.AddRange(converted); - } - return results.ToArray(); - } - - /// - /// Turns a uint array into a byte array. - /// - /// - /// - public static byte[] UIntArrayToByteArray(uint[] array) - { - List results = new List(); - foreach (uint value in array) - { - byte[] converted = BitConverter.GetBytes(value); - results.AddRange(converted); - } - return results.ToArray(); - } - - /// - /// Turns a byte array into a uint array. - /// - /// - /// - public static uint[] ByteArrayToUIntArray(byte[] array) - { - UInt32[] converted = new UInt32[array.Length / 4]; - int j = 0; - - for (int i = 0; i < array.Length; i += 4) - converted[j++] = BitConverter.ToUInt32(array, i); - - return converted; - } - - /// - /// Turns a byte array into a ushort array. - /// - /// - /// - public static ushort[] ByteArrayToUShortArray(byte[] array) - { - ushort[] converted = new ushort[array.Length / 2]; - int j = 0; - - for (int i = 0; i < array.Length; i += 2) - converted[j++] = BitConverter.ToUInt16(array, i); - - return converted; - } - } -} diff --git a/NUS Downloader/TMD.cs b/NUS Downloader/TMD.cs deleted file mode 100644 index 32cbef5..0000000 --- a/NUS Downloader/TMD.cs +++ /dev/null @@ -1,659 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Security.Cryptography; - -namespace libWiiSharp -{ - public enum ContentType : ushort - { - Normal = 0x0001, - DLC = 0x4001, //Seen this in a DLC wad... - Shared = 0x8001, - } - - public enum Region : ushort - { - Japan = 0, - USA = 1, - Europe = 2, - Free = 3, - } - - public class TMD : IDisposable - { - private bool fakeSign = false; - - private uint signatureExponent = 0x00010001; - private byte[] signature = new byte[256]; - private byte[] padding = new byte[60]; - private byte[] issuer = new byte[64]; - private byte version; - private byte caCrlVersion; - private byte signerCrlVersion; - private byte paddingByte; - private ulong startupIos; - private ulong titleId; - private uint titleType; - private ushort groupId; - private ushort padding2; - private ushort region; - private byte[] reserved = new byte[58]; - private uint accessRights; - private ushort titleVersion; - private ushort numOfContents; - private ushort bootIndex; - private ushort padding3; - private List contents; - - /// - /// The region of the title. - /// - public Region Region { get { return (Region)region; } set { region = (ushort)value; } } - /// - /// The IOS the title is launched with. - /// - public ulong StartupIOS { get { return startupIos; } set { startupIos = value; } } - /// - /// The Title ID. - /// - public ulong TitleID { get { return titleId; } set { titleId = value; } } - /// - /// The Title Version. - /// - public ushort TitleVersion { get { return titleVersion; } set { titleVersion = value; } } - /// - /// The Number of Contents. - /// - public ushort NumOfContents { get { return numOfContents; } } - /// - /// The boot index. Represents the index of the nand loader. - /// - public ushort BootIndex { get { return bootIndex; } set { if (value <= numOfContents) bootIndex = value; } } - /// - /// The content descriptions in the TMD. - /// - public TMD_Content[] Contents { get { return contents.ToArray(); } set { contents = new List(value); numOfContents = (ushort)value.Length; } } - /// - /// If true, the TMD will be fakesigned while saving. - /// - public bool FakeSign { get { return fakeSign; } set { fakeSign = value; } } - - #region IDisposable Members - private bool isDisposed = false; - - ~TMD() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing && !isDisposed) - { - signature = null; - padding = null; - issuer = null; - reserved = null; - - contents.Clear(); - contents = null; - } - - isDisposed = true; - } - #endregion - - #region Public Functions - /// - /// Loads a tmd file. - /// - /// - /// - public static TMD Load(string pathToTmd) - { - return Load(File.ReadAllBytes(pathToTmd)); - } - - /// - /// Loads a tmd file. - /// - /// - /// - public static TMD Load(byte[] tmdFile) - { - TMD t = new TMD(); - MemoryStream ms = new MemoryStream(tmdFile); - - try { t.parseTmd(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - return t; - } - - /// - /// Loads a tmd file. - /// - /// - /// - public static TMD Load(Stream tmd) - { - TMD t = new TMD(); - t.parseTmd(tmd); - return t; - } - - - - /// - /// Loads a tmd file. - /// - /// - public void LoadFile(string pathToTmd) - { - LoadFile(File.ReadAllBytes(pathToTmd)); - } - - /// - /// Loads a tmd file. - /// - /// - public void LoadFile(byte[] tmdFile) - { - MemoryStream ms = new MemoryStream(tmdFile); - - try { parseTmd(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - } - - /// - /// Loads a tmd file. - /// - /// - public void LoadFile(Stream tmd) - { - parseTmd(tmd); - } - - - - /// - /// Saves the TMD. - /// - /// - public void Save(string savePath) - { - Save(savePath, false); - } - - /// - /// Saves the TMD. If fakeSign is true, the Ticket will be fakesigned. - /// - /// - /// - public void Save(string savePath, bool fakeSign) - { - if (fakeSign) this.fakeSign = true; - if (File.Exists(savePath)) File.Delete(savePath); - - using (FileStream fs = new FileStream(savePath, FileMode.Create)) - writeToStream(fs); - } - - /// - /// Returns the TMD as a memory stream. - /// - /// - public MemoryStream ToMemoryStream() - { - return ToMemoryStream(false); - } - - /// - /// Returns the TMD as a memory stream. If fakeSign is true, the Ticket will be fakesigned. - /// - /// - /// - public MemoryStream ToMemoryStream(bool fakeSign) - { - if (fakeSign) this.fakeSign = true; - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - return ms; - } - - /// - /// Returns the TMD as a byte array. - /// - /// - public byte[] ToByteArray() - { - return ToByteArray(false); - } - - /// - /// Returns the TMD as a byte array. If fakeSign is true, the Ticket will be fakesigned. - /// - /// - /// - public byte[] ToByteArray(bool fakeSign) - { - if (fakeSign) this.fakeSign = true; - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - byte[] res = ms.ToArray(); - ms.Dispose(); - return res; - } - - /// - /// Updates the content entries. - /// - /// - /// True if you use the content ID as name (e.g. 0000008a.app). - /// False if you use the index as name (e.g. 00000000.app) - public void UpdateContents(string contentDir) - { - bool namedContentId = true; - for (int i = 0; i < contents.Count; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + contents[i].ContentID.ToString("x8") + ".app")) - { namedContentId = false; break; } - - if (!namedContentId) - for (int i = 0; i < contents.Count; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + contents[i].ContentID.ToString("x8") + ".app")) - throw new Exception("Couldn't find all content files!"); - - byte[][] conts = new byte[contents.Count][]; - - for (int i = 0; i < contents.Count; i++) - { - string file = contentDir + Path.DirectorySeparatorChar + ((namedContentId) ? contents[i].ContentID.ToString("x8") : contents[i].Index.ToString("x8")) + ".app"; - conts[i] = File.ReadAllBytes(file); - } - - updateContents(conts); - } - - /// - /// Updates the content entries. - /// - /// - /// True if you use the content ID as name (e.g. 0000008a.app). - /// False if you use the index as name (e.g. 00000000.app) - public void UpdateContents(byte[][] contents) - { - updateContents(contents); - } - - /// - /// Returns the Upper Title ID as a string. - /// - /// - public string GetUpperTitleID() - { - byte[] titleBytes = BitConverter.GetBytes(Shared.Swap((uint)titleId)); - return new string(new char[] { (char)titleBytes[0], (char)titleBytes[1], (char)titleBytes[2], (char)titleBytes[3] }); - } - - /// - /// The Number of memory blocks the content will take. - /// - /// - public string GetNandBlocks() - { - return calculateNandBlocks(); - } - - /// - /// Adds a TMD content. - /// - /// - public void AddContent(TMD_Content content) - { - contents.Add(content); - - numOfContents = (ushort)contents.Count; - } - - /// - /// Removes the content with the given index. - /// - /// - public void RemoveContent(int contentIndex) - { - for (int i = 0; i < numOfContents; i++) - if (contents[i].Index == contentIndex) - { contents.RemoveAt(i); break; } - - numOfContents = (ushort)contents.Count; - } - - /// - /// Removes the content with the given ID. - /// - /// - public void RemoveContentByID(int contentId) - { - for (int i = 0; i < numOfContents; i++) - if (contents[i].ContentID == contentId) - { contents.RemoveAt(i); break; } - - numOfContents = (ushort)contents.Count; - } - #endregion - - #region Private Functions - private void writeToStream(Stream writeStream) - { - fireDebug("Writing TMD..."); - - if (fakeSign) - { fireDebug(" Clearing Signature..."); signature = new byte[256]; } //Clear Signature if we fake Sign - - MemoryStream ms = new MemoryStream(); - ms.Seek(0, SeekOrigin.Begin); - - fireDebug(" Writing Signature Exponent... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(signatureExponent)), 0, 4); - - fireDebug(" Writing Signature... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(signature, 0, signature.Length); - - fireDebug(" Writing Padding... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(padding, 0, padding.Length); - - fireDebug(" Writing Issuer... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(issuer, 0, issuer.Length); - - fireDebug(" Writing Version... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.WriteByte(version); - - fireDebug(" Writing CA Crl Version... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.WriteByte(caCrlVersion); - - fireDebug(" Writing Signer Crl Version... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.WriteByte(signerCrlVersion); - - fireDebug(" Writing Padding Byte... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.WriteByte(paddingByte); - - fireDebug(" Writing Startup IOS... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(startupIos)), 0, 8); - - fireDebug(" Writing Title ID... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(titleId)), 0, 8); - - fireDebug(" Writing Title Type... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(titleType)), 0, 4); - - fireDebug(" Writing Group ID... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(groupId)), 0, 2); - - fireDebug(" Writing Padding2... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(padding2)), 0, 2); - - fireDebug(" Writing Region... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(region)), 0, 2); - - fireDebug(" Writing Reserved... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(reserved, 0, reserved.Length); - - fireDebug(" Writing Access Rights... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(accessRights)), 0, 4); - - fireDebug(" Writing Title Version... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(titleVersion)), 0, 2); - - fireDebug(" Writing NumOfContents... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(numOfContents)), 0, 2); - - fireDebug(" Writing Boot Index... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(bootIndex)), 0, 2); - - fireDebug(" Writing Padding3... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(padding3)), 0, 2); - - //Write Contents - List contentList = new List(); - for (int i = 0; i < contents.Count; i++) - contentList.Add(new ContentIndices(i, contents[i].Index)); - - contentList.Sort(); - - for (int i = 0; i < contentList.Count; i++) - { - fireDebug(" Writing Content #{1} of {2}... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper().ToUpper(), i + 1, numOfContents); - - ms.Write(BitConverter.GetBytes(Shared.Swap(contents[contentList[i].Index].ContentID)), 0, 4); - ms.Write(BitConverter.GetBytes(Shared.Swap(contents[contentList[i].Index].Index)), 0, 2); - ms.Write(BitConverter.GetBytes(Shared.Swap((ushort)contents[contentList[i].Index].Type)), 0, 2); - ms.Write(BitConverter.GetBytes(Shared.Swap(contents[contentList[i].Index].Size)), 0, 8); - - ms.Write(contents[contentList[i].Index].Hash, 0, contents[contentList[i].Index].Hash.Length); - } - - //fake Sign - byte[] tmd = ms.ToArray(); - ms.Dispose(); - - if (fakeSign) - { - fireDebug(" Fakesigning TMD..."); - - byte[] hash = new byte[20]; - SHA1 s = SHA1.Create(); - - for (ushort i = 0; i < 0xFFFF; i++) - { - byte[] bytes = BitConverter.GetBytes(i); - tmd[482] = bytes[1]; tmd[483] = bytes[0]; - - hash = s.ComputeHash(tmd); - if (hash[0] == 0x00) - { fireDebug(" -> Signed ({0})", i); break; } //Win! It's signed... - - if (i == 0xFFFF - 1) - { fireDebug(" -> Signing Failed..."); throw new Exception("Fakesigning failed..."); } - } - - s.Clear(); - } - - writeStream.Seek(0, SeekOrigin.Begin); - writeStream.Write(tmd, 0, tmd.Length); - - fireDebug("Writing TMD Finished..."); - } - - private void updateContents(byte[][] conts) - { - SHA1 s = SHA1.Create(); - - for (int i = 0; i < contents.Count; i++) - { - contents[i].Size = (ulong)conts[i].Length; - contents[i].Hash = s.ComputeHash(conts[i]); - } - - s.Clear(); - } - - private void parseTmd(Stream tmdFile) - { - fireDebug("Pasing TMD..."); - - tmdFile.Seek(0, SeekOrigin.Begin); - byte[] temp = new byte[8]; - - fireDebug(" Reading Signature Exponent... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 4); - signatureExponent = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - fireDebug(" Reading Signature... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(signature, 0, signature.Length); - - fireDebug(" Reading Padding... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(padding, 0, padding.Length); - - fireDebug(" Reading Issuer... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(issuer, 0, issuer.Length); - - fireDebug(" Reading Version... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - fireDebug(" Reading CA Crl Version... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - fireDebug(" Reading Signer Crl Version... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - fireDebug(" Reading Padding Byte... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 4); - version = temp[0]; - caCrlVersion = temp[1]; - signerCrlVersion = temp[2]; - paddingByte = temp[3]; - - fireDebug(" Reading Startup IOS... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 8); - startupIos = Shared.Swap(BitConverter.ToUInt64(temp, 0)); - - fireDebug(" Reading Title ID... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 8); - titleId = Shared.Swap(BitConverter.ToUInt64(temp, 0)); - - fireDebug(" Reading Title Type... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 4); - titleType = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - fireDebug(" Reading Group ID... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 2); - groupId = Shared.Swap(BitConverter.ToUInt16(temp, 0)); - - fireDebug(" Reading Padding2... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 2); - padding2 = Shared.Swap(BitConverter.ToUInt16(temp, 0)); - - fireDebug(" Reading Region... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 2); - region = Shared.Swap(BitConverter.ToUInt16(temp, 0)); - - fireDebug(" Reading Reserved... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(reserved, 0, reserved.Length); - - fireDebug(" Reading Access Rights... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 4); - accessRights = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - fireDebug(" Reading Title Version... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - fireDebug(" Reading NumOfContents... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - fireDebug(" Reading Boot Index... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - fireDebug(" Reading Padding3... (Offset: 0x{0})", tmdFile.Position.ToString("x8").ToUpper()); - tmdFile.Read(temp, 0, 8); - titleVersion = Shared.Swap(BitConverter.ToUInt16(temp, 0)); - numOfContents = Shared.Swap(BitConverter.ToUInt16(temp, 2)); - bootIndex = Shared.Swap(BitConverter.ToUInt16(temp, 4)); - padding3 = Shared.Swap(BitConverter.ToUInt16(temp, 6)); - - contents = new List(); - - //Read Contents - for (int i = 0; i < numOfContents; i++) - { - fireDebug(" Reading Content #{0} of {1}... (Offset: 0x{2})", i + 1, numOfContents, tmdFile.Position.ToString("x8").ToUpper().ToUpper()); - - TMD_Content tempContent = new TMD_Content(); - tempContent.Hash = new byte[20]; - - tmdFile.Read(temp, 0, 8); - tempContent.ContentID = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - tempContent.Index = Shared.Swap(BitConverter.ToUInt16(temp, 4)); - tempContent.Type = (ContentType)Shared.Swap(BitConverter.ToUInt16(temp, 6)); - - tmdFile.Read(temp, 0, 8); - tempContent.Size = Shared.Swap(BitConverter.ToUInt64(temp, 0)); - - tmdFile.Read(tempContent.Hash, 0, tempContent.Hash.Length); - - contents.Add(tempContent); - } - - fireDebug("Pasing TMD Finished..."); - } - - private string calculateNandBlocks() - { - int nandSizeMin = 0; - int nandSizeMax = 0; - - for (int i = 0; i < numOfContents; i++) - { - nandSizeMax += (int)contents[i].Size; - if (contents[i].Type == ContentType.Normal) nandSizeMin += (int)contents[i].Size; - } - - int blocksMin = (int)Math.Ceiling((double)((double)nandSizeMin / (128 * 1024))); - int blocksMax = (int)Math.Ceiling((double)((double)nandSizeMax / (128 * 1024))); - - if (blocksMin == blocksMax) return blocksMax.ToString(); - else return string.Format("{0} - {1}", blocksMin, blocksMax); - } - #endregion - - #region Events - /// - /// Fires debugging messages. You may write them into a log file or log textbox. - /// - public event EventHandler Debug; - - private void fireDebug(string debugMessage, params object[] args) - { - EventHandler debug = Debug; - if (debug != null) - debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); - } - #endregion - } - - public class TMD_Content - { - private uint contentId; - private ushort index; - private ushort type; - private ulong size; - private byte[] hash = new byte[20]; - - public uint ContentID { get { return contentId; } set { contentId = value; } } - public ushort Index { get { return index; } set { index = value; } } - public ContentType Type { get { return (ContentType)type; } set { type = (ushort)value; } } - public ulong Size { get { return size; } set { size = value; } } - public byte[] Hash { get { return hash; } set { hash = value; } } - } -} diff --git a/NUS Downloader/TODO b/NUS Downloader/TODO deleted file mode 100644 index 5d608a1..0000000 --- a/NUS Downloader/TODO +++ /dev/null @@ -1,21 +0,0 @@ -/////////////////////////////////////////// -// NUS Downloader: TODO // -// $Rev:: $ // -// $Author:: $ // -// $Date:: $ // -/////////////////////////////////////////// - -Make more compatible with mono for Linux. -Broken stuff: -Working stuff: - - Downloading anything - - Displaying Form1 - - Loading database - - Generating update scripts - - - -Finish scripting improvements. - -Routine: -Verify version number before releases! \ No newline at end of file diff --git a/NUS Downloader/Ticket.cs b/NUS Downloader/Ticket.cs deleted file mode 100644 index e7b0189..0000000 --- a/NUS Downloader/Ticket.cs +++ /dev/null @@ -1,626 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; -using System.Security.Cryptography; - -namespace libWiiSharp -{ - public enum CommonKeyType : byte - { - Standard = 0x00, - Korean = 0x01, - } - - public class Ticket : IDisposable - { - private byte newKeyIndex = (byte)CommonKeyType.Standard; - private byte[] decryptedTitleKey = new byte[16]; - private bool fakeSign = false; - private bool titleKeyChanged = false; - private byte[] newEncryptedTitleKey = new byte[0]; - private bool reDecrypt = false; - - private uint signatureExponent = 0x00010001; - private byte[] signature = new byte[256]; - private byte[] padding = new byte[60]; - private byte[] issuer = new byte[64]; - private byte[] unknown = new byte[63]; - private byte[] encryptedTitleKey = new byte[16]; - private byte unknown2; - private ulong ticketId; - private uint consoleId; - private ulong titleId; - private ushort unknown3 = 0xFFFF; - private ushort numOfDlc; - private ulong unknown4; - private byte padding2; - private byte commonKeyIndex = (byte)CommonKeyType.Standard; - private byte[] unknown5 = new byte[48]; - private byte[] unknown6 = new byte[32]; //0xFF - private ushort padding3; - private uint enableTimeLimit; - private uint timeLimit; - private byte[] padding4 = new byte[88]; - - private bool dsitik = false; - - /// - /// The Title Key the WADs content is encrypted with. - /// - public byte[] TitleKey { get { return decryptedTitleKey; } set { decryptedTitleKey = value; titleKeyChanged = true; reDecrypt = false; } } - /// - /// Defines which Common Key is used (Standard / Korean). - /// - public CommonKeyType CommonKeyIndex { get { return (CommonKeyType)newKeyIndex; } set { newKeyIndex = (byte)value; } } - /// - /// The Ticket ID. - /// - public ulong TicketID { get { return ticketId; } set { ticketId = value; } } - /// - /// The Console ID. - /// - public uint ConsoleID { get { return consoleId; } set { consoleId = value; } } - /// - /// The Title ID. - /// - public ulong TitleID { get { return titleId; } set { titleId = value; if (reDecrypt) reDecryptTitleKey(); } } - /// - /// Number of DLC. - /// - public ushort NumOfDLC { get { return numOfDlc; } set { numOfDlc = value; } } - /// - /// If true, the Ticket will be fakesigned while saving. - /// - public bool FakeSign { get { return fakeSign; } set { fakeSign = value; } } - /// - /// True if the Title Key was changed. - /// - public bool TitleKeyChanged { get { return titleKeyChanged; } } - - /// - /// If true, the Ticket will utilize the DSi CommonKey. - /// - public bool DSiTicket { get { return dsitik; } set { dsitik = value; decryptTitleKey(); } } - - #region IDisposable Members - private bool isDisposed = false; - - ~Ticket() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing && !isDisposed) - { - decryptedTitleKey = null; - newEncryptedTitleKey = null; - signature = null; - padding = null; - issuer = null; - unknown = null; - encryptedTitleKey = null; - unknown5 = null; - unknown6 = null; - padding4 = null; - } - - isDisposed = true; - } - #endregion - - #region Public Functions - /// - /// Loads a tik file. - /// - /// - /// - public static Ticket Load(string pathToTicket) - { - return Load(File.ReadAllBytes(pathToTicket)); - } - - /// - /// Loads a tik file. - /// - /// - /// - public static Ticket Load(byte[] ticket) - { - Ticket tik = new Ticket(); - MemoryStream ms = new MemoryStream(ticket); - - try { tik.parseTicket(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - return tik; - } - - /// - /// Loads a tik file. - /// - /// - /// - public static Ticket Load(Stream ticket) - { - Ticket tik = new Ticket(); - tik.parseTicket(ticket); - return tik; - } - - - - /// - /// Loads a tik file. - /// - /// - public void LoadFile(string pathToTicket) - { - LoadFile(File.ReadAllBytes(pathToTicket)); - } - - /// - /// Loads a tik file. - /// - /// - public void LoadFile(byte[] ticket) - { - MemoryStream ms = new MemoryStream(ticket); - - try { parseTicket(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - } - - /// - /// Loads a tik file. - /// - /// - public void LoadFile(Stream ticket) - { - parseTicket(ticket); - } - - - - /// - /// Saves the Ticket. - /// - /// - public void Save(string savePath) - { - Save(savePath, false); - } - - /// - /// Saves the Ticket. If fakeSign is true, the Ticket will be fakesigned. - /// - /// - /// - public void Save(string savePath, bool fakeSign) - { - if (fakeSign) this.fakeSign = true; - if (File.Exists(savePath)) File.Delete(savePath); - - using (FileStream fs = new FileStream(savePath, FileMode.Create)) - writeToStream(fs); - } - - /// - /// Returns the Ticket as a memory stream. - /// - /// - public MemoryStream ToMemoryStream() - { - return ToMemoryStream(false); - } - - /// - /// Returns the Ticket as a memory stream. If fakeSign is true, the Ticket will be fakesigned. - /// - /// - /// - public MemoryStream ToMemoryStream(bool fakeSign) - { - if (fakeSign) this.fakeSign = true; - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - return ms; - } - - /// - /// Returns the Ticket as a byte array. - /// - /// - public byte[] ToByteArray() - { - return ToByteArray(false); - } - - /// - /// Returns the Ticket as a byte array. If fakeSign is true, the Ticket will be fakesigned. - /// - /// - /// - public byte[] ToByteArray(bool fakeSign) - { - if (fakeSign) this.fakeSign = true; - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - byte[] res = ms.ToArray(); - ms.Dispose(); - return res; - } - - /// - /// This will set a new encrypted Title Key (i.e. the one that you can "read" in the Ticket). - /// - /// - public void SetTitleKey(string newTitleKey) - { - SetTitleKey(newTitleKey.ToCharArray()); - } - - /// - /// This will set a new encrypted Title Key (i.e. the one that you can "read" in the Ticket). - /// - /// - public void SetTitleKey(char[] newTitleKey) - { - if (newTitleKey.Length != 16) - throw new Exception("The title key must be 16 characters long!"); - - for (int i = 0; i < 16; i++) - encryptedTitleKey[i] = (byte)newTitleKey[i]; - - decryptTitleKey(); - titleKeyChanged = true; - - reDecrypt = true; - newEncryptedTitleKey = encryptedTitleKey; - } - - /// - /// This will set a new encrypted Title Key (i.e. the one that you can "read" in the Ticket). - /// - /// - public void SetTitleKey(byte[] newTitleKey) - { - if (newTitleKey.Length != 16) - throw new Exception("The title key must be 16 characters long!"); - - encryptedTitleKey = newTitleKey; - decryptTitleKey(); - titleKeyChanged = true; - - reDecrypt = true; - newEncryptedTitleKey = newTitleKey; - } - - /// - /// Returns the Upper Title ID as a string. - /// - /// - public string GetUpperTitleID() - { - byte[] titleBytes = BitConverter.GetBytes(Shared.Swap((uint)titleId)); - return new string(new char[] { (char)titleBytes[0], (char)titleBytes[1], (char)titleBytes[2], (char)titleBytes[3] }); - } - #endregion - - #region Private Functions - private void writeToStream(Stream writeStream) - { - fireDebug("Writing Ticket..."); - - fireDebug(" Encrypting Title Key..."); - encryptTitleKey(); - fireDebug(" -> Decrypted Title Key: {0}", Shared.ByteArrayToString(decryptedTitleKey)); - fireDebug(" -> Encrypted Title Key: {0}", Shared.ByteArrayToString(encryptedTitleKey)); - - if (fakeSign) - { fireDebug(" Clearing Signature..."); signature = new byte[256]; } //Clear Signature if we fake Sign - - MemoryStream ms = new MemoryStream(); - ms.Seek(0, SeekOrigin.Begin); - - fireDebug(" Writing Signature Exponent... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(signatureExponent)), 0, 4); - - fireDebug(" Writing Signature... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(signature, 0, signature.Length); - - fireDebug(" Writing Padding... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(padding, 0, padding.Length); - - fireDebug(" Writing Issuer... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(issuer, 0, issuer.Length); - - fireDebug(" Writing Unknown... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(unknown, 0, unknown.Length); - - fireDebug(" Writing Title Key... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(encryptedTitleKey, 0, encryptedTitleKey.Length); - - fireDebug(" Writing Unknown2... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.WriteByte(unknown2); - - fireDebug(" Writing Ticket ID... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(ticketId)), 0, 8); - - fireDebug(" Writing Console ID... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(consoleId)), 0, 4); - - fireDebug(" Writing Title ID... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(titleId)), 0, 8); - - fireDebug(" Writing Unknwon3... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(unknown3)), 0, 2); - - fireDebug(" Writing NumOfDLC... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(numOfDlc)), 0, 2); - - fireDebug(" Writing Unknwon4... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(unknown4)), 0, 8); - - fireDebug(" Writing Padding2... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.WriteByte(padding2); - - fireDebug(" Writing Common Key Index... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.WriteByte(commonKeyIndex); - - fireDebug(" Writing Unknown5... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(unknown5, 0, unknown5.Length); - - fireDebug(" Writing Unknown6... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(unknown6, 0, unknown6.Length); - - fireDebug(" Writing Padding3... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(padding3)), 0, 2); - - fireDebug(" Writing Enable Time Limit... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(enableTimeLimit)), 0, 4); - - fireDebug(" Writing Time Limit... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(BitConverter.GetBytes(Shared.Swap(timeLimit)), 0, 4); - - fireDebug(" Writing Padding4... (Offset: 0x{0})", ms.Position.ToString("x8").ToUpper()); - ms.Write(padding4, 0, padding4.Length); - - byte[] tik = ms.ToArray(); - ms.Dispose(); - - //fake Sign - if (fakeSign) - { - fireDebug(" Fakesigning Ticket..."); - - byte[] hash = new byte[20]; - SHA1 s = SHA1.Create(); - - for (ushort i = 0; i < 0xFFFF; i++) - { - byte[] bytes = BitConverter.GetBytes(i); - tik[498] = bytes[1]; tik[499] = bytes[0]; - - hash = s.ComputeHash(tik); - if (hash[0] == 0x00) - { fireDebug(" -> Signed ({0})", i); break; } //Win! It's signed... - - if (i == 0xFFFF - 1) - { fireDebug(" -> Signing Failed..."); throw new Exception("Fakesigning failed..."); } - } - - s.Clear(); - } - - writeStream.Seek(0, SeekOrigin.Begin); - writeStream.Write(tik, 0, tik.Length); - - fireDebug("Writing Ticket Finished..."); - } - - private void parseTicket(Stream ticketFile) - { - fireDebug("Parsing Ticket..."); - - ticketFile.Seek(0, SeekOrigin.Begin); - byte[] temp = new byte[8]; - - fireDebug(" Reading Signature Exponent... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(temp, 0, 4); - signatureExponent = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - fireDebug(" Reading Signature... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(signature, 0, signature.Length); - - fireDebug(" Reading Padding... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(padding, 0, padding.Length); - - fireDebug(" Reading Issuer... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(issuer, 0, issuer.Length); - - fireDebug(" Reading Unknown... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(unknown, 0, unknown.Length); - - fireDebug(" Reading Title Key... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(encryptedTitleKey, 0, encryptedTitleKey.Length); - - fireDebug(" Reading Unknown2... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - unknown2 = (byte)ticketFile.ReadByte(); - - fireDebug(" Reading Ticket ID.. (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(temp, 0, 8); - ticketId = Shared.Swap(BitConverter.ToUInt64(temp, 0)); - - fireDebug(" Reading Console ID... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(temp, 0, 4); - consoleId = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - fireDebug(" Reading Title ID... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(temp, 0, 8); - titleId = Shared.Swap(BitConverter.ToUInt64(temp, 0)); - - fireDebug(" Reading Unknown3... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - fireDebug(" Reading NumOfDLC... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(temp, 0, 4); - unknown3 = Shared.Swap(BitConverter.ToUInt16(temp, 0)); - numOfDlc = Shared.Swap(BitConverter.ToUInt16(temp, 2)); - - fireDebug(" Reading Unknown4... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(temp, 0, 8); - unknown4 = Shared.Swap(BitConverter.ToUInt64(temp, 0)); - - fireDebug(" Reading Padding2... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - padding2 = (byte)ticketFile.ReadByte(); - - fireDebug(" Reading Common Key Index... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - commonKeyIndex = (byte)ticketFile.ReadByte(); - - newKeyIndex = commonKeyIndex; - - fireDebug(" Reading Unknown5... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(unknown5, 0, unknown5.Length); - - fireDebug(" Reading Unknown6... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(unknown6, 0, unknown6.Length); - - fireDebug(" Reading Padding3... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(temp, 0, 2); - padding3 = Shared.Swap(BitConverter.ToUInt16(temp, 0)); - - fireDebug(" Reading Enable Time Limit... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - fireDebug(" Reading Time Limit... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(temp, 0, 8); - enableTimeLimit = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - timeLimit = Shared.Swap(BitConverter.ToUInt32(temp, 4)); - - fireDebug(" Reading Padding4... (Offset: 0x{0})", ticketFile.Position.ToString("x8").ToUpper()); - ticketFile.Read(padding4, 0, padding4.Length); - - fireDebug(" Decrypting Title Key..."); - decryptTitleKey(); - fireDebug(" -> Encrypted Title Key: {0}", Shared.ByteArrayToString(encryptedTitleKey)); - fireDebug(" -> Decrypted Title Key: {0}", Shared.ByteArrayToString(decryptedTitleKey)); - - fireDebug("Parsing Ticket Finished..."); - } - - private void decryptTitleKey() - { - byte[] ckey; - if (dsitik) - { - ckey = CommonKey.GetDSiKey(); - } - else - ckey = (commonKeyIndex == 0x01) ? CommonKey.GetKoreanKey() : CommonKey.GetStandardKey(); - byte[] iv = BitConverter.GetBytes(Shared.Swap(titleId)); - Array.Resize(ref iv, 16); - - RijndaelManaged rm = new RijndaelManaged(); - rm.Mode = CipherMode.CBC; - rm.Padding = PaddingMode.None; - rm.KeySize = 128; - rm.BlockSize = 128; - rm.Key = ckey; - rm.IV = iv; - - ICryptoTransform decryptor = rm.CreateDecryptor(); - - MemoryStream ms = new MemoryStream(encryptedTitleKey); - CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read); - - cs.Read(decryptedTitleKey, 0, decryptedTitleKey.Length); - - cs.Dispose(); - ms.Dispose(); - decryptor.Dispose(); - rm.Clear(); - } - - private void encryptTitleKey() - { - commonKeyIndex = newKeyIndex; - byte[] ckey; - if (dsitik) - ckey = CommonKey.GetDSiKey(); - else - ckey = (commonKeyIndex == 0x01) ? CommonKey.GetKoreanKey() : CommonKey.GetStandardKey(); - byte[] iv = BitConverter.GetBytes(Shared.Swap(titleId)); - Array.Resize(ref iv, 16); - - RijndaelManaged rm = new RijndaelManaged(); - rm.Mode = CipherMode.CBC; - rm.Padding = PaddingMode.None; - rm.KeySize = 128; - rm.BlockSize = 128; - rm.Key = ckey; - rm.IV = iv; - - ICryptoTransform encryptor = rm.CreateEncryptor(); - - MemoryStream ms = new MemoryStream(decryptedTitleKey); - CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Read); - - cs.Read(encryptedTitleKey, 0, encryptedTitleKey.Length); - - cs.Dispose(); - ms.Dispose(); - encryptor.Dispose(); - rm.Clear(); - } - - private void reDecryptTitleKey() - { - encryptedTitleKey = newEncryptedTitleKey; - decryptTitleKey(); - } - #endregion - - #region Events - /// - /// Fires debugging messages. You may write them into a log file or log textbox. - /// - public event EventHandler Debug; - - private void fireDebug(string debugMessage, params object[] args) - { - EventHandler debug = Debug; - if (debug != null) - debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); - } - #endregion - } -} diff --git a/NUS Downloader/U8.cs b/NUS Downloader/U8.cs deleted file mode 100644 index 3d73107..0000000 --- a/NUS Downloader/U8.cs +++ /dev/null @@ -1,1120 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Security.Cryptography; - -namespace libWiiSharp -{ - public enum U8_NodeType : ushort - { - File = 0x0000, - Directory = 0x0100, - } - - public class U8 : IDisposable - { - private const int dataPadding = 32; - private Headers.HeaderType headerType = Headers.HeaderType.None; - private object header = null; - private U8_Header u8Header = new U8_Header(); - private U8_Node rootNode = new U8_Node(); - private List u8Nodes = new List(); - private List stringTable = new List(); - private List data = new List(); - private int iconSize = -1; - private int bannerSize = -1; - private int soundSize = -1; - private bool lz77 = false; - - /// - /// The type of the Header of the U8 file. - /// - public Headers.HeaderType HeaderType { get { return headerType; } } - /// - /// The Header of the U8 file as an object. Will be null if the file has no Header. - /// - public object Header { get { return header; } } - /// - /// The Rootnode of the U8 file. - /// - public U8_Node RootNode { get { return rootNode; } } - /// - /// The Nodes of the U8 file. - /// - public List Nodes { get { return u8Nodes; } } - /// - /// The string table of the U8 file. - /// - public string[] StringTable { get { return stringTable.ToArray(); } } - /// - /// The actual data (files) in the U8 file. Will be an empty byte array for directory entries. - /// - public byte[][] Data { get { return data.ToArray(); } } - - /// - /// The Number of Nodes WITHOUT the Rootnode. - /// - public int NumOfNodes { get { return (int)rootNode.SizeOfData - 1; } } - /// - /// The size of the icon.bin (if the U8 files contains an icon.bin). - /// - public int IconSize { get { return iconSize; } } - /// - /// The size of the banner.bin (if the U8 files contains an banner.bin). - /// - public int BannerSize { get { return bannerSize; } } - /// - /// The size of the sound.bin (if the U8 files contains an sound.bin). - /// - public int SoundSize { get { return soundSize; } } - /// - /// If true, the U8 file will be Lz77 compressed while saving. - /// - public bool Lz77Compress { get { return lz77; } set { lz77 = value; } } - - public U8() - { - rootNode.Type = U8_NodeType.Directory; - } - - #region IDisposable Members - private bool isDisposed = false; - - ~U8() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing && !isDisposed) - { - header = null; - u8Header = null; - rootNode = null; - - u8Nodes.Clear(); - u8Nodes = null; - - stringTable.Clear(); - stringTable = null; - - data.Clear(); - data = null; - } - - isDisposed = true; - } - #endregion - - #region Public Functions - /// - /// Checks whether a file is a U8 file or not. - /// - /// - /// - public static bool IsU8(string pathToFile) - { - return IsU8(File.ReadAllBytes(pathToFile)); - } - - /// - /// Checks whether a file is a U8 file or not. - /// - /// - /// - public static bool IsU8(byte[] file) - { - if (Lz77.IsLz77Compressed(file)) - { - byte[] partOfFile = new byte[(file.Length > 2000) ? 2000 : file.Length]; - - for (int i = 0; i < partOfFile.Length; i++) - partOfFile[i] = file[i]; - - Lz77 l = new Lz77(); - partOfFile = l.Decompress(partOfFile); - - return IsU8(partOfFile); - } - else - { - Headers.HeaderType h = Headers.DetectHeader(file); - return (Shared.Swap(BitConverter.ToUInt32(file, (int)h)) == 0x55AA382D); - } - } - - - - /// - /// Loads a U8 file. - /// - /// - /// - public static U8 Load(string pathToU8) - { - return Load(File.ReadAllBytes(pathToU8)); - } - - /// - /// Loads a U8 file. - /// - /// - /// - public static U8 Load(byte[] u8File) - { - U8 u = new U8(); - MemoryStream ms = new MemoryStream(u8File); - - try { u.parseU8(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - return u; - } - - /// - /// Loads a U8 file. - /// - /// - /// - public static U8 Load(Stream u8File) - { - U8 u = new U8(); - u.parseU8(u8File); - return u; - } - - /// - /// Creates a U8 file. - /// - /// - /// - public static U8 FromDirectory(string pathToDirectory) - { - U8 u = new U8(); - u.createFromDir(pathToDirectory); - return u; - } - - - - /// - /// Loads a U8 file. - /// - /// - public void LoadFile(string pathToU8) - { - LoadFile(File.ReadAllBytes(pathToU8)); - } - - /// - /// Loads a U8 file. - /// - /// - public void LoadFile(byte[] u8File) - { - MemoryStream ms = new MemoryStream(u8File); - - try { parseU8(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - } - - /// - /// Loads a U8 file. - /// - /// - public void LoadFile(Stream u8File) - { - parseU8(u8File); - } - - /// - /// Creates a U8 file. - /// - /// - public void CreateFromDirectory(string pathToDirectory) - { - createFromDir(pathToDirectory); - } - - - - /// - /// Saves the U8 file. - /// - /// - public void Save(string savePath) - { - if (File.Exists(savePath)) File.Delete(savePath); - - using (FileStream fs = new FileStream(savePath, FileMode.Create)) - writeToStream(fs); - } - - /// - /// Returns the U8 file as a memory stream. - /// - /// - public MemoryStream ToMemoryStream() - { - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - return ms; - } - - /// - /// Returns the U8 file as a byte array. - /// - /// - public byte[] ToByteArray() - { - return ToMemoryStream().ToArray(); - } - - /// - /// Unpacks the U8 file to given directory. - /// - /// - public void Unpack(string saveDir) - { - unpackToDir(saveDir); - } - - /// - /// Unpacks the U8 file to given directory. - /// - /// - public void Extract(string saveDir) - { - unpackToDir(saveDir); - } - - /// - /// Adds an IMET Header to the U8 file. - /// - /// - /// - public void AddHeaderImet(bool shortImet, params string[] titles) - { - if (iconSize == -1) - throw new Exception("icon.bin wasn't found!"); - else if (bannerSize == -1) - throw new Exception("banner.bin wasn't found!"); - else if (soundSize == -1) - throw new Exception("sound.bin wasn't found!"); - - header = Headers.IMET.Create(shortImet, iconSize, bannerSize, soundSize, titles); - headerType = (shortImet) ? Headers.HeaderType.ShortIMET : Headers.HeaderType.IMET; - } - - /// - /// Adds an IMD5 Header to the U8 file. - /// - public void AddHeaderImd5() - { - headerType = Headers.HeaderType.IMD5; - } - - /// - /// Replaces the file with the given index. - /// - /// - /// - public void ReplaceFile(int fileIndex, string pathToNewFile, bool changeFileName = false) - { - if (u8Nodes[fileIndex].Type == U8_NodeType.Directory) - throw new Exception("You can't replace a directory with a file!"); - - data[fileIndex] = File.ReadAllBytes(pathToNewFile); - if (changeFileName) stringTable[fileIndex] = Path.GetFileName(pathToNewFile); - - if (stringTable[fileIndex].ToLower() == "icon.bin") - iconSize = getRealSize(File.ReadAllBytes(pathToNewFile)); - else if (stringTable[fileIndex].ToLower() == "banner.bin") - bannerSize = getRealSize(File.ReadAllBytes(pathToNewFile)); - else if (stringTable[fileIndex].ToLower() == "sound.bin") - soundSize = getRealSize(File.ReadAllBytes(pathToNewFile)); - } - - /// - /// Replaces the file with the given index. - /// - /// - /// - public void ReplaceFile(int fileIndex, byte[] newData) - { - if (u8Nodes[fileIndex].Type == U8_NodeType.Directory) - throw new Exception("You can't replace a directory with a file!"); - - data[fileIndex] = newData; - - if (stringTable[fileIndex].ToLower() == "icon.bin") - iconSize = getRealSize(newData); - else if (stringTable[fileIndex].ToLower() == "banner.bin") - bannerSize = getRealSize(newData); - else if (stringTable[fileIndex].ToLower() == "sound.bin") - soundSize = getRealSize(newData); - } - - /// - /// Returns the index of the directory or file with the given name. - /// If no matching Node is found, -1 will be returned. - /// - /// - /// - public int GetNodeIndex(string fileOrDirName) - { - for (int i = 0; i < u8Nodes.Count; i++) - if (stringTable[i].ToLower() == fileOrDirName.ToLower()) return i; - - return -1; - } - - /// - /// Changes the name of a node. - /// - /// - /// - public void RenameNode(int index, string newName) - { - stringTable[index] = newName; - } - - /// - /// Changes the name of a node. - /// - /// - /// - public void RenameNode(string oldName, string newName) - { - stringTable[GetNodeIndex(oldName)] = newName; - } - - /// - /// Adds a directory to the U8 file. - /// Path must be like this: "/arc/timg/newFolder". - /// - /// - public void AddDirectory(string path) - { - addEntry(path, new byte[0]); - } - - /// - /// Adds a file to the U8 file. - /// Path must be like this: "/arc/timg/newFile.tpl". - /// - /// - /// - public void AddFile(string path, byte[] data) - { - addEntry(path, data); - } - - /// - /// Removes a directory from the U8 file. - /// If the directory contains files/dirs, they will also be deleted. - /// Path must be like this: "/arc/timg/folderToDelete". - /// - /// - public void RemoveDirectory(string path) - { - removeEntry(path); - } - - /// - /// Removes a file from the U8 file. - /// Path must be like this: "/arc/timg/fileToDelete.tpl". - /// - /// - public void RemoveFile(string path) - { - removeEntry(path); - } - #endregion - - #region Private Functions - private void writeToStream(Stream writeStream) - { - fireDebug("Writing U8 File..."); - - //Update Rootnode - fireDebug(" Updating Rootnode..."); - rootNode.SizeOfData = (uint)u8Nodes.Count + 1; - - MemoryStream u8Stream = new MemoryStream(); - - //Write Stringtable - u8Stream.Seek(u8Header.OffsetToRootNode + ((u8Nodes.Count + 1) * 12), SeekOrigin.Begin); - - fireDebug(" Writing String Table... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper()); - u8Stream.WriteByte(0x00); - - int stringTablePosition = (int)u8Stream.Position - 1; - for (int i = 0; i < u8Nodes.Count; i++) - { - fireDebug(" -> Entry #{1} of {2}: \"{3}\"... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper(), i + 1, u8Nodes.Count, stringTable[i]); - - u8Nodes[i].OffsetToName = (ushort)(u8Stream.Position - stringTablePosition); - byte[] stringBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(stringTable[i]); - - u8Stream.Write(stringBytes, 0, stringBytes.Length); - u8Stream.WriteByte(0x00); - } - - u8Header.HeaderSize = (uint)(u8Stream.Position - u8Header.OffsetToRootNode); - u8Header.OffsetToData = 0; - - //Write Data - for (int i = 0; i < u8Nodes.Count; i++) - { - fireProgress((i + 1) * 100 / u8Nodes.Count); - - if (u8Nodes[i].Type == U8_NodeType.File) - { - u8Stream.Seek(Shared.AddPadding((int)u8Stream.Position, dataPadding), SeekOrigin.Begin); - - fireDebug(" Writing Data #{1} of {2}... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper(), i + 1, u8Nodes.Count); - - if (u8Header.OffsetToData == 0) u8Header.OffsetToData = (uint)u8Stream.Position; - u8Nodes[i].OffsetToData = (uint)u8Stream.Position; - u8Nodes[i].SizeOfData = (uint)data[i].Length; - - u8Stream.Write(data[i], 0, data[i].Length); - } - else fireDebug(" Node #{0} of {1} is a Directory...", i + 1, u8Nodes.Count); - } - - //Pad End to 16 bytes - while (u8Stream.Position % 16 != 0) - u8Stream.WriteByte(0x00); - - //Write Header + Nodes - u8Stream.Seek(0, SeekOrigin.Begin); - - fireDebug(" Writing Header... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper()); - u8Header.Write(u8Stream); - - fireDebug(" Writing Rootnode... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper()); - rootNode.Write(u8Stream); - - for (int i = 0; i < u8Nodes.Count; i++) - { - fireDebug(" Writing Node Entry #{1} of {2}... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper(), i + 1, u8Nodes.Count); - u8Nodes[i].Write(u8Stream); - } - - byte[] u8Array = u8Stream.ToArray(); - u8Stream.Dispose(); - - if (lz77) - { - fireDebug(" Lz77 Compressing U8 File..."); - - Lz77 l = new Lz77(); - u8Array = l.Compress(u8Array); - } - - //Write File Header - if (headerType == Headers.HeaderType.IMD5) - { - fireDebug(" Adding IMD5 Header..."); - - writeStream.Seek(0, SeekOrigin.Begin); - Headers.IMD5 h = Headers.IMD5.Create(u8Array); - h.Write(writeStream); - } - else if (headerType == Headers.HeaderType.IMET || headerType == Headers.HeaderType.ShortIMET) - { - fireDebug(" Adding IMET Header..."); - - ((Headers.IMET)header).IconSize = (uint)iconSize; - ((Headers.IMET)header).BannerSize = (uint)bannerSize; - ((Headers.IMET)header).SoundSize = (uint)soundSize; - - writeStream.Seek(0, SeekOrigin.Begin); - ((Headers.IMET)header).Write(writeStream); - } - - writeStream.Write(u8Array, 0, u8Array.Length); - - fireDebug("Writing U8 File Finished..."); - } - - private void unpackToDir(string saveDir) - { - fireDebug("Unpacking U8 File to: {0}", saveDir); - - if (!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir); - - string[] dirs = new string[u8Nodes.Count]; - dirs[0] = saveDir; - int[] dirCount = new int[u8Nodes.Count]; - int dirIndex = 0; - - for (int i = 0; i < u8Nodes.Count; i++) - { - fireDebug(" Unpacking Entry #{0} of {1}", i + 1, u8Nodes.Count); - fireProgress((i + 1) * 100 / u8Nodes.Count); - - switch (u8Nodes[i].Type) - { - case U8_NodeType.Directory: - fireDebug(" -> Directory: \"{0}\"", stringTable[i]); - - if (dirs[dirIndex][dirs[dirIndex].Length - 1] != Path.DirectorySeparatorChar) { dirs[dirIndex] = dirs[dirIndex] + Path.DirectorySeparatorChar; } - Directory.CreateDirectory(dirs[dirIndex] + stringTable[i]); - dirs[dirIndex + 1] = dirs[dirIndex] + stringTable[i]; - dirIndex++; - dirCount[dirIndex] = (int)u8Nodes[i].SizeOfData; - break; - default: - fireDebug(" -> File: \"{0}\"", stringTable[i]); - fireDebug(" -> Size: {0} bytes", data[i].Length); - - using (FileStream fs = new FileStream(dirs[dirIndex] + Path.DirectorySeparatorChar + stringTable[i], FileMode.Create)) - fs.Write(data[i], 0, data[i].Length); - break; - } - - while (dirIndex > 0 && dirCount[dirIndex] == i + 2) - { dirIndex--; } - } - - fireDebug("Unpacking U8 File Finished"); - } - - private void parseU8(Stream u8File) - { - fireDebug("Pasing U8 File..."); - - u8Header = new U8_Header(); - rootNode = new U8_Node(); - u8Nodes = new List(); - stringTable = new List(); - data = new List(); - - fireDebug(" Detecting Header..."); - headerType = Headers.DetectHeader(u8File); - Headers.HeaderType tempType = headerType; - - fireDebug(" -> {0}", headerType.ToString()); - - if (headerType == Headers.HeaderType.IMD5) - { - fireDebug(" Reading IMD5 Header..."); - header = Headers.IMD5.Load(u8File); - - byte[] file = new byte[u8File.Length]; - u8File.Read(file, 0, file.Length); - - MD5 m = MD5.Create(); - byte[] newHash = m.ComputeHash(file, (int)headerType, (int)u8File.Length - (int)headerType); - m.Clear(); - - if (!Shared.CompareByteArrays(newHash, ((Headers.IMD5)header).Hash)) - { - fireDebug(@"/!\ /!\ /!\ Hashes do not match /!\ /!\ /!\"); - fireWarning(string.Format("Hashes of IMD5 header and file do not match! The content might be corrupted!")); - } - } - else if (headerType == Headers.HeaderType.IMET || headerType == Headers.HeaderType.ShortIMET) - { - fireDebug(" Reading IMET Header..."); - header = Headers.IMET.Load(u8File); - - if (!((Headers.IMET)header).HashesMatch) - { - fireDebug(@"/!\ /!\ /!\ Hashes do not match /!\ /!\ /!\"); - fireWarning(string.Format("The hash stored in the IMET header doesn't match the headers hash! The header and/or file might be corrupted!")); - } - } - - fireDebug(" Checking for Lz77 Compression..."); - if (Lz77.IsLz77Compressed(u8File)) - { - fireDebug(" -> Lz77 Compression Found..."); - fireDebug(" Decompressing U8 Data..."); - - Lz77 l = new Lz77(); - Stream decompressedFile = l.Decompress(u8File); - - tempType = Headers.DetectHeader(decompressedFile); - u8File = decompressedFile; - - lz77 = true; - } - - u8File.Seek((int)tempType, SeekOrigin.Begin); - byte[] temp = new byte[4]; - - //Read U8 Header - fireDebug(" Reading U8 Header: Magic... (Offset: 0x{0})", u8File.Position.ToString("x8").ToUpper()); - u8File.Read(temp, 0, 4); - if (Shared.Swap(BitConverter.ToUInt32(temp, 0)) != u8Header.U8Magic) - { fireDebug(" -> Invalid Magic!"); throw new Exception("U8 Header: Invalid Magic!"); } - - fireDebug(" Reading U8 Header: Offset to Rootnode... (Offset: 0x{0})", u8File.Position.ToString("x8").ToUpper()); - u8File.Read(temp, 0, 4); - if (Shared.Swap(BitConverter.ToUInt32(temp, 0)) != u8Header.OffsetToRootNode) - { fireDebug(" -> Invalid Offset to Rootnode"); throw new Exception("U8 Header: Invalid Offset to Rootnode!"); } - - fireDebug(" Reading U8 Header: Header Size... (Offset: 0x{0})", u8File.Position.ToString("x8").ToUpper()); - u8File.Read(temp, 0, 4); - u8Header.HeaderSize = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - fireDebug(" Reading U8 Header: Offset to Data... (Offset: 0x{0})", u8File.Position.ToString("x8").ToUpper()); - u8File.Read(temp, 0, 4); - u8Header.OffsetToData = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - u8File.Seek(16, SeekOrigin.Current); - - //Read Rootnode - fireDebug(" Reading Rootnode... (Offset: 0x{0})", u8File.Position.ToString("x8").ToUpper()); - u8File.Read(temp, 0, 4); - rootNode.Type = (U8_NodeType)Shared.Swap(BitConverter.ToUInt16(temp, 0)); - rootNode.OffsetToName = Shared.Swap(BitConverter.ToUInt16(temp, 2)); - - u8File.Read(temp, 0, 4); - rootNode.OffsetToData = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - u8File.Read(temp, 0, 4); - rootNode.SizeOfData = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - int stringTablePosition = (int)((int)tempType + u8Header.OffsetToRootNode + rootNode.SizeOfData * 12); - int nodePosition = (int)u8File.Position; - - //Read Nodes - for (int i = 0; i < rootNode.SizeOfData - 1; i++) - { - fireDebug(" Reading Node #{1} of {2}... (Offset: 0x{0})", u8File.Position.ToString("x8").ToUpper(), i + 1, rootNode.SizeOfData - 1); - fireProgress((int)((i + 1) * 100 / (rootNode.SizeOfData - 1))); - - U8_Node tempNode = new U8_Node(); - string tempName = string.Empty; - byte[] tempData = new byte[0]; - - //Read Node Entry - u8File.Seek(nodePosition, SeekOrigin.Begin); - - fireDebug(" -> Reading Node Entry... (Offset: 0x{0})", u8File.Position.ToString("x8").ToUpper()); - u8File.Read(temp, 0, 4); - tempNode.Type = (U8_NodeType)Shared.Swap(BitConverter.ToUInt16(temp, 0)); - tempNode.OffsetToName = Shared.Swap(BitConverter.ToUInt16(temp, 2)); - - u8File.Read(temp, 0, 4); - tempNode.OffsetToData = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - u8File.Read(temp, 0, 4); - tempNode.SizeOfData = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - nodePosition = (int)u8File.Position; - - fireDebug(" -> {0}", tempNode.Type.ToString()); - - //Read Node Name - u8File.Seek(stringTablePosition + tempNode.OffsetToName, SeekOrigin.Begin); - - fireDebug(" -> Reading Node Name... (Offset: 0x{0})", u8File.Position.ToString("x8").ToUpper()); - for (;;) - { - char tempChar = (char)u8File.ReadByte(); - if (tempChar == 0x00) break; - - tempName += tempChar; - - if (tempName.Length > 255) break; - } - - fireDebug(" -> {0}", tempName); - - //Read Node Data - if (tempNode.Type == U8_NodeType.File) - { - u8File.Seek((int)tempType + tempNode.OffsetToData, SeekOrigin.Begin); - - fireDebug(" -> Reading Node Data (Offset: 0x{0})", u8File.Position.ToString("x8").ToUpper()); - - tempData = new byte[tempNode.SizeOfData]; - u8File.Read(tempData, 0, tempData.Length); - } - - if (tempName.ToLower() == "icon.bin") iconSize = getRealSize(tempData); - else if (tempName.ToLower() == "banner.bin") bannerSize = getRealSize(tempData); - else if (tempName.ToLower() == "sound.bin") soundSize = getRealSize(tempData); - - u8Nodes.Add(tempNode); - stringTable.Add(tempName); - data.Add(tempData); - } - - fireDebug("Pasing U8 File Finished..."); - } - - private void createFromDir(string path) - { - fireDebug("Creating U8 File from: {0}", path); - - if (path[path.Length - 1] != Path.DirectorySeparatorChar) path += Path.DirectorySeparatorChar; - - fireDebug(" Collecting Content..."); - string[] dirEntries = getDirContent(path, true); - int offsetToName = 1; - int offsetToData = 0; - - fireDebug(" Creating U8 Header..."); - u8Header = new U8_Header(); - rootNode = new U8_Node(); - u8Nodes = new List(); - stringTable = new List(); - data = new List(); - - //Create Rootnode - fireDebug(" Creating Rootnode..."); - rootNode.Type = U8_NodeType.Directory; - rootNode.OffsetToName = 0; - rootNode.OffsetToData = 0; - rootNode.SizeOfData = (uint)dirEntries.Length + 1; - - //Create Nodes - for (int i = 0; i < dirEntries.Length; i++) - { - fireDebug(" Creating Node #{0} of {1}", i + 1, dirEntries.Length); - fireProgress((i + 1) * 100 / dirEntries.Length); - - U8_Node tempNode = new U8_Node(); - byte[] tempData = new byte[0]; - - string tempDirEntry = dirEntries[i].Remove(0, path.Length - 1); - - if (Directory.Exists(dirEntries[i])) //It's a dir - { - fireDebug(" -> Directory"); - - tempNode.Type = U8_NodeType.Directory; - tempNode.OffsetToData = (uint)Shared.CountCharsInString(tempDirEntry, Path.DirectorySeparatorChar); //Recursion - - int size = u8Nodes.Count + 2; - for (int j = 0; j < dirEntries.Length; j++) - if (dirEntries[j].Contains(dirEntries[i] + System.IO.Path.DirectorySeparatorChar.ToString())) size++; - - tempNode.SizeOfData = (uint)size; - } - else //It's a file - { - fireDebug(" -> File"); - fireDebug(" -> Reading File Data..."); - - tempData = File.ReadAllBytes(dirEntries[i]); - tempNode.Type = U8_NodeType.File; - tempNode.OffsetToData = (uint)offsetToData; - tempNode.SizeOfData = (uint)tempData.Length; - - offsetToData += Shared.AddPadding(offsetToData + tempData.Length, dataPadding); - } - - tempNode.OffsetToName = (ushort)offsetToName; - offsetToName += (Path.GetFileName(dirEntries[i])).Length + 1; - - fireDebug(" -> Reading Name..."); - string tempName = Path.GetFileName(dirEntries[i]); - - if (tempName.ToLower() == "icon.bin") iconSize = getRealSize(tempData); - else if (tempName.ToLower() == "banner.bin") bannerSize = getRealSize(tempData); - else if (tempName.ToLower() == "sound.bin") soundSize = getRealSize(tempData); - - u8Nodes.Add(tempNode); - stringTable.Add(tempName); - data.Add(tempData); - } - - //Update U8 Header - fireDebug(" Updating U8 Header..."); - u8Header.HeaderSize = (uint)(((u8Nodes.Count + 1) * 12) + offsetToName); - u8Header.OffsetToData = (uint)Shared.AddPadding((int)u8Header.OffsetToRootNode + (int)u8Header.HeaderSize, dataPadding); - - //Update dataOffsets - fireDebug(" Calculating Data Offsets..."); - - for (int i = 0; i < u8Nodes.Count; i++) - { - fireDebug(" -> Node #{0} of {1}...", i + 1, u8Nodes.Count); - - int tempOffset = (int)u8Nodes[i].OffsetToData; - u8Nodes[i].OffsetToData = (uint)(u8Header.OffsetToData + tempOffset); - } - - fireDebug("Creating U8 File Finished..."); - } - - private string[] getDirContent(string dir, bool root) - { - string[] files = Directory.GetFiles(dir); - string[] dirs = Directory.GetDirectories(dir); - string all = ""; - - if (!root) - all += dir + "\n"; - - for (int i = 0; i < files.Length; i++) - all += files[i] + "\n"; - - foreach (string thisDir in dirs) - { - string[] temp = getDirContent(thisDir, false); - - foreach (string thisTemp in temp) - all += thisTemp + "\n"; - } - - return all.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); - } - - private int getRealSize(byte[] data) - { - if (data[0] == 'I' && data[1] == 'M' && data[2] == 'D' && data[3] == '5') - if (data[0x20] == 'L' && data[0x21] == 'Z' && data[0x22] == '7' && data[0x23] == '7') - return (BitConverter.ToInt32(data, 0x24)) >> 8; - else - return data.Length - 32; - - return data.Length; - } - - private void addEntry(string nodePath, byte[] fileData) - { - //Parse path - if (nodePath.StartsWith("/")) nodePath = nodePath.Remove(0, 1); - string[] path = nodePath.Split('/'); //Last entry is the filename - - int nodeIndex = -1; - int maxIndex = (u8Nodes.Count > 0) ? u8Nodes.Count - 1 : 0; - int currentIndex = 0; - List pathIndices = new List(); - - for (int i = 0; i < path.Length - 1; i++) - { - for (int j = currentIndex; j <= maxIndex; j++) - { - if (stringTable[j].ToLower() == path[i].ToLower()) - { - if (i == path.Length - 2) nodeIndex = j; - - maxIndex = (int)u8Nodes[j].SizeOfData - 1; - currentIndex = j + 1; - pathIndices.Add(j); - - break; - } - - if (j == maxIndex - 1) throw new Exception("Path wasn't found!"); - } - } - - //Get last entry in current dir - int lastEntry; - - if (nodeIndex > -1) lastEntry = (int)u8Nodes[nodeIndex].SizeOfData - 2; - else lastEntry = (rootNode.SizeOfData > 1) ? (int)rootNode.SizeOfData - 2 : -1; - - //Create and insert node + data - U8_Node tempNode = new U8_Node(); - tempNode.Type = (fileData.Length == 0) ? U8_NodeType.Directory : U8_NodeType.File; - tempNode.SizeOfData = (uint)((fileData.Length == 0) ? lastEntry + 2 : fileData.Length); - tempNode.OffsetToData = (uint)((fileData.Length == 0) ? Shared.CountCharsInString(nodePath, '/') : 0); - - stringTable.Insert(lastEntry + 1, path[path.Length - 1]); - u8Nodes.Insert(lastEntry + 1, tempNode); - data.Insert(lastEntry + 1, fileData); - - //Update rootnode and path sizes (+1) - rootNode.SizeOfData += 1; - - foreach (int index in pathIndices) - if (u8Nodes[index].Type == U8_NodeType.Directory) - u8Nodes[index].SizeOfData += 1; - - for (int i = lastEntry + 1; i < u8Nodes.Count; i++) - if (u8Nodes[i].Type == U8_NodeType.Directory) - u8Nodes[i].SizeOfData += 1; - } - - private void removeEntry(string nodePath) - { - //Parse path - if (nodePath.StartsWith("/")) nodePath = nodePath.Remove(0, 1); - string[] path = nodePath.Split('/'); //Last entry is the filename - - int nodeIndex = -1; - int maxIndex = u8Nodes.Count - 1; - int currentIndex = 0; - List pathIndices = new List(); - - for (int i = 0; i < path.Length; i++) - { - for (int j = currentIndex; j < maxIndex; j++) - { - if (stringTable[j].ToLower() == path[i].ToLower()) - { - if (i == path.Length - 1) nodeIndex = j; - else pathIndices.Add(j); - - maxIndex = (int)u8Nodes[j].SizeOfData - 1; - currentIndex = j + 1; - - break; - } - - if (j == maxIndex - 1) throw new Exception("Path wasn't found!"); - } - } - - //Remove Node (and subnodes if node is dir) - int removed = 0; - - if (u8Nodes[nodeIndex].Type == U8_NodeType.Directory) - { - for (int i = (int)u8Nodes[nodeIndex].SizeOfData - 2; i >= nodeIndex; i--) - { - stringTable.RemoveAt(i); - u8Nodes.RemoveAt(i); - data.RemoveAt(i); - - removed++; - } - } - else - { - stringTable.RemoveAt(nodeIndex); - u8Nodes.RemoveAt(nodeIndex); - data.RemoveAt(nodeIndex); - - removed++; - } - - //Update rootnode and path sizes - rootNode.SizeOfData -= (uint)removed; - - foreach (int index in pathIndices) - if (u8Nodes[index].Type == U8_NodeType.Directory) - u8Nodes[index].SizeOfData -= (uint)removed; - - for (int i = nodeIndex + 1; i < u8Nodes.Count; i++) - if (u8Nodes[i].Type == U8_NodeType.Directory) - u8Nodes[i].SizeOfData -= (uint)removed; - } - #endregion - - #region Events - /// - /// Fires the Progress of various operations - /// - public event EventHandler Progress; - /// - /// Fires warnings (e.g. when hashes do not match) - /// - public event EventHandler Warning; - /// - /// Fires debugging messages. You may write them into a log file or log textbox. - /// - public event EventHandler Debug; - - - private void fireWarning(string warningMessage) - { - EventHandler warning = Warning; - if (warning != null) - warning(new object(), new MessageEventArgs(warningMessage)); - } - - private void fireDebug(string debugMessage, params object[] args) - { - EventHandler debug = Debug; - if (debug != null) - debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); - } - - private void fireProgress(int progressPercentage) - { - EventHandler progress = Progress; - if (progress != null) - progress(new object(), new ProgressChangedEventArgs(progressPercentage, string.Empty)); - } - #endregion - } - - public class U8_Header - { - private uint u8Magic = 0x55AA382D; - private uint offsetToRootNode = 0x20; - private uint headerSize; - private uint offsetToData; - private byte[] padding = new byte[16]; - - public uint U8Magic { get { return u8Magic; } } - public uint OffsetToRootNode { get { return offsetToRootNode; } } - public uint HeaderSize { get { return headerSize; } set { headerSize = value; } } - public uint OffsetToData { get { return offsetToData; } set { offsetToData = value; } } - public byte[] Padding { get { return padding; } } - - public void Write(Stream writeStream) - { - writeStream.Write(BitConverter.GetBytes(Shared.Swap(u8Magic)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToRootNode)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(headerSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToData)), 0, 4); - writeStream.Write(padding, 0, 16); - } - } - - public class U8_Node - { - private ushort type; - private ushort offsetToName; - private uint offsetToData; - private uint sizeOfData; - - public U8_NodeType Type { get { return (U8_NodeType)type; } set { type = (ushort)value; } } - public ushort OffsetToName { get { return offsetToName; } set { offsetToName = value; } } - public uint OffsetToData { get { return offsetToData; } set { offsetToData = value; } } - public uint SizeOfData { get { return sizeOfData; } set { sizeOfData = value; } } - - public void Write(Stream writeStream) - { - writeStream.Write(BitConverter.GetBytes(Shared.Swap(type)), 0, 2); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToName)), 0, 2); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToData)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(sizeOfData)), 0, 4); - } - } -} diff --git a/NUS Downloader/WAD.cs b/NUS Downloader/WAD.cs deleted file mode 100644 index 93e1e71..0000000 --- a/NUS Downloader/WAD.cs +++ /dev/null @@ -1,1269 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Security.Cryptography; - -namespace libWiiSharp -{ - public enum LowerTitleID : uint - { - SystemTitles = 0x00000001, - SystemChannels = 0x00010002, - Channel = 0x00010001, - GameChannel = 0x00010004, - DLC = 0x00010005, - HiddenChannels = 0x00010008, - } - - public class WAD : IDisposable - { - private SHA1 sha = SHA1.Create(); - private DateTime creationTimeUTC = new DateTime(1970, 1, 1); - private bool hasBanner = false; - private bool lz77CompressBannerAndIcon = true; - private bool lz77DecompressBannerAndIcon = false; - private bool keepOriginalFooter = false; - - private WAD_Header wadHeader; - private CertificateChain cert = new CertificateChain(); - private Ticket tik = new Ticket(); - private TMD tmd = new TMD(); - private List contents; - private U8 bannerApp = new U8(); - private byte[] footer = new byte[0]; - - /// - /// The region of the title. - /// - public Region Region { get { return tmd.Region; } set { tmd.Region = value; } } - /// - /// The Number of contents. - /// - public int NumOfContents { get { return tmd.NumOfContents; } } - /// - /// The content of the WAD. - /// - public byte[][] Contents { get { return contents.ToArray(); } } - /// - /// If true, the Ticket and TMD will be fakesigned. - /// - public bool FakeSign { get { return (tik.FakeSign && tmd.FakeSign); } set { tik.FakeSign = value; tmd.FakeSign = value; } } - /// - /// The banner app file (aka 00000000.app). Will be empty if HasBanner is false. - /// - public U8 BannerApp { get { return bannerApp; } set { bannerApp = value; } } - /// - /// The IOS the Title is launched with. - /// - public ulong StartupIOS { get { return tmd.StartupIOS; } set { tmd.StartupIOS = value; } } - /// - /// The Title ID. - /// - public ulong TitleID { get { return tik.TitleID; } set { tik.TitleID = value; tmd.TitleID = value; } } - /// - /// The upper Title ID as string. - /// - public string UpperTitleID { get { return tik.GetUpperTitleID(); } } - /// - /// The Title Version. - /// - public ushort TitleVersion { get { return tmd.TitleVersion; } set { tmd.TitleVersion = value; } } - /// - /// The boot index. Represents the index of the nand loader. - /// - public ushort BootIndex { get { return tmd.BootIndex; } set { tmd.BootIndex = value; } } - /// - /// The creation time of the Title. Will be 1/1/1970 if no Timestamp footer was found. - /// - public DateTime CreationTimeUTC { get { return creationTimeUTC; } } - /// - /// True if the WAD has a banner. - /// - public bool HasBanner { get { return hasBanner; } } - /// - /// If true, the banner.bin and icon.bin files will be Lz77 compressed while saving the WAD. - /// - public bool Lz77CompressBannerAndIcon { get { return lz77CompressBannerAndIcon; } set { lz77CompressBannerAndIcon = value; if (value) lz77DecompressBannerAndIcon = false; } } - /// - /// If true, the banner.bin and icon.bin files will be Lz77 decompressed while saving the WAD. - /// - public bool Lz77DecompressBannerAndIcon { get { return lz77DecompressBannerAndIcon; } set { lz77DecompressBannerAndIcon = value; if (value) lz77CompressBannerAndIcon = false; } } - /// - /// The Number of memory blocks the content will take. - /// Might be inaccurate due to Lz77 (de)compression while saving. - /// - public string NandBlocks { get { return tmd.GetNandBlocks(); } } - /// - /// All Channel Titles as a string array. Will be empty if HasBanner is false. - /// - public string[] ChannelTitles { get { if (hasBanner) return ((Headers.IMET)bannerApp.Header).AllTitles; else return new string[0]; } set { ChangeChannelTitles(value); } } - /// - /// If false, a timestamp will be added as footer (64 bytes). - /// Else, the original footer will be kept or the one you provided. - /// - public bool KeepOriginalFooter { get { return keepOriginalFooter; } set { keepOriginalFooter = value; } } - /// - /// The TMDs content entries. - /// - public TMD_Content[] TmdContents { get { return tmd.Contents; } } - - public WAD() - { - cert.Debug += new EventHandler(cert_Debug); - tik.Debug += new EventHandler(tik_Debug); - tmd.Debug += new EventHandler(tmd_Debug); - bannerApp.Debug += new EventHandler(bannerApp_Debug); - bannerApp.Warning += new EventHandler(bannerApp_Warning); - } - - #region IDisposable Members - private bool isDisposed = false; - - ~WAD() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposing && !isDisposed) - { - sha.Clear(); - sha = null; - - wadHeader = null; - - cert.Dispose(); - tik.Dispose(); - tmd.Dispose(); - - contents.Clear(); - contents = null; - - bannerApp.Dispose(); - - footer = null; - } - - isDisposed = true; - } - #endregion - - #region Public Functions - /// - /// Loads a WAD file. - /// - /// - /// - public static WAD Load(string pathToWad) - { - return Load(File.ReadAllBytes(pathToWad)); - } - - /// - /// Loads a WAD file. - /// - /// - /// - public static WAD Load(byte[] wadFile) - { - WAD w = new WAD(); - MemoryStream ms = new MemoryStream(wadFile); - - try { w.parseWad(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - return w; - } - - /// - /// Loads a WAD file. - /// - /// - /// - public static WAD Load(Stream wad) - { - WAD w = new WAD(); - w.parseWad(wad); - return w; - } - - /// - /// Creates a WAD file from contents. - /// - /// - /// - public static WAD Create(string contentDir) - { - string[] certPath = Directory.GetFiles(contentDir, "*cert*"); - string[] tikPath = Directory.GetFiles(contentDir, "*tik*"); - string[] tmdPath = Directory.GetFiles(contentDir, "*tmd*"); - - CertificateChain _cert = CertificateChain.Load(certPath[0]); - Ticket _tik = Ticket.Load(tikPath[0]); - TMD _tmd = TMD.Load(tmdPath[0]); - - bool namedContentId = true; - for (int i = 0; i < _tmd.Contents.Length; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + _tmd.Contents[i].ContentID.ToString("x8") + ".app")) - { namedContentId = false; break; } - - if (!namedContentId) - for (int i = 0; i < _tmd.Contents.Length; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + _tmd.Contents[i].Index.ToString("x8") + ".app")) - throw new Exception("Couldn't find all content files!"); - - byte[][] contents = new byte[_tmd.Contents.Length][]; - - for (int i = 0; i < _tmd.Contents.Length; i++) - { - string file = contentDir + Path.DirectorySeparatorChar + ((namedContentId) ? _tmd.Contents[i].ContentID.ToString("x8") : _tmd.Contents[i].Index.ToString("x8")) + ".app"; - contents[i] = File.ReadAllBytes(file); - } - - return Create(_cert, _tik, _tmd, contents); - } - - /// - /// Creates a WAD file from contents. - /// - /// - /// - /// - /// - /// - public static WAD Create(string pathToCert, string pathToTik, string pathToTmd, string contentDir) - { - CertificateChain _cert = CertificateChain.Load(pathToCert); - Ticket _tik = Ticket.Load(pathToTik); - TMD _tmd = TMD.Load(pathToTmd); - - bool namedContentId = true; - for (int i = 0; i < _tmd.Contents.Length; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + _tmd.Contents[i].ContentID.ToString("x8") + ".app")) - { namedContentId = false; break; } - - if (!namedContentId) - for (int i = 0; i < _tmd.Contents.Length; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + _tmd.Contents[i].Index.ToString("x8") + ".app")) - throw new Exception("Couldn't find all content files!"); - - byte[][] contents = new byte[_tmd.Contents.Length][]; - - for (int i = 0; i < _tmd.Contents.Length; i++) - { - string file = contentDir + Path.DirectorySeparatorChar + ((namedContentId) ? _tmd.Contents[i].ContentID.ToString("x8") : _tmd.Contents[i].Index.ToString("x8")) + ".app"; - contents[i] = File.ReadAllBytes(file); - } - - return Create(_cert, _tik, _tmd, contents); - } - - /// - /// Creates a WAD file from contents. - /// - /// - /// - /// - /// - /// - public static WAD Create(byte[] cert, byte[] tik, byte[] tmd, byte[][] contents) - { - CertificateChain _cert = CertificateChain.Load(cert); - Ticket _tik = Ticket.Load(tik); - TMD _tmd = TMD.Load(tmd); - - return Create(_cert, _tik, _tmd, contents); - } - - /// - /// Creates a WAD file from contents. - /// - /// - /// - /// - /// - /// - public static WAD Create(CertificateChain cert, Ticket tik, TMD tmd, byte[][] contents) - { - WAD w = new WAD(); - w.cert = cert; - w.tik = tik; - w.tmd = tmd; - w.contents = new List(contents); - - w.wadHeader = new WAD_Header(); - w.wadHeader.TmdSize = (uint)(484 + (tmd.Contents.Length * 36)); - - int contentSize = 0; - for (int i = 0; i < contents.Length - 1; i++) - contentSize += Shared.AddPadding(contents[i].Length); - - contentSize += contents[contents.Length - 1].Length; - - w.wadHeader.ContentSize = (uint)contentSize; - - for (int i = 0; i < w.tmd.Contents.Length; i++) - if (w.tmd.Contents[i].Index == 0x0000) - { - try { w.bannerApp.LoadFile(contents[i]); w.hasBanner = true; } - catch { w.hasBanner = false; } //Probably System Wad => No Banner App... - break; - } - - return w; - } - - - - /// - /// Loads a WAD file. - /// - /// - public void LoadFile(string pathToWad) - { - LoadFile(File.ReadAllBytes(pathToWad)); - } - - /// - /// Loads a WAD file. - /// - /// - public void LoadFile(byte[] wadFile) - { - MemoryStream ms = new MemoryStream(wadFile); - - try { parseWad(ms); } - catch { ms.Dispose(); throw; } - - ms.Dispose(); - } - - /// - /// Loads a WAD file. - /// - /// - public void LoadFile(Stream wad) - { - parseWad(wad); - } - - /// - /// Creates a WAD file from contents. - /// - /// - public void CreateNew(string contentDir) - { - string[] certPath = Directory.GetFiles(contentDir, "*cert*"); - string[] tikPath = Directory.GetFiles(contentDir, "*tik*"); - string[] tmdPath = Directory.GetFiles(contentDir, "*tmd*"); - - CertificateChain _cert = CertificateChain.Load(certPath[0]); - Ticket _tik = Ticket.Load(tikPath[0]); - TMD _tmd = TMD.Load(tmdPath[0]); - - bool namedContentId = true; - for (int i = 0; i < _tmd.Contents.Length; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + _tmd.Contents[i].ContentID.ToString("x8") + ".app")) - { namedContentId = false; break; } - - if (!namedContentId) - for (int i = 0; i < _tmd.Contents.Length; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + _tmd.Contents[i].Index.ToString("x8") + ".app")) - throw new Exception("Couldn't find all content files!"); - - byte[][] contents = new byte[_tmd.Contents.Length][]; - - for (int i = 0; i < _tmd.Contents.Length; i++) - { - string file = contentDir + Path.DirectorySeparatorChar + ((namedContentId) ? _tmd.Contents[i].ContentID.ToString("x8") : _tmd.Contents[i].Index.ToString("x8")) + ".app"; - contents[i] = File.ReadAllBytes(file); - } - - CreateNew(_cert, _tik, _tmd, contents); - } - - /// - /// Creates a WAD file from contents. - /// - /// - /// - /// - /// - public void CreateNew(string pathToCert, string pathToTik, string pathToTmd, string contentDir) - { - CertificateChain _cert = CertificateChain.Load(pathToCert); - Ticket _tik = Ticket.Load(pathToTik); - TMD _tmd = TMD.Load(pathToTmd); - - bool namedContentId = true; - for (int i = 0; i < _tmd.Contents.Length; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + _tmd.Contents[i].ContentID.ToString("x8") + ".app")) - { namedContentId = false; break; } - - if (!namedContentId) - for (int i = 0; i < _tmd.Contents.Length; i++) - if (!File.Exists(contentDir + Path.DirectorySeparatorChar + _tmd.Contents[i].Index.ToString("x8") + ".app")) - throw new Exception("Couldn't find all content files!"); - - byte[][] contents = new byte[_tmd.Contents.Length][]; - - for (int i = 0; i < _tmd.Contents.Length; i++) - { - string file = contentDir + Path.DirectorySeparatorChar + ((namedContentId) ? _tmd.Contents[i].ContentID.ToString("x8") : _tmd.Contents[i].Index.ToString("x8")) + ".app"; - contents[i] = File.ReadAllBytes(file); - } - - CreateNew(_cert, _tik, _tmd, contents); - } - - /// - /// Creates a WAD file from contents. - /// - /// - /// - /// - /// - public void CreateNew(byte[] cert, byte[] tik, byte[] tmd, byte[][] contents) - { - CertificateChain _cert = CertificateChain.Load(cert); - Ticket _tik = Ticket.Load(tik); - TMD _tmd = TMD.Load(tmd); - - CreateNew(_cert, _tik, _tmd, contents); - } - - /// - /// Creates a WAD file from contents. - /// - /// - /// - /// - /// - public void CreateNew(CertificateChain cert, Ticket tik, TMD tmd, byte[][] contents) - { - this.cert = cert; - this.tik = tik; - this.tmd = tmd; - this.contents = new List(contents); - - this.wadHeader = new WAD_Header(); - this.wadHeader.TmdSize = (uint)(484 + (tmd.Contents.Length * 36)); - - int contentSize = 0; - for (int i = 0; i < contents.Length - 1; i++) - contentSize += Shared.AddPadding(contents[i].Length); - - contentSize += contents[contents.Length - 1].Length; - - this.wadHeader.ContentSize = (uint)contentSize; - - for (int i = 0; i < this.tmd.Contents.Length; i++) - if (this.tmd.Contents[i].Index == 0x0000) - { - try { this.bannerApp.LoadFile(contents[i]); hasBanner = true; } - catch { hasBanner = false; } //Probably System Wad => No Banner App... - break; - } - } - - - /// - /// Saves the WAD file to the given location. - /// - /// - public void Save(string savePath) - { - if (File.Exists(savePath)) File.Delete(savePath); - - using (FileStream fs = new FileStream(savePath, FileMode.Create)) - writeToStream(fs); - } - - /// - /// Returns the WAD file as a memory stream. - /// - /// - public MemoryStream ToMemoryStream() - { - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - return ms; - } - - /// - /// Returns the WAD file as a byte array. - /// - /// - public byte[] ToByteArray() - { - MemoryStream ms = new MemoryStream(); - - try { writeToStream(ms); } - catch { ms.Dispose(); throw; } - - byte[] res = ms.ToArray(); - ms.Dispose(); - return res; - } - - /// - /// Changes the Title ID of the WAD file. - /// - /// - /// - public void ChangeTitleID(LowerTitleID lowerID, string upperID) - { - if (upperID.Length != 4) throw new Exception("Upper Title ID must be 4 characters long!"); - - byte[] temp = new byte[4]; - temp[0] = (byte)upperID[3]; - temp[1] = (byte)upperID[2]; - temp[2] = (byte)upperID[1]; - temp[3] = (byte)upperID[0]; - uint upper = BitConverter.ToUInt32(temp, 0); - - ulong newId = ((ulong)lowerID << 32) | upper; - - tik.TitleID = newId; - tmd.TitleID = newId; - } - - /// - /// Changes the IOS the Title is launched with. - /// - /// - public void ChangeStartupIOS(int newIos) - { - StartupIOS = ((ulong)0x00000001 << 32) | (uint)newIos; - } - - /// - /// Changes the Title Key in the Ticket. - /// The given value will be the encrypted Key (i.e. what you can "read" in the Ticket). - /// - /// - public void ChangeTitleKey(string newTitleKey) - { - tik.SetTitleKey(newTitleKey); - } - - /// - /// Changes the Title Key in the Ticket. - /// The given value will be the encrypted Key (i.e. what you can "read" in the Ticket). - /// - /// - public void ChangeTitleKey(char[] newTitleKey) - { - tik.SetTitleKey(newTitleKey); - } - - /// - /// Changes the Title Key in the Ticket. - /// The given value will be the encrypted Key (i.e. what you can "read" in the Ticket). - /// - /// - public void ChangeTitleKey(byte[] newTitleKey) - { - tik.SetTitleKey(newTitleKey); - } - - /// - /// Returns a content by it's TMD index. - /// - /// - /// - public byte[] GetContentByIndex(int index) - { - for (int i = 0; i < tmd.NumOfContents; i++) - if (tmd.Contents[i].Index == index) - return contents[i]; - - throw new Exception(string.Format("Content with index {0} not found!", index)); - } - - /// - /// Returns a content by it's content ID. - /// - /// - /// - public byte[] GetContentByID(int contentID) - { - for (int i = 0; i < tmd.NumOfContents; i++) - if (tmd.Contents[i].Index == contentID) - return contents[i]; - - throw new Exception(string.Format("Content with content ID {0} not found!", contentID)); - } - - /// - /// Changes the Channel Titles (Only if HasBanner is true). - /// 0: Japanese, - /// 1: English, - /// 2: German, - /// 3: French, - /// 4: Spanish, - /// 5: Italian, - /// 6: Dutch, - /// 7: Korean - /// - /// - public void ChangeChannelTitles(params string[] newTitles) - { - if (hasBanner) - ((Headers.IMET)bannerApp.Header).ChangeTitles(newTitles); - } - - /// - /// Adds a content to the WAD. - /// - /// - /// - /// - /// - public void AddContent(byte[] newContent, int contentID, int index, ContentType type = ContentType.Normal) - { - TMD_Content temp = new TMD_Content(); - temp.ContentID = (uint)contentID; - temp.Index = (ushort)index; - temp.Type = type; - temp.Size = (ulong)newContent.Length; - temp.Hash = sha.ComputeHash(newContent); - - tmd.AddContent(temp); - contents.Add(newContent); - - wadHeader.TmdSize = (uint)(484 + tmd.NumOfContents * 36); - } - - /// - /// Removes a content from the WAD. - /// - /// - public void RemoveContent(int index) - { - for (int i = 0; i < tmd.Contents.Length; i++) - if (tmd.Contents[i].Index == index) - { tmd.RemoveContent(index); contents.RemoveAt(i); wadHeader.TmdSize = (uint)(484 + tmd.NumOfContents * 36); return; } - - throw new Exception(string.Format("Content with index {0} not found!", index)); - } - - /// - /// Removes a content by it's content ID. - /// - /// - public void RemoveContentByID(int contentID) - { - for (int i = 0; i < tmd.Contents.Length; i++) - if (tmd.Contents[i].Index == contentID) - { tmd.RemoveContentByID(contentID); contents.RemoveAt(i); wadHeader.TmdSize = (uint)(484 + tmd.NumOfContents * 36); return; } - - throw new Exception(string.Format("Content with content ID {0} not found!", contentID)); - } - - /// - /// Removes all contents from the WAD. If HasBanner is true, the banner content (Index 0) won't be removed! - /// - public void RemoveAllContents() - { - if (!hasBanner) - { - tmd.Contents = new TMD_Content[0]; - contents = new List(); - - wadHeader.TmdSize = (uint)(484 + tmd.NumOfContents * 36); - } - else - { - for (int i=0;i(); - - tmd.AddContent(tmpTmdCont); - contents.Add(tmpCont); - - wadHeader.TmdSize = (uint)(484 + tmd.NumOfContents * 36); - break; - } - } - } - - /// - /// Unpacks the WAD to the given directory. - /// If nameContentID is true, contents are named after their content ID, else after their index. - /// - /// - /// - public void Unpack(string unpackDir, bool nameContentID = false) - { - unpackAll(unpackDir, nameContentID); - } - - /// - /// Removes the footer. - /// - public void RemoveFooter() - { - this.footer = new byte[0]; - wadHeader.FooterSize = 0; - - this.keepOriginalFooter = true; - } - - /// - /// Adds a footer. - /// - /// - public void AddFooter(byte[] footer) - { - ChangeFooter(footer); - } - - /// - /// Changes the footer. - /// - /// - public void ChangeFooter(byte[] newFooter) - { - if (newFooter.Length % 64 != 0) - Array.Resize(ref newFooter, Shared.AddPadding(newFooter.Length)); - - this.footer = newFooter; - wadHeader.FooterSize = (uint)newFooter.Length; - - this.keepOriginalFooter = true; - } - #endregion - - #region Private Functions - private void writeToStream(Stream writeStream) - { - fireDebug("Writing Wad..."); - - //Create Footer Timestamp - if (!keepOriginalFooter) - { - fireDebug(" Building Footer Timestamp..."); - createFooterTimestamp(); - } - - //Save Banner App - if (hasBanner) - { - //Compress icon.bin and banner.bin - if (lz77CompressBannerAndIcon || lz77DecompressBannerAndIcon) - { - for (int i = 0; i < bannerApp.Nodes.Count; i++) - { - if (bannerApp.StringTable[i].ToLower() == "icon.bin" || - bannerApp.StringTable[i].ToLower() == "banner.bin") - { - if (!Lz77.IsLz77Compressed(bannerApp.Data[i]) && lz77CompressBannerAndIcon) - { - fireDebug(" Compressing {0}...", bannerApp.StringTable[i]); - - //Get the data without the IMD5 Header - byte[] fileData = new byte[bannerApp.Data[i].Length - 32]; - Array.Copy(bannerApp.Data[i], 32, fileData, 0, fileData.Length); - - //Compress the data - Lz77 l = new Lz77(); - fileData = l.Compress(fileData); - - //Add a new IMD5 Header - fileData = Headers.IMD5.AddHeader(fileData); - bannerApp.Data[i] = fileData; - - //Update the node - bannerApp.Nodes[i].SizeOfData = (uint)fileData.Length; - } - else if (Lz77.IsLz77Compressed(bannerApp.Data[i]) && lz77DecompressBannerAndIcon) - { - fireDebug(" Decompressing {0}...", bannerApp.StringTable[i]); - - //Get the data without the IMD5 Header - byte[] fileData = new byte[bannerApp.Data[i].Length - 32]; - Array.Copy(bannerApp.Data[i], 32, fileData, 0, fileData.Length); - - //Decompress the data - Lz77 l = new Lz77(); - fileData = l.Decompress(fileData); - - //Add a new IMD5 Header - fileData = Headers.IMD5.AddHeader(fileData); - bannerApp.Data[i] = fileData; - - //Update the node - bannerApp.Nodes[i].SizeOfData = (uint)fileData.Length; - } - } - } - } - - for (int i = 0; i < contents.Count; i++) - if (tmd.Contents[i].Index == 0x0000) - { fireDebug(" Saving Banner App..."); contents[i] = bannerApp.ToByteArray(); break; } - } - - //Update Header (Content Size) - fireDebug(" Updating Header..."); - int contentSize = 0; - for (int i = 0; i < contents.Count - 1; i++) - contentSize += Shared.AddPadding(contents[i].Length); - - contentSize += contents[contents.Count - 1].Length; - - wadHeader.ContentSize = (uint)contentSize; - wadHeader.TmdSize = (uint)(484 + tmd.NumOfContents * 36); - - //Update Contents - fireDebug(" Updating TMD Contents..."); - tmd.UpdateContents(contents.ToArray()); - - //Write Header - fireDebug(" Writing Wad Header... (Offset: 0x{0})", writeStream.Position.ToString("x8").ToUpper()); - writeStream.Seek(0, SeekOrigin.Begin); - wadHeader.Write(writeStream); - - //Write Cert - fireDebug(" Writing Certificate Chain... (Offset: 0x{0})", writeStream.Position.ToString("x8").ToUpper()); - writeStream.Seek(Shared.AddPadding((int)writeStream.Position), SeekOrigin.Begin); - byte[] temp = cert.ToByteArray(); - writeStream.Write(temp, 0, temp.Length); - - //Write Tik - fireDebug(" Writing Ticket... (Offset: 0x{0})", writeStream.Position.ToString("x8").ToUpper()); - writeStream.Seek(Shared.AddPadding((int)writeStream.Position), SeekOrigin.Begin); - temp = tik.ToByteArray(); - writeStream.Write(temp, 0, temp.Length); - - //Write TMD - fireDebug(" Writing TMD... (Offset: 0x{0})", writeStream.Position.ToString("x8").ToUpper()); - writeStream.Seek(Shared.AddPadding((int)writeStream.Position), SeekOrigin.Begin); - temp = tmd.ToByteArray(); - writeStream.Write(temp, 0, temp.Length); - - //Write Contents - List contentList = new List(); - for (int i = 0; i < tmd.Contents.Length; i++) - contentList.Add(new ContentIndices(i, tmd.Contents[i].Index)); - - contentList.Sort(); - - for (int i = 0; i < contentList.Count; i++) - { - writeStream.Seek(Shared.AddPadding((int)writeStream.Position), SeekOrigin.Begin); - - fireProgress((i + 1) * 100 / contents.Count); - - fireDebug(" Writing Content #{1} of {2}... (Offset: 0x{0})", writeStream.Position.ToString("x8").ToUpper(), i + 1, contents.Count); - fireDebug(" -> Content ID: 0x{0}", tmd.Contents[contentList[i].Index].ContentID.ToString("x8")); - fireDebug(" -> Index: 0x{0}", tmd.Contents[contentList[i].Index].Index.ToString("x4")); - fireDebug(" -> Type: 0x{0} ({1})", ((ushort)tmd.Contents[contentList[i].Index].Type).ToString("x4"), tmd.Contents[contentList[i].Index].Type.ToString()); - fireDebug(" -> Size: {0} bytes", tmd.Contents[contentList[i].Index].Size); - fireDebug(" -> Hash: {0}", Shared.ByteArrayToString(tmd.Contents[contentList[i].Index].Hash)); - - temp = encryptContent(contents[contentList[i].Index], contentList[i].Index); - writeStream.Write(temp, 0, temp.Length); - } - - //Write Footer - if (wadHeader.FooterSize > 0) - { - fireDebug(" Writing Footer... (Offset: 0x{0})", writeStream.Position.ToString("x8").ToUpper()); - writeStream.Seek(Shared.AddPadding((int)writeStream.Position), SeekOrigin.Begin); - writeStream.Write(footer, 0, footer.Length); - } - - //Padding - while (writeStream.Position % 64 != 0) - writeStream.WriteByte(0x00); - - fireDebug("Writing Wad Finished... (Written Bytes: {0})", writeStream.Position); - } - - private void unpackAll(string unpackDir, bool nameContentId) - { - fireDebug("Unpacking Wad to: {0}", unpackDir); - - if (!Directory.Exists(unpackDir)) Directory.CreateDirectory(unpackDir); - string titleID = tik.TitleID.ToString("x16"); - - //Save Cert - fireDebug(" Saving Certificate Chain: {0}.cert", titleID); - cert.Save(unpackDir + Path.DirectorySeparatorChar + titleID + ".cert"); - - //Save Tik - fireDebug(" Saving Ticket: {0}.tik", titleID); - tik.Save(unpackDir + Path.DirectorySeparatorChar + titleID + ".tik"); - - //Save TMD - fireDebug(" Saving TMD: {0}.tmd", titleID); - tmd.Save(unpackDir + Path.DirectorySeparatorChar + titleID + ".tmd"); - - //Save Contents - for (int i = 0; i < tmd.NumOfContents; i++) - { - fireProgress((i + 1) * 100 / tmd.NumOfContents); - - fireDebug(" Saving Content #{0} of {1}: {2}.app", i + 1, tmd.NumOfContents, (nameContentId ? tmd.Contents[i].ContentID.ToString("x8") : tmd.Contents[i].Index.ToString("x8"))); - fireDebug(" -> Content ID: 0x{0}", tmd.Contents[i].ContentID.ToString("x8")); - fireDebug(" -> Index: 0x{0}", tmd.Contents[i].Index.ToString("x4")); - fireDebug(" -> Type: 0x{0} ({1})", ((ushort)tmd.Contents[i].Type).ToString("x4"), tmd.Contents[i].Type.ToString()); - fireDebug(" -> Size: {0} bytes", tmd.Contents[i].Size); - fireDebug(" -> Hash: {0}", Shared.ByteArrayToString(tmd.Contents[i].Hash)); - - using (FileStream fs = new FileStream(unpackDir + Path.DirectorySeparatorChar + - (nameContentId ? tmd.Contents[i].ContentID.ToString("x8") : tmd.Contents[i].Index.ToString("x8")) + ".app", - FileMode.Create)) - fs.Write(contents[i], 0, contents[i].Length); - } - - //Save Footer - fireDebug(" Saving Footer: {0}.footer", titleID); - using (FileStream fs = new FileStream(unpackDir + Path.DirectorySeparatorChar + titleID + ".footer", FileMode.Create)) - fs.Write(footer, 0, footer.Length); - - fireDebug("Unpacking Wad Finished..."); - } - - private void parseWad(Stream wadFile) - { - fireDebug("Parsing Wad..."); - - wadFile.Seek(0, SeekOrigin.Begin); - byte[] temp = new byte[4]; - - wadHeader = new WAD_Header(); - contents = new List(); - - //Read Header - fireDebug(" Parsing Header... (Offset: 0x{0})", wadFile.Position.ToString("x8").ToUpper()); - wadFile.Read(temp, 0, 4); - if (Shared.Swap(BitConverter.ToUInt32(temp, 0)) != wadHeader.HeaderSize) - throw new Exception("Invalid Headersize!"); - - wadFile.Read(temp, 0, 4); - wadHeader.WadType = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - wadFile.Seek(12, SeekOrigin.Current); - - wadFile.Read(temp, 0, 4); - wadHeader.TmdSize = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - wadFile.Read(temp, 0, 4); - wadHeader.ContentSize = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - wadFile.Read(temp, 0, 4); - wadHeader.FooterSize = Shared.Swap(BitConverter.ToUInt32(temp, 0)); - - //Read Cert - fireDebug(" Parsing Certificate Chain... (Offset: 0x{0})", wadFile.Position.ToString("x8").ToUpper()); - wadFile.Seek(Shared.AddPadding((int)wadFile.Position), SeekOrigin.Begin); - - temp = new byte[wadHeader.CertSize]; - wadFile.Read(temp, 0, temp.Length); - cert.LoadFile(temp); - - //Read Tik - fireDebug(" Parsing Ticket... (Offset: 0x{0})", wadFile.Position.ToString("x8").ToUpper()); - wadFile.Seek(Shared.AddPadding((int)wadFile.Position), SeekOrigin.Begin); - - temp = new byte[wadHeader.TicketSize]; - wadFile.Read(temp, 0, temp.Length); - tik.LoadFile(temp); - - //Read Tmd - fireDebug(" Parsing TMD... (Offset: 0x{0})", wadFile.Position.ToString("x8").ToUpper()); - wadFile.Seek(Shared.AddPadding((int)wadFile.Position), SeekOrigin.Begin); - - temp = new byte[wadHeader.TmdSize]; - wadFile.Read(temp, 0, temp.Length); - tmd.LoadFile(temp); - - if (tmd.TitleID != tik.TitleID) - fireWarning("The Title ID in the Ticket doesn't match the one in the TMD!"); - - //Read Content - for (int i = 0; i < tmd.NumOfContents; i++) - { - fireProgress((i + 1) * 100 / tmd.NumOfContents); - - fireDebug(" Reading Content #{0} of {1}... (Offset: 0x{2})", i + 1, tmd.NumOfContents, wadFile.Position.ToString("x8").ToUpper()); - fireDebug(" -> Content ID: 0x{0}", tmd.Contents[i].ContentID.ToString("x8")); - fireDebug(" -> Index: 0x{0}", tmd.Contents[i].Index.ToString("x4")); - fireDebug(" -> Type: 0x{0} ({1})", ((ushort)tmd.Contents[i].Type).ToString("x4"), tmd.Contents[i].Type.ToString()); - fireDebug(" -> Size: {0} bytes", tmd.Contents[i].Size); - fireDebug(" -> Hash: {0}", Shared.ByteArrayToString(tmd.Contents[i].Hash)); - - wadFile.Seek(Shared.AddPadding((int)wadFile.Position), SeekOrigin.Begin); - - temp = new byte[Shared.AddPadding((int)tmd.Contents[i].Size, 16)]; - wadFile.Read(temp, 0, temp.Length); - - //Decrypt Content - temp = decryptContent(temp, i); - Array.Resize(ref temp, (int)tmd.Contents[i].Size); - - byte[] tmdHash = tmd.Contents[i].Hash; - byte[] newHash = sha.ComputeHash(temp, 0, (int)tmd.Contents[i].Size); - - if (!Shared.CompareByteArrays(tmdHash, newHash)) - { - fireDebug(@"/!\ /!\ /!\ Hashes do not match /!\ /!\ /!\"); - fireWarning(string.Format("Content #{0} (Content ID: 0x{1}; Index: 0x{2}): Hashes do not match! The content might be corrupted!", i + 1, tmd.Contents[i].ContentID.ToString("x8"), tmd.Contents[i].Index.ToString("x4"))); - } - - contents.Add(temp); - - if (tmd.Contents[i].Index == 0x0000) - { - try { bannerApp.LoadFile(temp); hasBanner = true; } - catch { hasBanner = false; } //Probably System Wad => No Banner App... - } - } - - //Read Footer - if (wadHeader.FooterSize > 0) - { - fireDebug(" Reading Footer... (Offset: 0x{0})", wadFile.Position.ToString("x8").ToUpper()); - footer = new byte[wadHeader.FooterSize]; - - wadFile.Seek(Shared.AddPadding((int)wadFile.Position), SeekOrigin.Begin); - wadFile.Read(footer, 0, footer.Length); - - parseFooterTimestamp(); - } - - fireDebug("Parsing Wad Finished..."); - } - - private byte[] decryptContent(byte[] content, int contentIndex) - { - int originalLength = content.Length; - Array.Resize(ref content, Shared.AddPadding(content.Length, 16)); - byte[] titleKey = tik.TitleKey; - byte[] iv = new byte[16]; - - byte[] tmp = BitConverter.GetBytes(tmd.Contents[contentIndex].Index); - iv[0] = tmp[1]; - iv[1] = tmp[0]; - - RijndaelManaged rm = new RijndaelManaged(); - rm.Mode = CipherMode.CBC; - rm.Padding = PaddingMode.None; - rm.KeySize = 128; - rm.BlockSize = 128; - rm.Key = titleKey; - rm.IV = iv; - - ICryptoTransform decryptor = rm.CreateDecryptor(); - - MemoryStream ms = new MemoryStream(content); - CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read); - - byte[] decCont = new byte[originalLength]; - cs.Read(decCont, 0, decCont.Length); - - cs.Dispose(); - ms.Dispose(); - - return decCont; - } - - private byte[] encryptContent(byte[] content, int contentIndex) - { - Array.Resize(ref content, Shared.AddPadding(content.Length, 16)); - byte[] titleKey = tik.TitleKey; - byte[] iv = new byte[16]; - - byte[] tmp = BitConverter.GetBytes(tmd.Contents[contentIndex].Index); - iv[0] = tmp[1]; - iv[1] = tmp[0]; - - RijndaelManaged encrypt = new RijndaelManaged(); - encrypt.Mode = CipherMode.CBC; - encrypt.Padding = PaddingMode.None; - encrypt.KeySize = 128; - encrypt.BlockSize = 128; - encrypt.Key = titleKey; - encrypt.IV = iv; - - ICryptoTransform encryptor = encrypt.CreateEncryptor(); - - MemoryStream ms = new MemoryStream(content); - CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Read); - - byte[] encCont = new byte[content.Length]; - cs.Read(encCont, 0, encCont.Length); - - cs.Dispose(); - ms.Dispose(); - - return encCont; - } - - private void createFooterTimestamp() - { - DateTime dtNow = DateTime.UtcNow; - TimeSpan tsTimestamp = (dtNow - new DateTime(1970, 1, 1, 0, 0, 0)); - - int timeStamp = (int)tsTimestamp.TotalSeconds; - System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); - - byte[] timeStampBytes = enc.GetBytes("TmStmp" + timeStamp.ToString()); - Array.Resize(ref timeStampBytes, 64); - - wadHeader.FooterSize = (uint)timeStampBytes.Length; - footer = timeStampBytes; - } - - private void parseFooterTimestamp() - { - creationTimeUTC = new DateTime(1970, 1, 1); - - if ((footer[0] == 'C' && footer[1] == 'M' && footer[2] == 'i' && - footer[3] == 'i' && footer[4] == 'U' && footer[5] == 'T') || - (footer[0] == 'T' && footer[1] == 'm' && footer[2] == 'S' && - footer[3] == 't' && footer[4] == 'm' && footer[5] == 'p')) - { - System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); - string stringSeconds = enc.GetString(footer, 6, 10); - int seconds = 0; - - if (int.TryParse(stringSeconds, out seconds)) - creationTimeUTC = creationTimeUTC.AddSeconds((double)seconds); - } - } - #endregion - - #region Events - /// - /// Fires the Progress of various operations - /// - public event EventHandler Progress; - /// - /// Fires warnings (e.g. when hashes don't match) - /// - public event EventHandler Warning; - /// - /// Fires debugging messages. You may write them into a log file or log textbox. - /// - public event EventHandler Debug; - - private void fireDebug(string debugMessage, params object[] args) - { - EventHandler debug = Debug; - if (debug != null) - debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); - } - - private void fireWarning(string warningMessage) - { - EventHandler warning = Warning; - if (warning != null) - warning(new object(), new MessageEventArgs(warningMessage)); - } - - private void fireProgress(int progressPercentage) - { - EventHandler progress = Progress; - if (progress != null) - progress(new object(), new ProgressChangedEventArgs(progressPercentage, string.Empty)); - } - - private void cert_Debug(object sender, MessageEventArgs e) - { - fireDebug(" Certificate Chain: {0}", e.Message); - } - - private void tik_Debug(object sender, MessageEventArgs e) - { - fireDebug(" Ticket: {0}", e.Message); - } - - private void tmd_Debug(object sender, MessageEventArgs e) - { - fireDebug(" TMD: {0}", e.Message); - } - - void bannerApp_Debug(object sender, MessageEventArgs e) - { - fireDebug(" BannerApp: {0}", e.Message); - } - - void bannerApp_Warning(object sender, MessageEventArgs e) - { - fireWarning(e.Message); - } - #endregion - } - - public class WAD_Header - { - private uint headerSize = 0x20; - private uint wadType = 0x49730000; - private uint certSize = 0xA00; - private uint reserved = 0x00; - private uint tikSize = 0x2A4; - private uint tmdSize; - private uint contentSize; - private uint footerSize = 0x00; - - public uint HeaderSize { get { return headerSize; } } - public uint WadType { get { return wadType; } set { wadType = value; } } - public uint CertSize { get { return certSize; } } - public uint Reserved { get { return reserved; } } - public uint TicketSize { get { return tikSize; } } - public uint TmdSize { get { return tmdSize; } set { tmdSize = value; } } - public uint ContentSize { get { return contentSize; } set { contentSize = value; } } - public uint FooterSize { get { return footerSize; } set { footerSize = value; } } - - public void Write(Stream writeStream) - { - writeStream.Seek(0, SeekOrigin.Begin); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(headerSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(wadType)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(certSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(reserved)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(tikSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(tmdSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(contentSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(footerSize)), 0, 4); - } - } -} diff --git a/NUS Downloader/WaterMarkTextBox.cs b/NUS Downloader/WaterMarkTextBox.cs deleted file mode 100644 index fffa865..0000000 --- a/NUS Downloader/WaterMarkTextBox.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using System.Drawing; - -namespace wmgCMS -{ - class WaterMarkTextBox : TextBox - { - private Font oldFont = null; - private Boolean waterMarkTextEnabled = false; - - #region Attributes - private Color _waterMarkColor = Color.Gray; - public Color WaterMarkColor - { - get { return _waterMarkColor; } - set { _waterMarkColor = value; Invalidate();/*thanks to Bernhard Elbl for Invalidate()*/ } - } - - private string _waterMarkText = "Water Mark"; - public string WaterMarkText - { - get { return _waterMarkText; } - set { _waterMarkText = value; Invalidate(); } - } - #endregion - - //Default constructor - public WaterMarkTextBox() - { - JoinEvents(true); - } - - //Override OnCreateControl ... thanks to "lpgray .. codeproject guy" - protected override void OnCreateControl() - { - base.OnCreateControl(); - //WaterMark_Toggel(null, null); - EnableWaterMark(); - } - - //Override OnPaint - protected override void OnPaint(PaintEventArgs args) - { - // Use the same font that was defined in base class - System.Drawing.Font drawFont = new System.Drawing.Font(Font.FontFamily, Font.Size, Font.Style, Font.Unit); - //Create new brush with gray color or - SolidBrush drawBrush = new SolidBrush(WaterMarkColor);//use Water mark color - //Draw Text or WaterMark - float xpoint = ((float)args.ClipRectangle.Width / 2.0F) - ((float)TextRenderer.MeasureText(WaterMarkText, Font).Width / 2.0F); - ; - PointF centeredtext = new PointF(xpoint, 0.0F); - args.Graphics.DrawString((waterMarkTextEnabled ? WaterMarkText : Text), drawFont, drawBrush, centeredtext); - base.OnPaint(args); - } - - private void JoinEvents(Boolean join) - { - if (join) - { - this.TextChanged += new System.EventHandler(this.WaterMark_Toggel); - this.LostFocus += new System.EventHandler(this.WaterMark_Toggel); - this.GotFocus += new System.EventHandler(this.WaterMark_Toggel); - this.MouseCaptureChanged += new System.EventHandler(this.WaterMark_Toggel); - this.FontChanged += new System.EventHandler(this.WaterMark_FontChanged); - //No one of the above events will start immeddiatlly - //TextBox control still in constructing, so, - //Font object (for example) couldn't be catched from within WaterMark_Toggle - //So, call WaterMark_Toggel through OnCreateControl after TextBox is totally created - //No doupt, it will be only one time call - - //Old solution uses Timer.Tick event to check Create property - } - } - - private void WaterMark_Toggel(object sender, EventArgs args) - { - /*if (this.Text.Length <= 0) - EnableWaterMark(); - else - DisbaleWaterMark(); */ - - /*if (this.Text.Length > 0) - { - System.Diagnostics.Debug.WriteLine(sender.ToString() + " disabled watermark"); - DisbaleWaterMark(); - }*/ - DisbaleWaterMark(); - } - - private void EnableWaterMark() - { - //Save current font until returning the UserPaint style to false (NOTE: It is a try and error advice) - oldFont = new System.Drawing.Font(Font.FontFamily, Font.Size, Font.Style, Font.Unit); - //Enable OnPaint event handler - this.SetStyle(ControlStyles.UserPaint, true); - this.waterMarkTextEnabled = true; - //Triger OnPaint immediatly - Refresh(); - } - - private void DisbaleWaterMark() - { - //Disbale OnPaint event handler - this.waterMarkTextEnabled = false; - this.SetStyle(ControlStyles.UserPaint, false); - //Return back oldFont if existed - if (oldFont != null) - this.Font = new System.Drawing.Font(oldFont.FontFamily, oldFont.Size, oldFont.Style, oldFont.Unit); - } - - private void WaterMark_FontChanged(object sender, EventArgs args) - { - if (waterMarkTextEnabled) - { - oldFont = new System.Drawing.Font(Font.FontFamily, Font.Size, Font.Style, Font.Unit); - Refresh(); - } - } - } -} diff --git a/NUS Downloader/Windows7ProgressBar.cs b/NUS Downloader/Windows7ProgressBar.cs deleted file mode 100644 index 1153831..0000000 --- a/NUS Downloader/Windows7ProgressBar.cs +++ /dev/null @@ -1,242 +0,0 @@ -using System.ComponentModel; -using System.ComponentModel.Design; -using System.Drawing; -using System.Windows.Forms; - -//Windows7ProgressBar v1.0, created by Wyatt O'Day -//Visit: http://wyday.com/windows-7-progress-bar/ - -namespace wyDay.Controls -{ - /// - /// A Windows progress bar control with Windows Vista & 7 functionality. - /// - [ToolboxBitmap(typeof(ProgressBar))] - public class Windows7ProgressBar : ProgressBar - { - bool showInTaskbar; - private ProgressBarState m_State = ProgressBarState.Normal; - ContainerControl ownerForm; - - public Windows7ProgressBar () {} - - public Windows7ProgressBar(ContainerControl parentControl) - { - ContainerControl = parentControl; - } - public ContainerControl ContainerControl - { - get { return ownerForm; } - set - { - ownerForm = value; - - if(!ownerForm.Visible) - ((Form)ownerForm).Shown += Windows7ProgressBar_Shown; - } - } - public override ISite Site - { - set - { - // Runs at design time, ensures designer initializes ContainerControl - base.Site = value; - if (value == null) return; - IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost; - if (service == null) return; - IComponent rootComponent = service.RootComponent; - - ContainerControl = rootComponent as ContainerControl; - } - } - - void Windows7ProgressBar_Shown(object sender, System.EventArgs e) - { - if (ShowInTaskbar) - { - if (Style != ProgressBarStyle.Marquee) - SetValueInTB(); - - SetStateInTB(); - } - - ((Form)ownerForm).Shown -= Windows7ProgressBar_Shown; - } - - - - /// - /// Show progress in taskbar - /// - [DefaultValue(false)] - public bool ShowInTaskbar - { - get - { - return showInTaskbar; - } - set - { - if (showInTaskbar != value) - { - showInTaskbar = value; - - // send signal to the taskbar. - if (ownerForm != null) - { - if (Style != ProgressBarStyle.Marquee) - SetValueInTB(); - - SetStateInTB(); - } - } - } - } - - - /// - /// Gets or sets the current position of the progress bar. - /// - /// The position within the range of the progress bar. The default is 0. - public new int Value - { - get - { - return base.Value; - } - set - { - base.Value = value; - - // send signal to the taskbar. - SetValueInTB(); - } - } - - /// - /// Gets or sets the manner in which progress should be indicated on the progress bar. - /// - /// One of the ProgressBarStyle values. The default is ProgressBarStyle.Blocks - public new ProgressBarStyle Style - { - get - { - return base.Style; - } - set - { - base.Style = value; - - // set the style of the progress bar - if (showInTaskbar && ownerForm != null) - { - SetStateInTB(); - } - } - } - - - /// - /// The progress bar state for Windows Vista & 7 - /// - [DefaultValue(ProgressBarState.Normal)] - public ProgressBarState State - { - get { return m_State; } - set - { - m_State = value; - - bool wasMarquee = Style == ProgressBarStyle.Marquee; - - if(wasMarquee) - // sets the state to normal (and implicity calls SetStateInTB() ) - Style = ProgressBarStyle.Blocks; - - // set the progress bar state (Normal, Error, Paused) - Windows7Taskbar.SendMessage(Handle, 0x410, (int)value, 0); - - - if (wasMarquee) - // the Taskbar PB value needs to be reset - SetValueInTB(); - else - // there wasn't a marquee, thus we need to update the taskbar - SetStateInTB(); - } - } - - /// - /// Advances the current position of the progress bar by the specified amount. - /// - /// The amount by which to increment the progress bar's current position. - public new void Increment(int value) - { - base.Increment(value); - - // send signal to the taskbar. - SetValueInTB(); - } - - /// - /// Advances the current position of the progress bar by the amount of the System.Windows.Forms.ProgressBar.Step property. - /// - public new void PerformStep() - { - base.PerformStep(); - - // send signal to the taskbar. - SetValueInTB(); - } - - private void SetValueInTB() - { - if (showInTaskbar) - { - ulong maximum = (ulong) (Maximum - Minimum); - ulong progress = (ulong) (Value - Minimum); - - Windows7Taskbar.SetProgressValue(ownerForm.Handle, progress, maximum); - } - } - - private void SetStateInTB() - { - if (ownerForm == null) return; - - ThumbnailProgressState thmState = ThumbnailProgressState.Normal; - - if (!showInTaskbar) - thmState = ThumbnailProgressState.NoProgress; - else if (Style == ProgressBarStyle.Marquee) - thmState = ThumbnailProgressState.Indeterminate; - else if (m_State == ProgressBarState.Error) - thmState = ThumbnailProgressState.Error; - else if (m_State == ProgressBarState.Pause) - thmState = ThumbnailProgressState.Paused; - - Windows7Taskbar.SetProgressState(ownerForm.Handle, thmState); - } - } - - /// - /// The progress bar state for Windows Vista & 7 - /// - public enum ProgressBarState - { - /// - /// Indicates normal progress - /// - Normal = 1, - - /// - /// Indicates an error in the progress - /// - Error = 2, - - /// - /// Indicates paused progress - /// - Pause = 3 - } -} \ No newline at end of file diff --git a/NUS Downloader/Windows7Taskbar.cs b/NUS Downloader/Windows7Taskbar.cs deleted file mode 100644 index 4f98787..0000000 --- a/NUS Downloader/Windows7Taskbar.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. - -using System; -using System.Runtime.InteropServices; - -namespace wyDay.Controls -{ - /// - /// The primary coordinator of the Windows 7 taskbar-related activities. - /// - public static class Windows7Taskbar - { - private static ITaskbarList3 _taskbarList; - internal static ITaskbarList3 TaskbarList - { - get - { - if (_taskbarList == null) - { - lock (typeof(Windows7Taskbar)) - { - if (_taskbarList == null) - { - _taskbarList = (ITaskbarList3)new CTaskbarList(); - _taskbarList.HrInit(); - } - } - } - return _taskbarList; - } - } - - static readonly OperatingSystem osInfo = Environment.OSVersion; - - internal static bool Windows7OrGreater - { - get - { - return (osInfo.Version.Major == 6 && osInfo.Version.Minor >= 1) - || (osInfo.Version.Major > 6); - } - } - - /// - /// Sets the progress state of the specified window's - /// taskbar button. - /// - /// The window handle. - /// The progress state. - public static void SetProgressState(IntPtr hwnd, ThumbnailProgressState state) - { - if(Windows7OrGreater) - TaskbarList.SetProgressState(hwnd, state); - } - /// - /// Sets the progress value of the specified window's - /// taskbar button. - /// - /// The window handle. - /// The current value. - /// The maximum value. - public static void SetProgressValue(IntPtr hwnd, ulong current, ulong maximum) - { - if(Windows7OrGreater) - TaskbarList.SetProgressValue(hwnd, current, maximum); - } - - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - internal static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); - } -} \ No newline at end of file diff --git a/NUS Downloader/app.config b/NUS Downloader/app.config deleted file mode 100644 index 8494f72..0000000 --- a/NUS Downloader/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/NUS_Downloader/Database.cs b/NUS_Downloader/Database.cs new file mode 100644 index 0000000..6f5a02c --- /dev/null +++ b/NUS_Downloader/Database.cs @@ -0,0 +1,600 @@ +// Decompiled with JetBrains decompiler +// Type: NUS_Downloader.Database +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using NUS_Downloader.Properties; +using System; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using System.Xml; + +namespace NUS_Downloader +{ + internal class Database + { + private string SystemTag = "SYS"; + private string IosTag = "IOS"; + private string VcTag = "VC"; + private string WwTag = "WW"; + private string UpdateTag = "UPD"; + private string DSiSystemTag = "DSISYSTEM"; + private string DSiWareTag = "DSIWARE"; + private string[] VcConsoles = new string[11] + { + "C64", + "GEN", + "MSX", + "N64", + "NEO", + "NES", + "SMS", + "SNES", + "TG16", + "TGCD", + "ARC" + }; + private string databaseString; + public static Image green = (Image) Resources.bullet_green; + public static Image orange = (Image) Resources.bullet_orange; + public static Image redgreen = (Image) Resources.bullet_redgreen; + public static Image redorange = (Image) Resources.bullet_redorange; + public static Image green_blue = (Image) Resources.bullet_green_blue; + public static Image orange_blue = (Image) Resources.bullet_orange_blue; + public static Image redgreen_blue = (Image) Resources.bullet_redgreen_blue; + public static Image redorange_blue = (Image) Resources.bullet_redorange_blue; + + public void LoadDatabaseToStream(string databaseFile) => this.databaseString = File.Exists(databaseFile) ? File.ReadAllText(databaseFile) : throw new FileNotFoundException("I couldn't find the database file!", "database.xml"); + + public string GetDatabaseVersion() + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + return xmlDocument.GetElementsByTagName("database")[0].Attributes[0].Value; + } + + public static string GetDatabaseVersion(string databaseString) + { + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(databaseString); + return xmlDocument.GetElementsByTagName("database")[0].Attributes[0].Value; + } + + public ToolStripMenuItem[] LoadSystemTitles() + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + XmlNodeList elementsByTagName = xmlDocument.GetElementsByTagName(this.SystemTag); + ToolStripMenuItem[] toolStripMenuItemArray = new ToolStripMenuItem[elementsByTagName.Count]; + for (int i1 = 0; i1 < elementsByTagName.Count; ++i1) + { + ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(); + XmlAttributeCollection attributes = elementsByTagName[i1].Attributes; + string str1 = ""; + string str2 = ""; + bool danger = false; + bool ticket = true; + XmlNodeList childNodes = elementsByTagName[i1].ChildNodes; + for (int i2 = 0; i2 < childNodes.Count; ++i2) + { + switch (childNodes[i2].Name) + { + case "name": + str2 = childNodes[i2].InnerText; + break; + case "titleID": + str1 = childNodes[i2].InnerText; + break; + case "version": + string[] strArray1 = childNodes[i2].InnerText.Split(','); + if (toolStripMenuItem.DropDownItems.Count > 0) + { + for (int index1 = 0; index1 < toolStripMenuItem.DropDownItems.Count; ++index1) + { + if (childNodes[i2].InnerText != "") + { + ToolStripMenuItem dropDownItem = (ToolStripMenuItem) toolStripMenuItem.DropDownItems[index1]; + dropDownItem.DropDownItems.Add("Latest Version"); + for (int index2 = 0; index2 < strArray1.Length; ++index2) + dropDownItem.DropDownItems.Add("v" + strArray1[index2]); + } + } + break; + } + toolStripMenuItem.DropDownItems.Add("Latest Version"); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray1.Length; ++index) + toolStripMenuItem.DropDownItems.Add("v" + strArray1[index]); + break; + } + break; + case "region": + string[] strArray2 = childNodes[i2].InnerText.Split(','); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray2.Length; ++index) + toolStripMenuItem.DropDownItems.Add(this.RegionFromIndex(Convert.ToInt32(strArray2[index]))); + break; + } + break; + case "ticket": + ticket = Convert.ToBoolean(childNodes[i2].InnerText); + break; + case "danger": + danger = true; + toolStripMenuItem.ToolTipText = childNodes[i2].InnerText; + break; + } + toolStripMenuItem.Image = this.SelectItemImage(ticket, danger); + if (str1 != "") + toolStripMenuItem.Text = string.Format("{0} - {1}", (object) str1, (object) str2); + else + toolStripMenuItem.Text = str2; + } + toolStripMenuItemArray[i1] = toolStripMenuItem; + } + return toolStripMenuItemArray; + } + + public ToolStripMenuItem[] LoadIosTitles() + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + XmlNodeList elementsByTagName = xmlDocument.GetElementsByTagName(this.IosTag); + ToolStripMenuItem[] toolStripMenuItemArray = new ToolStripMenuItem[elementsByTagName.Count]; + for (int i1 = 0; i1 < elementsByTagName.Count; ++i1) + { + ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(); + XmlAttributeCollection attributes = elementsByTagName[i1].Attributes; + string str1 = ""; + string str2 = ""; + bool danger = false; + bool ticket = true; + XmlNodeList childNodes = elementsByTagName[i1].ChildNodes; + for (int i2 = 0; i2 < childNodes.Count; ++i2) + { + switch (childNodes[i2].Name) + { + case "name": + str2 = childNodes[i2].InnerText; + break; + case "titleID": + str1 = childNodes[i2].InnerText; + break; + case "version": + string[] strArray = childNodes[i2].InnerText.Split(','); + toolStripMenuItem.DropDownItems.Add("Latest Version"); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray.Length; ++index) + toolStripMenuItem.DropDownItems.Add("v" + strArray[index]); + break; + } + break; + case "ticket": + ticket = Convert.ToBoolean(childNodes[i2].InnerText); + break; + case "danger": + danger = true; + toolStripMenuItem.ToolTipText = childNodes[i2].InnerText; + break; + } + toolStripMenuItem.Image = this.SelectItemImage(ticket, danger); + if (str1 != "") + toolStripMenuItem.Text = string.Format("{0} - {1}", (object) str1, (object) str2); + else + toolStripMenuItem.Text = str2; + } + toolStripMenuItemArray[i1] = toolStripMenuItem; + } + return toolStripMenuItemArray; + } + + public ToolStripMenuItem[][] LoadVirtualConsoleTitles() + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + XmlNodeList elementsByTagName = xmlDocument.GetElementsByTagName(this.VcTag); + ToolStripMenuItem[][] toolStripMenuItemArray = new ToolStripMenuItem[this.VcConsoles.Length][]; + for (int index = 0; index < toolStripMenuItemArray.Length; ++index) + toolStripMenuItemArray[index] = new ToolStripMenuItem[0]; + for (int i1 = 0; i1 < elementsByTagName.Count; ++i1) + { + ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(); + XmlAttributeCollection attributes = elementsByTagName[i1].Attributes; + string str1 = ""; + string str2 = ""; + bool danger = false; + bool ticket = true; + XmlNodeList childNodes = elementsByTagName[i1].ChildNodes; + for (int i2 = 0; i2 < childNodes.Count; ++i2) + { + switch (childNodes[i2].Name) + { + case "name": + str2 = childNodes[i2].InnerText; + break; + case "titleID": + str1 = childNodes[i2].InnerText; + break; + case "version": + string[] strArray1 = childNodes[i2].InnerText.Split(','); + if (toolStripMenuItem.DropDownItems.Count > 0) + { + for (int index1 = 0; index1 < toolStripMenuItem.DropDownItems.Count; ++index1) + { + if (childNodes[i2].InnerText != "") + { + ToolStripMenuItem dropDownItem = (ToolStripMenuItem) toolStripMenuItem.DropDownItems[index1]; + dropDownItem.DropDownItems.Add("Latest Version"); + for (int index2 = 0; index2 < strArray1.Length; ++index2) + dropDownItem.DropDownItems.Add("v" + strArray1[index2]); + } + } + break; + } + toolStripMenuItem.DropDownItems.Add("Latest Version"); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray1.Length; ++index) + toolStripMenuItem.DropDownItems.Add("v" + strArray1[index]); + break; + } + break; + case "region": + string[] strArray2 = childNodes[i2].InnerText.Split(','); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray2.Length; ++index) + toolStripMenuItem.DropDownItems.Add(this.RegionFromIndex(Convert.ToInt32(strArray2[index]))); + break; + } + break; + case "ticket": + ticket = Convert.ToBoolean(childNodes[i2].InnerText); + break; + case "danger": + danger = true; + toolStripMenuItem.ToolTipText = childNodes[i2].InnerText; + break; + } + toolStripMenuItem.Image = this.SelectItemImage(ticket, danger); + if (str1 != "") + toolStripMenuItem.Text = string.Format("{0} - {1}", (object) str1, (object) str2); + else + toolStripMenuItem.Text = str2; + } + for (int index = 0; index < this.VcConsoles.Length; ++index) + { + if (attributes[0].Value == this.VcConsoles[index]) + { + Array.Resize(ref toolStripMenuItemArray[index], toolStripMenuItemArray[index].Length + 1); + toolStripMenuItemArray[index][toolStripMenuItemArray[index].Length - 1] = toolStripMenuItem; + } + } + } + return toolStripMenuItemArray; + } + + public ToolStripMenuItem[] LoadWiiWareTitles() + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + XmlNodeList elementsByTagName = xmlDocument.GetElementsByTagName(this.WwTag); + ToolStripMenuItem[] toolStripMenuItemArray = new ToolStripMenuItem[elementsByTagName.Count]; + for (int i1 = 0; i1 < elementsByTagName.Count; ++i1) + { + ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(); + XmlAttributeCollection attributes = elementsByTagName[i1].Attributes; + string str1 = ""; + string str2 = ""; + bool danger = false; + bool ticket = true; + XmlNodeList childNodes = elementsByTagName[i1].ChildNodes; + for (int i2 = 0; i2 < childNodes.Count; ++i2) + { + switch (childNodes[i2].Name) + { + case "name": + str2 = childNodes[i2].InnerText; + break; + case "titleID": + str1 = childNodes[i2].InnerText; + break; + case "version": + string[] strArray1 = childNodes[i2].InnerText.Split(','); + if (toolStripMenuItem.DropDownItems.Count > 0) + { + for (int index1 = 0; index1 < toolStripMenuItem.DropDownItems.Count; ++index1) + { + if (childNodes[i2].InnerText != "") + { + ToolStripMenuItem dropDownItem = (ToolStripMenuItem) toolStripMenuItem.DropDownItems[index1]; + dropDownItem.DropDownItems.Add("Latest Version"); + for (int index2 = 0; index2 < strArray1.Length; ++index2) + dropDownItem.DropDownItems.Add("v" + strArray1[index2]); + } + } + break; + } + toolStripMenuItem.DropDownItems.Add("Latest Version"); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray1.Length; ++index) + toolStripMenuItem.DropDownItems.Add("v" + strArray1[index]); + break; + } + break; + case "region": + string[] strArray2 = childNodes[i2].InnerText.Split(','); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray2.Length; ++index) + toolStripMenuItem.DropDownItems.Add(this.RegionFromIndex(Convert.ToInt32(strArray2[index]))); + break; + } + break; + case "ticket": + ticket = Convert.ToBoolean(childNodes[i2].InnerText); + break; + case "danger": + danger = true; + toolStripMenuItem.ToolTipText = childNodes[i2].InnerText; + break; + } + toolStripMenuItem.Image = this.SelectItemImage(ticket, danger); + if (str1 != "") + toolStripMenuItem.Text = string.Format("{0} - {1}", (object) str1, (object) str2); + else + toolStripMenuItem.Text = str2; + } + toolStripMenuItemArray[i1] = toolStripMenuItem; + } + return toolStripMenuItemArray; + } + + private string RegionFromIndex(int index) + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + XmlNodeList childNodes = xmlDocument.GetElementsByTagName("REGIONS")[0].ChildNodes; + for (int i = 0; i < childNodes.Count; ++i) + { + if (Convert.ToInt32(childNodes[i].Attributes[0].Value) == index) + return childNodes[i].InnerText; + } + return "XX (Error)"; + } + + private Image SelectItemImage(bool ticket, bool danger) + { + if (ticket && !danger) + return Database.green; + if (!ticket && !danger) + return Database.orange; + if (ticket && danger) + return Database.redgreen; + return !ticket && danger ? Database.redorange : (Image) null; + } + + public ToolStripMenuItem[] LoadRegionCodes() + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + XmlNodeList childNodes = xmlDocument.GetElementsByTagName("REGIONS")[0].ChildNodes; + ToolStripMenuItem[] toolStripMenuItemArray = new ToolStripMenuItem[childNodes.Count]; + for (int i = 0; i < childNodes.Count; ++i) + { + toolStripMenuItemArray[i] = new ToolStripMenuItem(); + toolStripMenuItemArray[i].Text = childNodes[i].InnerText; + } + return toolStripMenuItemArray; + } + + public ToolStripMenuItem[] LoadScripts() + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + XmlNodeList elementsByTagName = xmlDocument.GetElementsByTagName(this.UpdateTag); + ToolStripMenuItem[] toolStripMenuItemArray = new ToolStripMenuItem[elementsByTagName.Count]; + for (int i1 = 0; i1 < elementsByTagName.Count; ++i1) + { + ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(); + XmlAttributeCollection attributes = elementsByTagName[i1].Attributes; + XmlNodeList childNodes = elementsByTagName[i1].ChildNodes; + for (int i2 = 0; i2 < childNodes.Count; ++i2) + { + switch (childNodes[i2].Name) + { + case "name": + toolStripMenuItem.Text = childNodes[i2].InnerText; + break; + case "script": + toolStripMenuItem.ToolTipText = childNodes[i2].InnerText; + break; + } + toolStripMenuItem.Image = (Image) Resources.script_start; + } + toolStripMenuItemArray[i1] = toolStripMenuItem; + } + return toolStripMenuItemArray; + } + + public ToolStripMenuItem[] LoadDSiSystemTitles() + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + XmlNodeList elementsByTagName = xmlDocument.GetElementsByTagName(this.DSiSystemTag); + ToolStripMenuItem[] toolStripMenuItemArray = new ToolStripMenuItem[elementsByTagName.Count]; + for (int i1 = 0; i1 < elementsByTagName.Count; ++i1) + { + ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(); + XmlAttributeCollection attributes = elementsByTagName[i1].Attributes; + string str1 = ""; + string str2 = ""; + bool danger = false; + bool ticket = true; + XmlNodeList childNodes = elementsByTagName[i1].ChildNodes; + for (int i2 = 0; i2 < childNodes.Count; ++i2) + { + switch (childNodes[i2].Name) + { + case "name": + str2 = childNodes[i2].InnerText; + break; + case "titleID": + str1 = childNodes[i2].InnerText; + break; + case "version": + string[] strArray1 = childNodes[i2].InnerText.Split(','); + if (toolStripMenuItem.DropDownItems.Count > 0) + { + for (int index1 = 0; index1 < toolStripMenuItem.DropDownItems.Count; ++index1) + { + if (childNodes[i2].InnerText != "") + { + ToolStripMenuItem dropDownItem = (ToolStripMenuItem) toolStripMenuItem.DropDownItems[index1]; + dropDownItem.DropDownItems.Add("Latest Version"); + for (int index2 = 0; index2 < strArray1.Length; ++index2) + dropDownItem.DropDownItems.Add("v" + strArray1[index2]); + } + } + break; + } + toolStripMenuItem.DropDownItems.Add("Latest Version"); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray1.Length; ++index) + toolStripMenuItem.DropDownItems.Add("v" + strArray1[index]); + break; + } + break; + case "region": + string[] strArray2 = childNodes[i2].InnerText.Split(','); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray2.Length; ++index) + toolStripMenuItem.DropDownItems.Add(this.RegionFromIndex(Convert.ToInt32(strArray2[index]))); + break; + } + break; + case "ticket": + ticket = Convert.ToBoolean(childNodes[i2].InnerText); + break; + case "danger": + danger = true; + toolStripMenuItem.ToolTipText = childNodes[i2].InnerText; + break; + } + toolStripMenuItem.Image = this.SelectItemImage(ticket, danger); + if (str1 != "") + toolStripMenuItem.Text = string.Format("{0} - {1}", (object) str1, (object) str2); + else + toolStripMenuItem.Text = str2; + } + toolStripMenuItemArray[i1] = toolStripMenuItem; + } + return toolStripMenuItemArray; + } + + public ToolStripMenuItem[] LoadDsiWareTitles() + { + if (this.databaseString.Length < 1) + throw new Exception("Load the database into a memory stream first!"); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(this.databaseString); + XmlNodeList elementsByTagName = xmlDocument.GetElementsByTagName(this.DSiWareTag); + ToolStripMenuItem[] toolStripMenuItemArray = new ToolStripMenuItem[elementsByTagName.Count]; + for (int i1 = 0; i1 < elementsByTagName.Count; ++i1) + { + ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(); + XmlAttributeCollection attributes = elementsByTagName[i1].Attributes; + string str1 = ""; + string str2 = ""; + bool danger = false; + bool ticket = true; + XmlNodeList childNodes = elementsByTagName[i1].ChildNodes; + for (int i2 = 0; i2 < childNodes.Count; ++i2) + { + switch (childNodes[i2].Name) + { + case "name": + str2 = childNodes[i2].InnerText; + break; + case "titleID": + str1 = childNodes[i2].InnerText; + break; + case "version": + string[] strArray1 = childNodes[i2].InnerText.Split(','); + if (toolStripMenuItem.DropDownItems.Count > 0) + { + for (int index1 = 0; index1 < toolStripMenuItem.DropDownItems.Count; ++index1) + { + if (childNodes[i2].InnerText != "") + { + ToolStripMenuItem dropDownItem = (ToolStripMenuItem) toolStripMenuItem.DropDownItems[index1]; + dropDownItem.DropDownItems.Add("Latest Version"); + for (int index2 = 0; index2 < strArray1.Length; ++index2) + dropDownItem.DropDownItems.Add("v" + strArray1[index2]); + } + } + break; + } + toolStripMenuItem.DropDownItems.Add("Latest Version"); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray1.Length; ++index) + toolStripMenuItem.DropDownItems.Add("v" + strArray1[index]); + break; + } + break; + case "region": + string[] strArray2 = childNodes[i2].InnerText.Split(','); + if (childNodes[i2].InnerText != "") + { + for (int index = 0; index < strArray2.Length; ++index) + toolStripMenuItem.DropDownItems.Add(this.RegionFromIndex(Convert.ToInt32(strArray2[index]))); + break; + } + break; + case "ticket": + ticket = Convert.ToBoolean(childNodes[i2].InnerText); + break; + case "danger": + danger = true; + toolStripMenuItem.ToolTipText = childNodes[i2].InnerText; + break; + } + toolStripMenuItem.Image = this.SelectItemImage(ticket, danger); + if (str1 != "") + toolStripMenuItem.Text = string.Format("{0} - {1}", (object) str1, (object) str2); + else + toolStripMenuItem.Text = str2; + } + toolStripMenuItemArray[i1] = toolStripMenuItem; + } + return toolStripMenuItemArray; + } + } +} diff --git a/NUS_Downloader/Form1.cs b/NUS_Downloader/Form1.cs new file mode 100644 index 0000000..a6b74c2 --- /dev/null +++ b/NUS_Downloader/Form1.cs @@ -0,0 +1,2923 @@ +// Decompiled with JetBrains decompiler +// Type: NUS_Downloader.Form1 +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using libWiiSharp; +using NUS_Downloader.Properties; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Windows.Forms; +using System.Windows.Forms.Layout; +using System.Xml; +using wmgCMS; +using wyDay.Controls; + +namespace NUS_Downloader +{ + internal class Form1 : Form + { + private const string _chars = "abcdefghijklmnopqrstuvwxyz"; + private IContainer components; + private Button Extrasbtn; + private Button downloadstartbtn; + private RichTextBox statusbox; + private CheckBox packbox; + private CheckBox localuse; + private BackgroundWorker NUSDownloader; + private Label label1; + private TextBox wadnamebox; + private CheckBox decryptbox; + private Button databaseButton; + private ContextMenuStrip databaseStrip; + private ToolStripMenuItem SystemMenuList; + private ToolStripMenuItem IOSMenuList; + private ToolStripMenuItem VCMenuList; + private ToolStripMenuItem WiiWareMenuList; + private ToolStripMenuItem C64MenuList; + private ToolStripMenuItem NeoGeoMenuList; + private ToolStripMenuItem NESMenuList; + private ToolStripMenuItem SNESMenuList; + private ToolStripMenuItem N64MenuList; + private ToolStripMenuItem MSXMenuList; + private ToolStripMenuItem TurboGrafx16MenuList; + private ToolStripMenuItem SegaMSMenuList; + private ToolStripMenuItem GenesisMenuList; + private ToolStripMenuItem VCArcadeMenuList; + private ToolStripMenuItem TurboGrafxCDMenuList; + private ToolStripSeparator toolStripSeparator1; + private ToolStripMenuItem RegionCodesList; + private Button clearButton; + private ContextMenuStrip extrasStrip; + private ToolStripMenuItem loadInfoFromTMDToolStripMenuItem; + private ToolStripSeparator toolStripSeparator3; + private ToolStripMenuItem proxySettingsToolStripMenuItem; + private GroupBox proxyBox; + private TextBox ProxyUser; + private Button SaveProxyBtn; + private Button ProxyAssistBtn; + private TextBox ProxyURL; + private Label label13; + private Label label12; + private GroupBox ProxyVerifyBox; + private Button SaveProxyPwdBtn; + private Label label14; + private TextBox ProxyPwdBox; + private Windows7ProgressBar dlprogress; + private ToolStripSeparator toolStripSeparator6; + private WaterMarkTextBox titleidbox; + private WaterMarkTextBox titleversion; + private Button scriptsbutton; + private ContextMenuStrip scriptsStrip; + private ToolStripMenuItem loadNUSScriptToolStripMenuItem; + private ToolStripMenuItem emulateUpdate; + private ToolStripMenuItem uSANTSCToolStripMenuItem; + private ToolStripMenuItem europePALToolStripMenuItem; + private ToolStripMenuItem japanNTSCJToolStripMenuItem; + private ToolStripMenuItem koreaToolStripMenuItem; + private ToolStripSeparator toolStripSeparator4; + private ToolStripMenuItem updateDatabaseToolStripMenuItem; + private ToolStripMenuItem scriptsLocalMenuEntry; + private ToolStripSeparator toolStripSeparator2; + private ToolStripMenuItem scriptsDatabaseToolStripMenuItem; + private ToolStripMenuItem aboutNUSDToolStripMenuItem; + private CheckBox checkBox1; + private Button SaveProxyPwdPermanentBtn; + private CheckBox keepenccontents; + private Button saveaswadbtn; + private CheckBox iosPatchCheckbox; + private GroupBox iosPatchGroupBox; + private CheckedListBox iosPatchesListBox; + private Button iosPatchGroupBoxOKbtn; + private Label label2; + private Panel richPanel; + private ToolStripMenuItem systemFakeMenuItem; + private ToolStripMenuItem iosFakeMenuItem; + private ToolStripMenuItem vcFakeMenuItem; + private ToolStripMenuItem wwFakeMenuItem; + private ToolStripMenuItem openNUSDDirectoryToolStripMenuItem; + private ToolStripMenuItem moreExtrasToolStripMenuItem; + private ToolStripMenuItem runFolderFixToolStripMenuItem; + private ToolStripMenuItem wiiBrewToolStripMenuItem; + private ToolStripMenuItem mainPageToolStripMenuItem; + private ToolStripMenuItem databasePageToolStripMenuItem; + private ToolStripMenuItem removeNUSDFilesFoldersToolStripMenuItem; + private ToolStripMenuItem databaseToolStripMenuItem; + private ToolStripMenuItem localTicketInventoryToolStripMenuItem; + private ToolStripMenuItem donateToolStripMenuItem; + private ToolStripSeparator toolStripSeparator5; + private ToolStripMenuItem dsiSystemToolStripMenu; + private ToolStripMenuItem dsiFakeSystemToolStripMenu; + private ToolStripMenuItem dSiWareToolStripMenu; + private ToolStripMenuItem dSiWareFakeToolStripMenu; + private ToolStripMenuItem wiiRegionCodesMenu; + private ToolStripMenuItem dsiRegionCodesMenu; + private Label serverLbl; + private ToolStripSeparator toolStripSeparator7; + private CheckBox pathbox; + private readonly string CURRENT_DIR = Directory.GetCurrentDirectory(); + private string version = "v1.9 mod"; + private string WAD_Saveas_Filename; + private string proxy_url; + private string proxy_usr; + private string proxy_pwd; + private BackgroundWorker databaseWorker; + private BackgroundWorker dsiDatabaseWorker; + private BackgroundWorker scriptsWorker; + private Color normalcolor = Color.FromName("Black"); + private Color warningcolor = Color.FromName("DarkGoldenrod"); + private Color errorcolor = Color.FromName("Crimson"); + private Color infocolor = Color.FromName("RoyalBlue"); + private bool[] disabledStorage = new bool[14]; + private readonly Random _rng = new Random(); + + protected override void Dispose(bool disposing) + { + if (disposing && this.components != null) + this.components.Dispose(); + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.components = (IContainer) new Container(); + ComponentResourceManager componentResourceManager = new ComponentResourceManager(typeof (Form1)); + this.Extrasbtn = new Button(); + this.downloadstartbtn = new Button(); + this.statusbox = new RichTextBox(); + this.NUSDownloader = new BackgroundWorker(); + this.label1 = new Label(); + this.wadnamebox = new TextBox(); + this.databaseStrip = new ContextMenuStrip(this.components); + this.SystemMenuList = new ToolStripMenuItem(); + this.systemFakeMenuItem = new ToolStripMenuItem(); + this.IOSMenuList = new ToolStripMenuItem(); + this.iosFakeMenuItem = new ToolStripMenuItem(); + this.VCMenuList = new ToolStripMenuItem(); + this.C64MenuList = new ToolStripMenuItem(); + this.GenesisMenuList = new ToolStripMenuItem(); + this.MSXMenuList = new ToolStripMenuItem(); + this.N64MenuList = new ToolStripMenuItem(); + this.NeoGeoMenuList = new ToolStripMenuItem(); + this.NESMenuList = new ToolStripMenuItem(); + this.SegaMSMenuList = new ToolStripMenuItem(); + this.SNESMenuList = new ToolStripMenuItem(); + this.TurboGrafx16MenuList = new ToolStripMenuItem(); + this.TurboGrafxCDMenuList = new ToolStripMenuItem(); + this.VCArcadeMenuList = new ToolStripMenuItem(); + this.vcFakeMenuItem = new ToolStripMenuItem(); + this.WiiWareMenuList = new ToolStripMenuItem(); + this.wwFakeMenuItem = new ToolStripMenuItem(); + this.toolStripSeparator5 = new ToolStripSeparator(); + this.dsiSystemToolStripMenu = new ToolStripMenuItem(); + this.dsiFakeSystemToolStripMenu = new ToolStripMenuItem(); + this.dSiWareToolStripMenu = new ToolStripMenuItem(); + this.dSiWareFakeToolStripMenu = new ToolStripMenuItem(); + this.toolStripSeparator1 = new ToolStripSeparator(); + this.RegionCodesList = new ToolStripMenuItem(); + this.wiiRegionCodesMenu = new ToolStripMenuItem(); + this.dsiRegionCodesMenu = new ToolStripMenuItem(); + this.toolStripSeparator4 = new ToolStripSeparator(); + this.updateDatabaseToolStripMenuItem = new ToolStripMenuItem(); + this.extrasStrip = new ContextMenuStrip(this.components); + this.loadInfoFromTMDToolStripMenuItem = new ToolStripMenuItem(); + this.toolStripSeparator3 = new ToolStripSeparator(); + this.proxySettingsToolStripMenuItem = new ToolStripMenuItem(); + this.toolStripSeparator6 = new ToolStripSeparator(); + this.openNUSDDirectoryToolStripMenuItem = new ToolStripMenuItem(); + this.moreExtrasToolStripMenuItem = new ToolStripMenuItem(); + this.runFolderFixToolStripMenuItem = new ToolStripMenuItem(); + this.wiiBrewToolStripMenuItem = new ToolStripMenuItem(); + this.mainPageToolStripMenuItem = new ToolStripMenuItem(); + this.databasePageToolStripMenuItem = new ToolStripMenuItem(); + this.removeNUSDFilesFoldersToolStripMenuItem = new ToolStripMenuItem(); + this.databaseToolStripMenuItem = new ToolStripMenuItem(); + this.localTicketInventoryToolStripMenuItem = new ToolStripMenuItem(); + this.donateToolStripMenuItem = new ToolStripMenuItem(); + this.toolStripSeparator7 = new ToolStripSeparator(); + this.aboutNUSDToolStripMenuItem = new ToolStripMenuItem(); + this.proxyBox = new GroupBox(); + this.label13 = new Label(); + this.label12 = new Label(); + this.ProxyUser = new TextBox(); + this.SaveProxyBtn = new Button(); + this.ProxyAssistBtn = new Button(); + this.ProxyURL = new TextBox(); + this.ProxyVerifyBox = new GroupBox(); + this.SaveProxyPwdPermanentBtn = new Button(); + this.checkBox1 = new CheckBox(); + this.SaveProxyPwdBtn = new Button(); + this.label14 = new Label(); + this.ProxyPwdBox = new TextBox(); + this.scriptsbutton = new Button(); + this.scriptsStrip = new ContextMenuStrip(this.components); + this.scriptsLocalMenuEntry = new ToolStripMenuItem(); + this.scriptsDatabaseToolStripMenuItem = new ToolStripMenuItem(); + this.loadNUSScriptToolStripMenuItem = new ToolStripMenuItem(); + this.toolStripSeparator2 = new ToolStripSeparator(); + this.emulateUpdate = new ToolStripMenuItem(); + this.uSANTSCToolStripMenuItem = new ToolStripMenuItem(); + this.europePALToolStripMenuItem = new ToolStripMenuItem(); + this.japanNTSCJToolStripMenuItem = new ToolStripMenuItem(); + this.koreaToolStripMenuItem = new ToolStripMenuItem(); + this.iosPatchGroupBox = new GroupBox(); + this.label2 = new Label(); + this.iosPatchesListBox = new CheckedListBox(); + this.iosPatchGroupBoxOKbtn = new Button(); + this.richPanel = new Panel(); + this.databaseButton = new Button(); + this.saveaswadbtn = new Button(); + this.iosPatchCheckbox = new CheckBox(); + this.keepenccontents = new CheckBox(); + this.clearButton = new Button(); + this.packbox = new CheckBox(); + this.decryptbox = new CheckBox(); + this.localuse = new CheckBox(); + this.serverLbl = new Label(); + this.titleidbox = new WaterMarkTextBox(); + this.dlprogress = new Windows7ProgressBar(); + this.titleversion = new WaterMarkTextBox(); + this.pathbox = new CheckBox(); + this.databaseStrip.SuspendLayout(); + this.extrasStrip.SuspendLayout(); + this.proxyBox.SuspendLayout(); + this.ProxyVerifyBox.SuspendLayout(); + this.scriptsStrip.SuspendLayout(); + this.iosPatchGroupBox.SuspendLayout(); + this.richPanel.SuspendLayout(); + this.SuspendLayout(); + this.Extrasbtn.FlatStyle = FlatStyle.Popup; + this.Extrasbtn.Location = new Point(194, 5); + this.Extrasbtn.Name = "Extrasbtn"; + this.Extrasbtn.Size = new Size(68, 27); + this.Extrasbtn.TabIndex = 2; + this.Extrasbtn.Text = "Extras..."; + this.Extrasbtn.UseVisualStyleBackColor = true; + this.Extrasbtn.Click += new EventHandler(this.extrasMenuButton_Click); + this.downloadstartbtn.FlatStyle = FlatStyle.Popup; + this.downloadstartbtn.Location = new Point(12, 64); + this.downloadstartbtn.Name = "downloadstartbtn"; + this.downloadstartbtn.Size = new Size(250, 25); + this.downloadstartbtn.TabIndex = 5; + this.downloadstartbtn.Text = "Start NUS Download!"; + this.downloadstartbtn.UseVisualStyleBackColor = true; + this.downloadstartbtn.Click += new EventHandler(this.DownloadBtn_Click); + this.statusbox.BackColor = SystemColors.ControlLightLight; + this.statusbox.BorderStyle = BorderStyle.FixedSingle; + this.statusbox.Location = new Point(-2, -2); + this.statusbox.Name = "statusbox"; + this.statusbox.ReadOnly = true; + this.statusbox.ScrollBars = RichTextBoxScrollBars.None; + this.statusbox.Size = new Size(252, 269); + this.statusbox.TabIndex = 0; + this.statusbox.Text = ""; + this.NUSDownloader.DoWork += new DoWorkEventHandler(this.NUSDownloader_DoWork); + this.NUSDownloader.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.NUSDownloader_RunWorkerCompleted); + this.label1.AutoSize = true; + this.label1.BackColor = Color.Transparent; + this.label1.Location = new Point(159, 45); + this.label1.Name = "label1"; + this.label1.Size = new Size(13, 13); + this.label1.TabIndex = 0; + this.label1.Text = "v"; + this.wadnamebox.BorderStyle = BorderStyle.FixedSingle; + this.wadnamebox.Enabled = false; + this.wadnamebox.Location = new Point(102, 390); + this.wadnamebox.MaxLength = 99999; + this.wadnamebox.Name = "wadnamebox"; + this.wadnamebox.Size = new Size(161, 20); + this.wadnamebox.TabIndex = 17; + this.databaseStrip.Font = new Font("Tahoma", 8.25f, FontStyle.Regular, GraphicsUnit.Point, (byte) 0); + this.databaseStrip.Items.AddRange(new ToolStripItem[17] + { + (ToolStripItem) this.SystemMenuList, + (ToolStripItem) this.systemFakeMenuItem, + (ToolStripItem) this.IOSMenuList, + (ToolStripItem) this.iosFakeMenuItem, + (ToolStripItem) this.VCMenuList, + (ToolStripItem) this.vcFakeMenuItem, + (ToolStripItem) this.WiiWareMenuList, + (ToolStripItem) this.wwFakeMenuItem, + (ToolStripItem) this.toolStripSeparator5, + (ToolStripItem) this.dsiSystemToolStripMenu, + (ToolStripItem) this.dsiFakeSystemToolStripMenu, + (ToolStripItem) this.dSiWareToolStripMenu, + (ToolStripItem) this.dSiWareFakeToolStripMenu, + (ToolStripItem) this.toolStripSeparator1, + (ToolStripItem) this.RegionCodesList, + (ToolStripItem) this.toolStripSeparator4, + (ToolStripItem) this.updateDatabaseToolStripMenuItem + }); + this.databaseStrip.Name = "databaseStrip"; + this.databaseStrip.ShowItemToolTips = false; + this.databaseStrip.Size = new Size(164, 330); + this.databaseStrip.Text = "Hidden"; + this.databaseStrip.Closed += new ToolStripDropDownClosedEventHandler(this.anyStrip_Closed); + this.SystemMenuList.AutoSize = false; + this.SystemMenuList.Image = (Image) componentResourceManager.GetObject("SystemMenuList.Image"); + this.SystemMenuList.Name = "SystemMenuList"; + this.SystemMenuList.Size = new Size(158, 22); + this.SystemMenuList.Text = "System"; + this.systemFakeMenuItem.Image = (Image) Resources.arrow_ticker; + this.systemFakeMenuItem.Name = "systemFakeMenuItem"; + this.systemFakeMenuItem.Size = new Size(163, 22); + this.systemFakeMenuItem.Text = "System"; + this.systemFakeMenuItem.Visible = false; + this.IOSMenuList.Image = (Image) componentResourceManager.GetObject("IOSMenuList.Image"); + this.IOSMenuList.Name = "IOSMenuList"; + this.IOSMenuList.Size = new Size(163, 22); + this.IOSMenuList.Text = "IOS"; + this.iosFakeMenuItem.Image = (Image) Resources.arrow_ticker; + this.iosFakeMenuItem.Name = "iosFakeMenuItem"; + this.iosFakeMenuItem.Size = new Size(163, 22); + this.iosFakeMenuItem.Text = "IOS"; + this.iosFakeMenuItem.Visible = false; + this.VCMenuList.DropDownItems.AddRange(new ToolStripItem[11] + { + (ToolStripItem) this.C64MenuList, + (ToolStripItem) this.GenesisMenuList, + (ToolStripItem) this.MSXMenuList, + (ToolStripItem) this.N64MenuList, + (ToolStripItem) this.NeoGeoMenuList, + (ToolStripItem) this.NESMenuList, + (ToolStripItem) this.SegaMSMenuList, + (ToolStripItem) this.SNESMenuList, + (ToolStripItem) this.TurboGrafx16MenuList, + (ToolStripItem) this.TurboGrafxCDMenuList, + (ToolStripItem) this.VCArcadeMenuList + }); + this.VCMenuList.Image = (Image) componentResourceManager.GetObject("VCMenuList.Image"); + this.VCMenuList.Name = "VCMenuList"; + this.VCMenuList.Size = new Size(163, 22); + this.VCMenuList.Text = "Virtual Console"; + this.C64MenuList.Name = "C64MenuList"; + this.C64MenuList.Size = new Size(182, 22); + this.C64MenuList.Text = "Commodore 64"; + this.GenesisMenuList.Name = "GenesisMenuList"; + this.GenesisMenuList.Size = new Size(182, 22); + this.GenesisMenuList.Text = "Mega Drive/Genesis"; + this.MSXMenuList.Name = "MSXMenuList"; + this.MSXMenuList.Size = new Size(182, 22); + this.MSXMenuList.Text = "MSX"; + this.N64MenuList.Name = "N64MenuList"; + this.N64MenuList.Size = new Size(182, 22); + this.N64MenuList.Text = "Nintendo 64"; + this.NeoGeoMenuList.Name = "NeoGeoMenuList"; + this.NeoGeoMenuList.Size = new Size(182, 22); + this.NeoGeoMenuList.Text = "NeoGeo"; + this.NESMenuList.Name = "NESMenuList"; + this.NESMenuList.Size = new Size(182, 22); + this.NESMenuList.Text = "NES"; + this.SegaMSMenuList.Name = "SegaMSMenuList"; + this.SegaMSMenuList.Size = new Size(182, 22); + this.SegaMSMenuList.Text = "Sega Master System"; + this.SNESMenuList.Name = "SNESMenuList"; + this.SNESMenuList.Size = new Size(182, 22); + this.SNESMenuList.Text = "SNES"; + this.TurboGrafx16MenuList.Name = "TurboGrafx16MenuList"; + this.TurboGrafx16MenuList.Size = new Size(182, 22); + this.TurboGrafx16MenuList.Text = "TruboGrafx-16"; + this.TurboGrafxCDMenuList.Name = "TurboGrafxCDMenuList"; + this.TurboGrafxCDMenuList.Size = new Size(182, 22); + this.TurboGrafxCDMenuList.Text = "TurboGrafx-CD"; + this.VCArcadeMenuList.Name = "VCArcadeMenuList"; + this.VCArcadeMenuList.Size = new Size(182, 22); + this.VCArcadeMenuList.Text = "Virtual Console Arcade"; + this.vcFakeMenuItem.Image = (Image) Resources.arrow_ticker; + this.vcFakeMenuItem.Name = "vcFakeMenuItem"; + this.vcFakeMenuItem.Size = new Size(163, 22); + this.vcFakeMenuItem.Text = "Virtual Console"; + this.vcFakeMenuItem.Visible = false; + this.WiiWareMenuList.Image = (Image) componentResourceManager.GetObject("WiiWareMenuList.Image"); + this.WiiWareMenuList.Name = "WiiWareMenuList"; + this.WiiWareMenuList.Size = new Size(163, 22); + this.WiiWareMenuList.Text = "WiiWare"; + this.wwFakeMenuItem.Image = (Image) Resources.arrow_ticker; + this.wwFakeMenuItem.Name = "wwFakeMenuItem"; + this.wwFakeMenuItem.Size = new Size(163, 22); + this.wwFakeMenuItem.Text = "WiiWare"; + this.wwFakeMenuItem.Visible = false; + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new Size(160, 6); + this.dsiSystemToolStripMenu.Image = (Image) Resources.dsi16x16; + this.dsiSystemToolStripMenu.Name = "dsiSystemToolStripMenu"; + this.dsiSystemToolStripMenu.Size = new Size(163, 22); + this.dsiSystemToolStripMenu.Text = "System"; + this.dsiFakeSystemToolStripMenu.Image = (Image) Resources.arrow_ticker; + this.dsiFakeSystemToolStripMenu.Name = "dsiFakeSystemToolStripMenu"; + this.dsiFakeSystemToolStripMenu.Size = new Size(163, 22); + this.dsiFakeSystemToolStripMenu.Text = "System"; + this.dsiFakeSystemToolStripMenu.Visible = false; + this.dSiWareToolStripMenu.Image = (Image) Resources.dsi16x16; + this.dSiWareToolStripMenu.Name = "dSiWareToolStripMenu"; + this.dSiWareToolStripMenu.Size = new Size(163, 22); + this.dSiWareToolStripMenu.Text = "DSiWare"; + this.dSiWareFakeToolStripMenu.Image = (Image) Resources.arrow_ticker; + this.dSiWareFakeToolStripMenu.Name = "dSiWareFakeToolStripMenu"; + this.dSiWareFakeToolStripMenu.Size = new Size(163, 22); + this.dSiWareFakeToolStripMenu.Text = "DSiWare"; + this.dSiWareFakeToolStripMenu.Visible = false; + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new Size(160, 6); + this.RegionCodesList.DropDownItems.AddRange(new ToolStripItem[2] + { + (ToolStripItem) this.wiiRegionCodesMenu, + (ToolStripItem) this.dsiRegionCodesMenu + }); + this.RegionCodesList.Name = "RegionCodesList"; + this.RegionCodesList.Size = new Size(163, 22); + this.RegionCodesList.Text = "Region Codes"; + this.wiiRegionCodesMenu.Name = "wiiRegionCodesMenu"; + this.wiiRegionCodesMenu.Size = new Size(89, 22); + this.wiiRegionCodesMenu.Text = "Wii"; + this.wiiRegionCodesMenu.DropDownItemClicked += new ToolStripItemClickedEventHandler(this.wiiRegionCodesMenu_DropDownItemClicked); + this.dsiRegionCodesMenu.Name = "dsiRegionCodesMenu"; + this.dsiRegionCodesMenu.Size = new Size(89, 22); + this.dsiRegionCodesMenu.Text = "DSi"; + this.dsiRegionCodesMenu.DropDownItemClicked += new ToolStripItemClickedEventHandler(this.dsiRegionCodesMenu_DropDownItemClicked); + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new Size(160, 6); + this.updateDatabaseToolStripMenuItem.Image = (Image) Resources.database_save; + this.updateDatabaseToolStripMenuItem.Name = "updateDatabaseToolStripMenuItem"; + this.updateDatabaseToolStripMenuItem.Size = new Size(163, 22); + this.updateDatabaseToolStripMenuItem.Text = "Update Databases"; + this.updateDatabaseToolStripMenuItem.Click += new EventHandler(this.updateDatabaseToolStripMenuItem_Click); + this.extrasStrip.AllowMerge = false; + this.extrasStrip.Font = new Font("Tahoma", 8.25f, FontStyle.Regular, GraphicsUnit.Point, (byte) 0); + this.extrasStrip.Items.AddRange(new ToolStripItem[9] + { + (ToolStripItem) this.loadInfoFromTMDToolStripMenuItem, + (ToolStripItem) this.toolStripSeparator3, + (ToolStripItem) this.proxySettingsToolStripMenuItem, + (ToolStripItem) this.toolStripSeparator6, + (ToolStripItem) this.openNUSDDirectoryToolStripMenuItem, + (ToolStripItem) this.moreExtrasToolStripMenuItem, + (ToolStripItem) this.donateToolStripMenuItem, + (ToolStripItem) this.toolStripSeparator7, + (ToolStripItem) this.aboutNUSDToolStripMenuItem + }); + this.extrasStrip.Name = "extrasStrip"; + this.extrasStrip.Size = new Size(178, 154); + this.extrasStrip.Text = "Hidden"; + this.extrasStrip.Closed += new ToolStripDropDownClosedEventHandler(this.anyStrip_Closed); + this.extrasStrip.Opening += new CancelEventHandler(this.extrasStrip_Opening); + this.loadInfoFromTMDToolStripMenuItem.Image = (Image) Resources.page_white_magnify; + this.loadInfoFromTMDToolStripMenuItem.Name = "loadInfoFromTMDToolStripMenuItem"; + this.loadInfoFromTMDToolStripMenuItem.Size = new Size(177, 22); + this.loadInfoFromTMDToolStripMenuItem.Text = "Load Info from TMD"; + this.loadInfoFromTMDToolStripMenuItem.Click += new EventHandler(this.loadInfoFromTMDToolStripMenuItem_Click); + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new Size(174, 6); + this.proxySettingsToolStripMenuItem.Image = (Image) Resources.server_link; + this.proxySettingsToolStripMenuItem.Name = "proxySettingsToolStripMenuItem"; + this.proxySettingsToolStripMenuItem.Size = new Size(177, 22); + this.proxySettingsToolStripMenuItem.Text = "Proxy Settings"; + this.proxySettingsToolStripMenuItem.Click += new EventHandler(this.proxySettingsToolStripMenuItem_Click); + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new Size(174, 6); + this.openNUSDDirectoryToolStripMenuItem.Image = (Image) Resources.folder; + this.openNUSDDirectoryToolStripMenuItem.Name = "openNUSDDirectoryToolStripMenuItem"; + this.openNUSDDirectoryToolStripMenuItem.Size = new Size(177, 22); + this.openNUSDDirectoryToolStripMenuItem.Text = "Open NUSD Directory"; + this.openNUSDDirectoryToolStripMenuItem.Click += new EventHandler(this.openNUSDDirectoryToolStripMenuItem_Click); + this.moreExtrasToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[4] + { + (ToolStripItem) this.runFolderFixToolStripMenuItem, + (ToolStripItem) this.wiiBrewToolStripMenuItem, + (ToolStripItem) this.removeNUSDFilesFoldersToolStripMenuItem, + (ToolStripItem) this.databaseToolStripMenuItem + }); + this.moreExtrasToolStripMenuItem.Image = (Image) Resources.wrench; + this.moreExtrasToolStripMenuItem.Name = "moreExtrasToolStripMenuItem"; + this.moreExtrasToolStripMenuItem.Size = new Size(177, 22); + this.moreExtrasToolStripMenuItem.Text = "More Extras..."; + this.moreExtrasToolStripMenuItem.Visible = false; + this.runFolderFixToolStripMenuItem.Name = "runFolderFixToolStripMenuItem"; + this.runFolderFixToolStripMenuItem.Size = new Size(206, 22); + this.runFolderFixToolStripMenuItem.Text = "Run 'FolderFix'"; + this.runFolderFixToolStripMenuItem.Click += new EventHandler(this.runFolderFixToolStripMenuItem_Click); + this.wiiBrewToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[2] + { + (ToolStripItem) this.mainPageToolStripMenuItem, + (ToolStripItem) this.databasePageToolStripMenuItem + }); + this.wiiBrewToolStripMenuItem.Name = "wiiBrewToolStripMenuItem"; + this.wiiBrewToolStripMenuItem.Size = new Size(206, 22); + this.wiiBrewToolStripMenuItem.Text = "WiiBrew"; + this.mainPageToolStripMenuItem.Name = "mainPageToolStripMenuItem"; + this.mainPageToolStripMenuItem.Size = new Size(147, 22); + this.mainPageToolStripMenuItem.Text = "Main Page"; + this.mainPageToolStripMenuItem.Click += new EventHandler(this.mainPageToolStripMenuItem_Click); + this.databasePageToolStripMenuItem.Name = "databasePageToolStripMenuItem"; + this.databasePageToolStripMenuItem.Size = new Size(147, 22); + this.databasePageToolStripMenuItem.Text = "Database Page"; + this.databasePageToolStripMenuItem.Click += new EventHandler(this.databasePageToolStripMenuItem_Click); + this.removeNUSDFilesFoldersToolStripMenuItem.Name = "removeNUSDFilesFoldersToolStripMenuItem"; + this.removeNUSDFilesFoldersToolStripMenuItem.Size = new Size(206, 22); + this.removeNUSDFilesFoldersToolStripMenuItem.Text = "Remove NUSD Files\\Folders"; + this.removeNUSDFilesFoldersToolStripMenuItem.Click += new EventHandler(this.removeNUSDFilesFoldersToolStripMenuItem_Click); + this.databaseToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[1] + { + (ToolStripItem) this.localTicketInventoryToolStripMenuItem + }); + this.databaseToolStripMenuItem.Name = "databaseToolStripMenuItem"; + this.databaseToolStripMenuItem.Size = new Size(206, 22); + this.databaseToolStripMenuItem.Text = "Database"; + this.localTicketInventoryToolStripMenuItem.Name = "localTicketInventoryToolStripMenuItem"; + this.localTicketInventoryToolStripMenuItem.Size = new Size(180, 22); + this.localTicketInventoryToolStripMenuItem.Text = "Local Ticket Inventory"; + this.localTicketInventoryToolStripMenuItem.Click += new EventHandler(this.localTicketInventoryToolStripMenuItem_Click); + this.donateToolStripMenuItem.Image = (Image) Resources.money; + this.donateToolStripMenuItem.Name = "donateToolStripMenuItem"; + this.donateToolStripMenuItem.Size = new Size(177, 22); + this.donateToolStripMenuItem.Text = "Donate!"; + this.donateToolStripMenuItem.Visible = false; + this.donateToolStripMenuItem.Click += new EventHandler(this.donateToolStripMenuItem_Click); + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new Size(174, 6); + this.aboutNUSDToolStripMenuItem.Image = (Image) Resources.information; + this.aboutNUSDToolStripMenuItem.Name = "aboutNUSDToolStripMenuItem"; + this.aboutNUSDToolStripMenuItem.Size = new Size(177, 22); + this.aboutNUSDToolStripMenuItem.Text = "About NUSD"; + this.aboutNUSDToolStripMenuItem.Click += new EventHandler(this.aboutNUSDToolStripMenuItem_Click); + this.proxyBox.BackColor = Color.White; + this.proxyBox.Controls.Add((Control) this.label13); + this.proxyBox.Controls.Add((Control) this.label12); + this.proxyBox.Controls.Add((Control) this.ProxyUser); + this.proxyBox.Controls.Add((Control) this.SaveProxyBtn); + this.proxyBox.Controls.Add((Control) this.ProxyAssistBtn); + this.proxyBox.Controls.Add((Control) this.ProxyURL); + this.proxyBox.Location = new Point(31, 250); + this.proxyBox.Name = "proxyBox"; + this.proxyBox.Size = new Size(212, 114); + this.proxyBox.TabIndex = 45; + this.proxyBox.TabStop = false; + this.proxyBox.Text = "Proxy Settings"; + this.proxyBox.Visible = false; + this.label13.AutoSize = true; + this.label13.Location = new Point(6, 55); + this.label13.Name = "label13"; + this.label13.Size = new Size(32, 13); + this.label13.TabIndex = 32; + this.label13.Text = "User:"; + this.label12.AutoSize = true; + this.label12.Location = new Point(6, 29); + this.label12.Name = "label12"; + this.label12.Size = new Size(36, 13); + this.label12.TabIndex = 31; + this.label12.Text = "Proxy:"; + this.ProxyUser.BorderStyle = BorderStyle.FixedSingle; + this.ProxyUser.Location = new Point(55, 53); + this.ProxyUser.Name = "ProxyUser"; + this.ProxyUser.Size = new Size(151, 20); + this.ProxyUser.TabIndex = 30; + this.SaveProxyBtn.FlatStyle = FlatStyle.Popup; + this.SaveProxyBtn.Location = new Point(6, 79); + this.SaveProxyBtn.Name = "SaveProxyBtn"; + this.SaveProxyBtn.Size = new Size(161, 26); + this.SaveProxyBtn.TabIndex = 29; + this.SaveProxyBtn.Text = "Save Proxy Settings"; + this.SaveProxyBtn.UseVisualStyleBackColor = true; + this.SaveProxyBtn.Click += new EventHandler(this.SaveProxyBtn_Click); + this.ProxyAssistBtn.FlatStyle = FlatStyle.Popup; + this.ProxyAssistBtn.Image = (Image) Resources.help; + this.ProxyAssistBtn.Location = new Point(177, 79); + this.ProxyAssistBtn.Name = "ProxyAssistBtn"; + this.ProxyAssistBtn.Size = new Size(29, 26); + this.ProxyAssistBtn.TabIndex = 28; + this.ProxyAssistBtn.UseVisualStyleBackColor = true; + this.ProxyAssistBtn.Click += new EventHandler(this.ProxyAssistBtn_Click); + this.ProxyURL.BorderStyle = BorderStyle.FixedSingle; + this.ProxyURL.Location = new Point(55, 27); + this.ProxyURL.Name = "ProxyURL"; + this.ProxyURL.Size = new Size(151, 20); + this.ProxyURL.TabIndex = 0; + this.ProxyVerifyBox.BackColor = SystemColors.Control; + this.ProxyVerifyBox.Controls.Add((Control) this.SaveProxyPwdPermanentBtn); + this.ProxyVerifyBox.Controls.Add((Control) this.checkBox1); + this.ProxyVerifyBox.Controls.Add((Control) this.SaveProxyPwdBtn); + this.ProxyVerifyBox.Controls.Add((Control) this.label14); + this.ProxyVerifyBox.Controls.Add((Control) this.ProxyPwdBox); + this.ProxyVerifyBox.Location = new Point(31, 222); + this.ProxyVerifyBox.Name = "ProxyVerifyBox"; + this.ProxyVerifyBox.Size = new Size(212, 133); + this.ProxyVerifyBox.TabIndex = 46; + this.ProxyVerifyBox.TabStop = false; + this.ProxyVerifyBox.Text = "Verify Credentials"; + this.ProxyVerifyBox.Visible = false; + this.SaveProxyPwdPermanentBtn.Enabled = false; + this.SaveProxyPwdPermanentBtn.FlatStyle = FlatStyle.Popup; + this.SaveProxyPwdPermanentBtn.Location = new Point(9, 104); + this.SaveProxyPwdPermanentBtn.Name = "SaveProxyPwdPermanentBtn"; + this.SaveProxyPwdPermanentBtn.Size = new Size(197, 23); + this.SaveProxyPwdPermanentBtn.TabIndex = 36; + this.SaveProxyPwdPermanentBtn.Text = "Save (To File)"; + this.SaveProxyPwdPermanentBtn.UseVisualStyleBackColor = true; + this.SaveProxyPwdPermanentBtn.Click += new EventHandler(this.SaveProxyPwdPermanentBtn_Click); + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new Point(9, 72); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new Size(199, 30); + this.checkBox1.TabIndex = 35; + this.checkBox1.Text = "I understand that NUSD stores proxy\r\npasswords in plain text."; + this.checkBox1.UseVisualStyleBackColor = true; + this.checkBox1.CheckedChanged += new EventHandler(this.checkBox1_CheckedChanged); + this.SaveProxyPwdBtn.FlatStyle = FlatStyle.Popup; + this.SaveProxyPwdBtn.Location = new Point(9, 43); + this.SaveProxyPwdBtn.Name = "SaveProxyPwdBtn"; + this.SaveProxyPwdBtn.Size = new Size(197, 23); + this.SaveProxyPwdBtn.TabIndex = 34; + this.SaveProxyPwdBtn.Text = "Save (This Session Only)"; + this.SaveProxyPwdBtn.UseVisualStyleBackColor = true; + this.SaveProxyPwdBtn.Click += new EventHandler(this.SaveProxyPwdButton_Click); + this.label14.AutoSize = true; + this.label14.Location = new Point(6, 21); + this.label14.Name = "label14"; + this.label14.Size = new Size(62, 13); + this.label14.TabIndex = 33; + this.label14.Text = "Proxy Pass:"; + this.ProxyPwdBox.BorderStyle = BorderStyle.FixedSingle; + this.ProxyPwdBox.Location = new Point(71, 19); + this.ProxyPwdBox.Name = "ProxyPwdBox"; + this.ProxyPwdBox.Size = new Size(135, 20); + this.ProxyPwdBox.TabIndex = 32; + this.ProxyPwdBox.UseSystemPasswordChar = true; + this.ProxyPwdBox.KeyPress += new KeyPressEventHandler(this.ProxyPwdBox_KeyPress); + this.scriptsbutton.FlatStyle = FlatStyle.Popup; + this.scriptsbutton.Location = new Point(103, 5); + this.scriptsbutton.Name = "scriptsbutton"; + this.scriptsbutton.Size = new Size(85, 27); + this.scriptsbutton.TabIndex = 1; + this.scriptsbutton.Text = "Scripts..."; + this.scriptsbutton.UseVisualStyleBackColor = true; + this.scriptsbutton.Click += new EventHandler(this.scriptsbutton_Click); + this.scriptsStrip.Font = new Font("Tahoma", 8.25f, FontStyle.Regular, GraphicsUnit.Point, (byte) 0); + this.scriptsStrip.Items.AddRange(new ToolStripItem[5] + { + (ToolStripItem) this.scriptsLocalMenuEntry, + (ToolStripItem) this.scriptsDatabaseToolStripMenuItem, + (ToolStripItem) this.loadNUSScriptToolStripMenuItem, + (ToolStripItem) this.toolStripSeparator2, + (ToolStripItem) this.emulateUpdate + }); + this.scriptsStrip.Name = "scriptsStrip"; + this.scriptsStrip.ShowItemToolTips = false; + this.scriptsStrip.Size = new Size(206, 98); + this.scriptsStrip.Text = "Hidden"; + this.scriptsStrip.Closed += new ToolStripDropDownClosedEventHandler(this.anyStrip_Closed); + this.scriptsLocalMenuEntry.Enabled = false; + this.scriptsLocalMenuEntry.Image = (Image) Resources.script_code; + this.scriptsLocalMenuEntry.Name = "scriptsLocalMenuEntry"; + this.scriptsLocalMenuEntry.Overflow = ToolStripItemOverflow.AsNeeded; + this.scriptsLocalMenuEntry.Size = new Size(205, 22); + this.scriptsLocalMenuEntry.Text = "Scripts (Local)"; + this.scriptsDatabaseToolStripMenuItem.Enabled = false; + this.scriptsDatabaseToolStripMenuItem.Image = (Image) Resources.script_code_red; + this.scriptsDatabaseToolStripMenuItem.Name = "scriptsDatabaseToolStripMenuItem"; + this.scriptsDatabaseToolStripMenuItem.Size = new Size(205, 22); + this.scriptsDatabaseToolStripMenuItem.Text = "Scripts (Database)"; + this.loadNUSScriptToolStripMenuItem.Image = (Image) Resources.script_go; + this.loadNUSScriptToolStripMenuItem.Name = "loadNUSScriptToolStripMenuItem"; + this.loadNUSScriptToolStripMenuItem.Size = new Size(205, 22); + this.loadNUSScriptToolStripMenuItem.Text = "Load NUS Script"; + this.loadNUSScriptToolStripMenuItem.Click += new EventHandler(this.loadNUSScriptToolStripMenuItem_Click); + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new Size(202, 6); + this.emulateUpdate.DropDownItems.AddRange(new ToolStripItem[4] + { + (ToolStripItem) this.uSANTSCToolStripMenuItem, + (ToolStripItem) this.europePALToolStripMenuItem, + (ToolStripItem) this.japanNTSCJToolStripMenuItem, + (ToolStripItem) this.koreaToolStripMenuItem + }); + this.emulateUpdate.Image = (Image) Resources.server_connect; + this.emulateUpdate.Name = "emulateUpdate"; + this.emulateUpdate.Size = new Size(205, 22); + this.emulateUpdate.Text = "Emulate Wii System Update"; + this.emulateUpdate.DropDownItemClicked += new ToolStripItemClickedEventHandler(this.emulateUpdate_DropDownItemClicked); + this.uSANTSCToolStripMenuItem.Name = "uSANTSCToolStripMenuItem"; + this.uSANTSCToolStripMenuItem.Size = new Size(114, 22); + this.uSANTSCToolStripMenuItem.Text = "USA"; + this.europePALToolStripMenuItem.Name = "europePALToolStripMenuItem"; + this.europePALToolStripMenuItem.Size = new Size(114, 22); + this.europePALToolStripMenuItem.Text = "EUROPE"; + this.japanNTSCJToolStripMenuItem.Name = "japanNTSCJToolStripMenuItem"; + this.japanNTSCJToolStripMenuItem.Size = new Size(114, 22); + this.japanNTSCJToolStripMenuItem.Text = "JAPAN"; + this.koreaToolStripMenuItem.Name = "koreaToolStripMenuItem"; + this.koreaToolStripMenuItem.Size = new Size(114, 22); + this.koreaToolStripMenuItem.Text = "KOREA"; + this.iosPatchGroupBox.Controls.Add((Control) this.label2); + this.iosPatchGroupBox.Controls.Add((Control) this.iosPatchesListBox); + this.iosPatchGroupBox.Controls.Add((Control) this.iosPatchGroupBoxOKbtn); + this.iosPatchGroupBox.Location = new Point(31, 187); + this.iosPatchGroupBox.Name = "iosPatchGroupBox"; + this.iosPatchGroupBox.Size = new Size(212, 115); + this.iosPatchGroupBox.TabIndex = 55; + this.iosPatchGroupBox.TabStop = false; + this.iosPatchGroupBox.Text = "IOS Patches"; + this.iosPatchGroupBox.Visible = false; + this.label2.AutoSize = true; + this.label2.Location = new Point(9, 16); + this.label2.Name = "label2"; + this.label2.Size = new Size(184, 26); + this.label2.TabIndex = 2; + this.label2.Text = "Patch the following bugs into any IOS\r\nI download:"; + this.iosPatchesListBox.BackColor = SystemColors.Menu; + this.iosPatchesListBox.BorderStyle = BorderStyle.None; + this.iosPatchesListBox.CheckOnClick = true; + this.iosPatchesListBox.FormattingEnabled = true; + this.iosPatchesListBox.Items.AddRange(new object[3] + { + (object) "Trucha bug", + (object) "ES_Identify", + (object) "NAND permissions" + }); + this.iosPatchesListBox.Location = new Point(6, 62); + this.iosPatchesListBox.Name = "iosPatchesListBox"; + this.iosPatchesListBox.Size = new Size(115, 45); + this.iosPatchesListBox.TabIndex = 1; + this.iosPatchGroupBoxOKbtn.FlatStyle = FlatStyle.Popup; + this.iosPatchGroupBoxOKbtn.Location = new Point((int) sbyte.MaxValue, 84); + this.iosPatchGroupBoxOKbtn.Name = "iosPatchGroupBoxOKbtn"; + this.iosPatchGroupBoxOKbtn.Size = new Size(75, 23); + this.iosPatchGroupBoxOKbtn.TabIndex = 0; + this.iosPatchGroupBoxOKbtn.Text = "OK"; + this.iosPatchGroupBoxOKbtn.UseVisualStyleBackColor = true; + this.iosPatchGroupBoxOKbtn.Click += new EventHandler(this.iosPatchGroupBoxOKbtn_Click); + this.richPanel.BorderStyle = BorderStyle.FixedSingle; + this.richPanel.Controls.Add((Control) this.statusbox); + this.richPanel.Location = new Point(12, 116); + this.richPanel.Name = "richPanel"; + this.richPanel.Size = new Size(250, 268); + this.richPanel.TabIndex = 56; + this.databaseButton.FlatStyle = FlatStyle.Popup; + this.databaseButton.Location = new Point(12, 5); + this.databaseButton.Name = "databaseButton"; + this.databaseButton.Size = new Size(85, 27); + this.databaseButton.TabIndex = 0; + this.databaseButton.Text = "Database..."; + this.databaseButton.TextImageRelation = TextImageRelation.ImageBeforeText; + this.databaseButton.UseVisualStyleBackColor = true; + this.databaseButton.Click += new EventHandler(this.DatabaseButton_Click); + this.saveaswadbtn.Anchor = AnchorStyles.Top | AnchorStyles.Right; + this.saveaswadbtn.AutoSize = true; + this.saveaswadbtn.AutoSizeMode = AutoSizeMode.GrowAndShrink; + this.saveaswadbtn.BackColor = Color.Transparent; + this.saveaswadbtn.Enabled = false; + this.saveaswadbtn.FlatStyle = FlatStyle.Flat; + this.saveaswadbtn.Image = (Image) Resources.disk; + this.saveaswadbtn.Location = new Point(239, 409); + this.saveaswadbtn.MaximumSize = new Size(0, 24); + this.saveaswadbtn.MinimumSize = new Size(0, 24); + this.saveaswadbtn.Name = "saveaswadbtn"; + this.saveaswadbtn.Size = new Size(24, 24); + this.saveaswadbtn.TabIndex = 11; + this.saveaswadbtn.TextAlign = ContentAlignment.MiddleLeft; + this.saveaswadbtn.TextImageRelation = TextImageRelation.ImageBeforeText; + this.saveaswadbtn.UseVisualStyleBackColor = false; + this.saveaswadbtn.Click += new EventHandler(this.saveaswadbtn_Click); + this.saveaswadbtn.MouseEnter += new EventHandler(this.saveaswadbtn_MouseEnter); + this.saveaswadbtn.MouseLeave += new EventHandler(this.saveaswadbtn_MouseLeave); + this.iosPatchCheckbox.Enabled = false; + this.iosPatchCheckbox.Image = (Image) Resources.bug_add; + this.iosPatchCheckbox.ImageAlign = ContentAlignment.MiddleLeft; + this.iosPatchCheckbox.Location = new Point(11, 480); + this.iosPatchCheckbox.Name = "iosPatchCheckbox"; + this.iosPatchCheckbox.Size = new Size(104, 22); + this.iosPatchCheckbox.TabIndex = 10; + this.iosPatchCheckbox.Text = "Patch IOS..."; + this.iosPatchCheckbox.TextImageRelation = TextImageRelation.ImageBeforeText; + this.iosPatchCheckbox.UseVisualStyleBackColor = true; + this.iosPatchCheckbox.CheckedChanged += new EventHandler(this.iosPatchCheckbox_CheckedChanged); + this.keepenccontents.Checked = true; + this.keepenccontents.CheckState = CheckState.Checked; + this.keepenccontents.Image = (Image) Resources.package; + this.keepenccontents.ImageAlign = ContentAlignment.MiddleLeft; + this.keepenccontents.Location = new Point(10, 414); + this.keepenccontents.Name = "keepenccontents"; + this.keepenccontents.Size = new Size(177, 22); + this.keepenccontents.TabIndex = 8; + this.keepenccontents.Text = "Keep Encrypted Contents"; + this.keepenccontents.TextImageRelation = TextImageRelation.ImageBeforeText; + this.keepenccontents.UseVisualStyleBackColor = true; + this.clearButton.Anchor = AnchorStyles.Top | AnchorStyles.Right; + this.clearButton.AutoSize = true; + this.clearButton.AutoSizeMode = AutoSizeMode.GrowAndShrink; + this.clearButton.BackColor = Color.Transparent; + this.clearButton.FlatStyle = FlatStyle.Flat; + this.clearButton.Image = (Image) Resources.bin_closed; + this.clearButton.ImageAlign = ContentAlignment.MiddleRight; + this.clearButton.Location = new Point(238, 360); + this.clearButton.MaximumSize = new Size(0, 24); + this.clearButton.MinimumSize = new Size(0, 24); + this.clearButton.Name = "clearButton"; + this.clearButton.Size = new Size(24, 24); + this.clearButton.TabIndex = 12; + this.clearButton.TextAlign = ContentAlignment.MiddleRight; + this.clearButton.TextImageRelation = TextImageRelation.ImageBeforeText; + this.clearButton.UseVisualStyleBackColor = false; + this.clearButton.Click += new EventHandler(this.ClearStatusbox); + this.clearButton.MouseEnter += new EventHandler(this.clearButton_MouseEnter); + this.clearButton.MouseLeave += new EventHandler(this.clearButton_MouseLeave); + this.packbox.Image = (Image) Resources.box; + this.packbox.ImageAlign = ContentAlignment.MiddleLeft; + this.packbox.Location = new Point(10, 392); + this.packbox.Name = "packbox"; + this.packbox.Size = new Size(98, 22); + this.packbox.TabIndex = 7; + this.packbox.Text = "Pack WAD"; + this.packbox.TextImageRelation = TextImageRelation.ImageBeforeText; + this.packbox.UseVisualStyleBackColor = true; + this.packbox.CheckedChanged += new EventHandler(this.packbox_CheckedChanged); + this.packbox.EnabledChanged += new EventHandler(this.packbox_EnabledChanged); + this.decryptbox.Image = (Image) Resources.package_green; + this.decryptbox.ImageAlign = ContentAlignment.MiddleLeft; + this.decryptbox.Location = new Point(11, 436); + this.decryptbox.Name = "decryptbox"; + this.decryptbox.Size = new Size(231, 22); + this.decryptbox.TabIndex = 9; + this.decryptbox.Text = "Create Decrypted Contents (*.app)"; + this.decryptbox.TextImageRelation = TextImageRelation.ImageBeforeText; + this.decryptbox.UseVisualStyleBackColor = true; + this.localuse.Checked = true; + this.localuse.CheckState = CheckState.Checked; + this.localuse.Image = (Image) Resources.drive_disk; + this.localuse.ImageAlign = ContentAlignment.MiddleLeft; + this.localuse.Location = new Point(11, 458); + this.localuse.MinimumSize = new Size(0, 22); + this.localuse.Name = "localuse"; + this.localuse.Size = new Size(162, 22); + this.localuse.TabIndex = 12; + this.localuse.Text = "Use Local Files If Present"; + this.localuse.TextImageRelation = TextImageRelation.ImageBeforeText; + this.localuse.UseVisualStyleBackColor = true; + this.serverLbl.BorderStyle = BorderStyle.FixedSingle; + this.serverLbl.Location = new Point(233, 38); + this.serverLbl.Name = "serverLbl"; + this.serverLbl.Size = new Size(29, 20); + this.serverLbl.TabIndex = 57; + this.serverLbl.Text = "Wii"; + this.serverLbl.TextAlign = ContentAlignment.MiddleCenter; + this.serverLbl.TextChanged += new EventHandler(this.serverLbl_TextChanged); + this.serverLbl.Click += new EventHandler(this.serverLbl_Click); + this.serverLbl.MouseEnter += new EventHandler(this.serverLbl_MouseEnter); + this.serverLbl.MouseLeave += new EventHandler(this.serverLbl_MouseLeave); + this.titleidbox.Font = new Font("Tahoma", 8.25f); + this.titleidbox.Location = new Point(12, 38); + this.titleidbox.MaxLength = 16; + this.titleidbox.Name = "titleidbox"; + this.titleidbox.Size = new Size(141, 21); + this.titleidbox.TabIndex = 3; + this.titleidbox.TextAlign = HorizontalAlignment.Center; + this.titleidbox.WaterMarkColor = Color.Silver; + this.titleidbox.WaterMarkText = "Title ID"; + this.titleidbox.TextChanged += new EventHandler(this.titleidbox_TextChanged); + this.dlprogress.ContainerControl = (ContainerControl) this; + this.dlprogress.Location = new Point(12, 95); + this.dlprogress.Name = "dlprogress"; + this.dlprogress.Size = new Size(250, 15); + this.dlprogress.TabIndex = 47; + this.titleversion.Font = new Font("Tahoma", 8.25f); + this.titleversion.Location = new Point(169, 38); + this.titleversion.MaxLength = 8; + this.titleversion.Name = "titleversion"; + this.titleversion.Size = new Size(58, 21); + this.titleversion.TabIndex = 4; + this.titleversion.TextAlign = HorizontalAlignment.Center; + this.titleversion.WaterMarkColor = Color.Silver; + this.titleversion.WaterMarkText = "Version"; + this.titleversion.TextChanged += new EventHandler(this.titleversion_TextChanged); + this.pathbox.Location = new Point(11, 502); + this.pathbox.Name = "pathbox"; + this.pathbox.Size = new Size(161, 22); + this.pathbox.TabIndex = 58; + this.pathbox.Text = "Directory of NUSD v1.5"; + this.pathbox.UseVisualStyleBackColor = true; + this.AutoScaleMode = AutoScaleMode.None; + this.ClientSize = new Size(274, 527); + this.Controls.Add((Control) this.pathbox); + this.Controls.Add((Control) this.serverLbl); + this.Controls.Add((Control) this.iosPatchGroupBox); + this.Controls.Add((Control) this.ProxyVerifyBox); + this.Controls.Add((Control) this.proxyBox); + this.Controls.Add((Control) this.scriptsbutton); + this.Controls.Add((Control) this.titleidbox); + this.Controls.Add((Control) this.dlprogress); + this.Controls.Add((Control) this.titleversion); + this.Controls.Add((Control) this.databaseButton); + this.Controls.Add((Control) this.iosPatchCheckbox); + this.Controls.Add((Control) this.downloadstartbtn); + this.Controls.Add((Control) this.clearButton); + this.Controls.Add((Control) this.keepenccontents); + this.Controls.Add((Control) this.label1); + this.Controls.Add((Control) this.Extrasbtn); + this.Controls.Add((Control) this.wadnamebox); + this.Controls.Add((Control) this.richPanel); + this.Controls.Add((Control) this.decryptbox); + this.Controls.Add((Control) this.packbox); + this.Controls.Add((Control) this.saveaswadbtn); + this.Controls.Add((Control) this.localuse); + this.FormBorderStyle = FormBorderStyle.FixedSingle; + this.Icon = (Icon) componentResourceManager.GetObject("$this.Icon"); + this.MaximizeBox = false; + this.Name = nameof (Form1); + this.Text = " "; + this.FormClosing += new FormClosingEventHandler(this.Form1_FormClosing); + this.Load += new EventHandler(this.Form1_Load); + this.MouseWheel += new MouseEventHandler(this.Form1_MouseWheel); + this.databaseStrip.ResumeLayout(false); + this.extrasStrip.ResumeLayout(false); + this.proxyBox.ResumeLayout(false); + this.proxyBox.PerformLayout(); + this.ProxyVerifyBox.ResumeLayout(false); + this.ProxyVerifyBox.PerformLayout(); + this.scriptsStrip.ResumeLayout(false); + this.iosPatchGroupBox.ResumeLayout(false); + this.iosPatchGroupBox.PerformLayout(); + this.richPanel.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + } + + public Form1() + { + this.InitializeComponent(); + this.GUISetup(); + this.BootChecks(); + } + + public Form1(string[] args) + { + this.InitializeComponent(); + this.GUISetup(); + if (args.Length == 1 && System.IO.File.Exists(args[0])) + { + this.BootChecks(); + string str1 = System.IO.File.ReadAllText(args[0]); + FileInfo fileInfo = new FileInfo(args[0]); + string str2 = str1 + string.Format(";{0}", (object) fileInfo.Name.Replace("." + fileInfo.Extension, "")); + BackgroundWorker backgroundWorker = new BackgroundWorker(); + backgroundWorker.DoWork += new DoWorkEventHandler(this.RunScriptBg); + backgroundWorker.RunWorkerAsync((object) str2); + } + else if (args.Length >= 2) + { + this.RunCommandMode(args); + Environment.Exit(0); + } + else + this.BootChecks(); + } + + private void RunCommandMode(string[] args) + { + this.packbox.Checked = false; + this.localuse.Checked = true; + this.decryptbox.Checked = false; + this.keepenccontents.Checked = false; + this.iosPatchCheckbox.Checked = false; + this.iosPatchesListBox.SetItemChecked(0, false); + this.iosPatchesListBox.SetItemChecked(1, false); + this.iosPatchesListBox.SetItemChecked(2, false); + Console.WriteLine("NUS Downloader - v{0}", (object) this.version); + if (args.Length < 2) + { + Console.WriteLine("Usage:"); + Console.WriteLine(" nusd [optionalArgs]"); + Console.WriteLine("\nWhere:"); + Console.WriteLine(" titleID = The ID of the title to be downloaded"); + Console.WriteLine(" titleVersion = The version of the title to be downloaded"); + Console.WriteLine(" Use \"*\" (no quotes) to get the latest version"); + Console.WriteLine(" OptionalArgs:"); + Console.WriteLine(" packwad = A wad file will be generated"); + Console.WriteLine(" localuse = Use local contents if available"); + Console.WriteLine(" decrypt = Create decrypted contents"); + Console.WriteLine(" keepencrypt = Keep encrypted contents"); + } + else + { + for (int index = 0; index < args.Length; ++index) + { + Console.WriteLine("{0}", (object) args[index]); + switch (index) + { + case 0: + this.titleidbox.Text = args[index]; + break; + case 1: + if (args[index] == "*") + { + this.titleversion.Text = ""; + break; + } + this.titleversion.Text = args[index]; + break; + default: + if (args[index] == "packwad") + { + this.packbox.Checked = true; + break; + } + if (args[index] == "localuse") + { + this.localuse.Checked = true; + break; + } + if (args[index] == "decrypt") + { + this.decryptbox.Checked = true; + break; + } + if (args[index] == "keepencrypt") + { + this.keepenccontents.Checked = true; + break; + } + Console.WriteLine("\n>>>> Warning: Unrecognized command line argument: {0}. This option is ignored...", (object) args[index]); + break; + } + } + this.UpdatePackedName(); + this.NUSDownloader_DoWork((object) null, (DoWorkEventArgs) null); + Console.WriteLine("\nSuccessfully downloaded the title {0} version {1}", (object) args[0], (object) args[1]); + } + } + + private void GUISetup() + { + this.Font = new Font("Tahoma", 8f); + this.MaximumSize = this.MinimumSize = this.Size; + if (System.Type.GetType("Mono.Runtime") != null) + { + this.saveaswadbtn.Text = "Save As"; + this.clearButton.Text = "Clear"; + this.keepenccontents.Text = "Keep Enc. Contents"; + this.clearButton.Left -= 41; + } + else + this.statusbox.Font = new Font("Microsoft Sans Serif", 7f); + this.statusbox.SelectionColor = this.statusbox.ForeColor = this.normalcolor; + if (this.version.StartsWith("SVN")) + { + this.WriteStatus("!!!!! THIS IS A DEBUG BUILD FROM SVN !!!!!"); + this.WriteStatus("Features CAN and WILL be broken in this build!"); + this.WriteStatus("Devs: REMEMBER TO CHANGE TO THE RELEASE CONFIGURATION AND CHANGE VERSION NUMBER BEFORE BUILDING!"); + this.WriteStatus("\r\n"); + } + this.databaseWorker = new BackgroundWorker(); + this.databaseWorker.DoWork += new DoWorkEventHandler(this.DoAllDatabaseyStuff); + this.databaseWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.DoAllDatabaseyStuff_Completed); + this.databaseWorker.ProgressChanged += new ProgressChangedEventHandler(this.DoAllDatabaseyStuff_ProgressChanged); + this.databaseWorker.WorkerReportsProgress = true; + this.dsiDatabaseWorker = new BackgroundWorker(); + this.dsiDatabaseWorker.DoWork += new DoWorkEventHandler(this.DSiDatabaseWork); + this.dsiDatabaseWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.DSiDatabaseWork_Completed); + this.dsiDatabaseWorker.ProgressChanged += new ProgressChangedEventHandler(this.DSiDatabaseWork_ProgressChanged); + this.dsiDatabaseWorker.WorkerReportsProgress = true; + this.scriptsWorker = new BackgroundWorker(); + this.scriptsWorker.DoWork += new DoWorkEventHandler(this.OrganizeScripts); + this.scriptsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.scriptsWorker_RunWorkerCompleted); + } + + private void Form1_Load(object sender, EventArgs e) + { + this.Text = string.Format("NUSD - {0}", (object) this.version); + this.Size = this.MinimumSize; + this.serverLbl.Text = "Wii"; + } + + private bool NUSDFileExists(string filename) => System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, filename)); + + private void BootChecks() + { + if (this.InvokeRequired) + { + this.Invoke((Delegate) new Form1.BootChecksCallback(this.BootChecks)); + } + else + { + if (this.NUSDFileExists("database.xml")) + { + Database database = new Database(); + database.LoadDatabaseToStream(Path.Combine(this.CURRENT_DIR, "database.xml")); + string databaseVersion = database.GetDatabaseVersion(); + this.WriteStatus("Database.xml detected."); + this.WriteStatus(" - Version: " + databaseVersion); + this.updateDatabaseToolStripMenuItem.Text = "Update Database"; + this.databaseButton.Text = " [ ]"; + this.databaseButton.Image = (Image) Resources.arrow_ticker; + this.databaseWorker.RunWorkerAsync(); + } + if (this.NUSDFileExists("dsidatabase.xml")) + { + Database database = new Database(); + database.LoadDatabaseToStream(Path.Combine(this.CURRENT_DIR, "dsidatabase.xml")); + string databaseVersion = database.GetDatabaseVersion(); + this.WriteStatus("DSiDatabase.xml detected."); + this.WriteStatus(" - Version: " + databaseVersion); + this.updateDatabaseToolStripMenuItem.Text = "Update Database"; + this.databaseButton.Text = " [ ]"; + this.databaseButton.Image = (Image) Resources.arrow_ticker; + this.dsiDatabaseWorker.RunWorkerAsync(); + } + this.RunScriptOrganizer(); + if (!this.NUSDFileExists("proxy.txt")) + return; + this.WriteStatus("Proxy settings detected."); + string[] strArray = System.IO.File.ReadAllLines(Path.Combine(this.CURRENT_DIR, "proxy.txt")); + this.proxy_url = strArray[0]; + if (strArray.Length > 2) + { + this.proxy_usr = strArray[1]; + this.proxy_pwd = strArray[2]; + } + else + { + if (strArray.Length <= 1) + return; + this.proxy_usr = strArray[1]; + this.SetAllEnabled(false); + this.ProxyVerifyBox.Visible = true; + this.ProxyVerifyBox.Enabled = true; + this.ProxyPwdBox.Enabled = true; + this.SaveProxyBtn.Enabled = true; + this.ProxyVerifyBox.Select(); + } + } + } + + private void DoAllDatabaseyStuff(object sender, DoWorkEventArgs e) + { + BackgroundWorker worker = sender as BackgroundWorker; + this.ClearDatabaseStrip(); + this.FillDatabaseStrip(worker); + this.LoadRegionCodes(); + this.FillDatabaseScripts(); + this.ShowInnerToolTips(false); + } + + private void DoAllDatabaseyStuff_Completed(object sender, RunWorkerCompletedEventArgs e) + { + this.databaseButton.Text = "Database..."; + this.databaseButton.Image = (Image) null; + } + + private void DoAllDatabaseyStuff_ProgressChanged(object sender, ProgressChangedEventArgs e) + { + if (e.ProgressPercentage == 25) + this.databaseButton.Text = " [. ]"; + else if (e.ProgressPercentage == 50) + this.databaseButton.Text = " [.. ]"; + else if (e.ProgressPercentage == 75) + { + this.databaseButton.Text = " [... ]"; + } + else + { + if (e.ProgressPercentage != 100) + return; + this.databaseButton.Text = " [....]"; + } + } + + private void RunScriptOrganizer() => this.scriptsWorker.RunWorkerAsync(); + + private void SetAllEnabled(bool enabled) + { + for (int index = 0; index < this.Controls.Count; ++index) + { + try + { + this.Controls[index].Enabled = enabled; + } + catch + { + } + } + } + + private void extrasMenuButton_Click(object sender, EventArgs e) + { + this.extrasStrip.Text = "Showing"; + this.extrasStrip.Show((Control) this.Extrasbtn, 2, 2 + this.Extrasbtn.Height); + System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); + timer.Interval = 52; + timer.Tick += new EventHandler(this.contextmenusTimer_Tick); + timer.Start(); + } + + private void LoadTitleFromTMD() + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Filter = "TMD Files|*tmd*"; + openFileDialog.Title = "Open TMD"; + if (openFileDialog.ShowDialog() == DialogResult.Cancel) + return; + TMD tmd = new TMD(); + tmd.LoadFile(openFileDialog.FileName); + this.WriteStatus(string.Format("TMD Loaded ({0} blocks)", (object) tmd.GetNandBlocks())); + this.titleidbox.Text = tmd.TitleID.ToString("X16"); + this.WriteStatus("Title ID: " + tmd.TitleID.ToString("X16")); + this.titleversion.Text = tmd.TitleVersion.ToString(); + this.WriteStatus("Version: " + (object) tmd.TitleVersion); + if (tmd.StartupIOS.ToString("X") != "0") + this.WriteStatus("Requires: IOS" + (object) int.Parse(tmd.StartupIOS.ToString("X").Substring(7, 2).ToString(), NumberStyles.HexNumber)); + this.WriteStatus("Content Count: " + (object) tmd.NumOfContents); + for (int index = 0; index < tmd.Contents.Length; ++index) + { + this.WriteStatus(string.Format(" Content {0}: {1} ({2} bytes)", (object) index, (object) tmd.Contents[index].ContentID.ToString("X8"), (object) tmd.Contents[index].Size.ToString())); + this.WriteStatus(string.Format(" - Index: {0}", (object) tmd.Contents[index].Index.ToString())); + this.WriteStatus(string.Format(" - Type: {0}", (object) tmd.Contents[index].Type.ToString())); + this.WriteStatus(string.Format(" - Hash: {0}...", (object) this.DisplayBytes(tmd.Contents[index].Hash, string.Empty).Substring(0, 8))); + } + this.WriteStatus("TMD information parsed!"); + } + + public void WriteStatus(string Update, Color writecolor) + { + if (this.statusbox.InvokeRequired) + { + this.Invoke((Delegate) new Form1.WriteStatusCallback(this.WriteStatus), (object) Update, (object) writecolor); + } + else + { + int textLength1 = this.statusbox.TextLength; + if (this.statusbox.Text == "") + this.statusbox.Text = Update; + else + this.statusbox.AppendText("\r\n" + Update); + int textLength2 = this.statusbox.TextLength; + this.statusbox.Select(textLength1, textLength2 - textLength1); + this.statusbox.SelectionColor = writecolor; + this.statusbox.SelectionStart = this.statusbox.TextLength; + this.statusbox.SelectionLength = 0; + this.statusbox.ScrollToCaret(); + Console.WriteLine(Update); + } + } + + public void WriteStatus(string Update) => this.WriteStatus(Update, this.normalcolor); + + private void ReadIDType(string ttlid) + { + if (ttlid.Substring(0, 8) == "00000001") + this.WriteStatus("ID Type: System Title. BE CAREFUL!", this.warningcolor); + else if (ttlid.Substring(0, 8) == "00010000" || ttlid.Substring(0, 8) == "00010004") + this.WriteStatus("ID Type: Disc-Based Game. Unlikely NUS Content!"); + else if (ttlid.Substring(0, 8) == "00010001") + this.WriteStatus("ID Type: Downloaded Channel. Possible NUS Content."); + else if (ttlid.Substring(0, 8) == "00010002") + this.WriteStatus("ID Type: System Channel. BE CAREFUL!", this.warningcolor); + else if (ttlid.Substring(0, 8) == "00010004") + this.WriteStatus("ID Type: Game Channel. Unlikely NUS Content!"); + else if (ttlid.Substring(0, 8) == "00010005") + this.WriteStatus("ID Type: Downloaded Game Content. Unlikely NUS Content!"); + else if (ttlid.Substring(0, 8) == "00010008") + this.WriteStatus("ID Type: 'Hidden' Channel. Unlikely NUS Content!"); + else + this.WriteStatus("ID Type: Unknown. Unlikely NUS Content!"); + } + + private void DownloadBtn_Click(object sender, EventArgs e) + { + if (this.titleidbox.Text == string.Empty) + this.WriteStatus("Please enter a Title ID!", this.errorcolor); + else if (!this.packbox.Checked && !this.decryptbox.Checked && !this.keepenccontents.Checked) + { + this.WriteStatus("Running with your current settings will produce no output!", this.errorcolor); + this.WriteStatus(" - To amend this, look below and check an output type.", this.errorcolor); + } + else + this.NUSDownloader.RunWorkerAsync(); + } + + private void SetTextThreadSafe(Control what, string setto) => this.SetPropertyThreadSafe((Component) what, (object) "Name", setto); + + private void SetPropertyThreadSafe(Component what, object setto, string property) + { + if (this.InvokeRequired) + { + Form1.SetPropertyThreadSafeCallback method = new Form1.SetPropertyThreadSafeCallback(this.SetPropertyThreadSafe); + try + { + this.Invoke((Delegate) method, (object) what, setto, (object) property); + } + catch (Exception ex) + { + } + } + else + what.GetType().GetProperty(property).SetValue((object) what, setto, (object[]) null); + } + + private void NUSDownloader_DoWork(object sender, DoWorkEventArgs e) + { + Control.CheckForIllegalCrossThreadCalls = false; + this.WriteStatus("Starting NUS Download. Please be patient!", this.infocolor); + this.SetEnableforDownload(false); + this.downloadstartbtn.Text = "Starting NUS Download!"; + WebClient wcReady = this.ConfigureWithProxy(new WebClient()); + NusClient nusClient = new NusClient(); + nusClient.ConfigureNusClient(wcReady); + nusClient.UseLocalFiles = this.localuse.Checked; + nusClient.ContinueWithoutTicket = true; + if (this.serverLbl.Text == "Wii") + nusClient.SetToWiiServer(); + else if (this.serverLbl.Text == "DSi") + nusClient.SetToDSiServer(); + nusClient.Debug += new EventHandler(this.nusClient_Debug); + nusClient.Progress += new EventHandler(this.nusClient_Progress); + StoreType[] storeTypeArray = new StoreType[3] + { + !this.packbox.Checked ? StoreType.Empty : StoreType.WAD, + !this.decryptbox.Checked ? StoreType.Empty : StoreType.DecryptedContent, + !this.keepenccontents.Checked ? StoreType.Empty : StoreType.EncryptedContent + }; + string wadName = !string.IsNullOrEmpty(this.WAD_Saveas_Filename) ? this.WAD_Saveas_Filename : this.wadnamebox.Text; + try + { + Console.Write(this.packbox.Checked); + nusClient.DownloadTitle(this.titleidbox.Text, this.titleversion.Text, Path.Combine(this.CURRENT_DIR, "titles"), this.pathbox.Checked, wadName, storeTypeArray); + } + catch (Exception ex) + { + this.WriteStatus("Download failed: \"" + ex.Message + " ):\"", this.errorcolor); + } + if (this.iosPatchCheckbox.Checked) + { + bool flag = false; + IosPatcher iosPatcher = new IosPatcher(); + WAD iosWad = new WAD(); + string str1 = wadName.Replace("[v]", nusClient.TitleVersion.ToString()); + if (str1.Contains(Path.DirectorySeparatorChar.ToString()) || str1.Contains(Path.AltDirectorySeparatorChar.ToString())) + iosWad.LoadFile(str1); + else + iosWad.LoadFile(Path.Combine(Path.Combine(Path.Combine(Path.Combine(this.CURRENT_DIR, "titles"), this.titleidbox.Text), nusClient.TitleVersion.ToString()), str1)); + try + { + iosPatcher.LoadIOS(ref iosWad); + } + catch (Exception ex) + { + this.WriteStatus("NUS Download Finished.", this.infocolor); + return; + } + foreach (object checkedItem in this.iosPatchesListBox.CheckedItems) + { + if (this.iosPatchesListBox.GetItemCheckState(this.iosPatchesListBox.Items.IndexOf(checkedItem)).ToString() == "Checked") + { + switch (checkedItem.ToString()) + { + case "Trucha bug": + int num1 = iosPatcher.PatchFakeSigning(); + if (num1 > 0) + { + this.WriteStatus(" - Patched in fake-signing:", this.infocolor); + string str2 = num1 <= 1 ? "" : "es"; + this.WriteStatus(string.Format(" {0} patch{1} applied.", (object) num1, (object) str2)); + flag = true; + continue; + } + this.WriteStatus(" - Could not patch fake-signing", this.errorcolor); + continue; + case "ES_Identify": + int num2 = iosPatcher.PatchEsIdentify(); + if (num2 > 0) + { + this.WriteStatus(" - Patched in ES_Identify:", this.infocolor); + string str3 = num2 <= 1 ? "" : "es"; + this.WriteStatus(string.Format(" {0} patch{1} applied.", (object) num2, (object) str3)); + flag = true; + continue; + } + this.WriteStatus(" - Could not patch ES_Identify", this.errorcolor); + continue; + case "NAND permissions": + int num3 = iosPatcher.PatchNandPermissions(); + if (num3 > 0) + { + this.WriteStatus(" - Patched in NAND permissions:", this.infocolor); + string str4 = num3 <= 1 ? "" : "es"; + this.WriteStatus(string.Format(" {0} patch{1} applied.", (object) num3, (object) str4)); + flag = true; + continue; + } + this.WriteStatus(" - Could not patch NAND permissions", this.errorcolor); + continue; + default: + continue; + } + } + } + if (flag) + { + string str5 = str1.Replace(".wad", ".patched.wad"); + try + { + if (str5.Contains(Path.DirectorySeparatorChar.ToString()) || str5.Contains(Path.AltDirectorySeparatorChar.ToString())) + iosWad.Save(str5); + else + iosWad.Save(Path.Combine(Path.Combine(Path.Combine(Path.Combine(this.CURRENT_DIR, "titles"), this.titleidbox.Text), nusClient.TitleVersion.ToString()), str5)); + this.WriteStatus(string.Format("Patched WAD saved as: {0}", (object) Path.GetFileName(str5)), this.infocolor); + } + catch (Exception ex) + { + this.WriteStatus(string.Format("Couldn't save patched WAD: \"{0}\" :(", (object) ex.Message), this.errorcolor); + } + } + } + this.WriteStatus("NUS Download Finished."); + } + + private void nusClient_Progress(object sender, ProgressChangedEventArgs e) => this.dlprogress.Value = e.ProgressPercentage; + + private void nusClient_Debug(object sender, MessageEventArgs e) => this.WriteStatus(e.Message); + + private void NUSDownloader_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + this.WAD_Saveas_Filename = string.Empty; + this.SetEnableforDownload(true); + this.downloadstartbtn.Text = "Start NUS Download!"; + this.dlprogress.Value = 0; + if (!Form1.IsWin7()) + return; + this.dlprogress.ShowInTaskbar = false; + } + + private void packbox_CheckedChanged(object sender, EventArgs e) + { + if (this.packbox.Checked) + { + this.wadnamebox.Enabled = true; + this.saveaswadbtn.Enabled = true; + this.UpdatePackedName(); + } + else + { + this.wadnamebox.Enabled = false; + this.saveaswadbtn.Enabled = false; + this.wadnamebox.Text = string.Empty; + if (!this.iosPatchCheckbox.Checked) + return; + this.iosPatchCheckbox.Checked = false; + } + } + + private void titleidbox_TextChanged(object sender, EventArgs e) + { + this.UpdatePackedName(); + this.EnablePatchIOSBox(); + } + + private void titleversion_TextChanged(object sender, EventArgs e) => this.UpdatePackedName(); + + private void EnablePatchIOSBox() + { + this.iosPatchCheckbox.Enabled = this.TitleIsIOS(this.titleidbox.Text); + if (this.iosPatchCheckbox.Enabled) + return; + this.iosPatchCheckbox.Checked = false; + } + + private bool TitleIsIOS(string titleid) => titleid.Length == 16 && !(titleid == "0000000100000001") && !(titleid == "0000000100000002") && titleid.Substring(0, 14) == "00000001000000"; + + public string DisplayBytes(byte[] bytes, string spacer) + { + string str = ""; + for (int index = 0; index < bytes.Length; ++index) + str = str + bytes[index].ToString("X2") + spacer; + return str; + } + + private void DatabaseButton_Click(object sender, EventArgs e) + { + this.databaseStrip.Text = "Showing"; + this.databaseStrip.Show((Control) this.databaseButton, 2, 2 + this.databaseButton.Height); + System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); + timer.Interval = 50; + timer.Tick += new EventHandler(this.contextmenusTimer_Tick); + timer.Start(); + } + + private void contextmenusTimer_Tick(object sender, EventArgs e) + { + if (this.SystemMenuList.Pressed || this.IOSMenuList.Pressed || this.VCMenuList.Pressed || this.WiiWareMenuList.Pressed || this.RegionCodesList.Pressed || this.scriptsLocalMenuEntry.Pressed || this.scriptsDatabaseToolStripMenuItem.Pressed || this.emulateUpdate.Pressed) + return; + if (this.databaseButton.ClientRectangle.Contains(this.databaseButton.PointToClient(Control.MousePosition)) && ((System.Windows.Forms.Timer) sender).Interval != 50) + { + this.databaseStrip.Close(); + this.scriptsStrip.Close(); + this.extrasStrip.Close(); + this.DatabaseButton_Click(sender, EventArgs.Empty); + ((System.Windows.Forms.Timer) sender).Stop(); + } + if (this.scriptsbutton.ClientRectangle.Contains(this.scriptsbutton.PointToClient(Control.MousePosition)) && ((System.Windows.Forms.Timer) sender).Interval != 51) + { + this.databaseStrip.Close(); + this.scriptsStrip.Close(); + this.extrasStrip.Close(); + this.scriptsbutton_Click(sender, EventArgs.Empty); + ((System.Windows.Forms.Timer) sender).Stop(); + } + if (this.Extrasbtn.ClientRectangle.Contains(this.Extrasbtn.PointToClient(Control.MousePosition)) && ((System.Windows.Forms.Timer) sender).Interval != 52) + { + this.databaseStrip.Close(); + this.scriptsStrip.Close(); + this.extrasStrip.Close(); + this.extrasMenuButton_Click(sender, EventArgs.Empty); + ((System.Windows.Forms.Timer) sender).Stop(); + } + if (this.databaseStrip.Visible || this.extrasStrip.Visible || this.scriptsStrip.Visible) + return; + ((System.Windows.Forms.Timer) sender).Stop(); + } + + private void ClearDatabaseStrip() + { + Control.CheckForIllegalCrossThreadCalls = false; + object[] objArray = new object[17] + { + (object) this.SystemMenuList, + (object) this.IOSMenuList, + (object) this.WiiWareMenuList, + (object) this.VCMenuList, + (object) this.C64MenuList, + (object) this.NeoGeoMenuList, + (object) this.NESMenuList, + (object) this.SNESMenuList, + (object) this.N64MenuList, + (object) this.TurboGrafx16MenuList, + (object) this.TurboGrafxCDMenuList, + (object) this.MSXMenuList, + (object) this.SegaMSMenuList, + (object) this.GenesisMenuList, + (object) this.VCArcadeMenuList, + (object) this.dsiSystemToolStripMenu, + (object) this.dSiWareToolStripMenu + }; + foreach (ToolStripMenuItem toolStripMenuItem in objArray) + { + if (toolStripMenuItem.Name != "VCMenuList") + toolStripMenuItem.DropDownItems.Clear(); + } + } + + private void FillDatabaseStrip(BackgroundWorker worker) + { + this.SetPropertyThreadSafe((Component) this.SystemMenuList, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.IOSMenuList, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.VCMenuList, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.WiiWareMenuList, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.systemFakeMenuItem, (object) true, "Visible"); + this.SetPropertyThreadSafe((Component) this.iosFakeMenuItem, (object) true, "Visible"); + this.SetPropertyThreadSafe((Component) this.vcFakeMenuItem, (object) true, "Visible"); + this.SetPropertyThreadSafe((Component) this.wwFakeMenuItem, (object) true, "Visible"); + Database database = new Database(); + database.LoadDatabaseToStream(Path.Combine(this.CURRENT_DIR, "database.xml")); + ToolStripMenuItem[] toolStripMenuItemArray1 = database.LoadSystemTitles(); + for (int index1 = 0; index1 < toolStripMenuItemArray1.Length; ++index1) + { + toolStripMenuItemArray1[index1].DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + for (int index2 = 0; index2 < toolStripMenuItemArray1[index1].DropDownItems.Count; ++index2) + { + ToolStripMenuItem dropDownItem = (ToolStripMenuItem) toolStripMenuItemArray1[index1].DropDownItems[index2]; + if (dropDownItem.DropDownItems.Count > 0) + dropDownItem.DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + } + } + Array.Sort(toolStripMenuItemArray1, (Comparison) ((tsmi1, tsmi2) => tsmi1.Text.Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)))); + this.AddToolStripItemToStrip(this.SystemMenuList, toolStripMenuItemArray1); + this.SetPropertyThreadSafe((Component) this.systemFakeMenuItem, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.SystemMenuList, (object) true, "Visible"); + worker.ReportProgress(25); + ToolStripMenuItem[] additionitems = database.LoadIosTitles(); + for (int index = 0; index < additionitems.Length; ++index) + additionitems[index].DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + this.AddToolStripItemToStrip(this.IOSMenuList, additionitems); + this.SetPropertyThreadSafe((Component) this.iosFakeMenuItem, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.IOSMenuList, (object) true, "Visible"); + worker.ReportProgress(50); + ToolStripMenuItem[][] toolStripMenuItemArray2 = database.LoadVirtualConsoleTitles(); + for (int index3 = 0; index3 < toolStripMenuItemArray2.Length; ++index3) + { + for (int index4 = 0; index4 < toolStripMenuItemArray2[index3].Length; ++index4) + { + toolStripMenuItemArray2[index3][index4].DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + for (int index5 = 0; index5 < toolStripMenuItemArray2[index3][index4].DropDownItems.Count; ++index5) + ((ToolStripDropDownItem) toolStripMenuItemArray2[index3][index4].DropDownItems[index5]).DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + } + Array.Sort(toolStripMenuItemArray2[index3], (Comparison) ((tsmi1, tsmi2) => tsmi1.Text.Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)))); + this.AddToolStripItemToStrip((ToolStripMenuItem) this.VCMenuList.DropDownItems[index3], toolStripMenuItemArray2[index3]); + } + this.SetPropertyThreadSafe((Component) this.vcFakeMenuItem, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.VCMenuList, (object) true, "Visible"); + worker.ReportProgress(75); + ToolStripMenuItem[] toolStripMenuItemArray3 = database.LoadWiiWareTitles(); + for (int index6 = 0; index6 < toolStripMenuItemArray3.Length; ++index6) + { + toolStripMenuItemArray3[index6].DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + for (int index7 = 0; index7 < toolStripMenuItemArray3[index6].DropDownItems.Count; ++index7) + { + ToolStripMenuItem dropDownItem = (ToolStripMenuItem) toolStripMenuItemArray3[index6].DropDownItems[index7]; + if (dropDownItem.DropDownItems.Count > 0) + dropDownItem.DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + } + } + Array.Sort(toolStripMenuItemArray3, (Comparison) ((tsmi1, tsmi2) => tsmi1.Text.Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)))); + this.AddToolStripItemToStrip(this.WiiWareMenuList, toolStripMenuItemArray3); + this.SetPropertyThreadSafe((Component) this.wwFakeMenuItem, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.WiiWareMenuList, (object) true, "Visible"); + worker.ReportProgress(100); + } + + private void FillDSiDatabaseStrip(BackgroundWorker worker) + { + this.SetPropertyThreadSafe((Component) this.dsiSystemToolStripMenu, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.dSiWareToolStripMenu, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.dsiFakeSystemToolStripMenu, (object) true, "Visible"); + this.SetPropertyThreadSafe((Component) this.dSiWareFakeToolStripMenu, (object) true, "Visible"); + Database database = new Database(); + database.LoadDatabaseToStream(Path.Combine(this.CURRENT_DIR, "dsidatabase.xml")); + ToolStripMenuItem[] toolStripMenuItemArray1 = database.LoadDSiSystemTitles(); + for (int index1 = 0; index1 < toolStripMenuItemArray1.Length; ++index1) + { + toolStripMenuItemArray1[index1].DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + for (int index2 = 0; index2 < toolStripMenuItemArray1[index1].DropDownItems.Count; ++index2) + { + ToolStripMenuItem dropDownItem = (ToolStripMenuItem) toolStripMenuItemArray1[index1].DropDownItems[index2]; + if (dropDownItem.DropDownItems.Count > 0) + dropDownItem.DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + } + } + Array.Sort(toolStripMenuItemArray1, (Comparison) ((tsmi1, tsmi2) => tsmi1.Text.Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)))); + this.AddToolStripItemToStrip(this.dsiSystemToolStripMenu, toolStripMenuItemArray1); + this.SetPropertyThreadSafe((Component) this.dsiFakeSystemToolStripMenu, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.dsiSystemToolStripMenu, (object) true, "Visible"); + worker.ReportProgress(50); + ToolStripMenuItem[] toolStripMenuItemArray2 = database.LoadDsiWareTitles(); + for (int index3 = 0; index3 < toolStripMenuItemArray2.Length; ++index3) + { + toolStripMenuItemArray2[index3].DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + for (int index4 = 0; index4 < toolStripMenuItemArray2[index3].DropDownItems.Count; ++index4) + { + ToolStripMenuItem dropDownItem = (ToolStripMenuItem) toolStripMenuItemArray2[index3].DropDownItems[index4]; + if (dropDownItem.DropDownItems.Count > 0) + dropDownItem.DropDownItemClicked += new ToolStripItemClickedEventHandler(this.DatabaseItem_Clicked); + } + } + Array.Sort(toolStripMenuItemArray2, (Comparison) ((tsmi1, tsmi2) => tsmi1.Text.Substring(18, tsmi1.Text.Length - 19).CompareTo(tsmi2.Text.Substring(18, tsmi2.Text.Length - 19)))); + this.AddToolStripItemToStrip(this.dSiWareToolStripMenu, toolStripMenuItemArray2); + this.SetPropertyThreadSafe((Component) this.dSiWareFakeToolStripMenu, (object) false, "Visible"); + this.SetPropertyThreadSafe((Component) this.dSiWareToolStripMenu, (object) true, "Visible"); + worker.ReportProgress(100); + } + + private void AddToolStripItemToStrip( + ToolStripMenuItem menulist, + ToolStripMenuItem[] additionitems) + { + if (this.InvokeRequired) + this.Invoke((Delegate) new Form1.AddToolStripItemToStripCallback(this.AddToolStripItemToStrip), (object) menulist, (object) additionitems); + else + menulist.DropDownItems.AddRange((ToolStripItem[]) additionitems); + } + + public string OfficialWADNaming(string titlename) + { + titlename = !(titlename == "MIOS") ? (!titlename.Contains("IOS") ? (!titlename.Contains("System Menu") ? (!titlename.Contains("System Menu") ? (!(titlename == "BC") ? (!titlename.Contains("Mii Channel") ? (!titlename.Contains("Shopping Channel") ? (!titlename.Contains("Weather Channel") ? titlename + "-NUS-[v].wad" : "RVL-Weather-[v].wad") : "RVL-Shopping-[v].wad") : "RVL-NigaoeNR-[v].wad") : "RVL-bc-[v].wad") : "RVL-WiiSystemmenu-[v].wad") : "RVL-WiiSystemmenu-[v].wad") : titlename + "-64-[v].wad") : "RVL-mios-[v].wad"; + if (this.wadnamebox.InvokeRequired) + { + this.wadnamebox.Invoke((Delegate) new Form1.OfficialWADNamingCallback(this.OfficialWADNaming), (object) titlename); + return titlename; + } + this.wadnamebox.Text = titlename; + if (this.titleversion.Text != "") + this.wadnamebox.Text = this.wadnamebox.Text.Replace("[v]", "v" + this.titleversion.Text); + return titlename; + } + + public void DatabaseItem_Clicked(object sender, ToolStripItemClickedEventArgs e) + { + Regex regex1 = new Regex("[0-9A-Z]*\\s-\\s.*"); + Regex regex2 = new Regex("[0-9A-Z][0-9A-Z] \\(.*\\)"); + Regex regex3 = new Regex("v[0-9]*.*"); + object[] objArray1 = new object[4] + { + (object) this.SystemMenuList, + (object) this.IOSMenuList, + (object) this.WiiWareMenuList, + (object) this.VCMenuList + }; + object[] objArray2 = new object[2] + { + (object) this.dsiSystemToolStripMenu, + (object) this.dSiWareToolStripMenu + }; + if (regex1.IsMatch(e.ClickedItem.Text)) + { + string[] strArray = e.ClickedItem.Text.Replace(" - ", "~").Split('~'); + this.titleidbox.Text = strArray[0]; + this.statusbox.Text = string.Format(" --- {0} ---", (object) strArray[1]); + this.titleversion.Text = string.Empty; + if (e.ClickedItem.Image == Database.orange || e.ClickedItem.Image == Database.redorange) + { + this.WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); + this.packbox.Checked = false; + this.decryptbox.Checked = false; + } + if (e.ClickedItem.Image == Database.redgreen || e.ClickedItem.Image == Database.redorange) + this.WriteStatus("\n" + e.ClickedItem.ToolTipText); + foreach (ToolStripItem toolStripItem in objArray1) + { + if (toolStripItem.Name == e.ClickedItem.OwnerItem.Name) + this.serverLbl.Text = "Wii"; + } + foreach (ToolStripItem toolStripItem in objArray2) + { + if (toolStripItem.Name == e.ClickedItem.OwnerItem.Name) + this.serverLbl.Text = "DSi"; + } + } + if (regex2.IsMatch(e.ClickedItem.Text)) + { + string[] strArray = e.ClickedItem.OwnerItem.Text.Replace(" - ", "~").Split('~'); + this.titleidbox.Text = strArray[0]; + this.statusbox.Text = string.Format(" --- {0} ---", (object) strArray[1]); + this.titleversion.Text = string.Empty; + this.titleidbox.Text = this.titleidbox.Text.Replace("XX", e.ClickedItem.Text.Substring(0, 2)); + if (e.ClickedItem.OwnerItem.Image == Database.orange || e.ClickedItem.OwnerItem.Image == Database.redorange) + { + this.WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); + this.packbox.Checked = false; + this.decryptbox.Checked = false; + } + if (e.ClickedItem.OwnerItem.Image == Database.redgreen || e.ClickedItem.OwnerItem.Image == Database.redorange) + this.WriteStatus("\n" + e.ClickedItem.OwnerItem.ToolTipText); + foreach (ToolStripItem toolStripItem in objArray1) + { + if (toolStripItem.Name == e.ClickedItem.OwnerItem.OwnerItem.Name) + this.serverLbl.Text = "Wii"; + } + foreach (ToolStripItem toolStripItem in objArray2) + { + if (toolStripItem.Name == e.ClickedItem.OwnerItem.OwnerItem.Name) + this.serverLbl.Text = "DSi"; + } + } + if (!regex3.IsMatch(e.ClickedItem.Text) && !(e.ClickedItem.Text == "Latest Version")) + return; + if (regex2.IsMatch(e.ClickedItem.OwnerItem.Text)) + { + string[] strArray = e.ClickedItem.OwnerItem.OwnerItem.Text.Replace(" - ", "~").Split('~'); + this.titleidbox.Text = strArray[0]; + this.statusbox.Text = string.Format(" --- {0} ---", (object) strArray[1]); + this.titleidbox.Text = this.titleidbox.Text.Replace("XX", e.ClickedItem.OwnerItem.Text.Substring(0, 2)); + } + else + { + string[] strArray = e.ClickedItem.OwnerItem.Text.Replace(" - ", "~").Split('~'); + this.titleidbox.Text = strArray[0]; + this.statusbox.Text = string.Format(" --- {0} ---", (object) strArray[1]); + } + if (e.ClickedItem.Text == "Latest Version") + this.titleversion.Text = string.Empty; + else + this.titleversion.Text = e.ClickedItem.Text.Replace("v", "").Split(' ')[0]; + if (regex2.IsMatch(e.ClickedItem.OwnerItem.Text)) + { + if (e.ClickedItem.OwnerItem.OwnerItem.Image == Database.orange || e.ClickedItem.OwnerItem.OwnerItem.Image == Database.redorange) + { + this.WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); + this.packbox.Checked = false; + this.decryptbox.Checked = false; + } + if (e.ClickedItem.OwnerItem.OwnerItem.Image == Database.redgreen || e.ClickedItem.OwnerItem.OwnerItem.Image == Database.redorange) + this.WriteStatus("\n" + e.ClickedItem.OwnerItem.OwnerItem.ToolTipText); + foreach (ToolStripItem toolStripItem in objArray1) + { + if (toolStripItem.Name == e.ClickedItem.OwnerItem.OwnerItem.OwnerItem.Name) + this.serverLbl.Text = "Wii"; + } + foreach (ToolStripItem toolStripItem in objArray2) + { + if (toolStripItem.Name == e.ClickedItem.OwnerItem.OwnerItem.OwnerItem.Name) + this.serverLbl.Text = "DSi"; + } + } + else + { + if (e.ClickedItem.OwnerItem.Image == Database.orange || e.ClickedItem.OwnerItem.Image == Database.redorange) + { + this.WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); + this.packbox.Checked = false; + this.decryptbox.Checked = false; + } + if (e.ClickedItem.OwnerItem.Image == Database.redgreen || e.ClickedItem.OwnerItem.Image == Database.redorange) + this.WriteStatus("\n" + e.ClickedItem.OwnerItem.ToolTipText); + foreach (ToolStripItem toolStripItem in objArray1) + { + if (toolStripItem.Name == e.ClickedItem.OwnerItem.OwnerItem.Name) + this.serverLbl.Text = "Wii"; + } + foreach (ToolStripItem toolStripItem in objArray2) + { + if (toolStripItem.Name == e.ClickedItem.OwnerItem.OwnerItem.Name) + this.serverLbl.Text = "DSi"; + } + } + } + + private string RegionFromIndex(int index, XmlDocument databasexml) + { + XmlNodeList childNodes = databasexml.GetElementsByTagName("REGIONS")[0].ChildNodes; + for (int i = 0; i < childNodes.Count; ++i) + { + if (Convert.ToInt32(childNodes[i].Attributes[0].Value) == index) + return childNodes[i].InnerText; + } + return "XX (Error)"; + } + + private void LoadRegionCodes() + { + if (this.InvokeRequired) + { + this.Invoke((Delegate) new Form1.BootChecksCallback(this.LoadRegionCodes)); + } + else + { + this.wiiRegionCodesMenu.DropDownItems.Clear(); + this.dsiRegionCodesMenu.DropDownItems.Clear(); + Database database1 = new Database(); + database1.LoadDatabaseToStream(Path.Combine(this.CURRENT_DIR, "database.xml")); + foreach (ToolStripItem loadRegionCode in database1.LoadRegionCodes()) + this.wiiRegionCodesMenu.DropDownItems.Add(loadRegionCode.Text); + Database database2 = new Database(); + database2.LoadDatabaseToStream(Path.Combine(this.CURRENT_DIR, "dsidatabase.xml")); + foreach (ToolStripItem loadRegionCode in database2.LoadRegionCodes()) + this.dsiRegionCodesMenu.DropDownItems.Add(loadRegionCode.Text); + } + } + + private static string RemoveIllegalCharacters(string databasestr) + { + foreach (char invalidFileNameChar in Path.GetInvalidFileNameChars()) + { + if (databasestr.Contains(invalidFileNameChar.ToString())) + databasestr = databasestr.Replace(invalidFileNameChar, '-'); + } + return databasestr; + } + + private void ClearStatusbox(object sender, EventArgs e) => this.statusbox.Text = ""; + + private void SetEnableforDownload(bool enabled) + { + if (this.InvokeRequired) + this.Invoke((Delegate) new Form1.SetEnableForDownloadCallback(this.SetEnableforDownload), (object) enabled); + else if (enabled) + { + this.downloadstartbtn.Enabled = this.disabledStorage[0]; + this.titleidbox.Enabled = this.disabledStorage[1]; + this.titleversion.Enabled = this.disabledStorage[2]; + this.Extrasbtn.Enabled = this.disabledStorage[3]; + this.databaseButton.Enabled = this.disabledStorage[4]; + this.packbox.Enabled = this.disabledStorage[5]; + this.localuse.Enabled = this.disabledStorage[6]; + this.saveaswadbtn.Enabled = this.disabledStorage[7]; + this.decryptbox.Enabled = this.disabledStorage[8]; + this.keepenccontents.Enabled = this.disabledStorage[9]; + this.scriptsbutton.Enabled = this.disabledStorage[10]; + this.serverLbl.Enabled = this.disabledStorage[11]; + this.iosPatchCheckbox.Enabled = this.disabledStorage[12]; + this.pathbox.Enabled = this.disabledStorage[13]; + } + else + { + this.disabledStorage[0] = this.downloadstartbtn.Enabled; + this.disabledStorage[1] = this.titleidbox.Enabled; + this.disabledStorage[2] = this.titleversion.Enabled; + this.disabledStorage[3] = this.Extrasbtn.Enabled; + this.disabledStorage[4] = this.databaseButton.Enabled; + this.disabledStorage[5] = this.packbox.Enabled; + this.disabledStorage[6] = this.localuse.Enabled; + this.disabledStorage[7] = this.saveaswadbtn.Enabled; + this.disabledStorage[8] = this.decryptbox.Enabled; + this.disabledStorage[9] = this.keepenccontents.Enabled; + this.disabledStorage[10] = this.scriptsbutton.Enabled; + this.disabledStorage[11] = this.serverLbl.Enabled; + this.disabledStorage[12] = this.iosPatchCheckbox.Enabled; + this.disabledStorage[13] = this.pathbox.Enabled; + this.downloadstartbtn.Enabled = enabled; + this.titleidbox.Enabled = enabled; + this.titleversion.Enabled = enabled; + this.Extrasbtn.Enabled = enabled; + this.databaseButton.Enabled = enabled; + this.packbox.Enabled = enabled; + this.localuse.Enabled = enabled; + this.saveaswadbtn.Enabled = enabled; + this.decryptbox.Enabled = enabled; + this.keepenccontents.Enabled = enabled; + this.scriptsbutton.Enabled = enabled; + this.serverLbl.Enabled = enabled; + this.iosPatchCheckbox.Enabled = enabled; + this.pathbox.Enabled = enabled; + } + } + + private void ShowInnerToolTips(bool enabled) + { + foreach (ToolStripItem toolStripItem in (ArrangedElementCollection) this.databaseStrip.Items) + { + try + { + ((ToolStripDropDownItem) toolStripItem).DropDown.ShowItemToolTips = false; + } + catch (Exception ex) + { + } + } + foreach (ToolStripItem toolStripItem in (ArrangedElementCollection) this.scriptsStrip.Items) + { + try + { + ((ToolStripDropDownItem) toolStripItem).DropDown.ShowItemToolTips = false; + } + catch (Exception ex) + { + } + } + } + + private void UpdatePackedName() + { + string str = (string) null; + if (this.titleidbox.Enabled && this.packbox.Checked) + { + if (this.titleversion.Text != "") + this.wadnamebox.Text = this.titleidbox.Text + "-NUS-v" + this.titleversion.Text + ".wad"; + else + this.wadnamebox.Text = this.titleidbox.Text + "-NUS-[v]" + this.titleversion.Text + ".wad"; + if (System.IO.File.Exists("database.xml") && this.titleidbox.Text.Length == 16) + str = this.NameFromDatabase(this.titleidbox.Text); + if (str != null) + { + this.wadnamebox.Text = this.wadnamebox.Text.Replace(this.titleidbox.Text, str); + this.OfficialWADNaming(str); + } + } + this.wadnamebox.Text = Form1.RemoveIllegalCharacters(this.wadnamebox.Text); + } + + private static bool IsWin7() => Environment.OSVersion.VersionString.Contains("6.1"); + + private byte[] NewIntegertoByteArray(int theInt, int arrayLen) + { + byte[] numArray = new byte[arrayLen]; + for (int index = arrayLen - 1; index >= 0; --index) + numArray[index] = (byte) (theInt >> 8 * index & (int) byte.MaxValue); + Array.Reverse((Array) numArray); + if (arrayLen > 4) + { + for (int index = 0; index < arrayLen - 4; ++index) + numArray[index] = (byte) 0; + } + return numArray; + } + + private WebClient ConfigureWithProxy(WebClient client) + { + if (!string.IsNullOrEmpty(this.proxy_url)) + { + WebProxy webProxy = new WebProxy(); + webProxy.Address = new Uri(this.proxy_url); + if (string.IsNullOrEmpty(this.proxy_usr)) + { + webProxy.UseDefaultCredentials = true; + } + else + { + NetworkCredential networkCredential = new NetworkCredential(); + networkCredential.UserName = this.proxy_usr; + if (!string.IsNullOrEmpty(this.proxy_pwd)) + networkCredential.Password = this.proxy_pwd; + webProxy.Credentials = (ICredentials) networkCredential; + } + client.Proxy = (IWebProxy) webProxy; + this.WriteStatus(" - Custom proxy settings applied!"); + } + else + { + try + { + client.Proxy = WebRequest.GetSystemWebProxy(); + client.UseDefaultCredentials = true; + } + catch (NotImplementedException ex) + { + this.WriteStatus("This operating system does not support automatic system proxy usage. Operating without a proxy..."); + } + } + return client; + } + + private void RetrieveNewDatabase(object sender, DoWorkEventArgs e) + { + string str1 = Regex.Replace(new WebClient().DownloadString(e.Argument.ToString() + "?cachesmash=" + DateTime.Now.ToString()), "<(.|\\n)*?>", ""); + string str2 = "<database v"; + string str3 = "</database>"; + string str4 = str1.Substring(str1.IndexOf(str2), str1.Length - str1.IndexOf(str2)); + string str5 = str4.Substring(0, str4.IndexOf(str3) + str3.Length).Replace("<", "<").Replace(">", ">").Replace(""", '"'.ToString()).Replace(" ", " "); + e.Result = (object) str5; + } + + private void RetrieveNewDatabase_Completed(object sender, RunWorkerCompletedEventArgs e) + { + string str1 = e.Result.ToString(); + string str2 = ""; + if (str1.Contains("DSISYSTEM")) + str2 = "dsidatabase.xml"; + else if (str1.Contains("0000000100000002")) + str2 = "database.xml"; + try + { + Database database = new Database(); + database.LoadDatabaseToStream(Path.Combine(this.CURRENT_DIR, str2)); + string databaseVersion1 = database.GetDatabaseVersion(); + string databaseVersion2 = Database.GetDatabaseVersion(str1); + this.WriteStatus(string.Format(" - Database successfully parsed! ({0})", (object) str2)); + this.WriteStatus(" - Current Database Version: " + databaseVersion1); + this.WriteStatus(" - Online Database Version: " + databaseVersion2); + if (databaseVersion1 == databaseVersion2) + { + this.WriteStatus(" - You have the latest database version!"); + return; + } + } + catch (FileNotFoundException ex) + { + this.WriteStatus(" - Database does not yet exist."); + this.WriteStatus(" - Online Database Version: " + Database.GetDatabaseVersion(str1)); + } + bool flag = false; + if (System.IO.File.Exists(str2)) + { + this.WriteStatus(" - Overwriting your current database..."); + this.WriteStatus(string.Format(" - The old database will become 'old{0}' in case the new one is faulty.", (object) str2)); + string contents = System.IO.File.ReadAllText(str2); + System.IO.File.WriteAllText("old" + str2, contents); + System.IO.File.Delete(str2); + System.IO.File.WriteAllText(str2, str1); + } + else + { + this.WriteStatus(string.Format(" - {0} has been created.", (object) str2)); + System.IO.File.WriteAllText(str2, str1); + flag = true; + } + this.databaseWorker.RunWorkerAsync(); + if (flag) + { + this.WriteStatus("Database successfully created!"); + this.databaseButton.Visible = true; + this.updateDatabaseToolStripMenuItem.Text = "Download Database"; + } + else + this.WriteStatus("Database successfully updated!"); + } + + private void updateDatabaseToolStripMenuItem_Click(object sender, EventArgs e) + { + this.statusbox.Text = ""; + this.WriteStatus("Updating your databases from Wiibrew/DSibrew"); + string[] strArray = new string[2] + { + "http://www.wiibrew.org/wiki/NUS_Downloader/database", + "http://www.dsibrew.org/wiki/NUS_Downloader/database" + }; + BackgroundWorker backgroundWorker1 = new BackgroundWorker(); + backgroundWorker1.DoWork += new DoWorkEventHandler(this.RetrieveNewDatabase); + backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.RetrieveNewDatabase_Completed); + backgroundWorker1.RunWorkerAsync((object) strArray[0]); + BackgroundWorker backgroundWorker2 = new BackgroundWorker(); + backgroundWorker2.DoWork += new DoWorkEventHandler(this.RetrieveNewDatabase); + backgroundWorker2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.RetrieveNewDatabase_Completed); + backgroundWorker2.RunWorkerAsync((object) strArray[1]); + } + + private void loadInfoFromTMDToolStripMenuItem_Click(object sender, EventArgs e) => this.LoadTitleFromTMD(); + + public string SendSOAPRequest(string soap_xml) + { + HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create("http://nus.shop.wii.com/nus/services/NetUpdateSOAP"); + httpWebRequest.Method = "POST"; + httpWebRequest.UserAgent = "wii libnup/1.0"; + httpWebRequest.Headers.Add("SOAPAction", '"'.ToString() + "urn:nus.wsapi.broadon.com/GetSystemUpdate" + (object) '"'); + if (!string.IsNullOrEmpty(this.proxy_url)) + { + WebProxy webProxy = new WebProxy(); + webProxy.Address = new Uri(this.proxy_url); + if (string.IsNullOrEmpty(this.proxy_usr)) + { + webProxy.UseDefaultCredentials = true; + } + else + { + NetworkCredential networkCredential = new NetworkCredential(); + networkCredential.UserName = this.proxy_usr; + if (!string.IsNullOrEmpty(this.proxy_pwd)) + networkCredential.Password = this.proxy_pwd; + webProxy.Credentials = (ICredentials) networkCredential; + } + httpWebRequest.Proxy = (IWebProxy) webProxy; + this.WriteStatus(" - Custom proxy settings applied!"); + } + else + { + httpWebRequest.Proxy = WebRequest.GetSystemWebProxy(); + httpWebRequest.UseDefaultCredentials = true; + } + byte[] bytes = new UTF8Encoding().GetBytes(soap_xml); + httpWebRequest.ContentType = "text/xml; charset=utf-8"; + httpWebRequest.ContentLength = (long) bytes.Length; + Stream requestStream = httpWebRequest.GetRequestStream(); + requestStream.Write(bytes, 0, bytes.Length); + requestStream.Close(); + Application.DoEvents(); + try + { + string end; + using (Stream responseStream = httpWebRequest.GetResponse().GetResponseStream()) + { + using (StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8)) + end = streamReader.ReadToEnd(); + } + httpWebRequest.Abort(); + Application.DoEvents(); + return end; + } + catch (Exception ex) + { + httpWebRequest.Abort(); + this.WriteStatus(" --- An Error Occurred: " + ex.Message.ToString()); + return (string) null; + } + } + + private void emulateUpdate_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + this.statusbox.Text = ""; + this.WriteStatus("Starting Wii System Update..."); + this.scriptsStrip.Close(); + string str1 = "4362227770"; + string str2 = "13198105123219038"; + string str3 = "1"; + string str4 = e.ClickedItem.Text.Substring(0, 3); + if (str4 == "JAP") + str4 = "JPN"; + string str5 = str4.Substring(0, 2); + string soap_xml = "\n\n\n\n1.0\n" + str2 + "\n" + str1 + "\n" + str4 + "\n" + str5 + "\n\n0000000100000001\n2\n\n\n0000000100000002\n33\n\n\n0000000100000009\n516\n\n" + str3 + "\n\n\n\n"; + this.WriteStatus(" - Sending SOAP Request to NUS..."); + this.WriteStatus(" - Region: " + str4); + string xml = this.SendSOAPRequest(soap_xml); + if (xml != null) + { + this.WriteStatus(" - Recieved Update Info!"); + this.WriteStatus(" - Title information:"); + string contents = ""; + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(xml); + XmlNodeList elementsByTagName = xmlDocument.GetElementsByTagName("TitleVersion"); + for (int i1 = 0; i1 < elementsByTagName.Count; ++i1) + { + XmlNodeList childNodes = elementsByTagName[i1].ChildNodes; + string titleid = ""; + string str6 = ""; + for (int i2 = 0; i2 < childNodes.Count; ++i2) + { + switch (childNodes[i2].Name) + { + case "TitleId": + titleid = childNodes[i2].InnerText; + break; + case "Version": + str6 = childNodes[i2].InnerText; + break; + } + } + this.WriteStatus(string.Format(" - {0} [v{1}]", (object) titleid, (object) str6)); + if (this.NUSDFileExists("database.xml") && !string.IsNullOrEmpty(this.NameFromDatabase(titleid))) + this.WriteStatus(string.Format(" [{0}]", (object) this.NameFromDatabase(titleid))); + contents += string.Format("{0} {1}\n", (object) titleid, (object) this.DisplayBytes(this.NewIntegertoByteArray(Convert.ToInt32(str6), 2), "")); + } + this.WriteStatus(" - Outputting results to NUS script..."); + if (!Directory.Exists(Path.Combine(this.CURRENT_DIR, "scripts"))) + { + Directory.CreateDirectory(Path.Combine(this.CURRENT_DIR, "scripts")); + this.WriteStatus(" - Created 'scripts' directory."); + } + string str7 = Form1.RemoveIllegalCharacters(DateTime.Now.ToShortTimeString()); + System.IO.File.WriteAllText(string.Format(Path.Combine(this.CURRENT_DIR, Path.Combine("scripts", "{0}_Update_{1}_{2}_{3} at {4}.nus")), (object) str4, (object) DateTime.Now.Month, (object) DateTime.Now.Day, (object) DateTime.Now.Year, (object) str7), contents); + this.WriteStatus(" - Script written!"); + this.scriptsLocalMenuEntry.Enabled = false; + this.scriptsWorker.RunWorkerAsync(); + this.WriteStatus(" - Run this script if you feel like downloading the update!"); + } + else + this.WriteStatus(" - Fail."); + } + + private string NameFromDatabase(string titleid) + { + if (titleid == "0000000100000101") + return "MIOS"; + if (titleid == "0000000100000100") + return "BC"; + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.Load("database.xml"); + string[] strArray = new string[4] + { + "SYS", + "IOS", + "VC", + "WW" + }; + foreach (string name in strArray) + { + XmlNodeList elementsByTagName = xmlDocument.GetElementsByTagName(name); + for (int i1 = 0; i1 < elementsByTagName.Count; ++i1) + { + bool flag = false; + XmlNodeList childNodes = elementsByTagName[i1].ChildNodes; + for (int i2 = 0; i2 < childNodes.Count; ++i2) + { + switch (childNodes[i2].Name) + { + case "titleID": + flag = childNodes[i2].InnerText == titleid || childNodes[i2].InnerText.Substring(0, 14) + "XX" == titleid.Substring(0, 14) + "XX" && titleid.Substring(0, 14) != "00000001000000"; + break; + } + } + if (flag) + { + for (int i3 = 0; i3 < childNodes.Count; ++i3) + { + switch (childNodes[i3].Name) + { + case "name": + return childNodes[i3].InnerText; + default: + continue; + } + } + } + } + } + return (string) null; + } + + private void packbox_EnabledChanged(object sender, EventArgs e) => this.saveaswadbtn.Enabled = this.packbox.Enabled; + + private void SaveProxyBtn_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(this.ProxyURL.Text) && string.IsNullOrEmpty(this.ProxyUser.Text) && System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "proxy.txt"))) + { + System.IO.File.Delete(Path.Combine(this.CURRENT_DIR, "proxy.txt")); + this.proxyBox.Visible = false; + this.proxy_usr = ""; + this.proxy_url = ""; + this.proxy_pwd = ""; + this.WriteStatus("Proxy settings deleted!"); + } + else if (string.IsNullOrEmpty(this.ProxyURL.Text) && string.IsNullOrEmpty(this.ProxyUser.Text) && !System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "proxy.txt"))) + { + this.proxyBox.Visible = false; + this.WriteStatus("No proxy settings saved!"); + } + else + { + string contents = ""; + if (!string.IsNullOrEmpty(this.ProxyURL.Text)) + { + contents = contents + this.ProxyURL.Text + "\n"; + this.proxy_url = this.ProxyURL.Text; + } + if (!string.IsNullOrEmpty(this.ProxyUser.Text)) + { + contents += this.ProxyUser.Text; + this.proxy_usr = this.ProxyUser.Text; + } + if (!string.IsNullOrEmpty(contents)) + { + System.IO.File.WriteAllText(Path.Combine(this.CURRENT_DIR, "proxy.txt"), contents); + this.WriteStatus("Proxy settings saved!"); + } + this.proxyBox.Visible = false; + this.SetAllEnabled(false); + this.ProxyVerifyBox.Visible = true; + this.ProxyVerifyBox.Enabled = true; + this.ProxyPwdBox.Enabled = true; + this.SaveProxyBtn.Enabled = true; + this.ProxyVerifyBox.Select(); + } + } + + private void proxySettingsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "proxy.txt"))) + { + string[] strArray = System.IO.File.ReadAllLines(Path.Combine(this.CURRENT_DIR, "proxy.txt")); + this.ProxyURL.Text = strArray[0]; + if (strArray.Length > 1) + this.ProxyUser.Text = strArray[1]; + } + this.proxyBox.Visible = true; + } + + private void SaveProxyPwdButton_Click(object sender, EventArgs e) + { + this.proxy_pwd = this.ProxyPwdBox.Text; + this.ProxyVerifyBox.Visible = false; + this.SetAllEnabled(true); + } + + private void ProxyPwdBox_KeyPress(object sender, KeyPressEventArgs e) + { + if ((int) e.KeyChar != (int) Convert.ToChar((object) Keys.Return)) + return; + this.SaveProxyPwdButton_Click((object) "LOLWUT", EventArgs.Empty); + } + + private void ProxyAssistBtn_Click(object sender, EventArgs e) + { + int num = (int) MessageBox.Show("If you are behind a proxy, set these settings to get through to NUS. If you have an alternate port for accessing your proxy, add ':' followed by the port."); + } + + private void loadNUSScriptToolStripMenuItem_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Multiselect = false; + openFileDialog.Filter = "NUS Scripts|*.nus|All Files|*.*"; + if (Directory.Exists(Path.Combine(this.CURRENT_DIR, "scripts"))) + openFileDialog.InitialDirectory = Path.Combine(this.CURRENT_DIR, "scripts"); + openFileDialog.Title = "Load a NUS/Wiimpersonator script."; + if (openFileDialog.ShowDialog() == DialogResult.Cancel) + return; + string str1 = System.IO.File.ReadAllText(openFileDialog.FileName); + FileInfo fileInfo = new FileInfo(openFileDialog.FileName); + string str2 = str1 + string.Format(";{0}", (object) fileInfo.Name.Replace("." + fileInfo.Extension, "")); + BackgroundWorker backgroundWorker = new BackgroundWorker(); + backgroundWorker.DoWork += new DoWorkEventHandler(this.RunScriptBg); + backgroundWorker.RunWorkerAsync((object) str2); + } + + private void RunScriptBg(object sender, DoWorkEventArgs e) + { + char ch = ';'; + string[] strArray = e.Argument.ToString().Split(ch); + if (strArray.Length < 2) + this.RunScript(strArray[0], "random"); + else + this.RunScript(strArray[0], Form1.RemoveIllegalCharacters(strArray[1])); + } + + private void scriptsbutton_Click(object sender, EventArgs e) + { + this.scriptsStrip.Text = "Showing"; + this.scriptsStrip.Show((Control) this.scriptsbutton, 2, 2 + this.scriptsbutton.Height); + System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); + timer.Interval = 51; + timer.Tick += new EventHandler(this.contextmenusTimer_Tick); + timer.Start(); + } + + private void DatabaseEnabled(bool enabled) + { + for (int index = 0; index < this.databaseStrip.Items.Count; ++index) + { + this.databaseStrip.Items[index].Enabled = enabled; + this.databaseStrip.Items[index].Visible = enabled; + } + for (int index = 0; index < this.VCMenuList.DropDownItems.Count; ++index) + { + this.VCMenuList.DropDownItems[index].Enabled = true; + this.VCMenuList.DropDownItems[index].Visible = true; + } + } + + private void scriptsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) => this.scriptsLocalMenuEntry.Enabled = true; + + private void OrganizeScripts(object sender, DoWorkEventArgs e) + { + if (!Directory.Exists(Path.Combine(this.CURRENT_DIR, "scripts"))) + { + this.WriteStatus("Scripts directory not found..."); + this.WriteStatus("- Creating it."); + Directory.CreateDirectory(Path.Combine(this.CURRENT_DIR, "scripts")); + } + if (this.scriptsLocalMenuEntry.DropDownItems.Count > 0) + { + Control.CheckForIllegalCrossThreadCalls = false; + this.scriptsLocalMenuEntry.DropDownItems.Clear(); + } + foreach (string directory in Directory.GetDirectories(Path.Combine(this.CURRENT_DIR, "scripts"), "*", SearchOption.TopDirectoryOnly)) + { + if (Directory.GetFiles(directory, "*.nus", SearchOption.TopDirectoryOnly).Length > 0) + { + DirectoryInfo directoryInfo = new DirectoryInfo(directory); + ToolStripMenuItem toolStripMenuItem1 = new ToolStripMenuItem(); + toolStripMenuItem1.Text = directoryInfo.Name + (object) Path.DirectorySeparatorChar; + toolStripMenuItem1.Image = (Image) Resources.folder_table; + foreach (string file in Directory.GetFiles(directory, "*.nus", SearchOption.TopDirectoryOnly)) + { + FileInfo fileInfo = new FileInfo(file); + ToolStripMenuItem toolStripMenuItem2 = new ToolStripMenuItem(); + toolStripMenuItem2.Text = fileInfo.Name; + toolStripMenuItem2.Image = (Image) Resources.script_start; + toolStripMenuItem1.DropDownItems.Add((ToolStripItem) toolStripMenuItem2); + toolStripMenuItem2.Click += new EventHandler(this.nus_script_item_Click); + } + this.scriptsLocalMenuEntry.DropDownItems.Add((ToolStripItem) toolStripMenuItem1); + } + } + foreach (string file in Directory.GetFiles(Path.Combine(this.CURRENT_DIR, "scripts"), "*.nus", SearchOption.TopDirectoryOnly)) + { + FileInfo fileInfo = new FileInfo(file); + ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(); + toolStripMenuItem.Text = fileInfo.Name; + toolStripMenuItem.Image = (Image) Resources.script_start; + this.scriptsLocalMenuEntry.DropDownItems.Add((ToolStripItem) toolStripMenuItem); + toolStripMenuItem.Click += new EventHandler(this.nus_script_item_Click); + } + } + + private void aboutNUSDToolStripMenuItem_Click(object sender, EventArgs e) + { + this.statusbox.Text = ""; + this.WriteStatus("NUS Downloader (NUSD)"); + this.WriteStatus("You are running version: " + this.version); + if (this.version.StartsWith("SVN")) + this.WriteStatus("SVN BUILD: DO NOT REPORT BROKEN FEATURES!"); + this.WriteStatus("This application created by WB3000"); + this.WriteStatus("Various contributions by lukegb"); + this.WriteStatus(string.Empty); + if (this.NUSDFileExists("key.bin")) + this.WriteStatus("Wii Decryption: Local (key.bin)"); + if (this.NUSDFileExists("kkey.bin")) + this.WriteStatus("Wii Korea Decryption: Local (kkey.bin)"); + if (this.NUSDFileExists("dsikey.bin")) + this.WriteStatus("DSi Decryption: Local (dsikey.bin)"); + if (!this.NUSDFileExists("database.xml")) + this.WriteStatus("Database (Wii): Need (database.xml)"); + else + this.WriteStatus("Database (Wii): OK"); + if (!this.NUSDFileExists("dsidatabase.xml")) + this.WriteStatus("Database (DSi): Need (dsidatabase.xml)"); + else + this.WriteStatus("Database (DSi): OK"); + if (Form1.IsWin7()) + this.WriteStatus("Windows 7 Features: Enabled"); + this.WriteStatus(""); + this.WriteStatus("Special thanks to:"); + this.WriteStatus(" * Crediar for his wadmaker tool + source, and for the advice!"); + this.WriteStatus(" * Leathl for libWiiSharp."); + this.WriteStatus(" * SquidMan/Galaxy/comex/Xuzz/#WiiDev for advice."); + this.WriteStatus(" * Pasta for impressive database contributions."); + this.WriteStatus(" * Napo7 for testing proxy settings."); + this.WriteStatus(" * Wyatt O'Day for the Windows7ProgressBar Control."); + this.WriteStatus(" * Famfamfam for the Silk Icon Set."); + this.WriteStatus(" * Anyone who has helped beta test!"); + } + + private void checkBox1_CheckedChanged(object sender, EventArgs e) => this.SaveProxyPwdPermanentBtn.Enabled = this.checkBox1.Checked; + + private void SaveProxyPwdPermanentBtn_Click(object sender, EventArgs e) + { + this.proxy_pwd = this.ProxyPwdBox.Text; + string contents = System.IO.File.ReadAllText(Path.Combine(this.CURRENT_DIR, "proxy.txt")) + string.Format("\n{0}", (object) this.proxy_pwd); + System.IO.File.WriteAllText(Path.Combine(this.CURRENT_DIR, "proxy.txt"), contents); + this.ProxyVerifyBox.Visible = false; + this.SetAllEnabled(true); + this.WriteStatus("To delete all traces of proxy settings, delete the proxy.txt file!"); + } + + private void clearButton_MouseEnter(object sender, EventArgs e) => this.clearButton.Text = "Clear"; + + private void clearButton_MouseLeave(object sender, EventArgs e) + { + if (System.Type.GetType("Mono.Runtime") != null) + return; + this.clearButton.Text = string.Empty; + } + + private void saveaswadbtn_MouseEnter(object sender, EventArgs e) => this.saveaswadbtn.Text = "Save As"; + + private void saveaswadbtn_MouseLeave(object sender, EventArgs e) + { + if (System.Type.GetType("Mono.Runtime") != null) + return; + this.saveaswadbtn.Text = string.Empty; + } + + private void nus_script_item_Click(object sender, EventArgs e) + { + ToolStripMenuItem toolStripMenuItem = (ToolStripMenuItem) sender; + string str1 = ""; + if (!toolStripMenuItem.OwnerItem.Equals((object) this.scriptsLocalMenuEntry)) + str1 = Path.Combine(toolStripMenuItem.OwnerItem.Text, str1); + string str2 = System.IO.File.ReadAllText(Path.Combine(this.CURRENT_DIR, Path.Combine("scripts", Path.Combine(str1, toolStripMenuItem.Text)))) + string.Format(";{0}", (object) toolStripMenuItem.Text.Replace(".nus", "")); + BackgroundWorker backgroundWorker = new BackgroundWorker(); + backgroundWorker.DoWork += new DoWorkEventHandler(this.RunScriptBg); + backgroundWorker.RunWorkerAsync((object) str2); + } + + private void saveaswadbtn_Click(object sender, EventArgs e) + { + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Title = "Save WAD File..."; + saveFileDialog.Filter = "WAD Files|*.wad|All Files|*.*"; + saveFileDialog.AddExtension = true; + if (saveFileDialog.ShowDialog() == DialogResult.Cancel) + return; + this.WAD_Saveas_Filename = saveFileDialog.FileName; + } + + private void Form1_FormClosing(object sender, FormClosingEventArgs e) => Environment.Exit(0); + + private void iosPatchCheckbox_CheckedChanged(object sender, EventArgs e) + { + if (!this.iosPatchCheckbox.Checked) + return; + this.packbox.Checked = true; + this.SetAllEnabled(false); + this.iosPatchGroupBox.Visible = true; + this.iosPatchGroupBox.Enabled = true; + this.iosPatchesListBox.Enabled = true; + this.iosPatchGroupBoxOKbtn.Enabled = true; + } + + private void iosPatchGroupBoxOKbtn_Click(object sender, EventArgs e) + { + this.SetAllEnabled(true); + this.iosPatchGroupBox.Visible = false; + if (this.iosPatchesListBox.CheckedIndices.Count != 0) + return; + this.iosPatchCheckbox.Checked = false; + } + + private void FillDatabaseScripts() + { + this.SetPropertyThreadSafe((Component) this.scriptsDatabaseToolStripMenuItem, (object) false, "Visible"); + Database database = new Database(); + database.LoadDatabaseToStream(Path.Combine(this.CURRENT_DIR, "database.xml")); + ToolStripMenuItem[] additionitems = database.LoadScripts(); + for (int index = 0; index < additionitems.Length; ++index) + additionitems[index].Click += new EventHandler(this.ScriptItem_Clicked); + this.AddToolStripItemToStrip(this.scriptsDatabaseToolStripMenuItem, additionitems); + this.SetPropertyThreadSafe((Component) this.scriptsDatabaseToolStripMenuItem, (object) true, "Enabled"); + this.SetPropertyThreadSafe((Component) this.scriptsDatabaseToolStripMenuItem, (object) true, "Visible"); + } + + public void ScriptItem_Clicked(object sender, EventArgs e) + { + ToolStripMenuItem toolStripMenuItem = (ToolStripMenuItem) sender; + string str = toolStripMenuItem.ToolTipText + string.Format(";{0}", (object) toolStripMenuItem.Text); + BackgroundWorker backgroundWorker = new BackgroundWorker(); + backgroundWorker.DoWork += new DoWorkEventHandler(this.RunScriptBg); + backgroundWorker.RunWorkerAsync((object) str); + } + + private void ReorganizePreviousFolderStructure(object sender, DoWorkEventArgs e) + { + Regex regex = new Regex("[a-zA-Z0-9]{16}v?([0-9]*)?"); + if (!Directory.Exists(Path.Combine(this.CURRENT_DIR, "titles"))) + Directory.CreateDirectory(Path.Combine(this.CURRENT_DIR, "titles")); + foreach (string directory in Directory.GetDirectories(this.CURRENT_DIR, "*", SearchOption.TopDirectoryOnly)) + { + DirectoryInfo directoryInfo = new DirectoryInfo(directory); + if (regex.IsMatch(directoryInfo.Name.ToString()) && directoryInfo.Name.Contains("v")) + { + string[] strArray = directoryInfo.Name.Split('v'); + this.WriteStatus("Bitte einen Text eingeben: "); + string str1 = Path.Combine(Path.Combine(this.CURRENT_DIR, "titles"), strArray[0]); + string str2 = Path.Combine(str1, string.Format("{0}", (object) strArray[1])); + if (!Directory.Exists(str1)) + Directory.CreateDirectory(str1); + if (!Directory.Exists(str2)) + Directory.CreateDirectory(str2); + foreach (string file in Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly)) + { + FileInfo fileInfo = new FileInfo(file); + if (!System.IO.File.Exists(Path.Combine(str2, fileInfo.Name))) + fileInfo.MoveTo(Path.Combine(str2, fileInfo.Name)); + } + if (directoryInfo.GetFiles().Length <= 0 && directoryInfo.GetDirectories().Length <= 0) + Directory.Delete(directory); + } + else if (regex.IsMatch(directoryInfo.Name.ToString())) + { + string str3 = Path.Combine(Path.Combine(this.CURRENT_DIR, "titles"), directoryInfo.Name.ToString()); + TMD tmd = new TMD(); + int num = 0; + string[] files = Directory.GetFiles(directory, "*tmd*", SearchOption.TopDirectoryOnly); + if (files.Length <= 1) + { + foreach (string pathToTmd in files) + { + if (pathToTmd.Contains("tmd")) + { + tmd.LoadFile(pathToTmd); + ++num; + } + } + if (num != 0) + { + string str4 = tmd.TitleVersion.ToString(); + string str5 = Path.Combine(str3, string.Format("{0}", (object) str4)); + if (!Directory.Exists(str3)) + Directory.CreateDirectory(str3); + if (!Directory.Exists(str5)) + Directory.CreateDirectory(str5); + foreach (string file in Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly)) + { + FileInfo fileInfo = new FileInfo(file); + if (!System.IO.File.Exists(Path.Combine(str5, fileInfo.Name))) + fileInfo.MoveTo(Path.Combine(str5, fileInfo.Name)); + } + if (directoryInfo.GetFiles().Length <= 0 && directoryInfo.GetDirectories().Length <= 0) + Directory.Delete(directory); + } + } + } + } + } + + private void ReorganizePreviousFolderStructure_Completed( + object sender, + RunWorkerCompletedEventArgs e) + { + this.WriteStatus(" - Operation complete!"); + } + + private void RunScript(string scriptstr, string scriptname) + { + this.SetTextThreadSafe((Control) this.statusbox, ""); + this.WriteStatus("Starting script download. Please be patient!"); + string str = !(scriptname == "random") ? Path.Combine(Path.Combine(this.CURRENT_DIR, "scripts"), scriptname + "_output") : Path.Combine(Path.Combine(this.CURRENT_DIR, "scripts"), this.RandomString(7) + "_output"); + if (!System.IO.File.Exists(str)) + Directory.CreateDirectory(str); + string[] strArray1 = scriptstr.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + this.WriteStatus(string.Format(" - Script loaded ({0} Titles)", (object) strArray1.Length)); + this.WriteStatus(" - Output: " + str.Replace(this.CURRENT_DIR, "")); + for (int index = 0; index < strArray1.Length; ++index) + { + this.WriteStatus(string.Format("===== Running Download ({0}/{1}) =====", (object) (index + 1), (object) strArray1.Length)); + string[] strArray2 = strArray1[index].Split(' '); + if (!string.IsNullOrEmpty(strArray2[0])) + { + WebClient wcReady = this.ConfigureWithProxy(new WebClient()); + wcReady.Headers.Add("User-Agent", "wii libnup/1.0"); + NusClient nusClient = new NusClient(); + nusClient.ConfigureNusClient(wcReady); + nusClient.UseLocalFiles = this.localuse.Checked; + nusClient.ContinueWithoutTicket = true; + nusClient.Debug += new EventHandler(this.nusClient_Debug); + StoreType[] storeTypeArray = new StoreType[1] + { + StoreType.All + }; + int num = int.Parse(strArray2[1], NumberStyles.HexNumber); + string titlename = this.NameFromDatabase(strArray2[0]); + string wadName; + if (titlename != null) + wadName = this.OfficialWADNaming(titlename); + else + wadName = strArray2[0] + "-NUS-v" + (object) num + ".wad"; + nusClient.DownloadTitle(strArray2[0], num.ToString(), str, this.pathbox.Checked, wadName, storeTypeArray); + } + } + this.WriteStatus("Script completed!"); + } + + private string RandomString(int size) + { + char[] chArray = new char[size]; + for (int index = 0; index < size; ++index) + chArray[index] = "abcdefghijklmnopqrstuvwxyz"[this._rng.Next("abcdefghijklmnopqrstuvwxyz".Length)]; + return new string(chArray); + } + + private void Form1_MouseWheel(object sender, MouseEventArgs e) + { + if (!this.SystemMenuList.DropDown.DisplayRectangle.Contains(e.Location) && !this.SystemMenuList.DropDown.Bounds.Contains(e.Location) && !this.WiiWareMenuList.DropDown.DisplayRectangle.Contains(e.Location) && !this.WiiWareMenuList.DropDown.Bounds.Contains(e.Location) && !this.VCMenuList.DropDown.DisplayRectangle.Contains(e.Location) && !this.VCMenuList.DropDown.Bounds.Contains(e.Location) && !this.IOSMenuList.DropDown.DisplayRectangle.Contains(e.Location) && !this.IOSMenuList.DropDown.Bounds.Contains(e.Location)) + return; + if (e.Delta > 0) + { + SendKeys.Send("{UP}"); + SendKeys.Send("{UP}"); + SendKeys.Send("{UP}"); + SendKeys.Send("{UP}"); + SendKeys.Send("{UP}"); + } + else + { + SendKeys.Send("{DOWN}"); + SendKeys.Send("{DOWN}"); + SendKeys.Send("{DOWN}"); + SendKeys.Send("{DOWN}"); + SendKeys.Send("{DOWN}"); + } + } + + private void openNUSDDirectoryToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start(this.CURRENT_DIR); + + private void mainPageToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("http://www.wiibrew.org/wiki/NUS_Downloader"); + + private void databasePageToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("http://www.wiibrew.org/wiki/NUS_Downloader/database"); + + private void extrasStrip_Opening(object sender, CancelEventArgs e) => this.moreExtrasToolStripMenuItem.Visible = Control.ModifierKeys == Keys.Control; + + private void runFolderFixToolStripMenuItem_Click(object sender, EventArgs e) + { + BackgroundWorker backgroundWorker = new BackgroundWorker(); + backgroundWorker.DoWork += new DoWorkEventHandler(this.ReorganizePreviousFolderStructure); + backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.ReorganizePreviousFolderStructure_Completed); + this.WriteStatus("Organizing your old folder structure..."); + backgroundWorker.RunWorkerAsync(); + } + + private void removeNUSDFilesFoldersToolStripMenuItem_Click(object sender, EventArgs e) + { + if (MessageBox.Show("This will delete all the files\folders you have downloaded from NUS! Are you sure you want to do this?", "Wait a second!", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) != DialogResult.Yes) + return; + if (Directory.Exists(Path.Combine(this.CURRENT_DIR, "titles"))) + Directory.Delete(Path.Combine(this.CURRENT_DIR, "titles"), true); + if (Directory.Exists(Path.Combine(this.CURRENT_DIR, "scripts"))) + Directory.Delete(Path.Combine(this.CURRENT_DIR, "scripts"), true); + if (System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "database.xml"))) + System.IO.File.Delete(Path.Combine(this.CURRENT_DIR, "database.xml")); + if (System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "dsidatabase.xml"))) + System.IO.File.Delete(Path.Combine(this.CURRENT_DIR, "dsidatabase.xml")); + if (System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "olddatabase.xml"))) + System.IO.File.Delete(Path.Combine(this.CURRENT_DIR, "olddatabase.xml")); + if (System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "proxy.txt"))) + System.IO.File.Delete(Path.Combine(this.CURRENT_DIR, "proxy.txt")); + if (System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "key.bin"))) + System.IO.File.Delete(Path.Combine(this.CURRENT_DIR, "key.bin")); + if (System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "kkey.bin"))) + System.IO.File.Delete(Path.Combine(this.CURRENT_DIR, "kkey.bin")); + if (!System.IO.File.Exists(Path.Combine(this.CURRENT_DIR, "dsikey.bin"))) + return; + System.IO.File.Delete(Path.Combine(this.CURRENT_DIR, "dsikey.bin")); + } + + private void anyStrip_Closed(object sender, ToolStripDropDownClosedEventArgs e) => ((Control) sender).Text = "Hidden"; + + private void localTicketInventoryToolStripMenuItem_Click(object sender, EventArgs e) + { + this.WriteStatus("Adding ticket information to database entries..."); + ToolStripMenuItem[] toolStripMenuItemArray = new ToolStripMenuItem[6] + { + this.SystemMenuList, + this.IOSMenuList, + this.VCMenuList, + this.WiiWareMenuList, + this.dsiSystemToolStripMenu, + this.dSiWareToolStripMenu + }; + for (int index1 = 0; index1 < toolStripMenuItemArray.Length; ++index1) + { + for (int index2 = 0; index2 < toolStripMenuItemArray[index1].DropDownItems.Count; ++index2) + { + if (toolStripMenuItemArray[index1].DropDownItems[index2].Text.Length >= 16) + { + string path2 = toolStripMenuItemArray[index1].DropDownItems[index2].Text.Substring(0, 16); + string path = Path.Combine(Path.Combine(this.CURRENT_DIR, "titles"), path2); + if (Directory.Exists(path) && Directory.GetFiles(path, "cetk", SearchOption.AllDirectories).Length > 0) + { + if (toolStripMenuItemArray[index1].DropDownItems[index2].Image == Database.green) + toolStripMenuItemArray[index1].DropDownItems[index2].Image = Database.green_blue; + if (toolStripMenuItemArray[index1].DropDownItems[index2].Image == Database.orange) + toolStripMenuItemArray[index1].DropDownItems[index2].Image = Database.orange_blue; + if (toolStripMenuItemArray[index1].DropDownItems[index2].Image == Database.redorange) + toolStripMenuItemArray[index1].DropDownItems[index2].Image = Database.redorange_blue; + if (toolStripMenuItemArray[index1].DropDownItems[index2].Image == Database.redgreen) + toolStripMenuItemArray[index1].DropDownItems[index2].Image = Database.redgreen_blue; + } + } + } + } + this.WriteStatus(" - Operation completed!"); + } + + private void donateToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("http://wb3000.atspace.name/donations.html"); + + private void DSiDatabaseWork(object sender, DoWorkEventArgs e) + { + while (this.databaseWorker.IsBusy) + Thread.Sleep(1000); + this.FillDSiDatabaseStrip(sender as BackgroundWorker); + this.LoadRegionCodes(); + this.ShowInnerToolTips(false); + } + + private void DSiDatabaseWork_Completed(object sender, RunWorkerCompletedEventArgs e) + { + this.databaseButton.Text = "Database..."; + this.databaseButton.Image = (Image) null; + } + + private void DSiDatabaseWork_ProgressChanged(object sender, ProgressChangedEventArgs e) + { + if (e.ProgressPercentage == 50) + { + this.databaseButton.Text = " [. ]"; + } + else + { + if (e.ProgressPercentage != 100) + return; + this.databaseButton.Text = " [..]"; + } + } + + private void wiiRegionCodesMenu_DropDownItemClicked( + object sender, + ToolStripItemClickedEventArgs e) + { + if (this.titleidbox.Text.Length != 16) + return; + this.titleidbox.Text = this.titleidbox.Text.Substring(0, 14) + e.ClickedItem.Text.Substring(0, 2); + } + + private void dsiRegionCodesMenu_DropDownItemClicked( + object sender, + ToolStripItemClickedEventArgs e) + { + if (this.titleidbox.Text.Length != 16) + return; + this.titleidbox.Text = this.titleidbox.Text.Substring(0, 14) + e.ClickedItem.Text.Substring(0, 2); + } + + private void serverLbl_MouseEnter(object sender, EventArgs e) => this.serverLbl.Font = new Font(this.serverLbl.Font, FontStyle.Underline); + + private void serverLbl_MouseLeave(object sender, EventArgs e) => this.serverLbl.Font = new Font(this.serverLbl.Font, FontStyle.Regular); + + private void serverLbl_TextChanged(object sender, EventArgs e) + { + if (this.serverLbl.Text == "Wii") + this.packbox.Enabled = true; + if (!(this.serverLbl.Text == "DSi")) + return; + this.packbox.Checked = false; + this.packbox.Enabled = false; + this.wadnamebox.Enabled = false; + this.wadnamebox.Text = ""; + } + + private void serverLbl_Click(object sender, EventArgs e) + { + string[] strArray = new string[2]{ "Wii", "DSi" }; + for (int index = 0; index < strArray.Length; ++index) + { + if (this.serverLbl.Text == strArray[index]) + { + if (strArray.Length == index + 1) + { + this.serverLbl.Text = strArray[0]; + break; + } + this.serverLbl.Text = strArray[index + 1]; + break; + } + } + } + + private delegate void AddToolStripItemToStripCallback( + ToolStripMenuItem menulist, + ToolStripMenuItem[] additionitems); + + private delegate void WriteStatusCallback(string Update, Color writecolor); + + private delegate void BootChecksCallback(); + + private delegate void SetEnableForDownloadCallback(bool enabled); + + private delegate void SetPropertyThreadSafeCallback( + Component what, + object setto, + string property); + + private delegate string OfficialWADNamingCallback(string whut); + } +} diff --git a/NUS_Downloader/Form1.resx b/NUS_Downloader/Form1.resx new file mode 100644 index 0000000..e9953c8 --- /dev/null +++ b/NUS_Downloader/Form1.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////8AAAAAAB///wAAAAAAH///AAAAAAAf//8AAAAAAA///wAAAAAAD//+AAAAAAAP//4AAAAAAA///gAAAAAAD//+AAAAAAAP//4AAAAAAA///gAAAAAAD//+AAAAAAAP//4AAAAAAA///gAAAAAAD//+AAAAAAAP//4AAAAAAA///gAAAAAAD//+AAAAAAAP//4AAAAAAA///gAAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAB//+AAAAAAAH//4AAAAAAAf//gAAAAAAD///AAAAAAAP//8AAAAAAB///wAAAAAAH///gAAAAAAf//+AAAAAAD///8AAAAAAP///wAAAAAA////AAAAAAH///+AAAAAAf///4AAAAAD/////AAAAH/////4AAAAP/////AAAAAf////4AAAAA/////AAAAAB////8AAAAAH////wAAAAAf////AAAAAB////8AAAAAH////4AAAAA//////wAAH///////AAAf//////8AAB///////wAAH///////AAAf//////8AAB///////wAAH///////AAAf//////8AAB///////wAAH///////AAAf//////8AAB//////////////ygAAACAAAAAAAEAAAEAIAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAwAAAAUAAAAHAAAACQAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACQAAAAcAAAAFAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAUAAAAKAAAAEgAAABcAAAAcAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB4AAAAcAAAAFwAAABEAAAAKAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAADAAAABcAAAAkAAAAMAAAADkAAAA9AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAA+AAAAPQAAADkAAAAwAAAAJAAAABcAAAAMAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAgAAAAUAAAAKAAAAD8AAABSAAAAYAAAAGYAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABoAAAAaAAAAGgAAABmAAAAYAAAAFMAAAA/AAAAKAAAABUAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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/3264f99uuH/fbrh/3264f99uuH/fbrh/3264f99uuH/fbrh/3664f9+uuH/frrh/3664f9+uuH/frrh/3664f92stb/c67S/3664f9+uuH/f7vi/3+74v9/u+L/f7vi/3Gv2f9Pj8X/b67Z/0WPzf8ybp6sAAAAMwAAABcAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAUAAAALjBqmJ5Gkc7/ebjf/3Gv2v9Qkcb/ca/a/3q54P96ueD/erng/3q54P96ueD/a6fL/zhrgv9Zk7L/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P97ueD/e7ng/3u54P97ueD/e7ng/3u54P97ueD/e7ng/3u54P97ueD/e7ng/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3264f99uuH/fbrh/3264f99uuH/fbrh/0p/mf87bIL/fbrh/3264f99uuH/frrh/3664f9npdL/WpnK/3q53/9+uuH/RpHO/zJsna4AAAA1AAAAGQAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAABUAAAAvNXGhqUmTz/95t9//ebff/3a03f9Wl8n/ZqXT/3m43/95uN//ebjf/3m43/95uN//aaXJ/3Wy2f95uN//ebjf/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/k8jn/5PI5/+f0Or/ptTs/5PI5/+TyOf/k8jn/5PI5/+TyOf/k8jn/5PI5/+SyOf/ksjn/5LH5v+Rx+b/kcfm/5DH5v+Qx+b/kMfm/5TK5/+h0+z/odPs/6HS7P+g0uz/ksnn/43G5v+Mxub/jMbm/4vG5f+Lxub/i8bm/4vF5f+Lxeb/i8Xm/4rF5v+Kxeb/icTm/4fB5f98uuH/fLrh/3y64f98uuH/dLDV/3Cs0P98uuH/fLrh/3y64f96uN7/XJvM/2em0v99uuH/fbrh/3264f9Jk8//P4K51wAAADcAAAAbAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFQAAADA5c6KqSpXQ/3i33/94t9//eLff/3i33/9mpdP/W5vN/3m33/95t9//ebff/3m33/95t9//ebff/3m33/95t9//ebff/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P97ueD/e7ng/3u54P97ueD/e7ng/3u54P97ueD/e7ng/3u54P97ueD/e7ng/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/erfe/1yazP9zsdv/fLrh/3y64f98uuH/fLrh/1Sb0v9Dg7rXAAAAOQAAABsAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAWAAAAMTdzoatMl9H/eLbf/3i23/94tt//eLbf/3i23/9vrtr/ca3W/63c8P+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/7Le8v+y3vL/st7y/6TU7P9fns7/ebfe/3u54P97ueD/fLrh/3y64f98uuH/WZ/U/0KEuNgAAAA7AAAAHQAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAABcAAAAzOHOgrE6Y0v93tt7/d7be/3e23v93tt7/d7be/3e23v+Uyuj/jcTi/53P6f+t3PH/rt3x/7Dd8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/sd7y/7He8v+x3vL/r93x/63d8f+Xy+b/mMzn/3q54P96ueD/erng/3q54P96ueD/e7ng/3u54P9aodX/Q4a42QAAAD0AAAAeAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAGQAAADQ7dJ+tWJ7T/3a13v92td7/crHZ/0h+m/9alrf/drXe/5PK6P+dz+n/ZaLQ/2uo0v9xrdX/drLY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P94s9j/eLPY/3iz2P90sNb/bKrS/3242/+x3fH/erng/3q54P96ueD/TISg/1KKqf96ueD/erng/1yh1v9Mk8v2AAAAPwAAACAAAAALAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAZAAAANUOBsMJbodb/dbTe/3W03v9xsNn/SYCf/1yYu/91tN7/k8ro/53Q6/9pqdb/b67a/3Wy3f96ud7/fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLrf/3y63/98ut//fLnf/3e13f9xsNv/gLvg/7Dd8f96ueD/erng/3q54P9UjKv/Vo6s/3q54P96ueD/Z6ra/1Ob0v8AAABBAAAAIQAAAAwAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABoAAAA3Soq81l2i1v91tN7/dbTe/3W03v91tN7/dbTe/3W03v+Tyej/ndDr/2io2P9urdr/dbPd/3q43/98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/fLrh/3y64f98uuH/d7Xd/3Cv3P+Au+H/sN3x/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/9nqtr/VZvS/wAAAEQAAAAjAAAADQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGwAAADdLir3XXqPX/3Sz3f90s93/h8Di/3Sz3f90s93/dLPd/5LJ5/+d0Ov/Z6fX/22s2v9zst3/ebff/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P96ueD/erng/3q54P92tN3/b67b/3664f+v3fH/ebff/3m33/95t9//ebff/3m33/95t9//ebff/2ir2v9XndP/AAAARgAAACUAAAAOAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAbAAAAOU2MvddgpNf/c7Pd/3Oz3f+TyOb/c7Pd/3Oz3f9zs93/kcjn/5zP6/9mptb/a6vZ/3Kx3f94tt7/ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3m43/95uN//ebjf/3Wz3f9trNr/fbng/67d8f94t9//eLff/3i33/90st3/eLff/3i33/94t9//a6zb/1mf1P8gOlBgAAAAJwAAABAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAB0AAAA7To6+2GKm2P9yst3/crLd/4vE5f9yst3/crLd/3Ky3f+Qx+f/m8/q/2Wl1v9qqtn/cK/c/3a03v94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94t9//eLff/3i33/94tt//c7Ld/2us2v98ud//rt3x/3i23/94tt//eLbf/3Cw2/94tt//eLbf/3i23/9wsd3/W6HV/zBbeHkAAAApAAAAEQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAHgAAADxPj7/YZ6ra/3Gx3f9xsd3/i8Tl/3664f9yst3/crLd/5DH5/+azur/aqjX/3ay3P97t97/gLrg/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v+DvOL/g7zi/4O84v99ud//dLHc/3q43v+t3PH/drXe/3e23v93tt7/b6/a/3W03f93tt7/d7be/3Cx3f9dotb/MFx5egAAACsAAAASAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/zWKNf81ijX/NYo1/xt9G/8AbgDiAFUALQAAAAgAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAUAQAAYAF4ASQBgAEoAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABeAEwAXgBMAF4ATABfAEsAYABKAF4ASQBDABcAAAAFAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////////////////////////////////////////////////////////////////gAAAAAAAAAAAAH///////AAAAAAAAAAAAAAP//////wAAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAf/////+AAAAAAAAAAAAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAAf/////+AAAAAAAAAAAAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAAf/////+AAAAAAAAAAAAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAAf/////+AAAAAAAAAAAAAAH//////gAAAAAAAAAAAAAB//////4AAAAAAAAAAAAAAf/////+AAAAAAAAAAAAAAH//////gAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAP/////+AAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAP/////+AAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAP/////+AAAAAAAAAAAAAAD//////gAAAAAAAAAAAAAA//////4AAAAAAAAAAAAAAP/////8AAAAAAAAAAAAAAD//////AAAAAAAAAAAAAAA//////wAAAAAAAAAAAAAAP/////8AAAAAAAAAAAAAAD//////AAAAAAAAAAAAAAA//////wAAAAAAAAAAAAAAP/////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAH/////8AAAAAAAAAAAAAAB//////gAAAAAAAAAAAAAAf/////4AAAAAAAAAAAAAAP/////+AAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAf//////AAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAD//////+AAAAAAAAAAAAAA///////gAAAAAAAAAAAAAP//////8AAAAAAAAAAAAAH///////AAAAAAAAAAAAAB///////4AAAAAAAAAAAAA///////+AAAAAAAAAAAAAP///////gAAAAAAAAAAAAD///////8AAAAAAAAAAAAB////////AAAAAAAAAAAAAf///////wAAAAAAAAAAAAH///////+AAAAAAAAAAAAD////////gAAAAAAAAAAAA////////4AAAAAAAAAAAAP////////AAAAAAAAAAAAH////////4AAAAAAAAAAAD//////////gAAAAAAAAH///////////8AAAAAAAAD///////////+AAAAAAAAAf///////////AAAAAAAAAD///////////AAAAAAAAAAf//////////gAAAAAAAAAB//////////wAAAAAAAAAAP/////////4AAAAAAAAAAB/////////8AAAAAAAAAAAP/////////AAAAAAAAAAAD/////////wAAAAAAAAAAA/////////8AAAAAAAAAAAP/////////AAAAAAAAAAAD/////////wAAAAAAAAAAA/////////8AAAAAAAAAAAP/////////AAAAAAAAAAAD/////////wAAAAAAAAAAA/////////8AAAAAAAAAAAP/////////AAAAAAAAAAAD////////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////gAAAAAf/////////////////////////////////////////////////8L + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJhd2luZy5CaXRtYXABAAAABERhdGEHAgIAAAAJAwAAAA8DAAAApw0AAAKJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAIcPAACMDwAA/VIAAIFAAAB9eQAA6YsAADzlAAAZzHM8hXcAAAo5aUNDUFBob3Rvc2hvcCBJQ0MgcHJvZmlsZQAASMedlndUVNcWh8+9d3qhzTACUobeu8AA0nuTXkVhmBlgKAMOMzSxIaICEUVEmiJIUMSA0VAkVkSxEBRUsAckCCgxGEVULG9G1ouurLz38vL746xv7bP3ufvsvc9aFwCSpy+XlwZLAZDKE/CDPJzpEZFRdOwAgAEeYIApAExWRrpfsHsIEMnLzYWeIXICXwQB8HpYvAJw09AzgE4H/5+kWel8geiYABGbszkZLBEXiDglS5Auts+KmBqXLGYYJWa+KEERy4k5YZENPvsssqOY2ak8tojFOaezU9li7hXxtkwhR8SIr4gLM7mcLBHfErFGijCVK+I34thUDjMDABRJbBdwWIkiNhExiR8S5CLi5QDgSAlfcdxXLOBkC8SXcklLz+FzExIFdB2WLt3U2ppB9+RkpXAEAsMAJiuZyWfTXdJS05m8HAAW7/xZMuLa0kVFtjS1trQ0NDMy/apQ/3Xzb0rc20V6Gfi5ZxCt/4vtr/zSGgBgzIlqs/OLLa4KgM4tAMjd+2LTOACApKhvHde/ug9NPC+JAkG6jbFxVlaWEZfDMhIX9A/9T4e/oa++ZyQ+7o/y0F058UxhioAurhsrLSVNyKdnpDNZHLrhn4f4Hwf+dR4GQZx4Dp/DE0WEiaaMy0sQtZvH5gq4aTw6l/efmvgPw/6kxbkWidL4EVBjjIDUdSpAfu0HKAoRINH7xV3/o2+++DAgfnnhKpOLc//vN/1nwaXiJYOb8DnOJSiEzhLyMxf3xM8SoAEBSAIqkAfKQB3oAENgBqyALXAEbsAb+IMQEAlWAxZIBKmAD7JAHtgECkEx2An2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 + + \ No newline at end of file diff --git a/NUS_Downloader/Program.cs b/NUS_Downloader/Program.cs new file mode 100644 index 0000000..2ec4db3 --- /dev/null +++ b/NUS_Downloader/Program.cs @@ -0,0 +1,49 @@ +// Decompiled with JetBrains decompiler +// Type: NUS_Downloader.Program +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace NUS_Downloader +{ + internal static class Program + { + [DllImport("user32.dll")] + public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); + + [DllImport("user32.dll")] + private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + + [STAThread] + private static void Main(string[] args) + { + if (args.Length != 0) + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run((Form) new Form1(args)); + } + else + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run((Form) new Form1()); + } + } + + public static void setConsoleWindowVisibility(bool visible, string title) + { + IntPtr window = Program.FindWindow((string) null, title); + if (!(window != IntPtr.Zero)) + return; + if (!visible) + Program.ShowWindow(window, 0); + else + Program.ShowWindow(window, 1); + } + } +} diff --git a/NUS_Downloader/Properties/Resources.cs b/NUS_Downloader/Properties/Resources.cs new file mode 100644 index 0000000..5c2a602 --- /dev/null +++ b/NUS_Downloader/Properties/Resources.cs @@ -0,0 +1,123 @@ +// Decompiled with JetBrains decompiler +// Type: NUS_Downloader.Properties.Resources +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + +namespace NUS_Downloader.Properties +{ + [CompilerGenerated] + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [DebuggerNonUserCode] + internal class Resources + { + private static ResourceManager resourceMan; + private static CultureInfo resourceCulture; + + internal Resources() + { + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager + { + get + { + if (object.ReferenceEquals((object) NUS_Downloader.Properties.Resources.resourceMan, (object) null)) + NUS_Downloader.Properties.Resources.resourceMan = new ResourceManager("NUS_Downloader.Properties.Resources", typeof (NUS_Downloader.Properties.Resources).Assembly); + return NUS_Downloader.Properties.Resources.resourceMan; + } + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture + { + get => NUS_Downloader.Properties.Resources.resourceCulture; + set => NUS_Downloader.Properties.Resources.resourceCulture = value; + } + + internal static Bitmap arrow_ticker => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (arrow_ticker), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bin_closed => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bin_closed), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap box => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (box), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bug_add => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bug_add), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bullet_green => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bullet_green), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bullet_green_blue => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bullet_green_blue), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bullet_orange => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bullet_orange), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bullet_orange_blue => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bullet_orange_blue), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bullet_red => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bullet_red), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bullet_redgreen => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bullet_redgreen), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bullet_redgreen_blue => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bullet_redgreen_blue), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bullet_redorange => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bullet_redorange), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap bullet_redorange_blue => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (bullet_redorange_blue), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap connect => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (connect), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap database_save => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (database_save), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap disk => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (disk), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap drive_disk => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (drive_disk), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap dsi16x16 => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (dsi16x16), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap folder => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (folder), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap folder_table => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (folder_table), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap help => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (help), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap information => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (information), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap key => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (key), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap money => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (money), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap package => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (package), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap package_add => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (package_add), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap package_delete => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (package_delete), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap package_green => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (package_green), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap page_white_magnify => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (page_white_magnify), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap picture_empty => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (picture_empty), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap script_code => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (script_code), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap script_code_red => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (script_code_red), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap script_go => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (script_go), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap script_start => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (script_start), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap server_connect => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (server_connect), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap server_link => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (server_link), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap wii16x16 => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (wii16x16), NUS_Downloader.Properties.Resources.resourceCulture); + + internal static Bitmap wrench => (Bitmap) NUS_Downloader.Properties.Resources.ResourceManager.GetObject(nameof (wrench), NUS_Downloader.Properties.Resources.resourceCulture); + } +} diff --git a/NUS_Downloader/Properties/Resources.resx b/NUS_Downloader/Properties/Resources.resx new file mode 100644 index 0000000..60e32bc --- /dev/null +++ b/NUS_Downloader/Properties/Resources.resx @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 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 + + \ No newline at end of file diff --git a/NUS_Downloader/Properties/Settings.cs b/NUS_Downloader/Properties/Settings.cs new file mode 100644 index 0000000..d55da69 --- /dev/null +++ b/NUS_Downloader/Properties/Settings.cs @@ -0,0 +1,21 @@ +// Decompiled with JetBrains decompiler +// Type: NUS_Downloader.Properties.Settings +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System.CodeDom.Compiler; +using System.Configuration; +using System.Runtime.CompilerServices; + +namespace NUS_Downloader.Properties +{ + [CompilerGenerated] + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed class Settings : ApplicationSettingsBase + { + private static Settings defaultInstance = (Settings) SettingsBase.Synchronized((SettingsBase) new Settings()); + + public static Settings Default => Settings.defaultInstance; + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..d7baa3c --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# NUS Downloader + +This is v1.9 Mod of the NUS Downloader by [hamachi-mp](https://forum.wii-homebrew.com/index.php/Thread/31411-NUS-Downloader-v1-9-mod/). The original version was made by [WB3000](https://github.com/WB3000/nusdownloader). The mod's source code was never made public so the EXE has been decompiled with [dotPeek](https://www.jetbrains.com/decompiler/). + +NUS Downloader is licensed under the GNU GPL v3. + +## Changelog +### v1.9 Mod +* Based on NUS r122 +* Checkbox to use the folder structure of NUSD v1.5 +* Fixed script creation on "Emulate Update" + +### Older versions +See [WiiBrew](https://wiibrew.org/wiki/NUS_Downloader#Update_History). diff --git a/libWiiSharp/CertificateChain.cs b/libWiiSharp/CertificateChain.cs new file mode 100644 index 0000000..3a001ae --- /dev/null +++ b/libWiiSharp/CertificateChain.cs @@ -0,0 +1,433 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.CertificateChain +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.IO; +using System.Security.Cryptography; + +namespace libWiiSharp +{ + public class CertificateChain : IDisposable + { + private const string certCaHash = "5B7D3EE28706AD8DA2CBD5A6B75C15D0F9B6F318"; + private const string certCpHash = "6824D6DA4C25184F0D6DAF6EDB9C0FC57522A41C"; + private const string certXsHash = "09787045037121477824BC6A3E5E076156573F8A"; + private SHA1 sha = SHA1.Create(); + private bool[] certsComplete = new bool[3]; + private byte[] certCa = new byte[1024]; + private byte[] certCp = new byte[768]; + private byte[] certXs = new byte[768]; + private bool isDisposed; + + public bool CertsComplete => this.certsComplete[0] && this.certsComplete[1] && this.certsComplete[2]; + + ~CertificateChain() => this.Dispose(false); + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing && !this.isDisposed) + { + this.sha.Clear(); + this.sha = (SHA1) null; + this.certsComplete = (bool[]) null; + this.certCa = (byte[]) null; + this.certCp = (byte[]) null; + this.certXs = (byte[]) null; + } + this.isDisposed = true; + } + + public static CertificateChain Load(string pathToCert) => CertificateChain.Load(File.ReadAllBytes(pathToCert)); + + public static CertificateChain Load(byte[] certFile) + { + CertificateChain certificateChain = new CertificateChain(); + MemoryStream certFile1 = new MemoryStream(certFile); + try + { + certificateChain.parseCert((Stream) certFile1); + } + catch + { + certFile1.Dispose(); + throw; + } + certFile1.Dispose(); + return certificateChain; + } + + public static CertificateChain Load(Stream cert) + { + CertificateChain certificateChain = new CertificateChain(); + certificateChain.parseCert(cert); + return certificateChain; + } + + public static CertificateChain FromTikTmd(string pathToTik, string pathToTmd) => CertificateChain.FromTikTmd(File.ReadAllBytes(pathToTik), File.ReadAllBytes(pathToTmd)); + + public static CertificateChain FromTikTmd(string pathToTik, byte[] tmdFile) => CertificateChain.FromTikTmd(File.ReadAllBytes(pathToTik), tmdFile); + + public static CertificateChain FromTikTmd(byte[] tikFile, byte[] tmdFile) + { + CertificateChain certificateChain = new CertificateChain(); + MemoryStream tik = new MemoryStream(tikFile); + try + { + certificateChain.grabFromTik((Stream) tik); + } + catch + { + tik.Dispose(); + throw; + } + MemoryStream tmd = new MemoryStream(tmdFile); + try + { + certificateChain.grabFromTmd((Stream) tmd); + } + catch + { + tmd.Dispose(); + throw; + } + tmd.Dispose(); + return certificateChain.CertsComplete ? certificateChain : throw new Exception("Couldn't locate all certs!"); + } + + public static CertificateChain FromTikTmd(Stream tik, Stream tmd) + { + CertificateChain certificateChain = new CertificateChain(); + certificateChain.grabFromTik(tik); + certificateChain.grabFromTmd(tmd); + return certificateChain; + } + + public void LoadFile(string pathToCert) => this.LoadFile(File.ReadAllBytes(pathToCert)); + + public void LoadFile(byte[] certFile) + { + MemoryStream certFile1 = new MemoryStream(certFile); + try + { + this.parseCert((Stream) certFile1); + } + catch + { + certFile1.Dispose(); + throw; + } + certFile1.Dispose(); + } + + public void LoadFile(Stream cert) => this.parseCert(cert); + + public void LoadFromTikTmd(string pathToTik, string pathToTmd) => this.LoadFromTikTmd(File.ReadAllBytes(pathToTik), File.ReadAllBytes(pathToTmd)); + + public void LoadFromTikTmd(string pathToTik, byte[] tmdFile) => this.LoadFromTikTmd(File.ReadAllBytes(pathToTik), tmdFile); + + public void LoadFromTikTmd(byte[] tikFile, byte[] tmdFile) + { + MemoryStream tik = new MemoryStream(tikFile); + try + { + this.grabFromTik((Stream) tik); + } + catch + { + tik.Dispose(); + throw; + } + MemoryStream tmd = new MemoryStream(tmdFile); + try + { + this.grabFromTmd((Stream) tmd); + } + catch + { + tmd.Dispose(); + throw; + } + tmd.Dispose(); + if (!this.CertsComplete) + throw new Exception("Couldn't locate all certs!"); + } + + public void LoadFromTikTmd(Stream tik, Stream tmd) + { + this.grabFromTik(tik); + this.grabFromTmd(tmd); + } + + public void Save(string savePath) + { + if (File.Exists(savePath)) + File.Delete(savePath); + using (FileStream writeStream = new FileStream(savePath, FileMode.Create)) + this.writeToStream((Stream) writeStream); + } + + public MemoryStream ToMemoryStream() + { + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + return writeStream; + } + + public byte[] ToByteArray() + { + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + byte[] array = writeStream.ToArray(); + writeStream.Dispose(); + return array; + } + + private void writeToStream(Stream writeStream) + { + this.fireDebug("Writing Certificate Chain..."); + if (!this.CertsComplete) + { + this.fireDebug(" Certificate Chain incomplete..."); + throw new Exception("At least one certificate is missing!"); + } + writeStream.Seek(0L, SeekOrigin.Begin); + this.fireDebug(" Writing Certificate CA... (Offset: 0x{0})", (object) writeStream.Position.ToString("x8")); + writeStream.Write(this.certCa, 0, this.certCa.Length); + this.fireDebug(" Writing Certificate CP... (Offset: 0x{0})", (object) writeStream.Position.ToString("x8")); + writeStream.Write(this.certCp, 0, this.certCp.Length); + this.fireDebug(" Writing Certificate XS... (Offset: 0x{0})", (object) writeStream.Position.ToString("x8")); + writeStream.Write(this.certXs, 0, this.certXs.Length); + this.fireDebug("Writing Certificate Chain Finished..."); + } + + private void parseCert(Stream certFile) + { + this.fireDebug("Parsing Certificate Chain..."); + int offset = 0; + for (int index = 0; index < 3; ++index) + { + this.fireDebug(" Scanning at Offset 0x{0}:", (object) offset.ToString("x8")); + try + { + certFile.Seek((long) offset, SeekOrigin.Begin); + byte[] array = new byte[1024]; + certFile.Read(array, 0, array.Length); + this.fireDebug(" Checking for Certificate CA..."); + if (this.isCertCa(array) && !this.certsComplete[1]) + { + this.fireDebug(" Certificate CA detected..."); + this.certCa = array; + this.certsComplete[1] = true; + offset += 1024; + continue; + } + this.fireDebug(" Checking for Certificate CP..."); + if (this.isCertCp(array) && !this.certsComplete[2]) + { + this.fireDebug(" Certificate CP detected..."); + Array.Resize(ref array, 768); + this.certCp = array; + this.certsComplete[2] = true; + offset += 768; + continue; + } + this.fireDebug(" Checking for Certificate XS..."); + if (this.isCertXs(array)) + { + if (!this.certsComplete[0]) + { + this.fireDebug(" Certificate XS detected..."); + Array.Resize(ref array, 768); + this.certXs = array; + this.certsComplete[0] = true; + offset += 768; + continue; + } + } + } + catch (Exception ex) + { + this.fireDebug("Error: {0}", (object) ex.Message); + } + offset += 768; + } + if (!this.CertsComplete) + { + this.fireDebug(" Couldn't locate all Certificates..."); + throw new Exception("Couldn't locate all certs!"); + } + this.fireDebug("Parsing Certificate Chain Finished..."); + } + + private void grabFromTik(Stream tik) + { + this.fireDebug("Scanning Ticket for Certificates..."); + int offset = 676; + for (int index = 0; index < 3; ++index) + { + this.fireDebug(" Scanning at Offset 0x{0}:", (object) offset.ToString("x8")); + try + { + tik.Seek((long) offset, SeekOrigin.Begin); + byte[] array = new byte[1024]; + tik.Read(array, 0, array.Length); + this.fireDebug(" Checking for Certificate CA..."); + if (this.isCertCa(array) && !this.certsComplete[1]) + { + this.fireDebug(" Certificate CA detected..."); + this.certCa = array; + this.certsComplete[1] = true; + offset += 1024; + continue; + } + this.fireDebug(" Checking for Certificate CP..."); + if (this.isCertCp(array) && !this.certsComplete[2]) + { + this.fireDebug(" Certificate CP detected..."); + Array.Resize(ref array, 768); + this.certCp = array; + this.certsComplete[2] = true; + offset += 768; + continue; + } + this.fireDebug(" Checking for Certificate XS..."); + if (this.isCertXs(array)) + { + if (!this.certsComplete[0]) + { + this.fireDebug(" Certificate XS detected..."); + Array.Resize(ref array, 768); + this.certXs = array; + this.certsComplete[0] = true; + offset += 768; + continue; + } + } + } + catch + { + } + offset += 768; + } + this.fireDebug("Scanning Ticket for Certificates Finished..."); + } + + private void grabFromTmd(Stream tmd) + { + this.fireDebug("Scanning TMD for Certificates..."); + byte[] buffer = new byte[2]; + tmd.Seek(478L, SeekOrigin.Begin); + tmd.Read(buffer, 0, 2); + int offset = 484 + (int) Shared.Swap(BitConverter.ToUInt16(buffer, 0)) * 36; + for (int index = 0; index < 3; ++index) + { + this.fireDebug(" Scanning at Offset 0x{0}:", (object) offset.ToString("x8")); + try + { + tmd.Seek((long) offset, SeekOrigin.Begin); + byte[] array = new byte[1024]; + tmd.Read(array, 0, array.Length); + this.fireDebug(" Checking for Certificate CA..."); + if (this.isCertCa(array) && !this.certsComplete[1]) + { + this.fireDebug(" Certificate CA detected..."); + this.certCa = array; + this.certsComplete[1] = true; + offset += 1024; + continue; + } + this.fireDebug(" Checking for Certificate CP..."); + if (this.isCertCp(array) && !this.certsComplete[2]) + { + this.fireDebug(" Certificate CP detected..."); + Array.Resize(ref array, 768); + this.certCp = array; + this.certsComplete[2] = true; + offset += 768; + continue; + } + this.fireDebug(" Checking for Certificate XS..."); + if (this.isCertXs(array)) + { + if (!this.certsComplete[0]) + { + this.fireDebug(" Certificate XS detected..."); + Array.Resize(ref array, 768); + this.certXs = array; + this.certsComplete[0] = true; + offset += 768; + continue; + } + } + } + catch + { + } + offset += 768; + } + this.fireDebug("Scanning TMD for Certificates Finished..."); + } + + private bool isCertXs(byte[] part) + { + if (part.Length < 768) + return false; + if (part.Length > 768) + Array.Resize(ref part, 768); + return part[388] == (byte) 88 && part[389] == (byte) 83 && Shared.CompareByteArrays(this.sha.ComputeHash(part), Shared.HexStringToByteArray("09787045037121477824BC6A3E5E076156573F8A")); + } + + private bool isCertCa(byte[] part) + { + if (part.Length < 1024) + return false; + if (part.Length > 1024) + Array.Resize(ref part, 1024); + return part[644] == (byte) 67 && part[645] == (byte) 65 && Shared.CompareByteArrays(this.sha.ComputeHash(part), Shared.HexStringToByteArray("5B7D3EE28706AD8DA2CBD5A6B75C15D0F9B6F318")); + } + + private bool isCertCp(byte[] part) + { + if (part.Length < 768) + return false; + if (part.Length > 768) + Array.Resize(ref part, 768); + return part[388] == (byte) 67 && part[389] == (byte) 80 && Shared.CompareByteArrays(this.sha.ComputeHash(part), Shared.HexStringToByteArray("6824D6DA4C25184F0D6DAF6EDB9C0FC57522A41C")); + } + + public event EventHandler Debug; + + private void fireDebug(string debugMessage, params object[] args) + { + EventHandler debug = this.Debug; + if (debug == null) + return; + debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); + } + } +} diff --git a/libWiiSharp/CommonKey.cs b/libWiiSharp/CommonKey.cs new file mode 100644 index 0000000..cdb71f8 --- /dev/null +++ b/libWiiSharp/CommonKey.cs @@ -0,0 +1,27 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.CommonKey +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System.IO; + +namespace libWiiSharp +{ + public class CommonKey + { + private static string standardKey = "ebe42a225e8593e448d9c5457381aaf7"; + private static string koreanKey = "63b82bb4f4614e2e13f2fefbba4c9b7e"; + private static string dsiKey = "af1bf516a807d21aea45984f04742861"; + private static string currentDir = Directory.GetCurrentDirectory(); + private static string standardKeyName = "key.bin"; + private static string koreanKeyName = "kkey.bin"; + private static string dsiKeyName = "dsikey.bin"; + + public static byte[] GetStandardKey() => File.Exists(Path.Combine(CommonKey.currentDir, CommonKey.standardKeyName)) ? File.ReadAllBytes(Path.Combine(CommonKey.currentDir, CommonKey.standardKeyName)) : Shared.HexStringToByteArray(CommonKey.standardKey); + + public static byte[] GetKoreanKey() => File.Exists(Path.Combine(CommonKey.currentDir, CommonKey.koreanKeyName)) ? File.ReadAllBytes(Path.Combine(CommonKey.currentDir, CommonKey.koreanKeyName)) : Shared.HexStringToByteArray(CommonKey.koreanKey); + + public static byte[] GetDSiKey() => File.Exists(Path.Combine(CommonKey.currentDir, CommonKey.dsiKeyName)) ? File.ReadAllBytes(Path.Combine(CommonKey.currentDir, CommonKey.dsiKeyName)) : Shared.HexStringToByteArray(CommonKey.dsiKey); + } +} diff --git a/libWiiSharp/CommonKeyType.cs b/libWiiSharp/CommonKeyType.cs new file mode 100644 index 0000000..33878d6 --- /dev/null +++ b/libWiiSharp/CommonKeyType.cs @@ -0,0 +1,14 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.CommonKeyType +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +namespace libWiiSharp +{ + public enum CommonKeyType : byte + { + Standard, + Korean, + } +} diff --git a/libWiiSharp/ContentIndices.cs b/libWiiSharp/ContentIndices.cs new file mode 100644 index 0000000..396ecd1 --- /dev/null +++ b/libWiiSharp/ContentIndices.cs @@ -0,0 +1,33 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.ContentIndices +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; + +namespace libWiiSharp +{ + internal struct ContentIndices : IComparable + { + private int index; + private int contentIndex; + + public int Index => this.index; + + public int ContentIndex => this.contentIndex; + + public ContentIndices(int index, int contentIndex) + { + this.index = index; + this.contentIndex = contentIndex; + } + + public int CompareTo(object obj) + { + if (obj is ContentIndices contentIndices) + return this.contentIndex.CompareTo(contentIndices.contentIndex); + throw new ArgumentException(); + } + } +} diff --git a/libWiiSharp/ContentType.cs b/libWiiSharp/ContentType.cs new file mode 100644 index 0000000..3542ed3 --- /dev/null +++ b/libWiiSharp/ContentType.cs @@ -0,0 +1,15 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.ContentType +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +namespace libWiiSharp +{ + public enum ContentType : ushort + { + Normal = 1, + DLC = 16385, // 0x4001 + Shared = 32769, // 0x8001 + } +} diff --git a/libWiiSharp/Headers.cs b/libWiiSharp/Headers.cs new file mode 100644 index 0000000..963bf92 --- /dev/null +++ b/libWiiSharp/Headers.cs @@ -0,0 +1,589 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.Headers +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.IO; +using System.Security.Cryptography; + +namespace libWiiSharp +{ + public class Headers + { + private static uint imd5Magic = 1229800501; + private static uint imetMagic = 1229800788; + + public static Headers.HeaderType DetectHeader(string pathToFile) => Headers.DetectHeader(File.ReadAllBytes(pathToFile)); + + public static Headers.HeaderType DetectHeader(byte[] file) + { + if (file.Length > 68 && (int) Shared.Swap(BitConverter.ToUInt32(file, 64)) == (int) Headers.imetMagic) + return Headers.HeaderType.ShortIMET; + if (file.Length > 132 && (int) Shared.Swap(BitConverter.ToUInt32(file, 128)) == (int) Headers.imetMagic) + return Headers.HeaderType.IMET; + return file.Length > 4 && (int) Shared.Swap(BitConverter.ToUInt32(file, 0)) == (int) Headers.imd5Magic ? Headers.HeaderType.IMD5 : Headers.HeaderType.None; + } + + public static Headers.HeaderType DetectHeader(Stream file) + { + byte[] buffer = new byte[4]; + if (file.Length > 68L) + { + file.Seek(64L, SeekOrigin.Begin); + file.Read(buffer, 0, buffer.Length); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer, 0)) == (int) Headers.imetMagic) + return Headers.HeaderType.ShortIMET; + } + if (file.Length > 132L) + { + file.Seek(128L, SeekOrigin.Begin); + file.Read(buffer, 0, buffer.Length); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer, 0)) == (int) Headers.imetMagic) + return Headers.HeaderType.IMET; + } + if (file.Length > 4L) + { + file.Seek(0L, SeekOrigin.Begin); + file.Read(buffer, 0, buffer.Length); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer, 0)) == (int) Headers.imd5Magic) + return Headers.HeaderType.IMD5; + } + return Headers.HeaderType.None; + } + + public enum HeaderType + { + None = 0, + IMD5 = 32, // 0x00000020 + ShortIMET = 1536, // 0x00000600 + IMET = 1600, // 0x00000640 + } + + public class IMET + { + private bool hashesMatch = true; + private bool isShortImet; + private byte[] additionalPadding = new byte[64]; + private byte[] padding = new byte[64]; + private uint imetMagic = 1229800788; + private uint sizeOfHeader = 1536; + private uint unknown = 3; + private uint iconSize; + private uint bannerSize; + private uint soundSize; + private uint flags; + private byte[] japaneseTitle = new byte[84]; + private byte[] englishTitle = new byte[84]; + private byte[] germanTitle = new byte[84]; + private byte[] frenchTitle = new byte[84]; + private byte[] spanishTitle = new byte[84]; + private byte[] italianTitle = new byte[84]; + private byte[] dutchTitle = new byte[84]; + private byte[] unknownTitle1 = new byte[84]; + private byte[] unknownTitle2 = new byte[84]; + private byte[] koreanTitle = new byte[84]; + private byte[] padding2 = new byte[588]; + private byte[] hash = new byte[16]; + + public bool IsShortIMET + { + get => this.isShortImet; + set => this.isShortImet = value; + } + + public uint IconSize + { + get => this.iconSize; + set => this.iconSize = value; + } + + public uint BannerSize + { + get => this.bannerSize; + set => this.bannerSize = value; + } + + public uint SoundSize + { + get => this.soundSize; + set => this.soundSize = value; + } + + public string JapaneseTitle + { + get => this.returnTitleAsString(this.japaneseTitle); + set => this.setTitleFromString(value, 0); + } + + public string EnglishTitle + { + get => this.returnTitleAsString(this.englishTitle); + set => this.setTitleFromString(value, 1); + } + + public string GermanTitle + { + get => this.returnTitleAsString(this.germanTitle); + set => this.setTitleFromString(value, 2); + } + + public string FrenchTitle + { + get => this.returnTitleAsString(this.frenchTitle); + set => this.setTitleFromString(value, 3); + } + + public string SpanishTitle + { + get => this.returnTitleAsString(this.spanishTitle); + set => this.setTitleFromString(value, 4); + } + + public string ItalianTitle + { + get => this.returnTitleAsString(this.italianTitle); + set => this.setTitleFromString(value, 5); + } + + public string DutchTitle + { + get => this.returnTitleAsString(this.dutchTitle); + set => this.setTitleFromString(value, 6); + } + + public string KoreanTitle + { + get => this.returnTitleAsString(this.koreanTitle); + set => this.setTitleFromString(value, 7); + } + + public string[] AllTitles => new string[8] + { + this.JapaneseTitle, + this.EnglishTitle, + this.GermanTitle, + this.FrenchTitle, + this.SpanishTitle, + this.ItalianTitle, + this.DutchTitle, + this.KoreanTitle + }; + + public bool HashesMatch => this.hashesMatch; + + public static Headers.IMET Load(string pathToFile) => Headers.IMET.Load(File.ReadAllBytes(pathToFile)); + + public static Headers.IMET Load(byte[] fileOrHeader) + { + Headers.HeaderType headerType = Headers.DetectHeader(fileOrHeader); + switch (headerType) + { + case Headers.HeaderType.ShortIMET: + case Headers.HeaderType.IMET: + Headers.IMET imet = new Headers.IMET(); + if (headerType == Headers.HeaderType.ShortIMET) + imet.isShortImet = true; + MemoryStream headerStream = new MemoryStream(fileOrHeader); + try + { + imet.parseHeader((Stream) headerStream); + } + catch + { + headerStream.Dispose(); + throw; + } + headerStream.Dispose(); + return imet; + default: + throw new Exception("No IMET Header found!"); + } + } + + public static Headers.IMET Load(Stream fileOrHeader) + { + Headers.HeaderType headerType = Headers.DetectHeader(fileOrHeader); + switch (headerType) + { + case Headers.HeaderType.ShortIMET: + case Headers.HeaderType.IMET: + Headers.IMET imet = new Headers.IMET(); + if (headerType == Headers.HeaderType.ShortIMET) + imet.isShortImet = true; + imet.parseHeader(fileOrHeader); + return imet; + default: + throw new Exception("No IMET Header found!"); + } + } + + public static Headers.IMET Create( + bool isShortImet, + int iconSize, + int bannerSize, + int soundSize, + params string[] titles) + { + Headers.IMET imet = new Headers.IMET(); + imet.isShortImet = isShortImet; + for (int titleIndex = 0; titleIndex < titles.Length; ++titleIndex) + imet.setTitleFromString(titles[titleIndex], titleIndex); + for (int length = titles.Length; length < 8; ++length) + imet.setTitleFromString(titles.Length > 1 ? titles[1] : titles[0], length); + imet.iconSize = (uint) iconSize; + imet.bannerSize = (uint) bannerSize; + imet.soundSize = (uint) soundSize; + return imet; + } + + public static void RemoveHeader(string pathToFile) + { + byte[] bytes = Headers.IMET.RemoveHeader(File.ReadAllBytes(pathToFile)); + File.Delete(pathToFile); + File.WriteAllBytes(pathToFile, bytes); + } + + public static byte[] RemoveHeader(byte[] file) + { + Headers.HeaderType sourceIndex = Headers.DetectHeader(file); + switch (sourceIndex) + { + case Headers.HeaderType.ShortIMET: + case Headers.HeaderType.IMET: + byte[] destinationArray = new byte[(int) (file.Length - sourceIndex)]; + Array.Copy((Array) file, (int) sourceIndex, (Array) destinationArray, 0, destinationArray.Length); + return destinationArray; + default: + throw new Exception("No IMET Header found!"); + } + } + + public void SetAllTitles(string newTitle) + { + for (int titleIndex = 0; titleIndex < 10; ++titleIndex) + this.setTitleFromString(newTitle, titleIndex); + } + + public MemoryStream ToMemoryStream() + { + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + return writeStream; + } + + public byte[] ToByteArray() => this.ToMemoryStream().ToArray(); + + public void Write(Stream writeStream) => this.writeToStream(writeStream); + + public void ChangeTitles(params string[] newTitles) + { + for (int titleIndex = 0; titleIndex < newTitles.Length; ++titleIndex) + this.setTitleFromString(newTitles[titleIndex], titleIndex); + for (int length = newTitles.Length; length < 8; ++length) + this.setTitleFromString(newTitles.Length > 1 ? newTitles[1] : newTitles[0], length); + } + + public string[] GetTitles() => new string[8] + { + this.JapaneseTitle, + this.EnglishTitle, + this.GermanTitle, + this.FrenchTitle, + this.SpanishTitle, + this.ItalianTitle, + this.DutchTitle, + this.KoreanTitle + }; + + private void writeToStream(Stream writeStream) + { + writeStream.Seek(0L, SeekOrigin.Begin); + if (!this.isShortImet) + writeStream.Write(this.additionalPadding, 0, this.additionalPadding.Length); + writeStream.Write(this.padding, 0, this.padding.Length); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.imetMagic)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.sizeOfHeader)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.unknown)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.iconSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.bannerSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.soundSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.flags)), 0, 4); + writeStream.Write(this.japaneseTitle, 0, this.japaneseTitle.Length); + writeStream.Write(this.englishTitle, 0, this.englishTitle.Length); + writeStream.Write(this.germanTitle, 0, this.germanTitle.Length); + writeStream.Write(this.frenchTitle, 0, this.frenchTitle.Length); + writeStream.Write(this.spanishTitle, 0, this.spanishTitle.Length); + writeStream.Write(this.italianTitle, 0, this.italianTitle.Length); + writeStream.Write(this.dutchTitle, 0, this.dutchTitle.Length); + writeStream.Write(this.unknownTitle1, 0, this.unknownTitle1.Length); + writeStream.Write(this.unknownTitle2, 0, this.unknownTitle2.Length); + writeStream.Write(this.koreanTitle, 0, this.koreanTitle.Length); + writeStream.Write(this.padding2, 0, this.padding2.Length); + int position = (int) writeStream.Position; + this.hash = new byte[16]; + writeStream.Write(this.hash, 0, this.hash.Length); + byte[] numArray = new byte[writeStream.Position]; + writeStream.Seek(0L, SeekOrigin.Begin); + writeStream.Read(numArray, 0, numArray.Length); + this.computeHash(numArray, this.isShortImet ? 0 : 64); + writeStream.Seek((long) position, SeekOrigin.Begin); + writeStream.Write(this.hash, 0, this.hash.Length); + } + + private void computeHash(byte[] headerBytes, int hashPos) + { + MD5 md5 = MD5.Create(); + this.hash = md5.ComputeHash(headerBytes, hashPos, 1536); + md5.Clear(); + } + + private void parseHeader(Stream headerStream) + { + headerStream.Seek(0L, SeekOrigin.Begin); + byte[] buffer1 = new byte[4]; + if (!this.isShortImet) + headerStream.Read(this.additionalPadding, 0, this.additionalPadding.Length); + headerStream.Read(this.padding, 0, this.padding.Length); + headerStream.Read(buffer1, 0, 4); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer1, 0)) != (int) this.imetMagic) + throw new Exception("Invalid Magic!"); + headerStream.Read(buffer1, 0, 4); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer1, 0)) != (int) this.sizeOfHeader) + throw new Exception("Invalid Header Size!"); + headerStream.Read(buffer1, 0, 4); + this.unknown = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + headerStream.Read(buffer1, 0, 4); + this.iconSize = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + headerStream.Read(buffer1, 0, 4); + this.bannerSize = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + headerStream.Read(buffer1, 0, 4); + this.soundSize = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + headerStream.Read(buffer1, 0, 4); + this.flags = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + headerStream.Read(this.japaneseTitle, 0, this.japaneseTitle.Length); + headerStream.Read(this.englishTitle, 0, this.englishTitle.Length); + headerStream.Read(this.germanTitle, 0, this.germanTitle.Length); + headerStream.Read(this.frenchTitle, 0, this.frenchTitle.Length); + headerStream.Read(this.spanishTitle, 0, this.spanishTitle.Length); + headerStream.Read(this.italianTitle, 0, this.italianTitle.Length); + headerStream.Read(this.dutchTitle, 0, this.dutchTitle.Length); + headerStream.Read(this.unknownTitle1, 0, this.unknownTitle1.Length); + headerStream.Read(this.unknownTitle2, 0, this.unknownTitle2.Length); + headerStream.Read(this.koreanTitle, 0, this.koreanTitle.Length); + headerStream.Read(this.padding2, 0, this.padding2.Length); + headerStream.Read(this.hash, 0, this.hash.Length); + headerStream.Seek(-16L, SeekOrigin.Current); + headerStream.Write(new byte[16], 0, 16); + byte[] buffer2 = new byte[headerStream.Length]; + headerStream.Seek(0L, SeekOrigin.Begin); + headerStream.Read(buffer2, 0, buffer2.Length); + MD5 md5 = MD5.Create(); + byte[] hash = md5.ComputeHash(buffer2, this.isShortImet ? 0 : 64, 1536); + md5.Clear(); + this.hashesMatch = Shared.CompareByteArrays(hash, this.hash); + } + + private string returnTitleAsString(byte[] title) + { + string empty = string.Empty; + for (int index = 0; index < 84; index += 2) + { + char ch = BitConverter.ToChar(new byte[2] + { + title[index + 1], + title[index] + }, 0); + if (ch != char.MinValue) + empty += (string) (object) ch; + } + return empty; + } + + private void setTitleFromString(string title, int titleIndex) + { + byte[] numArray = new byte[84]; + for (int index = 0; index < title.Length; ++index) + { + byte[] bytes = BitConverter.GetBytes(title[index]); + numArray[index * 2 + 1] = bytes[0]; + numArray[index * 2] = bytes[1]; + } + switch (titleIndex) + { + case 0: + this.japaneseTitle = numArray; + break; + case 1: + this.englishTitle = numArray; + break; + case 2: + this.germanTitle = numArray; + break; + case 3: + this.frenchTitle = numArray; + break; + case 4: + this.spanishTitle = numArray; + break; + case 5: + this.italianTitle = numArray; + break; + case 6: + this.dutchTitle = numArray; + break; + case 7: + this.koreanTitle = numArray; + break; + } + } + } + + public class IMD5 + { + private uint imd5Magic = 1229800501; + private uint fileSize; + private byte[] padding = new byte[8]; + private byte[] hash = new byte[16]; + + public uint FileSize => this.fileSize; + + public byte[] Hash => this.hash; + + private IMD5() + { + } + + public static Headers.IMD5 Load(string pathToFile) => Headers.IMD5.Load(File.ReadAllBytes(pathToFile)); + + public static Headers.IMD5 Load(byte[] fileOrHeader) + { + if (Headers.DetectHeader(fileOrHeader) != Headers.HeaderType.IMD5) + throw new Exception("No IMD5 Header found!"); + Headers.IMD5 imD5 = new Headers.IMD5(); + MemoryStream headerStream = new MemoryStream(fileOrHeader); + try + { + imD5.parseHeader((Stream) headerStream); + } + catch + { + headerStream.Dispose(); + throw; + } + headerStream.Dispose(); + return imD5; + } + + public static Headers.IMD5 Load(Stream fileOrHeader) + { + if (Headers.DetectHeader(fileOrHeader) != Headers.HeaderType.IMD5) + throw new Exception("No IMD5 Header found!"); + Headers.IMD5 imD5 = new Headers.IMD5(); + imD5.parseHeader(fileOrHeader); + return imD5; + } + + public static Headers.IMD5 Create(byte[] file) + { + Headers.IMD5 imD5 = new Headers.IMD5(); + imD5.fileSize = (uint) file.Length; + imD5.computeHash(file); + return imD5; + } + + public static void AddHeader(string pathToFile) + { + byte[] buffer = Headers.IMD5.AddHeader(File.ReadAllBytes(pathToFile)); + File.Delete(pathToFile); + using (FileStream fileStream = new FileStream(pathToFile, FileMode.Create)) + fileStream.Write(buffer, 0, buffer.Length); + } + + public static byte[] AddHeader(byte[] file) + { + Headers.IMD5 imD5 = Headers.IMD5.Create(file); + MemoryStream writeStream = new MemoryStream(); + imD5.writeToStream((Stream) writeStream); + writeStream.Write(file, 0, file.Length); + byte[] array = writeStream.ToArray(); + writeStream.Dispose(); + return array; + } + + public static void RemoveHeader(string pathToFile) + { + byte[] buffer = Headers.IMD5.RemoveHeader(File.ReadAllBytes(pathToFile)); + File.Delete(pathToFile); + using (FileStream fileStream = new FileStream(pathToFile, FileMode.Create)) + fileStream.Write(buffer, 0, buffer.Length); + } + + public static byte[] RemoveHeader(byte[] file) + { + MemoryStream memoryStream = new MemoryStream(); + memoryStream.Write(file, 32, file.Length - 32); + byte[] array = memoryStream.ToArray(); + memoryStream.Dispose(); + return array; + } + + public MemoryStream ToMemoryStream() + { + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + return writeStream; + } + + public byte[] ToByteArray() => this.ToMemoryStream().ToArray(); + + public void Write(Stream writeStream) => this.writeToStream(writeStream); + + private void writeToStream(Stream writeStream) + { + writeStream.Seek(0L, SeekOrigin.Begin); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.imd5Magic)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.fileSize)), 0, 4); + writeStream.Write(this.padding, 0, this.padding.Length); + writeStream.Write(this.hash, 0, this.hash.Length); + } + + private void computeHash(byte[] bytesToHash) + { + MD5 md5 = MD5.Create(); + this.hash = md5.ComputeHash(bytesToHash); + md5.Clear(); + } + + private void parseHeader(Stream headerStream) + { + headerStream.Seek(0L, SeekOrigin.Begin); + byte[] buffer = new byte[4]; + headerStream.Read(buffer, 0, 4); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer, 0)) != (int) this.imd5Magic) + throw new Exception("Invalid Magic!"); + headerStream.Read(buffer, 0, 4); + this.fileSize = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + headerStream.Read(this.padding, 0, this.padding.Length); + headerStream.Read(this.hash, 0, this.hash.Length); + } + } + } +} diff --git a/libWiiSharp/IosPatcher.cs b/libWiiSharp/IosPatcher.cs new file mode 100644 index 0000000..4bd9f98 --- /dev/null +++ b/libWiiSharp/IosPatcher.cs @@ -0,0 +1,244 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.IosPatcher +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.ComponentModel; +using System.Text; + +namespace libWiiSharp +{ + public class IosPatcher + { + private WAD wadFile; + private int esIndex = -1; + + public void LoadIOS(ref WAD iosWad) + { + if (iosWad.TitleID >> 32 != 1UL || (iosWad.TitleID & (ulong) uint.MaxValue) < 3UL || (iosWad.TitleID & (ulong) uint.MaxValue) > (ulong) byte.MaxValue) + throw new Exception("Only IOS WADs can be patched!"); + this.wadFile = iosWad; + this.getEsIndex(); + } + + public int PatchFakeSigning() => this.esIndex < 0 ? -1 : this.patchFakeSigning(ref this.wadFile.Contents[this.esIndex]); + + public int PatchEsIdentify() => this.esIndex < 0 ? -1 : this.patchEsIdentify(ref this.wadFile.Contents[this.esIndex]); + + public int PatchNandPermissions() => this.esIndex < 0 ? -1 : this.patchNandPermissions(ref this.wadFile.Contents[this.esIndex]); + + public int PatchAll() => this.esIndex < 0 ? -1 : this.patchAll(ref this.wadFile.Contents[this.esIndex]); + + public int PatchFakeSigning(ref byte[] esModule) => this.patchFakeSigning(ref esModule); + + public int PatchEsIdentify(ref byte[] esModule) => this.patchEsIdentify(ref esModule); + + public int PatchNandPermissions(ref byte[] esModule) => this.patchNandPermissions(ref esModule); + + public int PatchAll(ref byte[] esModule) => this.patchAll(ref esModule); + + private int patchFakeSigning(ref byte[] esModule) + { + this.fireDebug("Patching Fakesigning..."); + int num = 0; + byte[] second1 = new byte[4] + { + (byte) 32, + (byte) 7, + (byte) 35, + (byte) 162 + }; + byte[] second2 = new byte[4] + { + (byte) 32, + (byte) 7, + (byte) 75, + (byte) 11 + }; + for (int firstIndex = 0; firstIndex < esModule.Length - 4; ++firstIndex) + { + this.fireProgress((firstIndex + 1) * 100 / esModule.Length); + if (Shared.CompareByteArrays(esModule, firstIndex, second1, 0, 4) || Shared.CompareByteArrays(esModule, firstIndex, second2, 0, 4)) + { + this.fireDebug(" Patching at Offset: 0x{0}", (object) firstIndex.ToString("x8").ToUpper()); + esModule[firstIndex + 1] = (byte) 0; + firstIndex += 4; + ++num; + } + } + this.fireDebug("Patching Fakesigning Finished... (Patches applied: {0})", (object) num); + return num; + } + + private int patchEsIdentify(ref byte[] esModule) + { + this.fireDebug("Patching ES_Identify..."); + int num = 0; + byte[] second = new byte[4] + { + (byte) 40, + (byte) 3, + (byte) 209, + (byte) 35 + }; + for (int firstIndex = 0; firstIndex < esModule.Length - 4; ++firstIndex) + { + this.fireProgress((firstIndex + 1) * 100 / esModule.Length); + if (Shared.CompareByteArrays(esModule, firstIndex, second, 0, 4)) + { + this.fireDebug(" Patching at Offset: 0x{0}", (object) firstIndex.ToString("x8").ToUpper()); + esModule[firstIndex + 2] = (byte) 0; + esModule[firstIndex + 3] = (byte) 0; + firstIndex += 4; + ++num; + } + } + this.fireDebug("Patching ES_Identify Finished... (Patches applied: {0})", (object) num); + return num; + } + + private int patchNandPermissions(ref byte[] esModule) + { + this.fireDebug("Patching NAND Permissions..."); + int num = 0; + byte[] second = new byte[6] + { + (byte) 66, + (byte) 139, + (byte) 208, + (byte) 1, + (byte) 37, + (byte) 102 + }; + for (int firstIndex = 0; firstIndex < esModule.Length - 6; ++firstIndex) + { + this.fireProgress((firstIndex + 1) * 100 / esModule.Length); + if (Shared.CompareByteArrays(esModule, firstIndex, second, 0, 6)) + { + this.fireDebug(" Patching at Offset: 0x{0}", (object) firstIndex.ToString("x8").ToUpper()); + esModule[firstIndex + 2] = (byte) 224; + firstIndex += 6; + ++num; + } + } + this.fireDebug("Patching NAND Permissions Finished... (Patches applied: {0})", (object) num); + return num; + } + + private int patchAll(ref byte[] esModule) + { + this.fireDebug("Patching Fakesigning, ES_Identify and NAND Permissions..."); + int num = 0; + byte[] second1 = new byte[4] + { + (byte) 32, + (byte) 7, + (byte) 35, + (byte) 162 + }; + byte[] second2 = new byte[4] + { + (byte) 32, + (byte) 7, + (byte) 75, + (byte) 11 + }; + byte[] second3 = new byte[4] + { + (byte) 40, + (byte) 3, + (byte) 209, + (byte) 35 + }; + byte[] second4 = new byte[6] + { + (byte) 66, + (byte) 139, + (byte) 208, + (byte) 1, + (byte) 37, + (byte) 102 + }; + for (int firstIndex = 0; firstIndex < esModule.Length - 6; ++firstIndex) + { + this.fireProgress((firstIndex + 1) * 100 / esModule.Length); + if (Shared.CompareByteArrays(esModule, firstIndex, second1, 0, 4) || Shared.CompareByteArrays(esModule, firstIndex, second2, 0, 4)) + { + this.fireDebug(" Patching Fakesigning at Offset: 0x{0}", (object) firstIndex.ToString("x8").ToUpper()); + esModule[firstIndex + 1] = (byte) 0; + firstIndex += 4; + ++num; + } + else if (Shared.CompareByteArrays(esModule, firstIndex, second3, 0, 4)) + { + this.fireDebug(" Patching ES_Identify at Offset: 0x{0}", (object) firstIndex.ToString("x8").ToUpper()); + esModule[firstIndex + 2] = (byte) 0; + esModule[firstIndex + 3] = (byte) 0; + firstIndex += 4; + ++num; + } + else if (Shared.CompareByteArrays(esModule, firstIndex, second4, 0, 6)) + { + this.fireDebug(" Patching NAND Permissions at Offset: 0x{0}", (object) firstIndex.ToString("x8").ToUpper()); + esModule[firstIndex + 2] = (byte) 224; + firstIndex += 6; + ++num; + } + } + this.fireDebug("Patching Fakesigning, ES_Identify and NAND Permissions Finished... (Patches applied: {0})", (object) num); + return num; + } + + private void getEsIndex() + { + this.fireDebug("Scanning for ES Module..."); + string str = "$IOSVersion:"; + for (int index1 = this.wadFile.NumOfContents - 1; index1 >= 0; --index1) + { + this.fireDebug(" Scanning Content #{0} of {1}...", (object) (index1 + 1), (object) this.wadFile.NumOfContents); + this.fireProgress((index1 + 1) * 100 / this.wadFile.NumOfContents); + for (int index2 = 0; index2 < this.wadFile.Contents[index1].Length - 64; ++index2) + { + if (Encoding.ASCII.GetString(this.wadFile.Contents[index1], index2, 12) == str) + { + int index3 = index2 + 12; + while (this.wadFile.Contents[index1][index3] == (byte) 32) + ++index3; + if (Encoding.ASCII.GetString(this.wadFile.Contents[index1], index3, 3) == "ES:") + { + this.fireDebug(" -> ES Module found!"); + this.fireDebug("Scanning for ES Module Finished..."); + this.esIndex = index1; + this.fireProgress(100); + return; + } + } + } + } + this.fireDebug("/!\\/!\\/!\\ ES Module wasn't found! /!\\/!\\/!\\"); + throw new Exception("ES module wasn't found!"); + } + + public event EventHandler Progress; + + public event EventHandler Debug; + + private void fireDebug(string debugMessage, params object[] args) + { + EventHandler debug = this.Debug; + if (debug == null) + return; + debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); + } + + private void fireProgress(int progressPercentage) + { + EventHandler progress = this.Progress; + if (progress == null) + return; + progress(new object(), new ProgressChangedEventArgs(progressPercentage, (object) string.Empty)); + } + } +} diff --git a/libWiiSharp/LowerTitleID.cs b/libWiiSharp/LowerTitleID.cs new file mode 100644 index 0000000..17a0bd2 --- /dev/null +++ b/libWiiSharp/LowerTitleID.cs @@ -0,0 +1,18 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.LowerTitleID +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +namespace libWiiSharp +{ + public enum LowerTitleID : uint + { + SystemTitles = 1, + Channel = 65537, // 0x00010001 + SystemChannels = 65538, // 0x00010002 + GameChannel = 65540, // 0x00010004 + DLC = 65541, // 0x00010005 + HiddenChannels = 65544, // 0x00010008 + } +} diff --git a/libWiiSharp/Lz77.cs b/libWiiSharp/Lz77.cs new file mode 100644 index 0000000..b051409 --- /dev/null +++ b/libWiiSharp/Lz77.cs @@ -0,0 +1,363 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.Lz77 +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.IO; + +namespace libWiiSharp +{ + public class Lz77 + { + private const int N = 4096; + private const int F = 18; + private const int threshold = 2; + private static uint lz77Magic = 1280980791; + private int[] leftSon = new int[4097]; + private int[] rightSon = new int[4353]; + private int[] dad = new int[4097]; + private ushort[] textBuffer = new ushort[4113]; + private int matchPosition; + private int matchLength; + + public static uint Lz77Magic => Lz77.lz77Magic; + + public static bool IsLz77Compressed(string file) => Lz77.IsLz77Compressed(File.ReadAllBytes(file)); + + public static bool IsLz77Compressed(byte[] file) + { + Headers.HeaderType startIndex = Headers.DetectHeader(file); + return (int) Shared.Swap(BitConverter.ToUInt32(file, (int) startIndex)) == (int) Lz77.lz77Magic; + } + + public static bool IsLz77Compressed(Stream file) + { + Headers.HeaderType offset = Headers.DetectHeader(file); + byte[] buffer = new byte[4]; + file.Seek((long) offset, SeekOrigin.Begin); + file.Read(buffer, 0, buffer.Length); + return (int) Shared.Swap(BitConverter.ToUInt32(buffer, 0)) == (int) Lz77.lz77Magic; + } + + public void Compress(string inFile, string outFile) + { + Stream stream; + using (FileStream inFile1 = new FileStream(inFile, FileMode.Open)) + stream = this.compress((Stream) inFile1); + byte[] buffer = new byte[stream.Length]; + stream.Read(buffer, 0, buffer.Length); + if (File.Exists(outFile)) + File.Delete(outFile); + using (FileStream fileStream = new FileStream(outFile, FileMode.Create)) + fileStream.Write(buffer, 0, buffer.Length); + } + + public byte[] Compress(byte[] file) => ((MemoryStream) this.compress((Stream) new MemoryStream(file))).ToArray(); + + public Stream Compress(Stream file) => this.compress(file); + + public void Decompress(string inFile, string outFile) + { + Stream stream; + using (FileStream inFile1 = new FileStream(inFile, FileMode.Open)) + stream = this.decompress((Stream) inFile1); + byte[] buffer = new byte[stream.Length]; + stream.Read(buffer, 0, buffer.Length); + if (File.Exists(outFile)) + File.Delete(outFile); + using (FileStream fileStream = new FileStream(outFile, FileMode.Create)) + fileStream.Write(buffer, 0, buffer.Length); + } + + public byte[] Decompress(byte[] file) => ((MemoryStream) this.decompress((Stream) new MemoryStream(file))).ToArray(); + + public Stream Decompress(Stream file) => this.decompress(file); + + private Stream decompress(Stream inFile) + { + if (!Lz77.IsLz77Compressed(inFile)) + return inFile; + inFile.Seek(0L, SeekOrigin.Begin); + uint num1 = 0; + Headers.HeaderType offset = Headers.DetectHeader(inFile); + byte[] buffer = new byte[8]; + inFile.Seek((long) offset, SeekOrigin.Begin); + inFile.Read(buffer, 0, 8); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer, 0)) != (int) Lz77.lz77Magic) + { + inFile.Dispose(); + throw new Exception("Invaild Magic!"); + } + if (buffer[4] != (byte) 16) + { + inFile.Dispose(); + throw new Exception("Unsupported Compression Type!"); + } + uint num2 = BitConverter.ToUInt32(buffer, 4) >> 8; + for (int index = 0; index < 4078; ++index) + this.textBuffer[index] = (ushort) 223; + int num3 = 4078; + uint num4 = 7; + int num5 = 7; + MemoryStream memoryStream = new MemoryStream(); +label_10: + while (true) + { + num4 <<= 1; + ++num5; + if (num5 == 8) + { + int num6; + if ((num6 = inFile.ReadByte()) != -1) + { + num4 = (uint) num6; + num5 = 0; + } + else + goto label_24; + } + if (((int) num4 & 128) == 0) + { + int num7; + if ((long) (num7 = inFile.ReadByte()) != inFile.Length - 1L) + { + if (num1 < num2) + memoryStream.WriteByte((byte) num7); + ushort[] textBuffer = this.textBuffer; + int index = num3; + int num8 = index + 1; + int num9 = (int) (byte) num7; + textBuffer[index] = (ushort) num9; + num3 = num8 & 4095; + ++num1; + } + else + goto label_24; + } + else + break; + } + int num10; + int num11; + if ((num10 = inFile.ReadByte()) != -1 && (num11 = inFile.ReadByte()) != -1) + { + int num12 = num11 | num10 << 8 & 3840; + int num13 = (num10 >> 4 & 15) + 2; + for (int index1 = 0; index1 <= num13; ++index1) + { + int num14 = (int) this.textBuffer[num3 - num12 - 1 & 4095]; + if (num1 < num2) + memoryStream.WriteByte((byte) num14); + ushort[] textBuffer = this.textBuffer; + int index2 = num3; + int num15 = index2 + 1; + int num16 = (int) (byte) num14; + textBuffer[index2] = (ushort) num16; + num3 = num15 & 4095; + ++num1; + } + goto label_10; + } +label_24: + return (Stream) memoryStream; + } + + private Stream compress(Stream inFile) + { + if (Lz77.IsLz77Compressed(inFile)) + return inFile; + inFile.Seek(0L, SeekOrigin.Begin); + int num1 = 0; + int[] numArray1 = new int[17]; + uint num2 = (uint) (((int) Convert.ToUInt32(inFile.Length) << 8) + 16); + MemoryStream memoryStream = new MemoryStream(); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(Lz77.lz77Magic)), 0, 4); + memoryStream.Write(BitConverter.GetBytes(num2), 0, 4); + this.InitTree(); + numArray1[0] = 0; + int num3 = 1; + int num4 = 128; + int p = 0; + int r = 4078; + for (int index = p; index < r; ++index) + this.textBuffer[index] = ushort.MaxValue; + int num5; + int num6; + for (num5 = 0; num5 < 18 && (num6 = inFile.ReadByte()) != -1; ++num5) + this.textBuffer[r + num5] = (ushort) num6; + if (num5 == 0) + return inFile; + for (int index = 1; index <= 18; ++index) + this.InsertNode(r - index); + this.InsertNode(r); + do + { + if (this.matchLength > num5) + this.matchLength = num5; + if (this.matchLength <= 2) + { + this.matchLength = 1; + numArray1[num3++] = (int) this.textBuffer[r]; + } + else + { + numArray1[0] |= num4; + int[] numArray2 = numArray1; + int index1 = num3; + int num7 = index1 + 1; + int num8 = (int) (ushort) (r - this.matchPosition - 1 >> 8 & 15) | this.matchLength - 3 << 4; + numArray2[index1] = num8; + int[] numArray3 = numArray1; + int index2 = num7; + num3 = index2 + 1; + int num9 = (int) (ushort) (r - this.matchPosition - 1 & (int) byte.MaxValue); + numArray3[index2] = num9; + } + if ((num4 >>= 1) == 0) + { + for (int index = 0; index < num3; ++index) + memoryStream.WriteByte((byte) numArray1[index]); + num1 += num3; + numArray1[0] = 0; + num3 = 1; + num4 = 128; + } + int matchLength = this.matchLength; + int num10; + int num11; + for (num10 = 0; num10 < matchLength && (num11 = inFile.ReadByte()) != -1; ++num10) + { + this.DeleteNode(p); + this.textBuffer[p] = (ushort) num11; + if (p < 17) + this.textBuffer[p + 4096] = (ushort) num11; + p = p + 1 & 4095; + r = r + 1 & 4095; + this.InsertNode(r); + } + while (num10++ < matchLength) + { + this.DeleteNode(p); + p = p + 1 & 4095; + r = r + 1 & 4095; + if (--num5 != 0) + this.InsertNode(r); + } + } + while (num5 > 0); + if (num3 > 1) + { + for (int index = 0; index < num3; ++index) + memoryStream.WriteByte((byte) numArray1[index]); + num1 += num3; + } + if (num1 % 4 != 0) + { + for (int index = 0; index < 4 - num1 % 4; ++index) + memoryStream.WriteByte((byte) 0); + } + return (Stream) memoryStream; + } + + private void InitTree() + { + for (int index = 4097; index <= 4352; ++index) + this.rightSon[index] = 4096; + for (int index = 0; index < 4096; ++index) + this.dad[index] = 4096; + } + + private void InsertNode(int r) + { + int num1 = 1; + int index = 4097 + (this.textBuffer[r] == ushort.MaxValue ? 0 : (int) this.textBuffer[r]); + this.rightSon[r] = this.leftSon[r] = 4096; + this.matchLength = 0; + int num2; + do + { + do + { + if (num1 >= 0) + { + if (this.rightSon[index] != 4096) + { + index = this.rightSon[index]; + } + else + { + this.rightSon[index] = r; + this.dad[r] = index; + return; + } + } + else if (this.leftSon[index] != 4096) + { + index = this.leftSon[index]; + } + else + { + this.leftSon[index] = r; + this.dad[r] = index; + return; + } + num2 = 1; + while (num2 < 18 && (num1 = (int) this.textBuffer[r + num2] - (int) this.textBuffer[index + num2]) == 0) + ++num2; + } + while (num2 <= this.matchLength); + this.matchPosition = index; + } + while ((this.matchLength = num2) < 18); + this.dad[r] = this.dad[index]; + this.leftSon[r] = this.leftSon[index]; + this.rightSon[r] = this.rightSon[index]; + this.dad[this.leftSon[index]] = r; + this.dad[this.rightSon[index]] = r; + if (this.rightSon[this.dad[index]] == index) + this.rightSon[this.dad[index]] = r; + else + this.leftSon[this.dad[index]] = r; + this.dad[index] = 4096; + } + + private void DeleteNode(int p) + { + if (this.dad[p] == 4096) + return; + int index; + if (this.rightSon[p] == 4096) + index = this.leftSon[p]; + else if (this.leftSon[p] == 4096) + { + index = this.rightSon[p]; + } + else + { + index = this.leftSon[p]; + if (this.rightSon[index] != 4096) + { + do + { + index = this.rightSon[index]; + } + while (this.rightSon[index] != 4096); + this.rightSon[this.dad[index]] = this.leftSon[index]; + this.dad[this.leftSon[index]] = this.dad[index]; + this.leftSon[index] = this.leftSon[p]; + this.dad[this.leftSon[p]] = index; + } + this.rightSon[index] = this.rightSon[p]; + this.dad[this.rightSon[p]] = index; + } + this.dad[index] = this.dad[p]; + if (this.rightSon[this.dad[p]] == p) + this.rightSon[this.dad[p]] = index; + else + this.leftSon[this.dad[p]] = index; + this.dad[p] = 4096; + } + } +} diff --git a/libWiiSharp/MessageEventArgs.cs b/libWiiSharp/MessageEventArgs.cs new file mode 100644 index 0000000..47055ae --- /dev/null +++ b/libWiiSharp/MessageEventArgs.cs @@ -0,0 +1,19 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.MessageEventArgs +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; + +namespace libWiiSharp +{ + public class MessageEventArgs : EventArgs + { + private string message; + + public string Message => this.message; + + public MessageEventArgs(string message) => this.message = message; + } +} diff --git a/libWiiSharp/NusClient.cs b/libWiiSharp/NusClient.cs new file mode 100644 index 0000000..9897ff1 --- /dev/null +++ b/libWiiSharp/NusClient.cs @@ -0,0 +1,444 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.NusClient +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Net; +using System.Security.Cryptography; + +namespace libWiiSharp +{ + public class NusClient : IDisposable + { + private const string WII_NUS_URL = "http://nus.cdn.shop.wii.com/ccs/download/"; + private const string DSI_NUS_URL = "http://nus.cdn.t.shop.nintendowifi.net/ccs/download/"; + private const string WII_USER_AGENT = "wii libnup/1.0"; + private const string DSI_USER_AGENT = "Opera/9.50 (Nintendo; Opera/154; U; Nintendo DS; en)"; + private string nusUrl = "http://nus.cdn.shop.wii.com/ccs/download/"; + private WebClient wcNus = new WebClient(); + private bool useLocalFiles; + private bool continueWithoutTicket; + private int titleversion; + private bool isDisposed; + + public int TitleVersion => this.titleversion; + + public bool UseLocalFiles + { + get => this.useLocalFiles; + set => this.useLocalFiles = value; + } + + public bool ContinueWithoutTicket + { + get => this.continueWithoutTicket; + set => this.continueWithoutTicket = value; + } + + ~NusClient() => this.Dispose(false); + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing && !this.isDisposed) + this.wcNus.Dispose(); + this.isDisposed = true; + } + + public void ConfigureNusClient(WebClient wcReady) => this.wcNus = wcReady; + + public void SetToWiiServer() + { + this.nusUrl = "http://nus.cdn.shop.wii.com/ccs/download/"; + this.wcNus.Headers.Add("User-Agent", "wii libnup/1.0"); + } + + public void SetToDSiServer() + { + this.nusUrl = "http://nus.cdn.t.shop.nintendowifi.net/ccs/download/"; + this.wcNus.Headers.Add("User-Agent", "Opera/9.50 (Nintendo; Opera/154; U; Nintendo DS; en)"); + } + + public void DownloadTitle( + string titleId, + string titleVersion, + string outputDir, + bool alternative_path, + string wadName, + params StoreType[] storeTypes) + { + if (titleId.Length != 16) + throw new Exception("Title ID must be 16 characters long!"); + this.downloadTitle(titleId, titleVersion, outputDir, alternative_path, wadName, storeTypes); + } + + public TMD DownloadTMD(string titleId, string titleVersion) => titleId.Length == 16 ? this.downloadTmd(titleId, titleVersion) : throw new Exception("Title ID must be 16 characters long!"); + + public Ticket DownloadTicket(string titleId) => titleId.Length == 16 ? this.downloadTicket(titleId) : throw new Exception("Title ID must be 16 characters long!"); + + public byte[] DownloadSingleContent(string titleId, string titleVersion, string contentId) + { + if (titleId.Length != 16) + throw new Exception("Title ID must be 16 characters long!"); + return this.downloadSingleContent(titleId, titleVersion, contentId); + } + + public void DownloadSingleContent( + string titleId, + string titleVersion, + string contentId, + string savePath) + { + if (titleId.Length != 16) + throw new Exception("Title ID must be 16 characters long!"); + if (!Directory.Exists(Path.GetDirectoryName(savePath))) + Directory.CreateDirectory(Path.GetDirectoryName(savePath)); + if (System.IO.File.Exists(savePath)) + System.IO.File.Delete(savePath); + byte[] bytes = this.downloadSingleContent(titleId, titleVersion, contentId); + System.IO.File.WriteAllBytes(savePath, bytes); + } + + private byte[] downloadSingleContent(string titleId, string titleVersion, string contentId) + { + uint num = uint.Parse(contentId, NumberStyles.HexNumber); + contentId = num.ToString("x8"); + this.fireDebug("Downloading Content (Content ID: {0}) of Title {1} v{2}...", (object) contentId, (object) titleId, string.IsNullOrEmpty(titleVersion) ? (object) "[Latest]" : (object) titleVersion); + this.fireDebug(" Checking for Internet connection..."); + if (!this.CheckInet()) + { + this.fireDebug(" Connection not found..."); + throw new Exception("You're not connected to the internet!"); + } + this.fireProgress(0); + string str1 = "tmd" + (string.IsNullOrEmpty(titleVersion) ? string.Empty : string.Format(".{0}", (object) titleVersion)); + string str2 = string.Format("{0}{1}/", (object) this.nusUrl, (object) titleId); + string empty = string.Empty; + int contentIndex = 0; + this.fireDebug(" Downloading TMD..."); + byte[] tmdFile = this.wcNus.DownloadData(str2 + str1); + this.fireDebug(" Parsing TMD..."); + TMD tmd = TMD.Load(tmdFile); + this.fireProgress(20); + this.fireDebug(" Looking for Content ID {0} in TMD...", (object) contentId); + bool flag = false; + for (int index = 0; index < tmd.Contents.Length; ++index) + { + if ((int) tmd.Contents[index].ContentID == (int) num) + { + this.fireDebug(" Content ID {0} found in TMD...", (object) contentId); + flag = true; + empty = tmd.Contents[index].ContentID.ToString("x8"); + contentIndex = index; + break; + } + } + if (!flag) + { + this.fireDebug(" Content ID {0} wasn't found in TMD...", (object) contentId); + throw new Exception("Content ID wasn't found in the TMD!"); + } + this.fireDebug(" Downloading Ticket..."); + byte[] ticket = this.wcNus.DownloadData(str2 + "cetk"); + this.fireDebug(" Parsing Ticket..."); + Ticket tik = Ticket.Load(ticket); + this.fireProgress(40); + this.fireDebug(" Downloading Content... ({0} bytes)", (object) tmd.Contents[contentIndex].Size); + byte[] content = this.wcNus.DownloadData(str2 + empty); + this.fireProgress(80); + this.fireDebug(" Decrypting Content..."); + byte[] array = this.decryptContent(content, contentIndex, tik, tmd); + Array.Resize(ref array, (int) tmd.Contents[contentIndex].Size); + if (!Shared.CompareByteArrays(SHA1.Create().ComputeHash(array), tmd.Contents[contentIndex].Hash)) + { + this.fireDebug("/!\\ /!\\ /!\\ Hashes do not match /!\\ /!\\ /!\\"); + throw new Exception("Hashes do not match!"); + } + this.fireProgress(100); + this.fireDebug("Downloading Content (Content ID: {0}) of Title {1} v{2} Finished...", (object) contentId, (object) titleId, string.IsNullOrEmpty(titleVersion) ? (object) "[Latest]" : (object) titleVersion); + return array; + } + + private Ticket downloadTicket(string titleId) + { + if (!this.CheckInet()) + throw new Exception("You're not connected to the internet!"); + return Ticket.Load(this.wcNus.DownloadData(string.Format("{0}{1}/", (object) this.nusUrl, (object) titleId) + "cetk")); + } + + private TMD downloadTmd(string titleId, string titleVersion) + { + if (!this.CheckInet()) + throw new Exception("You're not connected to the internet!"); + return TMD.Load(this.wcNus.DownloadData(string.Format("{0}{1}/", (object) this.nusUrl, (object) titleId) + ("tmd" + (string.IsNullOrEmpty(titleVersion) ? string.Empty : string.Format(".{0}", (object) titleVersion))))); + } + + private void downloadTitle( + string titleId, + string titleVersion, + string outputDir, + bool alternative_path, + string wadName, + StoreType[] storeTypes) + { + this.fireDebug("Downloading Title {0} v{1}...", (object) titleId, string.IsNullOrEmpty(titleVersion) ? (object) "[Latest]" : (object) titleVersion); + if (storeTypes.Length < 1) + { + this.fireDebug(" No store types were defined..."); + throw new Exception("You must at least define one store type!"); + } + string path1 = string.Format("{0}{1}/", (object) this.nusUrl, (object) titleId); + bool flag1 = false; + bool flag2 = false; + bool flag3 = false; + this.fireProgress(0); + foreach (int storeType in storeTypes) + { + switch (storeType) + { + case 0: + this.fireDebug(" [=] Storing Encrypted Content..."); + flag1 = true; + break; + case 1: + this.fireDebug(" [=] Storing Decrypted Content..."); + flag2 = true; + break; + case 2: + this.fireDebug(" [=] Storing WAD..."); + flag3 = true; + break; + case 3: + this.fireDebug(" [=] Storing Decrypted Content..."); + this.fireDebug(" [=] Storing Encrypted Content..."); + this.fireDebug(" [=] Storing WAD..."); + flag2 = true; + flag1 = true; + flag3 = true; + break; + } + } + if (!Directory.Exists(outputDir)) + Directory.CreateDirectory(outputDir); + string path2 = "tmd" + (string.IsNullOrEmpty(titleVersion) ? string.Empty : string.Format(".{0}", (object) titleVersion)); + this.fireDebug(" - Downloading TMD..."); + byte[] tmdFile; + TMD tmd; + try + { + tmdFile = this.wcNus.DownloadData(path1 + path2); + tmd = TMD.Load(tmdFile); + } + catch (Exception ex) + { + this.fireDebug(" + Downloading TMD Failed..."); + throw new Exception("Downloading TMD Failed:\n" + ex.Message); + } + if (alternative_path) + { + if (!Directory.Exists(Path.Combine(outputDir, titleId + "v" + (object) tmd.TitleVersion))) + Directory.CreateDirectory(Path.Combine(outputDir, titleId + "v" + (object) tmd.TitleVersion)); + outputDir = Path.Combine(outputDir, titleId + "v" + (object) tmd.TitleVersion); + } + else + { + if (!Directory.Exists(Path.Combine(outputDir, titleId))) + Directory.CreateDirectory(Path.Combine(outputDir, titleId)); + outputDir = Path.Combine(outputDir, titleId); + } + this.fireDebug(" - Parsing TMD..."); + if (string.IsNullOrEmpty(titleVersion)) + this.fireDebug(" + Title Version: {0}", (object) tmd.TitleVersion); + this.fireDebug(" + {0} Contents", (object) tmd.NumOfContents); + if (!alternative_path) + { + if (!Directory.Exists(Path.Combine(outputDir, tmd.TitleVersion.ToString()))) + Directory.CreateDirectory(Path.Combine(outputDir, tmd.TitleVersion.ToString())); + outputDir = Path.Combine(outputDir, tmd.TitleVersion.ToString()); + } + this.titleversion = (int) tmd.TitleVersion; + System.IO.File.WriteAllBytes(Path.Combine(outputDir, path2), tmd.ToByteArray()); + this.fireProgress(5); + this.fireDebug(" - Downloading Ticket..."); + try + { + this.wcNus.DownloadFile(Path.Combine(path1, "cetk"), Path.Combine(outputDir, "cetk")); + } + catch (Exception ex) + { + if (!this.continueWithoutTicket || !flag1) + { + this.fireDebug(" + Downloading Ticket Failed..."); + throw new Exception("Downloading Ticket Failed:\n" + ex.Message); + } + if (!System.IO.File.Exists(Path.Combine(outputDir, "cetk"))) + { + flag2 = false; + flag3 = false; + } + } + this.fireProgress(10); + Ticket tik = new Ticket(); + if (System.IO.File.Exists(Path.Combine(outputDir, "cetk"))) + { + this.fireDebug(" + Parsing Ticket..."); + tik = Ticket.Load(Path.Combine(outputDir, "cetk")); + if (this.nusUrl == "http://nus.cdn.t.shop.nintendowifi.net/ccs/download/") + tik.DSiTicket = true; + } + else + this.fireDebug(" + Ticket Unavailable..."); + string[] strArray = new string[(int) tmd.NumOfContents]; + for (int index = 0; index < (int) tmd.NumOfContents; ++index) + { + this.fireDebug(" - Downloading Content #{0} of {1}... ({2} bytes)", (object) (index + 1), (object) tmd.NumOfContents, (object) tmd.Contents[index].Size); + this.fireProgress((index + 1) * 60 / (int) tmd.NumOfContents + 10); + if (this.useLocalFiles) + { + if (System.IO.File.Exists(Path.Combine(outputDir, tmd.Contents[index].ContentID.ToString("x8")))) + { + this.fireDebug(" + Using Local File, Skipping..."); + continue; + } + } + try + { + this.wcNus.DownloadFile(path1 + tmd.Contents[index].ContentID.ToString("x8"), Path.Combine(outputDir, tmd.Contents[index].ContentID.ToString("x8"))); + strArray[index] = tmd.Contents[index].ContentID.ToString("x8"); + } + catch (Exception ex) + { + this.fireDebug(" - Downloading Content #{0} of {1} failed...", (object) (index + 1), (object) tmd.NumOfContents); + throw new Exception("Downloading Content Failed:\n" + ex.Message); + } + } + if (flag2 || flag3) + { + SHA1 shA1 = SHA1.Create(); + for (int contentIndex = 0; contentIndex < (int) tmd.NumOfContents; ++contentIndex) + { + this.fireDebug(" - Decrypting Content #{0} of {1}...", (object) (contentIndex + 1), (object) tmd.NumOfContents); + this.fireProgress((contentIndex + 1) * 20 / (int) tmd.NumOfContents + 75); + byte[] array = this.decryptContent(System.IO.File.ReadAllBytes(Path.Combine(outputDir, tmd.Contents[contentIndex].ContentID.ToString("x8"))), contentIndex, tik, tmd); + Array.Resize(ref array, (int) tmd.Contents[contentIndex].Size); + if (!Shared.CompareByteArrays(shA1.ComputeHash(array), tmd.Contents[contentIndex].Hash)) + this.fireDebug(" + Hashes do not match! (Invalid Output)"); + System.IO.File.WriteAllBytes(Path.Combine(outputDir, tmd.Contents[contentIndex].ContentID.ToString("x8") + ".app"), array); + } + shA1.Clear(); + } + if (flag3) + { + this.fireDebug(" - Building Certificate Chain..."); + CertificateChain cert = CertificateChain.FromTikTmd(Path.Combine(outputDir, "cetk"), tmdFile); + byte[][] contents = new byte[(int) tmd.NumOfContents][]; + for (int index = 0; index < (int) tmd.NumOfContents; ++index) + contents[index] = System.IO.File.ReadAllBytes(Path.Combine(outputDir, tmd.Contents[index].ContentID.ToString("x8") + ".app")); + this.fireDebug(" - Creating WAD..."); + WAD wad = WAD.Create(cert, tik, tmd, contents); + wad.RemoveFooter(); + wadName = wadName.Replace("[v]", "v" + this.TitleVersion.ToString()); + if (Path.DirectorySeparatorChar.ToString() != "/" && Path.AltDirectorySeparatorChar.ToString() != "/") + wadName = wadName.Replace("/", ""); + if (wadName.Contains(Path.DirectorySeparatorChar.ToString()) || wadName.Contains(Path.AltDirectorySeparatorChar.ToString())) + wad.Save(wadName); + else + wad.Save(Path.Combine(outputDir, wadName)); + } + if (!flag1) + { + this.fireDebug(" - Deleting Encrypted Contents..."); + for (int index = 0; index < strArray.Length; ++index) + { + if (System.IO.File.Exists(Path.Combine(outputDir, strArray[index]))) + System.IO.File.Delete(Path.Combine(outputDir, strArray[index])); + } + } + if (flag3 && !flag2) + { + this.fireDebug(" - Deleting Decrypted Contents..."); + for (int index = 0; index < strArray.Length; ++index) + { + if (System.IO.File.Exists(Path.Combine(outputDir, strArray[index] + ".app"))) + System.IO.File.Delete(Path.Combine(outputDir, strArray[index] + ".app")); + } + } + if (!flag2 && !flag1) + { + this.fireDebug(" - Deleting TMD and Ticket..."); + System.IO.File.Delete(Path.Combine(outputDir, path2)); + System.IO.File.Delete(Path.Combine(outputDir, "cetk")); + } + this.fireDebug("Downloading Title {0} v{1} Finished...", (object) titleId, (object) tmd.TitleVersion); + this.fireProgress(100); + } + + private byte[] decryptContent(byte[] content, int contentIndex, Ticket tik, TMD tmd) + { + Array.Resize(ref content, Shared.AddPadding(content.Length, 16)); + byte[] titleKey = tik.TitleKey; + byte[] numArray = new byte[16]; + byte[] bytes = BitConverter.GetBytes(tmd.Contents[contentIndex].Index); + numArray[0] = bytes[1]; + numArray[1] = bytes[0]; + RijndaelManaged rijndaelManaged = new RijndaelManaged(); + rijndaelManaged.Mode = CipherMode.CBC; + rijndaelManaged.Padding = PaddingMode.None; + rijndaelManaged.KeySize = 128; + rijndaelManaged.BlockSize = 128; + rijndaelManaged.Key = titleKey; + rijndaelManaged.IV = numArray; + ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(); + MemoryStream memoryStream = new MemoryStream(content); + CryptoStream cryptoStream = new CryptoStream((Stream) memoryStream, decryptor, CryptoStreamMode.Read); + byte[] buffer = new byte[content.Length]; + cryptoStream.Read(buffer, 0, buffer.Length); + cryptoStream.Dispose(); + memoryStream.Dispose(); + return buffer; + } + + private bool CheckInet() + { + try + { + Dns.GetHostEntry("www.google.com"); + return true; + } + catch + { + return false; + } + } + + public event EventHandler Progress; + + public event EventHandler Debug; + + private void fireDebug(string debugMessage, params object[] args) + { + EventHandler debug = this.Debug; + if (debug == null) + return; + debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); + } + + private void fireProgress(int progressPercentage) + { + EventHandler progress = this.Progress; + if (progress == null) + return; + progress(new object(), new ProgressChangedEventArgs(progressPercentage, (object) string.Empty)); + } + } +} diff --git a/libWiiSharp/Region.cs b/libWiiSharp/Region.cs new file mode 100644 index 0000000..a2a24a7 --- /dev/null +++ b/libWiiSharp/Region.cs @@ -0,0 +1,16 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.Region +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +namespace libWiiSharp +{ + public enum Region : ushort + { + Japan, + USA, + Europe, + Free, + } +} diff --git a/libWiiSharp/Shared.cs b/libWiiSharp/Shared.cs new file mode 100644 index 0000000..8219879 --- /dev/null +++ b/libWiiSharp/Shared.cs @@ -0,0 +1,148 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.Shared +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Net; + +namespace libWiiSharp +{ + public static class Shared + { + public static string[] MergeStringArrays(string[] a, string[] b) + { + List stringList = new List((IEnumerable) a); + foreach (string str in b) + { + if (!stringList.Contains(str)) + stringList.Add(str); + } + stringList.Sort(); + return stringList.ToArray(); + } + + public static bool CompareByteArrays( + byte[] first, + int firstIndex, + byte[] second, + int secondIndex, + int length) + { + if (first.Length < length || second.Length < length) + return false; + for (int index = 0; index < length; ++index) + { + if ((int) first[firstIndex + index] != (int) second[secondIndex + index]) + return false; + } + return true; + } + + public static bool CompareByteArrays(byte[] first, byte[] second) + { + if (first.Length != second.Length) + return false; + for (int index = 0; index < first.Length; ++index) + { + if ((int) first[index] != (int) second[index]) + return false; + } + return true; + } + + public static string ByteArrayToString(byte[] byteArray, char separator = ' ') + { + string str = string.Empty; + foreach (byte num in byteArray) + str = str + num.ToString("x2").ToUpper() + (object) separator; + return str.Remove(str.Length - 1); + } + + public static byte[] HexStringToByteArray(string hexString) + { + byte[] byteArray = new byte[hexString.Length / 2]; + for (int index = 0; index < hexString.Length / 2; ++index) + byteArray[index] = byte.Parse(hexString.Substring(index * 2, 2), NumberStyles.HexNumber); + return byteArray; + } + + public static int CountCharsInString(string theString, char theChar) + { + int num1 = 0; + foreach (int num2 in theString) + { + if (num2 == (int) theChar) + ++num1; + } + return num1; + } + + public static long AddPadding(long value) => Shared.AddPadding(value, 64); + + public static long AddPadding(long value, int padding) + { + if (value % (long) padding != 0L) + value += (long) padding - value % (long) padding; + return value; + } + + public static int AddPadding(int value) => Shared.AddPadding(value, 64); + + public static int AddPadding(int value, int padding) + { + if (value % padding != 0) + value += padding - value % padding; + return value; + } + + public static ushort Swap(ushort value) => (ushort) IPAddress.HostToNetworkOrder((short) value); + + public static uint Swap(uint value) => (uint) IPAddress.HostToNetworkOrder((int) value); + + public static ulong Swap(ulong value) => (ulong) IPAddress.HostToNetworkOrder((long) value); + + public static byte[] UShortArrayToByteArray(ushort[] array) + { + List byteList = new List(); + foreach (ushort num in array) + { + byte[] bytes = BitConverter.GetBytes(num); + byteList.AddRange((IEnumerable) bytes); + } + return byteList.ToArray(); + } + + public static byte[] UIntArrayToByteArray(uint[] array) + { + List byteList = new List(); + foreach (uint num in array) + { + byte[] bytes = BitConverter.GetBytes(num); + byteList.AddRange((IEnumerable) bytes); + } + return byteList.ToArray(); + } + + public static uint[] ByteArrayToUIntArray(byte[] array) + { + uint[] uintArray = new uint[array.Length / 4]; + int num = 0; + for (int startIndex = 0; startIndex < array.Length; startIndex += 4) + uintArray[num++] = BitConverter.ToUInt32(array, startIndex); + return uintArray; + } + + public static ushort[] ByteArrayToUShortArray(byte[] array) + { + ushort[] ushortArray = new ushort[array.Length / 2]; + int num = 0; + for (int startIndex = 0; startIndex < array.Length; startIndex += 2) + ushortArray[num++] = BitConverter.ToUInt16(array, startIndex); + return ushortArray; + } + } +} diff --git a/libWiiSharp/StoreType.cs b/libWiiSharp/StoreType.cs new file mode 100644 index 0000000..bfddac2 --- /dev/null +++ b/libWiiSharp/StoreType.cs @@ -0,0 +1,17 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.StoreType +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +namespace libWiiSharp +{ + public enum StoreType + { + EncryptedContent, + DecryptedContent, + WAD, + All, + Empty, + } +} diff --git a/libWiiSharp/TMD.cs b/libWiiSharp/TMD.cs new file mode 100644 index 0000000..c7ef129 --- /dev/null +++ b/libWiiSharp/TMD.cs @@ -0,0 +1,490 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.TMD +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.Cryptography; + +namespace libWiiSharp +{ + public class TMD : IDisposable + { + private bool fakeSign; + private uint signatureExponent = 65537; + private byte[] signature = new byte[256]; + private byte[] padding = new byte[60]; + private byte[] issuer = new byte[64]; + private byte version; + private byte caCrlVersion; + private byte signerCrlVersion; + private byte paddingByte; + private ulong startupIos; + private ulong titleId; + private uint titleType; + private ushort groupId; + private ushort padding2; + private ushort region; + private byte[] reserved = new byte[58]; + private uint accessRights; + private ushort titleVersion; + private ushort numOfContents; + private ushort bootIndex; + private ushort padding3; + private List contents; + private bool isDisposed; + + public Region Region + { + get => (Region) this.region; + set => this.region = (ushort) value; + } + + public ulong StartupIOS + { + get => this.startupIos; + set => this.startupIos = value; + } + + public ulong TitleID + { + get => this.titleId; + set => this.titleId = value; + } + + public ushort TitleVersion + { + get => this.titleVersion; + set => this.titleVersion = value; + } + + public ushort NumOfContents => this.numOfContents; + + public ushort BootIndex + { + get => this.bootIndex; + set + { + if ((int) value > (int) this.numOfContents) + return; + this.bootIndex = value; + } + } + + public TMD_Content[] Contents + { + get => this.contents.ToArray(); + set + { + this.contents = new List((IEnumerable) value); + this.numOfContents = (ushort) value.Length; + } + } + + public bool FakeSign + { + get => this.fakeSign; + set => this.fakeSign = value; + } + + ~TMD() => this.Dispose(false); + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing && !this.isDisposed) + { + this.signature = (byte[]) null; + this.padding = (byte[]) null; + this.issuer = (byte[]) null; + this.reserved = (byte[]) null; + this.contents.Clear(); + this.contents = (List) null; + } + this.isDisposed = true; + } + + public static TMD Load(string pathToTmd) => TMD.Load(File.ReadAllBytes(pathToTmd)); + + public static TMD Load(byte[] tmdFile) + { + TMD tmd = new TMD(); + MemoryStream tmdFile1 = new MemoryStream(tmdFile); + try + { + tmd.parseTmd((Stream) tmdFile1); + } + catch + { + tmdFile1.Dispose(); + throw; + } + tmdFile1.Dispose(); + return tmd; + } + + public static TMD Load(Stream tmd) + { + TMD tmd1 = new TMD(); + tmd1.parseTmd(tmd); + return tmd1; + } + + public void LoadFile(string pathToTmd) => this.LoadFile(File.ReadAllBytes(pathToTmd)); + + public void LoadFile(byte[] tmdFile) + { + MemoryStream tmdFile1 = new MemoryStream(tmdFile); + try + { + this.parseTmd((Stream) tmdFile1); + } + catch + { + tmdFile1.Dispose(); + throw; + } + tmdFile1.Dispose(); + } + + public void LoadFile(Stream tmd) => this.parseTmd(tmd); + + public void Save(string savePath) => this.Save(savePath, false); + + public void Save(string savePath, bool fakeSign) + { + if (fakeSign) + this.fakeSign = true; + if (File.Exists(savePath)) + File.Delete(savePath); + using (FileStream writeStream = new FileStream(savePath, FileMode.Create)) + this.writeToStream((Stream) writeStream); + } + + public MemoryStream ToMemoryStream() => this.ToMemoryStream(false); + + public MemoryStream ToMemoryStream(bool fakeSign) + { + if (fakeSign) + this.fakeSign = true; + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + return writeStream; + } + + public byte[] ToByteArray() => this.ToByteArray(false); + + public byte[] ToByteArray(bool fakeSign) + { + if (fakeSign) + this.fakeSign = true; + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + byte[] array = writeStream.ToArray(); + writeStream.Dispose(); + return array; + } + + public void UpdateContents(string contentDir) + { + bool flag = true; + for (int index = 0; index < this.contents.Count; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + this.contents[index].ContentID.ToString("x8") + ".app")) + { + flag = false; + break; + } + } + if (!flag) + { + for (int index = 0; index < this.contents.Count; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + this.contents[index].ContentID.ToString("x8") + ".app")) + throw new Exception("Couldn't find all content files!"); + } + } + byte[][] conts = new byte[this.contents.Count][]; + for (int index = 0; index < this.contents.Count; ++index) + { + string path = contentDir + (object) Path.DirectorySeparatorChar + (flag ? (object) this.contents[index].ContentID.ToString("x8") : (object) this.contents[index].Index.ToString("x8")) + ".app"; + conts[index] = File.ReadAllBytes(path); + } + this.updateContents(conts); + } + + public void UpdateContents(byte[][] contents) => this.updateContents(contents); + + public string GetUpperTitleID() + { + byte[] bytes = BitConverter.GetBytes(Shared.Swap((uint) this.titleId)); + return new string(new char[4] + { + (char) bytes[0], + (char) bytes[1], + (char) bytes[2], + (char) bytes[3] + }); + } + + public string GetNandBlocks() => this.calculateNandBlocks(); + + public void AddContent(TMD_Content content) + { + this.contents.Add(content); + this.numOfContents = (ushort) this.contents.Count; + } + + public void RemoveContent(int contentIndex) + { + for (int index = 0; index < (int) this.numOfContents; ++index) + { + if ((int) this.contents[index].Index == contentIndex) + { + this.contents.RemoveAt(index); + break; + } + } + this.numOfContents = (ushort) this.contents.Count; + } + + public void RemoveContentByID(int contentId) + { + for (int index = 0; index < (int) this.numOfContents; ++index) + { + if ((long) this.contents[index].ContentID == (long) contentId) + { + this.contents.RemoveAt(index); + break; + } + } + this.numOfContents = (ushort) this.contents.Count; + } + + private void writeToStream(Stream writeStream) + { + this.fireDebug("Writing TMD..."); + if (this.fakeSign) + { + this.fireDebug(" Clearing Signature..."); + this.signature = new byte[256]; + } + MemoryStream memoryStream = new MemoryStream(); + memoryStream.Seek(0L, SeekOrigin.Begin); + this.fireDebug(" Writing Signature Exponent... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.signatureExponent)), 0, 4); + this.fireDebug(" Writing Signature... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.signature, 0, this.signature.Length); + this.fireDebug(" Writing Padding... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.padding, 0, this.padding.Length); + this.fireDebug(" Writing Issuer... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.issuer, 0, this.issuer.Length); + this.fireDebug(" Writing Version... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.WriteByte(this.version); + this.fireDebug(" Writing CA Crl Version... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.WriteByte(this.caCrlVersion); + this.fireDebug(" Writing Signer Crl Version... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.WriteByte(this.signerCrlVersion); + this.fireDebug(" Writing Padding Byte... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.WriteByte(this.paddingByte); + this.fireDebug(" Writing Startup IOS... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.startupIos)), 0, 8); + this.fireDebug(" Writing Title ID... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.titleId)), 0, 8); + this.fireDebug(" Writing Title Type... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.titleType)), 0, 4); + this.fireDebug(" Writing Group ID... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.groupId)), 0, 2); + this.fireDebug(" Writing Padding2... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.padding2)), 0, 2); + this.fireDebug(" Writing Region... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.region)), 0, 2); + this.fireDebug(" Writing Reserved... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.reserved, 0, this.reserved.Length); + this.fireDebug(" Writing Access Rights... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.accessRights)), 0, 4); + this.fireDebug(" Writing Title Version... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.titleVersion)), 0, 2); + this.fireDebug(" Writing NumOfContents... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.numOfContents)), 0, 2); + this.fireDebug(" Writing Boot Index... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.bootIndex)), 0, 2); + this.fireDebug(" Writing Padding3... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.padding3)), 0, 2); + List contentIndicesList = new List(); + for (int index = 0; index < this.contents.Count; ++index) + contentIndicesList.Add(new ContentIndices(index, (int) this.contents[index].Index)); + contentIndicesList.Sort(); + for (int index = 0; index < contentIndicesList.Count; ++index) + { + this.fireDebug(" Writing Content #{1} of {2}... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper().ToUpper(), (object) (index + 1), (object) this.numOfContents); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.contents[contentIndicesList[index].Index].ContentID)), 0, 4); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.contents[contentIndicesList[index].Index].Index)), 0, 2); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap((ushort) this.contents[contentIndicesList[index].Index].Type)), 0, 2); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.contents[contentIndicesList[index].Index].Size)), 0, 8); + memoryStream.Write(this.contents[contentIndicesList[index].Index].Hash, 0, this.contents[contentIndicesList[index].Index].Hash.Length); + } + byte[] array = memoryStream.ToArray(); + memoryStream.Dispose(); + if (this.fakeSign) + { + this.fireDebug(" Fakesigning TMD..."); + byte[] numArray = new byte[20]; + SHA1 shA1 = SHA1.Create(); + for (ushort index = 0; index < ushort.MaxValue; ++index) + { + byte[] bytes = BitConverter.GetBytes(index); + array[482] = bytes[1]; + array[483] = bytes[0]; + if (shA1.ComputeHash(array)[0] == (byte) 0) + { + this.fireDebug(" -> Signed ({0})", (object) index); + break; + } + if (index == (ushort) 65534) + { + this.fireDebug(" -> Signing Failed..."); + throw new Exception("Fakesigning failed..."); + } + } + shA1.Clear(); + } + writeStream.Seek(0L, SeekOrigin.Begin); + writeStream.Write(array, 0, array.Length); + this.fireDebug("Writing TMD Finished..."); + } + + private void updateContents(byte[][] conts) + { + SHA1 shA1 = SHA1.Create(); + for (int index = 0; index < this.contents.Count; ++index) + { + this.contents[index].Size = (ulong) conts[index].Length; + this.contents[index].Hash = shA1.ComputeHash(conts[index]); + } + shA1.Clear(); + } + + private void parseTmd(Stream tmdFile) + { + this.fireDebug("Pasing TMD..."); + tmdFile.Seek(0L, SeekOrigin.Begin); + byte[] buffer = new byte[8]; + this.fireDebug(" Reading Signature Exponent... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 4); + this.signatureExponent = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + this.fireDebug(" Reading Signature... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(this.signature, 0, this.signature.Length); + this.fireDebug(" Reading Padding... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(this.padding, 0, this.padding.Length); + this.fireDebug(" Reading Issuer... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(this.issuer, 0, this.issuer.Length); + this.fireDebug(" Reading Version... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + this.fireDebug(" Reading CA Crl Version... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + this.fireDebug(" Reading Signer Crl Version... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + this.fireDebug(" Reading Padding Byte... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 4); + this.version = buffer[0]; + this.caCrlVersion = buffer[1]; + this.signerCrlVersion = buffer[2]; + this.paddingByte = buffer[3]; + this.fireDebug(" Reading Startup IOS... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 8); + this.startupIos = Shared.Swap(BitConverter.ToUInt64(buffer, 0)); + this.fireDebug(" Reading Title ID... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 8); + this.titleId = Shared.Swap(BitConverter.ToUInt64(buffer, 0)); + this.fireDebug(" Reading Title Type... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 4); + this.titleType = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + this.fireDebug(" Reading Group ID... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 2); + this.groupId = Shared.Swap(BitConverter.ToUInt16(buffer, 0)); + this.fireDebug(" Reading Padding2... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 2); + this.padding2 = Shared.Swap(BitConverter.ToUInt16(buffer, 0)); + this.fireDebug(" Reading Region... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 2); + this.region = Shared.Swap(BitConverter.ToUInt16(buffer, 0)); + this.fireDebug(" Reading Reserved... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(this.reserved, 0, this.reserved.Length); + this.fireDebug(" Reading Access Rights... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 4); + this.accessRights = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + this.fireDebug(" Reading Title Version... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + this.fireDebug(" Reading NumOfContents... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + this.fireDebug(" Reading Boot Index... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + this.fireDebug(" Reading Padding3... (Offset: 0x{0})", (object) tmdFile.Position.ToString("x8").ToUpper()); + tmdFile.Read(buffer, 0, 8); + this.titleVersion = Shared.Swap(BitConverter.ToUInt16(buffer, 0)); + this.numOfContents = Shared.Swap(BitConverter.ToUInt16(buffer, 2)); + this.bootIndex = Shared.Swap(BitConverter.ToUInt16(buffer, 4)); + this.padding3 = Shared.Swap(BitConverter.ToUInt16(buffer, 6)); + this.contents = new List(); + for (int index = 0; index < (int) this.numOfContents; ++index) + { + this.fireDebug(" Reading Content #{0} of {1}... (Offset: 0x{2})", (object) (index + 1), (object) this.numOfContents, (object) tmdFile.Position.ToString("x8").ToUpper().ToUpper()); + TMD_Content tmdContent = new TMD_Content(); + tmdContent.Hash = new byte[20]; + tmdFile.Read(buffer, 0, 8); + tmdContent.ContentID = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + tmdContent.Index = Shared.Swap(BitConverter.ToUInt16(buffer, 4)); + tmdContent.Type = (ContentType) Shared.Swap(BitConverter.ToUInt16(buffer, 6)); + tmdFile.Read(buffer, 0, 8); + tmdContent.Size = Shared.Swap(BitConverter.ToUInt64(buffer, 0)); + tmdFile.Read(tmdContent.Hash, 0, tmdContent.Hash.Length); + this.contents.Add(tmdContent); + } + this.fireDebug("Pasing TMD Finished..."); + } + + private string calculateNandBlocks() + { + int num1 = 0; + int num2 = 0; + for (int index = 0; index < (int) this.numOfContents; ++index) + { + num2 += (int) this.contents[index].Size; + if (this.contents[index].Type == ContentType.Normal) + num1 += (int) this.contents[index].Size; + } + int num3 = (int) Math.Ceiling((double) num1 / 131072.0); + int num4 = (int) Math.Ceiling((double) num2 / 131072.0); + return num3 == num4 ? num4.ToString() : string.Format("{0} - {1}", (object) num3, (object) num4); + } + + public event EventHandler Debug; + + private void fireDebug(string debugMessage, params object[] args) + { + EventHandler debug = this.Debug; + if (debug == null) + return; + debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); + } + } +} diff --git a/libWiiSharp/TMD_Content.cs b/libWiiSharp/TMD_Content.cs new file mode 100644 index 0000000..c0b9038 --- /dev/null +++ b/libWiiSharp/TMD_Content.cs @@ -0,0 +1,47 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.TMD_Content +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +namespace libWiiSharp +{ + public class TMD_Content + { + private uint contentId; + private ushort index; + private ushort type; + private ulong size; + private byte[] hash = new byte[20]; + + public uint ContentID + { + get => this.contentId; + set => this.contentId = value; + } + + public ushort Index + { + get => this.index; + set => this.index = value; + } + + public ContentType Type + { + get => (ContentType) this.type; + set => this.type = (ushort) value; + } + + public ulong Size + { + get => this.size; + set => this.size = value; + } + + public byte[] Hash + { + get => this.hash; + set => this.hash = value; + } + } +} diff --git a/libWiiSharp/Ticket.cs b/libWiiSharp/Ticket.cs new file mode 100644 index 0000000..107cbd8 --- /dev/null +++ b/libWiiSharp/Ticket.cs @@ -0,0 +1,478 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.Ticket +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.IO; +using System.Security.Cryptography; + +namespace libWiiSharp +{ + public class Ticket : IDisposable + { + private byte newKeyIndex; + private byte[] decryptedTitleKey = new byte[16]; + private bool fakeSign; + private bool titleKeyChanged; + private byte[] newEncryptedTitleKey = new byte[0]; + private bool reDecrypt; + private uint signatureExponent = 65537; + private byte[] signature = new byte[256]; + private byte[] padding = new byte[60]; + private byte[] issuer = new byte[64]; + private byte[] unknown = new byte[63]; + private byte[] encryptedTitleKey = new byte[16]; + private byte unknown2; + private ulong ticketId; + private uint consoleId; + private ulong titleId; + private ushort unknown3 = ushort.MaxValue; + private ushort numOfDlc; + private ulong unknown4; + private byte padding2; + private byte commonKeyIndex; + private byte[] unknown5 = new byte[48]; + private byte[] unknown6 = new byte[32]; + private ushort padding3; + private uint enableTimeLimit; + private uint timeLimit; + private byte[] padding4 = new byte[88]; + private bool dsitik; + private bool isDisposed; + + public byte[] TitleKey + { + get => this.decryptedTitleKey; + set + { + this.decryptedTitleKey = value; + this.titleKeyChanged = true; + this.reDecrypt = false; + } + } + + public CommonKeyType CommonKeyIndex + { + get => (CommonKeyType) this.newKeyIndex; + set => this.newKeyIndex = (byte) value; + } + + public ulong TicketID + { + get => this.ticketId; + set => this.ticketId = value; + } + + public uint ConsoleID + { + get => this.consoleId; + set => this.consoleId = value; + } + + public ulong TitleID + { + get => this.titleId; + set + { + this.titleId = value; + if (!this.reDecrypt) + return; + this.reDecryptTitleKey(); + } + } + + public ushort NumOfDLC + { + get => this.numOfDlc; + set => this.numOfDlc = value; + } + + public bool FakeSign + { + get => this.fakeSign; + set => this.fakeSign = value; + } + + public bool TitleKeyChanged => this.titleKeyChanged; + + public bool DSiTicket + { + get => this.dsitik; + set + { + this.dsitik = value; + this.decryptTitleKey(); + } + } + + ~Ticket() => this.Dispose(false); + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing && !this.isDisposed) + { + this.decryptedTitleKey = (byte[]) null; + this.newEncryptedTitleKey = (byte[]) null; + this.signature = (byte[]) null; + this.padding = (byte[]) null; + this.issuer = (byte[]) null; + this.unknown = (byte[]) null; + this.encryptedTitleKey = (byte[]) null; + this.unknown5 = (byte[]) null; + this.unknown6 = (byte[]) null; + this.padding4 = (byte[]) null; + } + this.isDisposed = true; + } + + public static Ticket Load(string pathToTicket) => Ticket.Load(File.ReadAllBytes(pathToTicket)); + + public static Ticket Load(byte[] ticket) + { + Ticket ticket1 = new Ticket(); + MemoryStream ticketFile = new MemoryStream(ticket); + try + { + ticket1.parseTicket((Stream) ticketFile); + } + catch + { + ticketFile.Dispose(); + throw; + } + ticketFile.Dispose(); + return ticket1; + } + + public static Ticket Load(Stream ticket) + { + Ticket ticket1 = new Ticket(); + ticket1.parseTicket(ticket); + return ticket1; + } + + public void LoadFile(string pathToTicket) => this.LoadFile(File.ReadAllBytes(pathToTicket)); + + public void LoadFile(byte[] ticket) + { + MemoryStream ticketFile = new MemoryStream(ticket); + try + { + this.parseTicket((Stream) ticketFile); + } + catch + { + ticketFile.Dispose(); + throw; + } + ticketFile.Dispose(); + } + + public void LoadFile(Stream ticket) => this.parseTicket(ticket); + + public void Save(string savePath) => this.Save(savePath, false); + + public void Save(string savePath, bool fakeSign) + { + if (fakeSign) + this.fakeSign = true; + if (File.Exists(savePath)) + File.Delete(savePath); + using (FileStream writeStream = new FileStream(savePath, FileMode.Create)) + this.writeToStream((Stream) writeStream); + } + + public MemoryStream ToMemoryStream() => this.ToMemoryStream(false); + + public MemoryStream ToMemoryStream(bool fakeSign) + { + if (fakeSign) + this.fakeSign = true; + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + return writeStream; + } + + public byte[] ToByteArray() => this.ToByteArray(false); + + public byte[] ToByteArray(bool fakeSign) + { + if (fakeSign) + this.fakeSign = true; + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + byte[] array = writeStream.ToArray(); + writeStream.Dispose(); + return array; + } + + public void SetTitleKey(string newTitleKey) => this.SetTitleKey(newTitleKey.ToCharArray()); + + public void SetTitleKey(char[] newTitleKey) + { + if (newTitleKey.Length != 16) + throw new Exception("The title key must be 16 characters long!"); + for (int index = 0; index < 16; ++index) + this.encryptedTitleKey[index] = (byte) newTitleKey[index]; + this.decryptTitleKey(); + this.titleKeyChanged = true; + this.reDecrypt = true; + this.newEncryptedTitleKey = this.encryptedTitleKey; + } + + public void SetTitleKey(byte[] newTitleKey) + { + this.encryptedTitleKey = newTitleKey.Length == 16 ? newTitleKey : throw new Exception("The title key must be 16 characters long!"); + this.decryptTitleKey(); + this.titleKeyChanged = true; + this.reDecrypt = true; + this.newEncryptedTitleKey = newTitleKey; + } + + public string GetUpperTitleID() + { + byte[] bytes = BitConverter.GetBytes(Shared.Swap((uint) this.titleId)); + return new string(new char[4] + { + (char) bytes[0], + (char) bytes[1], + (char) bytes[2], + (char) bytes[3] + }); + } + + private void writeToStream(Stream writeStream) + { + this.fireDebug("Writing Ticket..."); + this.fireDebug(" Encrypting Title Key..."); + this.encryptTitleKey(); + this.fireDebug(" -> Decrypted Title Key: {0}", (object) Shared.ByteArrayToString(this.decryptedTitleKey)); + this.fireDebug(" -> Encrypted Title Key: {0}", (object) Shared.ByteArrayToString(this.encryptedTitleKey)); + if (this.fakeSign) + { + this.fireDebug(" Clearing Signature..."); + this.signature = new byte[256]; + } + MemoryStream memoryStream = new MemoryStream(); + memoryStream.Seek(0L, SeekOrigin.Begin); + this.fireDebug(" Writing Signature Exponent... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.signatureExponent)), 0, 4); + this.fireDebug(" Writing Signature... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.signature, 0, this.signature.Length); + this.fireDebug(" Writing Padding... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.padding, 0, this.padding.Length); + this.fireDebug(" Writing Issuer... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.issuer, 0, this.issuer.Length); + this.fireDebug(" Writing Unknown... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.unknown, 0, this.unknown.Length); + this.fireDebug(" Writing Title Key... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.encryptedTitleKey, 0, this.encryptedTitleKey.Length); + this.fireDebug(" Writing Unknown2... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.WriteByte(this.unknown2); + this.fireDebug(" Writing Ticket ID... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.ticketId)), 0, 8); + this.fireDebug(" Writing Console ID... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.consoleId)), 0, 4); + this.fireDebug(" Writing Title ID... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.titleId)), 0, 8); + this.fireDebug(" Writing Unknwon3... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.unknown3)), 0, 2); + this.fireDebug(" Writing NumOfDLC... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.numOfDlc)), 0, 2); + this.fireDebug(" Writing Unknwon4... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.unknown4)), 0, 8); + this.fireDebug(" Writing Padding2... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.WriteByte(this.padding2); + this.fireDebug(" Writing Common Key Index... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.WriteByte(this.commonKeyIndex); + this.fireDebug(" Writing Unknown5... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.unknown5, 0, this.unknown5.Length); + this.fireDebug(" Writing Unknown6... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.unknown6, 0, this.unknown6.Length); + this.fireDebug(" Writing Padding3... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.padding3)), 0, 2); + this.fireDebug(" Writing Enable Time Limit... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.enableTimeLimit)), 0, 4); + this.fireDebug(" Writing Time Limit... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(BitConverter.GetBytes(Shared.Swap(this.timeLimit)), 0, 4); + this.fireDebug(" Writing Padding4... (Offset: 0x{0})", (object) memoryStream.Position.ToString("x8").ToUpper()); + memoryStream.Write(this.padding4, 0, this.padding4.Length); + byte[] array = memoryStream.ToArray(); + memoryStream.Dispose(); + if (this.fakeSign) + { + this.fireDebug(" Fakesigning Ticket..."); + byte[] numArray = new byte[20]; + SHA1 shA1 = SHA1.Create(); + for (ushort index = 0; index < ushort.MaxValue; ++index) + { + byte[] bytes = BitConverter.GetBytes(index); + array[498] = bytes[1]; + array[499] = bytes[0]; + if (shA1.ComputeHash(array)[0] == (byte) 0) + { + this.fireDebug(" -> Signed ({0})", (object) index); + break; + } + if (index == (ushort) 65534) + { + this.fireDebug(" -> Signing Failed..."); + throw new Exception("Fakesigning failed..."); + } + } + shA1.Clear(); + } + writeStream.Seek(0L, SeekOrigin.Begin); + writeStream.Write(array, 0, array.Length); + this.fireDebug("Writing Ticket Finished..."); + } + + private void parseTicket(Stream ticketFile) + { + this.fireDebug("Parsing Ticket..."); + ticketFile.Seek(0L, SeekOrigin.Begin); + byte[] buffer = new byte[8]; + this.fireDebug(" Reading Signature Exponent... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(buffer, 0, 4); + this.signatureExponent = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + this.fireDebug(" Reading Signature... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(this.signature, 0, this.signature.Length); + this.fireDebug(" Reading Padding... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(this.padding, 0, this.padding.Length); + this.fireDebug(" Reading Issuer... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(this.issuer, 0, this.issuer.Length); + this.fireDebug(" Reading Unknown... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(this.unknown, 0, this.unknown.Length); + this.fireDebug(" Reading Title Key... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(this.encryptedTitleKey, 0, this.encryptedTitleKey.Length); + this.fireDebug(" Reading Unknown2... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + this.unknown2 = (byte) ticketFile.ReadByte(); + this.fireDebug(" Reading Ticket ID.. (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(buffer, 0, 8); + this.ticketId = Shared.Swap(BitConverter.ToUInt64(buffer, 0)); + this.fireDebug(" Reading Console ID... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(buffer, 0, 4); + this.consoleId = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + this.fireDebug(" Reading Title ID... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(buffer, 0, 8); + this.titleId = Shared.Swap(BitConverter.ToUInt64(buffer, 0)); + this.fireDebug(" Reading Unknown3... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + this.fireDebug(" Reading NumOfDLC... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(buffer, 0, 4); + this.unknown3 = Shared.Swap(BitConverter.ToUInt16(buffer, 0)); + this.numOfDlc = Shared.Swap(BitConverter.ToUInt16(buffer, 2)); + this.fireDebug(" Reading Unknown4... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(buffer, 0, 8); + this.unknown4 = Shared.Swap(BitConverter.ToUInt64(buffer, 0)); + this.fireDebug(" Reading Padding2... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + this.padding2 = (byte) ticketFile.ReadByte(); + this.fireDebug(" Reading Common Key Index... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + this.commonKeyIndex = (byte) ticketFile.ReadByte(); + this.newKeyIndex = this.commonKeyIndex; + this.fireDebug(" Reading Unknown5... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(this.unknown5, 0, this.unknown5.Length); + this.fireDebug(" Reading Unknown6... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(this.unknown6, 0, this.unknown6.Length); + this.fireDebug(" Reading Padding3... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(buffer, 0, 2); + this.padding3 = Shared.Swap(BitConverter.ToUInt16(buffer, 0)); + this.fireDebug(" Reading Enable Time Limit... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + this.fireDebug(" Reading Time Limit... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(buffer, 0, 8); + this.enableTimeLimit = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + this.timeLimit = Shared.Swap(BitConverter.ToUInt32(buffer, 4)); + this.fireDebug(" Reading Padding4... (Offset: 0x{0})", (object) ticketFile.Position.ToString("x8").ToUpper()); + ticketFile.Read(this.padding4, 0, this.padding4.Length); + this.fireDebug(" Decrypting Title Key..."); + this.decryptTitleKey(); + this.fireDebug(" -> Encrypted Title Key: {0}", (object) Shared.ByteArrayToString(this.encryptedTitleKey)); + this.fireDebug(" -> Decrypted Title Key: {0}", (object) Shared.ByteArrayToString(this.decryptedTitleKey)); + this.fireDebug("Parsing Ticket Finished..."); + } + + private void decryptTitleKey() + { + byte[] numArray = !this.dsitik ? (this.commonKeyIndex == (byte) 1 ? CommonKey.GetKoreanKey() : CommonKey.GetStandardKey()) : CommonKey.GetDSiKey(); + byte[] bytes = BitConverter.GetBytes(Shared.Swap(this.titleId)); + Array.Resize(ref bytes, 16); + RijndaelManaged rijndaelManaged = new RijndaelManaged(); + rijndaelManaged.Mode = CipherMode.CBC; + rijndaelManaged.Padding = PaddingMode.None; + rijndaelManaged.KeySize = 128; + rijndaelManaged.BlockSize = 128; + rijndaelManaged.Key = numArray; + rijndaelManaged.IV = bytes; + ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(); + MemoryStream memoryStream = new MemoryStream(this.encryptedTitleKey); + CryptoStream cryptoStream = new CryptoStream((Stream) memoryStream, decryptor, CryptoStreamMode.Read); + cryptoStream.Read(this.decryptedTitleKey, 0, this.decryptedTitleKey.Length); + cryptoStream.Dispose(); + memoryStream.Dispose(); + decryptor.Dispose(); + rijndaelManaged.Clear(); + } + + private void encryptTitleKey() + { + this.commonKeyIndex = this.newKeyIndex; + byte[] numArray = !this.dsitik ? (this.commonKeyIndex == (byte) 1 ? CommonKey.GetKoreanKey() : CommonKey.GetStandardKey()) : CommonKey.GetDSiKey(); + byte[] bytes = BitConverter.GetBytes(Shared.Swap(this.titleId)); + Array.Resize(ref bytes, 16); + RijndaelManaged rijndaelManaged = new RijndaelManaged(); + rijndaelManaged.Mode = CipherMode.CBC; + rijndaelManaged.Padding = PaddingMode.None; + rijndaelManaged.KeySize = 128; + rijndaelManaged.BlockSize = 128; + rijndaelManaged.Key = numArray; + rijndaelManaged.IV = bytes; + ICryptoTransform encryptor = rijndaelManaged.CreateEncryptor(); + MemoryStream memoryStream = new MemoryStream(this.decryptedTitleKey); + CryptoStream cryptoStream = new CryptoStream((Stream) memoryStream, encryptor, CryptoStreamMode.Read); + cryptoStream.Read(this.encryptedTitleKey, 0, this.encryptedTitleKey.Length); + cryptoStream.Dispose(); + memoryStream.Dispose(); + encryptor.Dispose(); + rijndaelManaged.Clear(); + } + + private void reDecryptTitleKey() + { + this.encryptedTitleKey = this.newEncryptedTitleKey; + this.decryptTitleKey(); + } + + public event EventHandler Debug; + + private void fireDebug(string debugMessage, params object[] args) + { + EventHandler debug = this.Debug; + if (debug == null) + return; + debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); + } + } +} diff --git a/libWiiSharp/U8.cs b/libWiiSharp/U8.cs new file mode 100644 index 0000000..78e6392 --- /dev/null +++ b/libWiiSharp/U8.cs @@ -0,0 +1,735 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.U8 +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace libWiiSharp +{ + public class U8 : IDisposable + { + private const int dataPadding = 32; + private Headers.HeaderType headerType; + private object header; + private U8_Header u8Header = new U8_Header(); + private U8_Node rootNode = new U8_Node(); + private List u8Nodes = new List(); + private List stringTable = new List(); + private List data = new List(); + private int iconSize = -1; + private int bannerSize = -1; + private int soundSize = -1; + private bool lz77; + private bool isDisposed; + + public Headers.HeaderType HeaderType => this.headerType; + + public object Header => this.header; + + public U8_Node RootNode => this.rootNode; + + public List Nodes => this.u8Nodes; + + public string[] StringTable => this.stringTable.ToArray(); + + public byte[][] Data => this.data.ToArray(); + + public int NumOfNodes => (int) this.rootNode.SizeOfData - 1; + + public int IconSize => this.iconSize; + + public int BannerSize => this.bannerSize; + + public int SoundSize => this.soundSize; + + public bool Lz77Compress + { + get => this.lz77; + set => this.lz77 = value; + } + + public U8() => this.rootNode.Type = U8_NodeType.Directory; + + ~U8() => this.Dispose(false); + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing && !this.isDisposed) + { + this.header = (object) null; + this.u8Header = (U8_Header) null; + this.rootNode = (U8_Node) null; + this.u8Nodes.Clear(); + this.u8Nodes = (List) null; + this.stringTable.Clear(); + this.stringTable = (List) null; + this.data.Clear(); + this.data = (List) null; + } + this.isDisposed = true; + } + + public static bool IsU8(string pathToFile) => U8.IsU8(File.ReadAllBytes(pathToFile)); + + public static bool IsU8(byte[] file) + { + if (Lz77.IsLz77Compressed(file)) + { + byte[] file1 = new byte[file.Length > 2000 ? 2000 : file.Length]; + for (int index = 0; index < file1.Length; ++index) + file1[index] = file[index]; + return U8.IsU8(new Lz77().Decompress(file1)); + } + Headers.HeaderType startIndex = Headers.DetectHeader(file); + return Shared.Swap(BitConverter.ToUInt32(file, (int) startIndex)) == 1437218861U; + } + + public static U8 Load(string pathToU8) => U8.Load(File.ReadAllBytes(pathToU8)); + + public static U8 Load(byte[] u8File) + { + U8 u8 = new U8(); + MemoryStream u8File1 = new MemoryStream(u8File); + try + { + u8.parseU8((Stream) u8File1); + } + catch + { + u8File1.Dispose(); + throw; + } + u8File1.Dispose(); + return u8; + } + + public static U8 Load(Stream u8File) + { + U8 u8 = new U8(); + u8.parseU8(u8File); + return u8; + } + + public static U8 FromDirectory(string pathToDirectory) + { + U8 u8 = new U8(); + u8.createFromDir(pathToDirectory); + return u8; + } + + public void LoadFile(string pathToU8) => this.LoadFile(File.ReadAllBytes(pathToU8)); + + public void LoadFile(byte[] u8File) + { + MemoryStream u8File1 = new MemoryStream(u8File); + try + { + this.parseU8((Stream) u8File1); + } + catch + { + u8File1.Dispose(); + throw; + } + u8File1.Dispose(); + } + + public void LoadFile(Stream u8File) => this.parseU8(u8File); + + public void CreateFromDirectory(string pathToDirectory) => this.createFromDir(pathToDirectory); + + public void Save(string savePath) + { + if (File.Exists(savePath)) + File.Delete(savePath); + using (FileStream writeStream = new FileStream(savePath, FileMode.Create)) + this.writeToStream((Stream) writeStream); + } + + public MemoryStream ToMemoryStream() + { + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + return writeStream; + } + + public byte[] ToByteArray() => this.ToMemoryStream().ToArray(); + + public void Unpack(string saveDir) => this.unpackToDir(saveDir); + + public void Extract(string saveDir) => this.unpackToDir(saveDir); + + public void AddHeaderImet(bool shortImet, params string[] titles) + { + if (this.iconSize == -1) + throw new Exception("icon.bin wasn't found!"); + if (this.bannerSize == -1) + throw new Exception("banner.bin wasn't found!"); + if (this.soundSize == -1) + throw new Exception("sound.bin wasn't found!"); + this.header = (object) Headers.IMET.Create(shortImet, this.iconSize, this.bannerSize, this.soundSize, titles); + this.headerType = shortImet ? Headers.HeaderType.ShortIMET : Headers.HeaderType.IMET; + } + + public void AddHeaderImd5() => this.headerType = Headers.HeaderType.IMD5; + + public void ReplaceFile(int fileIndex, string pathToNewFile, bool changeFileName = false) + { + if (this.u8Nodes[fileIndex].Type == U8_NodeType.Directory) + throw new Exception("You can't replace a directory with a file!"); + this.data[fileIndex] = File.ReadAllBytes(pathToNewFile); + if (changeFileName) + this.stringTable[fileIndex] = Path.GetFileName(pathToNewFile); + if (this.stringTable[fileIndex].ToLower() == "icon.bin") + this.iconSize = this.getRealSize(File.ReadAllBytes(pathToNewFile)); + else if (this.stringTable[fileIndex].ToLower() == "banner.bin") + { + this.bannerSize = this.getRealSize(File.ReadAllBytes(pathToNewFile)); + } + else + { + if (!(this.stringTable[fileIndex].ToLower() == "sound.bin")) + return; + this.soundSize = this.getRealSize(File.ReadAllBytes(pathToNewFile)); + } + } + + public void ReplaceFile(int fileIndex, byte[] newData) + { + if (this.u8Nodes[fileIndex].Type == U8_NodeType.Directory) + throw new Exception("You can't replace a directory with a file!"); + this.data[fileIndex] = newData; + if (this.stringTable[fileIndex].ToLower() == "icon.bin") + this.iconSize = this.getRealSize(newData); + else if (this.stringTable[fileIndex].ToLower() == "banner.bin") + { + this.bannerSize = this.getRealSize(newData); + } + else + { + if (!(this.stringTable[fileIndex].ToLower() == "sound.bin")) + return; + this.soundSize = this.getRealSize(newData); + } + } + + public int GetNodeIndex(string fileOrDirName) + { + for (int index = 0; index < this.u8Nodes.Count; ++index) + { + if (this.stringTable[index].ToLower() == fileOrDirName.ToLower()) + return index; + } + return -1; + } + + public void RenameNode(int index, string newName) => this.stringTable[index] = newName; + + public void RenameNode(string oldName, string newName) => this.stringTable[this.GetNodeIndex(oldName)] = newName; + + public void AddDirectory(string path) => this.addEntry(path, new byte[0]); + + public void AddFile(string path, byte[] data) => this.addEntry(path, data); + + public void RemoveDirectory(string path) => this.removeEntry(path); + + public void RemoveFile(string path) => this.removeEntry(path); + + private void writeToStream(Stream writeStream) + { + this.fireDebug("Writing U8 File..."); + this.fireDebug(" Updating Rootnode..."); + this.rootNode.SizeOfData = (uint) (this.u8Nodes.Count + 1); + MemoryStream writeStream1 = new MemoryStream(); + writeStream1.Seek((long) this.u8Header.OffsetToRootNode + (long) ((this.u8Nodes.Count + 1) * 12), SeekOrigin.Begin); + this.fireDebug(" Writing String Table... (Offset: 0x{0})", (object) writeStream1.Position.ToString("x8").ToUpper()); + writeStream1.WriteByte((byte) 0); + int num = (int) writeStream1.Position - 1; + for (int index = 0; index < this.u8Nodes.Count; ++index) + { + this.fireDebug(" -> Entry #{1} of {2}: \"{3}\"... (Offset: 0x{0})", (object) writeStream1.Position.ToString("x8").ToUpper(), (object) (index + 1), (object) this.u8Nodes.Count, (object) this.stringTable[index]); + this.u8Nodes[index].OffsetToName = (ushort) ((ulong) writeStream1.Position - (ulong) num); + byte[] bytes = Encoding.ASCII.GetBytes(this.stringTable[index]); + writeStream1.Write(bytes, 0, bytes.Length); + writeStream1.WriteByte((byte) 0); + } + this.u8Header.HeaderSize = (uint) ((ulong) writeStream1.Position - (ulong) this.u8Header.OffsetToRootNode); + this.u8Header.OffsetToData = 0U; + for (int index = 0; index < this.u8Nodes.Count; ++index) + { + this.fireProgress((index + 1) * 100 / this.u8Nodes.Count); + if (this.u8Nodes[index].Type == U8_NodeType.File) + { + writeStream1.Seek((long) Shared.AddPadding((int) writeStream1.Position, 32), SeekOrigin.Begin); + this.fireDebug(" Writing Data #{1} of {2}... (Offset: 0x{0})", (object) writeStream1.Position.ToString("x8").ToUpper(), (object) (index + 1), (object) this.u8Nodes.Count); + if (this.u8Header.OffsetToData == 0U) + this.u8Header.OffsetToData = (uint) writeStream1.Position; + this.u8Nodes[index].OffsetToData = (uint) writeStream1.Position; + this.u8Nodes[index].SizeOfData = (uint) this.data[index].Length; + writeStream1.Write(this.data[index], 0, this.data[index].Length); + } + else + this.fireDebug(" Node #{0} of {1} is a Directory...", (object) (index + 1), (object) this.u8Nodes.Count); + } + while (writeStream1.Position % 16L != 0L) + writeStream1.WriteByte((byte) 0); + writeStream1.Seek(0L, SeekOrigin.Begin); + this.fireDebug(" Writing Header... (Offset: 0x{0})", (object) writeStream1.Position.ToString("x8").ToUpper()); + this.u8Header.Write((Stream) writeStream1); + this.fireDebug(" Writing Rootnode... (Offset: 0x{0})", (object) writeStream1.Position.ToString("x8").ToUpper()); + this.rootNode.Write((Stream) writeStream1); + for (int index = 0; index < this.u8Nodes.Count; ++index) + { + this.fireDebug(" Writing Node Entry #{1} of {2}... (Offset: 0x{0})", (object) writeStream1.Position.ToString("x8").ToUpper(), (object) (index + 1), (object) this.u8Nodes.Count); + this.u8Nodes[index].Write((Stream) writeStream1); + } + byte[] numArray = writeStream1.ToArray(); + writeStream1.Dispose(); + if (this.lz77) + { + this.fireDebug(" Lz77 Compressing U8 File..."); + numArray = new Lz77().Compress(numArray); + } + if (this.headerType == Headers.HeaderType.IMD5) + { + this.fireDebug(" Adding IMD5 Header..."); + writeStream.Seek(0L, SeekOrigin.Begin); + Headers.IMD5.Create(numArray).Write(writeStream); + } + else if (this.headerType == Headers.HeaderType.IMET || this.headerType == Headers.HeaderType.ShortIMET) + { + this.fireDebug(" Adding IMET Header..."); + ((Headers.IMET) this.header).IconSize = (uint) this.iconSize; + ((Headers.IMET) this.header).BannerSize = (uint) this.bannerSize; + ((Headers.IMET) this.header).SoundSize = (uint) this.soundSize; + writeStream.Seek(0L, SeekOrigin.Begin); + ((Headers.IMET) this.header).Write(writeStream); + } + writeStream.Write(numArray, 0, numArray.Length); + this.fireDebug("Writing U8 File Finished..."); + } + + private void unpackToDir(string saveDir) + { + this.fireDebug("Unpacking U8 File to: {0}", (object) saveDir); + if (!Directory.Exists(saveDir)) + Directory.CreateDirectory(saveDir); + string[] strArray = new string[this.u8Nodes.Count]; + strArray[0] = saveDir; + int[] numArray = new int[this.u8Nodes.Count]; + int index1 = 0; + for (int index2 = 0; index2 < this.u8Nodes.Count; ++index2) + { + this.fireDebug(" Unpacking Entry #{0} of {1}", (object) (index2 + 1), (object) this.u8Nodes.Count); + this.fireProgress((index2 + 1) * 100 / this.u8Nodes.Count); + if (this.u8Nodes[index2].Type == U8_NodeType.Directory) + { + this.fireDebug(" -> Directory: \"{0}\"", (object) this.stringTable[index2]); + if ((int) strArray[index1][strArray[index1].Length - 1] != (int) Path.DirectorySeparatorChar) + strArray[index1] = strArray[index1] + (object) Path.DirectorySeparatorChar; + Directory.CreateDirectory(strArray[index1] + this.stringTable[index2]); + strArray[index1 + 1] = strArray[index1] + this.stringTable[index2]; + ++index1; + numArray[index1] = (int) this.u8Nodes[index2].SizeOfData; + } + else + { + this.fireDebug(" -> File: \"{0}\"", (object) this.stringTable[index2]); + this.fireDebug(" -> Size: {0} bytes", (object) this.data[index2].Length); + using (FileStream fileStream = new FileStream(strArray[index1] + (object) Path.DirectorySeparatorChar + this.stringTable[index2], FileMode.Create)) + fileStream.Write(this.data[index2], 0, this.data[index2].Length); + } + while (index1 > 0 && numArray[index1] == index2 + 2) + --index1; + } + this.fireDebug("Unpacking U8 File Finished"); + } + + private void parseU8(Stream u8File) + { + this.fireDebug("Pasing U8 File..."); + this.u8Header = new U8_Header(); + this.rootNode = new U8_Node(); + this.u8Nodes = new List(); + this.stringTable = new List(); + this.data = new List(); + this.fireDebug(" Detecting Header..."); + this.headerType = Headers.DetectHeader(u8File); + Headers.HeaderType offset = this.headerType; + this.fireDebug(" -> {0}", (object) this.headerType.ToString()); + if (this.headerType == Headers.HeaderType.IMD5) + { + this.fireDebug(" Reading IMD5 Header..."); + this.header = (object) Headers.IMD5.Load(u8File); + byte[] buffer = new byte[u8File.Length]; + u8File.Read(buffer, 0, buffer.Length); + MD5 md5 = MD5.Create(); + byte[] hash = md5.ComputeHash(buffer, (int) this.headerType, (int) ((int) u8File.Length - this.headerType)); + md5.Clear(); + if (!Shared.CompareByteArrays(hash, ((Headers.IMD5) this.header).Hash)) + { + this.fireDebug("/!\\ /!\\ /!\\ Hashes do not match /!\\ /!\\ /!\\"); + this.fireWarning(string.Format("Hashes of IMD5 header and file do not match! The content might be corrupted!")); + } + } + else if (this.headerType == Headers.HeaderType.IMET || this.headerType == Headers.HeaderType.ShortIMET) + { + this.fireDebug(" Reading IMET Header..."); + this.header = (object) Headers.IMET.Load(u8File); + if (!((Headers.IMET) this.header).HashesMatch) + { + this.fireDebug("/!\\ /!\\ /!\\ Hashes do not match /!\\ /!\\ /!\\"); + this.fireWarning(string.Format("The hash stored in the IMET header doesn't match the headers hash! The header and/or file might be corrupted!")); + } + } + this.fireDebug(" Checking for Lz77 Compression..."); + if (Lz77.IsLz77Compressed(u8File)) + { + this.fireDebug(" -> Lz77 Compression Found..."); + this.fireDebug(" Decompressing U8 Data..."); + Stream file = new Lz77().Decompress(u8File); + offset = Headers.DetectHeader(file); + u8File = file; + this.lz77 = true; + } + u8File.Seek((long) offset, SeekOrigin.Begin); + byte[] buffer1 = new byte[4]; + this.fireDebug(" Reading U8 Header: Magic... (Offset: 0x{0})", (object) u8File.Position.ToString("x8").ToUpper()); + u8File.Read(buffer1, 0, 4); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer1, 0)) != (int) this.u8Header.U8Magic) + { + this.fireDebug(" -> Invalid Magic!"); + throw new Exception("U8 Header: Invalid Magic!"); + } + this.fireDebug(" Reading U8 Header: Offset to Rootnode... (Offset: 0x{0})", (object) u8File.Position.ToString("x8").ToUpper()); + u8File.Read(buffer1, 0, 4); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer1, 0)) != (int) this.u8Header.OffsetToRootNode) + { + this.fireDebug(" -> Invalid Offset to Rootnode"); + throw new Exception("U8 Header: Invalid Offset to Rootnode!"); + } + this.fireDebug(" Reading U8 Header: Header Size... (Offset: 0x{0})", (object) u8File.Position.ToString("x8").ToUpper()); + u8File.Read(buffer1, 0, 4); + this.u8Header.HeaderSize = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + this.fireDebug(" Reading U8 Header: Offset to Data... (Offset: 0x{0})", (object) u8File.Position.ToString("x8").ToUpper()); + u8File.Read(buffer1, 0, 4); + this.u8Header.OffsetToData = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + u8File.Seek(16L, SeekOrigin.Current); + this.fireDebug(" Reading Rootnode... (Offset: 0x{0})", (object) u8File.Position.ToString("x8").ToUpper()); + u8File.Read(buffer1, 0, 4); + this.rootNode.Type = (U8_NodeType) Shared.Swap(BitConverter.ToUInt16(buffer1, 0)); + this.rootNode.OffsetToName = Shared.Swap(BitConverter.ToUInt16(buffer1, 2)); + u8File.Read(buffer1, 0, 4); + this.rootNode.OffsetToData = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + u8File.Read(buffer1, 0, 4); + this.rootNode.SizeOfData = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + int num = (int) ((long) offset + (long) this.u8Header.OffsetToRootNode + (long) (this.rootNode.SizeOfData * 12U)); + int position = (int) u8File.Position; + for (int index = 0; (long) index < (long) (this.rootNode.SizeOfData - 1U); ++index) + { + this.fireDebug(" Reading Node #{1} of {2}... (Offset: 0x{0})", (object) u8File.Position.ToString("x8").ToUpper(), (object) (index + 1), (object) (uint) ((int) this.rootNode.SizeOfData - 1)); + this.fireProgress((int) ((long) ((index + 1) * 100) / (long) (this.rootNode.SizeOfData - 1U))); + U8_Node u8Node = new U8_Node(); + string empty = string.Empty; + byte[] numArray = new byte[0]; + u8File.Seek((long) position, SeekOrigin.Begin); + this.fireDebug(" -> Reading Node Entry... (Offset: 0x{0})", (object) u8File.Position.ToString("x8").ToUpper()); + u8File.Read(buffer1, 0, 4); + u8Node.Type = (U8_NodeType) Shared.Swap(BitConverter.ToUInt16(buffer1, 0)); + u8Node.OffsetToName = Shared.Swap(BitConverter.ToUInt16(buffer1, 2)); + u8File.Read(buffer1, 0, 4); + u8Node.OffsetToData = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + u8File.Read(buffer1, 0, 4); + u8Node.SizeOfData = Shared.Swap(BitConverter.ToUInt32(buffer1, 0)); + position = (int) u8File.Position; + this.fireDebug(" -> {0}", (object) u8Node.Type.ToString()); + u8File.Seek((long) (num + (int) u8Node.OffsetToName), SeekOrigin.Begin); + this.fireDebug(" -> Reading Node Name... (Offset: 0x{0})", (object) u8File.Position.ToString("x8").ToUpper()); + do + { + char ch = (char) u8File.ReadByte(); + if (ch != char.MinValue) + empty += (string) (object) ch; + else + break; + } + while (empty.Length <= (int) byte.MaxValue); + this.fireDebug(" -> {0}", (object) empty); + if (u8Node.Type == U8_NodeType.File) + { + u8File.Seek((long) offset + (long) u8Node.OffsetToData, SeekOrigin.Begin); + this.fireDebug(" -> Reading Node Data (Offset: 0x{0})", (object) u8File.Position.ToString("x8").ToUpper()); + numArray = new byte[(IntPtr) u8Node.SizeOfData]; + u8File.Read(numArray, 0, numArray.Length); + } + if (empty.ToLower() == "icon.bin") + this.iconSize = this.getRealSize(numArray); + else if (empty.ToLower() == "banner.bin") + this.bannerSize = this.getRealSize(numArray); + else if (empty.ToLower() == "sound.bin") + this.soundSize = this.getRealSize(numArray); + this.u8Nodes.Add(u8Node); + this.stringTable.Add(empty); + this.data.Add(numArray); + } + this.fireDebug("Pasing U8 File Finished..."); + } + + private void createFromDir(string path) + { + this.fireDebug("Creating U8 File from: {0}", (object) path); + if ((int) path[path.Length - 1] != (int) Path.DirectorySeparatorChar) + path += (string) (object) Path.DirectorySeparatorChar; + this.fireDebug(" Collecting Content..."); + string[] dirContent = this.getDirContent(path, true); + int num1 = 1; + int num2 = 0; + this.fireDebug(" Creating U8 Header..."); + this.u8Header = new U8_Header(); + this.rootNode = new U8_Node(); + this.u8Nodes = new List(); + this.stringTable = new List(); + this.data = new List(); + this.fireDebug(" Creating Rootnode..."); + this.rootNode.Type = U8_NodeType.Directory; + this.rootNode.OffsetToName = (ushort) 0; + this.rootNode.OffsetToData = 0U; + this.rootNode.SizeOfData = (uint) (dirContent.Length + 1); + for (int index1 = 0; index1 < dirContent.Length; ++index1) + { + this.fireDebug(" Creating Node #{0} of {1}", (object) (index1 + 1), (object) dirContent.Length); + this.fireProgress((index1 + 1) * 100 / dirContent.Length); + U8_Node u8Node = new U8_Node(); + byte[] data = new byte[0]; + string theString = dirContent[index1].Remove(0, path.Length - 1); + if (Directory.Exists(dirContent[index1])) + { + this.fireDebug(" -> Directory"); + u8Node.Type = U8_NodeType.Directory; + u8Node.OffsetToData = (uint) Shared.CountCharsInString(theString, Path.DirectorySeparatorChar); + int num3 = this.u8Nodes.Count + 2; + for (int index2 = 0; index2 < dirContent.Length; ++index2) + { + if (dirContent[index2].Contains(dirContent[index1] + Path.DirectorySeparatorChar.ToString())) + ++num3; + } + u8Node.SizeOfData = (uint) num3; + } + else + { + this.fireDebug(" -> File"); + this.fireDebug(" -> Reading File Data..."); + data = File.ReadAllBytes(dirContent[index1]); + u8Node.Type = U8_NodeType.File; + u8Node.OffsetToData = (uint) num2; + u8Node.SizeOfData = (uint) data.Length; + num2 += Shared.AddPadding(num2 + data.Length, 32); + } + u8Node.OffsetToName = (ushort) num1; + num1 += Path.GetFileName(dirContent[index1]).Length + 1; + this.fireDebug(" -> Reading Name..."); + string fileName = Path.GetFileName(dirContent[index1]); + if (fileName.ToLower() == "icon.bin") + this.iconSize = this.getRealSize(data); + else if (fileName.ToLower() == "banner.bin") + this.bannerSize = this.getRealSize(data); + else if (fileName.ToLower() == "sound.bin") + this.soundSize = this.getRealSize(data); + this.u8Nodes.Add(u8Node); + this.stringTable.Add(fileName); + this.data.Add(data); + } + this.fireDebug(" Updating U8 Header..."); + this.u8Header.HeaderSize = (uint) ((this.u8Nodes.Count + 1) * 12 + num1); + this.u8Header.OffsetToData = (uint) Shared.AddPadding((int) this.u8Header.OffsetToRootNode + (int) this.u8Header.HeaderSize, 32); + this.fireDebug(" Calculating Data Offsets..."); + for (int index = 0; index < this.u8Nodes.Count; ++index) + { + this.fireDebug(" -> Node #{0} of {1}...", (object) (index + 1), (object) this.u8Nodes.Count); + int offsetToData = (int) this.u8Nodes[index].OffsetToData; + this.u8Nodes[index].OffsetToData = (uint) ((ulong) this.u8Header.OffsetToData + (ulong) offsetToData); + } + this.fireDebug("Creating U8 File Finished..."); + } + + private string[] getDirContent(string dir, bool root) + { + string[] files = Directory.GetFiles(dir); + string[] directories = Directory.GetDirectories(dir); + string str1 = ""; + if (!root) + str1 = str1 + dir + "\n"; + for (int index = 0; index < files.Length; ++index) + str1 = str1 + files[index] + "\n"; + foreach (string dir1 in directories) + { + foreach (string str2 in this.getDirContent(dir1, false)) + str1 = str1 + str2 + "\n"; + } + return str1.Split(new char[1]{ '\n' }, StringSplitOptions.RemoveEmptyEntries); + } + + private int getRealSize(byte[] data) + { + if (data[0] != (byte) 73 || data[1] != (byte) 77 || data[2] != (byte) 68 || data[3] != (byte) 53) + return data.Length; + return data[32] == (byte) 76 && data[33] == (byte) 90 && data[34] == (byte) 55 && data[35] == (byte) 55 ? BitConverter.ToInt32(data, 36) >> 8 : data.Length - 32; + } + + private void addEntry(string nodePath, byte[] fileData) + { + if (nodePath.StartsWith("/")) + nodePath = nodePath.Remove(0, 1); + string[] strArray = nodePath.Split('/'); + int index1 = -1; + int num1 = this.u8Nodes.Count > 0 ? this.u8Nodes.Count - 1 : 0; + int num2 = 0; + List intList = new List(); + for (int index2 = 0; index2 < strArray.Length - 1; ++index2) + { + for (int index3 = num2; index3 <= num1; ++index3) + { + if (this.stringTable[index3].ToLower() == strArray[index2].ToLower()) + { + if (index2 == strArray.Length - 2) + index1 = index3; + num1 = (int) this.u8Nodes[index3].SizeOfData - 1; + num2 = index3 + 1; + intList.Add(index3); + break; + } + if (index3 == num1 - 1) + throw new Exception("Path wasn't found!"); + } + } + int num3 = index1 <= -1 ? (this.rootNode.SizeOfData > 1U ? (int) this.rootNode.SizeOfData - 2 : -1) : (int) this.u8Nodes[index1].SizeOfData - 2; + U8_Node u8Node = new U8_Node(); + u8Node.Type = fileData.Length == 0 ? U8_NodeType.Directory : U8_NodeType.File; + u8Node.SizeOfData = fileData.Length == 0 ? (uint) (num3 + 2) : (uint) fileData.Length; + u8Node.OffsetToData = fileData.Length == 0 ? (uint) Shared.CountCharsInString(nodePath, '/') : 0U; + this.stringTable.Insert(num3 + 1, strArray[strArray.Length - 1]); + this.u8Nodes.Insert(num3 + 1, u8Node); + this.data.Insert(num3 + 1, fileData); + ++this.rootNode.SizeOfData; + foreach (int index4 in intList) + { + if (this.u8Nodes[index4].Type == U8_NodeType.Directory) + ++this.u8Nodes[index4].SizeOfData; + } + for (int index5 = num3 + 1; index5 < this.u8Nodes.Count; ++index5) + { + if (this.u8Nodes[index5].Type == U8_NodeType.Directory) + ++this.u8Nodes[index5].SizeOfData; + } + } + + private void removeEntry(string nodePath) + { + if (nodePath.StartsWith("/")) + nodePath = nodePath.Remove(0, 1); + string[] strArray = nodePath.Split('/'); + int index1 = -1; + int num1 = this.u8Nodes.Count - 1; + int num2 = 0; + List intList = new List(); + for (int index2 = 0; index2 < strArray.Length; ++index2) + { + for (int index3 = num2; index3 < num1; ++index3) + { + if (this.stringTable[index3].ToLower() == strArray[index2].ToLower()) + { + if (index2 == strArray.Length - 1) + index1 = index3; + else + intList.Add(index3); + num1 = (int) this.u8Nodes[index3].SizeOfData - 1; + num2 = index3 + 1; + break; + } + if (index3 == num1 - 1) + throw new Exception("Path wasn't found!"); + } + } + int num3 = 0; + if (this.u8Nodes[index1].Type == U8_NodeType.Directory) + { + for (int index4 = (int) this.u8Nodes[index1].SizeOfData - 2; index4 >= index1; --index4) + { + this.stringTable.RemoveAt(index4); + this.u8Nodes.RemoveAt(index4); + this.data.RemoveAt(index4); + ++num3; + } + } + else + { + this.stringTable.RemoveAt(index1); + this.u8Nodes.RemoveAt(index1); + this.data.RemoveAt(index1); + ++num3; + } + this.rootNode.SizeOfData -= (uint) num3; + foreach (int index5 in intList) + { + if (this.u8Nodes[index5].Type == U8_NodeType.Directory) + this.u8Nodes[index5].SizeOfData -= (uint) num3; + } + for (int index6 = index1 + 1; index6 < this.u8Nodes.Count; ++index6) + { + if (this.u8Nodes[index6].Type == U8_NodeType.Directory) + this.u8Nodes[index6].SizeOfData -= (uint) num3; + } + } + + public event EventHandler Progress; + + public event EventHandler Warning; + + public event EventHandler Debug; + + private void fireWarning(string warningMessage) + { + EventHandler warning = this.Warning; + if (warning == null) + return; + warning(new object(), new MessageEventArgs(warningMessage)); + } + + private void fireDebug(string debugMessage, params object[] args) + { + EventHandler debug = this.Debug; + if (debug == null) + return; + debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); + } + + private void fireProgress(int progressPercentage) + { + EventHandler progress = this.Progress; + if (progress == null) + return; + progress(new object(), new ProgressChangedEventArgs(progressPercentage, (object) string.Empty)); + } + } +} diff --git a/libWiiSharp/U8_Header.cs b/libWiiSharp/U8_Header.cs new file mode 100644 index 0000000..526ac8d --- /dev/null +++ b/libWiiSharp/U8_Header.cs @@ -0,0 +1,47 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.U8_Header +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.IO; + +namespace libWiiSharp +{ + public class U8_Header + { + private uint u8Magic = 1437218861; + private uint offsetToRootNode = 32; + private uint headerSize; + private uint offsetToData; + private byte[] padding = new byte[16]; + + public uint U8Magic => this.u8Magic; + + public uint OffsetToRootNode => this.offsetToRootNode; + + public uint HeaderSize + { + get => this.headerSize; + set => this.headerSize = value; + } + + public uint OffsetToData + { + get => this.offsetToData; + set => this.offsetToData = value; + } + + public byte[] Padding => this.padding; + + public void Write(Stream writeStream) + { + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.u8Magic)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.offsetToRootNode)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.headerSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.offsetToData)), 0, 4); + writeStream.Write(this.padding, 0, 16); + } + } +} diff --git a/libWiiSharp/U8_Node.cs b/libWiiSharp/U8_Node.cs new file mode 100644 index 0000000..afe4909 --- /dev/null +++ b/libWiiSharp/U8_Node.cs @@ -0,0 +1,51 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.U8_Node +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.IO; + +namespace libWiiSharp +{ + public class U8_Node + { + private ushort type; + private ushort offsetToName; + private uint offsetToData; + private uint sizeOfData; + + public U8_NodeType Type + { + get => (U8_NodeType) this.type; + set => this.type = (ushort) value; + } + + public ushort OffsetToName + { + get => this.offsetToName; + set => this.offsetToName = value; + } + + public uint OffsetToData + { + get => this.offsetToData; + set => this.offsetToData = value; + } + + public uint SizeOfData + { + get => this.sizeOfData; + set => this.sizeOfData = value; + } + + public void Write(Stream writeStream) + { + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.type)), 0, 2); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.offsetToName)), 0, 2); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.offsetToData)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.sizeOfData)), 0, 4); + } + } +} diff --git a/libWiiSharp/U8_NodeType.cs b/libWiiSharp/U8_NodeType.cs new file mode 100644 index 0000000..5c41a72 --- /dev/null +++ b/libWiiSharp/U8_NodeType.cs @@ -0,0 +1,14 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.U8_NodeType +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +namespace libWiiSharp +{ + public enum U8_NodeType : ushort + { + File = 0, + Directory = 256, // 0x0100 + } +} diff --git a/libWiiSharp/WAD.cs b/libWiiSharp/WAD.cs new file mode 100644 index 0000000..7b1010e --- /dev/null +++ b/libWiiSharp/WAD.cs @@ -0,0 +1,922 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.WAD +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace libWiiSharp +{ + public class WAD : IDisposable + { + private SHA1 sha = SHA1.Create(); + private DateTime creationTimeUTC = new DateTime(1970, 1, 1); + private bool hasBanner; + private bool lz77CompressBannerAndIcon = true; + private bool lz77DecompressBannerAndIcon; + private bool keepOriginalFooter; + private WAD_Header wadHeader; + private CertificateChain cert = new CertificateChain(); + private Ticket tik = new Ticket(); + private TMD tmd = new TMD(); + private List contents; + private U8 bannerApp = new U8(); + private byte[] footer = new byte[0]; + private bool isDisposed; + + public Region Region + { + get => this.tmd.Region; + set => this.tmd.Region = value; + } + + public int NumOfContents => (int) this.tmd.NumOfContents; + + public byte[][] Contents => this.contents.ToArray(); + + public bool FakeSign + { + get => this.tik.FakeSign && this.tmd.FakeSign; + set + { + this.tik.FakeSign = value; + this.tmd.FakeSign = value; + } + } + + public U8 BannerApp + { + get => this.bannerApp; + set => this.bannerApp = value; + } + + public ulong StartupIOS + { + get => this.tmd.StartupIOS; + set => this.tmd.StartupIOS = value; + } + + public ulong TitleID + { + get => this.tik.TitleID; + set + { + this.tik.TitleID = value; + this.tmd.TitleID = value; + } + } + + public string UpperTitleID => this.tik.GetUpperTitleID(); + + public ushort TitleVersion + { + get => this.tmd.TitleVersion; + set => this.tmd.TitleVersion = value; + } + + public ushort BootIndex + { + get => this.tmd.BootIndex; + set => this.tmd.BootIndex = value; + } + + public DateTime CreationTimeUTC => this.creationTimeUTC; + + public bool HasBanner => this.hasBanner; + + public bool Lz77CompressBannerAndIcon + { + get => this.lz77CompressBannerAndIcon; + set + { + this.lz77CompressBannerAndIcon = value; + if (!value) + return; + this.lz77DecompressBannerAndIcon = false; + } + } + + public bool Lz77DecompressBannerAndIcon + { + get => this.lz77DecompressBannerAndIcon; + set + { + this.lz77DecompressBannerAndIcon = value; + if (!value) + return; + this.lz77CompressBannerAndIcon = false; + } + } + + public string NandBlocks => this.tmd.GetNandBlocks(); + + public string[] ChannelTitles + { + get => this.hasBanner ? ((Headers.IMET) this.bannerApp.Header).AllTitles : new string[0]; + set => this.ChangeChannelTitles(value); + } + + public bool KeepOriginalFooter + { + get => this.keepOriginalFooter; + set => this.keepOriginalFooter = value; + } + + public TMD_Content[] TmdContents => this.tmd.Contents; + + public WAD() + { + this.cert.Debug += new EventHandler(this.cert_Debug); + this.tik.Debug += new EventHandler(this.tik_Debug); + this.tmd.Debug += new EventHandler(this.tmd_Debug); + this.bannerApp.Debug += new EventHandler(this.bannerApp_Debug); + this.bannerApp.Warning += new EventHandler(this.bannerApp_Warning); + } + + ~WAD() => this.Dispose(false); + + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize((object) this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing && !this.isDisposed) + { + this.sha.Clear(); + this.sha = (SHA1) null; + this.wadHeader = (WAD_Header) null; + this.cert.Dispose(); + this.tik.Dispose(); + this.tmd.Dispose(); + this.contents.Clear(); + this.contents = (List) null; + this.bannerApp.Dispose(); + this.footer = (byte[]) null; + } + this.isDisposed = true; + } + + public static WAD Load(string pathToWad) => WAD.Load(File.ReadAllBytes(pathToWad)); + + public static WAD Load(byte[] wadFile) + { + WAD wad = new WAD(); + MemoryStream wadFile1 = new MemoryStream(wadFile); + try + { + wad.parseWad((Stream) wadFile1); + } + catch + { + wadFile1.Dispose(); + throw; + } + wadFile1.Dispose(); + return wad; + } + + public static WAD Load(Stream wad) + { + WAD wad1 = new WAD(); + wad1.parseWad(wad); + return wad1; + } + + public static WAD Create(string contentDir) + { + string[] files1 = Directory.GetFiles(contentDir, "*cert*"); + string[] files2 = Directory.GetFiles(contentDir, "*tik*"); + string[] files3 = Directory.GetFiles(contentDir, "*tmd*"); + CertificateChain cert = CertificateChain.Load(files1[0]); + Ticket tik = Ticket.Load(files2[0]); + TMD tmd = TMD.Load(files3[0]); + bool flag = true; + for (int index = 0; index < tmd.Contents.Length; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + tmd.Contents[index].ContentID.ToString("x8") + ".app")) + { + flag = false; + break; + } + } + if (!flag) + { + for (int index = 0; index < tmd.Contents.Length; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + tmd.Contents[index].Index.ToString("x8") + ".app")) + throw new Exception("Couldn't find all content files!"); + } + } + byte[][] contents = new byte[tmd.Contents.Length][]; + for (int index = 0; index < tmd.Contents.Length; ++index) + { + string path = contentDir + (object) Path.DirectorySeparatorChar + (flag ? (object) tmd.Contents[index].ContentID.ToString("x8") : (object) tmd.Contents[index].Index.ToString("x8")) + ".app"; + contents[index] = File.ReadAllBytes(path); + } + return WAD.Create(cert, tik, tmd, contents); + } + + public static WAD Create( + string pathToCert, + string pathToTik, + string pathToTmd, + string contentDir) + { + CertificateChain cert = CertificateChain.Load(pathToCert); + Ticket tik = Ticket.Load(pathToTik); + TMD tmd = TMD.Load(pathToTmd); + bool flag = true; + for (int index = 0; index < tmd.Contents.Length; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + tmd.Contents[index].ContentID.ToString("x8") + ".app")) + { + flag = false; + break; + } + } + if (!flag) + { + for (int index = 0; index < tmd.Contents.Length; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + tmd.Contents[index].Index.ToString("x8") + ".app")) + throw new Exception("Couldn't find all content files!"); + } + } + byte[][] contents = new byte[tmd.Contents.Length][]; + for (int index = 0; index < tmd.Contents.Length; ++index) + { + string path = contentDir + (object) Path.DirectorySeparatorChar + (flag ? (object) tmd.Contents[index].ContentID.ToString("x8") : (object) tmd.Contents[index].Index.ToString("x8")) + ".app"; + contents[index] = File.ReadAllBytes(path); + } + return WAD.Create(cert, tik, tmd, contents); + } + + public static WAD Create(byte[] cert, byte[] tik, byte[] tmd, byte[][] contents) => WAD.Create(CertificateChain.Load(cert), Ticket.Load(tik), TMD.Load(tmd), contents); + + public static WAD Create(CertificateChain cert, Ticket tik, TMD tmd, byte[][] contents) + { + WAD wad = new WAD() + { + cert = cert, + tik = tik, + tmd = tmd, + contents = new List((IEnumerable) contents), + wadHeader = new WAD_Header() + }; + wad.wadHeader.TmdSize = (uint) (484 + tmd.Contents.Length * 36); + int num1 = 0; + for (int index = 0; index < contents.Length - 1; ++index) + num1 += Shared.AddPadding(contents[index].Length); + int num2 = num1 + contents[contents.Length - 1].Length; + wad.wadHeader.ContentSize = (uint) num2; + for (int index = 0; index < wad.tmd.Contents.Length; ++index) + { + if (wad.tmd.Contents[index].Index == (ushort) 0) + { + try + { + wad.bannerApp.LoadFile(contents[index]); + wad.hasBanner = true; + break; + } + catch + { + wad.hasBanner = false; + break; + } + } + } + return wad; + } + + public void LoadFile(string pathToWad) => this.LoadFile(File.ReadAllBytes(pathToWad)); + + public void LoadFile(byte[] wadFile) + { + MemoryStream wadFile1 = new MemoryStream(wadFile); + try + { + this.parseWad((Stream) wadFile1); + } + catch + { + wadFile1.Dispose(); + throw; + } + wadFile1.Dispose(); + } + + public void LoadFile(Stream wad) => this.parseWad(wad); + + public void CreateNew(string contentDir) + { + string[] files1 = Directory.GetFiles(contentDir, "*cert*"); + string[] files2 = Directory.GetFiles(contentDir, "*tik*"); + string[] files3 = Directory.GetFiles(contentDir, "*tmd*"); + CertificateChain cert = CertificateChain.Load(files1[0]); + Ticket tik = Ticket.Load(files2[0]); + TMD tmd = TMD.Load(files3[0]); + bool flag = true; + for (int index = 0; index < tmd.Contents.Length; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + tmd.Contents[index].ContentID.ToString("x8") + ".app")) + { + flag = false; + break; + } + } + if (!flag) + { + for (int index = 0; index < tmd.Contents.Length; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + tmd.Contents[index].Index.ToString("x8") + ".app")) + throw new Exception("Couldn't find all content files!"); + } + } + byte[][] contents = new byte[tmd.Contents.Length][]; + for (int index = 0; index < tmd.Contents.Length; ++index) + { + string path = contentDir + (object) Path.DirectorySeparatorChar + (flag ? (object) tmd.Contents[index].ContentID.ToString("x8") : (object) tmd.Contents[index].Index.ToString("x8")) + ".app"; + contents[index] = File.ReadAllBytes(path); + } + this.CreateNew(cert, tik, tmd, contents); + } + + public void CreateNew( + string pathToCert, + string pathToTik, + string pathToTmd, + string contentDir) + { + CertificateChain cert = CertificateChain.Load(pathToCert); + Ticket tik = Ticket.Load(pathToTik); + TMD tmd = TMD.Load(pathToTmd); + bool flag = true; + for (int index = 0; index < tmd.Contents.Length; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + tmd.Contents[index].ContentID.ToString("x8") + ".app")) + { + flag = false; + break; + } + } + if (!flag) + { + for (int index = 0; index < tmd.Contents.Length; ++index) + { + if (!File.Exists(contentDir + (object) Path.DirectorySeparatorChar + tmd.Contents[index].Index.ToString("x8") + ".app")) + throw new Exception("Couldn't find all content files!"); + } + } + byte[][] contents = new byte[tmd.Contents.Length][]; + for (int index = 0; index < tmd.Contents.Length; ++index) + { + string path = contentDir + (object) Path.DirectorySeparatorChar + (flag ? (object) tmd.Contents[index].ContentID.ToString("x8") : (object) tmd.Contents[index].Index.ToString("x8")) + ".app"; + contents[index] = File.ReadAllBytes(path); + } + this.CreateNew(cert, tik, tmd, contents); + } + + public void CreateNew(byte[] cert, byte[] tik, byte[] tmd, byte[][] contents) => this.CreateNew(CertificateChain.Load(cert), Ticket.Load(tik), TMD.Load(tmd), contents); + + public void CreateNew(CertificateChain cert, Ticket tik, TMD tmd, byte[][] contents) + { + this.cert = cert; + this.tik = tik; + this.tmd = tmd; + this.contents = new List((IEnumerable) contents); + this.wadHeader = new WAD_Header(); + this.wadHeader.TmdSize = (uint) (484 + tmd.Contents.Length * 36); + int num = 0; + for (int index = 0; index < contents.Length - 1; ++index) + num += Shared.AddPadding(contents[index].Length); + this.wadHeader.ContentSize = (uint) (num + contents[contents.Length - 1].Length); + for (int index = 0; index < this.tmd.Contents.Length; ++index) + { + if (this.tmd.Contents[index].Index == (ushort) 0) + { + try + { + this.bannerApp.LoadFile(contents[index]); + this.hasBanner = true; + break; + } + catch + { + this.hasBanner = false; + break; + } + } + } + } + + public void Save(string savePath) + { + if (File.Exists(savePath)) + File.Delete(savePath); + using (FileStream writeStream = new FileStream(savePath, FileMode.Create)) + this.writeToStream((Stream) writeStream); + } + + public MemoryStream ToMemoryStream() + { + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + return writeStream; + } + + public byte[] ToByteArray() + { + MemoryStream writeStream = new MemoryStream(); + try + { + this.writeToStream((Stream) writeStream); + } + catch + { + writeStream.Dispose(); + throw; + } + byte[] array = writeStream.ToArray(); + writeStream.Dispose(); + return array; + } + + public void ChangeTitleID(LowerTitleID lowerID, string upperID) + { + uint num1 = upperID.Length == 4 ? BitConverter.ToUInt32(new byte[4] + { + (byte) upperID[3], + (byte) upperID[2], + (byte) upperID[1], + (byte) upperID[0] + }, 0) : throw new Exception("Upper Title ID must be 4 characters long!"); + ulong num2 = (ulong) lowerID << 32 | (ulong) num1; + this.tik.TitleID = num2; + this.tmd.TitleID = num2; + } + + public void ChangeStartupIOS(int newIos) => this.StartupIOS = 4294967296UL | (ulong) (uint) newIos; + + public void ChangeTitleKey(string newTitleKey) => this.tik.SetTitleKey(newTitleKey); + + public void ChangeTitleKey(char[] newTitleKey) => this.tik.SetTitleKey(newTitleKey); + + public void ChangeTitleKey(byte[] newTitleKey) => this.tik.SetTitleKey(newTitleKey); + + public byte[] GetContentByIndex(int index) + { + for (int index1 = 0; index1 < (int) this.tmd.NumOfContents; ++index1) + { + if ((int) this.tmd.Contents[index1].Index == index) + return this.contents[index1]; + } + throw new Exception(string.Format("Content with index {0} not found!", (object) index)); + } + + public byte[] GetContentByID(int contentID) + { + for (int index = 0; index < (int) this.tmd.NumOfContents; ++index) + { + if ((int) this.tmd.Contents[index].Index == contentID) + return this.contents[index]; + } + throw new Exception(string.Format("Content with content ID {0} not found!", (object) contentID)); + } + + public void ChangeChannelTitles(params string[] newTitles) + { + if (!this.hasBanner) + return; + ((Headers.IMET) this.bannerApp.Header).ChangeTitles(newTitles); + } + + public void AddContent(byte[] newContent, int contentID, int index, ContentType type = ContentType.Normal) + { + this.tmd.AddContent(new TMD_Content() + { + ContentID = (uint) contentID, + Index = (ushort) index, + Type = type, + Size = (ulong) newContent.Length, + Hash = this.sha.ComputeHash(newContent) + }); + this.contents.Add(newContent); + this.wadHeader.TmdSize = (uint) (484 + (int) this.tmd.NumOfContents * 36); + } + + public void RemoveContent(int index) + { + for (int index1 = 0; index1 < this.tmd.Contents.Length; ++index1) + { + if ((int) this.tmd.Contents[index1].Index == index) + { + this.tmd.RemoveContent(index); + this.contents.RemoveAt(index1); + this.wadHeader.TmdSize = (uint) (484 + (int) this.tmd.NumOfContents * 36); + return; + } + } + throw new Exception(string.Format("Content with index {0} not found!", (object) index)); + } + + public void RemoveContentByID(int contentID) + { + for (int index = 0; index < this.tmd.Contents.Length; ++index) + { + if ((int) this.tmd.Contents[index].Index == contentID) + { + this.tmd.RemoveContentByID(contentID); + this.contents.RemoveAt(index); + this.wadHeader.TmdSize = (uint) (484 + (int) this.tmd.NumOfContents * 36); + return; + } + } + throw new Exception(string.Format("Content with content ID {0} not found!", (object) contentID)); + } + + public void RemoveAllContents() + { + if (!this.hasBanner) + { + this.tmd.Contents = new TMD_Content[0]; + this.contents = new List(); + this.wadHeader.TmdSize = (uint) (484 + (int) this.tmd.NumOfContents * 36); + } + else + { + for (int index = 0; index < (int) this.tmd.NumOfContents; ++index) + { + if (this.tmd.Contents[index].Index == (ushort) 0) + { + byte[] content1 = this.contents[index]; + TMD_Content content2 = this.tmd.Contents[index]; + this.tmd.Contents = new TMD_Content[0]; + this.contents = new List(); + this.tmd.AddContent(content2); + this.contents.Add(content1); + this.wadHeader.TmdSize = (uint) (484 + (int) this.tmd.NumOfContents * 36); + break; + } + } + } + } + + public void Unpack(string unpackDir, bool nameContentID = false) => this.unpackAll(unpackDir, nameContentID); + + public void RemoveFooter() + { + this.footer = new byte[0]; + this.wadHeader.FooterSize = 0U; + this.keepOriginalFooter = true; + } + + public void AddFooter(byte[] footer) => this.ChangeFooter(footer); + + public void ChangeFooter(byte[] newFooter) + { + if (newFooter.Length % 64 != 0) + Array.Resize(ref newFooter, Shared.AddPadding(newFooter.Length)); + this.footer = newFooter; + this.wadHeader.FooterSize = (uint) newFooter.Length; + this.keepOriginalFooter = true; + } + + private void writeToStream(Stream writeStream) + { + this.fireDebug("Writing Wad..."); + if (!this.keepOriginalFooter) + { + this.fireDebug(" Building Footer Timestamp..."); + this.createFooterTimestamp(); + } + if (this.hasBanner) + { + if (this.lz77CompressBannerAndIcon || this.lz77DecompressBannerAndIcon) + { + for (int index = 0; index < this.bannerApp.Nodes.Count; ++index) + { + if (this.bannerApp.StringTable[index].ToLower() == "icon.bin" || this.bannerApp.StringTable[index].ToLower() == "banner.bin") + { + if (!Lz77.IsLz77Compressed(this.bannerApp.Data[index]) && this.lz77CompressBannerAndIcon) + { + this.fireDebug(" Compressing {0}...", (object) this.bannerApp.StringTable[index]); + byte[] numArray1 = new byte[this.bannerApp.Data[index].Length - 32]; + Array.Copy((Array) this.bannerApp.Data[index], 32, (Array) numArray1, 0, numArray1.Length); + byte[] numArray2 = Headers.IMD5.AddHeader(new Lz77().Compress(numArray1)); + this.bannerApp.Data[index] = numArray2; + this.bannerApp.Nodes[index].SizeOfData = (uint) numArray2.Length; + } + else if (Lz77.IsLz77Compressed(this.bannerApp.Data[index]) && this.lz77DecompressBannerAndIcon) + { + this.fireDebug(" Decompressing {0}...", (object) this.bannerApp.StringTable[index]); + byte[] numArray3 = new byte[this.bannerApp.Data[index].Length - 32]; + Array.Copy((Array) this.bannerApp.Data[index], 32, (Array) numArray3, 0, numArray3.Length); + byte[] numArray4 = Headers.IMD5.AddHeader(new Lz77().Decompress(numArray3)); + this.bannerApp.Data[index] = numArray4; + this.bannerApp.Nodes[index].SizeOfData = (uint) numArray4.Length; + } + } + } + } + for (int index = 0; index < this.contents.Count; ++index) + { + if (this.tmd.Contents[index].Index == (ushort) 0) + { + this.fireDebug(" Saving Banner App..."); + this.contents[index] = this.bannerApp.ToByteArray(); + break; + } + } + } + this.fireDebug(" Updating Header..."); + int num = 0; + for (int index = 0; index < this.contents.Count - 1; ++index) + num += Shared.AddPadding(this.contents[index].Length); + this.wadHeader.ContentSize = (uint) (num + this.contents[this.contents.Count - 1].Length); + this.wadHeader.TmdSize = (uint) (484 + (int) this.tmd.NumOfContents * 36); + this.fireDebug(" Updating TMD Contents..."); + this.tmd.UpdateContents(this.contents.ToArray()); + this.fireDebug(" Writing Wad Header... (Offset: 0x{0})", (object) writeStream.Position.ToString("x8").ToUpper()); + writeStream.Seek(0L, SeekOrigin.Begin); + this.wadHeader.Write(writeStream); + this.fireDebug(" Writing Certificate Chain... (Offset: 0x{0})", (object) writeStream.Position.ToString("x8").ToUpper()); + writeStream.Seek((long) Shared.AddPadding((int) writeStream.Position), SeekOrigin.Begin); + byte[] byteArray1 = this.cert.ToByteArray(); + writeStream.Write(byteArray1, 0, byteArray1.Length); + this.fireDebug(" Writing Ticket... (Offset: 0x{0})", (object) writeStream.Position.ToString("x8").ToUpper()); + writeStream.Seek((long) Shared.AddPadding((int) writeStream.Position), SeekOrigin.Begin); + byte[] byteArray2 = this.tik.ToByteArray(); + writeStream.Write(byteArray2, 0, byteArray2.Length); + this.fireDebug(" Writing TMD... (Offset: 0x{0})", (object) writeStream.Position.ToString("x8").ToUpper()); + writeStream.Seek((long) Shared.AddPadding((int) writeStream.Position), SeekOrigin.Begin); + byte[] byteArray3 = this.tmd.ToByteArray(); + writeStream.Write(byteArray3, 0, byteArray3.Length); + List contentIndicesList = new List(); + for (int index = 0; index < this.tmd.Contents.Length; ++index) + contentIndicesList.Add(new ContentIndices(index, (int) this.tmd.Contents[index].Index)); + contentIndicesList.Sort(); + for (int index = 0; index < contentIndicesList.Count; ++index) + { + writeStream.Seek((long) Shared.AddPadding((int) writeStream.Position), SeekOrigin.Begin); + this.fireProgress((index + 1) * 100 / this.contents.Count); + this.fireDebug(" Writing Content #{1} of {2}... (Offset: 0x{0})", (object) writeStream.Position.ToString("x8").ToUpper(), (object) (index + 1), (object) this.contents.Count); + this.fireDebug(" -> Content ID: 0x{0}", (object) this.tmd.Contents[contentIndicesList[index].Index].ContentID.ToString("x8")); + this.fireDebug(" -> Index: 0x{0}", (object) this.tmd.Contents[contentIndicesList[index].Index].Index.ToString("x4")); + this.fireDebug(" -> Type: 0x{0} ({1})", (object) ((ushort) this.tmd.Contents[contentIndicesList[index].Index].Type).ToString("x4"), (object) this.tmd.Contents[contentIndicesList[index].Index].Type.ToString()); + this.fireDebug(" -> Size: {0} bytes", (object) this.tmd.Contents[contentIndicesList[index].Index].Size); + this.fireDebug(" -> Hash: {0}", (object) Shared.ByteArrayToString(this.tmd.Contents[contentIndicesList[index].Index].Hash)); + byte[] buffer = this.encryptContent(this.contents[contentIndicesList[index].Index], contentIndicesList[index].Index); + writeStream.Write(buffer, 0, buffer.Length); + } + if (this.wadHeader.FooterSize > 0U) + { + this.fireDebug(" Writing Footer... (Offset: 0x{0})", (object) writeStream.Position.ToString("x8").ToUpper()); + writeStream.Seek((long) Shared.AddPadding((int) writeStream.Position), SeekOrigin.Begin); + writeStream.Write(this.footer, 0, this.footer.Length); + } + while (writeStream.Position % 64L != 0L) + writeStream.WriteByte((byte) 0); + this.fireDebug("Writing Wad Finished... (Written Bytes: {0})", (object) writeStream.Position); + } + + private void unpackAll(string unpackDir, bool nameContentId) + { + this.fireDebug("Unpacking Wad to: {0}", (object) unpackDir); + if (!Directory.Exists(unpackDir)) + Directory.CreateDirectory(unpackDir); + string str = this.tik.TitleID.ToString("x16"); + this.fireDebug(" Saving Certificate Chain: {0}.cert", (object) str); + this.cert.Save(unpackDir + (object) Path.DirectorySeparatorChar + str + ".cert"); + this.fireDebug(" Saving Ticket: {0}.tik", (object) str); + this.tik.Save(unpackDir + (object) Path.DirectorySeparatorChar + str + ".tik"); + this.fireDebug(" Saving TMD: {0}.tmd", (object) str); + this.tmd.Save(unpackDir + (object) Path.DirectorySeparatorChar + str + ".tmd"); + for (int index = 0; index < (int) this.tmd.NumOfContents; ++index) + { + this.fireProgress((index + 1) * 100 / (int) this.tmd.NumOfContents); + this.fireDebug(" Saving Content #{0} of {1}: {2}.app", (object) (index + 1), (object) this.tmd.NumOfContents, nameContentId ? (object) this.tmd.Contents[index].ContentID.ToString("x8") : (object) this.tmd.Contents[index].Index.ToString("x8")); + this.fireDebug(" -> Content ID: 0x{0}", (object) this.tmd.Contents[index].ContentID.ToString("x8")); + this.fireDebug(" -> Index: 0x{0}", (object) this.tmd.Contents[index].Index.ToString("x4")); + this.fireDebug(" -> Type: 0x{0} ({1})", (object) ((ushort) this.tmd.Contents[index].Type).ToString("x4"), (object) this.tmd.Contents[index].Type.ToString()); + this.fireDebug(" -> Size: {0} bytes", (object) this.tmd.Contents[index].Size); + this.fireDebug(" -> Hash: {0}", (object) Shared.ByteArrayToString(this.tmd.Contents[index].Hash)); + using (FileStream fileStream = new FileStream(unpackDir + (object) Path.DirectorySeparatorChar + (nameContentId ? (object) this.tmd.Contents[index].ContentID.ToString("x8") : (object) this.tmd.Contents[index].Index.ToString("x8")) + ".app", FileMode.Create)) + fileStream.Write(this.contents[index], 0, this.contents[index].Length); + } + this.fireDebug(" Saving Footer: {0}.footer", (object) str); + using (FileStream fileStream = new FileStream(unpackDir + (object) Path.DirectorySeparatorChar + str + ".footer", FileMode.Create)) + fileStream.Write(this.footer, 0, this.footer.Length); + this.fireDebug("Unpacking Wad Finished..."); + } + + private void parseWad(Stream wadFile) + { + this.fireDebug("Parsing Wad..."); + wadFile.Seek(0L, SeekOrigin.Begin); + byte[] buffer = new byte[4]; + this.wadHeader = new WAD_Header(); + this.contents = new List(); + this.fireDebug(" Parsing Header... (Offset: 0x{0})", (object) wadFile.Position.ToString("x8").ToUpper()); + wadFile.Read(buffer, 0, 4); + if ((int) Shared.Swap(BitConverter.ToUInt32(buffer, 0)) != (int) this.wadHeader.HeaderSize) + throw new Exception("Invalid Headersize!"); + wadFile.Read(buffer, 0, 4); + this.wadHeader.WadType = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + wadFile.Seek(12L, SeekOrigin.Current); + wadFile.Read(buffer, 0, 4); + this.wadHeader.TmdSize = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + wadFile.Read(buffer, 0, 4); + this.wadHeader.ContentSize = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + wadFile.Read(buffer, 0, 4); + this.wadHeader.FooterSize = Shared.Swap(BitConverter.ToUInt32(buffer, 0)); + this.fireDebug(" Parsing Certificate Chain... (Offset: 0x{0})", (object) wadFile.Position.ToString("x8").ToUpper()); + wadFile.Seek((long) Shared.AddPadding((int) wadFile.Position), SeekOrigin.Begin); + byte[] numArray1 = new byte[(IntPtr) this.wadHeader.CertSize]; + wadFile.Read(numArray1, 0, numArray1.Length); + this.cert.LoadFile(numArray1); + this.fireDebug(" Parsing Ticket... (Offset: 0x{0})", (object) wadFile.Position.ToString("x8").ToUpper()); + wadFile.Seek((long) Shared.AddPadding((int) wadFile.Position), SeekOrigin.Begin); + byte[] numArray2 = new byte[(IntPtr) this.wadHeader.TicketSize]; + wadFile.Read(numArray2, 0, numArray2.Length); + this.tik.LoadFile(numArray2); + this.fireDebug(" Parsing TMD... (Offset: 0x{0})", (object) wadFile.Position.ToString("x8").ToUpper()); + wadFile.Seek((long) Shared.AddPadding((int) wadFile.Position), SeekOrigin.Begin); + byte[] numArray3 = new byte[(IntPtr) this.wadHeader.TmdSize]; + wadFile.Read(numArray3, 0, numArray3.Length); + this.tmd.LoadFile(numArray3); + if ((long) this.tmd.TitleID != (long) this.tik.TitleID) + this.fireWarning("The Title ID in the Ticket doesn't match the one in the TMD!"); + for (int contentIndex = 0; contentIndex < (int) this.tmd.NumOfContents; ++contentIndex) + { + this.fireProgress((contentIndex + 1) * 100 / (int) this.tmd.NumOfContents); + this.fireDebug(" Reading Content #{0} of {1}... (Offset: 0x{2})", (object) (contentIndex + 1), (object) this.tmd.NumOfContents, (object) wadFile.Position.ToString("x8").ToUpper()); + this.fireDebug(" -> Content ID: 0x{0}", (object) this.tmd.Contents[contentIndex].ContentID.ToString("x8")); + this.fireDebug(" -> Index: 0x{0}", (object) this.tmd.Contents[contentIndex].Index.ToString("x4")); + this.fireDebug(" -> Type: 0x{0} ({1})", (object) ((ushort) this.tmd.Contents[contentIndex].Type).ToString("x4"), (object) this.tmd.Contents[contentIndex].Type.ToString()); + this.fireDebug(" -> Size: {0} bytes", (object) this.tmd.Contents[contentIndex].Size); + this.fireDebug(" -> Hash: {0}", (object) Shared.ByteArrayToString(this.tmd.Contents[contentIndex].Hash)); + wadFile.Seek((long) Shared.AddPadding((int) wadFile.Position), SeekOrigin.Begin); + byte[] array = new byte[Shared.AddPadding((int) this.tmd.Contents[contentIndex].Size, 16)]; + wadFile.Read(array, 0, array.Length); + array = this.decryptContent(array, contentIndex); + Array.Resize(ref array, (int) this.tmd.Contents[contentIndex].Size); + if (!Shared.CompareByteArrays(this.tmd.Contents[contentIndex].Hash, this.sha.ComputeHash(array, 0, (int) this.tmd.Contents[contentIndex].Size))) + { + this.fireDebug("/!\\ /!\\ /!\\ Hashes do not match /!\\ /!\\ /!\\"); + this.fireWarning(string.Format("Content #{0} (Content ID: 0x{1}; Index: 0x{2}): Hashes do not match! The content might be corrupted!", (object) (contentIndex + 1), (object) this.tmd.Contents[contentIndex].ContentID.ToString("x8"), (object) this.tmd.Contents[contentIndex].Index.ToString("x4"))); + } + this.contents.Add(array); + if (this.tmd.Contents[contentIndex].Index == (ushort) 0) + { + try + { + this.bannerApp.LoadFile(array); + this.hasBanner = true; + } + catch + { + this.hasBanner = false; + } + } + } + if (this.wadHeader.FooterSize > 0U) + { + this.fireDebug(" Reading Footer... (Offset: 0x{0})", (object) wadFile.Position.ToString("x8").ToUpper()); + this.footer = new byte[(IntPtr) this.wadHeader.FooterSize]; + wadFile.Seek((long) Shared.AddPadding((int) wadFile.Position), SeekOrigin.Begin); + wadFile.Read(this.footer, 0, this.footer.Length); + this.parseFooterTimestamp(); + } + this.fireDebug("Parsing Wad Finished..."); + } + + private byte[] decryptContent(byte[] content, int contentIndex) + { + int length = content.Length; + Array.Resize(ref content, Shared.AddPadding(content.Length, 16)); + byte[] titleKey = this.tik.TitleKey; + byte[] numArray = new byte[16]; + byte[] bytes = BitConverter.GetBytes(this.tmd.Contents[contentIndex].Index); + numArray[0] = bytes[1]; + numArray[1] = bytes[0]; + RijndaelManaged rijndaelManaged = new RijndaelManaged(); + rijndaelManaged.Mode = CipherMode.CBC; + rijndaelManaged.Padding = PaddingMode.None; + rijndaelManaged.KeySize = 128; + rijndaelManaged.BlockSize = 128; + rijndaelManaged.Key = titleKey; + rijndaelManaged.IV = numArray; + ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(); + MemoryStream memoryStream = new MemoryStream(content); + CryptoStream cryptoStream = new CryptoStream((Stream) memoryStream, decryptor, CryptoStreamMode.Read); + byte[] buffer = new byte[length]; + cryptoStream.Read(buffer, 0, buffer.Length); + cryptoStream.Dispose(); + memoryStream.Dispose(); + return buffer; + } + + private byte[] encryptContent(byte[] content, int contentIndex) + { + Array.Resize(ref content, Shared.AddPadding(content.Length, 16)); + byte[] titleKey = this.tik.TitleKey; + byte[] numArray = new byte[16]; + byte[] bytes = BitConverter.GetBytes(this.tmd.Contents[contentIndex].Index); + numArray[0] = bytes[1]; + numArray[1] = bytes[0]; + RijndaelManaged rijndaelManaged = new RijndaelManaged(); + rijndaelManaged.Mode = CipherMode.CBC; + rijndaelManaged.Padding = PaddingMode.None; + rijndaelManaged.KeySize = 128; + rijndaelManaged.BlockSize = 128; + rijndaelManaged.Key = titleKey; + rijndaelManaged.IV = numArray; + ICryptoTransform encryptor = rijndaelManaged.CreateEncryptor(); + MemoryStream memoryStream = new MemoryStream(content); + CryptoStream cryptoStream = new CryptoStream((Stream) memoryStream, encryptor, CryptoStreamMode.Read); + byte[] buffer = new byte[content.Length]; + cryptoStream.Read(buffer, 0, buffer.Length); + cryptoStream.Dispose(); + memoryStream.Dispose(); + return buffer; + } + + private void createFooterTimestamp() + { + byte[] bytes = new ASCIIEncoding().GetBytes("TmStmp" + ((int) (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString()); + Array.Resize(ref bytes, 64); + this.wadHeader.FooterSize = (uint) bytes.Length; + this.footer = bytes; + } + + private void parseFooterTimestamp() + { + this.creationTimeUTC = new DateTime(1970, 1, 1); + if ((this.footer[0] != (byte) 67 || this.footer[1] != (byte) 77 || this.footer[2] != (byte) 105 || this.footer[3] != (byte) 105 || this.footer[4] != (byte) 85 || this.footer[5] != (byte) 84) && (this.footer[0] != (byte) 84 || this.footer[1] != (byte) 109 || this.footer[2] != (byte) 83 || this.footer[3] != (byte) 116 || this.footer[4] != (byte) 109 || this.footer[5] != (byte) 112)) + return; + string s = new ASCIIEncoding().GetString(this.footer, 6, 10); + int result = 0; + if (!int.TryParse(s, out result)) + return; + this.creationTimeUTC = this.creationTimeUTC.AddSeconds((double) result); + } + + public event EventHandler Progress; + + public event EventHandler Warning; + + public event EventHandler Debug; + + private void fireDebug(string debugMessage, params object[] args) + { + EventHandler debug = this.Debug; + if (debug == null) + return; + debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); + } + + private void fireWarning(string warningMessage) + { + EventHandler warning = this.Warning; + if (warning == null) + return; + warning(new object(), new MessageEventArgs(warningMessage)); + } + + private void fireProgress(int progressPercentage) + { + EventHandler progress = this.Progress; + if (progress == null) + return; + progress(new object(), new ProgressChangedEventArgs(progressPercentage, (object) string.Empty)); + } + + private void cert_Debug(object sender, MessageEventArgs e) => this.fireDebug(" Certificate Chain: {0}", (object) e.Message); + + private void tik_Debug(object sender, MessageEventArgs e) => this.fireDebug(" Ticket: {0}", (object) e.Message); + + private void tmd_Debug(object sender, MessageEventArgs e) => this.fireDebug(" TMD: {0}", (object) e.Message); + + private void bannerApp_Debug(object sender, MessageEventArgs e) => this.fireDebug(" BannerApp: {0}", (object) e.Message); + + private void bannerApp_Warning(object sender, MessageEventArgs e) => this.fireWarning(e.Message); + } +} diff --git a/libWiiSharp/WAD_Header.cs b/libWiiSharp/WAD_Header.cs new file mode 100644 index 0000000..b2a8bef --- /dev/null +++ b/libWiiSharp/WAD_Header.cs @@ -0,0 +1,68 @@ +// Decompiled with JetBrains decompiler +// Type: libWiiSharp.WAD_Header +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.IO; + +namespace libWiiSharp +{ + public class WAD_Header + { + private uint headerSize = 32; + private uint wadType = 1232273408; + private uint certSize = 2560; + private uint reserved; + private uint tikSize = 676; + private uint tmdSize; + private uint contentSize; + private uint footerSize; + + public uint HeaderSize => this.headerSize; + + public uint WadType + { + get => this.wadType; + set => this.wadType = value; + } + + public uint CertSize => this.certSize; + + public uint Reserved => this.reserved; + + public uint TicketSize => this.tikSize; + + public uint TmdSize + { + get => this.tmdSize; + set => this.tmdSize = value; + } + + public uint ContentSize + { + get => this.contentSize; + set => this.contentSize = value; + } + + public uint FooterSize + { + get => this.footerSize; + set => this.footerSize = value; + } + + public void Write(Stream writeStream) + { + writeStream.Seek(0L, SeekOrigin.Begin); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.headerSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.wadType)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.certSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.reserved)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.tikSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.tmdSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.contentSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(this.footerSize)), 0, 4); + } + } +} diff --git a/wmgCMS/WaterMarkTextBox.cs b/wmgCMS/WaterMarkTextBox.cs new file mode 100644 index 0000000..1e9597f --- /dev/null +++ b/wmgCMS/WaterMarkTextBox.cs @@ -0,0 +1,95 @@ +// Decompiled with JetBrains decompiler +// Type: wmgCMS.WaterMarkTextBox +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace wmgCMS +{ + internal class WaterMarkTextBox : TextBox + { + private Font oldFont; + private bool waterMarkTextEnabled; + private Color _waterMarkColor = Color.Gray; + private string _waterMarkText = "Water Mark"; + + public Color WaterMarkColor + { + get => this._waterMarkColor; + set + { + this._waterMarkColor = value; + this.Invalidate(); + } + } + + public string WaterMarkText + { + get => this._waterMarkText; + set + { + this._waterMarkText = value; + this.Invalidate(); + } + } + + public WaterMarkTextBox() => this.JoinEvents(true); + + protected override void OnCreateControl() + { + base.OnCreateControl(); + this.EnableWaterMark(); + } + + protected override void OnPaint(PaintEventArgs args) + { + Font font = new Font(this.Font.FontFamily, this.Font.Size, this.Font.Style, this.Font.Unit); + SolidBrush solidBrush = new SolidBrush(this.WaterMarkColor); + PointF point = new PointF((float) ((double) args.ClipRectangle.Width / 2.0 - (double) TextRenderer.MeasureText(this.WaterMarkText, this.Font).Width / 2.0), 0.0f); + args.Graphics.DrawString(this.waterMarkTextEnabled ? this.WaterMarkText : this.Text, font, (Brush) solidBrush, point); + base.OnPaint(args); + } + + private void JoinEvents(bool join) + { + if (!join) + return; + this.TextChanged += new EventHandler(this.WaterMark_Toggel); + this.LostFocus += new EventHandler(this.WaterMark_Toggel); + this.GotFocus += new EventHandler(this.WaterMark_Toggel); + this.MouseCaptureChanged += new EventHandler(this.WaterMark_Toggel); + this.FontChanged += new EventHandler(this.WaterMark_FontChanged); + } + + private void WaterMark_Toggel(object sender, EventArgs args) => this.DisbaleWaterMark(); + + private void EnableWaterMark() + { + this.oldFont = new Font(this.Font.FontFamily, this.Font.Size, this.Font.Style, this.Font.Unit); + this.SetStyle(ControlStyles.UserPaint, true); + this.waterMarkTextEnabled = true; + this.Refresh(); + } + + private void DisbaleWaterMark() + { + this.waterMarkTextEnabled = false; + this.SetStyle(ControlStyles.UserPaint, false); + if (this.oldFont == null) + return; + this.Font = new Font(this.oldFont.FontFamily, this.oldFont.Size, this.oldFont.Style, this.oldFont.Unit); + } + + private void WaterMark_FontChanged(object sender, EventArgs args) + { + if (!this.waterMarkTextEnabled) + return; + this.oldFont = new Font(this.Font.FontFamily, this.Font.Size, this.Font.Style, this.Font.Unit); + this.Refresh(); + } + } +} diff --git a/wyDay/Controls/CTaskbarList.cs b/wyDay/Controls/CTaskbarList.cs new file mode 100644 index 0000000..e5c3e19 --- /dev/null +++ b/wyDay/Controls/CTaskbarList.cs @@ -0,0 +1,20 @@ +// Decompiled with JetBrains decompiler +// Type: wyDay.Controls.CTaskbarList +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace wyDay.Controls +{ + [ClassInterface(ClassInterfaceType.None)] + [Guid("56FDF344-FD6D-11d0-958A-006097C9A090")] + [ComImport] + internal class CTaskbarList + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public extern CTaskbarList(); + } +} diff --git a/wyDay/Controls/ITaskbarList3.cs b/wyDay/Controls/ITaskbarList3.cs new file mode 100644 index 0000000..0cf4705 --- /dev/null +++ b/wyDay/Controls/ITaskbarList3.cs @@ -0,0 +1,40 @@ +// Decompiled with JetBrains decompiler +// Type: wyDay.Controls.ITaskbarList3 +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace wyDay.Controls +{ + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")] + [ComImport] + internal interface ITaskbarList3 + { + [MethodImpl(MethodImplOptions.PreserveSig)] + void HrInit(); + + [MethodImpl(MethodImplOptions.PreserveSig)] + void AddTab(IntPtr hwnd); + + [MethodImpl(MethodImplOptions.PreserveSig)] + void DeleteTab(IntPtr hwnd); + + [MethodImpl(MethodImplOptions.PreserveSig)] + void ActivateTab(IntPtr hwnd); + + [MethodImpl(MethodImplOptions.PreserveSig)] + void SetActiveAlt(IntPtr hwnd); + + [MethodImpl(MethodImplOptions.PreserveSig)] + void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen); + + void SetProgressValue(IntPtr hwnd, ulong ullCompleted, ulong ullTotal); + + void SetProgressState(IntPtr hwnd, ThumbnailProgressState tbpFlags); + } +} diff --git a/wyDay/Controls/ProgressBarState.cs b/wyDay/Controls/ProgressBarState.cs new file mode 100644 index 0000000..a5c34a5 --- /dev/null +++ b/wyDay/Controls/ProgressBarState.cs @@ -0,0 +1,15 @@ +// Decompiled with JetBrains decompiler +// Type: wyDay.Controls.ProgressBarState +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +namespace wyDay.Controls +{ + public enum ProgressBarState + { + Normal = 1, + Error = 2, + Pause = 3, + } +} diff --git a/wyDay/Controls/ThumbnailProgressState.cs b/wyDay/Controls/ThumbnailProgressState.cs new file mode 100644 index 0000000..e01edb0 --- /dev/null +++ b/wyDay/Controls/ThumbnailProgressState.cs @@ -0,0 +1,17 @@ +// Decompiled with JetBrains decompiler +// Type: wyDay.Controls.ThumbnailProgressState +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +namespace wyDay.Controls +{ + public enum ThumbnailProgressState + { + NoProgress = 0, + Indeterminate = 1, + Normal = 2, + Error = 4, + Paused = 8, + } +} diff --git a/wyDay/Controls/Windows7ProgressBar.cs b/wyDay/Controls/Windows7ProgressBar.cs new file mode 100644 index 0000000..0b0ae59 --- /dev/null +++ b/wyDay/Controls/Windows7ProgressBar.cs @@ -0,0 +1,154 @@ +// Decompiled with JetBrains decompiler +// Type: wyDay.Controls.Windows7ProgressBar +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Windows.Forms; + +namespace wyDay.Controls +{ + [ToolboxBitmap(typeof (ProgressBar))] + public class Windows7ProgressBar : ProgressBar + { + private bool showInTaskbar; + private ProgressBarState m_State = ProgressBarState.Normal; + private ContainerControl ownerForm; + + public Windows7ProgressBar() + { + } + + public Windows7ProgressBar(ContainerControl parentControl) => this.ContainerControl = parentControl; + + public ContainerControl ContainerControl + { + get => this.ownerForm; + set + { + this.ownerForm = value; + if (this.ownerForm.Visible) + return; + ((Form) this.ownerForm).Shown += new EventHandler(this.Windows7ProgressBar_Shown); + } + } + + public override ISite Site + { + set + { + base.Site = value; + if (value == null || !(value.GetService(typeof (IDesignerHost)) is IDesignerHost service)) + return; + this.ContainerControl = service.RootComponent as ContainerControl; + } + } + + private void Windows7ProgressBar_Shown(object sender, EventArgs e) + { + if (this.ShowInTaskbar) + { + if (this.Style != ProgressBarStyle.Marquee) + this.SetValueInTB(); + this.SetStateInTB(); + } + ((Form) this.ownerForm).Shown -= new EventHandler(this.Windows7ProgressBar_Shown); + } + + [DefaultValue(false)] + public bool ShowInTaskbar + { + get => this.showInTaskbar; + set + { + if (this.showInTaskbar == value) + return; + this.showInTaskbar = value; + if (this.ownerForm == null) + return; + if (this.Style != ProgressBarStyle.Marquee) + this.SetValueInTB(); + this.SetStateInTB(); + } + } + + public new int Value + { + get => base.Value; + set + { + base.Value = value; + this.SetValueInTB(); + } + } + + public new ProgressBarStyle Style + { + get => base.Style; + set + { + base.Style = value; + if (!this.showInTaskbar || this.ownerForm == null) + return; + this.SetStateInTB(); + } + } + + [DefaultValue(ProgressBarState.Normal)] + public ProgressBarState State + { + get => this.m_State; + set + { + this.m_State = value; + bool flag = this.Style == ProgressBarStyle.Marquee; + if (flag) + this.Style = ProgressBarStyle.Blocks; + Windows7Taskbar.SendMessage(this.Handle, 1040, (int) value, 0); + if (flag) + this.SetValueInTB(); + else + this.SetStateInTB(); + } + } + + public new void Increment(int value) + { + base.Increment(value); + this.SetValueInTB(); + } + + public new void PerformStep() + { + base.PerformStep(); + this.SetValueInTB(); + } + + private void SetValueInTB() + { + if (!this.showInTaskbar) + return; + Windows7Taskbar.SetProgressValue(this.ownerForm.Handle, (ulong) (this.Value - this.Minimum), (ulong) (this.Maximum - this.Minimum)); + } + + private void SetStateInTB() + { + if (this.ownerForm == null) + return; + ThumbnailProgressState state = ThumbnailProgressState.Normal; + if (!this.showInTaskbar) + state = ThumbnailProgressState.NoProgress; + else if (this.Style == ProgressBarStyle.Marquee) + state = ThumbnailProgressState.Indeterminate; + else if (this.m_State == ProgressBarState.Error) + state = ThumbnailProgressState.Error; + else if (this.m_State == ProgressBarState.Pause) + state = ThumbnailProgressState.Paused; + Windows7Taskbar.SetProgressState(this.ownerForm.Handle, state); + } + } +} diff --git a/wyDay/Controls/Windows7Taskbar.cs b/wyDay/Controls/Windows7Taskbar.cs new file mode 100644 index 0000000..49810d0 --- /dev/null +++ b/wyDay/Controls/Windows7Taskbar.cs @@ -0,0 +1,55 @@ +// Decompiled with JetBrains decompiler +// Type: wyDay.Controls.Windows7Taskbar +// Assembly: NUS Downloader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: DDAF9FEC-76DE-4BD8-8A6D-D7CAD5827AC6 +// Assembly location: C:\dotpeek\NUS Downloader.exe + +using System; +using System.Runtime.InteropServices; + +namespace wyDay.Controls +{ + public static class Windows7Taskbar + { + private static ITaskbarList3 _taskbarList; + private static readonly OperatingSystem osInfo = Environment.OSVersion; + + internal static ITaskbarList3 TaskbarList + { + get + { + if (Windows7Taskbar._taskbarList == null) + { + lock (typeof (Windows7Taskbar)) + { + if (Windows7Taskbar._taskbarList == null) + { + Windows7Taskbar._taskbarList = (ITaskbarList3) new CTaskbarList(); + Windows7Taskbar._taskbarList.HrInit(); + } + } + } + return Windows7Taskbar._taskbarList; + } + } + + internal static bool Windows7OrGreater => Windows7Taskbar.osInfo.Version.Major == 6 && Windows7Taskbar.osInfo.Version.Minor >= 1 || Windows7Taskbar.osInfo.Version.Major > 6; + + public static void SetProgressState(IntPtr hwnd, ThumbnailProgressState state) + { + if (!Windows7Taskbar.Windows7OrGreater) + return; + Windows7Taskbar.TaskbarList.SetProgressState(hwnd, state); + } + + public static void SetProgressValue(IntPtr hwnd, ulong current, ulong maximum) + { + if (!Windows7Taskbar.Windows7OrGreater) + return; + Windows7Taskbar.TaskbarList.SetProgressValue(hwnd, current, maximum); + } + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + internal static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); + } +}