From 5179fafbc0111ab0c4e34afb46be5716ab18fc6d Mon Sep 17 00:00:00 2001 From: gjefferyes Date: Tue, 23 Sep 2014 12:06:15 -0700 Subject: [PATCH] First Public Release. --- ROMVault2.sln | 30 + ROMVault2/BackGroundWorkerInterface.cs | 152 + ROMVault2/DBHelper.cs | 507 +++ ROMVault2/DatMaker.cs | 105 + ROMVault2/DatReaders/DatCmpReader.cs | 615 +++ ROMVault2/DatReaders/DatDOSReader.cs | 321 ++ ROMVault2/DatReaders/DatMessXMLReader.cs | 223 + ROMVault2/DatReaders/DatReader.cs | 601 +++ ROMVault2/DatReaders/DatXMLReader.cs | 410 ++ ROMVault2/DatUpdate.cs | 784 ++++ ROMVault2/DirCellDraw.cs | 146 + ROMVault2/FileScanning.cs | 842 ++++ ROMVault2/FindFixes.cs | 479 ++ ROMVault2/FixFileCopy.cs | 675 +++ ROMVault2/FixFiles.cs | 1850 ++++++++ ROMVault2/FrmProgressWindow.Designer.cs | 220 + ROMVault2/FrmProgressWindow.cs | 241 + ROMVault2/FrmProgressWindow.resx | 1799 ++++++++ ROMVault2/FrmProgressWindowFix.cs | 181 + ROMVault2/FrmProgressWindowFix.designer.cs | 290 ++ ROMVault2/FrmProgressWindowFix.resx | 1817 ++++++++ ROMVault2/FrmRegistration.Designer.cs | 121 + ROMVault2/FrmRegistration.cs | 28 + ROMVault2/FrmRegistration.resx | 120 + ROMVault2/IO/RVIO.cs | 606 +++ ROMVault2/IO/Win32Native.cs | 181 + ROMVault2/Program.cs | 54 + ROMVault2/Properties/AssemblyInfo.cs | 36 + ROMVault2/Properties/Resources.Designer.cs | 741 ++++ ROMVault2/Properties/Resources.resx | 345 ++ ROMVault2/Properties/Settings.Designer.cs | 26 + ROMVault2/Properties/Settings.settings | 7 + ROMVault2/ROMVault2.csproj | 337 ++ ROMVault2/RepairStatus.cs | 318 ++ ROMVault2/Report.cs | 430 ++ ROMVault2/ReportError.cs | 228 + ROMVault2/RvDB/DB.cs | 138 + ROMVault2/RvDB/FileStatus.cs | 35 + ROMVault2/RvDB/RvBase.cs | 308 ++ ROMVault2/RvDB/RvDat.cs | 118 + ROMVault2/RvDB/RvDir.cs | 345 ++ ROMVault2/RvDB/RvFile.cs | 251 ++ ROMVault2/RvDB/RvGame.cs | 122 + .../Service References/RVRef/Reference.cs | 137 + .../Service References/RVRef/Reference.svcmap | 33 + .../Service References/RVRef/Service1.xsd | 42 + .../Service References/RVRef/Service11.disco | 4 + .../Service References/RVRef/Service11.wsdl | 266 ++ .../Service References/RVRef/Service11.xsd | 198 + .../RVRef/configuration.svcinfo | 10 + .../RVRef/configuration91.svcinfo | 201 + ROMVault2/Settings.cs | 314 ++ ROMVault2/SupportedFiles/CHD/CHD.cs | 438 ++ ROMVault2/SupportedFiles/Files/UnCompFiles.cs | 70 + ROMVault2/SupportedFiles/Zip/ZLib/Crc32.cs | 856 ++++ ROMVault2/SupportedFiles/Zip/ZLib/Deflate.cs | 1890 ++++++++ .../SupportedFiles/Zip/ZLib/DeflateStream.cs | 740 ++++ .../SupportedFiles/Zip/ZLib/GZipStream.cs | 1033 +++++ ROMVault2/SupportedFiles/Zip/ZLib/InfTree.cs | 436 ++ ROMVault2/SupportedFiles/Zip/ZLib/Inflate.cs | 1797 ++++++++ ROMVault2/SupportedFiles/Zip/ZLib/Tree.cs | 421 ++ ROMVault2/SupportedFiles/Zip/ZLib/Zlib.cs | 544 +++ .../SupportedFiles/Zip/ZLib/ZlibBaseStream.cs | 627 +++ .../SupportedFiles/Zip/ZLib/ZlibCodec.cs | 717 +++ .../SupportedFiles/Zip/ZLib/ZlibConstants.cs | 126 + .../SupportedFiles/Zip/ZLib/ZlibStream.cs | 725 +++ ROMVault2/SupportedFiles/Zip/zipFile.cs | 1549 +++++++ ROMVault2/SupportedFiles/ZipEnums.cs | 57 + ROMVault2/Utils/ArrByte.cs | 72 + ROMVault2/Utils/DBTypeGet.cs | 58 + ROMVault2/Utils/RelativePath.cs | 95 + ROMVault2/Utils/ULong.cs | 23 + ROMVault2/Utils/VarFix.cs | 183 + ROMVault2/chdman.exe | Bin 0 -> 1110938 bytes ROMVault2/chip.ico | Bin 0 -> 99678 bytes ROMVault2/frmHelpAbout.Designer.cs | 97 + ROMVault2/frmHelpAbout.cs | 40 + ROMVault2/frmHelpAbout.resx | 120 + ROMVault2/frmKey.Designer.cs | 55 + ROMVault2/frmKey.cs | 117 + ROMVault2/frmKey.resx | 1787 ++++++++ ROMVault2/frmMain.Designer.cs | 1104 +++++ ROMVault2/frmMain.cs | 1339 ++++++ ROMVault2/frmMain.resx | 2236 ++++++++++ ROMVault2/frmSetDir.Designer.cs | 241 + ROMVault2/frmSetDir.cs | 167 + ROMVault2/frmSettings.Designer.cs | 271 ++ ROMVault2/frmSettings.cs | 101 + ROMVault2/frmSettings.resx | 120 + ROMVault2/frmShowError.Designer.cs | 89 + ROMVault2/frmShowError.cs | 29 + ROMVault2/frmShowError.resx | 1787 ++++++++ ROMVault2/frmSplashScreen.Designer.cs | 119 + ROMVault2/frmSplashScreen.cs | 159 + ROMVault2/frmSplashScreen.resx | 587 +++ ROMVault2/rvImages.cs | 56 + ROMVault2/rvImages1.Designer.cs | 743 ++++ ROMVault2/rvImages1.resx | 3922 +++++++++++++++++ ROMVault2/rvTree.Designer.cs | 47 + ROMVault2/rvTree.cs | 452 ++ ROMVault2/rvTree.resx | 120 + ROMVault2/rvTreeRow.cs | 99 + 102 files changed, 46849 insertions(+) create mode 100644 ROMVault2.sln create mode 100644 ROMVault2/BackGroundWorkerInterface.cs create mode 100644 ROMVault2/DBHelper.cs create mode 100644 ROMVault2/DatMaker.cs create mode 100644 ROMVault2/DatReaders/DatCmpReader.cs create mode 100644 ROMVault2/DatReaders/DatDOSReader.cs create mode 100644 ROMVault2/DatReaders/DatMessXMLReader.cs create mode 100644 ROMVault2/DatReaders/DatReader.cs create mode 100644 ROMVault2/DatReaders/DatXMLReader.cs create mode 100644 ROMVault2/DatUpdate.cs create mode 100644 ROMVault2/DirCellDraw.cs create mode 100644 ROMVault2/FileScanning.cs create mode 100644 ROMVault2/FindFixes.cs create mode 100644 ROMVault2/FixFileCopy.cs create mode 100644 ROMVault2/FixFiles.cs create mode 100644 ROMVault2/FrmProgressWindow.Designer.cs create mode 100644 ROMVault2/FrmProgressWindow.cs create mode 100644 ROMVault2/FrmProgressWindow.resx create mode 100644 ROMVault2/FrmProgressWindowFix.cs create mode 100644 ROMVault2/FrmProgressWindowFix.designer.cs create mode 100644 ROMVault2/FrmProgressWindowFix.resx create mode 100644 ROMVault2/FrmRegistration.Designer.cs create mode 100644 ROMVault2/FrmRegistration.cs create mode 100644 ROMVault2/FrmRegistration.resx create mode 100644 ROMVault2/IO/RVIO.cs create mode 100644 ROMVault2/IO/Win32Native.cs create mode 100644 ROMVault2/Program.cs create mode 100644 ROMVault2/Properties/AssemblyInfo.cs create mode 100644 ROMVault2/Properties/Resources.Designer.cs create mode 100644 ROMVault2/Properties/Resources.resx create mode 100644 ROMVault2/Properties/Settings.Designer.cs create mode 100644 ROMVault2/Properties/Settings.settings create mode 100644 ROMVault2/ROMVault2.csproj create mode 100644 ROMVault2/RepairStatus.cs create mode 100644 ROMVault2/Report.cs create mode 100644 ROMVault2/ReportError.cs create mode 100644 ROMVault2/RvDB/DB.cs create mode 100644 ROMVault2/RvDB/FileStatus.cs create mode 100644 ROMVault2/RvDB/RvBase.cs create mode 100644 ROMVault2/RvDB/RvDat.cs create mode 100644 ROMVault2/RvDB/RvDir.cs create mode 100644 ROMVault2/RvDB/RvFile.cs create mode 100644 ROMVault2/RvDB/RvGame.cs create mode 100644 ROMVault2/Service References/RVRef/Reference.cs create mode 100644 ROMVault2/Service References/RVRef/Reference.svcmap create mode 100644 ROMVault2/Service References/RVRef/Service1.xsd create mode 100644 ROMVault2/Service References/RVRef/Service11.disco create mode 100644 ROMVault2/Service References/RVRef/Service11.wsdl create mode 100644 ROMVault2/Service References/RVRef/Service11.xsd create mode 100644 ROMVault2/Service References/RVRef/configuration.svcinfo create mode 100644 ROMVault2/Service References/RVRef/configuration91.svcinfo create mode 100644 ROMVault2/Settings.cs create mode 100644 ROMVault2/SupportedFiles/CHD/CHD.cs create mode 100644 ROMVault2/SupportedFiles/Files/UnCompFiles.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/Crc32.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/Deflate.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/DeflateStream.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/GZipStream.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/InfTree.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/Inflate.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/Tree.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/Zlib.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/ZlibBaseStream.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/ZlibCodec.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/ZlibConstants.cs create mode 100644 ROMVault2/SupportedFiles/Zip/ZLib/ZlibStream.cs create mode 100644 ROMVault2/SupportedFiles/Zip/zipFile.cs create mode 100644 ROMVault2/SupportedFiles/ZipEnums.cs create mode 100644 ROMVault2/Utils/ArrByte.cs create mode 100644 ROMVault2/Utils/DBTypeGet.cs create mode 100644 ROMVault2/Utils/RelativePath.cs create mode 100644 ROMVault2/Utils/ULong.cs create mode 100644 ROMVault2/Utils/VarFix.cs create mode 100644 ROMVault2/chdman.exe create mode 100644 ROMVault2/chip.ico create mode 100644 ROMVault2/frmHelpAbout.Designer.cs create mode 100644 ROMVault2/frmHelpAbout.cs create mode 100644 ROMVault2/frmHelpAbout.resx create mode 100644 ROMVault2/frmKey.Designer.cs create mode 100644 ROMVault2/frmKey.cs create mode 100644 ROMVault2/frmKey.resx create mode 100644 ROMVault2/frmMain.Designer.cs create mode 100644 ROMVault2/frmMain.cs create mode 100644 ROMVault2/frmMain.resx create mode 100644 ROMVault2/frmSetDir.Designer.cs create mode 100644 ROMVault2/frmSetDir.cs create mode 100644 ROMVault2/frmSettings.Designer.cs create mode 100644 ROMVault2/frmSettings.cs create mode 100644 ROMVault2/frmSettings.resx create mode 100644 ROMVault2/frmShowError.Designer.cs create mode 100644 ROMVault2/frmShowError.cs create mode 100644 ROMVault2/frmShowError.resx create mode 100644 ROMVault2/frmSplashScreen.Designer.cs create mode 100644 ROMVault2/frmSplashScreen.cs create mode 100644 ROMVault2/frmSplashScreen.resx create mode 100644 ROMVault2/rvImages.cs create mode 100644 ROMVault2/rvImages1.Designer.cs create mode 100644 ROMVault2/rvImages1.resx create mode 100644 ROMVault2/rvTree.Designer.cs create mode 100644 ROMVault2/rvTree.cs create mode 100644 ROMVault2/rvTree.resx create mode 100644 ROMVault2/rvTreeRow.cs diff --git a/ROMVault2.sln b/ROMVault2.sln new file mode 100644 index 0000000..602de35 --- /dev/null +++ b/ROMVault2.sln @@ -0,0 +1,30 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30501.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ROMVault2", "ROMVault2\ROMVault2.csproj", "{437E12AB-46F3-4A75-A3D5-6C524B5A79B5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FFD35B18-3366-4460-9095-2B520EE73C87}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {437E12AB-46F3-4A75-A3D5-6C524B5A79B5}.Debug|Any CPU.ActiveCfg = Debug|x86 + {437E12AB-46F3-4A75-A3D5-6C524B5A79B5}.Debug|Any CPU.Build.0 = Debug|x86 + {437E12AB-46F3-4A75-A3D5-6C524B5A79B5}.Debug|x86.ActiveCfg = Debug|x86 + {437E12AB-46F3-4A75-A3D5-6C524B5A79B5}.Debug|x86.Build.0 = Debug|x86 + {437E12AB-46F3-4A75-A3D5-6C524B5A79B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {437E12AB-46F3-4A75-A3D5-6C524B5A79B5}.Release|Any CPU.Build.0 = Release|Any CPU + {437E12AB-46F3-4A75-A3D5-6C524B5A79B5}.Release|x86.ActiveCfg = Release|Any CPU + {437E12AB-46F3-4A75-A3D5-6C524B5A79B5}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ROMVault2/BackGroundWorkerInterface.cs b/ROMVault2/BackGroundWorkerInterface.cs new file mode 100644 index 0000000..4e11ae6 --- /dev/null +++ b/ROMVault2/BackGroundWorkerInterface.cs @@ -0,0 +1,152 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using ROMVault2.SupportedFiles; + +namespace ROMVault2 +{ + + + public class bgwProgress + { + public bgwProgress(int Progress) + { + this.Progress = Progress; + } + public int Progress { get; private set; } + } + + + public class bgwText + { + public bgwText(string Text) + { + this.Text = Text; + } + + public string Text { get; private set; } + } + public class bgwText2 + { + public bgwText2(string Text) + { + this.Text = Text; + } + + public string Text { get; private set; } + } + public class bgwText3 + { + public bgwText3(string Text) + { + this.Text = Text; + } + + public string Text { get; private set; } + } + + + public class bgwSetRange + { + public bgwSetRange(int MaxVal) + { + this.MaxVal = MaxVal; + } + + public int MaxVal { get; private set; } + } + public class bgwSetRange2 + { + public bgwSetRange2(int MaxVal) + { + this.MaxVal = MaxVal; + } + + public int MaxVal { get; private set; } + } + + + + public class bgwValue2 + { + public bgwValue2(int Value) + { + this.Value = Value; + } + + public int Value { get; private set; } + } + + + public class bgwRange2Visible + { + public bgwRange2Visible(bool Visible) + { + this.Visible = Visible; + } + + public bool Visible { get; private set; } + } + + public class bgwShowCorrupt + { + public bgwShowCorrupt(ZipReturn zr, string filename) + { + this.zr = zr; + this.filename = filename; + } + + public ZipReturn zr { get; private set; } + public string filename { get; private set; } + } + + public class bgwShowError + { + public bgwShowError(string filename, string error) + { + this.error = error; + this.filename = filename; + } + + public string filename { get; private set; } + public string error { get; private set; } + } + + + public class bgwShowFix + { + public bgwShowFix(string fixDir, string fixZip, string fixFile, ulong? size, string dir, string sourceDir, string sourceZip, string sourceFile) + { + FixDir = fixDir; + FixZip = fixZip; + FixFile = fixFile; + Size = size.ToString(); + Dir = dir; + SourceDir = sourceDir; + SourceZip = sourceZip; + SourceFile = sourceFile; + } + + public string FixDir { get; private set; } + public string FixZip { get; private set; } + public string FixFile { get; private set; } + public string Size { get; private set; } + public string Dir { get; private set; } + public string SourceDir { get; private set; } + public string SourceZip { get; private set; } + public string SourceFile { get; private set; } + } + + public class bgwShowFixError + { + public bgwShowFixError(string FixError) + { + this.FixError = FixError; + } + + public string FixError { get; private set; } + } +} diff --git a/ROMVault2/DBHelper.cs b/ROMVault2/DBHelper.cs new file mode 100644 index 0000000..02211fe --- /dev/null +++ b/ROMVault2/DBHelper.cs @@ -0,0 +1,507 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2013 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2 +{ + public enum EFile + { + Keep, + Delete + } + + public static class DBHelper + { + + + private static readonly byte[] ZeroByteMD5; + private static readonly byte[] ZeroByteSHA1; + private static readonly byte[] ZeroByteCRC; + + static DBHelper() + { + ZeroByteMD5 = VarFix.CleanMD5SHA1("d41d8cd98f00b204e9800998ecf8427e", 32); + ZeroByteSHA1 = VarFix.CleanMD5SHA1("da39a3ee5e6b4b0d3255bfef95601890afd80709", 40); + ZeroByteCRC = VarFix.CleanMD5SHA1("00000000", 8); + } + + + + public static void GetSelectedDirList(ref List lstDir) + { + GetSelectedDirList(ref lstDir, DB.DirTree); + } + private static void GetSelectedDirList(ref List lstDir, RvDir thisDir) + { + for (int i = 0; i < thisDir.ChildCount; i++) + { + if (thisDir.DatStatus != DatStatus.InDatCollect) continue; + RvDir tDir = thisDir.Child(i) as RvDir; + if (tDir == null) continue; + if (tDir.Tree == null) continue; + if (tDir.Tree.Checked == RvTreeRow.TreeSelect.Selected) + lstDir.Add(tDir); + + GetSelectedDirList(ref lstDir, tDir); + } + } + + + public static int CompareName(RvBase var1, RvBase var2) + { + int retv = TrrntZipStringCompare(var1.Name, var2.Name); + if (retv != 0) return retv; + + FileType f1 = var1.FileType; + FileType f2 = var2.FileType; + + if (f1 == FileType.ZipFile) + { + if (f2 != FileType.ZipFile) + ReportError.SendAndShow("Incompatible Compare type"); + + return Math.Sign(String.Compare(var1.Name, var2.Name, StringComparison.Ordinal)); + } + return f1.CompareTo(f2); + } + + private static int TrrntZipStringCompare(string string1, string string2) + { + char[] bytes1 = string1.ToCharArray(); + char[] bytes2 = string2.ToCharArray(); + + int pos1 = 0; + int pos2 = 0; + + for (; ; ) + { + if (pos1 == bytes1.Length) + return ((pos2 == bytes2.Length) ? 0 : -1); + if (pos2 == bytes2.Length) + return 1; + + int byte1 = bytes1[pos1++]; + int byte2 = bytes2[pos2++]; + + if (byte1 >= 65 && byte1 <= 90) byte1 += 0x20; + if (byte2 >= 65 && byte2 <= 90) byte2 += 0x20; + + if (byte1 < byte2) + return -1; + if (byte1 > byte2) + return 1; + } + } + + + + + public static int DatCompare(RvDat var1, RvDat var2) + { + int retv = Math.Sign(string.Compare(var1.GetData(RvDat.DatData.DatFullName), var2.GetData(RvDat.DatData.DatFullName), StringComparison.CurrentCultureIgnoreCase)); + if (retv != 0) return retv; + + + retv = Math.Sign(var1.TimeStamp.CompareTo(var2.TimeStamp)); + if (retv != 0) return retv; + + retv = Math.Sign(var1.AutoAddDirectory.CompareTo(var2.AutoAddDirectory)); + if (retv != 0) return retv; + + return 0; + } + + public static string GetRealPath(string rootPath) + { + string strFullPath = ""; + int lenFound = 0; + foreach (DirMap dirPathMap in Settings.DirPathMap) + { + string dirKey = dirPathMap.DirKey; + int dirKeyLen = dirKey.Length; + + if (rootPath.Length >= dirKeyLen) + if (String.Compare(rootPath.Substring(0, dirKeyLen), dirKey, StringComparison.Ordinal) == 0) + { + if (lenFound < dirKeyLen) + { + string dirPath = dirPathMap.DirPath; + lenFound = dirKeyLen; + strFullPath = rootPath == dirKey ? dirPath : IO.Path.Combine(dirPath, rootPath.Substring(dirKeyLen + 1)); + } + } + } + return strFullPath; + } + + public static string GetDatPath(string rootPath) + { + if (rootPath == "") + return Settings.DatRoot; + if (rootPath.Substring(0, 6) == "ToSort") + return "Error"; + if (rootPath.Substring(0, 8) == "RomVault") + return Settings.DatRoot + rootPath.Substring(8); + + return Settings.DatRoot; + + } + + + + + + + + public static void GetSelectedFilesSortCRCSize(out List lstFiles) + { + lstFiles = new List(); + GetSelectedFilesSortCRCSize(ref lstFiles, DB.DirTree, true); + RomSortCRCSize(lstFiles); + } + private static void GetSelectedFilesSortCRCSize(ref List lstFiles, RvBase val, bool selected) + { + if (selected) + { + RvFile rvFile = val as RvFile; + if (rvFile != null) + { + if ((rvFile.Size != null && rvFile.CRC != null) || rvFile.Size == 0) + lstFiles.Add(rvFile); + } + } + + RvDir rvVal = val as RvDir; + if (rvVal == null) return; + + for (int i = 0; i < rvVal.ChildCount; i++) + { + bool nextSelect = selected; + if (rvVal.Tree != null) + nextSelect = rvVal.Tree.Checked == RvTreeRow.TreeSelect.Selected; + GetSelectedFilesSortCRCSize(ref lstFiles, rvVal.Child(i), nextSelect); + } + } + + private static void RomSortCRCSize(List lstFiles) + { + RomSortCRCSize(0, lstFiles.Count, lstFiles); + } + private static void RomSortCRCSize(int intBase, int intTop, List lstFiles) + { + if ((intTop - intBase) <= 1) return; + int intMiddle = (intTop + intBase) / 2; + + if ((intMiddle - intBase) > 1) + RomSortCRCSize(intBase, intMiddle, lstFiles); + + if ((intTop - intMiddle) > 1) + RomSortCRCSize(intMiddle, intTop, lstFiles); + + int intBottomSize = intMiddle - intBase; + int intTopSize = intTop - intMiddle; + + RvFile[] lstBottom = new RvFile[intBottomSize]; + RvFile[] lstTop = new RvFile[intTopSize]; + + for (int intloop = 0; intloop < intBottomSize; intloop++) + lstBottom[intloop] = lstFiles[intBase + intloop]; + + for (int intloop = 0; intloop < intTopSize; intloop++) + lstTop[intloop] = lstFiles[intMiddle + intloop]; + + int intBottomCount = 0; + int intTopCount = 0; + int intCount = intBase; + + while (intBottomCount < intBottomSize && intTopCount < intTopSize) + { + if (RomSortCRCSizeFunc(lstBottom[intBottomCount], lstTop[intTopCount]) < 1) + { + lstFiles[intCount] = lstBottom[intBottomCount]; + intCount++; + intBottomCount++; + } + else + { + lstFiles[intCount] = lstTop[intTopCount]; + intCount++; + intTopCount++; + } + } + + while (intBottomCount < intBottomSize) + { + lstFiles[intCount] = lstBottom[intBottomCount]; + intCount++; + intBottomCount++; + } + while (intTopCount < intTopSize) + { + lstFiles[intCount] = lstTop[intTopCount]; + intCount++; + intTopCount++; + } + } + private static int RomSortCRCSizeFunc(RvFile a, RvFile b) + { + int retv = ArrByte.iCompare(a.CRC, b.CRC); + + if (retv == 0) + retv = ULong.iCompare(a.Size, b.Size); + + return retv; + } + + public static int RomSearchCRCSize(RvFile tRom, List lstFiles, out int index) + { + if (lstFiles.Count == 0) + { + index = 0; + return -1; + } + + // this one below method will always return the first item in a list if there is more than one matching result. + int intBottom = -1; + int intTop = lstFiles.Count - 1; + + while (intBottom + 1 < intTop) + { + int intMid = (intBottom + intTop + 1) / 2; + + int intRes = RomSortCRCSizeFunc(lstFiles[intMid], tRom); + if (intRes >= 0) + intTop = intMid; + else + intBottom = intMid; + + } + intBottom++; + index = intBottom; + return RomSortCRCSizeFunc(lstFiles[intBottom], tRom); + } + + // find all of the files that we think we have that match the needed CRC and Size. + public static void RomSearchFindFixes(RvFile tRom, List lstFiles, out List lstFilesOut) + { + lstFilesOut = new List(); + if (tRom.CRC == null || tRom.Size == null) + return; + + int intIndex; + int intRes = RomSearchCRCSize(tRom, lstFiles, out intIndex); + + while (intRes == 0) + { + if (lstFiles[intIndex].GotStatus == GotStatus.Got && FindFixes.CheckIfMissingFileCanBeFixedByGotFile(tRom, lstFiles[intIndex])) + lstFilesOut.Add(lstFiles[intIndex]); + + intIndex++; + intRes = intIndex < lstFiles.Count ? RomSortCRCSizeFunc(lstFiles[intIndex], tRom) : 1; + } + } + + // find all of the files that we think we have that match the needed CRC and Size. + public static void RomSearchFindMatchingFiles(RvFile tRom, List lstFiles, out int startIndex, out int length) + { + int intIndex; + int intRes = RomSearchCRCSize(tRom, lstFiles, out intIndex); + startIndex = intIndex; + + while (intRes == 0) + { + intIndex++; + intRes = intIndex < lstFiles.Count ? RomSortCRCSizeFunc(lstFiles[intIndex], tRom) : 1; + } + length = intIndex - startIndex; + } + + + public static bool IsZeroLengthFile(RvFile tFile) + { + if (tFile.MD5 != null) + { + if (!ArrByte.bCompare(tFile.MD5, ZeroByteMD5)) + return false; + } + + if (tFile.SHA1 != null) + { + if (!ArrByte.bCompare(tFile.SHA1, ZeroByteSHA1)) + return false; + } + + if (tFile.CRC != null) + if (!ArrByte.bCompare(tFile.CRC, ZeroByteCRC)) + return false; + + return tFile.Size == 0; + } + + public static bool RomFromSameGame(RvFile a, RvFile b) + { + if (a.Parent == null) + return false; + if (b.Parent == null) + return false; + + return a.Parent == b.Parent; + } + + + + public static void GetSelectedFilesSortSHA1CHD(out List lstFiles) + { + lstFiles = new List(); + GetSelectedFilesSortSHA1CHD(ref lstFiles, DB.DirTree, true); + RomSortSHA1CHD(lstFiles); + } + private static void GetSelectedFilesSortSHA1CHD(ref List lstFiles, RvBase val, bool selected) + { + if (selected) + { + RvFile rvFile = val as RvFile; + if (rvFile != null) + { + if (rvFile.SHA1CHD != null) + lstFiles.Add(rvFile); + } + } + + RvDir rvVal = val as RvDir; + if (rvVal == null) return; + + for (int i = 0; i < rvVal.ChildCount; i++) + { + bool nextSelect = selected; + if (rvVal.Tree != null) + nextSelect = rvVal.Tree.Checked == RvTreeRow.TreeSelect.Selected; + GetSelectedFilesSortSHA1CHD(ref lstFiles, rvVal.Child(i), nextSelect); + } + } + + private static void RomSortSHA1CHD(List lstFiles) + { + RomSortSHA1CHD(0, lstFiles.Count, lstFiles); + } + private static void RomSortSHA1CHD(int intBase, int intTop, List lstFiles) + { + if ((intTop - intBase) <= 1) return; + int intMiddle = (intTop + intBase) / 2; + + if ((intMiddle - intBase) > 1) + RomSortSHA1CHD(intBase, intMiddle, lstFiles); + + if ((intTop - intMiddle) > 1) + RomSortSHA1CHD(intMiddle, intTop, lstFiles); + + int intBottomSize = intMiddle - intBase; + int intTopSize = intTop - intMiddle; + + RvFile[] lstBottom = new RvFile[intBottomSize]; + RvFile[] lstTop = new RvFile[intTopSize]; + + for (int intloop = 0; intloop < intBottomSize; intloop++) + lstBottom[intloop] = lstFiles[intBase + intloop]; + + for (int intloop = 0; intloop < intTopSize; intloop++) + lstTop[intloop] = lstFiles[intMiddle + intloop]; + + int intBottomCount = 0; + int intTopCount = 0; + int intCount = intBase; + + while (intBottomCount < intBottomSize && intTopCount < intTopSize) + { + if (RomSortSHA1CHDFunc(lstBottom[intBottomCount], lstTop[intTopCount]) < 1) + { + lstFiles[intCount] = lstBottom[intBottomCount]; + intCount++; + intBottomCount++; + } + else + { + lstFiles[intCount] = lstTop[intTopCount]; + intCount++; + intTopCount++; + } + } + + while (intBottomCount < intBottomSize) + { + lstFiles[intCount] = lstBottom[intBottomCount]; + intCount++; + intBottomCount++; + } + while (intTopCount < intTopSize) + { + lstFiles[intCount] = lstTop[intTopCount]; + intCount++; + intTopCount++; + } + } + private static int RomSortSHA1CHDFunc(RvFile a, RvFile b) + { + int retv = ArrByte.iCompare(a.SHA1CHD, b.SHA1CHD); + + return retv; + } + + + private static int RomSearchSHA1CHD(RvFile tRom, List lstFiles, out int index) + { + if (lstFiles.Count == 0) + { + index = 0; + return -1; + } + + // this one below method will always return the first item in a list if there is more than one matching result. + int intBottom = -1; + int intTop = lstFiles.Count - 1; + + while (intBottom + 1 < intTop) + { + int intMid = (intBottom + intTop + 1) / 2; + + int intRes = RomSortSHA1CHDFunc(lstFiles[intMid], tRom); + if (intRes >= 0) + intTop = intMid; + else + intBottom = intMid; + + } + intBottom++; + index = intBottom; + return RomSortSHA1CHDFunc(lstFiles[intBottom], tRom); + } + + + // find all of the files that we have that match the needed SHA1 CHD. + public static void RomSearchFindFixesSHA1CHD(RvFile tRom, List lstFiles, out List lstFilesOut) + { + lstFilesOut = new List(); + if (tRom.SHA1CHD == null) + return; + + int intIndex; + int intRes = RomSearchSHA1CHD(tRom, lstFiles, out intIndex); + + while (intRes == 0) + { + if (lstFiles[intIndex].GotStatus == GotStatus.Got) + lstFilesOut.Add(lstFiles[intIndex]); + + intIndex++; + intRes = intIndex < lstFiles.Count ? RomSortSHA1CHDFunc(lstFiles[intIndex], tRom) : 1; + } + } + } +} diff --git a/ROMVault2/DatMaker.cs b/ROMVault2/DatMaker.cs new file mode 100644 index 0000000..e86175c --- /dev/null +++ b/ROMVault2/DatMaker.cs @@ -0,0 +1,105 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.IO; +using ROMVault2.RvDB; + +namespace ROMVault2 +{ + public static class DatMaker + { + private static StreamWriter _sw; + private static string _datName; + private static string _datDir; + public static void MakeDatFromDir(RvDir startingDir) + { + _datName = startingDir.Name; + _datDir = startingDir.Name; + Console.WriteLine("Creating Dat: " + startingDir.Name + ".dat"); + _sw = new StreamWriter(startingDir.Name + ".dat"); + + WriteDatFile(startingDir); + + _sw.Close(); + + Console.WriteLine("Dat creation complete"); + Console.ReadLine(); + } + + private static void WriteDatFile(RvDir dir) + { + WriteLine(""); + WriteLine(""); + WriteLine(""); + WriteHeader(); + + /* write Games/Dirs */ + ProcessDir(dir); + + WriteLine(""); + } + + private static void WriteHeader() + { + WriteLine("
"); + WriteLine(" " + clean(_datName) + ""); + WriteLine(" " + clean(_datDir) + ""); + WriteLine("
"); + } + + private static void WriteLine(string s) + { + _sw.WriteLine(s); + } + + private static string clean(string s) + { + s = s.Replace("\"", """); + s = s.Replace("'", "'"); + s = s.Replace("<", "<"); + s = s.Replace(">", ">"); + s = s.Replace("&", "&"); + return s; + } + + + private static void ProcessDir(RvDir dir, int depth = 1) + { + string d = new string(' ', 4 * depth); + + for (int i = 0; i < dir.ChildCount; i++) + { + RvDir game = dir.Child(i) as RvDir; + if (game != null && game.FileType == FileType.Zip) + { + WriteLine(d + ""); + WriteLine(d + " " + clean(Path.GetFileNameWithoutExtension(game.Name)) + ""); + + + for (int j = 0; j < game.ChildCount; j++) + { + RvFile file = game.Child(j) as RvFile; + if (file != null) + { + WriteLine(d + " "); + } + } + WriteLine(d + ""); + } + if (game != null && game.FileType == FileType.Dir) + { + WriteLine(d + ""); + ProcessDir(game, depth + 1); + WriteLine(d + ""); + } + } + } + + + + } +} diff --git a/ROMVault2/DatReaders/DatCmpReader.cs b/ROMVault2/DatReaders/DatCmpReader.cs new file mode 100644 index 0000000..35f1b38 --- /dev/null +++ b/ROMVault2/DatReaders/DatCmpReader.cs @@ -0,0 +1,615 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.ComponentModel; +using System.IO; +using ROMVault2.Properties; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2.DatReaders +{ + public static class DatCmpReader + { + private static bool _cleanFileNames = true; + + + public static bool ReadDat(ref RvDir tDat, string strFilename) + { + RvDir tNow = tDat; + FileType thisFileType = FileType.ZipFile; + + int errorCode = DatFileLoader.LoadDat(strFilename); + if (errorCode != 0) + { + DatUpdate.ShowDat(new Win32Exception(errorCode).Message, strFilename); + return false; + } + + DatFileLoader.Gn(); + if (DatFileLoader.EndOfStream()) + return false; + if (DatFileLoader.Next.ToLower() == "clrmamepro") + { + _cleanFileNames = true; + DatFileLoader.Gn(); + if (!LoadHeaderFromDat(ref tNow, ref thisFileType)) + return false; + DatFileLoader.Gn(); + } + if (DatFileLoader.Next.ToLower() == "romvault") + { + _cleanFileNames = false; + DatFileLoader.Gn(); + if (!LoadHeaderFromDat(ref tNow, ref thisFileType)) + return false; + DatFileLoader.Gn(); + } + + if (tNow.Dat == null) + { + tNow.Dat = new RvDat(); + string cleanedName = IO.Path.GetFileNameWithoutExtension(strFilename); + tNow.Dat.AddData(RvDat.DatData.DatName, cleanedName); + tNow.Dat.AddData(RvDat.DatData.Description, cleanedName); + } + + + while (!DatFileLoader.EndOfStream()) + { + switch (DatFileLoader.Next.ToLower()) + { + case "dir": + DatFileLoader.Gn(); + if (!LoadDirFromDat(ref tNow, ref thisFileType)) + return false; + DatFileLoader.Gn(); + break; + case "game": + DatFileLoader.Gn(); + if (!LoadGameFromDat(ref tNow, false, thisFileType)) + return false; + DatFileLoader.Gn(); + break; + case "resource": + DatFileLoader.Gn(); + if (!LoadGameFromDat(ref tNow, true, thisFileType)) + return false; + DatFileLoader.Gn(); + break; + case "emulator": + DatFileLoader.Gn(); + if (!LoadEmulator()) + return false; + DatFileLoader.Gn(); + break; + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_ReadDat_Error_keyword + DatFileLoader.Next + Resources.DatCmpReader_ReadDat_not_known, DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + + DatFileLoader.Close(); + + return true; + } + + + private static bool LoadHeaderFromDat(ref RvDir tDir, ref FileType thisFileType) + { + + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadHeaderFromDat_not_found_after_clrmamepro, DatFileLoader.Filename); + return false; + } + DatFileLoader.Gn(); + + string forceZipping = ""; + + RvDat tDat = new RvDat(); + while (DatFileLoader.Next != ")") + { + switch (DatFileLoader.Next.ToLower()) + { + case "name": tDat.AddData(RvDat.DatData.DatName, VarFix.CleanFileName(DatFileLoader.GnRest())); DatFileLoader.Gn(); break; + case "description": tDat.AddData(RvDat.DatData.Description, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "category": tDat.AddData(RvDat.DatData.Category, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "version": tDat.AddData(RvDat.DatData.Version, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "date": tDat.AddData(RvDat.DatData.Date, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "author": tDat.AddData(RvDat.DatData.Author, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "email": tDat.AddData(RvDat.DatData.Email, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "homepage": tDat.AddData(RvDat.DatData.HomePage, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "url": tDat.AddData(RvDat.DatData.URL, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + + case "comment": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "header": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "forcezipping": forceZipping = DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "forcepacking": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; // incorrect usage + case "forcemerging": tDat.AddData(RvDat.DatData.MergeType, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "forcenodump": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "dir": tDat.AddData(RvDat.DatData.DirSetup, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_ReadDat_Error_keyword + DatFileLoader.Next + Resources.DatCmpReader_LoadHeaderFromDat_not_known_in_clrmamepro, DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + + thisFileType = forceZipping.ToLower() != "no" ? FileType.ZipFile : FileType.File; + tDir.Dat = tDat; + return true; + + } + + private static bool LoadEmulator() + { + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat("( not found after emulator", DatFileLoader.Filename); + return false; + } + DatFileLoader.Gn(); + while (DatFileLoader.Next != ")") + { + switch (DatFileLoader.Next.ToLower()) + { + case "name": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "version": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + } + } + return true; + } + + + + private static bool LoadDirFromDat(ref RvDir tDat, ref FileType thisFileType) + { + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadGameFromDat_not_found_after_game, DatFileLoader.Filename); + return false; + } + DatFileLoader.Gn(); + + if (DatFileLoader.Next.ToLower() != "name") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadGameFromDat_Name_not_found_as_first_object_in, DatFileLoader.Filename); + return false; + } + + RvDir parent = tDat; + + string fullname = VarFix.CleanFullFileName(DatFileLoader.GnRest()); + while (fullname.Contains("/")) + { + int firstSlash = fullname.IndexOf("/", StringComparison.Ordinal); + string dir = fullname.Substring(0, firstSlash); + dir = VarFix.CleanFileName(dir); + + fullname = fullname.Substring(firstSlash + 1); + int index; + if (parent.ChildNameSearch(new RvDir(FileType.Dir) { Name = dir }, out index) == 0) + { + parent = (RvDir)parent.Child(index); + } + else + { + RvDir tpDir = new RvDir(FileType.Dir) + { + Name = dir, + DatStatus = DatStatus.InDatCollect, + Dat = tDat.Dat, + Tree = new RvTreeRow() + }; + parent.ChildAdd(tpDir, index); + parent = tpDir; + } + } + + RvDir tDir = new RvDir(FileType.Dir) + { + Name = fullname + }; + + DatFileLoader.Gn(); + tDir.DatStatus = DatStatus.InDatCollect; + tDir.Dat = tDat.Dat; + + int index1; + if (parent.ChildNameSearch(tDir, out index1) == 0) + tDir = (RvDir)parent.Child(index1); + else + parent.ChildAdd(tDir, index1); + + while (DatFileLoader.Next != ")") + { + switch (DatFileLoader.Next.ToLower()) + { + case "dir": + DatFileLoader.Gn(); + if (!LoadDirFromDat(ref tDir, ref thisFileType)) + return false; + DatFileLoader.Gn(); + break; + case "game": + DatFileLoader.Gn(); + if (!LoadGameFromDat(ref tDir, false, thisFileType)) + return false; + DatFileLoader.Gn(); + break; + case "resource": + DatFileLoader.Gn(); + if (!LoadGameFromDat(ref tDir, true, thisFileType)) + return false; + DatFileLoader.Gn(); + break; + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadDirFromDat_Error_Keyword + DatFileLoader.Next + Resources.DatCmpReader_LoadDirFromDat_not_know_in_dir, DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + return true; + } + + private static bool LoadGameFromDat(ref RvDir tDat, bool bolresource, FileType thisFileType) + { + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadGameFromDat_not_found_after_game, DatFileLoader.Filename); + return false; + } + DatFileLoader.Gn(); + + string snext = DatFileLoader.Next.ToLower(); + + string pathextra = ""; + if (snext == "rebuildto") + { + pathextra = VarFix.CleanFullFileName(DatFileLoader.Gn()); DatFileLoader.Gn(); + snext = DatFileLoader.Next.ToLower(); + } + + if (snext != "name") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadGameFromDat_Name_not_found_as_first_object_in, DatFileLoader.Filename); + return false; + } + + RvDir parent = tDat; + + string fullname = VarFix.CleanFullFileName(DatFileLoader.GnRest()); + if (_cleanFileNames) + fullname = fullname.Replace("/", "-"); + + if (!String.IsNullOrEmpty(pathextra)) + fullname = pathextra + "/" + fullname; + + while (fullname.Contains("/")) + { + int firstSlash = fullname.IndexOf("/", StringComparison.Ordinal); + string dir = fullname.Substring(0, firstSlash); + fullname = fullname.Substring(firstSlash + 1); + int index; + if (parent.ChildNameSearch(new RvDir(FileType.Dir) { Name = dir }, out index) == 0) + { + parent = (RvDir)parent.Child(index); + } + else + { + RvDir tpDir = new RvDir(FileType.Dir) + { + Name = dir, + DatStatus = DatStatus.InDatCollect, + Dat = tDat.Dat, + Tree = new RvTreeRow() + }; + parent.ChildAdd(tpDir, index); + parent = tpDir; + } + } + + RvDir tDir = new RvDir(thisFileType == FileType.File ? FileType.Dir : FileType.Zip) + { + Name = fullname, + DatStatus = DatStatus.InDatCollect, + Dat = tDat.Dat + }; + + int index1; + string testName = tDir.Name; + int nameCount = 0; + while (parent.ChildNameSearch(tDir, out index1) == 0) + { + tDir.Name = testName + "_" + nameCount; + nameCount++; + } + + DatFileLoader.Gn(); + tDir.Game = new RvGame(); + tDir.Game.AddData(RvGame.GameData.IsBios, bolresource ? "Yes" : "No"); + + RvDir tDirCHD = new RvDir(FileType.Dir) + { + Name = tDir.Name, + DatStatus = tDir.DatStatus, + Dat = tDir.Dat, + Game = tDir.Game + }; + + while (DatFileLoader.Next != ")") + { + switch (DatFileLoader.Next.ToLower()) + { + case "romof": tDir.Game.AddData(RvGame.GameData.RomOf, VarFix.CleanFileName(DatFileLoader.GnRest())); DatFileLoader.Gn(); break; + case "description": tDir.Game.AddData(RvGame.GameData.Description, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + + case "sourcefile": tDir.Game.AddData(RvGame.GameData.Sourcefile, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "cloneof": tDir.Game.AddData(RvGame.GameData.CloneOf, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "sampleof": tDir.Game.AddData(RvGame.GameData.SampleOf, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "board": tDir.Game.AddData(RvGame.GameData.Board, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "year": tDir.Game.AddData(RvGame.GameData.Year, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "manufacturer": tDir.Game.AddData(RvGame.GameData.Manufacturer, DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "serial": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "rebuildto": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + + case "sample": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "biosset": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + + case "chip": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "video": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "sound": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "input": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "dipswitch": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + case "driver": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + + + case "rom": + DatFileLoader.Gn(); + if (!LoadRomFromDat(ref tDir, thisFileType)) + return false; + DatFileLoader.Gn(); + break; + case "disk": + DatFileLoader.Gn(); + if (!LoadDiskFromDat(ref tDirCHD)) + return false; + DatFileLoader.Gn(); + break; + + case "archive": + DatFileLoader.Gn(); + if (!LoadArchiveFromDat()) + return false; + DatFileLoader.Gn(); + break; + + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_ReadDat_Error_keyword + DatFileLoader.Next + Resources.DatCmpReader_LoadGameFromDat_not_known_in_game, DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + + if (tDir.ChildCount > 0) + parent.ChildAdd(tDir, index1); + if (tDirCHD.ChildCount > 0) + parent.ChildAdd(tDirCHD); + + return true; + } + + private static bool LoadRomFromDat(ref RvDir tGame, FileType thisFileType) + { + + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadRomFromDat_not_found_after_rom, DatFileLoader.Filename); + return false; + } + DatFileLoader.Gn(); + + if (DatFileLoader.Next.ToLower() != "name") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadGameFromDat_Name_not_found_as_first_object_in, DatFileLoader.Filename); + return false; + } + + + string filename = VarFix.CleanFullFileName(DatFileLoader.Gn()); + RvFile tRom = new RvFile(thisFileType) { Name = filename }; + + DatFileLoader.Gn(); + tRom.Dat = tGame.Dat; + + while (DatFileLoader.Next != ")") + { + switch (DatFileLoader.Next.ToLower()) + { + case "size": tRom.Size = VarFix.ULong(DatFileLoader.Gn()); DatFileLoader.Gn(); break; + case "crc": tRom.CRC = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 8); DatFileLoader.Gn(); break; + case "sha1": tRom.SHA1 = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 40); DatFileLoader.Gn(); break; + case "md5": tRom.MD5 = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 32); DatFileLoader.Gn(); break; + case "merge": tRom.Merge = VarFix.CleanFullFileName(DatFileLoader.Gn()); DatFileLoader.Gn(); break; + case "flags": tRom.Status = VarFix.ToLower(DatFileLoader.Gn()); DatFileLoader.Gn(); break; + case "date": DatFileLoader.Gn(); DatFileLoader.Gn(); break; + case "bios": DatFileLoader.Gn(); DatFileLoader.Gn(); break; + case "region": DatFileLoader.Gn(); DatFileLoader.Gn(); break; + case "offs": DatFileLoader.Gn(); DatFileLoader.Gn(); break; + case "nodump": tRom.Status = "nodump"; DatFileLoader.Gn(); break; + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_ReadDat_Error_keyword + DatFileLoader.Next + Resources.DatCmpReader_LoadRomFromDat_not_known_in_rom, DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + + if (tRom.Size != null) tRom.FileStatusSet(FileStatus.SizeFromDAT); + if (tRom.CRC != null) tRom.FileStatusSet(FileStatus.CRCFromDAT); + if (tRom.SHA1 != null) tRom.FileStatusSet(FileStatus.SHA1FromDAT); + if (tRom.MD5 != null) tRom.FileStatusSet(FileStatus.MD5FromDAT); + + tGame.ChildAdd(tRom); + + return true; + } + + private static bool LoadDiskFromDat(ref RvDir tGame) + { + + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadRomFromDat_not_found_after_rom, DatFileLoader.Filename); + return false; + } + DatFileLoader.Gn(); + + if (DatFileLoader.Next.ToLower() != "name") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadGameFromDat_Name_not_found_as_first_object_in, DatFileLoader.Filename); + return false; + } + + + string filename = VarFix.CleanFullFileName(DatFileLoader.Gn()); + RvFile tRom = new RvFile(FileType.File) { Name = filename }; + + DatFileLoader.Gn(); + tRom.Dat = tGame.Dat; + + while (DatFileLoader.Next != ")") + { + switch (DatFileLoader.Next.ToLower()) + { + case "sha1": tRom.SHA1CHD = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 40); DatFileLoader.Gn(); break; + case "md5": tRom.MD5CHD = VarFix.CleanMD5SHA1(DatFileLoader.Gn(), 32); DatFileLoader.Gn(); break; + case "merge": tRom.Merge = VarFix.CleanFullFileName(DatFileLoader.Gn()); DatFileLoader.Gn(); break; + case "flags": tRom.Status = VarFix.ToLower(DatFileLoader.Gn()); DatFileLoader.Gn(); break; + case "nodump": tRom.Status = "nodump"; DatFileLoader.Gn(); break; + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_ReadDat_Error_keyword + DatFileLoader.Next + Resources.DatCmpReader_LoadRomFromDat_not_known_in_rom, DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + + if (tRom.SHA1CHD != null) tRom.FileStatusSet(FileStatus.SHA1CHDFromDAT); + if (tRom.MD5CHD != null) tRom.FileStatusSet(FileStatus.MD5CHDFromDAT); + + tGame.ChildAdd(tRom); + + return true; + } + + private static bool LoadArchiveFromDat() + { + + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat("( not found after Archive", DatFileLoader.Filename); + return false; + } + DatFileLoader.Gn(); + + while (DatFileLoader.Next != ")") + { + switch (DatFileLoader.Next.ToLower()) + { + case "name": DatFileLoader.Gn(); DatFileLoader.Gn(); break; + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_ReadDat_Error_keyword + DatFileLoader.Next + " not know in Archive", DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + return true; + } + + + + private static class DatFileLoader + { + public static String Filename { get; private set; } + private static Stream _fileStream; + private static StreamReader _streamReader; + private static string _line = ""; + public static string Next; + + public static int LoadDat(string strFilename) + { + Filename = strFilename; + _streamReader = null; + int errorCode = IO.FileStream.OpenFileRead(strFilename, out _fileStream); + if (errorCode != 0) + return errorCode; + _streamReader = new StreamReader(_fileStream, Program.Enc); + return 0; + } + public static void Close() + { + _streamReader.Close(); + _fileStream.Close(); + _streamReader.Dispose(); + _fileStream.Dispose(); + } + + public static bool EndOfStream() + { + return _streamReader.EndOfStream; + } + + public static string GnRest() + { + string strret = _line.Replace("\"", ""); + _line = ""; + Next = strret; + return strret; + } + + public static string Gn() + { + string ret; + while ((_line.Trim().Length == 0) && (!_streamReader.EndOfStream)) + { + _line = _streamReader.ReadLine(); + _line = (_line??"").Replace("" + (char)9, " "); + if (_line.TrimStart().Length > 2 && _line.TrimStart().Substring(0, 2) == @"//") _line = ""; + if (_line.TrimStart().Length > 1 && _line.TrimStart().Substring(0, 1) == @"#") _line = ""; + if (_line.TrimStart().Length > 1 && _line.TrimStart().Substring(0, 1) == @";") _line = ""; + _line = _line.Trim() + " "; + } + + if (_line.Trim().Length > 0) + { + int intS; + if (_line.Substring(0, 1) == "\"") + { + intS = (_line + "\"").IndexOf("\"", 1, StringComparison.Ordinal); + ret = _line.Substring(1, intS - 1); + _line = (_line + " ").Substring(intS + 1).Trim(); + } + else + { + intS = (_line + " ").IndexOf(" ", StringComparison.Ordinal); + ret = _line.Substring(0, intS); + _line = (_line + " ").Substring(intS).Trim(); + } + } + else + { + ret = ""; + } + + Next = ret; + return ret; + } + } + + } +} diff --git a/ROMVault2/DatReaders/DatDOSReader.cs b/ROMVault2/DatReaders/DatDOSReader.cs new file mode 100644 index 0000000..c094b09 --- /dev/null +++ b/ROMVault2/DatReaders/DatDOSReader.cs @@ -0,0 +1,321 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.ComponentModel; +using System.IO; +using ROMVault2.Properties; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2.DatReaders +{ + public static class DatDOSReader + { + private static bool _cleanFileNames = true; + + + public static bool ReadDat(ref RvDir tDat, string strFilename) + { + RvDir tNow = tDat; + FileType thisFileType = FileType.Unknown; + + int errorCode = DatFileLoader.LoadDat(strFilename); + if (errorCode != 0) + { + DatUpdate.ShowDat(new Win32Exception(errorCode).Message, strFilename); + return false; + } + + DatFileLoader.Gn(); + while (!DatFileLoader.EndOfStream()) + { + switch (DatFileLoader.Next.ToLower()) + { + case "doscenter": + _cleanFileNames = true; + DatFileLoader.Gn(); + if (!LoadHeaderFromDat(ref tNow, ref thisFileType)) + return false; + DatFileLoader.Gn(); + break; + case "game": + DatFileLoader.Gn(); + if (!LoadGameFromDat(ref tNow, thisFileType)) + return false; + DatFileLoader.Gn(); + break; + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_ReadDat_Error_keyword + DatFileLoader.Next + Resources.DatCmpReader_ReadDat_not_known, DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + + DatFileLoader.Close(); + return true; + } + + private static bool LoadHeaderFromDat(ref RvDir tDir, ref FileType thisFileType) + { + + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadHeaderFromDat_not_found_after_clrmamepro, DatFileLoader.Filename); + return false; + } + DatFileLoader.Gn(); + + RvDat tDat = new RvDat(); + while (DatFileLoader.Next != ")") + { + string nextstr = DatFileLoader.Next.ToLower(); + if (nextstr.Length > 5 && nextstr.Substring(0, 5) == "name:") + { + tDat.AddData(RvDat.DatData.DatName, VarFix.CleanFileName(DatFileLoader.Next.Substring(5) + " " + DatFileLoader.GnRest()).Trim()); DatFileLoader.Gn(); + } + else + { + switch (nextstr) + { + case "name:": tDat.AddData(RvDat.DatData.DatName, VarFix.CleanFileName(DatFileLoader.GnRest())); DatFileLoader.Gn(); break; + case "description:": tDat.AddData(RvDat.DatData.Description , DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "version:": tDat.AddData(RvDat.DatData.Version , DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "date:": tDat.AddData(RvDat.DatData.Date , DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "author:": tDat.AddData(RvDat.DatData.Author , DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + case "homepage:": tDat.AddData(RvDat.DatData.HomePage , DatFileLoader.GnRest()); DatFileLoader.Gn(); break; + + case "comment:": DatFileLoader.GnRest(); DatFileLoader.Gn(); break; + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_ReadDat_Error_keyword + DatFileLoader.Next + Resources.DatCmpReader_LoadHeaderFromDat_not_known_in_clrmamepro, DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + } + + thisFileType = FileType.ZipFile; + tDir.Dat = tDat; + return true; + + } + + + + + private static bool LoadGameFromDat(ref RvDir tDat, FileType thisFileType) + { + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadGameFromDat_not_found_after_game, DatFileLoader.Filename); + return false; + } + DatFileLoader.Gn(); + + string snext = DatFileLoader.Next.ToLower(); + + if (snext != "name") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadGameFromDat_Name_not_found_as_first_object_in, DatFileLoader.Filename); + return false; + } + + RvDir parent = tDat; + + string fullname = VarFix.CleanFullFileName(DatFileLoader.GnRest()); + if (_cleanFileNames) + fullname = fullname.Replace("/", "-"); + + while (fullname.Contains("/")) + { + int firstSlash = fullname.IndexOf("/", StringComparison.Ordinal); + string dir = fullname.Substring(0, firstSlash); + fullname = fullname.Substring(firstSlash + 1); + int index; + if (parent.ChildNameSearch(new RvDir(FileType.Dir) { Name = dir }, out index) == 0) + { + parent = (RvDir)parent.Child(index); + } + else + { + RvDir tpDir = new RvDir(FileType.Dir) + { + Name = dir, + DatStatus = DatStatus.InDatCollect, + Dat = tDat.Dat, + Tree = new RvTreeRow() + }; + parent.ChildAdd(tpDir, index); + parent = tpDir; + } + } + + if (fullname.Length > 4 && fullname.ToLower().Substring(fullname.Length - 4, 4) == ".zip") + fullname = fullname.Substring(0, fullname.Length - 4); + + RvDir tDir = new RvDir(thisFileType == FileType.File ? FileType.Dir : FileType.Zip) { Name = fullname }; + + DatFileLoader.Gn(); + tDir.Game = new RvGame(); + tDir.DatStatus = DatStatus.InDatCollect; + tDir.Dat = tDat.Dat; + int index1; + + string testName = tDir.Name; + int nameCount = 0; + while (parent.ChildNameSearch(tDir, out index1) == 0) + { + tDir.Name = testName + "_" + nameCount; + nameCount++; + } + parent.ChildAdd(tDir, index1); + + + while (DatFileLoader.Next != ")") + { + switch (DatFileLoader.Next.ToLower()) + { + case "file": + DatFileLoader.Gn(); + if (!LoadRomFromDat(ref tDir, thisFileType)) + return false; + DatFileLoader.Gn(); + break; + default: + DatUpdate.SendAndShowDat(Resources.DatCmpReader_ReadDat_Error_keyword + DatFileLoader.Next + Resources.DatCmpReader_LoadGameFromDat_not_known_in_game, DatFileLoader.Filename); + DatFileLoader.Gn(); + break; + } + } + + + return true; + } + + private static bool LoadRomFromDat(ref RvDir tGame, FileType thisFileType) + { + + if (DatFileLoader.Next != "(") + { + DatUpdate.SendAndShowDat(Resources.DatCmpReader_LoadRomFromDat_not_found_after_rom, DatFileLoader.Filename); + return false; + } + string line=DatFileLoader.GnRest(); + string linelc = line.ToLower(); + + int posName = linelc.IndexOf("name ", StringComparison.Ordinal); + int posSize = linelc.IndexOf(" size ", posName+5,StringComparison.Ordinal); + int posDate = linelc.IndexOf(" date ", posSize+6,StringComparison.Ordinal); + int posCrc = linelc.IndexOf(" crc ", posDate+6,StringComparison.Ordinal); + int posEnd = linelc.IndexOf(" )", posCrc+5,StringComparison.Ordinal); + + if (posName < 0 || posSize < 0 || posDate < 0 || posCrc < 0 || posEnd < 0) + { + DatFileLoader.Gn(); + return false; + } + + string name = line.Substring(posName + 5, posSize - (posName + 5)); + string size = line.Substring(posSize + 6, posDate - (posSize + 6)); + //string date = line.Substring(posDate + 6, posCrc - (posDate + 6)); + string crc = line.Substring(posCrc + 5, posEnd - (posCrc + 5)); + + RvFile tRom = new RvFile(thisFileType) + { + Dat = tGame.Dat, + Name = VarFix.CleanFullFileName(name.Trim()), + Size = VarFix.ULong(size.Trim()), + CRC = VarFix.CleanMD5SHA1(crc.Trim(), 8) + }; + + + if (tRom.Size != null) tRom.FileStatusSet(FileStatus.SizeFromDAT); + if (tRom.CRC != null) tRom.FileStatusSet(FileStatus.CRCFromDAT); + + tGame.ChildAdd(tRom); + + return true; + } + + + + private static class DatFileLoader + { + public static String Filename { get; private set; } + private static Stream _fileStream; + private static StreamReader _streamReader; + private static string _line = ""; + public static string Next; + + public static int LoadDat(string strFilename) + { + Filename = strFilename; + _streamReader = null; + int errorCode = IO.FileStream.OpenFileRead(strFilename, out _fileStream); + if (errorCode != 0) + return errorCode; + _streamReader = new StreamReader(_fileStream, Program.Enc); + return 0; + } + public static void Close() + { + _streamReader.Close(); + _fileStream.Close(); + _streamReader.Dispose(); + _fileStream.Dispose(); + } + + public static bool EndOfStream() + { + return _streamReader.EndOfStream; + } + + public static string GnRest() + { + string strret = _line.Replace("\"", ""); + _line = ""; + Next = strret; + return strret; + } + + public static void Gn() + { + string ret; + while ((_line.Trim().Length == 0) && (!_streamReader.EndOfStream)) + { + _line = _streamReader.ReadLine(); + if (String.IsNullOrEmpty(_line)) _line = ""; + _line = _line.Replace("" + (char)9, " "); + _line = _line.Trim() + " "; + } + + if (_line.Trim().Length > 0) + { + int intS; + if (_line.Substring(0, 1) == "\"") + { + intS = (_line + "\"").IndexOf("\"", 1, StringComparison.Ordinal); + ret = _line.Substring(1, intS - 1); + _line = (_line + " ").Substring(intS + 1).Trim(); + } + else + { + intS = (_line + " ").IndexOf(" ", StringComparison.Ordinal); + ret = _line.Substring(0, intS); + _line = (_line + " ").Substring(intS).Trim(); + } + } + else + { + ret = ""; + } + + Next = ret; + } + } + + } +} diff --git a/ROMVault2/DatReaders/DatMessXMLReader.cs b/ROMVault2/DatReaders/DatMessXMLReader.cs new file mode 100644 index 0000000..cb91e03 --- /dev/null +++ b/ROMVault2/DatReaders/DatMessXMLReader.cs @@ -0,0 +1,223 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System.Xml; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2.DatReaders +{ + public static class DatMessXmlReader + { + private static int _indexContinue; + + public static bool ReadDat(ref RvDir tDat, XmlDocument doc) + { + if (!LoadHeaderFromDat(ref tDat, ref doc)) + return false; + + if (doc.DocumentElement == null) + return false; + XmlNodeList gameNodeList = doc.DocumentElement.SelectNodes("software"); + + if (gameNodeList == null) + return false; + for (int i = 0; i < gameNodeList.Count; i++) + { + LoadGameFromDat(ref tDat, gameNodeList[i]); + } + + return true; + } + + private static bool LoadHeaderFromDat(ref RvDir tDir, ref XmlDocument doc) + { + XmlNodeList head = doc.SelectNodes("softwarelist"); + if (head == null) + return false; + + if (head.Count == 0) + return false; + + if (head[0].Attributes == null) + return false; + + RvDat tDat = new RvDat(); + tDat.AddData(RvDat.DatData.DatName, VarFix.CleanFileName(head[0].Attributes.GetNamedItem("name"))); + tDat.AddData(RvDat.DatData.Description, VarFix.String(head[0].Attributes.GetNamedItem("description"))); + + string val = VarFix.String(head[0].Attributes.GetNamedItem("forcemerging")).ToLower(); + switch (val.ToLower()) + { + case "split": + tDat.AddData(RvDat.DatData.MergeType, "split"); + break; + case "full": + tDat.AddData(RvDat.DatData.MergeType, "full"); + break; + default: + tDat.AddData(RvDat.DatData.MergeType, "split"); + break; + } + + + + tDir.Dat = tDat; + return true; + } + + private static void LoadGameFromDat(ref RvDir tDat, XmlNode gameNode) + { + if (gameNode.Attributes == null) + return; + + RvDir parent = tDat; + + RvDir tDir = new RvDir(FileType.Zip) + { + Name = VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("name")), + Game = new RvGame(), + Dat = tDat.Dat, + DatStatus = DatStatus.InDatCollect + }; + + + tDir.Game.AddData(RvGame.GameData.Description, VarFix.String(gameNode.SelectSingleNode("description"))); + + tDir.Game.AddData(RvGame.GameData.RomOf, VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("cloneof"))); + tDir.Game.AddData(RvGame.GameData.CloneOf, VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("cloneof"))); + tDir.Game.AddData(RvGame.GameData.Year, VarFix.CleanFileName(gameNode.SelectSingleNode("year"))); + tDir.Game.AddData(RvGame.GameData.Manufacturer, VarFix.CleanFileName(gameNode.SelectSingleNode("publisher"))); + + + + RvDir tDirCHD = new RvDir(FileType.Dir) + { + Name = VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("name")), + Game = new RvGame(), + Dat = tDat.Dat, + DatStatus = DatStatus.InDatCollect + + }; + + tDirCHD.Game.AddData(RvGame.GameData.Description, VarFix.String(gameNode.SelectSingleNode("description"))); + + tDirCHD.Game.AddData(RvGame.GameData.RomOf, VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("cloneof"))); + tDirCHD.Game.AddData(RvGame.GameData.CloneOf, VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("cloneof"))); + tDirCHD.Game.AddData(RvGame.GameData.Year, VarFix.CleanFileName(gameNode.SelectSingleNode("year"))); + tDirCHD.Game.AddData(RvGame.GameData.Manufacturer, VarFix.CleanFileName(gameNode.SelectSingleNode("publisher"))); + + + + int index1; + string testName = tDir.Name; + int nameCount = 0; + while (parent.ChildNameSearch(tDir, out index1) == 0) + { + tDir.Name = testName + "_" + nameCount; + nameCount++; + } + tDirCHD.Name = tDir.Name; + + + XmlNodeList partNodeList = gameNode.SelectNodes("part"); + if (partNodeList == null) return; + + for (int iP = 0; iP < partNodeList.Count; iP++) + { + _indexContinue = -1; + XmlNodeList dataAreaNodeList = partNodeList[iP].SelectNodes("dataarea"); + if (dataAreaNodeList != null) + for (int iD = 0; iD < dataAreaNodeList.Count; iD++) + { + XmlNodeList romNodeList = dataAreaNodeList[iD].SelectNodes("rom"); + if (romNodeList != null) + for (int iR = 0; iR < romNodeList.Count; iR++) + { + LoadRomFromDat(ref tDir, romNodeList[iR]); + } + } + } + for (int iP = 0; iP < partNodeList.Count; iP++) + { + XmlNodeList diskAreaNodeList = partNodeList[iP].SelectNodes("diskarea"); + if (diskAreaNodeList != null) + for (int iD = 0; iD < diskAreaNodeList.Count; iD++) + { + XmlNodeList romNodeList = diskAreaNodeList[iD].SelectNodes("disk"); + if (romNodeList != null) + for (int iR = 0; iR < romNodeList.Count; iR++) + { + LoadDiskFromDat(ref tDirCHD, romNodeList[iR]); + } + } + } + + if (tDir.ChildCount > 0) + parent.ChildAdd(tDir, index1); + if (tDirCHD.ChildCount > 0) + parent.ChildAdd(tDirCHD, index1); + + + } + + private static void LoadRomFromDat(ref RvDir tGame, XmlNode romNode) + { + if (romNode.Attributes == null) + return; + + XmlNode name = romNode.Attributes.GetNamedItem("name"); + string loadflag = VarFix.String(romNode.Attributes.GetNamedItem("loadflag")); + if (name != null) + { + RvFile tRom = new RvFile(FileType.ZipFile) + { + Name = VarFix.CleanFullFileName(name), + Size = VarFix.ULong(romNode.Attributes.GetNamedItem("size")), + CRC = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("crc"), 8), + SHA1 = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("sha1"), 40), + Status = VarFix.ToLower(romNode.Attributes.GetNamedItem("status")), + + Dat = tGame.Dat + }; + + if (tRom.Size != null) tRom.FileStatusSet(FileStatus.SizeFromDAT); + if (tRom.CRC != null) tRom.FileStatusSet(FileStatus.CRCFromDAT); + if (tRom.SHA1 != null) tRom.FileStatusSet(FileStatus.SHA1FromDAT); + + _indexContinue = tGame.ChildAdd(tRom); + } + else if (loadflag.ToLower() == "continue") + { + RvFile tZippedFile = (RvFile)tGame.Child(_indexContinue); + tZippedFile.Size += VarFix.ULong(romNode.Attributes.GetNamedItem("size")); + } + + } + + private static void LoadDiskFromDat(ref RvDir tGame, XmlNode romNode) + { + if (romNode.Attributes == null) + return; + + XmlNode name = romNode.Attributes.GetNamedItem("name"); + RvFile tRom = new RvFile(FileType.File) + { + Name = VarFix.CleanFullFileName(name) + ".chd", + SHA1CHD = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("sha1"), 40), + Status = VarFix.ToLower(romNode.Attributes.GetNamedItem("status")), + + Dat = tGame.Dat + }; + + if (tRom.SHA1CHD != null) tRom.FileStatusSet(FileStatus.SHA1CHDFromDAT); + + tGame.ChildAdd(tRom); + } + + + } +} diff --git a/ROMVault2/DatReaders/DatReader.cs b/ROMVault2/DatReaders/DatReader.cs new file mode 100644 index 0000000..c4c2ae0 --- /dev/null +++ b/ROMVault2/DatReaders/DatReader.cs @@ -0,0 +1,601 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Xml; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2.DatReaders +{ + public static class DatReader + { + private static BackgroundWorker _bgw; + + public static RvDir ReadInDatFile(RvDat datFile, BackgroundWorker bgw) + { + _bgw = bgw; + + RvDir newDir = new RvDir(FileType.Dir); + + string datFullName = datFile.GetData(RvDat.DatData.DatFullName); + + System.IO.Stream fs; + int errorCode = IO.FileStream.OpenFileRead(datFullName, out fs); + if (errorCode != 0) + { + _bgw.ReportProgress(0, new bgwShowError(datFullName, errorCode + ": " + new Win32Exception(errorCode).Message)); + return null; + } + + System.IO.StreamReader myfile = new System.IO.StreamReader(fs, Program.Enc); + string strLine = myfile.ReadLine(); + myfile.Close(); + fs.Close(); + fs.Dispose(); + + if (strLine == null) + return null; + + if (strLine.ToLower().IndexOf("xml", StringComparison.Ordinal) >= 0) + { + if (!ReadXMLDat(ref newDir, datFullName)) + return null; + } + + else if (strLine.ToLower().IndexOf("clrmamepro", StringComparison.Ordinal) >= 0 || strLine.ToLower().IndexOf("romvault", StringComparison.Ordinal) >= 0 || strLine.ToLower().IndexOf("game", StringComparison.Ordinal) >= 0) + { + if (!DatCmpReader.ReadDat(ref newDir, datFullName)) + return null; + } + else if (strLine.ToLower().IndexOf("doscenter", StringComparison.Ordinal) >= 0) + { + if (!DatDOSReader.ReadDat(ref newDir, datFullName)) + return null; + } + else + { + _bgw.ReportProgress(0, new bgwShowError(datFullName, "Invalid DAT File")); + return null; + } + + if (newDir.Dat == null) + { + _bgw.ReportProgress(0, new bgwShowError(datFullName, "Invalid Header")); + return null; + } + + newDir.Dat.AddData(RvDat.DatData.DatFullName, datFullName); + newDir.Dat.TimeStamp = datFile.TimeStamp; + newDir.Dat.Status = DatUpdateStatus.Correct; + + DatSetRemoveUnneededDirs(newDir); + DatSetCheckParentSets(newDir); + DatSetRenameAndRemoveDups(newDir); + + if (newDir.Dat.GetData(RvDat.DatData.MergeType).ToLower() == "full") + DatSetMergeSets(newDir); + + DatSetCheckCollect(newDir); + + DatSetCreateSubDirs(newDir); + + if (newDir.Dat.GetData(RvDat.DatData.DirSetup).ToLower() == "nogame") + { + DatSetRemoveGameDir(newDir); + } + + return newDir; + } + + + + + private static bool ReadXMLDat(ref RvDir tDat, string strFilename) + { + System.IO.Stream fs; + int errorCode = IO.FileStream.OpenFileRead(strFilename, out fs); + if (errorCode != 0) + { + _bgw.ReportProgress(0, new bgwShowError(strFilename, errorCode + ": " + new Win32Exception(errorCode).Message)); + return false; + } + + XmlDocument doc = new XmlDocument { XmlResolver = null }; + try + { + doc.Load(fs); + } + catch (Exception e) + { + fs.Close(); + fs.Dispose(); + string message = string.Format("Error Occured Reading Dat: {0}\r\nSource: {1}\r\nMessage: {2}\r\n", strFilename, e.Source, e.Message); + if (e.InnerException != null) + message += string.Format("\r\nINNER EXCEPTION:\r\nSource: {0}\r\nMessage: {1}\r\n", e.InnerException.Source, e.InnerException.Message); + ReportError.SendErrorMessageDat(message, strFilename); + _bgw.ReportProgress(0, new bgwShowError(strFilename, string.Format("Error Occured Reading Dat:\r\n{0}\r\n", e.Message))); + return false; + } + fs.Close(); + fs.Dispose(); + + if (doc.DocumentElement == null) + return false; + + XmlNode mame = doc.SelectSingleNode("mame"); + if (mame != null) + return DatXmlReader.ReadMameDat(ref tDat, doc); + + if (doc.DocumentElement != null) + { + XmlNode head = doc.DocumentElement.SelectSingleNode("header"); + if (head != null) + return DatXmlReader.ReadDat(ref tDat, doc); + } + + XmlNodeList headList = doc.SelectNodes("softwarelist"); + if (headList != null) + return DatMessXmlReader.ReadDat(ref tDat, doc); + + return false; + } + + private static void DatSetRenameAndRemoveDups(RvDir tDat) + { + for (int g = 0; g < tDat.ChildCount; g++) + { + RvDir tDir = (RvDir)tDat.Child(g); + if (tDir.Game == null) + { + DatSetRenameAndRemoveDups(tDir); + } + else + { + for (int r = 0; r < tDir.ChildCount - 1; r++) + { + RvFile f0 = (RvFile)tDir.Child(r); + RvFile f1 = (RvFile)tDir.Child(r + 1); + + if (f0.Name != f1.Name) + continue; + + if (f0.Size != f1.Size || !ArrByte.bCompare(f0.CRC, f1.CRC)) + { + tDir.ChildRemove(r + 1); // remove F1 + f1.Name = f1.Name + "_" + ArrByte.ToString(f1.CRC); // rename F1; + int pos = tDir.ChildAdd(f1); + if (pos < r) + r = pos; + // if this rename moved the File back up the list, start checking again from that file. + } + else + { + tDir.ChildRemove(r + 1); + } + r--; + } + } + } + } + private static void DatSetRemoveUnneededDirs(RvDir tDat) + { + for (int g = 0; g < tDat.ChildCount; g++) + { + RvDir tGame = (RvDir)tDat.Child(g); + if (tGame.Game == null) + { + DatSetRemoveUnneededDirs(tGame); + } + else + { + for (int r = 0; r < tGame.ChildCount - 1; r++) + { + // first find any directories, zero length with filename ending in a '/' + // there are RvFiles that are really directories (probably inside a zip file) + RvFile f0 = (RvFile)tGame.Child(r); + if (f0.Name.Length == 0) + continue; + if (f0.Name.Substring(f0.Name.Length - 1, 1) != "/") + continue; + + // if the next file contains that found directory, then the directory file can be deleted + RvFile f1 = (RvFile)tGame.Child(r + 1); + if (f1.Name.Length <= f0.Name.Length) + continue; + + if (f0.Name != f1.Name.Substring(0, f0.Name.Length)) + continue; + + tGame.ChildRemove(r); + r--; + } + } + } + } + + + private static void DatSetCheckParentSets(RvDir tDat) + { + // First we are going to try and fix any missing CRC information by checking for roms with the same names + // in Parent and Child sets, and if the same named rom is found and one has a CRC and the other does not + // then we will set the missing CRC by using the CRC in the other set. + + // we keep trying to find fixes until no more fixes are found. + // this is need as the first time round a fix could be found in a parent set from one child set. + // then the second time around that fixed parent set could fix another of its childs sets. + + for (int g = 0; g < tDat.ChildCount; g++) + { + RvDir mGame = (RvDir)tDat.Child(g); + if (mGame.Game == null) + // this is a directory so recuse into it + DatSetCheckParentSets(mGame); + } + + bool fix = true; + while (fix) + { + fix = false; + + // loop around every ROM Set looking for fixes. + for (int g = 0; g < tDat.ChildCount; g++) + { + + // get a list of that ROM Sets parents. + RvDir mGame = (RvDir)tDat.Child(g); + + if (mGame.Game == null) + continue; + + List lstParentGames = new List(); + FindParentSet(mGame, tDat, ref lstParentGames); + + // if this set have parents + if (lstParentGames.Count == 0) + continue; + + // now loop every ROM in the current set. + for (int r = 0; r < mGame.ChildCount; r++) + { + // and loop every ROM of every parent set of this current set. + // and see if anything can be fixed. + bool found = false; + + // loop the parent sets + foreach (RvDir romofGame in lstParentGames) + { + // loop the ROMs in the parent sets + for (int r1 = 0; r1 < romofGame.ChildCount; r1++) + { + // only find fixes if the Name and the Size of the ROMs are the same + if (mGame.Child(r).Name != romofGame.Child(r1).Name || ((RvFile)mGame.Child(r)).Size != ((RvFile)romofGame.Child(r1)).Size) + continue; + + // now check if one of the matching roms has missing or incorrect CRC information + bool b1 = ((RvFile)mGame.Child(r)).CRC == null; + bool b2 = ((RvFile)romofGame.Child(r1)).CRC == null; + + // if one has correct information and the other does not, fix the missing one + if (b1 == b2) + continue; + + if (b1) + { + ((RvFile)mGame.Child(r)).CRC = ((RvFile)romofGame.Child(r1)).CRC; + ((RvFile)mGame.Child(r)).Status = "(CRCFound)"; + } + else + { + ((RvFile)romofGame.Child(r1)).CRC = ((RvFile)mGame.Child(r)).CRC; + ((RvFile)romofGame.Child(r1)).Status = "(CRCFound)"; + } + + // flag that a fix was found so that we will go all the way around again. + fix = true; + found = true; + break; + } + if (found) break; + } + } + } + } + } + + private static void DatSetMergeSets(RvDir tDat) + { + for (int g = tDat.ChildCount - 1; g >= 0; g--) + { + RvDir mGame = (RvDir)tDat.Child(g); + + if (mGame.Game == null) + { + DatSetMergeSets(mGame); + continue; + } + + List lstParentGames = new List(); + FindParentSet(mGame, tDat, ref lstParentGames); + while (lstParentGames.Count > 0 && lstParentGames[lstParentGames.Count - 1].Game.GetData(RvGame.GameData.IsBios).ToLower() == "yes") + lstParentGames.RemoveAt(lstParentGames.Count - 1); + + if (lstParentGames.Count <= 0) continue; + + RvDir romofGame = lstParentGames[lstParentGames.Count - 1]; + + bool founderror = false; + for (int r = 0; r < mGame.ChildCount; r++) + { + string name = mGame.Child(r).Name; + string mergename = ((RvFile)mGame.Child(r)).Merge; + + for (int r1 = 0; r1 < romofGame.ChildCount; r1++) + { + if ((name == romofGame.Child(r1).Name || mergename == romofGame.Child(r1).Name) && + (ArrByte.iCompare(((RvFile)mGame.Child(r)).CRC, ((RvFile)romofGame.Child(r1)).CRC) != 0 || + ((RvFile)mGame.Child(r)).Size != ((RvFile)romofGame.Child(r1)).Size)) + founderror = true; + + } + } + if (founderror) + { + mGame.Game.DeleteData(RvGame.GameData.RomOf); + continue; + } + + for (int r = 0; r < mGame.ChildCount; r++) + { + string name = mGame.Child(r).Name; + string mergename = ((RvFile)mGame.Child(r)).Merge; + + bool found = false; + for (int r1 = 0; r1 < romofGame.ChildCount; r1++) + { + if ((name == romofGame.Child(r1).Name || mergename == romofGame.Child(r1).Name) && + (ArrByte.iCompare(((RvFile)mGame.Child(r)).CRC, ((RvFile)romofGame.Child(r1)).CRC) == 0 && + ((RvFile)mGame.Child(r)).Size == ((RvFile)romofGame.Child(r1)).Size)) + { + found = true; + break; + } + } + if (!found) + romofGame.ChildAdd(mGame.Child(r)); + } + tDat.ChildRemove(g); + } + } + + + + private static void DatSetCheckCollect(RvDir tDat) + { + // now look for merged roms. + // check if a rom exists in a parent set where the Name,Size and CRC all match. + + for (int g = 0; g < tDat.ChildCount; g++) + { + RvDir mGame = (RvDir)tDat.Child(g); + + if (mGame.Game == null) + DatSetCheckCollect(mGame); + else + { + List lstParentGames = new List(); + FindParentSet(mGame, tDat, ref lstParentGames); + + if (lstParentGames.Count == 0) + { + for (int r = 0; r < mGame.ChildCount; r++) + RomCheckCollect((RvFile)mGame.Child(r), false); + } + else + { + for (int r = 0; r < mGame.ChildCount; r++) + { + bool found = false; + foreach (RvDir romofGame in lstParentGames) + { + for (int r1 = 0; r1 < romofGame.ChildCount; r1++) + { + if (mGame.Child(r).Name != romofGame.Child(r1).Name) continue; + + ulong? Size0 = ((RvFile)mGame.Child(r)).Size; + ulong? Size1 = ((RvFile)romofGame.Child(r1)).Size; + if (Size0 != null && Size1 != null && Size0 != Size1) continue; + + byte[] CRC0 = ((RvFile)mGame.Child(r)).CRC; + byte[] CRC1 = ((RvFile)romofGame.Child(r1)).CRC; + if (CRC0 != null && CRC1 != null && !ArrByte.bCompare(CRC0, CRC1)) continue; + + byte[] SHA0 = ((RvFile)mGame.Child(r)).SHA1; + byte[] SHA1 = ((RvFile)romofGame.Child(r1)).SHA1; + if (SHA0 != null && SHA1 != null && !ArrByte.bCompare(SHA0, SHA1)) continue; + + byte[] MD50 = ((RvFile)mGame.Child(r)).MD5; + byte[] MD51 = ((RvFile)romofGame.Child(r1)).MD5; + if (MD50 != null && MD51 != null && !ArrByte.bCompare(MD50, MD51)) continue; + + byte[] chdSHA0 = ((RvFile)mGame.Child(r)).SHA1CHD; + byte[] chdSHA1 = ((RvFile)romofGame.Child(r1)).SHA1CHD; + if (chdSHA0 != null && chdSHA1 != null && !ArrByte.bCompare(chdSHA0, chdSHA1)) continue; + + byte[] chdMD50 = ((RvFile)mGame.Child(r)).MD5CHD; + byte[] chdMD51 = ((RvFile)romofGame.Child(r1)).MD5CHD; + if (chdMD50 != null && chdMD51 != null && !ArrByte.bCompare(chdMD50, chdMD51)) continue; + + + found = true; + break; + } + if (found) break; + } + RomCheckCollect((RvFile)mGame.Child(r), found); + } + } + } + } + } + private static void FindParentSet(RvDir searchGame, RvDir parentDir, ref List lstParentGames) + { + if (searchGame.Game == null) + return; + + string parentName = searchGame.Game.GetData(RvGame.GameData.RomOf); + if (String.IsNullOrEmpty(parentName) || parentName==searchGame.Name) + parentName = searchGame.Game.GetData(RvGame.GameData.CloneOf); + if (String.IsNullOrEmpty(parentName) || parentName==searchGame.Name) + return; + + int intIndex; + int intResult = parentDir.ChildNameSearch(new RvDir(searchGame.FileType) { Name = parentName }, out intIndex); + if (intResult == 0) + { + RvDir parentGame = (RvDir)parentDir.Child(intIndex); + lstParentGames.Add(parentGame); + FindParentSet(parentGame, parentDir, ref lstParentGames); + } + } + + + /* + * In the mame Dat: + * status="nodump" has a size but no CRC + * status="baddump" has a size and crc + */ + + + private static void RomCheckCollect(RvFile tRom, bool merge) + { + if (merge) + { + if (string.IsNullOrEmpty(tRom.Merge)) + tRom.Merge = "(Auto Merged)"; + + tRom.DatStatus = DatStatus.InDatMerged; + return; + } + + if (!string.IsNullOrEmpty(tRom.Merge)) + tRom.Merge = "(No-Merge) " + tRom.Merge; + + if (tRom.Status == "nodump") + { + tRom.CRC = null; + tRom.DatStatus = DatStatus.InDatBad; + return; + } + + if (ArrByte.bCompare(tRom.CRC, new byte[] { 0, 0, 0, 0 }) && tRom.Size == 0) + { + tRom.DatStatus = DatStatus.InDatCollect; + return; + } + + /* + if (ArrByte.bCompare(tRom.CRC, new byte[] { 0, 0, 0, 0 }) || (tRom.CRC.Length != 8)) + { + tRom.CRC = null; + tRom.DatStatus = DatStatus.InDatBad; + return; + } + */ + + tRom.DatStatus = DatStatus.InDatCollect; + } + + private static void DatSetCreateSubDirs(RvDir tDat) + { + for (int g = 0; g < tDat.ChildCount; g++) + { + if (tDat.Child(g).FileType == FileType.Zip) + continue; + + RvDir datGame = (RvDir)tDat.Child(g); + + // first do a quick check to see if anything needs done. + bool fixNeeded = false; + for (int r = 0; r < datGame.ChildCount; r++) + { + fixNeeded = datGame.Child(r).Name.Contains("/"); + + if (fixNeeded) + break; + } + // if nothing needs done skip to next game + if (!fixNeeded) + continue; + + + RvDir fixedGame = new RvDir(FileType.Dir); + while (datGame.ChildCount > 0) + { + RvBase nextChild = datGame.Child(0); + datGame.ChildRemove(0); + if (nextChild.GetType() == typeof(RvFile)) + { + RvFile tFile = (RvFile)nextChild; + if (tFile.Name.Contains("/")) + { + RvDir tBase = fixedGame; + Debug.WriteLine("tFile " + tFile.TreeFullName); + while (tFile.Name.Contains("/")) + { + int dirIndex = tFile.Name.IndexOf("/", StringComparison.Ordinal); + string dirName = tFile.Name.Substring(0, dirIndex); + RvDir tDir = new RvDir(FileType.Dir) + { + Name = dirName, + DatStatus = DatStatus.InDatCollect, + Dat = datGame.Dat + }; + int index; + if (tBase.ChildNameSearch(tDir, out index) != 0) + tBase.ChildAdd(tDir, index); + tBase = (RvDir)tBase.Child(index); + tFile.Name = tFile.Name.Substring(tFile.Name.IndexOf("/", StringComparison.Ordinal) + 1); + } + tBase.ChildAdd(tFile); + } + else + fixedGame.ChildAdd(nextChild); + } + else + fixedGame.ChildAdd(nextChild); + + + } + + for (int r = 0; r < fixedGame.ChildCount; r++) + datGame.ChildAdd(fixedGame.Child(r), r); + } + } + + + private static void DatSetRemoveGameDir(RvDir newDir) + { + if (newDir.ChildCount != 1) + return; + + RvDir child = newDir.Child(0) as RvDir; + if (child.FileType != FileType.Dir) + return; + + if (child.Game == null) + return; + + newDir.ChildRemove(0); + newDir.Game = child.Game; + for (int i = 0; i < child.ChildCount; i++) + newDir.ChildAdd(child.Child(i), i); + } + } +} diff --git a/ROMVault2/DatReaders/DatXMLReader.cs b/ROMVault2/DatReaders/DatXMLReader.cs new file mode 100644 index 0000000..d421215 --- /dev/null +++ b/ROMVault2/DatReaders/DatXMLReader.cs @@ -0,0 +1,410 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Xml; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2.DatReaders +{ + public static class DatXmlReader + { + private static bool _cleanFileNames = true; + + public static bool ReadDat(ref RvDir tDat, XmlDocument doc) + { + FileType thisFileType = FileType.Unknown; + + if (!LoadHeaderFromDat(ref tDat, ref doc, ref thisFileType)) + return false; + + if (doc.DocumentElement == null) + return false; + + XmlNodeList dirNodeList = doc.DocumentElement.SelectNodes("dir"); + if (dirNodeList != null) + { + for (int i = 0; i < dirNodeList.Count; i++) + { + LoadDirFromDat(ref tDat, dirNodeList[i], thisFileType); + } + } + + XmlNodeList gameNodeList = doc.DocumentElement.SelectNodes("game"); + + if (gameNodeList != null) + { + for (int i = 0; i < gameNodeList.Count; i++) + { + LoadGameFromDat(ref tDat, gameNodeList[i], thisFileType); + } + } + + return true; + } + + public static bool ReadMameDat(ref RvDir tDat, XmlDocument doc) + { + FileType thisFileType = FileType.Unknown; + + if (!LoadMameHeaderFromDat(ref tDat, ref doc, ref thisFileType)) + return false; + + if (doc.DocumentElement == null) + return false; + + XmlNodeList dirNodeList = doc.DocumentElement.SelectNodes("dir"); + if (dirNodeList != null) + { + for (int i = 0; i < dirNodeList.Count; i++) + { + LoadDirFromDat(ref tDat, dirNodeList[i], thisFileType); + } + } + + XmlNodeList gameNodeList = doc.DocumentElement.SelectNodes("game"); + + if (gameNodeList != null) + { + for (int i = 0; i < gameNodeList.Count; i++) + { + LoadGameFromDat(ref tDat, gameNodeList[i], thisFileType); + } + } + + return true; + } + + + + private static bool LoadHeaderFromDat(ref RvDir tDir, ref XmlDocument doc, ref FileType thisFileType) + { + if (doc.DocumentElement == null) + return false; + XmlNode head = doc.DocumentElement.SelectSingleNode("header"); + + if (head == null) + return false; + RvDat tDat = new RvDat(); + tDat.AddData(RvDat.DatData.DatName, VarFix.CleanFileName(head.SelectSingleNode("name"))); + tDat.AddData(RvDat.DatData.RootDir, VarFix.CleanFileName(head.SelectSingleNode("rootdir"))); + tDat.AddData(RvDat.DatData.Description, VarFix.String(head.SelectSingleNode("description"))); + tDat.AddData(RvDat.DatData.Category, VarFix.String(head.SelectSingleNode("category"))); + tDat.AddData(RvDat.DatData.Version, VarFix.String(head.SelectSingleNode("version"))); + tDat.AddData(RvDat.DatData.Date, VarFix.String(head.SelectSingleNode("date"))); + tDat.AddData(RvDat.DatData.Author, VarFix.String(head.SelectSingleNode("author"))); + tDat.AddData(RvDat.DatData.Email, VarFix.String(head.SelectSingleNode("email"))); + tDat.AddData(RvDat.DatData.HomePage, VarFix.String(head.SelectSingleNode("homepage"))); + tDat.AddData(RvDat.DatData.URL, VarFix.String(head.SelectSingleNode("url"))); + + + string superDAT = VarFix.String(head.SelectSingleNode("type")); + _cleanFileNames = superDAT.ToLower() != "superdat" && superDAT.ToLower() != "gigadat"; + if (!_cleanFileNames) tDat.AddData(RvDat.DatData.SuperDat, "superdat"); + + thisFileType = FileType.ZipFile; + + // Look for: + XmlNode packingNode = head.SelectSingleNode("romvault"); + if (packingNode == null) + // Look for: + packingNode = head.SelectSingleNode("clrmamepro"); + if (packingNode != null) + { + if (packingNode.Attributes != null) + { + string val = VarFix.String(packingNode.Attributes.GetNamedItem("forcepacking")).ToLower(); + switch (val.ToLower()) + { + case "zip": + tDat.AddData(RvDat.DatData.FileType, "zip"); + thisFileType = FileType.ZipFile; + break; + case "unzip": + case "file": + tDat.AddData(RvDat.DatData.FileType, "file"); + thisFileType = FileType.File; + break; + default: + thisFileType = FileType.ZipFile; + break; + } + + val = VarFix.String(packingNode.Attributes.GetNamedItem("forcemerging")).ToLower(); + switch (val.ToLower()) + { + case "split": + tDat.AddData(RvDat.DatData.MergeType, "split"); + break; + case "full": + tDat.AddData(RvDat.DatData.MergeType, "full"); + break; + default: + tDat.AddData(RvDat.DatData.MergeType, "split"); + break; + } + val = VarFix.String(packingNode.Attributes.GetNamedItem("dir")).ToLower(); // noautodir , nogame + if (!String.IsNullOrEmpty(val)) + tDat.AddData(RvDat.DatData.DirSetup,val); + } + } + + // Look for: true + string notzipped = VarFix.String(head.SelectSingleNode("notzipped")); + if (notzipped.ToLower() == "true" || notzipped.ToLower() == "yes") thisFileType = FileType.File; + + tDir.Dat = tDat; + return true; + } + + private static bool LoadMameHeaderFromDat(ref RvDir tDir, ref XmlDocument doc, ref FileType thisFileType) + { + if (doc.DocumentElement == null) + return false; + XmlNode head = doc.SelectSingleNode("mame"); + + if (head == null || head.Attributes == null) + return false; + RvDat tDat = new RvDat(); + tDat.AddData(RvDat.DatData.DatName, VarFix.CleanFileName(head.Attributes.GetNamedItem("build"))); + tDat.AddData(RvDat.DatData.Description, VarFix.String(head.Attributes.GetNamedItem("build"))); + + thisFileType = FileType.ZipFile; + tDir.Dat = tDat; + return true; + } + + + private static void LoadDirFromDat(ref RvDir tDat, XmlNode dirNode, FileType thisFileType) + { + if (dirNode.Attributes == null) + return; + + RvDir parent = tDat; + + string fullname = VarFix.CleanFullFileName(dirNode.Attributes.GetNamedItem("name")); + while (fullname.Contains("/")) + { + int firstSlash = fullname.IndexOf("/", StringComparison.Ordinal); + string dir = fullname.Substring(0, firstSlash); + dir = VarFix.CleanFileName(dir); + + fullname = fullname.Substring(firstSlash + 1); + int index; + if (parent.ChildNameSearch(new RvDir(FileType.Dir) { Name = dir }, out index) == 0) + { + parent = (RvDir)parent.Child(index); + } + else + { + RvDir tpDir = new RvDir(FileType.Dir) + { + Name = dir, + DatStatus = DatStatus.InDatCollect, + Dat = tDat.Dat, + Tree = new RvTreeRow() + }; + parent.ChildAdd(tpDir, index); + parent = tpDir; + } + } + + RvDir tDir = new RvDir(FileType.Dir) + { + Name = fullname, + DatStatus = DatStatus.InDatCollect, + Dat = tDat.Dat, + Tree = new RvTreeRow() + }; + + int index1; + if (parent.ChildNameSearch(tDir, out index1) == 0) + tDir = (RvDir)parent.Child(index1); + else + tDat.ChildAdd(tDir, index1); + + XmlNodeList dirNodeList = dirNode.SelectNodes("dir"); + if (dirNodeList != null) + { + for (int i = 0; i < dirNodeList.Count; i++) + { + LoadDirFromDat(ref tDir, dirNodeList[i], thisFileType); + } + } + + XmlNodeList gameNodeList = dirNode.SelectNodes("game"); + if (gameNodeList != null) + { + for (int i = 0; i < gameNodeList.Count; i++) + { + LoadGameFromDat(ref tDir, gameNodeList[i], thisFileType); + } + } + } + + private static void LoadGameFromDat(ref RvDir tDat, XmlNode gameNode, FileType thisFileType) + { + if (gameNode.Attributes == null) + return; + + RvDir parent = tDat; + RvDir tDir; + int index1 = 0; + + string fullname = VarFix.CleanFullFileName(gameNode.Attributes.GetNamedItem("name")); + if (_cleanFileNames) + fullname = fullname.Replace("/", "-"); + else + { + while (fullname.Contains("/")) + { + int firstSlash = fullname.IndexOf("/", StringComparison.Ordinal); + string dir = fullname.Substring(0, firstSlash); + dir = VarFix.CleanFileName(dir); + + fullname = fullname.Substring(firstSlash + 1); + int index; + if (parent.ChildNameSearch(new RvDir(FileType.Dir) { Name = dir }, out index) == 0) + { + parent = (RvDir)parent.Child(index); + } + else + { + RvDir tpDir = new RvDir(FileType.Dir) + { + Name = dir, + DatStatus = DatStatus.InDatCollect, + Dat = tDat.Dat, + Tree = new RvTreeRow() + }; + parent.ChildAdd(tpDir, index); + parent = tpDir; + } + } + } + + tDir = new RvDir(DBTypeGet.DirFromFile(thisFileType)) + { + Name = fullname, + DatStatus = DatStatus.InDatCollect, + Dat = tDat.Dat + }; + + string testName = tDir.Name; + int nameCount = 0; + while (parent.ChildNameSearch(tDir, out index1) == 0) + { + tDir.Name = testName + "_" + nameCount; + nameCount++; + } + + tDir.Game = new RvGame(); + tDir.Game.AddData(RvGame.GameData.RomOf, VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("romof"))); + tDir.Game.AddData(RvGame.GameData.Description, VarFix.String(gameNode.SelectSingleNode("description"))); + + tDir.Game.AddData(RvGame.GameData.Sourcefile, VarFix.String(gameNode.Attributes.GetNamedItem("sourcefile"))); + tDir.Game.AddData(RvGame.GameData.IsBios, VarFix.String(gameNode.Attributes.GetNamedItem("isbios"))); + tDir.Game.AddData(RvGame.GameData.CloneOf, VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("cloneof"))); + tDir.Game.AddData(RvGame.GameData.SampleOf, VarFix.CleanFileName(gameNode.Attributes.GetNamedItem("sampleof"))); + tDir.Game.AddData(RvGame.GameData.Board, VarFix.String(gameNode.Attributes.GetNamedItem("board"))); + tDir.Game.AddData(RvGame.GameData.Year, VarFix.String(gameNode.SelectSingleNode("year"))); + tDir.Game.AddData(RvGame.GameData.Manufacturer, VarFix.String(gameNode.SelectSingleNode("manufacturer"))); + + XmlNode trurip = gameNode.SelectSingleNode("trurip"); + if (trurip != null) + { + tDir.Game.AddData(RvGame.GameData.Trurip, "yes"); + tDir.Game.AddData(RvGame.GameData.Year, VarFix.String(trurip.SelectSingleNode("year"))); + tDir.Game.AddData(RvGame.GameData.Publisher, VarFix.String(trurip.SelectSingleNode("publisher"))); + tDir.Game.AddData(RvGame.GameData.Developer, VarFix.String(trurip.SelectSingleNode("developer"))); + tDir.Game.AddData(RvGame.GameData.Edition, VarFix.String(trurip.SelectSingleNode("edition"))); + tDir.Game.AddData(RvGame.GameData.Version, VarFix.String(trurip.SelectSingleNode("version"))); + tDir.Game.AddData(RvGame.GameData.Type, VarFix.String(trurip.SelectSingleNode("type"))); + tDir.Game.AddData(RvGame.GameData.Media, VarFix.String(trurip.SelectSingleNode("media"))); + tDir.Game.AddData(RvGame.GameData.Language, VarFix.String(trurip.SelectSingleNode("language"))); + tDir.Game.AddData(RvGame.GameData.Players, VarFix.String(trurip.SelectSingleNode("players"))); + tDir.Game.AddData(RvGame.GameData.Ratings, VarFix.String(trurip.SelectSingleNode("ratings"))); + tDir.Game.AddData(RvGame.GameData.Peripheral, VarFix.String(trurip.SelectSingleNode("peripheral"))); + tDir.Game.AddData(RvGame.GameData.Genre, VarFix.String(trurip.SelectSingleNode("genre"))); + tDir.Game.AddData(RvGame.GameData.MediaCatalogNumber, VarFix.String(trurip.SelectSingleNode("mediacatalognumber"))); + tDir.Game.AddData(RvGame.GameData.BarCode, VarFix.String(trurip.SelectSingleNode("barcode"))); + } + + RvDir tDirCHD = new RvDir(FileType.Dir) + { + Name = tDir.Name, + DatStatus = tDir.DatStatus, + Dat = tDir.Dat, + Game = tDir.Game + }; + + XmlNodeList romNodeList = gameNode.SelectNodes("rom"); + if (romNodeList != null) + for (int i = 0; i < romNodeList.Count; i++) + LoadRomFromDat(ref tDir, romNodeList[i], thisFileType); + + XmlNodeList diskNodeList = gameNode.SelectNodes("disk"); + if (diskNodeList != null) + for (int i = 0; i < diskNodeList.Count; i++) + LoadDiskFromDat(ref tDirCHD, diskNodeList[i]); + + if (tDir.ChildCount > 0) + parent.ChildAdd(tDir, index1); + if (tDirCHD.ChildCount > 0) + parent.ChildAdd(tDirCHD); + } + + private static void LoadRomFromDat(ref RvDir tGame, XmlNode romNode, FileType thisFileType) + { + if (romNode.Attributes == null) + return; + + + RvFile tRom = new RvFile(thisFileType) + { + Dat = tGame.Dat, + Size = VarFix.ULong(romNode.Attributes.GetNamedItem("size")), + Name = VarFix.CleanFullFileName(romNode.Attributes.GetNamedItem("name")), + CRC = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("crc"), 8), + SHA1 = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("sha1"), 40), + MD5 = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("md5"), 32), + Merge = VarFix.CleanFullFileName(romNode.Attributes.GetNamedItem("merge")), + Status = VarFix.ToLower(romNode.Attributes.GetNamedItem("status")) + }; + + if (tRom.Size != null) tRom.FileStatusSet(FileStatus.SizeFromDAT); + if (tRom.CRC != null) tRom.FileStatusSet(FileStatus.CRCFromDAT); + if (tRom.SHA1 != null) tRom.FileStatusSet(FileStatus.SHA1FromDAT); + if (tRom.MD5 != null) tRom.FileStatusSet(FileStatus.MD5FromDAT); + + tGame.ChildAdd(tRom); + } + + private static void LoadDiskFromDat(ref RvDir tGame, XmlNode romNode) + { + if (romNode.Attributes == null) + return; + + + RvFile tRom = new RvFile(FileType.File) + { + Dat = tGame.Dat, + Name = VarFix.CleanFullFileName(romNode.Attributes.GetNamedItem("name")) + ".chd", + SHA1CHD = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("sha1"), 40), + MD5CHD = VarFix.CleanMD5SHA1(romNode.Attributes.GetNamedItem("md5"), 32), + Merge = VarFix.CleanFullFileName(romNode.Attributes.GetNamedItem("merge")), + Status = VarFix.ToLower(romNode.Attributes.GetNamedItem("status")) + }; + + if (tRom.SHA1CHD != null) tRom.FileStatusSet(FileStatus.SHA1CHDFromDAT); + if (tRom.MD5CHD != null) tRom.FileStatusSet(FileStatus.MD5CHDFromDAT); + + tGame.ChildAdd(tRom); + } + + } +} diff --git a/ROMVault2/DatUpdate.cs b/ROMVault2/DatUpdate.cs new file mode 100644 index 0000000..183f6fb --- /dev/null +++ b/ROMVault2/DatUpdate.cs @@ -0,0 +1,784 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2013 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Threading; +using ROMVault2.IO; +using ROMVault2.DatReaders; +using ROMVault2.Properties; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2 +{ + public static class DatUpdate + { + private static int _datCount; + private static int _datsProcessed; + private static BackgroundWorker _bgw; + + public static void ShowDat(string message, string filename) + { + if (_bgw != null) + _bgw.ReportProgress(0, new bgwShowError(filename, message)); + } + + public static void SendAndShowDat(string message, string filename) + { + ReportError.SendErrorMessageDat(message, filename); + if (_bgw != null) + _bgw.ReportProgress(0, new bgwShowError(filename, message)); + } + + + public static void UpdateDat(object sender, DoWorkEventArgs e) + { + try + { + _bgw = sender as BackgroundWorker; + if (_bgw == null) return; + + Program.SyncCont = e.Argument as SynchronizationContext; + if (Program.SyncCont == null) + { + _bgw = null; + return; + } + + + _bgw.ReportProgress(0, new bgwText("Clearing DB Status")); + RepairStatus.ReportStatusReset(DB.DirTree); + + _datCount = 0; + + _bgw.ReportProgress(0, new bgwText("Finding Dats")); + RvDir datRoot = new RvDir(FileType.Dir) { Name = "RomVault", DatStatus = DatStatus.InDatCollect }; + + // build a datRoot tree of the DAT's in DatRoot, and count how many dats are found + if (!RecursiveDatTree(datRoot, out _datCount)) + { + _bgw.ReportProgress(0, new bgwText("Dat Update Complete")); + _bgw = null; + Program.SyncCont = null; + return; + } + + _bgw.ReportProgress(0, new bgwText("Scanning Dats")); + _datsProcessed = 0; + + // now compare the database DAT's with datRoot removing any old DAT's + RemoveOldDats(DB.DirTree.Child(0), datRoot); + + // next clean up the File status removing any old DAT's + RemoveOldDatsCleanUpFiles(DB.DirTree.Child(0)); + + _bgw.ReportProgress(0, new bgwSetRange(_datCount - 1)); + + // next add in new DAT and update the files + UpdateDatList((RvDir)DB.DirTree.Child(0),datRoot); + + // finally remove any unneeded DIR's from the TreeView + RemoveOldTree(DB.DirTree.Child(0)); + + _bgw.ReportProgress(0, new bgwText("Updating Cache")); + DB.Write(); + + _bgw.ReportProgress(0, new bgwText("Dat Update Complete")); + _bgw = null; + Program.SyncCont = null; + } + catch (Exception exc) + { + ReportError.UnhandledExceptionHandler(exc); + + if (_bgw != null) _bgw.ReportProgress(0, new bgwText("Updating Cache")); + DB.Write(); + if (_bgw != null) _bgw.ReportProgress(0, new bgwText("Complete")); + + _bgw = null; + Program.SyncCont = null; + } + } + + private static bool RecursiveDatTree(RvDir tDir, out int datCount) + { + datCount = 0; + string strPath = tDir.DatFullName; + + if (!Directory.Exists(strPath)) + { + ReportError.Show(Resources.DatUpdate_UpdateDatList_Path + strPath + Resources.DatUpdate_UpdateDatList_Not_Found); + return false; + } + + DirectoryInfo oDir = new DirectoryInfo(strPath); + + FileInfo[] oFilesIn = oDir.GetFiles("*.dat", false); + datCount += oFilesIn.Length; + foreach (FileInfo file in oFilesIn) + { + RvDat tDat = new RvDat(); + tDat.AddData(RvDat.DatData.DatFullName, file.FullName); + tDat.TimeStamp = file.LastWriteTime; + tDir.DirDatAdd(tDat); + } + + + oFilesIn = oDir.GetFiles("*.xml", false); + datCount += oFilesIn.Length; + foreach (FileInfo file in oFilesIn) + { + RvDat tDat = new RvDat(); + tDat.AddData(RvDat.DatData.DatFullName, file.FullName); + tDat.TimeStamp = file.LastWriteTime; + tDir.DirDatAdd(tDat); + } + + if (tDir.DirDatCount > 1) + for (int i = 0; i < tDir.DirDatCount; i++) + tDir.DirDat(i).AutoAddDirectory = true; + + DirectoryInfo[] oSubDir = oDir.GetDirectories(false); + + foreach (DirectoryInfo t in oSubDir) + { + RvDir cDir = new RvDir(FileType.Dir) { Name = t.Name, DatStatus = DatStatus.InDatCollect }; + int index = tDir.ChildAdd(cDir); + + int retDatCount; + + RecursiveDatTree(cDir, out retDatCount); + datCount += retDatCount; + + if (retDatCount == 0) + tDir.ChildRemove(index); + } + + return true; + } + + + private static void RemoveOldDats(RvBase dbDir, RvDir tmpDir) + { + // now compare the old and new dats removing any old dats + // in the current directory + + RvDir lDir = dbDir as RvDir; + if (lDir == null) return; + + int dbIndex = 0; + int scanIndex = 0; + + while (dbIndex < lDir.DirDatCount || scanIndex < tmpDir.DirDatCount) + { + RvDat dbDat = null; + RvDat fileDat = null; + int res = 0; + + if (dbIndex < lDir.DirDatCount && scanIndex < tmpDir.DirDatCount) + { + dbDat = lDir.DirDat(dbIndex); + fileDat = tmpDir.DirDat(scanIndex); + res = DBHelper.DatCompare(dbDat, fileDat); + } + else if (scanIndex < tmpDir.DirDatCount) + { + //this is a new dat that we have now found at the end of the list + //fileDat = tmpDir.DirDat(scanIndex); + res = 1; + } + else if (dbIndex < lDir.DirDatCount) + { + dbDat = lDir.DirDat(dbIndex); + res = -1; + } + + switch (res) + { + case 0: + dbDat.Status = DatUpdateStatus.Correct; + dbIndex++; + scanIndex++; + break; + + case 1: + // this is a new dat that we will add next time around + scanIndex++; + break; + case -1: + dbDat.Status = DatUpdateStatus.Delete; + lDir.DirDatRemove(dbIndex); + break; + } + + } + + // now scan the child directory structure of this directory + dbIndex = 0; + scanIndex = 0; + + while (dbIndex < lDir.ChildCount || scanIndex < tmpDir.ChildCount) + { + RvBase dbChild = null; + RvBase fileChild = null; + int res = 0; + + if (dbIndex < lDir.ChildCount && scanIndex < tmpDir.ChildCount) + { + dbChild = lDir.Child(dbIndex); + fileChild = tmpDir.Child(scanIndex); + res = DBHelper.CompareName(dbChild, fileChild); + } + else if (scanIndex < tmpDir.ChildCount) + { + //found a new directory on the end of the list + //fileChild = tmpDir.Child(scanIndex); + res = 1; + } + else if (dbIndex < lDir.ChildCount) + { + dbChild = lDir.Child(dbIndex); + res = -1; + } + switch (res) + { + case 0: + // found a matching directory in DatRoot So recurse back into it + RemoveOldDats(dbChild, (RvDir)fileChild); + dbIndex++; + scanIndex++; + break; + + case 1: + // found a new directory will be added later + scanIndex++; + break; + case -1: + if (dbChild.FileType == FileType.Dir && dbChild.Dat == null) + RemoveOldDats(dbChild, new RvDir(FileType.Dir)); + dbIndex++; + break; + } + } + } + + private static EFile RemoveOldDatsCleanUpFiles(RvBase dbDir) + { + + if (dbDir.Dat != null) + { + if (dbDir.Dat.Status == DatUpdateStatus.Correct) + return EFile.Keep; + + if (dbDir.Dat.Status == DatUpdateStatus.Delete) + { + if (dbDir.DatRemove() == EFile.Delete) + return EFile.Delete; //delete + } + } + + FileType ft = dbDir.FileType; + // if we are checking a dir or zip recurse into it. + if (ft != FileType.Zip && ft != FileType.Dir) return EFile.Keep; + RvDir tDir = dbDir as RvDir; + + // remove all DATStatus's here they will get set back correctly when adding dats back in below. + dbDir.DatStatus = DatStatus.NotInDat; + + for (int i = 0; i < tDir.ChildCount; i++) + { + if (RemoveOldDatsCleanUpFiles(tDir.Child(i)) == EFile.Keep) continue; + tDir.ChildRemove(i); + i--; + } + if (ft == FileType.Zip && dbDir.GotStatus == GotStatus.Corrupt) return EFile.Keep; + + // if this directory is now empty it should be deleted + return tDir.ChildCount == 0 ? EFile.Delete : EFile.Keep; + } + + + + private static void UpdateDatList(RvDir dbDir, RvDir tmpDir) + { + AddNewDats(dbDir, tmpDir); + UpdateDirs(dbDir, tmpDir); + } + + /// + /// Add the new DAT's into the DAT list + /// And merge in the new DAT data into the database + /// + /// The Current database dir + /// A temp directory containing the DAT found in this directory in DatRoot + private static void AddNewDats(RvDir dbDir, RvDir tmpDir) + { + bool autoAddDirectory = (tmpDir.DirDatCount) > 1; + + int dbIndex = 0; + int scanIndex = 0; + + Debug.WriteLine(""); + Debug.WriteLine("Scanning for Adding new DATS"); + while (dbIndex < dbDir.DirDatCount || scanIndex < tmpDir.DirDatCount) + { + RvDat dbDat = null; + RvDat fileDat = null; + int res = 0; + + if (dbIndex < dbDir.DirDatCount && scanIndex < tmpDir.DirDatCount) + { + dbDat = dbDir.DirDat(dbIndex); + fileDat = tmpDir.DirDat(scanIndex); + res = DBHelper.DatCompare(dbDat, fileDat); + Debug.WriteLine("Checking " + dbDat.GetData(RvDat.DatData.DatFullName) + " : and " + fileDat.GetData(RvDat.DatData.DatFullName) + " : " + res); + } + else if (scanIndex < tmpDir.DirDatCount) + { + fileDat = tmpDir.DirDat(scanIndex); + res = 1; + Debug.WriteLine("Checking : and " + fileDat.GetData(RvDat.DatData.DatFullName) + " : " + res); + } + else if (dbIndex < dbDir.DirDatCount) + { + dbDat = dbDir.DirDat(dbIndex); + res = -1; + Debug.WriteLine("Checking " + dbDat.GetData(RvDat.DatData.DatFullName) + " : and : " + res); + } + + switch (res) + { + case 0: + _datsProcessed++; + _bgw.ReportProgress(_datsProcessed); + _bgw.ReportProgress(0, new bgwText("Dat : " + Path.GetFileNameWithoutExtension(fileDat.GetData(RvDat.DatData.DatFullName)))); + + + Debug.WriteLine("Correct"); + // Should already be set as correct above + dbDat.Status = DatUpdateStatus.Correct; + dbIndex++; + scanIndex++; + break; + + case 1: + _datsProcessed++; + _bgw.ReportProgress(_datsProcessed); + _bgw.ReportProgress(0, new bgwText("Scanning New Dat : " + Path.GetFileNameWithoutExtension(fileDat.GetData(RvDat.DatData.DatFullName)))); + + + Debug.WriteLine("Adding new DAT"); + if (UpdateDatFile(fileDat, autoAddDirectory, dbDir)) + dbIndex++; + scanIndex++; + break; + + case -1: + // This should not happen as deleted dat have been removed above + //dbIndex++; + ReportError.SendAndShow(Resources.DatUpdate_UpdateDatList_ERROR_Deleting_a_DAT_that_should_already_be_deleted); + break; + } + + } + } + + + + + + private static bool UpdateDatFile(RvDat file, bool autoAddDirectory, RvDir thisDirectory) + { + // Read the new Dat File into newDatFile + RvDir newDatFile = DatReader.ReadInDatFile(file, _bgw); + + // If we got a valid Dat File back + if (newDatFile == null || newDatFile.Dat == null) + { + ReportError.Show("Error reading Dat " + file.GetData(RvDat.DatData.DatFullName)); + return false; + } + + newDatFile.Dat.AutoAddDirectory = autoAddDirectory; + + if ((autoAddDirectory || !String.IsNullOrEmpty(newDatFile.Dat.GetData(RvDat.DatData.RootDir))) && newDatFile.Dat.GetData(RvDat.DatData.DirSetup)!= "noautodir") + { // if we are auto adding extra directorys then create a new directory. + + newDatFile.Name = !String.IsNullOrEmpty(newDatFile.Dat.GetData(RvDat.DatData.RootDir)) ? + newDatFile.Dat.GetData(RvDat.DatData.RootDir) : newDatFile.Dat.GetData(RvDat.DatData.DatName); + + newDatFile.DatStatus = DatStatus.InDatCollect; + newDatFile.Tree = new RvTreeRow(); + + RvDir newDirectory = new RvDir(FileType.Dir) { Dat = newDatFile.Dat }; + + // add the DAT into this directory + newDirectory.ChildAdd(newDatFile); + newDatFile = newDirectory; + } + + if (thisDirectory.Tree == null) + thisDirectory.Tree = new RvTreeRow(); + + RvDat conflictDat; + if (MergeInDat(thisDirectory, newDatFile, out conflictDat, true)) + { + ReportError.Show("Dat Merge conflict occured Cache contains " + conflictDat.GetData(RvDat.DatData.DatFullName) + " new dat " + newDatFile.Dat.GetData(RvDat.DatData.DatFullName) + " is trying to use the same dirctory and so will be ignored."); + return false; + } + + //SetInDat(thisDirectory); + + // Add the new Dat + thisDirectory.DirDatAdd(newDatFile.Dat); + + // Merge the files/directories in the Dat + MergeInDat(thisDirectory, newDatFile, out conflictDat, false); + return true; + } + + /* + private static void SetInDat(RvDir tDir) + { + tDir.DatStatus = DatStatus.InDatCollect; + if (tDir.Parent != null) + SetInDat(tDir.Parent); + } + */ + + private static Boolean MergeInDat(RvDir dbDat, RvDir newDat, out RvDat conflict, bool checkOnly) + { + conflict = null; + int dbIndex = 0; + int newIndex = 0; + while (dbIndex < dbDat.ChildCount || newIndex < newDat.ChildCount) + { + RvBase dbChild = null; + RvBase newDatChild = null; + int res = 0; + + if (dbIndex < dbDat.ChildCount && newIndex < newDat.ChildCount) + { + dbChild = dbDat.Child(dbIndex); // are files + newDatChild = newDat.Child(newIndex); // is from a dat item + res = DBHelper.CompareName(dbChild, newDatChild); + } + else if (newIndex < newDat.ChildCount) + { + newDatChild = newDat.Child(newIndex); + res = 1; + } + else if (dbIndex < dbDat.ChildCount) + { + dbChild = dbDat.Child(dbIndex); + res = -1; + } + + if (res == 0) + { + if (dbChild == null || newDatChild == null) + { + SendAndShowDat(Resources.DatUpdate_MergeInDat_Error_in_Logic, dbDat.FullName); + break; + } + + + List dbDats = new List(); + List newDats = new List(); + int dbDatsCount = 1; + int newDatsCount = 1; + + + dbDats.Add(dbChild); + newDats.Add(newDatChild); + + while (dbIndex + dbDatsCount < dbDat.ChildCount && DBHelper.CompareName(dbChild, dbDat.Child(dbIndex + dbDatsCount)) == 0) + { + dbDats.Add(dbDat.Child(dbIndex + dbDatsCount)); + dbDatsCount += 1; + } + while (newIndex + newDatsCount < newDat.ChildCount && DBHelper.CompareName(newDatChild, newDat.Child(newIndex + newDatsCount)) == 0) + { + newDats.Add(newDat.Child(newIndex + newDatsCount)); + newDatsCount += 1; + } + + if (dbDatsCount > 1 || newDatsCount > 1) + { + ReportError.SendAndShow("Double Name Found"); + } + + for (int indexdb = 0; indexdb < dbDatsCount; indexdb++) + { + if (dbDats[indexdb].DatStatus == DatStatus.NotInDat) continue; + + if (checkOnly) + { + conflict = dbChild.Dat; + return true; + } + + SendAndShowDat(Resources.DatUpdate_MergeInDat_Unkown_Update_Dat_Status + dbChild.DatStatus, dbDat.FullName); + break; + } + + if (!checkOnly) + { + for (int indexNewDats = 0; indexNewDats < newDatsCount; indexNewDats++) + { + if (newDats[indexNewDats].SearchFound) continue; + + for (int indexDbDats = 0; indexDbDats < dbDatsCount; indexDbDats++) + { + if (dbDats[indexDbDats].SearchFound) continue; + + bool matched = FullCompare(dbDats[indexDbDats], newDats[indexNewDats]); + if (!matched) continue; + + dbDats[indexDbDats].DatAdd(newDats[indexNewDats]); + + FileType ft = dbChild.FileType; + + if (ft == FileType.Zip || ft == FileType.Dir) + { + RvDir dChild = (RvDir)dbChild; + RvDir dNewChild = (RvDir)newDatChild; + MergeInDat(dChild, dNewChild, out conflict, checkOnly); + } + + dbDats[indexDbDats].SearchFound = true; + newDats[indexNewDats].SearchFound = true; + } + } + + for (int indexNewDats = 0; indexNewDats < newDatsCount; indexNewDats++) + { + if (newDats[indexNewDats].SearchFound) continue; + + dbDat.ChildAdd(newDats[indexNewDats], dbIndex); + dbChild = dbDat.Child(dbIndex); + SetMissingStatus(dbChild); + + dbIndex++; + } + } + + dbIndex += dbDatsCount; + newIndex += newDatsCount; + + } + + if (res == 1) + { + if (!checkOnly) + { + dbDat.ChildAdd(newDatChild, dbIndex); + dbChild = dbDat.Child(dbIndex); + SetMissingStatus(dbChild); + + dbIndex++; + } + newIndex++; + } + + if (res == -1) + { + dbIndex++; + } + } + return false; + } + + + private static void SetMissingStatus(RvBase dbChild) + { + if (dbChild.FileRemove() == EFile.Delete) + { + ReportError.SendAndShow("Error is Set Mssing Status in DatUpdate"); + return; + } + + + FileType ft = dbChild.FileType; + if (ft == FileType.Zip || ft == FileType.Dir) + { + RvDir dbDir = (RvDir)dbChild; + for (int i = 0; i < dbDir.ChildCount; i++) + SetMissingStatus(dbDir.Child(i)); + } + + } + + private static bool FullCompare(RvBase var1, RvBase var2) + { + int retv = DBHelper.CompareName(var1, var2); + if (retv != 0) return false; + + FileType v1 = var1.FileType; + FileType v2 = var2.FileType; + retv = Math.Sign(v1.CompareTo(v2)); + if (retv != 0) return false; + + // filetypes are now know to be the same + + // Dir's and Zip's are not deep scanned so matching here is done + if ((v1 == FileType.Dir) || (v1 == FileType.Zip)) + return true; + + RvFile f1 = (RvFile)var1; + RvFile f2 = (RvFile)var2; + + if (f1.Size != null && f2.Size != null) + { + retv = ULong.iCompare(f1.Size, f2.Size); + if (retv != 0) return false; + } + + if (f1.CRC != null && f2.CRC != null) + { + retv = ArrByte.iCompare(f1.CRC, f2.CRC); + if (retv != 0) return false; + } + + if (f1.SHA1 != null && f2.SHA1 != null) + { + retv = ArrByte.iCompare(f1.SHA1, f2.SHA1); + if (retv != 0) return false; + } + + if (f1.MD5 != null && f2.MD5 != null) + { + retv = ArrByte.iCompare(f1.MD5, f2.MD5); + if (retv != 0) return false; + } + + if (f1.SHA1CHD != null && f2.SHA1CHD != null) + { + retv = ArrByte.iCompare(f1.SHA1CHD, f2.SHA1CHD); + if (retv != 0) return false; + } + + if (f1.MD5CHD != null && f2.MD5CHD != null) + { + retv = ArrByte.iCompare(f1.MD5CHD, f2.MD5CHD); + if (retv != 0) return false; + } + + return true; + } + + + + private static void UpdateDirs(RvDir dbDir, RvDir fileDir) + { + int dbIndex = 0; + int scanIndex = 0; + + dbDir.DatStatus=DatStatus.InDatCollect; + if (dbDir.Tree == null) + { + Debug.WriteLine("Adding Tree View to " + dbDir.Name); + dbDir.Tree = new RvTreeRow(); + } + + + Debug.WriteLine(""); + Debug.WriteLine("Now scanning dirs"); + + while (dbIndex < dbDir.ChildCount || scanIndex < fileDir.ChildCount) + { + RvBase dbChild = null; + RvBase fileChild = null; + int res = 0; + + if (dbIndex < dbDir.ChildCount && scanIndex < fileDir.ChildCount) + { + dbChild = dbDir.Child(dbIndex); + fileChild = fileDir.Child(scanIndex); + res = DBHelper.CompareName(dbChild, fileChild); + Debug.WriteLine("Checking " + dbChild.Name + " : and " + fileChild.Name + " : " + res); + } + else if (scanIndex < fileDir.ChildCount) + { + fileChild = fileDir.Child(scanIndex); + res = 1; + Debug.WriteLine("Checking : and " + fileChild.Name + " : " + res); + } + else if (dbIndex < dbDir.ChildCount) + { + dbChild = dbDir.Child(dbIndex); + res = -1; + } + switch (res) + { + case 0: + // found a matching directory in DatRoot So recurse back into it + + if (dbChild.GotStatus == GotStatus.Got) + { + if (dbChild.Name != fileChild.Name) // check if the case of the Item in the DB is different from the Dat Root Actual filename + { + if (!string.IsNullOrEmpty(dbChild.FileName)) // if we do not already have a different case name stored + { + dbChild.FileName = dbChild.Name; // copy the DB filename to the FileName + } + else // We already have a different case filename found in RomRoot + { + if (dbChild.FileName == fileChild.Name) // check if the Datroot name does now match the name in the DB Filename + { + dbChild.FileName = null; // if it does undo the BadCase Flag + } + } + dbChild.Name = fileChild.Name; // Set the db Name to match the Datroot Name. + } + } + else + dbChild.Name = fileChild.Name; + + UpdateDatList((RvDir)dbChild,(RvDir)fileChild); + dbIndex++; + scanIndex++; + break; + + case 1: + // found a new directory in Dat + RvDir tDir = new RvDir(FileType.Dir) + { + Name = fileChild.Name, + Tree = new RvTreeRow(), + DatStatus = DatStatus.InDatCollect, + }; + dbDir.ChildAdd(tDir, dbIndex); + Debug.WriteLine("Adding new Dir and Calling back in to check this DIR " + tDir.Name); + UpdateDatList(tDir,(RvDir)fileChild); + + dbIndex++; + scanIndex++; + break; + case -1: + // all files + dbIndex++; + break; + } + } + } + + private static void RemoveOldTree(RvBase dbBase) + { + RvDir dbDir = dbBase as RvDir; + if (dbDir == null) return; + + if (dbDir.DatStatus == DatStatus.NotInDat && dbDir.Tree != null) + dbDir.Tree = null; + + for (int i = 0; i < dbDir.ChildCount; i++) + RemoveOldTree(dbDir.Child(i)); + } + } +} diff --git a/ROMVault2/DirCellDraw.cs b/ROMVault2/DirCellDraw.cs new file mode 100644 index 0000000..66de677 --- /dev/null +++ b/ROMVault2/DirCellDraw.cs @@ -0,0 +1,146 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Windows.Forms; +using ROMVault2.RvDB; +using ROMVault2.SupportedFiles; + +namespace ROMVault2 +{ + + public class RomCellDraw : DataGridViewImageCell + { + private readonly Color _bgCol; + private readonly string _bitmapName; + + public RomCellDraw(string name,Color bgCol) + { + _bitmapName = name; + _bgCol = bgCol; + + } + + protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) + { + graphics.FillRectangle(new SolidBrush(_bgCol), cellBounds); + + Bitmap bm= rvImages.GetBitmap(_bitmapName); + + if (bm != null) + { + graphics.DrawImage(bm, cellBounds.Left, cellBounds.Top, bm.Width,bm.Height); + bm.Dispose(); + } + + + else + Debug.WriteLine("Missing Graphic for " + _bitmapName); + } + + } + + public class DirCellDraw : DataGridViewImageCell + { + private readonly Color _bgCol; + private readonly RvDir _cellDir; + + public DirCellDraw(RvDir cellDir, Color bgCol) + { + _cellDir = cellDir; + _bgCol = bgCol; + } + + protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) + { + + graphics.FillRectangle(new SolidBrush(_bgCol), cellBounds); + + string bitmapName; + + switch (_cellDir.FileType) + { + case FileType.Zip: + if (_cellDir.RepStatus == RepStatus.DirCorrect && _cellDir.ZipStatus==ZipStatus.TrrntZip) + bitmapName = "ZipTZ"; + else + bitmapName = "Zip" + _cellDir.RepStatus; + break; + default: + bitmapName = "Dir" + _cellDir.RepStatus; + break; + } + + Bitmap bm = rvImages.GetBitmap(bitmapName); + + if (bm != null) + { + graphics.DrawImage(bm, cellBounds.Left + 10, cellBounds.Top, 21, 17); + bm.Dispose(); + } + else + Debug.WriteLine("Missing Graphic for " + bitmapName); + } + } + + public class DirCellStatusDraw : DataGridViewImageCell + { + private readonly RvDir _dir; + public DirCellStatusDraw(RvDir dir) + { + _dir = dir; + } + + protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) + { + Font drawFont = new Font("Arial", 9); + SolidBrush drawBrushBlack = new SolidBrush(Color.Black); + SolidBrush drawBrushWhite = new SolidBrush(Color.White); + + graphics.FillRectangle(drawBrushWhite, cellBounds); + + int gOff; + int columnIndex = 0; + for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) + { + if (l >= 13) columnIndex = l; + + if (_dir.DirStatus.Get(RepairStatus.DisplayOrder[l]) <= 0) continue; + + gOff = cellBounds.Left + FrmMain.GameGridColumnXPositions[columnIndex]; + Bitmap bm = rvImages.GetBitmap(@"G_" + RepairStatus.DisplayOrder[l]); + if (bm != null) + { + graphics.DrawImage(bm, gOff, cellBounds.Top, 21, 18); + bm.Dispose(); + } + else + Debug.WriteLine("Missing Graphics for " + "G_" + RepairStatus.DisplayOrder[l]); + + columnIndex++; + } + + columnIndex = 0; + for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) + { + if (l >= 13) + columnIndex = l; + + if (_dir.DirStatus.Get(RepairStatus.DisplayOrder[l]) > 0) + { + gOff = cellBounds.Left + FrmMain.GameGridColumnXPositions[columnIndex]; + graphics.DrawString(_dir.DirStatus.Get(RepairStatus.DisplayOrder[l]).ToString(CultureInfo.InvariantCulture), drawFont, drawBrushBlack, new PointF(gOff + 20, cellBounds.Top + 3)); + columnIndex++; + } + } + drawBrushBlack.Dispose(); + drawBrushWhite.Dispose(); + drawFont.Dispose(); + } + } +} \ No newline at end of file diff --git a/ROMVault2/FileScanning.cs b/ROMVault2/FileScanning.cs new file mode 100644 index 0000000..e8b3726 --- /dev/null +++ b/ROMVault2/FileScanning.cs @@ -0,0 +1,842 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using ROMVault2.IO; +using System.Threading; +using ROMVault2.Properties; +using ROMVault2.RvDB; +using ROMVault2.SupportedFiles; +using ROMVault2.SupportedFiles.CHD; +using ROMVault2.SupportedFiles.Files; +using ROMVault2.SupportedFiles.Zip; +using ROMVault2.Utils; +using FileInfo = ROMVault2.IO.FileInfo; + +namespace ROMVault2 +{ + public static class FileScanning + { + private static Stopwatch _cacheSaveTimer; + private static long _lastUpdateTime; + private static BackgroundWorker _bgw; + public static eScanLevel EScanLevel; + private static bool _fileErrorAbort; + + + public static void ScanFiles(object sender, DoWorkEventArgs e) + { + +#if !Debug + try + { +#endif + _fileErrorAbort = false; + _cacheSaveTimer = new Stopwatch(); + _cacheSaveTimer.Reset(); + if (Settings.CacheSaveTimerEnabled) + _cacheSaveTimer.Start(); + + _bgw = sender as BackgroundWorker; + if (_bgw == null) return; + + Program.SyncCont = e.Argument as SynchronizationContext; + if (Program.SyncCont == null) + { + _bgw = null; + return; + } + + + _bgw.ReportProgress(0, new bgwText("Clearing DB Status")); + RepairStatus.ReportStatusReset(DB.DirTree); + + _bgw.ReportProgress(0, new bgwText("Finding Dir's to Scan")); + //Next get a list of all the directories to be scanned + List lstDir = new List(); + DBHelper.GetSelectedDirList(ref lstDir); + + + _bgw.ReportProgress(0, new bgwText("Scanning Dir's")); + _bgw.ReportProgress(0, new bgwSetRange(lstDir.Count - 1)); + //Scan the list of directories. + for (int i = 0; i < lstDir.Count; i++) + { + _bgw.ReportProgress(i); + _bgw.ReportProgress(0, new bgwText("Scanning Dir : " + lstDir[i].FullName)); + string lDir = lstDir[i].FullName; + Console.WriteLine(lDir); + if (Directory.Exists(lDir)) + CheckADir(lstDir[i], true); + else + MarkAsMissing(lstDir[i]); + + if (_bgw.CancellationPending || _fileErrorAbort) break; + } + + _bgw.ReportProgress(0, new bgwText("Updating Cache")); + DB.Write(); + + + _bgw.ReportProgress(0, new bgwText("File Scan Complete")); + + _bgw = null; + Program.SyncCont = null; +#if !Debug + } + catch (Exception exc) + { + ReportError.UnhandledExceptionHandler(exc); + + if (_bgw != null) _bgw.ReportProgress(0, new bgwText("Updating Cache")); + DB.Write(); + if (_bgw != null) _bgw.ReportProgress(0, new bgwText("Complete")); + + _bgw = null; + Program.SyncCont = null; + + } +#endif + } + + + + private static void CheckADir(RvDir dbDir, bool report) + { + if (_cacheSaveTimer.Elapsed.TotalMinutes > Settings.CacheSaveTimePeriod) + { + _bgw.ReportProgress(0, "Saving Cache"); + DB.Write(); + _bgw.ReportProgress(0, "Saving Cache Complete"); + _cacheSaveTimer.Reset(); + _cacheSaveTimer.Start(); + } + + string fullDir = dbDir.FullName; + if (report) + _bgw.ReportProgress(0, new bgwText2(fullDir)); + + DatStatus chechingDatStatus = dbDir.IsInToSort ? DatStatus.InToSort : DatStatus.NotInDat; + + // this is a temporary rvDir structure to store the data about the actual directory/files we are scanning + // we will first populate this variable with the real file data from the directory, and then compare it + // with the data in dbDir. + RvDir fileDir = null; + + + Debug.WriteLine(fullDir); + + FileType ft = dbDir.FileType; + + #region "Populate fileDir" + + // if we are scanning a ZIP file then populate scanDir from the ZIP file + switch (ft) + { + case FileType.Zip: + { + fileDir = new RvDir(ft); + + // open the zip file + ZipFile checkZ = new ZipFile(); + + ZipReturn zr = checkZ.ZipFileOpen(fullDir, dbDir.TimeStamp, true); + + if (zr == ZipReturn.ZipGood) + { + dbDir.ZipStatus = checkZ.ZipStatus; + + // to be Scanning a ZIP file means it is either new or has changed. + // as the code below only calls back here if that is true. + // + // Level1: Only use header CRC's + // Just get the CRC for the ZIP headers. + // + // Level2: Fully checksum changed only files + // We know this file has been changed to do a full checksum scan. + // + // Level3: Fully checksum everything + // So do a full checksum scan. + if (EScanLevel == eScanLevel.Level2 || EScanLevel == eScanLevel.Level3) + checkZ.DeepScan(); + + // add all of the file information from the zip file into scanDir + for (int i = 0; i < checkZ.LocalFilesCount(); i++) + { + RvFile tFile = new RvFile(DBTypeGet.FileFromDir(ft)) + { + Name = checkZ.Filename(i), + ZipFileIndex = i, + ZipFileHeaderPosition = checkZ.LocalHeader(i), + Size = checkZ.UncompressedSize(i), + CRC = checkZ.CRC32(i) + }; + // all 3 levels read the CRC from the ZIP header + tFile.SetStatus(chechingDatStatus, GotStatus.Got); + tFile.FileStatusSet(FileStatus.SizeFromHeader | FileStatus.CRCFromHeader); + + // if we are in level 2 or level 3 then do a full CheckSum Scan. + if (EScanLevel == eScanLevel.Level2 || EScanLevel == eScanLevel.Level3) + { + // DeepScan will return ZipReturn.ZipCRCDecodeError if the headers CRC and + // the actual CRC do not match. + // So we just need to set the MD5 and SHA1 from the ZIP file. + zr = checkZ.FileStatus(i); + if (zr == ZipReturn.ZipUntested) + { + _bgw.ReportProgress(0, new bgwShowCorrupt(zr, fullDir + " : " + checkZ.Filename(i))); + } + else if (zr != ZipReturn.ZipGood) + { + _bgw.ReportProgress(0, new bgwShowCorrupt(zr, fullDir + " : " + checkZ.Filename(i))); + tFile.GotStatus = GotStatus.Corrupt; + } + else + { + tFile.MD5 = checkZ.MD5(i); + tFile.SHA1 = checkZ.SHA1(i); + tFile.FileStatusSet(FileStatus.SizeVerified | FileStatus.CRCVerified | FileStatus.SHA1Verified | FileStatus.MD5Verified); + } + } + + fileDir.ChildAdd(tFile); + } + } + else if (zr == ZipReturn.ZipFileLocked) + { + _bgw.ReportProgress(0, new bgwShowError(fullDir, "Zip File Locked")); + dbDir.TimeStamp = 0; + dbDir.GotStatus = GotStatus.FileLocked; + } + else + { + _bgw.ReportProgress(0, new bgwShowCorrupt(zr, fullDir)); + dbDir.GotStatus = GotStatus.Corrupt; + } + checkZ.ZipFileClose(); + } + break; + + case FileType.Dir: + { + fileDir = new RvDir(FileType.Dir); + + + DirectoryInfo oDir = new DirectoryInfo(fullDir); + DirectoryInfo[] oDirs = oDir.GetDirectories(); + FileInfo[] oFiles = oDir.GetFiles(); + + // add all the subdirectories into scanDir + foreach (DirectoryInfo dir in oDirs) + { + RvBase tDir = new RvDir(FileType.Dir) + { + Name = dir.Name, + TimeStamp = dir.LastWriteTime, + }; + tDir.SetStatus(chechingDatStatus, GotStatus.Got); + fileDir.ChildAdd(tDir); + } + + // add all the files into scanDir + foreach (FileInfo oFile in oFiles) + { + // if we find any zip files add them as zip files. + string fExt = Path.GetExtension(oFile.Name); + switch (fExt.ToLower()) + { + case ".zip": + { + RvDir tGame = new RvDir(FileType.Zip) + { + Name = Path.GetFileNameWithoutExtension(oFile.Name), + TimeStamp = oFile.LastWriteTime, + }; + tGame.SetStatus(chechingDatStatus, GotStatus.Got); + fileDir.ChildAdd(tGame); + } + break; + default: + { + string fName = oFile.Name; + if (fName == "__RomVault.tmp") + { + File.Delete(oFile.FullName); + continue; + } + + // Scanning a file + // + // Level1 & 2 : (are the same for files) Fully checksum changed only files + // Here we are just getting the TimeStamp of the File, and later + // if the TimeStamp was not matched we will have to read the files CRC, MD5 & SHA1 + // + // Level3: Fully checksum everything + // Get everything about the file right here so + // read CRC, MD5 & SHA1 + + + // add all the files in the sub-directory to scanDir + RvFile tFile = new RvFile(FileType.File) + { + Name = fName, + Size = (ulong)oFile.Length, + TimeStamp = oFile.LastWriteTime + }; + + tFile.FileStatusSet(FileStatus.SizeVerified); + + int errorCode = CHD.CheckFile(oFile, out tFile.SHA1CHD, out tFile.MD5CHD, out tFile.CHDVersion); + + if (errorCode == 0) + { + if (tFile.SHA1CHD != null) tFile.FileStatusSet(FileStatus.SHA1CHDFromHeader); + if (tFile.MD5CHD != null) tFile.FileStatusSet(FileStatus.MD5CHDFromHeader); + + tFile.SetStatus(chechingDatStatus, GotStatus.Got); + + // if we are scanning at Level3 then we get all the info here + if (EScanLevel == eScanLevel.Level3) + { + DeepScanFile(fullDir, tFile); + ChdManCheck(fullDir, tFile); + } + } + else if (errorCode == 32) + { + tFile.GotStatus = GotStatus.FileLocked; + _bgw.ReportProgress(0, new bgwShowError(fullDir, "File Locked")); + } + else + { + string filename = Path.Combine(fullDir, tFile.Name); + ReportError.Show("File: " + filename + " Error: " + new Win32Exception(errorCode).Message + ". Scan Aborted."); + _fileErrorAbort = true; + return; + } + fileDir.ChildAdd(tFile); + } + break; + } + } + } + break; + default: + ReportError.SendAndShow("Un supported file type in CheckADir " + ft); + break; + } + #endregion + + if (fileDir == null) + { + ReportError.SendAndShow("Unknown Reading File Type in Dir Scanner"); + return; + } + + if (report) + { + _bgw.ReportProgress(0, new bgwSetRange2(fileDir.ChildCount - 1)); + + _bgw.ReportProgress(0, new bgwRange2Visible(true)); + } + + if (!DBTypeGet.isCompressedDir(ft) && _bgw.CancellationPending) return; + + Compare(dbDir, fileDir, report, true); + } + + public static void Compare(RvDir dbDir, RvDir fileDir, bool report, bool enableCancel) + { + + string fullDir = dbDir.FullName; + FileType ft = dbDir.FileType; + + // now we scan down the dbDir and the scanDir, comparing them. + // if we find a match we mark dbDir as found. + // if we are missing a file in scanDir we mark that file in dbDir as missing. + // if we find extra files in scanDir we add it to dbDir and mark it as unknown. + // we also recurse into any sub directories. + int dbIndex = 0; + int fileIndex = 0; + + + while (dbIndex < dbDir.ChildCount || fileIndex < fileDir.ChildCount) + { + RvBase dbChild = null; + RvBase fileChild = null; + int res = 0; + + if (dbIndex < dbDir.ChildCount && fileIndex < fileDir.ChildCount) + { + dbChild = dbDir.Child(dbIndex); + fileChild = fileDir.Child(fileIndex); + res = DBHelper.CompareName(dbChild, fileChild); + } + else if (fileIndex < fileDir.ChildCount) + { + //Get any remaining filedir's + fileChild = fileDir.Child(fileIndex); + res = 1; + } + else if (dbIndex < dbDir.ChildCount) + { + //Get any remaining dbDir's + dbChild = dbDir.Child(dbIndex); + res = -1; + } + + if (report) + { + if (fileChild != null) + { + long timenow = DateTime.Now.Ticks; + if ((timenow - _lastUpdateTime) > (TimeSpan.TicksPerSecond / 10)) + { + _lastUpdateTime = timenow; + _bgw.ReportProgress(0, new bgwValue2(fileIndex)); + _bgw.ReportProgress(0, new bgwText2(Path.Combine(fullDir, fileChild.Name))); + } + } + } + + // if this file was found in the DB + switch (res) + { + case 0: + + if (dbChild == null || fileChild == null) + { + ReportError.SendAndShow(Resources.FileScanning_CheckADir_Error_in_File_Scanning_Code); + break; + } + + //Complete MultiName Compare + List dbs = new List(); + List files = new List(); + int dbsCount = 1; + int filesCount = 1; + + + dbs.Add(dbChild); + files.Add(fileChild); + + while (dbIndex + dbsCount < dbDir.ChildCount && DBHelper.CompareName(dbChild, dbDir.Child(dbIndex + dbsCount)) == 0) + { + dbs.Add(dbDir.Child(dbIndex + dbsCount)); + dbsCount += 1; + } + while (fileIndex + filesCount < fileDir.ChildCount && DBHelper.CompareName(fileChild, fileDir.Child(fileIndex + filesCount)) == 0) + { + files.Add(fileDir.Child(fileIndex + filesCount)); + filesCount += 1; + } + + for (int indexfile = 0; indexfile < filesCount; indexfile++) + { + if (files[indexfile].SearchFound) continue; + + for (int indexdb = 0; indexdb < dbsCount; indexdb++) + { + if (dbs[indexdb].SearchFound) continue; + + bool matched = FullCompare(dbs[indexdb], files[indexfile], false, fullDir, EScanLevel); + if (!matched) continue; + + MatchFound(dbs[indexdb], files[indexfile]); + dbs[indexdb].SearchFound = true; + files[indexfile].SearchFound = true; + } + + if (files[indexfile].SearchFound) continue; + + for (int indexdb = 0; indexdb < dbsCount; indexdb++) + { + if (dbs[indexdb].SearchFound) continue; + + bool matched = FullCompare(dbs[indexdb], files[indexfile], true, fullDir, EScanLevel); + if (!matched) continue; + + MatchFound(dbs[indexdb], files[indexfile]); + dbs[indexdb].SearchFound = true; + files[indexfile].SearchFound = true; + } + } + + + for (int indexdb = 0; indexdb < dbsCount; indexdb++) + { + if (dbs[indexdb].SearchFound) + { + dbIndex++; + continue; + } + DBFileNotFound(dbs[indexdb], dbDir, ref dbIndex); + } + + for (int indexfile = 0; indexfile < filesCount; indexfile++) + { + if (files[indexfile].SearchFound) + continue; + NewFileFound(files[indexfile], dbDir, dbIndex); + dbIndex++; + } + + fileIndex += filesCount; + break; + case 1: + NewFileFound(fileChild, dbDir, dbIndex); + dbIndex++; + fileIndex++; + break; + case -1: + DBFileNotFound(dbChild, dbDir, ref dbIndex); + break; + } + + if (_fileErrorAbort) return; + if (enableCancel && !DBTypeGet.isCompressedDir(ft) && _bgw.CancellationPending) return; + } + } + + private static void MatchFound(RvBase dbChild, RvBase fileChild) + { + // only check a zip if the filestamp has changed, we asume it is the same if the filestamp has not changed. + switch (dbChild.FileType) + { + case FileType.Zip: + if (dbChild.TimeStamp != fileChild.TimeStamp || EScanLevel == eScanLevel.Level3 || + (EScanLevel == eScanLevel.Level2 && !IsDeepScanned((RvDir)dbChild))) + { + // this is done first as the CheckADir could change this value if the zip turns out to be corrupt + dbChild.FileAdd(fileChild); + CheckADir((RvDir)dbChild, false); + } + else + // this is still needed incase the filenames case (upper/lower characters) have changed, but nothing else + dbChild.FileCheckName(fileChild); + break; + case FileType.Dir: + RvDir tDir = (RvDir)dbChild; + if (tDir.Tree == null) // do not recurse into directories that are in the tree, as they are processed by the top level code. + CheckADir(tDir, true); + if (_fileErrorAbort) return; + dbChild.FileAdd(fileChild); + break; + case FileType.File: + case FileType.ZipFile: + if (dbChild.TimeStamp == fileChild.TimeStamp && dbChild.GotStatus == GotStatus.Corrupt) + fileChild.GotStatus = GotStatus.Corrupt; + + dbChild.FileAdd(fileChild); + break; + default: + throw new Exception("Unsuported file type " + dbChild.FileType); + } + } + + private static void NewFileFound(RvBase fileChild, RvDir dbDir, int dbIndex) + { + if (fileChild == null) + { + ReportError.SendAndShow(Resources.FileScanning_CheckADir_Error_in_File_Scanning_Code); + return; + } + + // this could be an unknown file, or dirctory. + // if item is a directory add the directory and call back in again + + // add the newly found item + switch (fileChild.FileType) + { + case FileType.Zip: + dbDir.ChildAdd(fileChild, dbIndex); + CheckADir((RvDir)fileChild, false); + break; + case FileType.Dir: + dbDir.ChildAdd(fileChild, dbIndex); + CheckADir((RvDir)fileChild, true); + break; + case FileType.File: + + RvFile tChild = (RvFile)fileChild; + // if we have not read the files CRC in the checking code, we need to read it now. + if (tChild.GotStatus != GotStatus.FileLocked) + { + if (!IsDeepScanned(tChild)) + DeepScanFile(dbDir.FullName, tChild); + if (!IschdmanScanned(tChild) && EScanLevel == eScanLevel.Level2) + ChdManCheck(dbDir.FullName, tChild); + } + dbDir.ChildAdd(fileChild, dbIndex); + break; + case FileType.ZipFile: + dbDir.ChildAdd(fileChild, dbIndex); + break; + default: + throw new Exception("Unsuported file type " + fileChild.FileType); + } + + } + + private static void DBFileNotFound(RvBase dbChild, RvDir dbDir, ref int dbIndex) + { + if (dbChild == null) + { + ReportError.SendAndShow(Resources.FileScanning_CheckADir_Error_in_File_Scanning_Code); + return; + } + + if (dbChild.FileRemove() == EFile.Delete) + dbDir.ChildRemove(dbIndex); + else + { + switch (dbChild.FileType) + { + case FileType.Zip: + MarkAsMissing((RvDir)dbChild); + break; + case FileType.Dir: + RvDir tDir = (RvDir)dbChild; + if (tDir.Tree == null) + MarkAsMissing(tDir); + break; + } + dbIndex++; + } + } + + + private static bool IsDeepScanned(RvDir tZip) + { + for (int i = 0; i < tZip.ChildCount; i++) + { + RvFile zFile = tZip.Child(i) as RvFile; + if (zFile != null && zFile.GotStatus == GotStatus.Got && + (!zFile.FileStatusIs(FileStatus.SizeVerified) || !zFile.FileStatusIs(FileStatus.CRCVerified) || !zFile.FileStatusIs(FileStatus.SHA1Verified) || !zFile.FileStatusIs(FileStatus.MD5Verified))) + return false; + } + return true; + } + + private static void MarkAsMissing(RvDir dbDir) + { + for (int i = 0; i < dbDir.ChildCount; i++) + { + RvBase dbChild = dbDir.Child(i); + + if (dbChild.FileRemove() == EFile.Delete) + { + dbDir.ChildRemove(i); + i--; + } + else + { + switch (dbChild.FileType) + { + case FileType.Zip: + MarkAsMissing((RvDir)dbChild); + break; + case FileType.Dir: + RvDir tDir = (RvDir)dbChild; + if (tDir.Tree == null) + MarkAsMissing(tDir); + break; + } + } + } + } + + + private static bool FullCompare(RvBase dbFile, RvBase testFile, bool secondPass, string fullDir = "", eScanLevel sLevel = eScanLevel.Level3) + { + Debug.WriteLine("Comparing Dat File " + dbFile.TreeFullName); + Debug.WriteLine("Comparing File " + testFile.TreeFullName); + + int retv = DBHelper.CompareName(dbFile, testFile); + if (retv != 0) return false; + + FileType dbfileType = dbFile.FileType; + FileType dbtestFile = testFile.FileType; + retv = Math.Sign(dbfileType.CompareTo(dbtestFile)); + if (retv != 0) return false; + + // filetypes are now know to be the same + + // Dir's and Zip's are not deep scanned so matching here is done + if ((dbfileType == FileType.Dir) || (dbfileType == FileType.Zip)) + return true; + + RvFile dbFileF = (RvFile)dbFile; + RvFile testFileF = (RvFile)testFile; + + + if (dbFileF.Size != null && testFileF.Size != null) + { + retv = ULong.iCompare(dbFileF.Size, testFileF.Size); + if (retv != 0) return false; + } + + if (dbFileF.CRC != null && testFileF.CRC != null) + { + retv = ArrByte.iCompare(dbFileF.CRC, testFileF.CRC); + if (retv != 0) return false; + } + + if (dbFileF.SHA1 != null && testFileF.SHA1 != null) + { + retv = ArrByte.iCompare(dbFileF.SHA1, testFileF.SHA1); + if (retv != 0) return false; + } + + if (dbFileF.MD5 != null && testFileF.MD5 != null) + { + retv = ArrByte.iCompare(dbFileF.MD5, testFileF.MD5); + if (retv != 0) return false; + } + + if (dbFileF.SHA1CHD != null && testFileF.SHA1CHD != null) + { + retv = ArrByte.iCompare(dbFileF.SHA1CHD, testFileF.SHA1CHD); + if (retv != 0) return false; + } + + if (dbFileF.MD5CHD != null && testFileF.MD5CHD != null) + { + retv = ArrByte.iCompare(dbFileF.MD5CHD, testFileF.MD5CHD); + if (retv != 0) return false; + } + + // beyond here we only test files + if (dbtestFile != FileType.File) + return true; + + // if scanning at level 3 then we have already deep checked the file so all is OK. + if (sLevel == eScanLevel.Level3) + return true; + + // if we got this far then everything we have so far has matched, but that may not be enough. + // now we see if we need to get any more info and try again. + + + // if the file stamps do not match or the file in the DB we are comparing with has not been deep scanned + // and the file we are scanning has not already been deep scanned, then we need to do a deep scan, and check the deep scan values + + // files are always deep scanned, so the test for IsDeepScanned(dbFileF) is probably not really needed here. + + if ((dbFileF.TimeStamp != testFileF.TimeStamp || !IsDeepScanned(dbFileF)) && !IsDeepScanned(testFileF)) + { + if (!secondPass) + return false; + + DeepScanFile(fullDir, testFileF); + if (dbFileF.CRC != null && testFileF.CRC != null) + { + retv = ArrByte.iCompare(dbFileF.CRC, testFileF.CRC); + if (retv != 0) return false; + } + + if (dbFileF.SHA1 != null && testFileF.SHA1 != null) + { + retv = ArrByte.iCompare(dbFileF.SHA1, testFileF.SHA1); + if (retv != 0) return false; + } + + if (dbFileF.MD5 != null && testFileF.MD5 != null) + { + retv = ArrByte.iCompare(dbFileF.MD5, testFileF.MD5); + if (retv != 0) return false; + } + } + + // CHDman test, if we are only scanning at level 1 then don't do CHDman test so we are done. + if (sLevel == eScanLevel.Level1) + return true; + + if ((dbFileF.TimeStamp != testFileF.TimeStamp || (!IschdmanScanned(dbFileF)) && !IschdmanScanned(testFileF))) + { + ChdManCheck(fullDir, testFileF); + } + return true; + } + + + private static bool IsDeepScanned(RvFile tFile) + { + return ( + tFile.FileStatusIs(FileStatus.SizeVerified) && + tFile.FileStatusIs(FileStatus.CRCVerified) && + tFile.FileStatusIs(FileStatus.SHA1Verified) && + tFile.FileStatusIs(FileStatus.MD5Verified) + ); + } + + private static bool IschdmanScanned(RvFile tFile) + { + //if (!tFile.FileStatusIs(FileStatus.SHA1CHDFromHeader)) + // return true; + + if (tFile.GotStatus == GotStatus.Corrupt) + return true; + + return tFile.FileStatusIs(FileStatus.SHA1CHDVerified); + } + + private static void DeepScanFile(string directory, RvFile tFile) + { + string filename = Path.Combine(directory, tFile.Name); + int errorCode = UnCompFiles.CheckSumRead(filename, true, out tFile.CRC, out tFile.MD5, out tFile.SHA1); + if (errorCode == 32) + { + tFile.GotStatus = GotStatus.FileLocked; + return; + } + if (errorCode != 0) + { + ReportError.Show("File: " + filename + " Error: " + new Win32Exception(errorCode).Message + ". Scan Aborted."); + _fileErrorAbort = true; + return; + } + tFile.FileStatusSet(FileStatus.SizeVerified | FileStatus.CRCVerified | FileStatus.SHA1Verified | FileStatus.MD5Verified); + } + + private static void ChdManCheck(string directory, RvFile tFile) + { + string filename = Path.Combine(directory, tFile.Name); + + if (!tFile.FileStatusIs(FileStatus.SHA1CHDFromHeader)) return; + _bgw.ReportProgress(0, new bgwText2(filename)); + + string error; + CHD.CHDManCheck res = CHD.ChdmanCheck(filename, _bgw, out error); + switch (res) + { + case CHD.CHDManCheck.Good: + tFile.FileStatusSet(FileStatus.SHA1CHDVerified); + return; + case CHD.CHDManCheck.Corrupt: + _bgw.ReportProgress(0, new bgwShowError(error, filename)); + tFile.GotStatus = GotStatus.Corrupt; + return; + case CHD.CHDManCheck.CHDUnknownError: + _bgw.ReportProgress(0, new bgwShowError(error, filename)); + return; + case CHD.CHDManCheck.ChdmanNotFound: + return; + case CHD.CHDManCheck.CHDNotFound: + ReportError.Show("File: " + filename + " Error: Not Found scan Aborted."); + _fileErrorAbort = true; + return; + default: + ReportError.UnhandledExceptionHandler(error); + return; + } + } + } +} + diff --git a/ROMVault2/FindFixes.cs b/ROMVault2/FindFixes.cs new file mode 100644 index 0000000..9da0260 --- /dev/null +++ b/ROMVault2/FindFixes.cs @@ -0,0 +1,479 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Threading; +using ROMVault2.Properties; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2 +{ + + public static class FindFixes + { + private static BackgroundWorker _bgw; + + public static void ScanFiles(object sender, DoWorkEventArgs e) + { + try + { + _bgw = sender as BackgroundWorker; + if (_bgw == null) return; + + Program.SyncCont = e.Argument as SynchronizationContext; + if (Program.SyncCont == null) + { + _bgw = null; + return; + } + + _bgw.ReportProgress(0, new bgwText("Clearing DB Status")); + RepairStatus.ReportStatusReset(DB.DirTree); + + List lstRomTableSortedCRCSize; + List lstRomTableSortedSHA1CHD; + + _bgw.ReportProgress(0, new bgwText("Loading Rom List")); + DBHelper.GetSelectedFilesSortCRCSize(out lstRomTableSortedCRCSize); + DBHelper.GetSelectedFilesSortSHA1CHD(out lstRomTableSortedSHA1CHD); + + _bgw.ReportProgress(0, new bgwText("Scanning for Fixes")); + _bgw.ReportProgress(0, new bgwSetRange(lstRomTableSortedCRCSize.Count)); + + int romIndex0 = 0; + int romIndex1 = 1; + while (romIndex1 < lstRomTableSortedCRCSize.Count) + { + if (romIndex1 % 100 == 0) _bgw.ReportProgress(romIndex1); + + if (!ArrByte.bCompare(lstRomTableSortedCRCSize[romIndex0].CRC,lstRomTableSortedCRCSize[romIndex1].CRC) || lstRomTableSortedCRCSize[romIndex0].Size != lstRomTableSortedCRCSize[romIndex1].Size) + { + ListCheck(lstRomTableSortedCRCSize, romIndex0, romIndex1 - romIndex0); + romIndex0 = romIndex1; + } + romIndex1++; + } + + ListCheck(lstRomTableSortedCRCSize, romIndex0, romIndex1 - romIndex0); + + + + _bgw.ReportProgress(0, new bgwSetRange(lstRomTableSortedSHA1CHD.Count)); + + romIndex0 = 0; + romIndex1 = 1; + while (romIndex1 < lstRomTableSortedSHA1CHD.Count) + { + if (romIndex1 % 100 == 0) _bgw.ReportProgress(romIndex1); + + if (!ArrByte.bCompare(lstRomTableSortedSHA1CHD[romIndex0].SHA1CHD,lstRomTableSortedSHA1CHD[romIndex1].SHA1CHD) ) + { + ListCheckSHA1CHD(lstRomTableSortedSHA1CHD, romIndex0, romIndex1 - romIndex0); + romIndex0 = romIndex1; + } + romIndex1++; + } + + ListCheckSHA1CHD(lstRomTableSortedSHA1CHD, romIndex0, romIndex1 - romIndex0); + + + _bgw = null; + Program.SyncCont = null; + } + catch (Exception exc) + { + ReportError.UnhandledExceptionHandler(exc); + + if (_bgw != null) _bgw.ReportProgress(0, new bgwText("Updating Cache")); + DB.Write(); + if (_bgw != null) _bgw.ReportProgress(0, new bgwText("Complete")); + + _bgw = null; + Program.SyncCont = null; + } + } + + public static void ListCheck(List lstRomTableSortedCRC, int start, int length) + { + if (lstRomTableSortedCRC.Count == 0) + return; + + List missingFiles = new List(); // files we dont have that we need + + List correctFiles = new List(); // files we have that are in the correct place + List unNeededFiles = new List(); // files we have that are not in the correct place + List inToSortFiles = new List(); // files we have that are in tosort + List allGotFiles = new List(); // all files we have + + List corruptFiles = new List(); // corrupt files that we do not need, a corrupt file is missing if it is needed + + + // set the found status of this file + for (int iLoop = 0; iLoop < length; iLoop++) + { + RvFile tFile = lstRomTableSortedCRC[start + iLoop]; + + switch (tFile.RepStatus) + { + case RepStatus.UnScanned: + break; + case RepStatus.Missing: + missingFiles.Add(tFile); // these are checked in step 1 to fixes from the allGotFiles List. + break; + case RepStatus.Correct: + correctFiles.Add(tFile); + break; + case RepStatus.Corrupt: + if (tFile.DatStatus == DatStatus.InDatCollect) + missingFiles.Add(tFile); // corrupt files that are also InDatcollect are treated as missing files, and a fix should be found. + else + corruptFiles.Add(tFile); // all other corrupt files should be deleted or moved to tosort/corrupt + break; + case RepStatus.UnNeeded: + case RepStatus.Unknown: + unNeededFiles.Add(tFile); + break; + case RepStatus.NotCollected: + break; + case RepStatus.InToSort: + inToSortFiles.Add(tFile); + break; + case RepStatus.Ignore: + break; // Ignore File + default: + ReportError.SendAndShow(Resources.FindFixes_ListCheck_Unknown_test_status + tFile.DatFullName + Resources.Comma + tFile.DatStatus + Resources.Comma + tFile.RepStatus); + break; + + } + } + allGotFiles.AddRange(correctFiles); + allGotFiles.AddRange(unNeededFiles); + allGotFiles.AddRange(inToSortFiles); + + #region Step 1 Check the Missing files from the allGotFiles List. + // check to see if we can find any of the missing files in the gotFiles list. + // if we find them mark them as CanBeFixed, + // or if they are missing corrupt files set then as corruptCanBefixed + + foreach (RvFile missingFile in missingFiles) + { + if (DBHelper.IsZeroLengthFile(missingFile)) + { + missingFile.RepStatus = missingFile.RepStatus == RepStatus.Corrupt ? RepStatus.CorruptCanBeFixed : RepStatus.CanBeFixed; + continue; + } + + foreach (RvFile gotFile in allGotFiles) + { + if (!CheckIfMissingFileCanBeFixedByGotFile(missingFile, gotFile)) continue; + missingFile.RepStatus = missingFile.RepStatus == RepStatus.Corrupt ? RepStatus.CorruptCanBeFixed : RepStatus.CanBeFixed; + break; + } + if (missingFile.RepStatus == RepStatus.Corrupt) missingFile.RepStatus = RepStatus.MoveToCorrupt; + } + #endregion + + #region Step 2 Check all corrupt files. + // if we have a correct version of the corrupt file then the corrput file can just be deleted, + // otherwise if the corrupt file is not already in ToSort it should be moved out to ToSort. + + // we can only check corrupt files using the CRC from the ZIP header, as it is corrupt so we cannot get a correct SHA1 / MD5 to check with + + foreach (RvFile corruptFile in corruptFiles) + { + if (allGotFiles.Count>0) + corruptFile.RepStatus = RepStatus.Delete; + + if (corruptFile.RepStatus == RepStatus.Corrupt && corruptFile.DatStatus != DatStatus.InToSort) + corruptFile.RepStatus = RepStatus.MoveToCorrupt; + } + #endregion + + #region Step 3 Check if unNeeded files are needed for a fix, otherwise delete them or move them to tosort + foreach (RvFile unNeededFile in unNeededFiles) + { + /* + // check if we have a confirmed SHA1 / MD5 match of this file, and if we do we just mark this file to be deleted. + foreach (RvFile correctFile in correctFiles) + { + if (!FindSHA1MD5MatchingFiles(unNeededFile, correctFile)) continue; + unNeededFile.RepStatus = RepStatus.Delete; + break; + } + if (unNeededFile.RepStatus == RepStatus.Delete) continue; + */ + + if (DBHelper.IsZeroLengthFile(unNeededFile)) + { + unNeededFile.RepStatus = RepStatus.Delete; + continue; + } + + // check if the unNeededFile is needed to fix a missing file + foreach (RvFile missingFile in missingFiles) + { + if (!CheckIfMissingFileCanBeFixedByGotFile(missingFile, unNeededFile)) continue; + unNeededFile.RepStatus = RepStatus.NeededForFix; + break; + } + if (unNeededFile.RepStatus == RepStatus.NeededForFix) continue; + + // now that we know this file is not needed for a fix do a CRC only find against correct files to see if this file can be deleted. + foreach (RvFile correctFile in correctFiles) + { + if (!CheckIfGotfileAndMatchingFileAreFullMatches(unNeededFile, correctFile)) continue; + unNeededFile.RepStatus = RepStatus.Delete; + break; + } + if (unNeededFile.RepStatus == RepStatus.Delete) continue; + + // and finally see if the file is already in ToSort, and if it is deleted. + foreach (RvFile inToSortFile in inToSortFiles) + { + if (!CheckIfGotfileAndMatchingFileAreFullMatches(unNeededFile, inToSortFile)) continue; + unNeededFile.RepStatus = RepStatus.Delete; + break; + } + if (unNeededFile.RepStatus == RepStatus.Delete) continue; + + // otherwise move the file out to ToSort + unNeededFile.RepStatus = RepStatus.MoveToSort; + } + #endregion + + #region Step 4 Check if ToSort files are needed for a fix, otherwise delete them or leave them in tosort + foreach (RvFile inToSortFile in inToSortFiles) + { + /* + // check if we have a confirmed SHA1 / MD5 match of this file, and if we do we just mark this file to be deleted. + foreach (RvFile correctFile in correctFiles) + { + if (!FindSHA1MD5MatchingFiles(inToSortFile, correctFile)) continue; + inToSortFile.RepStatus = RepStatus.Delete; + break; + } + if (inToSortFile.RepStatus == RepStatus.Delete) continue; + */ + + // check if the ToSortFile is needed to fix a missing file + foreach (RvFile missingFile in missingFiles) + { + if (!CheckIfMissingFileCanBeFixedByGotFile(missingFile, inToSortFile)) continue; + inToSortFile.RepStatus = RepStatus.NeededForFix; + break; + } + if (inToSortFile.RepStatus == RepStatus.NeededForFix) continue; + + // now that we know this file is not needed for a fix do a CRC only find against correct files to see if this file can be deleted. + foreach (RvFile correctFile in correctFiles) + { + if (!CheckIfGotfileAndMatchingFileAreFullMatches(inToSortFile, correctFile)) continue; + inToSortFile.RepStatus = RepStatus.Delete; + break; + } + + // otherwise leave the file in ToSort + } + #endregion + + + //need to check here for roms that just need renamed inside the one ZIP + //this prevents Zips from self deadlocking + for (int iLoop0 = 0; iLoop0 < length; iLoop0++) + { + if (lstRomTableSortedCRC[start + iLoop0].RepStatus != RepStatus.NeededForFix) continue; + for (int iLoop1 = 0; iLoop1 < length; iLoop1++) + { + if (lstRomTableSortedCRC[start + iLoop1].RepStatus != RepStatus.CanBeFixed) continue; + + if (!CheckIfMissingFileCanBeFixedByGotFile(lstRomTableSortedCRC[start + iLoop1], lstRomTableSortedCRC[start + iLoop0])) continue; + + if (DBHelper.RomFromSameGame(lstRomTableSortedCRC[start + iLoop0], lstRomTableSortedCRC[start + iLoop1])) + lstRomTableSortedCRC[start + iLoop0].RepStatus = RepStatus.Rename; + } + } + + } + + // find fix files, if the gotFile has been fully scanned check the SHA1/MD5, if not then just return true as the CRC/Size is all we have to go on. + // this means that if the gotfile has not been fully scanned this will return true even with the source and destination SHA1/MD5 possibly different. + public static bool CheckIfMissingFileCanBeFixedByGotFile(RvFile missingFile, RvFile gotFile) + { + + if (missingFile.FileStatusIs(FileStatus.SHA1FromDAT) && gotFile.FileStatusIs(FileStatus.SHA1Verified) && !ArrByte.bCompare(missingFile.SHA1, gotFile.SHA1)) + return false; + if (missingFile.FileStatusIs(FileStatus.MD5FromDAT) && gotFile.FileStatusIs(FileStatus.MD5Verified) && !ArrByte.bCompare(missingFile.MD5, gotFile.MD5)) + return false; + + return true; + } + + + + private static bool CheckIfGotfileAndMatchingFileAreFullMatches(RvFile gotFile, RvFile matchingFile) + { + if (gotFile.FileStatusIs(FileStatus.SHA1Verified) && matchingFile.FileStatusIs(FileStatus.SHA1Verified) && !ArrByte.bCompare(gotFile.SHA1, matchingFile.SHA1)) + return false; + if (gotFile.FileStatusIs(FileStatus.MD5Verified) && matchingFile.FileStatusIs(FileStatus.MD5Verified) && !ArrByte.bCompare(gotFile.MD5, matchingFile.MD5)) + return false; + + return true; + } + + + private static void ListCheckSHA1CHD(List lstRomTableSortedSHA1CHD, int start, int length) + { + if (lstRomTableSortedSHA1CHD.Count == 0) + return; + + List missingFiles = new List(); // files we done have have that we need + + List correctFiles = new List(); // files we have that are in the correct place + List unNeededFiles = new List(); // files we have that are not in the correct place + List inToSortFiles = new List(); // files we have that are in tosort + List allGotFiles = new List(); // all files we have + + List corruptFiles = new List(); // corrupt files that we do not need, a corrupt file is missing if it is needed + + + // set the found status of this file + for (int iLoop = 0; iLoop < length; iLoop++) + { + RvFile tFile = lstRomTableSortedSHA1CHD[start + iLoop]; + + switch (tFile.RepStatus) + { + case RepStatus.Missing: + missingFiles.Add(tFile); // these are checked in step 1 to fixes from the allGotFiles List. + break; + case RepStatus.Correct: + correctFiles.Add(tFile); + break; + case RepStatus.Corrupt: + case RepStatus.MoveToCorrupt: + if (tFile.DatStatus == DatStatus.InDatCollect) + missingFiles.Add(tFile); // corrupt files that are also InDatcollect are treated as missing files, and a fix should be found. + else + corruptFiles.Add(tFile); // all other corrupt files should be deleted or moved to tosort/corrupt + break; + case RepStatus.UnNeeded: + case RepStatus.Unknown: + case RepStatus.MoveToSort: + case RepStatus.InToSort: + case RepStatus.Delete: + case RepStatus.NeededForFix: + case RepStatus.Rename: + if (tFile.IsInToSort) + inToSortFiles.Add(tFile); + else + unNeededFiles.Add(tFile); + break; + case RepStatus.NotCollected: + break; + case RepStatus.Ignore: + break; // Ignore File + + default: + ReportError.SendAndShow(Resources.FindFixes_ListCheck_Unknown_test_status + tFile.DatFullName + Resources.Comma + tFile.DatStatus + Resources.Comma + tFile.RepStatus); + break; + + } + } + allGotFiles.AddRange(correctFiles); + allGotFiles.AddRange(unNeededFiles); + allGotFiles.AddRange(inToSortFiles); + + + #region Step 1 Check the Missing files from the allGotFiles List. + // check to see if we can find any of the missing files in the gotFiles list. + // if we find them mark them as CanBeFixed, + + foreach (RvFile missingFile in missingFiles) + { + if (allGotFiles.Count>0) + missingFile.RepStatus = (missingFile.RepStatus == RepStatus.Corrupt) || (missingFile.RepStatus == RepStatus.MoveToCorrupt) ? RepStatus.CorruptCanBeFixed : RepStatus.CanBeFixed; + } + #endregion + + #region Step 2 Check all corrupt files. + // if we have a correct version of the corrupt file then the corrput file can just be deleted, + // otherwise if the corrupt file is not already in ToSort it should be moved out to ToSort. + + // we can only check corrupt files using the CRC from the ZIP header, as it is corrupt so we cannot get a correct SHA1 / MD5 to check with + + foreach (RvFile corruptFile in corruptFiles) + { + if (allGotFiles.Count > 0) + corruptFile.RepStatus = RepStatus.Delete; + + if (corruptFile.RepStatus == RepStatus.Corrupt && corruptFile.DatStatus != DatStatus.InToSort) + corruptFile.RepStatus = RepStatus.MoveToCorrupt; + } + #endregion + + + #region Step 3 Check if unNeeded files are needed for a fix, otherwise delete them or move them to tosort + foreach (RvFile unNeededFile in unNeededFiles) + { + // check if the unNeededFile is needed to fix a missing file + if (missingFiles.Count > 0) + { + unNeededFile.RepStatus = RepStatus.NeededForFix; + continue; + } + + // now that we know this file is not needed for a fix if we have a correct version of it, it can be deleted. + if (correctFiles.Count > 0) + { + // this probably should check its old state + if (unNeededFile.RepStatus!=RepStatus.NeededForFix) + unNeededFile.RepStatus = RepStatus.Delete; + continue; + } + + if (inToSortFiles.Count > 0) + { + if (unNeededFile.RepStatus != RepStatus.NeededForFix) + unNeededFile.RepStatus = RepStatus.Delete; + continue; + } + + // otherwise move the file out to ToSort + if (unNeededFile.RepStatus != RepStatus.NeededForFix) + unNeededFile.RepStatus = RepStatus.MoveToSort; + } + #endregion + + + #region Step 4 Check if ToSort files are needed for a fix, otherwise delete them or leave them in tosort + foreach (RvFile inToSortFile in inToSortFiles) + { + // check if the ToSortFile is needed to fix a missing file + if (missingFiles.Count > 0) + { + inToSortFile.RepStatus=RepStatus.NeededForFix; + continue; + } + + // now that we know this file is not needed for a fix do a CRC only find against correct files to see if this file can be deleted. + if (correctFiles.Count <= 0) continue; + + if (inToSortFile.RepStatus != RepStatus.NeededForFix) + inToSortFile.RepStatus = RepStatus.Delete; + + // otherwise leave the file in ToSort + } + #endregion + } + } + + + + +} diff --git a/ROMVault2/FixFileCopy.cs b/ROMVault2/FixFileCopy.cs new file mode 100644 index 0000000..027d427 --- /dev/null +++ b/ROMVault2/FixFileCopy.cs @@ -0,0 +1,675 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Security.Cryptography; +using ROMVault2.RvDB; +using ROMVault2.SupportedFiles; +using ROMVault2.SupportedFiles.Zip; +using ROMVault2.SupportedFiles.Zip.ZLib; +using ROMVault2.Utils; + +namespace ROMVault2 +{ + + public enum ReturnCode { Good, RescanNeeded, FindFixes, LogicError, FileSystemError, SourceCRCCheckSumError, SourceCheckSumError, DestinationCheckSumError, StartOver } + + + public static class FixFileCopy + { + private const int BufferSize = 4096 * 128; + private static byte[] _buffer; + + // This Function returns: + // Good : Everything Worked Correctly + // RescanNeeded : Something unexpectidly changed in the files, so Stop prompt user to rescan. + // LogicError : This Should never happen and is a logic problem in the code + // FileSystemError : Something is wrong with the files + + + /// + /// Performs the RomVault File Copy, with the source and destination being files or zipped files + /// + /// This is the file being copied, it may be a zipped file or a regular file system file + /// This is the zip file that is being writen to, if it is null a new zip file will be made if we are coping to a zip + /// This is the name of the .zip file to be made that will be created in zipFileOut + /// This is the actual output filename + /// if true then we will do a raw copy, this is so that we can copy corrupt zips + /// This is the returned error message if this copy fails + /// If we are SHA1/MD5 checking the source file for the first time, and it is different from what we expected the correct values for this file are returned in foundFile + /// ReturnCode.Good is the valid return code otherwire we have an error + + public static ReturnCode CopyFile(RvFile fileIn, ref ZipFile zipFileOut, string zipFilenameOut, RvFile fileOut, bool forceRaw, out string error, out RvFile foundFile) + { + foundFile = null; + error = ""; + + if (_buffer == null) + _buffer = new byte[BufferSize]; + + bool rawCopy = RawCopy(fileIn, fileOut, forceRaw); + + ulong streamSize = 0; + ushort compressionMethod = 8; + bool sourceTrrntzip = false; + + + ZipFile zipFileIn = null; + System.IO.Stream readStream = null; + + + bool isZeroLengthFile = DBHelper.IsZeroLengthFile(fileOut); + if (!isZeroLengthFile) + { + #region check that the in and out file match + if (fileOut.FileStatusIs(FileStatus.SizeFromDAT) && fileOut.Size != null && fileIn.Size != fileOut.Size) + { + error = "Source and destination Size does not match. Logic Error."; + return ReturnCode.LogicError; + } + if (fileOut.FileStatusIs(FileStatus.CRCFromDAT) && fileOut.CRC != null && !ArrByte.bCompare(fileIn.CRC, fileOut.CRC)) + { + error = "Source and destination CRC does not match. Logic Error."; + return ReturnCode.LogicError; + } + + if (fileOut.FileStatusIs(FileStatus.SHA1FromDAT) && fileIn.FileStatusIs(FileStatus.SHA1Verified)) + { + if (fileIn.SHA1 != null && fileOut.SHA1 != null && !ArrByte.bCompare(fileIn.SHA1, fileOut.SHA1)) + { + error = "Source and destination SHA1 does not match. Logic Error."; + return ReturnCode.LogicError; + } + } + if (fileOut.FileStatusIs(FileStatus.MD5CHDFromDAT) && fileIn.FileStatusIs(FileStatus.MD5Verified)) + { + if (fileIn.MD5 != null && fileOut.MD5 != null && !ArrByte.bCompare(fileIn.MD5, fileOut.MD5)) + { + error = "Source and destination SHA1 does not match. Logic Error."; + return ReturnCode.LogicError; + } + } + + #endregion + + #region Find and Check/Open Input Files + + if (fileIn.FileType == FileType.ZipFile) // Input is a ZipFile + { + RvDir zZipFileIn = fileIn.Parent; + if (zZipFileIn.FileType != FileType.Zip) + { + error = "Zip File Open but Source File is not a zip, Logic Error."; + return ReturnCode.LogicError; + } + + string fileNameIn = zZipFileIn.FullName; + + sourceTrrntzip = (zZipFileIn.ZipStatus & ZipStatus.TrrntZip) == ZipStatus.TrrntZip; + + //if (zZipFileIn.ZipFileType == RvZip.ZipType.Zip) + //{ + zipFileIn = new ZipFile(); + + ZipReturn zr1; + if (fileIn.ZipFileHeaderPosition != null) + zr1 = zipFileIn.ZipFileOpen(fileNameIn, zZipFileIn.TimeStamp, false); + else + zr1 = zipFileIn.ZipFileOpen(fileNameIn, zZipFileIn.TimeStamp, true); + switch (zr1) + { + case ZipReturn.ZipGood: + break; + case ZipReturn.ZipErrorFileNotFound: + error = "File not found, Rescan required before fixing " + fileIn.Name; + return ReturnCode.FileSystemError; + case ZipReturn.ZipErrorTimeStamp: + error = "File has changed, Rescan required before fixing " + fileIn.Name; + return ReturnCode.FileSystemError; + default: + error = "Error Open Zip" + zr1 + ", with File " + fileIn.DatFullName; + return ReturnCode.FileSystemError; + } + if (fileIn.ZipFileHeaderPosition != null) + zipFileIn.ZipFileOpenReadStreamQuick((ulong)fileIn.ZipFileHeaderPosition, rawCopy, out readStream, out streamSize, out compressionMethod); + else + zipFileIn.ZipFileOpenReadStream(fileIn.ZipFileIndex, rawCopy, out readStream, out streamSize, out compressionMethod); + } + else // Input is a regular file + { + string fileNameIn = fileIn.FullName; + if (!IO.File.Exists(fileNameIn)) + { + error = "Rescan needed, File Changed :" + fileNameIn; + return ReturnCode.RescanNeeded; + } + IO.FileInfo fileInInfo = new IO.FileInfo(fileNameIn); + if (fileInInfo.LastWriteTime != fileIn.TimeStamp) + { + error = "Rescan needed, File Changed :" + fileNameIn; + return ReturnCode.RescanNeeded; + } + int errorCode = IO.FileStream.OpenFileRead(fileNameIn, out readStream); + if (errorCode != 0) + { + error = new Win32Exception(errorCode).Message + ". " + fileNameIn; + return ReturnCode.FileSystemError; + } + if (fileIn.Size == null) + { + error = "Null File Size found in Fixing File :" + fileNameIn; + return ReturnCode.LogicError; + } + streamSize = (ulong)fileIn.Size; + if ((ulong)readStream.Length != streamSize) + { + error = "Rescan needed, File Length Changed :" + fileNameIn; + return ReturnCode.RescanNeeded; + } + } + #endregion + } + else + { + sourceTrrntzip = true; + } + + if (!rawCopy && (Settings.FixLevel == eFixLevel.TrrntZipLevel1 || Settings.FixLevel == eFixLevel.TrrntZipLevel2 || Settings.FixLevel == eFixLevel.TrrntZipLevel3)) + compressionMethod = 8; + + #region Find and Check/Open Output Files + + System.IO.Stream writeStream; + if (fileOut.FileType == FileType.ZipFile) + { + // if ZipFileOut == null then we have not open the output zip yet so open it from writing. + if (zipFileOut == null) + { + if (IO.Path.GetFileName(zipFilenameOut) == "__RomVault.tmp") + { + if (IO.File.Exists(zipFilenameOut)) + IO.File.Delete(zipFilenameOut); + } + else if (IO.File.Exists(zipFilenameOut)) + { + error = "Rescan needed, File Changed :" + zipFilenameOut; + return ReturnCode.RescanNeeded; + } + + zipFileOut = new ZipFile(); + ZipReturn zrf = zipFileOut.ZipFileCreate(zipFilenameOut); + if (zrf != ZipReturn.ZipGood) + { + error = "Error Opening Write Stream " + zrf; + return ReturnCode.FileSystemError; + } + } + else + { + if (zipFileOut.ZipOpen != ZipOpenType.OpenWrite) + { + error = "Output Zip File is not set to OpenWrite, Logic Error."; + return ReturnCode.LogicError; + } + + if (zipFileOut.ZipFilename != (new IO.FileInfo(zipFilenameOut).FullName)) + { + error = "Output Zip file has changed name from " + zipFileOut.ZipFilename + " to " + zipFilenameOut + ". Logic Error"; + return ReturnCode.LogicError; + } + } + + if (fileIn.Size == null) + { + error = "Null File Size found in Fixing File :" + fileIn.FullName; + return ReturnCode.LogicError; + } + ZipReturn zr = zipFileOut.ZipFileOpenWriteStream(rawCopy, sourceTrrntzip, fileOut.Name, (ulong)fileIn.Size, compressionMethod, out writeStream); + if (zr != ZipReturn.ZipGood) + { + error = "Error Opening Write Stream " + zr; + return ReturnCode.FileSystemError; + } + } + else + { + if (IO.File.Exists(zipFilenameOut) && fileOut.GotStatus != GotStatus.Corrupt) + { + error = "Rescan needed, File Changed :" + zipFilenameOut; + return ReturnCode.RescanNeeded; + } + int errorCode = IO.FileStream.OpenFileWrite(zipFilenameOut, out writeStream); + if (errorCode != 0) + { + error = new Win32Exception(errorCode).Message + ". " + zipFilenameOut; + return ReturnCode.FileSystemError; + } + } + #endregion + + byte[] bCRC; + byte[] bMD5 = null; + byte[] bSHA1 = null; + if (!isZeroLengthFile) + { + #region Do Data Tranfer + + CRC32Hash crc32 = null; + MD5 md5 = null; + SHA1 sha1 = null; + + if (!rawCopy) + { + crc32 = new CRC32Hash(); + md5 = MD5.Create(); + sha1 = SHA1.Create(); + } + + ulong sizetogo = streamSize; + + while (sizetogo > 0) + { + int sizenow = sizetogo > BufferSize ? BufferSize : (int)sizetogo; + + try + { + readStream.Read(_buffer, 0, sizenow); + } + catch (ZlibException) + { + if (fileIn.FileType == FileType.ZipFile && zipFileIn != null) + { + ZipReturn zr = zipFileIn.ZipFileCloseReadStream(); + if (zr != ZipReturn.ZipGood) + { + error = "Error Closing " + zr + " Stream :" + zipFileIn.Filename(fileIn.ReportIndex); + return ReturnCode.FileSystemError; + } + zipFileIn.ZipFileClose(); + + } + else + { + readStream.Close(); + } + + if (fileOut.FileType == FileType.ZipFile) + { + ZipReturn zr = zipFileOut.ZipFileCloseWriteStream(new byte[] { 0, 0, 0, 0 }); + if (zr != ZipReturn.ZipGood) + { + error = "Error Closing Stream " + zr; + return ReturnCode.FileSystemError; + } + zipFileOut.ZipFileRollBack(); + } + else + { + writeStream.Flush(); + writeStream.Close(); + IO.File.Delete(zipFilenameOut); + } + + error = "Error in Data Stream"; + return ReturnCode.SourceCRCCheckSumError; + } + catch (Exception e) + { + error = "Error reading Source File " + e.Message; + return ReturnCode.FileSystemError; + } + + if (!rawCopy) + { + crc32.TransformBlock(_buffer, 0, sizenow, null, 0); + md5.TransformBlock(_buffer, 0, sizenow, null, 0); + sha1.TransformBlock(_buffer, 0, sizenow, null, 0); + } + try + { + writeStream.Write(_buffer, 0, sizenow); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + error = "Error writing out file. " + Environment.NewLine + e.Message; + return ReturnCode.FileSystemError; + } + sizetogo = sizetogo - (ulong)sizenow; + } + writeStream.Flush(); + + #endregion + + #region Collect Checksums + + + // if we did a full copy then we just calculated all the checksums while doing the copy + if (!rawCopy) + { + + crc32.TransformFinalBlock(_buffer, 0, 0); + md5.TransformFinalBlock(_buffer, 0, 0); + sha1.TransformFinalBlock(_buffer, 0, 0); + + bCRC = crc32.Hash; + bMD5 = md5.Hash; + bSHA1 = sha1.Hash; + + } + // if we raw copied and the source file has been FileChecked then we can trust the checksums in the source file + else + { + bCRC = ArrByte.Copy(fileIn.CRC); + if (fileIn.FileStatusIs(FileStatus.MD5Verified)) bMD5 = ArrByte.Copy(fileIn.MD5); + if (fileIn.FileStatusIs(FileStatus.SHA1Verified)) bSHA1 = ArrByte.Copy(fileIn.SHA1); + } + + #endregion + + #region close the ReadStream + + if (fileIn.FileType == FileType.ZipFile && zipFileIn != null) + { + ZipReturn zr = zipFileIn.ZipFileCloseReadStream(); + if (zr != ZipReturn.ZipGood) + { + error = "Error Closing " + zr + " Stream :" + zipFileIn.Filename(fileIn.ReportIndex); + return ReturnCode.FileSystemError; + } + zipFileIn.ZipFileClose(); + } + else + { + readStream.Close(); + + //if (IO.File.Exists(tmpFilename)) + // IO.File.Delete(tmpFilename); + } + + #endregion + } + else + { + // Zero Length File (Directory in a Zip) + if (fileOut.FileType == FileType.ZipFile) + { + zipFileOut.ZipFileAddDirectory(); + } + bCRC = VarFix.CleanMD5SHA1("00000000", 8); + bMD5 = VarFix.CleanMD5SHA1("d41d8cd98f00b204e9800998ecf8427e", 32); + bSHA1 = VarFix.CleanMD5SHA1("da39a3ee5e6b4b0d3255bfef95601890afd80709", 40); + } + + + #region close the WriteStream + if (fileOut.FileType == FileType.ZipFile) + { + ZipReturn zr = zipFileOut.ZipFileCloseWriteStream(bCRC); + if (zr != ZipReturn.ZipGood) + { + error = "Error Closing Stream " + zr; + return ReturnCode.FileSystemError; + } + fileOut.ZipFileIndex = zipFileOut.LocalFilesCount() - 1; + fileOut.ZipFileHeaderPosition = zipFileOut.LocalHeader(fileOut.ZipFileIndex); + } + else + { + writeStream.Flush(); + writeStream.Close(); + IO.FileInfo fi = new IO.FileInfo(zipFilenameOut); + fileOut.TimeStamp = fi.LastWriteTime; + } + #endregion + + if (!isZeroLengthFile) + { + + if (!rawCopy) + { + if (!ArrByte.bCompare(bCRC, fileIn.CRC)) + { + fileIn.GotStatus = GotStatus.Corrupt; + error = "Source CRC does not match Source Data stream, corrupt Zip"; + + if (fileOut.FileType == FileType.ZipFile) + zipFileOut.ZipFileRollBack(); + else + IO.File.Delete(zipFilenameOut); + + return ReturnCode.SourceCRCCheckSumError; + } + + fileIn.FileStatusSet(FileStatus.CRCVerified | FileStatus.SizeVerified); + + bool sourceFailed = false; + + // check to see if we have a MD5 from the DAT file + if (fileIn.FileStatusIs(FileStatus.MD5FromDAT)) + { + if (fileIn.MD5 == null) + { + error = "Should have an filein MD5 from Dat but not found. Logic Error."; + return ReturnCode.LogicError; + } + + if (!ArrByte.bCompare(fileIn.MD5, bMD5)) + sourceFailed = true; + else + fileIn.FileStatusSet(FileStatus.MD5Verified); + } + // check to see if we have an MD5 (not from the DAT) so must be from previously scanning this file. + else if (fileIn.MD5 != null) + { + if (!ArrByte.bCompare(fileIn.MD5, bMD5)) + { + // if we had an MD5 from a preview scan and it now does not match, something has gone really bad. + error = "The MD5 found does not match a previously scanned MD5, this should not happen, unless something got corrupt."; + return ReturnCode.LogicError; + } + } + else // (FileIn.MD5 == null) + { + fileIn.MD5 = bMD5; + fileIn.FileStatusSet(FileStatus.MD5Verified); + } + + + // check to see if we have a SHA1 from the DAT file + if (fileIn.FileStatusIs(FileStatus.SHA1FromDAT)) + { + if (fileIn.SHA1 == null) + { + error = "Should have an filein SHA1 from Dat but not found. Logic Error."; + return ReturnCode.LogicError; + } + + if (!ArrByte.bCompare(fileIn.SHA1, bSHA1)) + sourceFailed = true; + else + fileIn.FileStatusSet(FileStatus.SHA1Verified); + } + // check to see if we have an SHA1 (not from the DAT) so must be from previously scanning this file. + else if (fileIn.SHA1 != null) + { + if (!ArrByte.bCompare(fileIn.SHA1, bSHA1)) + { + // if we had an SHA1 from a preview scan and it now does not match, something has gone really bad. + error = "The SHA1 found does not match a previously scanned SHA1, this should not happen, unless something got corrupt."; + return ReturnCode.LogicError; + } + } + else // (FileIn.SHA1 == null) + { + fileIn.SHA1 = bSHA1; + fileIn.FileStatusSet(FileStatus.SHA1Verified); + } + + + + + if (sourceFailed) + { + if (fileIn.FileType == FileType.ZipFile) + { + RvFile tZFile = new RvFile(FileType.ZipFile); + foundFile = tZFile; + tZFile.ZipFileIndex = fileIn.ZipFileIndex; + tZFile.ZipFileHeaderPosition = fileIn.ZipFileHeaderPosition; + } + else + { + foundFile = new RvFile(fileIn.FileType); + } + + foundFile.Name = fileIn.Name; + foundFile.Size = fileIn.Size; + foundFile.CRC = bCRC; + foundFile.MD5 = bMD5; + foundFile.SHA1 = bSHA1; + foundFile.TimeStamp = fileIn.TimeStamp; + foundFile.SetStatus(DatStatus.NotInDat, GotStatus.Got); + + foundFile.FileStatusSet(FileStatus.SizeVerified | FileStatus.CRCVerified | FileStatus.MD5Verified | FileStatus.SHA1Verified); + + if (fileOut.FileType == FileType.ZipFile) + zipFileOut.ZipFileRollBack(); + else + IO.File.Delete(zipFilenameOut); + + return ReturnCode.SourceCheckSumError; + } + } + } + + if (fileOut.FileType == FileType.ZipFile) + { + fileOut.FileStatusSet(FileStatus.SizeFromHeader | FileStatus.CRCFromHeader); + } + + if (fileOut.FileStatusIs(FileStatus.CRCFromDAT) && fileOut.CRC != null && !ArrByte.bCompare(fileOut.CRC, bCRC)) + { + //Rollback the file + if (fileOut.FileType == FileType.ZipFile) + zipFileOut.ZipFileRollBack(); + else + IO.File.Delete(zipFilenameOut); + + return ReturnCode.DestinationCheckSumError; + } + + fileOut.CRC = bCRC; + if (!rawCopy || fileIn.FileStatusIs(FileStatus.CRCVerified)) + fileOut.FileStatusSet(FileStatus.CRCVerified); + + + if (bSHA1 != null) + { + if (fileOut.FileStatusIs(FileStatus.SHA1FromDAT) && fileOut.SHA1 != null && !ArrByte.bCompare(fileOut.SHA1, bSHA1)) + { + //Rollback the file + if (fileOut.FileType == FileType.ZipFile) + zipFileOut.ZipFileRollBack(); + else + IO.File.Delete(zipFilenameOut); + + return ReturnCode.DestinationCheckSumError; + } + + fileOut.SHA1 = bSHA1; + fileOut.FileStatusSet(FileStatus.SHA1Verified); + } + + if (bMD5 != null) + { + if (fileOut.FileStatusIs(FileStatus.MD5FromDAT) && fileOut.MD5 != null && !ArrByte.bCompare(fileOut.MD5, bMD5)) + { + //Rollback the file + if (fileOut.FileType == FileType.ZipFile) + zipFileOut.ZipFileRollBack(); + else + IO.File.Delete(zipFilenameOut); + + return ReturnCode.DestinationCheckSumError; + } + fileOut.MD5 = bMD5; + fileOut.FileStatusSet(FileStatus.MD5Verified); + } + + if (fileIn.Size != null) + { + fileOut.Size = fileIn.Size; + fileOut.FileStatusSet(FileStatus.SizeVerified); + } + + + + if (fileIn.GotStatus == GotStatus.Corrupt) + fileOut.GotStatus = GotStatus.Corrupt; + else + fileOut.GotStatus = GotStatus.Got; // Changes RepStatus to Correct + + fileOut.FileStatusSet(FileStatus.SizeVerified); + + if (fileOut.SHA1CHD == null && fileIn.SHA1CHD != null) fileOut.SHA1CHD = fileIn.SHA1CHD; + if (fileOut.MD5CHD == null && fileIn.MD5CHD != null) fileOut.MD5CHD = fileIn.MD5CHD; + + + fileOut.CHDVersion = fileIn.CHDVersion; + + fileOut.FileStatusSet(FileStatus.SHA1CHDFromHeader | FileStatus.MD5CHDFromHeader | FileStatus.SHA1CHDVerified | FileStatus.MD5CHDVerified, fileIn); + + + return ReturnCode.Good; + + } + + //Raw Copy + // Returns True is a raw copy can be used + // Returns False is a full recompression is required + + private static bool RawCopy(RvFile fileIn, RvFile fileOut, bool forceRaw) + { + if (fileIn == null || fileOut == null) + return false; + + if ((fileIn.FileType != FileType.ZipFile) || (fileOut.FileType != FileType.ZipFile)) + return false; + + if (fileIn.Parent == null) + return false; + + if (forceRaw) return true; + + bool trrntzipped = (fileIn.Parent.ZipStatus & ZipStatus.TrrntZip) == ZipStatus.TrrntZip; + + bool deepchecked = fileIn.FileStatusIs(FileStatus.SHA1Verified) && fileIn.FileStatusIs(FileStatus.MD5Verified); + + switch (Settings.FixLevel) + { + case eFixLevel.TrrntZipLevel1: + return trrntzipped; + case eFixLevel.TrrntZipLevel2: + return trrntzipped && deepchecked; + case eFixLevel.TrrntZipLevel3: + return false; + + case eFixLevel.Level1: + return true; + case eFixLevel.Level2: + return deepchecked; + case eFixLevel.Level3: + return false; + } + + return false; + } + + } +} diff --git a/ROMVault2/FixFiles.cs b/ROMVault2/FixFiles.cs new file mode 100644 index 0000000..676db6a --- /dev/null +++ b/ROMVault2/FixFiles.cs @@ -0,0 +1,1850 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using ROMVault2.IO; +using System.Threading; +using ROMVault2.Properties; +using ROMVault2.RvDB; +using ROMVault2.SupportedFiles; +using ROMVault2.SupportedFiles.Zip; + +namespace ROMVault2 +{ + + public static class FixFiles + { + private static Stopwatch _cacheSaveTimer; + + private static string _error; + + +#if !NEWFINDFIX + private static List _lstRomTableSortedCRCSize; + private static List _lstRomTableSortedSHA1CHD; +#endif + private static List _processList; + + private static int _fixed; + private static int _reportedFixed; + + private static BackgroundWorker _bgw; + + private static void ReportProgress(object prog) + { + _bgw.ReportProgress(0, prog); + } + + public static void PerformFixes(object sender, DoWorkEventArgs e) + { + try + { + + _cacheSaveTimer = new Stopwatch(); + _cacheSaveTimer.Reset(); + if (Settings.CacheSaveTimerEnabled) + _cacheSaveTimer.Start(); + + _bgw = sender as BackgroundWorker; + if (_bgw == null) return; + + Program.SyncCont = e.Argument as SynchronizationContext; + if (Program.SyncCont == null) + { + _bgw = null; + return; + } + + ReportProgress(new bgwText("Fixing Files")); + + int totalFixes = 0; + _fixed = 0; + _reportedFixed = 0; + for (int i = 0; i < DB.DirTree.ChildCount; i++) + { + RvDir tdir = (RvDir)DB.DirTree.Child(i); + totalFixes += CountFixDir(tdir, tdir.Tree.Checked == RvTreeRow.TreeSelect.Selected); + } + ReportProgress(new bgwSetRange(totalFixes)); + +#if !NEWFINDFIX + + DBHelper.GetSelectedFilesSortCRCSize(out _lstRomTableSortedCRCSize); + DBHelper.GetSelectedFilesSortSHA1CHD(out _lstRomTableSortedSHA1CHD); + + ReportError.ReportList(_lstRomTableSortedCRCSize); +#endif + _processList = new List(); + + for (int i = 0; i < DB.DirTree.ChildCount; i++) + { + RvDir tdir = (RvDir)DB.DirTree.Child(i); + ReturnCode returnCode = FixDir(tdir, tdir.Tree.Checked == RvTreeRow.TreeSelect.Selected); + if (returnCode != ReturnCode.Good) + break; + + if (_bgw.CancellationPending) break; + } + +#if !NEWFINDFIX + _lstRomTableSortedCRCSize = null; + _lstRomTableSortedSHA1CHD = null; +#endif + + ReportProgress(new bgwText("Updating Cache")); + DB.Write(); + ReportProgress(new bgwText("Complete")); + + _bgw = null; + Program.SyncCont = null; + + } + catch (Exception exc) + { + ReportError.UnhandledExceptionHandler(exc); + + if (_bgw != null) ReportProgress(new bgwText("Updating Cache")); + DB.Write(); + if (_bgw != null) ReportProgress(new bgwText("Complete")); + + _bgw = null; + Program.SyncCont = null; + } + } + + private static int CountFixDir(RvDir dir, bool lastSelected) + { + int count = 0; + + bool thisSelected = lastSelected; + if (dir.Tree != null) + thisSelected = dir.Tree.Checked == RvTreeRow.TreeSelect.Selected; + + for (int j = 0; j < dir.ChildCount; j++) + { + RvBase child = dir.Child(j); + + switch (child.FileType) + { + case FileType.Zip: + if (!thisSelected) + continue; + RvDir tZip = (RvDir)child; + count += tZip.DirStatus.CountCanBeFixed(); + + break; + + case FileType.Dir: + + count += CountFixDir((RvDir)child, thisSelected); + break; + + case FileType.File: + if (!thisSelected) + continue; + if (child.RepStatus == RepStatus.CanBeFixed) + count++; + break; + } + } + return count; + } + + private static ReturnCode FixDir(RvDir dir, bool lastSelected) + { + Debug.WriteLine(dir.FullName); + bool thisSelected = lastSelected; + if (dir.Tree != null) + thisSelected = dir.Tree.Checked == RvTreeRow.TreeSelect.Selected; + + + List lstToProcess = new List(); + for (int j = 0; j < dir.ChildCount; j++) + lstToProcess.Add(dir.Child(j)); + + foreach (RvBase child in lstToProcess) + { + ReturnCode returnCode = FixBase(child, thisSelected); + if (returnCode != ReturnCode.Good) + return returnCode; + + while (_processList.Count > 0) + { + returnCode = FixBase(_processList[0], true); + if (returnCode != ReturnCode.Good) + return returnCode; + _processList.RemoveAt(0); + } + + if (_fixed != _reportedFixed) + { + ReportProgress(new bgwProgress(_fixed)); + _reportedFixed = _fixed; + } + if (_bgw.CancellationPending) break; + } + // here we check to see if the directory we just scanned should be deleted + CheckDeleteObject(dir); + return ReturnCode.Good; + } + + private static ReturnCode FixBase(RvBase child, bool thisSelected) + { + // skip any files that have already been deleted + if (child.RepStatus == RepStatus.Deleted) + return ReturnCode.Good; + + + if (_cacheSaveTimer.Elapsed.Minutes > Settings.CacheSaveTimePeriod) + { + ReportProgress("Saving Cache"); + DB.Write(); + ReportProgress("Saving Cache Complete"); + _cacheSaveTimer.Reset(); + _cacheSaveTimer.Start(); + } + + ReturnCode returnCode = ReturnCode.LogicError; + switch (child.FileType) + { + case FileType.Zip: + if (!thisSelected) + return ReturnCode.Good; + + if (!String.IsNullOrEmpty(child.FileName)) + { + string strDir = child.Parent.FullName; + File.Move(Path.Combine(strDir, child.FileName + ".zip"), Path.Combine(strDir, child.Name + ".zip")); + child.FileName = null; + } + + do + { + returnCode = FixZip((RvDir)child); + } while (returnCode == ReturnCode.StartOver); + break; + + case FileType.Dir: + if (thisSelected) + { + if (!String.IsNullOrEmpty(child.FileName)) + { + string strDir = child.Parent.FullName; + System.IO.Directory.Move(Path.Combine(strDir, child.FileName), Path.Combine(strDir, "__RomVault.tmpDir")); + Directory.Move(Path.Combine(strDir, "__RomVault.tmpDir"), Path.Combine(strDir, child.Name)); + child.FileName = null; + } + } + + returnCode = FixDir((RvDir)child, thisSelected); + return returnCode; + + case FileType.File: + if (!thisSelected) + return ReturnCode.Good; + + do + { + returnCode = FixFile((RvFile)child); + } while (returnCode == ReturnCode.StartOver); + break; + } + switch (returnCode) + { + case ReturnCode.Good: + // all good, move alone. + break; + case ReturnCode.RescanNeeded: + ReportError.Show(_error); + break; + case ReturnCode.LogicError: + ReportError.UnhandledExceptionHandler(_error); + break; + case ReturnCode.FileSystemError: + ReportError.Show(_error); + break; + case ReturnCode.FindFixes: + ReportError.Show("You Need to Find Fixes before Fixing. (Incorrect File Status's found for fixing.)"); + break; + default: + ReportError.UnhandledExceptionHandler(Resources.FixFiles_FixDirChildren_Unknown_result_type + returnCode); + break; + } + return returnCode; + + } + + + private static ReturnCode FixFile(RvFile fixFile) + { + switch (fixFile.RepStatus) + { + case RepStatus.Unknown: + return ReturnCode.FindFixes; + + + case RepStatus.UnScanned: + return ReturnCode.Good; + + case RepStatus.Missing: + // nothing can be done so moving right along + return ReturnCode.Good; + + + case RepStatus.Correct: + // this is correct nothing to be done here + FixFileCheckName(fixFile); + return ReturnCode.Good; + + + case RepStatus.NotCollected: + // this is correct nothing to be done here + return ReturnCode.Good; + + // Unknown + + case RepStatus.Ignore: + // this is correct nothing to be done here + return ReturnCode.Good; + + // Corrupt + + case RepStatus.InToSort: + // this is correct nothing to be done here + return ReturnCode.Good; + + + case RepStatus.Delete: + return FixFileDelete(fixFile); + + case RepStatus.MoveToSort: + return FixFileMoveToSort(fixFile); + + case RepStatus.MoveToCorrupt: + return FixFileMoveToCorrupt(fixFile); + + case RepStatus.CanBeFixed: + case RepStatus.CorruptCanBeFixed: + return FixFileCanBeFixed(fixFile); + + case RepStatus.NeededForFix: + // this file can be left as is, it will be used to fix a file, and then marked to be deleted. + return ReturnCode.Good; + + // this is for a corrupt CHD already in ToSort + case RepStatus.Corrupt: + return ReturnCode.Good; + + case RepStatus.Rename: + // this file will be used and mark to be deleted in the CanBeFixed + // so nothing to be done to it here + return ReturnCode.Good; + + + default: + ReportError.UnhandledExceptionHandler(Resources.FixFiles_FixFile_Unknown_fix_file_type + fixFile.RepStatus + " Dat Status = " + fixFile.DatStatus + " GotStatus " + fixFile.GotStatus); + return ReturnCode.LogicError; + } + } + + private static void FixFileCheckName(RvFile fixFile) + { + if (!String.IsNullOrEmpty(fixFile.FileName)) + { + string sourceFullName = Path.Combine(fixFile.Parent.FullName, fixFile.FileName); + if (!File.SetAttributes(sourceFullName, FileAttributes.Normal)) + { + int error = Error.GetLastError(); + ReportProgress(new bgwShowError(sourceFullName, "Error Setting File Attributes to Normal. Before Case correction Rename. Code " + error)); + ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Case correction Rename. Code" + error + " : " + sourceFullName); + } + + File.Move(sourceFullName, fixFile.FullName); + fixFile.FileName = null; + } + } + + private static ReturnCode FixFileDelete(RvFile fixFile) + { + ReturnCode retCode = DoubleCheckDelete(fixFile); + if (retCode != ReturnCode.Good) + return retCode; + + string filename = fixFile.FullName; + if (File.Exists(filename)) + { + if (!File.SetAttributes(filename, FileAttributes.Normal)) + { + int error = Error.GetLastError(); + ReportProgress(new bgwShowError(filename, "Error Setting File Attributes to Normal. Before Delete. Code " + error)); + ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Delete. Code " + error + " : " + filename); + } + File.Delete(filename); + } + // here we just deleted a file so also delete it from the DB, + // and recurse up deleting unnedded DIR's + CheckDeleteObject(fixFile); + return ReturnCode.Good; + } + + private static ReturnCode FixFileMoveToSort(RvFile fixFile) + { + string fixFileFullName = fixFile.FullName; + + string toSortFullName = Path.Combine(Settings.ToSort(), fixFile.Name); + string toSortFileName = fixFile.Name; + int fileC = 0; + while (File.Exists(toSortFullName)) + { + fileC++; + toSortFullName = Path.Combine(Settings.ToSort(), fixFile.Name + fileC); + toSortFileName = fixFile.Name + fileC; + } + + //create new tosort record + // FileInfo toSortFile = new FileInfo(toSortFullName); + RvFile toSortRom = new RvFile(FileType.File) + { + Name = toSortFileName, + Size = fixFile.Size, + CRC = fixFile.CRC, + //TimeStamp = toSortFile.LastWriteTime, + DatStatus = DatStatus.InToSort + }; + + ReportProgress(new bgwShowFix(Path.GetDirectoryName(fixFileFullName), "", Path.GetFileName(fixFileFullName), fixFile.Size, "-->", "ToSort", "", fixFile.Name)); + + ZipFile tempZipOut = null; + RvFile foundFile; + ReturnCode returnCode = FixFileCopy.CopyFile(fixFile, ref tempZipOut, toSortFullName, toSortRom, false, out _error, out foundFile); + switch (returnCode) + { + case ReturnCode.Good: // correct reply to continue; + break; + default: + return returnCode; + } + + string fixFilePath = fixFile.FullName; + if (!File.SetAttributes(fixFilePath, FileAttributes.Normal)) + { + int error = Error.GetLastError(); + ReportProgress(new bgwShowError(fixFilePath, "Error Setting File Attributes to Normal. Before Delete Moving ToSort. Code " + error)); + ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Delete Moving ToSort. Code " + error + " : " + fixFilePath); + } + File.Delete(fixFilePath); + + // here we just deleted a file so also delete it from the DB, + // and recurse up deleting unnedded DIR's + CheckDeleteObject(fixFile); + + RvDir toSort = (RvDir)DB.DirTree.Child(1); + toSort.ChildAdd(toSortRom); + + return ReturnCode.Good; + + } + + private static ReturnCode FixFileMoveToCorrupt(RvFile fixFile) + { + string corruptDir = Path.Combine(Settings.ToSort(), "Corrupt"); + if (!Directory.Exists(corruptDir)) + { + Directory.CreateDirectory(corruptDir); + } + + string fixFileFullName = fixFile.FullName; + + string toSortCorruptFullName = Path.Combine(corruptDir, fixFile.Name); + string toSortCorruptFileName = fixFile.Name; + int fileC = 0; + while (File.Exists(toSortCorruptFullName)) + { + fileC++; + toSortCorruptFileName = fixFile.Name + fileC; + toSortCorruptFullName = Path.Combine(corruptDir, toSortCorruptFileName); + } + + //create new tosort record + // FileInfo toSortCorruptFile = new FileInfo(toSortCorruptFullName); + RvFile toSortCorruptRom = new RvFile(FileType.File) + { + Name = toSortCorruptFileName, + Size = fixFile.Size, + CRC = fixFile.CRC, + //TimeStamp = toSortFile.LastWriteTime, + DatStatus = DatStatus.InToSort + }; + + _bgw.ReportProgress(0, new bgwShowFix(Path.GetDirectoryName(fixFileFullName), "", Path.GetFileName(fixFileFullName), fixFile.Size, "-->", "Corrupt", "", fixFile.Name)); + + ZipFile tempZipOut = null; + RvFile foundFile; + ReturnCode returnCode = FixFileCopy.CopyFile(fixFile, ref tempZipOut, toSortCorruptFullName, toSortCorruptRom, false, out _error, out foundFile); + switch (returnCode) + { + case ReturnCode.Good: // correct reply to continue; + break; + default: + return returnCode; + } + + string fixFilePath = fixFile.FullName; + if (!File.SetAttributes(fixFilePath, FileAttributes.Normal)) + { + int error = Error.GetLastError(); + _bgw.ReportProgress(0, new bgwShowError(fixFilePath, "Error Setting File Attributes to Normal. Before Delete Moving ToSort. Code " + error)); + ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Delete Moving ToSort. Code " + error + " : " + fixFilePath); + } + File.Delete(fixFilePath); + + // here we just deleted a file so also delete it from the DB, + // and recurse up deleting unnedded DIR's + CheckDeleteObject(fixFile); + + RvDir toSort = (RvDir)DB.DirTree.Child(1); + int indexcorrupt; + RvDir rvCorruptDir = new RvDir(FileType.Dir) { Name = "Corrupt", DatStatus = DatStatus.InToSort }; + int found = toSort.ChildNameSearch(rvCorruptDir, out indexcorrupt); + if (found != 0) + { + rvCorruptDir.GotStatus = GotStatus.Got; + indexcorrupt = toSort.ChildAdd(rvCorruptDir); + } + + ((RvDir)toSort.Child(indexcorrupt)).ChildAdd(toSortCorruptRom); + + return ReturnCode.Good; + } + + + private static ReturnCode FixFilePreCheckFixFile(RvFile fixFile) + { + string fileName = fixFile.FullName; + + // find all files in the DB with this name + // there could be another file if: + // there is a wrong file with the same name that can just be deleted + // there is a wrong file with the same name that needs moved to ToSort + // there is a wrong file with the same name that is needed to fix another file + List testList = new List(); + + RvDir parent = fixFile.Parent; + int index; + // start by finding the first file in the DB. (This should always work, as it will at least find the current file that CanBeFixed + if (parent.ChildNameSearch(fixFile, out index) != 0) + { + ReportError.Show("Logic error trying to find the file we are fixing " + fileName); + return ReturnCode.LogicError; + } + testList.Add(parent.Child(index++)); + + // now loop to see if there are any more files with the same name. (This is a case insensative compare) + while (index < parent.ChildCount && DBHelper.CompareName(fixFile, parent.Child(index)) == 0) + { + testList.Add(parent.Child(index)); + index++; + } + + // if we found more that one file in the DB then we need to process the incorrect file first. + if (testList.Count > 1) + { + foreach (RvBase testChild in testList) + { + if (testChild == fixFile) + continue; + + if (testChild.DatStatus != DatStatus.NotInDat) + { + ReportError.Show(Resources.FixFiles_FixFile_Trying_to_fix_a_file_that_already_exists + fileName); + return ReturnCode.LogicError; + } + + RvFile testFile = testChild as RvFile; + if (testFile == null) + { + ReportError.Show("Did not find a file logic error while fixing duplicate named file. in FixFile"); + return ReturnCode.LogicError; + } + + switch (testFile.RepStatus) + { + case RepStatus.Delete: + { + ReturnCode ret = FixFileDelete(testFile); + if (ret != ReturnCode.Good) + return ret; + break; + } + case RepStatus.MoveToSort: + { + ReturnCode ret = FixFileMoveToSort(testFile); + if (ret != ReturnCode.Good) + return ret; + break; + } + case RepStatus.MoveToCorrupt: + { + ReturnCode ret = FixFileMoveToCorrupt(testFile); + if (ret != ReturnCode.Good) + return ret; + break; + } + case RepStatus.NeededForFix: + case RepStatus.Rename: + { + // so now we have found the file with the same case insensative name and can rename it to something else to get it out of the way for now. + // need to check that the .tmp filename does not already exists. + File.SetAttributes(testChild.FullName, FileAttributes.Normal); + File.Move(testChild.FullName, testChild.FullName + ".tmp"); + + if (!parent.FindChild(testChild, out index)) + { + ReportError.Show("Unknown file status in Matching File found of " + testFile.RepStatus); + return ReturnCode.LogicError; + } + parent.ChildRemove(index); + testChild.Name = testChild.Name + ".tmp"; + parent.ChildAdd(testChild); + break; + } + default: + { + ReportError.Show("Unknown file status in Matching File found of " + testFile.RepStatus); + return ReturnCode.LogicError; + } + } + } + } + else + { + // if there is only one file in the DB then it must be the current file that CanBeFixed + if (testList[0] != fixFile) + { + ReportError.Show("Logic error trying to find the file we are fixing " + fileName + " DB found file does not match"); + return ReturnCode.LogicError; + } + } + return ReturnCode.Good; + } + + private static ReturnCode FixFileCanBeFixed(RvFile fixFile) + { + string fixFileFullName = fixFile.FullName; + CheckCreateParent(fixFile.Parent); + + // check to see if there is already a file with the name of the fixFile, and move it out the way. + ReturnCode rc = FixFilePreCheckFixFile(fixFile); + if (rc != ReturnCode.Good) + return rc; + + + // now we can fix the file. + ZipFile tempZipOut = null; + RvFile foundFile; + ReturnCode returnCode; + + if (DBHelper.IsZeroLengthFile(fixFile)) + { + RvFile fileIn = new RvFile(FileType.File); + returnCode = FixFileCopy.CopyFile(fileIn, ref tempZipOut, fixFile.FullName, fixFile, false, out _error, out foundFile); + + switch (returnCode) + { + case ReturnCode.Good: // correct reply to continue; + break; + default: + _error = fixFile.FullName + " " + fixFile.RepStatus + " " + returnCode + " : " + _error; + ReCheckFile(fixFile); + return ReturnCode.StartOver; + } + _fixed++; + return ReturnCode.Good; + } + +#if NEWFINDFIX + List lstFixRomTable = new List(); + List family = fixFile.MyFamily.Family; + for (int iFind = 0; iFind < family.Count; iFind++) + { + if (family[iFind].GotStatus == GotStatus.Got && FindFixes.CheckIfMissingFileCanBeFixedByGotFile(fixFile, family[iFind])) + lstFixRomTable.Add(family[iFind]); + } + RvFile fixingFile = lstFixRomTable[0]; +#else + + // search for the database for the file to be used to repair this file: + List lstFixRomTableCRC; + DBHelper.RomSearchFindFixes(fixFile, _lstRomTableSortedCRCSize, out lstFixRomTableCRC); + + List lstFixRomTableSHA1CHD; + DBHelper.RomSearchFindFixesSHA1CHD(fixFile, _lstRomTableSortedSHA1CHD, out lstFixRomTableSHA1CHD); + + if (lstFixRomTableCRC.Count == 0 && lstFixRomTableSHA1CHD.Count == 0) + { + // thought we could fix the file, turns out we cannot + fixFile.GotStatus = GotStatus.NotGot; + return ReturnCode.Good; + } + + RvFile fixingFile = + lstFixRomTableCRC.Count > 0 ? + lstFixRomTableCRC[0] : + lstFixRomTableSHA1CHD[0]; +#endif + string fts = fixingFile.FullName; + ReportProgress(new bgwShowFix(Path.GetDirectoryName(fixFileFullName), "", Path.GetFileName(fixFileFullName), fixFile.Size, "<--", Path.GetDirectoryName(fts), Path.GetFileName(fts), fixingFile.Name)); + + + + returnCode = FixFileCopy.CopyFile(fixingFile, ref tempZipOut, fixFile.FullName, fixFile, false, out _error, out foundFile); + + switch (returnCode) + { + case ReturnCode.Good: // correct reply to continue; + break; + + case ReturnCode.SourceCRCCheckSumError: + { + ReportProgress(new bgwShowFixError("CRC Error")); + // the file we used for fix turns out to be corrupt + + // mark the source file as Corrupt + fixingFile.GotStatus = GotStatus.Corrupt; + + // recheck for the fix + ReCheckFile(fixFile); + + CheckReprocess(fixingFile); + + // and go back one and try again. + return ReturnCode.StartOver; + } + + + case ReturnCode.SourceCheckSumError: + { + // the file we used for fix turns out not not match its own DAT's correct MD5/SHA1 + // (Problem with logic here is that it could still match the file being fixed, but this case is not correctly handled) + ReportProgress(new bgwShowFixError("Failed")); + + + // remove the file we thought we correctly had (The file that we where trying to use for the fix) + if (fixingFile.FileRemove() == EFile.Delete) + { + _error = "Should not mark for delete as it is in a DAT"; + return ReturnCode.LogicError; + } + + // possibly use a check here to see if the index of the found file is futher down the zip and so we can just contine + // instead of restarting. + + // add in the actual file we found + fixingFile.Parent.ChildAdd(foundFile); + AddFoundFile(foundFile); + + // recheck for the fix + ReCheckFile(fixFile); + + CheckReprocess(fixingFile); + + // and go back one and try again. + return ReturnCode.StartOver; + } + case ReturnCode.DestinationCheckSumError: + { + ReportProgress(new bgwShowFixError("Failed")); + + // recheck for the fix + ReCheckFile(fixFile); + return ReturnCode.StartOver; + } + default: + return returnCode; + } + + + CheckReprocessClearList(); + // Check the files that we found that where used to fix this file, and if they not listed as correct files, they can be set to be deleted. + +#if NEWFINDFIX + foreach (RvFile file in lstFixRomTable) + { + if (file.RepStatus != RepStatus.NeededForFix && file.RepStatus != RepStatus.Rename) continue; + file.RepStatus = RepStatus.Delete; + CheckReprocess(file, true); + } +#else + + foreach (RvFile file in lstFixRomTableCRC) + { + if (file.RepStatus != RepStatus.NeededForFix && file.RepStatus != RepStatus.Rename) continue; + file.RepStatus = RepStatus.Delete; + CheckReprocess(file, true); + } + foreach (RvFile file in lstFixRomTableSHA1CHD) + { + if (file.RepStatus != RepStatus.NeededForFix && file.RepStatus != RepStatus.Rename) continue; + file.RepStatus = RepStatus.Delete; + CheckReprocess(file, true); + } +#endif + CheckReprocessFinalCheck(); + + _fixed++; + + return ReturnCode.Good; + } + + + + private static ReturnCode FixZip(RvDir fixZip) + { + //Check for error status + if (fixZip.DirStatus.HasUnknown()) + return ReturnCode.FindFixes; // Error + + bool needsTrrntzipped = fixZip.ZipStatus != ZipStatus.TrrntZip && fixZip.GotStatus == GotStatus.Got && fixZip.DatStatus == DatStatus.InDatCollect && (Settings.FixLevel == eFixLevel.TrrntZipLevel1 || Settings.FixLevel == eFixLevel.TrrntZipLevel2 || Settings.FixLevel == eFixLevel.TrrntZipLevel3); + + // file corrupt and not in tosort + // if file cannot be fully fixed copy to corrupt + // process zipfile + + if (fixZip.GotStatus == GotStatus.Corrupt && fixZip.DatStatus != DatStatus.InToSort) + { + ReturnCode movReturnCode = MoveZiptoCorrupt(fixZip); + if (movReturnCode != ReturnCode.Good) + return movReturnCode; + } + + // has fixable + // process zipfile + + else if (fixZip.DirStatus.HasFixable()) + { + // do nothing here but continue on to process zip. + } + + // need trrntzipped + // process zipfile + + else if (needsTrrntzipped) + { + // do nothing here but continue on to process zip. + } + + + // got empty zip that should be deleted + // process zipfile + else if (fixZip.GotStatus == GotStatus.Got && fixZip.GotStatus != GotStatus.Corrupt && !fixZip.DirStatus.HasAnyFiles()) + { + // do nothing here but continue on to process zip. + } + + // else + // skip this zipfile + else + { + // nothing can be done to return + return ReturnCode.Good; + } + + + + string fixZipFullName = fixZip.TreeFullName; + + if (!fixZip.DirStatus.HasFixable() && needsTrrntzipped) + ReportProgress(new bgwShowFix(Path.GetDirectoryName(fixZipFullName), Path.GetFileName(fixZipFullName), "", 0, "TrrntZipping", "", "", "")); + + + CheckCreateParent(fixZip.Parent); + ReportError.LogOut(""); + ReportError.LogOut(fixZipFullName + " : " + fixZip.RepStatus); + ReportError.LogOut("------------------------------------------------------------"); + Debug.WriteLine(fixZipFullName + " : " + fixZip.RepStatus); + ReportError.LogOut("Zip File Status Before Fix:"); + for (int intLoop = 0; intLoop < fixZip.ChildCount; intLoop++) + ReportError.LogOut((RvFile)fixZip.Child(intLoop)); + ReportError.LogOut(""); + + ZipFile tempZipOut = null; + + ZipFile toSortCorruptOut = null; + ZipFile toSortZipOut = null; + + RvDir toSortGame = null; + RvDir toSortCorruptGame = null; + + ReturnCode returnCode; + List fixZipTemp = new List(); + + for (int iRom = 0; iRom < fixZip.ChildCount; iRom++) + { + RvFile zipFileFixing = new RvFile(FileType.ZipFile); + fixZip.Child(iRom).CopyTo(zipFileFixing); + + if (iRom == fixZipTemp.Count) + fixZipTemp.Add(zipFileFixing); + else + fixZipTemp[iRom] = zipFileFixing; + + ReportError.LogOut(zipFileFixing.RepStatus + " : " + fixZip.Child(iRom).FullName); + + switch (zipFileFixing.RepStatus) + { + #region Nothing to copy + // any file we do not have or do not want in the destination zip + case RepStatus.Missing: + case RepStatus.NotCollected: + case RepStatus.Rename: + case RepStatus.Delete: + if (! + ( + // got the file in the original zip but will be deleting it + (zipFileFixing.DatStatus == DatStatus.NotInDat && zipFileFixing.GotStatus == GotStatus.Got) || + (zipFileFixing.DatStatus == DatStatus.NotInDat && zipFileFixing.GotStatus == GotStatus.Corrupt) || + (zipFileFixing.DatStatus == DatStatus.InDatMerged && zipFileFixing.GotStatus == GotStatus.Got) || + (zipFileFixing.DatStatus == DatStatus.InToSort && zipFileFixing.GotStatus == GotStatus.Got) || + (zipFileFixing.DatStatus == DatStatus.InToSort && zipFileFixing.GotStatus == GotStatus.Corrupt) || + + // do not have this file and cannot fix it here + (zipFileFixing.DatStatus == DatStatus.InDatCollect && zipFileFixing.GotStatus == GotStatus.NotGot) || + (zipFileFixing.DatStatus == DatStatus.InDatBad && zipFileFixing.GotStatus == GotStatus.NotGot) || + (zipFileFixing.DatStatus == DatStatus.InDatMerged && zipFileFixing.GotStatus == GotStatus.NotGot) + ) + ) + ReportError.SendAndShow(Resources.FixFiles_FixZip_Error_in_Fix_Rom_Status + zipFileFixing.RepStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.DatStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.GotStatus); + + if (zipFileFixing.RepStatus == RepStatus.Delete) + { + returnCode = DoubleCheckDelete(zipFileFixing); + if (returnCode != ReturnCode.Good) + goto ZipOpenFailed; + } + + zipFileFixing.GotStatus = GotStatus.NotGot; + break; + #endregion + #region Copy from Original to Destination + // any files we are just moving from the original zip to the destination zip + case RepStatus.Correct: + case RepStatus.InToSort: + case RepStatus.NeededForFix: + case RepStatus.Corrupt: + { + if (! + ( + (zipFileFixing.DatStatus == DatStatus.InDatCollect && zipFileFixing.GotStatus == GotStatus.Got) || + (zipFileFixing.DatStatus == DatStatus.InDatMerged && zipFileFixing.GotStatus == GotStatus.Got) || + (zipFileFixing.DatStatus == DatStatus.NotInDat && zipFileFixing.GotStatus == GotStatus.Got) || + (zipFileFixing.DatStatus == DatStatus.InToSort && zipFileFixing.GotStatus == GotStatus.Got) || + (zipFileFixing.DatStatus == DatStatus.InToSort && zipFileFixing.GotStatus == GotStatus.Corrupt) + ) + ) + ReportError.SendAndShow(Resources.FixFiles_FixZip_Error_in_Fix_Rom_Status + zipFileFixing.RepStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.DatStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.GotStatus); + + RvFile foundFile; + + bool rawcopy = (zipFileFixing.RepStatus == RepStatus.InToSort) || (zipFileFixing.RepStatus == RepStatus.Corrupt); + // Correct rawcopy=false + // NeededForFix rawcopy=false + // InToSort rawcopy=true + // Corrupt rawcopy=true + RepStatus originalStatus = zipFileFixing.RepStatus; + + returnCode = FixFileCopy.CopyFile( + (RvFile)fixZip.Child(iRom), + ref tempZipOut, + Path.Combine(fixZip.Parent.FullName, "__RomVault.tmp"), + zipFileFixing, rawcopy, + out _error, out foundFile); + + switch (returnCode) + { + case ReturnCode.Good: // correct reply to continue; + if (originalStatus == RepStatus.NeededForFix) + zipFileFixing.RepStatus = RepStatus.NeededForFix; + break; + case ReturnCode.SourceCRCCheckSumError: + { + RvFile tFile = (RvFile)fixZip.Child(iRom); + tFile.GotStatus = GotStatus.Corrupt; + ReCheckFile(tFile); + + //decrease index so this file gets reprocessed + iRom--; + + continue; + } + case ReturnCode.SourceCheckSumError: + { + // Set the file in the zip that we thought we correctly had as missing + RvFile tFile = (RvFile)fixZip.Child(iRom); + if (tFile.FileRemove() == EFile.Delete) + { + _error = "Should not mark for delete as it is in a DAT"; + return ReturnCode.LogicError; + } + + // Add in at the current location the incorrect file. (This file will be reprocessed and then at some point deleted.) + fixZip.ChildAdd(foundFile, iRom); + AddFoundFile(foundFile); + + ReCheckFile(tFile); + + //decrease index so this file gets reprocessed + iRom--; + + continue; + } + // not needed as source and destination are the same + // case ReturnCode.DestinationCheckSumError: + default: + _error = zipFileFixing.FullName + " " + zipFileFixing.RepStatus + " " + returnCode + " : " + _error; + goto ZipOpenFailed; + } + } + break; + #endregion + + #region Case.CanBeFixed + case RepStatus.CanBeFixed: + case RepStatus.CorruptCanBeFixed: + { + if (!(zipFileFixing.DatStatus == DatStatus.InDatCollect && (zipFileFixing.GotStatus == GotStatus.NotGot || zipFileFixing.GotStatus == GotStatus.Corrupt))) + ReportError.SendAndShow(Resources.FixFiles_FixZip_Error_in_Fix_Rom_Status + zipFileFixing.RepStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.DatStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.GotStatus); + + ReportError.LogOut("Fixing File:"); + ReportError.LogOut(zipFileFixing); + + string strPath = fixZip.Parent.FullName; + string tempZipFilename = Path.Combine(strPath, "__RomVault.tmp"); + + + if (DBHelper.IsZeroLengthFile(zipFileFixing)) + { + RvFile fileIn = new RvFile(FileType.ZipFile) { Size = 0 }; + RvFile foundFile; + returnCode = FixFileCopy.CopyFile(fileIn, ref tempZipOut, tempZipFilename, zipFileFixing, false, out _error, out foundFile); + + switch (returnCode) + { + case ReturnCode.Good: // correct reply to continue; + break; + default: + _error = zipFileFixing.FullName + " " + zipFileFixing.RepStatus + " " + returnCode + " : " + _error; + goto ZipOpenFailed; + } + break; + } + +#if NEWFINDFIX + List lstFixRomTable = new List(); + List family = zipFileFixing.MyFamily.Family; + for (int iFind = 0; iFind < family.Count; iFind++) + { + if (family[iFind].GotStatus == GotStatus.Got && FindFixes.CheckIfMissingFileCanBeFixedByGotFile(zipFileFixing, family[iFind])) + lstFixRomTable.Add(family[iFind]); + } +#else + List lstFixRomTable; + DBHelper.RomSearchFindFixes(zipFileFixing, _lstRomTableSortedCRCSize, out lstFixRomTable); +#endif + + ReportError.LogOut("Found Files To use for Fixes:"); + foreach (RvFile t in lstFixRomTable) + ReportError.LogOut(t); + + if (lstFixRomTable.Count > 0) + { + + string ts = lstFixRomTable[0].Parent.FullName; + string sourceDir; + string sourceFile; + if (lstFixRomTable[0].FileType == FileType.ZipFile) + { + sourceDir = Path.GetDirectoryName(ts); + sourceFile = Path.GetFileName(ts); + } + else + { + sourceDir = ts; + sourceFile = ""; + } + ReportProgress(new bgwShowFix(Path.GetDirectoryName(fixZipFullName), Path.GetFileName(fixZipFullName), zipFileFixing.Name, zipFileFixing.Size, "<--", sourceDir, sourceFile, lstFixRomTable[0].Name)); + + RvFile foundFile; + returnCode = FixFileCopy.CopyFile(lstFixRomTable[0], ref tempZipOut, tempZipFilename, zipFileFixing, false, out _error, out foundFile); + switch (returnCode) + { + case ReturnCode.Good: // correct reply so continue; + break; + + case ReturnCode.SourceCRCCheckSumError: + { + ReportProgress(new bgwShowFixError("CRC Error")); + // the file we used for fix turns out to be corrupt + + RvFile tFile = (RvFile)fixZip.Child(iRom); + + // mark the source file as Corrupt + lstFixRomTable[0].GotStatus = GotStatus.Corrupt; + + // recheck for the fix + ReCheckFile(tFile); + + // if the file being used from the fix is actually from this file then we have a big mess, and we are just going to + // start over on this zip. + if (lstFixRomTable[0].Parent == fixZip) + { + returnCode = ReturnCode.StartOver; + goto ZipOpenFailed; + } + + // add the fixing source zip into the processList so that it is also reprocessed and we just changed it. + if (!_processList.Contains(lstFixRomTable[0].Parent)) + _processList.Add(lstFixRomTable[0].Parent); + + // and go back one and try again. + iRom--; + continue; + } + + + case ReturnCode.SourceCheckSumError: + { + ReportProgress(new bgwShowFixError("Failed")); + // the file we used for fix turns out not not match its own DAT's correct MD5/SHA1 + // (Problem with logic here is that it could still match the file being fixed, but this case is not correctly handled) + + RvFile tFile = (RvFile)fixZip.Child(iRom); + + // remove the file we thought we correctly had (The file that we where trying to use for the fix) + if (lstFixRomTable[0].FileRemove() == EFile.Delete) + { + _error = "Should not mark for delete as it is in a DAT"; + return ReturnCode.LogicError; + } + + // possibly use a check here to see if the index of the found file is futher down the zip and so we can just contine + // instead of restarting. + + // add in the actual file we found + lstFixRomTable[0].Parent.ChildAdd(foundFile); + AddFoundFile(foundFile); + + // recheck for the fix + ReCheckFile(tFile); + + // if the file being used from the fix is actually from this file then we have a big mess, and we are just going to + // start over on this zip. + if (lstFixRomTable[0].Parent == fixZip) + { + returnCode = ReturnCode.StartOver; + goto ZipOpenFailed; + } + + // add the fixing source zip into the processList so that it is also reprocessed and we just changed it. + if (!_processList.Contains(lstFixRomTable[0].Parent)) + _processList.Add(lstFixRomTable[0].Parent); + + // and go back one and try again. + iRom--; + continue; + } + case ReturnCode.DestinationCheckSumError: + { + ReportProgress(new bgwShowFixError("Failed")); + // the file we used for fix turns out not to have the correct MD5/SHA1 + RvFile tFile = (RvFile)fixZip.Child(iRom); + + // recheck for the fix + ReCheckFile(tFile); + + // if the file being used from the fix is actually from this file then we have a big mess, and we are just going to + // start over on this zip. + // The need for this is that the file being pulled in from inside this zip will be marked as Rename + // and so would then automatically be deleted, in the case this exception happens, this source file instead + // should be set to move to tosort. + if (lstFixRomTable[0].Parent == fixZip) + { + returnCode = ReturnCode.StartOver; + goto ZipOpenFailed; + } + + // and go back one and try again. + iRom--; + continue; + } + default: + //_error = zipFileFixing.FullName + " " + zipFileFixing.RepStatus + " " + returnCode + Environment.NewLine + _error; + goto ZipOpenFailed; + } + + //Check to see if the files used for fix, can now be set to delete + CheckReprocessClearList(); + + foreach (RvFile tFixRom in lstFixRomTable) + { + if (tFixRom.RepStatus == RepStatus.NeededForFix) + { + tFixRom.RepStatus = RepStatus.Delete; + ReportError.LogOut("Setting File Status to Delete:"); + ReportError.LogOut(tFixRom); + CheckReprocess(tFixRom, true); + } + } + CheckReprocessFinalCheck(); + + _fixed++; + } + else + // thought we could fix it, turns out we cannot + zipFileFixing.GotStatus = GotStatus.NotGot; + } + break; + #endregion + #region Case.MoveToSort + case RepStatus.MoveToSort: + { + if (!(zipFileFixing.DatStatus == DatStatus.NotInDat && zipFileFixing.GotStatus == GotStatus.Got)) + ReportError.SendAndShow(Resources.FixFiles_FixZip_Error_in_Fix_Rom_Status + zipFileFixing.RepStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.DatStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.GotStatus); + + ReportError.LogOut("Moving File out to ToSort:"); + ReportError.LogOut(zipFileFixing); + // move the rom out to the To Sort Directory + + if (toSortGame == null) + { + string toSortFullName = Path.Combine(Settings.ToSort(), fixZip.Name + ".zip"); + string toSortFileName = fixZip.Name; + int fileC = 0; + while (File.Exists(toSortFullName)) + { + fileC++; + toSortFullName = Path.Combine(Settings.ToSort(), fixZip.Name + fileC + ".zip"); + toSortFileName = fixZip.Name + fileC; + } + + toSortGame = new RvDir(FileType.Zip) + { + Name = toSortFileName, + DatStatus = DatStatus.InToSort, + GotStatus = GotStatus.Got + }; + } + + RvFile toSortRom = new RvFile(FileType.ZipFile) + { + Name = zipFileFixing.Name, + Size = zipFileFixing.Size, + CRC = zipFileFixing.CRC, + SHA1 = zipFileFixing.SHA1, + MD5 = zipFileFixing.MD5 + }; + toSortRom.SetStatus(DatStatus.InToSort, GotStatus.Got); + toSortRom.FileStatusSet( + FileStatus.SizeFromHeader | FileStatus.SizeVerified | + FileStatus.CRCFromHeader | FileStatus.CRCVerified | + FileStatus.SHA1FromHeader | FileStatus.SHA1Verified | + FileStatus.MD5FromHeader | FileStatus.MD5Verified + , zipFileFixing); + + toSortGame.ChildAdd(toSortRom); + + string destination = Path.Combine(Settings.ToSort(), toSortGame.Name + ".zip"); + ReportProgress(new bgwShowFix(Path.GetDirectoryName(fixZipFullName), Path.GetFileName(fixZipFullName), zipFileFixing.Name, zipFileFixing.Size, "-->", "ToSort", Path.GetFileName(destination), toSortRom.Name)); + + RvFile foundFile; + returnCode = FixFileCopy.CopyFile((RvFile)fixZip.Child(iRom), ref toSortZipOut, destination, toSortRom, true, out _error, out foundFile); + switch (returnCode) + { + case ReturnCode.Good: // correct reply to continue; + break; + //raw copying so Checksums are not checked + //case ReturnCode.SourceCRCCheckSumError: + //case ReturnCode.SourceCheckSumError: + //case ReturnCode.DestinationCheckSumError: + default: + _error = zipFileFixing.FullName + " " + zipFileFixing.RepStatus + " " + returnCode + " : " + _error; + goto ZipOpenFailed; + } + zipFileFixing.GotStatus = GotStatus.NotGot; // Changes RepStatus to Deleted + } + break; + #endregion + #region Case.MoveToCorrupt + case RepStatus.MoveToCorrupt: + { + if (!((zipFileFixing.DatStatus == DatStatus.InDatCollect || zipFileFixing.DatStatus == DatStatus.NotInDat) && zipFileFixing.GotStatus == GotStatus.Corrupt)) + ReportError.SendAndShow(Resources.FixFiles_FixZip_Error_in_Fix_Rom_Status + zipFileFixing.RepStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.DatStatus + Resources.FixFiles_FixZip_Colon + zipFileFixing.GotStatus); + + ReportError.LogOut("Moving File to Corrupt"); + ReportError.LogOut(zipFileFixing); + + string toSortFullName; + if (toSortCorruptGame == null) + { + string corruptDir = Path.Combine(Settings.ToSort(), "Corrupt"); + if (!Directory.Exists(corruptDir)) + { + Directory.CreateDirectory(corruptDir); + } + + toSortFullName = Path.Combine(corruptDir, fixZip.Name + ".zip"); + string toSortFileName = fixZip.Name; + int fileC = 0; + while (File.Exists(toSortFullName)) + { + fileC++; + toSortFullName = Path.Combine(corruptDir, fixZip.Name + fileC + ".zip"); + toSortFileName = fixZip.Name + fileC; + } + + toSortCorruptGame = new RvDir(FileType.Zip) + { + Name = toSortFileName, + DatStatus = DatStatus.InToSort, + GotStatus = GotStatus.Got + }; + } + else + { + string corruptDir = Path.Combine(Settings.ToSort(), "Corrupt"); + toSortFullName = Path.Combine(corruptDir, toSortCorruptGame.Name + ".zip"); + } + + RvFile toSortCorruptRom = new RvFile(FileType.ZipFile) + { + Name = zipFileFixing.Name, + Size = zipFileFixing.Size, + CRC = zipFileFixing.CRC + }; + toSortCorruptRom.SetStatus(DatStatus.InToSort, GotStatus.Corrupt); + toSortCorruptGame.ChildAdd(toSortCorruptRom); + + ReportProgress(new bgwShowFix(Path.GetDirectoryName(fixZipFullName), Path.GetFileName(fixZipFullName), zipFileFixing.Name, zipFileFixing.Size, "-->", "Corrupt", Path.GetFileName(toSortFullName), zipFileFixing.Name)); + + RvFile foundFile; + returnCode = FixFileCopy.CopyFile((RvFile)fixZip.Child(iRom), ref toSortCorruptOut, toSortFullName, toSortCorruptRom, true, out _error, out foundFile); + switch (returnCode) + { + case ReturnCode.Good: // correct reply to continue; + break; + + // doing a raw copy so not needed + // case ReturnCode.SourceCRCCheckSumError: + // case ReturnCode.SourceCheckSumError: + // case ReturnCode.DestinationCheckSumError: + default: + _error = zipFileFixing.FullName + " " + zipFileFixing.RepStatus + " " + returnCode + " : " + _error; + goto ZipOpenFailed; + } + zipFileFixing.GotStatus = GotStatus.NotGot; + } + break; + #endregion + default: + + + + ReportError.UnhandledExceptionHandler("Unknown file status found " + zipFileFixing.RepStatus + " while fixing file " + fixZip.Name + " Dat Status = " + zipFileFixing.DatStatus + " GotStatus " + zipFileFixing.GotStatus); + break; + } + } + + + #region if ToSort Zip Made then close the zip and add this new zip to the Database + if (toSortGame != null) + { + toSortZipOut.ZipFileClose(); + + toSortGame.TimeStamp = toSortZipOut.TimeStamp; + toSortGame.DatStatus = DatStatus.InToSort; + toSortGame.GotStatus = GotStatus.Got; + toSortGame.ZipStatus = toSortZipOut.ZipStatus; + + RvDir toSort = (RvDir)DB.DirTree.Child(1); + toSort.ChildAdd(toSortGame); + } + #endregion + + #region if Corrupt Zip Made then close the zip and add this new zip to the Database + if (toSortCorruptGame != null) + { + toSortCorruptOut.ZipFileClose(); + + toSortCorruptGame.TimeStamp = toSortCorruptOut.TimeStamp; + toSortCorruptGame.DatStatus = DatStatus.InToSort; + toSortCorruptGame.GotStatus = GotStatus.Got; + + RvDir toSort = (RvDir)DB.DirTree.Child(1); + int indexcorrupt; + RvDir corruptDir = new RvDir(FileType.Dir) { Name = "Corrupt", DatStatus = DatStatus.InToSort }; + int found = toSort.ChildNameSearch(corruptDir, out indexcorrupt); + if (found != 0) + { + corruptDir.GotStatus = GotStatus.Got; + indexcorrupt = toSort.ChildAdd(corruptDir); + } + ((RvDir)toSort.Child(indexcorrupt)).ChildAdd(toSortCorruptGame); + } + #endregion + + + + #region Process original Zip + string filename = fixZip.FullName; + if (File.Exists(filename)) + { + if (!File.SetAttributes(filename, FileAttributes.Normal)) + { + int error = Error.GetLastError(); + ReportProgress(new bgwShowError(filename, "Error Setting File Attributes to Normal. Deleting Original Fix File. Code " + error)); + ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Deleting Original Fix File. Code " + error + " : " + filename); + } + try + { + File.Delete(filename); + } + catch (Exception) + { + int error = Error.GetLastError(); + _error = "Error While trying to delete file " + filename + ". Code " + error; + ReportError.SendErrorMessage("Error While trying to delete file. Code " + error + " : " + filename); + + if (tempZipOut != null && tempZipOut.ZipOpen != ZipOpenType.Closed) + tempZipOut.ZipFileClose(); + + return ReturnCode.RescanNeeded; + } + + } + #endregion + + bool checkDelete = false; + #region process the temp Zip rename it to the original Zip + if (tempZipOut != null && tempZipOut.ZipOpen != ZipOpenType.Closed) + { + string tempFilename = tempZipOut.ZipFilename; + tempZipOut.ZipFileClose(); + + if (tempZipOut.LocalFilesCount() > 0) + { + // now rename the temp fix file to the correct filename + File.Move(tempFilename, filename); + FileInfo nFile = new FileInfo(filename); + RvDir tmpZip = new RvDir(FileType.Zip) + { + Name = Path.GetFileNameWithoutExtension(filename), + TimeStamp = nFile.LastWriteTime + }; + tmpZip.SetStatus(fixZip.DatStatus, GotStatus.Got); + + fixZip.FileAdd(tmpZip); + fixZip.ZipStatus = tempZipOut.ZipStatus; + } + else + { + File.Delete(tempFilename); + checkDelete = true; + } + } + else + checkDelete = true; + #endregion + + #region Now put the New Game Status information into the Database. + int intLoopFix = 0; + foreach (RvFile tmpZip in fixZipTemp) + { + tmpZip.CopyTo(fixZip.Child(intLoopFix)); + + if (fixZip.Child(intLoopFix).RepStatus == RepStatus.Deleted) + if (fixZip.Child(intLoopFix).FileRemove() == EFile.Delete) + { + fixZip.ChildRemove(intLoopFix); + continue; + } + + intLoopFix++; + } + #endregion + + if (checkDelete) + CheckDeleteObject(fixZip); + + ReportError.LogOut(""); + ReportError.LogOut("Zip File Status After Fix:"); + for (int intLoop = 0; intLoop < fixZip.ChildCount; intLoop++) + ReportError.LogOut((RvFile)fixZip.Child(intLoop)); + ReportError.LogOut(""); + + return ReturnCode.Good; + + + ZipOpenFailed: + if (tempZipOut != null) tempZipOut.ZipFileCloseFailed(); + if (toSortZipOut != null) toSortZipOut.ZipFileCloseFailed(); + if (toSortCorruptOut != null) toSortCorruptOut.ZipFileCloseFailed(); + return returnCode; + + } + + private static void AddFoundFile(RvFile foundFile) + { + if ((foundFile.Size == null || foundFile.CRC == null) && foundFile.Size != 0) return; + + int intIndex; + int intRes = DBHelper.RomSearchCRCSize(foundFile, _lstRomTableSortedCRCSize, out intIndex); + if (intRes == 0) + _lstRomTableSortedCRCSize.Insert(intIndex, foundFile); + } + + private static void ReCheckFile(RvFile searchFile) + { +#if NEWFINDFIX + FindFixesNew.ListCheck(searchFile.MyFamily); +#else + int index; + int length; + + DBHelper.RomSearchFindMatchingFiles(searchFile, _lstRomTableSortedCRCSize, out index, out length); + + for (int i = index; i < index + length; i++) + _lstRomTableSortedCRCSize[i].RepStatusReset(); + + FindFixes.ListCheck(_lstRomTableSortedCRCSize, index, length); +#endif + } + + private static ReturnCode DoubleCheckDelete(RvFile fileDeleting) + { + if (!Settings.DoubleCheckDelete) + return ReturnCode.Good; + + + ReportError.LogOut("Double Check deleting file "); + ReportError.LogOut(fileDeleting); + + if (DBHelper.IsZeroLengthFile(fileDeleting)) + return ReturnCode.Good; + +#if NEWFINDFIX + List lstFixRomTable = new List(); + List family = fileDeleting.MyFamily.Family; + for (int iFind = 0; iFind < family.Count; iFind++) + { + if (family[iFind].GotStatus == GotStatus.Got && FindFixes.CheckIfMissingFileCanBeFixedByGotFile(fileDeleting, family[iFind])) + lstFixRomTable.Add(family[iFind]); + } +#else + List lstFixRomTableCRCSize; + List lstFixRomTableSHA1CHD; + + DBHelper.RomSearchFindFixes(fileDeleting, _lstRomTableSortedCRCSize, out lstFixRomTableCRCSize); + DBHelper.RomSearchFindFixesSHA1CHD(fileDeleting, _lstRomTableSortedSHA1CHD, out lstFixRomTableSHA1CHD); + + List lstFixRomTable = new List(); + lstFixRomTable.AddRange(lstFixRomTableCRCSize); + lstFixRomTable.AddRange(lstFixRomTableSHA1CHD); +#endif + RvFile fileToCheck = null; + int i = 0; + while (i < lstFixRomTable.Count && fileToCheck == null) + { + + switch (lstFixRomTable[i].RepStatus) + { + case RepStatus.Delete: + i++; + break; + case RepStatus.Correct: + case RepStatus.InToSort: + case RepStatus.Rename: + case RepStatus.NeededForFix: + case RepStatus.MoveToSort: + case RepStatus.Ignore: + fileToCheck = lstFixRomTable[i]; + break; + default: + + ReportError.LogOut("Double Check Delete Error Unknown " + lstFixRomTable[i].FullName + " " + lstFixRomTable[i].RepStatus); + ReportError.UnhandledExceptionHandler("Unknown double check delete status " + lstFixRomTable[i].RepStatus); + break; + } + } + //ReportError.LogOut("Found Files when double check deleting"); + //foreach (RvFile t in lstFixRomTable) + // ReportError.LogOut(t); + + if (fileToCheck == null) + { + ReportError.UnhandledExceptionHandler("Double Check Delete could not find the correct file. (" + fileDeleting.FullName + ")"); + //this line of code never gets called because the above line terminates the program. + return ReturnCode.LogicError; + } + + //if it is a file then + // check it exists and the filestamp matches + //if it is a ZipFile then + // check the parent zip exists and the filestamp matches + + switch (fileToCheck.FileType) + { + case FileType.ZipFile: + { + string fullPathCheckDelete = fileToCheck.Parent.FullName; + if (!File.Exists(fullPathCheckDelete)) + { + _error = "Deleting " + fileDeleting.FullName + " Correct file not found. Resan for " + fullPathCheckDelete; + return ReturnCode.RescanNeeded; + } + FileInfo fi = new FileInfo(fullPathCheckDelete); + if (fi.LastWriteTime != fileToCheck.Parent.TimeStamp) + { + _error = "Deleting " + fileDeleting.FullName + " Correct file timestamp not found. Resan for " + fileToCheck.FullName; + return ReturnCode.RescanNeeded; + } + break; + } + case FileType.File: + { + string fullPathCheckDelete = fileToCheck.FullName; + if (!File.Exists(fullPathCheckDelete)) + { + _error = "Deleting " + fileDeleting.FullName + " Correct file not found. Resan for " + fullPathCheckDelete; + return ReturnCode.RescanNeeded; + } + FileInfo fi = new FileInfo(fullPathCheckDelete); + if (fi.LastWriteTime != fileToCheck.TimeStamp) + { + _error = "Deleting " + fileDeleting.FullName + " Correct file timestamp not found. Resan for " + fileToCheck.FullName; + return ReturnCode.RescanNeeded; + } + break; + } + default: + ReportError.UnhandledExceptionHandler("Unknown double check delete status " + fileToCheck.RepStatus); + break; + } + + + return ReturnCode.Good; + } + + private static ReturnCode MoveZiptoCorrupt(RvDir fixZip) + { + string fixZipFullName = fixZip.FullName; + if (!File.Exists(fixZipFullName)) + { + _error = "File for move to corrupt not found " + fixZip.FullName; + return ReturnCode.RescanNeeded; + } + FileInfo fi = new FileInfo(fixZipFullName); + if (fi.LastWriteTime != fixZip.TimeStamp) + { + _error = "File for move to corrupt timestamp not correct " + fixZip.FullName; + return ReturnCode.RescanNeeded; + } + + string corruptDir = Path.Combine(Settings.ToSort(), "Corrupt"); + if (!Directory.Exists(corruptDir)) + { + Directory.CreateDirectory(corruptDir); + } + + RvDir toSort = (RvDir)DB.DirTree.Child(1); + int indexcorrupt; + RvDir corruptDirNew = new RvDir(FileType.Dir) { Name = "Corrupt", DatStatus = DatStatus.InToSort }; + int found = toSort.ChildNameSearch(corruptDirNew, out indexcorrupt); + if (found != 0) + { + corruptDirNew.GotStatus = GotStatus.Got; + indexcorrupt = toSort.ChildAdd(corruptDirNew); + } + + string toSortFullName = Path.Combine(corruptDir, fixZip.Name + ".zip"); + string toSortFileName = fixZip.Name; + int fileC = 0; + while (File.Exists(toSortFullName)) + { + fileC++; + toSortFullName = Path.Combine(corruptDir, fixZip.Name + fileC + ".zip"); + toSortFileName = fixZip.Name + fileC; + } + + if (!File.SetAttributes(fixZipFullName, FileAttributes.Normal)) + { + int error = Error.GetLastError(); + ReportProgress(new bgwShowError(fixZipFullName, "Error Setting File Attributes to Normal. Before Moving To Corrupt. Code " + error)); + ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Moving To Corrupt. Code " + error + " : " + fixZipFullName); + } + + + File.Copy(fixZipFullName, toSortFullName); + FileInfo toSortCorruptFile = new FileInfo(toSortFullName); + + RvDir toSortCorruptGame = new RvDir(FileType.Zip) + { + Name = toSortFileName, + DatStatus = DatStatus.InToSort, + TimeStamp = toSortCorruptFile.LastWriteTime, + GotStatus = GotStatus.Corrupt + }; + ((RvDir)toSort.Child(indexcorrupt)).ChildAdd(toSortCorruptGame); + + return ReturnCode.Good; + } + + private static void CheckCreateParent(RvBase parent) + { + if (parent == DB.DirTree) + return; + + string parentDir = parent.FullName; + if (Directory.Exists(parentDir) && parent.GotStatus == GotStatus.Got) return; + + CheckCreateParent(parent.Parent); + if (!Directory.Exists(parentDir)) + Directory.CreateDirectory(parentDir); + parent.GotStatus = GotStatus.Got; + } + + private static void CheckDeleteObject(RvBase tBase) + { + if (tBase.RepStatus == RepStatus.Deleted) + return; + + // look at the directories childrens status's to figure out if the directory should be deleted. + if (tBase.FileType == FileType.Dir) + { + RvDir tDir = tBase as RvDir; + if (tDir == null || tDir.ChildCount != 0) return; + // check if we are at the root of the tree so that we do not delete RomRoot and ToSort + if (tDir.Parent == DB.DirTree) return; + + string fullPath = tDir.FullName; + try + { + if (Directory.Exists(fullPath)) + Directory.Delete(fullPath); + } + catch (Exception e) + { + //need to report this to an error window + Debug.WriteLine(e.ToString()); + } + } + + // else check if this tBase should be removed from the DB + if (tBase.FileRemove() == EFile.Delete) + { + RvDir parent = tBase.Parent; + + if (parent == null) + { + ReportError.UnhandledExceptionHandler("Item being deleted had no parent " + tBase.FullName); + return; // this never happens as UnhandledException Terminates the program + } + + int index; + + if (!parent.FindChild(tBase, out index)) + { + ReportError.UnhandledExceptionHandler("Could not find self in delete code " + parent.FullName); + } + parent.ChildRemove(index); + CheckDeleteObject(parent); + } + } + + + + + private static List _checkList; + private static void CheckReprocessClearList() + { + _checkList = new List(); + } + private static void CheckReprocess(RvBase tCheck, bool fastProcess = false) + { + switch (tCheck.FileType) + { + case FileType.File: + if (tCheck.RepStatus == RepStatus.Delete && !_processList.Contains(tCheck)) + _processList.Add(tCheck); + break; + case FileType.ZipFile: + + RvDir p = tCheck.Parent; + if (fastProcess) + { + if (!_checkList.Contains(p)) + _checkList.Add(p); + break; + } + if (!_processList.Contains(p)) + { + bool hasdelete = false; + bool hasNeededForFix = false; + for (int i = 0; i < p.ChildCount; i++) + { + RvBase f = p.Child(i); + + if (f.RepStatus == RepStatus.Delete) + hasdelete = true; + else if (f.RepStatus == RepStatus.NeededForFix || f.RepStatus == RepStatus.Rename) + { + hasNeededForFix = true; + break; + } + } + if (hasdelete && !hasNeededForFix) + { + Debug.WriteLine(tCheck.Parent.FullName + " adding to process list."); + _processList.Add(p); + } + } + break; + default: + ReportError.SendAndShow("Unknow repair file type recheck."); + break; + + } + } + private static void CheckReprocessFinalCheck() + { + foreach (RvDir p in _checkList) + { + + if (_processList.Contains(p)) + continue; + bool hasdelete = false; + bool hasNeededForFix = false; + for (int i = 0; i < p.ChildCount; i++) + { + RvBase f = p.Child(i); + + if (f.RepStatus == RepStatus.Delete) + hasdelete = true; + else if (f.RepStatus == RepStatus.NeededForFix || f.RepStatus == RepStatus.Rename) + { + hasNeededForFix = true; + break; + } + } + if (!hasdelete || hasNeededForFix) continue; + + Debug.WriteLine(p.FullName + " adding to process list."); + _processList.Add(p); + } + } + } +} \ No newline at end of file diff --git a/ROMVault2/FrmProgressWindow.Designer.cs b/ROMVault2/FrmProgressWindow.Designer.cs new file mode 100644 index 0000000..56868a2 --- /dev/null +++ b/ROMVault2/FrmProgressWindow.Designer.cs @@ -0,0 +1,220 @@ +namespace ROMVault2 +{ + partial class FrmProgressWindow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmProgressWindow)); + this.progressBar2 = new System.Windows.Forms.ProgressBar(); + this.progressBar = new System.Windows.Forms.ProgressBar(); + this.label = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.lbl2Prog = new System.Windows.Forms.Label(); + this.ErrorGrid = new System.Windows.Forms.DataGridView(); + this.CError = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CErrorFile = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.label3 = new System.Windows.Forms.Label(); + this.bgWork = new System.ComponentModel.BackgroundWorker(); + ((System.ComponentModel.ISupportInitialize)(this.ErrorGrid)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // progressBar2 + // + this.progressBar2.Location = new System.Drawing.Point(12, 71); + this.progressBar2.Name = "progressBar2"; + this.progressBar2.Size = new System.Drawing.Size(400, 22); + this.progressBar2.TabIndex = 3; + this.progressBar2.Visible = false; + // + // progressBar + // + this.progressBar.Location = new System.Drawing.Point(12, 99); + this.progressBar.Name = "progressBar"; + this.progressBar.Size = new System.Drawing.Size(400, 23); + this.progressBar.TabIndex = 1; + // + // label + // + this.label.AutoEllipsis = true; + this.label.Location = new System.Drawing.Point(12, 9); + this.label.Name = "label"; + this.label.Size = new System.Drawing.Size(368, 15); + this.label.TabIndex = 0; + this.label.Text = "Starting operation..."; + // + // cancelButton + // + this.cancelButton.Location = new System.Drawing.Point(420, 99); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.Click += new System.EventHandler(this.CancelButtonClick); + // + // label2 + // + this.label2.AutoEllipsis = true; + this.label2.Location = new System.Drawing.Point(12, 34); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(480, 16); + this.label2.TabIndex = 4; + this.label2.Visible = false; + // + // lbl2Prog + // + this.lbl2Prog.Location = new System.Drawing.Point(386, 9); + this.lbl2Prog.Name = "lbl2Prog"; + this.lbl2Prog.Size = new System.Drawing.Size(109, 25); + this.lbl2Prog.TabIndex = 5; + this.lbl2Prog.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.lbl2Prog.Visible = false; + // + // ErrorGrid + // + this.ErrorGrid.AllowUserToAddRows = false; + this.ErrorGrid.AllowUserToDeleteRows = false; + this.ErrorGrid.AllowUserToResizeRows = false; + this.ErrorGrid.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells; + this.ErrorGrid.BackgroundColor = System.Drawing.Color.White; + this.ErrorGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.ErrorGrid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.CError, + this.CErrorFile}); + this.ErrorGrid.Dock = System.Windows.Forms.DockStyle.Fill; + this.ErrorGrid.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.ErrorGrid.Location = new System.Drawing.Point(0, 0); + this.ErrorGrid.MultiSelect = false; + this.ErrorGrid.Name = "ErrorGrid"; + this.ErrorGrid.ReadOnly = true; + this.ErrorGrid.RowHeadersVisible = false; + this.ErrorGrid.RowTemplate.Height = 17; + this.ErrorGrid.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.ErrorGrid.ShowCellErrors = false; + this.ErrorGrid.ShowCellToolTips = false; + this.ErrorGrid.ShowEditingIcon = false; + this.ErrorGrid.ShowRowErrors = false; + this.ErrorGrid.Size = new System.Drawing.Size(591, 186); + this.ErrorGrid.TabIndex = 6; + this.ErrorGrid.SelectionChanged += new System.EventHandler(this.ErrorGridSelectionChanged); + // + // CError + // + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.CError.DefaultCellStyle = dataGridViewCellStyle1; + this.CError.HeaderText = "Error"; + this.CError.Name = "CError"; + this.CError.ReadOnly = true; + this.CError.Width = 200; + // + // CErrorFile + // + this.CErrorFile.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.CErrorFile.HeaderText = "Error Filename"; + this.CErrorFile.Name = "CErrorFile"; + this.CErrorFile.ReadOnly = true; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.label3); + this.splitContainer1.Panel1.Controls.Add(this.progressBar2); + this.splitContainer1.Panel1.Controls.Add(this.label); + this.splitContainer1.Panel1.Controls.Add(this.progressBar); + this.splitContainer1.Panel1.Controls.Add(this.lbl2Prog); + this.splitContainer1.Panel1.Controls.Add(this.label2); + this.splitContainer1.Panel1.Controls.Add(this.cancelButton); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.ErrorGrid); + this.splitContainer1.Size = new System.Drawing.Size(591, 320); + this.splitContainer1.SplitterDistance = 130; + this.splitContainer1.TabIndex = 8; + // + // label3 + // + this.label3.AutoEllipsis = true; + this.label3.Location = new System.Drawing.Point(12, 50); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(480, 16); + this.label3.TabIndex = 6; + // + // bgWork + // + this.bgWork.WorkerReportsProgress = true; + this.bgWork.WorkerSupportsCancellation = true; + // + // FrmProgressWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(591, 320); + this.Controls.Add(this.splitContainer1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmProgressWindow"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "RomVault Progress"; + this.Shown += new System.EventHandler(this.FrmProgressWindowNewShown); + this.Resize += new System.EventHandler(this.FrmProgressWindow_Resize); + ((System.ComponentModel.ISupportInitialize)(this.ErrorGrid)).EndInit(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ProgressBar progressBar2; + private System.Windows.Forms.ProgressBar progressBar; + private System.Windows.Forms.Label label; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label lbl2Prog; + private System.Windows.Forms.DataGridView ErrorGrid; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.ComponentModel.BackgroundWorker bgWork; + private System.Windows.Forms.DataGridViewTextBoxColumn CError; + private System.Windows.Forms.DataGridViewTextBoxColumn CErrorFile; + private System.Windows.Forms.Label label3; + } +} \ No newline at end of file diff --git a/ROMVault2/FrmProgressWindow.cs b/ROMVault2/FrmProgressWindow.cs new file mode 100644 index 0000000..648712d --- /dev/null +++ b/ROMVault2/FrmProgressWindow.cs @@ -0,0 +1,241 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Threading; +using System.Windows.Forms; +using ROMVault2.Properties; + +namespace ROMVault2 +{ + public partial class FrmProgressWindow : Form + { + private readonly string _titleRoot; + private bool _errorOpen; + private bool _bDone; + private Form _parentForm; + + public FrmProgressWindow(Form parentForm, string titleRoot, DoWorkEventHandler function) + { + _parentForm = parentForm; + _titleRoot = titleRoot; + InitializeComponent(); + + ClientSize = new Size(498, 131); + + _titleRoot = titleRoot; + + bgWork.DoWork += function; + } + + protected override CreateParams CreateParams + { + get + { + const int CP_NOCLOSE_BUTTON = 0x200; + CreateParams mdiCp = base.CreateParams; + mdiCp.ClassStyle = mdiCp.ClassStyle | CP_NOCLOSE_BUTTON; + return mdiCp; + } + } + + + + private void FrmProgressWindowNewShown(object sender, EventArgs e) + { + bgWork.ProgressChanged += BgwProgressChanged; + bgWork.RunWorkerCompleted += BgwRunWorkerCompleted; + bgWork.RunWorkerAsync(SynchronizationContext.Current); + } + + private void BgwProgressChanged(object sender, ProgressChangedEventArgs e) + { + if (e.UserState == null) + { + if (e.ProgressPercentage >= progressBar.Minimum && e.ProgressPercentage <= progressBar.Maximum) + progressBar.Value = e.ProgressPercentage; + UpdateStatusText(); + return; + } + + bgwText bgwT = e.UserState as bgwText; + if (bgwT != null) + { + label.Text = bgwT.Text; + return; + } + bgwSetRange bgwSR = e.UserState as bgwSetRange; + if (bgwSR != null) + { + progressBar.Minimum = 0; + progressBar.Maximum = bgwSR.MaxVal >= 0 ? bgwSR.MaxVal : 0; + progressBar.Value = 0; + UpdateStatusText(); + return; + } + + + bgwText2 bgwT2 = e.UserState as bgwText2; + if (bgwT2 != null) + { + label2.Text = bgwT2.Text; + return; + } + + bgwValue2 bgwV2 = e.UserState as bgwValue2; + if (bgwV2 != null) + { + if (bgwV2.Value >= progressBar2.Minimum && bgwV2.Value <= progressBar2.Maximum) + progressBar2.Value = bgwV2.Value; + UpdateStatusText2(); + return; + } + + bgwSetRange2 bgwSR2 = e.UserState as bgwSetRange2; + if (bgwSR2 != null) + { + progressBar2.Minimum = 0; + progressBar2.Maximum = bgwSR2.MaxVal >= 0 ? bgwSR2.MaxVal : 0; + progressBar2.Value = 0; + UpdateStatusText2(); + return; + } + bgwRange2Visible bgwR2V = e.UserState as bgwRange2Visible; + if (bgwR2V != null) + { + label2.Visible = bgwR2V.Visible; + progressBar2.Visible = bgwR2V.Visible; + lbl2Prog.Visible = bgwR2V.Visible; + return; + } + + + bgwText3 bgwT3 = e.UserState as bgwText3; + if (bgwT3 != null) + { + label3.Text = bgwT3.Text; + return; + } + + bgwShowCorrupt bgwSC = e.UserState as bgwShowCorrupt; + if (bgwSC != null) + { + if (!_errorOpen) + { + _errorOpen = true; + ClientSize = new Size(498, 292); + MinimumSize = new Size(498, 292); + FormBorderStyle = FormBorderStyle.SizableToolWindow; + } + + ErrorGrid.Rows.Add(); + int row = ErrorGrid.Rows.Count - 1; + + ErrorGrid.Rows[row].Cells["CError"].Value = bgwSC.zr; + ErrorGrid.Rows[row].Cells["CError"].Style.ForeColor = Color.FromArgb(255, 0, 0); + + ErrorGrid.Rows[row].Cells["CErrorFile"].Value = bgwSC.filename; + ErrorGrid.Rows[row].Cells["CErrorFile"].Style.ForeColor = Color.FromArgb(255, 0, 0); + + if (row >= 0) ErrorGrid.FirstDisplayedScrollingRowIndex = row; + } + + + + bgwShowError bgwSDE = e.UserState as bgwShowError; + if (bgwSDE != null) + { + if (!_errorOpen) + { + _errorOpen = true; + ClientSize = new Size(498, 292); + MinimumSize = new Size(498, 292); + FormBorderStyle = FormBorderStyle.SizableToolWindow; + } + + ErrorGrid.Rows.Add(); + int row = ErrorGrid.Rows.Count - 1; + + ErrorGrid.Rows[row].Cells["CError"].Value = bgwSDE.error; + ErrorGrid.Rows[row].Cells["CError"].Style.ForeColor = Color.FromArgb(255, 0, 0); + + ErrorGrid.Rows[row].Cells["CErrorFile"].Value = bgwSDE.filename; + ErrorGrid.Rows[row].Cells["CErrorFile"].Style.ForeColor = Color.FromArgb(255, 0, 0); + + if (row >= 0) ErrorGrid.FirstDisplayedScrollingRowIndex = row; + + } + + + + } + private void UpdateStatusText() + { + int range = progressBar.Maximum - progressBar.Minimum; + int percent = range > 0 ? (progressBar.Value * 100) / range : 0; + + Text = _titleRoot + String.Format(" - {0}% complete", percent); + } + private void UpdateStatusText2() + { + lbl2Prog.Text = progressBar2.Maximum > 0 ? string.Format("{0}/{1}", progressBar2.Value, progressBar2.Maximum) : ""; + } + + private void BgwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + if (_errorOpen) + { + cancelButton.Text = Resources.ProgressWindowFix_DoDone_Close; + cancelButton.Enabled = true; + _bDone = true; + } + else + { + _parentForm.Show(); + Close(); + } + } + + private void CancelButtonClick(object sender, EventArgs e) + { + if (_bDone) + { + if (!_parentForm.Visible) _parentForm.Show(); + Close(); + } + else + { + cancelButton.Text = Resources.ProgressWindowFix_OnClosing_Cancelling; + cancelButton.Enabled = false; + bgWork.CancelAsync(); + } + } + + private void ErrorGridSelectionChanged(object sender, EventArgs e) + { + ErrorGrid.ClearSelection(); + } + + private void FrmProgressWindow_Resize(object sender, EventArgs e) + { + switch (WindowState) + { + case FormWindowState.Minimized: + if (_parentForm.Visible) _parentForm.Hide(); + return; + case FormWindowState.Maximized: + if (!_parentForm.Visible) _parentForm.Show(); + return; + case FormWindowState.Normal: + if (!_parentForm.Visible) _parentForm.Show(); + return; + } + } + + } +} diff --git a/ROMVault2/FrmProgressWindow.resx b/ROMVault2/FrmProgressWindow.resx new file mode 100644 index 0000000..f39702e --- /dev/null +++ b/ROMVault2/FrmProgressWindow.resx @@ -0,0 +1,1799 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + True + + + True + + + 17, 17 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA7e3tvevr6//m5ub/4ODg/9nZ2f/Q0ND/wsLC/66urv+ampr/nJyc/6Kiov+tra3/ubm5/8XF + xf/R0dH/2trapenp6b3l5eX/3t7e/9bW1v/Kysr/ubm5/5+fn/92dnb/ampq/21tbf97e3v/jIyM/56e + nv+wsLD/wsLC/8/Pz6Xl5eW939/f/9bW1v/Jycn/uLi4/5ycnP9ubm7/YWFh/2pqav8tLS3/RERE/2lp + af+AgID/mJiY/7Kysv/FxcWl39/fvdjY2P/Ly8v/ubm5/56env9ycnL/VlZW/2RkZP92dnb/IyMj/yAg + IP8qKir/VlZW/319ff+ioqL/v7+/pdnZ2b3Nzc3/u7u7/6Kiov94eHj/U1NT/15eXv99fX3/IiIi/yYm + Jv8lJSX/IyMj/yAgIP8+Pj7/hoaG/76+vqXQ0NC9wMDA/6ampv+AgID/U1NT/1tbW/+BgYH/ISEh/yUl + Jf8lJSX/JiYm/yYmJv8lJSX/IiIi/2BgYP/Dw8OlxsbGva6urv+Hh4f/VlZW/1paWv+BgYH/JCQk/yUl + Jf8kJCT/JSUl/yUlJf8mJib/JiYm/yQkJP91dXX/zc3Npby8vL2Wlpb/XV1d/1tbW/+AgID/JiYm/zs7 + O/9ubm7/YWFh/ykpKf8kJCT/JSUl/yUlJf9ZWVn/xcXF/9XV1aW4uLi9dXV1/2JiYv9/f3//Kysr/0BA + QP/FxcX/zMzM/8vLy/+hoaH/JCQk/yQkJP9NTU3/v7+//9LS0v/c3NylvLy8vXJycv9/f3//NjY2/yMj + I/9lZWX/zc3N/83Nzf/MzMz/ycnJ/ykpKf9DQ0P/uLi4/9DQ0P/c3Nz/4+PjpcDAwL1/f3//QkJC/yQi + Iv8jIyP/Li4u/6ioqP/MzMz/ysrK/3h4eP88PDz/s7Oz/8/Pz//b29v/4+Pj/+jo6KXR0dG9bm5u/yQi + Iv9hJRr/SCQd/0QkHv8yJCH/Ozs7/zExMf82Njb/r6+v/9HR0f/b29v/4+Pj/+jo6P/s7Oyl29vbvX9/ + f/8lJSX/PiMe/1okGv9dJBr/VSQc/zokIP8yMjL/rq6u/9XV1f/e3t7/5OTk/+np6f/t7e3/8PDwpeXl + 5b3f39//t7e3/2tra/8lJSX/RyMd/1QlHP8vLi7/ra2t/93d3f/j4+P/6Ojo/+vr6//u7u7/8fHx//Pz + 86Xs7Oy96enp/+bm5v/i4uL/n5+f/zY2Nv9JSUn/q6ur/+bm5v/p6en/7Ozs/+7u7v/w8PD/8vLy//T0 + 9P/19fWl8fHxvfDw8P/u7u7/7Ozs/+rq6v/g4OD/39/f/+zs7P/u7u7/7+/v//Hx8f/y8vL/9PT0//X1 + 9f/29vb/9/f3pQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA7+/vee7u + 7v/t7e3/6+vr/+np6f/n5+f/5OTk/+Hh4f/e3t7/29vb/9fX1//T09P/zc3N/8XFxf++vr7/uLi4/7Cw + sP+rq6v/qKio/6ioqP+rq6v/rq6u/7Kysv+4uLj/vb29/8LCwv/Hx8f/zMzM/9HR0f/X19f/3Nzc/9/f + 303t7e157Ozs/+rq6v/o6Oj/5ubm/+Pj4//g4OD/3Nzc/9jY2P/U1NT/z8/P/8jIyP/AwMD/tra2/6qq + qv+YmJj/goKC/42Njf+NjY3/kZGR/5aWlv+bm5v/oqKi/6qqqv+wsLD/tra2/729vf/Dw8P/ysrK/9HR + 0f/X19f/29vbTevr63nq6ur/6Ojo/+Xl5f/i4uL/3t7e/9vb2//W1tb/0tLS/8zMzP/ExMT/u7u7/7Gx + sf+jo6P/kJCQ/3Z2dv9mZmb/c3Nz/3R0dP96enr/gICA/4iIiP+RkZH/mZmZ/6Ghof+pqan/sbGx/7m5 + uf/CwsL/ysrK/9HR0f/W1tZN6enpeefn5//l5eX/4uLi/97e3v/a2tr/1dXV/9DQ0P/Kysr/wsLC/7m5 + uf+tra3/n5+f/4mJif9ra2v/aWlp/29vb/9hYWH/YWFh/2dnZ/9tbW3/dXV1/35+fv+IiIj/kpKS/5yc + nP+lpaX/r6+v/7m5uf/CwsL/y8vL/9HR0U3n5+d55eXl/+Li4v/f39//29vb/9bW1v/Q0ND/ycnJ/8LC + wv+4uLj/ra2t/52dnf+IiIj/a2tr/0tLS/9oaGj/enp6/1hYWP9ERET/Ly8v/1NTU/9kZGT/bW1t/3d3 + d/+CgoL/jY2N/5iYmP+kpKT/sLCw/7u7u//Gxsb/zMzMTeXl5Xnj4+P/39/f/9vb2//X19f/0dHR/8rK + yv/BwcH/uLi4/62trf+enp7/iYmJ/2tra/9bW1v/WFhY/3h4eP91dXX/X19f/yAgIP8iIiL/Hx8f/zk5 + Of9aWlr/Z2dn/3Jycv9+fn7/i4uL/5mZmf+np6f/tbW1/8HBwf/JyclN4uLieeDg4P/c3Nz/2NjY/9LS + 0v/Kysr/wsLC/7i4uP+tra3/n5+f/4uLi/9tbW3/Q0ND/11dXf9dXV3/aWlp/5WVlf+QkJD/IiIi/yEh + If8eHh7/Hh4e/yQkJP9HR0f/YmJi/29vb/99fX3/jIyM/52dnf+vr6//vr6+/8fHx03g4OB53d3d/9jY + 2P/T09P/zMzM/8PDw/+5ubn/rq6u/6CgoP+MjIz/cnJy/19fX/9NTU3/ampq/3d3d/9TU1P/jo6O/yYm + Jv8jIyP/JiYm/yQkJP8hISH/Hh4e/x4eHv8wMDD/WFhY/21tbf99fX3/kpKS/6mpqf+8vLz/xsbGTd7e + 3nna2tr/1NTU/83Nzf/ExMT/u7u7/6+vr/+hoaH/j4+P/3V1df9HR0f/Wlpa/1ZWVv9paWn/fn5+/5ub + m/8dHR3/IyMj/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x4eHv8hISH/QEBA/2xsbP+IiIj/o6Oj/7u7 + u//Hx8dN2traedXV1f/Ozs7/xsbG/7y8vP+xsbH/pKSk/5KSkv97e3v/ZGRk/0pKSv9gYGD/dXV1/0JC + Qv+qqqr/MjIy/yMjI/8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/ISEh/x8fH/8fHx//LS0t/1JS + Uv+cnJz/u7u7/8fHx03W1tZ50dHR/8nJyf+/v7//s7Oz/6ampv+UlJT/fX19/01NTf9ZWVn/WFhY/2ho + aP9ubm7/mJiY/xsbG/8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yEh + If8gICD/KSkp/5ycnP++vr7/ycnJTdLS0nnMzMz/wsLC/7a2tv+pqan/l5eX/4KCgv9sbGz/SkpK/1tb + W/91dXX/Nzc3/7W1tf9HR0f/IiIi/yQkJP8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8jIyP/mJiY/8XFxf/MzMxNzs7OecfHx/+7u7v/ra2t/5ubm/+Ghob/WVlZ/1lZ + Wf9dXV3/ZWVl/2hoaP+Kior/KSkp/yEhIf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/zIyMv+goKD/ysrK/9DQ0E3Kysp5wcHB/7Kysv+goKD/ioqK/3Jy + cv9PT0//V1dX/3V1df8zMzP/q6ur/2ZmZv8gICD/JCQk/yUlJf8lJSX/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8hISH/Q0ND/76+vv/Nzc3/09PTTcXFxXm7u7v/qKio/5GR + kf9mZmb/Xl5e/2JiYv9eXl7/bGxs/3d3d/82Njb/Hx8f/yQkJP8kJCT/JSUl/ycnJ/8lJSX/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/Kioq/1hYWP+3t7f/ycnJ/9HR0f/X19dNwsLCebW1 + tf+enp7/gYGB/1hYWP9WVlb/dXV1/zg4OP+UlJT/ioqK/x8fH/8kJCT/LCws/3l5ef+tra3/v7+//7S0 + tP+IiIj/OTk5/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yQkJP8xMTH/sbGx/8bGxv/Ozs7/1tbW/9ra + 2k3BwcF5srKy/4iIiP9xcXH/bGxs/1tbW/92dnb/YWFh/05OTv8eHh7/IyMj/zMzM/+wsLD/zMzM/8vL + y//Ly8v/zMzM/8vLy//BwcH/SkpK/yMjI/8kJCT/JCQk/yUlJf8oKCj/QkJC/6qqqv/ExMT/zMzM/9PT + 0//Z2dn/3d3dTcLCwnm0tLT/enp6/2FhYf97e3v/SEhI/319ff+np6f/ISEh/yEhIf8jIyP/iIiI/8zM + zP/MzMz/zc3N/83Nzf/MzMz/y8vL/8rKyv+vr6//JSUl/yQkJP8kJCT/IyMj/yUlJf+lpaX/w8PD/8vL + y//R0dH/19fX/93d3f/g4OBNw8PDebm5uf+JiYn/Y2Nj/4GBgf9WVlb/Y2Nj/ykpKf8hISH/IyMj/yQk + JP+wsLD/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8zMzP8zMzP/JCQk/yUlJf8zMzP/lpaW/8HB + wf/Kysr/0dHR/9fX1//c3Nz/4ODg/+Pj403FxcV5tra2/4aGhv9WVlb/bm5u/7i4uP8rKyv/ISEh/yQk + JP8kJCT/JCQk/52dnf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/Ly8v/wcHB/yoqKv8jIyP/ICAg/5aW + lv/AwMD/ycnJ/9DQ0P/X19f/3Nzc/+Dg4P/k5OT/5ubmTcnJyXm2trb/jY2N/1JSUv9zc3P/PDw8/yEh + If8jIyP/IyMj/yMjI/8kJCT/T09P/8nJyf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vLy/95eXn/JCQk/ygo + KP+Dg4P/wMDA/8jIyP/Q0ND/1tbW/9vb2//g4OD/4+Pj/+bm5v/o6OhNzc3NecDAwP9nZ2f/tLS0/zw8 + PP8eHh7/IiIi/ysiIf8iIiL/IyMj/yMjI/8jIyP/VlZW/7e3t//MzMz/zc3N/8zMzP/ExMT/d3d3/yYm + Jv8dHR3/h4eH/8HBwf/Jycn/0NDQ/9bW1v/b29v/39/f/+Pj4//m5ub/6enp/+vr603S0tJ5zMzM/6mp + qf9VVVX/ICAg/yMjI/84Ix//ayYa/yIiIf8qIiH/NCMg/zQjIP8jIyP/JiYm/0hISP9dXV3/UVFR/y0t + Lf8jIyP/IiIi/2tra//BwcH/ysrK/9HR0f/W1tb/29vb/9/f3//j4+P/5ubm/+np6f/r6+v/7e3tTdfX + 13nS0tL/kpKS/ygoKP8jIyP/KyIg/3omF/9mJRn/cyYY/14lGv9TJRz/UyUc/1ckG/8oIyH/IyMj/yMj + I/8jIyP/IyMj/x0dHf93d3f/xMTE/8vLy//S0tL/19fX/9vb2//f39//4+Pj/+bm5v/o6Oj/6+vr/+3t + 7f/u7u5N29vbedfX1/+FhYX/IyMj/yMjI/8jISH/TyQc/2QkGP9yJhj/WyQa/2slGf86Ix7/XCUb/2Ml + G/8+Ix//JSMi/yMjI/8hISH/VVVV/8bGxv/Ozs7/1NTU/9nZ2f/d3d3/4ODg/+Pj4//m5ub/6Ojo/+vr + 6//t7e3/7+/v//Dw8E3g4OB53d3d/9PT0/9/f3//LCws/yIiIv8hISH/ISEh/0UjHf9XIxr/bCUY/2El + Gv8/Ix7/VSQc/10mG/8nIyL/Hx8f/2VlZf/Kysr/09PT/9fX1//b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/r6+v/7e3t/+/v7//w8PD/8fHxTeTk5Hni4uL/3t7e/9vb2//Dw8P/YGBg/yQkJP8iIiL/ISEh/yEh + If9fJRr/ZSUZ/1IkHP9eJRv/JSMi/yIiIv9AQED/ysrK/9jY2P/b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/q6ur/7Ozs/+7u7v/v7+//8fHx//Ly8v/z8/NN6Ojoeebm5v/k5OT/4eHh/9/f3//c3Nz/v7+//6io + qP8vLy//IiIi/yEhIf81IyD/ZiYa/zskIP8gICD/VFRU/83Nzf/d3d3/4ODg/+Pj4//l5eX/5+fn/+np + 6f/r6+v/7Ozs/+3t7f/v7+//8PDw//Hx8f/y8vL/8/Pz//T09E3s7Ox56+vr/+np6f/n5+f/5OTk/+Li + 4v/h4eH/39/f/5aWlv8wMDD/IiIi/yIiIv8jIyP/IiIi/ywsLP/Gxsb/4uLi/+Tk5P/m5ub/6Ojo/+np + 6f/r6+v/7Ozs/+7u7v/v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9fX1Te7u7nnt7e3/7Ozs/+vr + 6//p6en/6Ojo/+bm5v/k5OT/4+Pj/9PT0/9vb2//JiYm/y0tLf+ysrL/1NTU/+bm5v/n5+f/6enp/+rq + 6v/s7Oz/7e3t/+7u7v/v7+//8PDw//Hx8f/y8vL/8vLy//Pz8//09PT/9fX1//X19f/29vZN8fHxefDw + 8P/v7+//7u7u/+3t7f/s7Oz/6urq/+np6f/o6Oj/6Ojo/+jo6P++vr7/urq6/+np6f/q6ur/6+vr/+vr + 6//t7e3/7u7u/+/v7//v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/29vb/9vb2//f3 + 903z8/N58vLy//Hx8f/w8PD/8PDw/+/v7//u7u7/7e3t/+3t7f/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vL/8/Pz//T09P/09PT/9fX1//X19f/29vb/9vb2//f3 + 9//39/f/9/f3TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAPDw + 8Dfv7+//7u7u/+3t7f/s7Oz/6+vr/+rq6v/p6en/5+fn/+Xl5f/j4+P/4eHh/9/f3//d3d3/29vb/9nZ + 2f/X19f/1NTU/9DQ0P/Ly8v/x8fH/8LCwv++vr7/urq6/7a2tv+xsbH/rq6u/62trf+srKz/rKys/62t + rf+vr6//sbGx/7S0tP+3t7f/u7u7/76+vv/BwcH/xcXF/8jIyP/Ly8v/z8/P/9LS0v/V1dX/2NjY/9zc + 3P/f39/x////Ae7u7jfu7u7/7e3t/+zs7P/r6+v/6enp/+jo6P/m5ub/5eXl/+Pj4//g4OD/3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zc3N/8jIyP/CwsL/vLy8/7e3t/+xsbH/qqqq/6Ojo/+enp7/nJyc/5ub + m/+cnJz/np6e/6CgoP+jo6P/pqam/6qqqv+urq7/srKy/7a2tv+6urr/vr6+/8HBwf/FxcX/ycnJ/83N + zf/R0dH/1dXV/9nZ2f/c3Nzx////Ae3t7Tfs7Oz/6+vr/+rq6v/p6en/6Ojo/+bm5v/k5OT/4uLi/+Dg + 4P/d3d3/29vb/9jY2P/V1dX/0tLS/87Ozv/Kysr/xMTE/7+/v/+5ubn/sbGx/6ioqP+fn5//ioqK/21t + bf+Ghob/iIiI/4iIiP+Li4v/jo6O/5GRkf+VlZX/mZmZ/56env+kpKT/qKio/62trf+xsbH/tbW1/7q6 + uv++vr7/w8PD/8jIyP/MzMz/0dHR/9XV1f/Z2dnx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Pj + 4//h4eH/39/f/9zc3P/Z2dn/19fX/9TU1P/Q0ND/zMzM/8fHx//CwsL/vLy8/7a2tv+urq7/pKSk/5iY + mP+MjIz/cHBw/2JiYv9zc3P/dnZ2/3d3d/96enr/fn5+/4ODg/+Hh4f/jIyM/5KSkv+YmJj/nZ2d/6Oj + o/+oqKj/ra2t/7Kysv+3t7f/vb29/8LCwv/Hx8f/zMzM/9HR0f/W1tbx////Aerq6jfp6en/6Ojo/+fn + 5//l5eX/4+Pj/+Hh4f/e3t7/3Nzc/9nZ2f/W1tb/09PT/8/Pz//Ly8v/xsbG/8DAwP+6urr/s7Oz/6ur + q/+hoaH/lJSU/4WFhf94eHj/ampq/2hoaP9oaGj/ZmZm/2hoaP9tbW3/cXFx/3V1df96enr/f39//4aG + hv+MjIz/kpKS/5iYmP+enp7/pKSk/6qqqv+wsLD/tra2/7y8vP/CwsL/x8fH/83Nzf/S0tLx////Aenp + 6Tfo6Oj/5ubm/+Xl5f/j4+P/4eHh/9/f3//c3Nz/2dnZ/9bW1v/S0tL/zs7O/8rKyv/FxcX/v7+//7i4 + uP+xsbH/qamp/5+fn/+RkZH/f39//2BgYP9nZ2f/aGho/29vb/9vb2//W1tb/11dXf9hYWH/ZWVl/2lp + af9ubm7/c3Nz/3p6ev+AgID/h4eH/42Njf+UlJT/m5ub/6Ghof+oqKj/r6+v/7W1tf+8vLz/wsLC/8nJ + yf/Ozs7x////Aejo6Dfn5+f/5eXl/+Pj4//h4eH/39/f/9zc3P/Z2dn/1tbW/9LS0v/Ozs7/ycnJ/8TE + xP+/v7//uLi4/7Gxsf+oqKj/nZ2d/5CQkP+AgID/ZmZm/0pKSv9XV1f/a2tr/3R0dP9xcXH/UlJS/1NT + U/84ODj/PT09/1tbW/9jY2P/aGho/25ubv91dXX/fHx8/4ODg/+Kior/kZGR/5mZmf+goKD/qKio/6+v + r/+3t7f/vr6+/8XFxf/Ly8vx////Aefn5zfm5ub/4+Pj/+Hh4f/f39//3Nzc/9ra2v/W1tb/09PT/87O + zv/Jycn/xMTE/76+vv+4uLj/sLCw/6ioqP+enp7/kJCQ/4GBgf9vb2//Xl5e/01NTf9VVVX/cXFx/42N + jf9xcXH/S0tL/zExMf8gICD/Hh4e/ygoKP9JSUn/XV1d/2NjY/9paWn/cXFx/3h4eP+AgID/iIiI/5CQ + kP+YmJj/oKCg/6mpqf+ysrL/urq6/8LCwv/Jycnx////AeXl5Tfk5OT/4uLi/9/f3//d3d3/2tra/9fX + 1//T09P/z8/P/8rKyv/FxcX/v7+//7i4uP+xsbH/qKio/5+fn/+RkZH/gYGB/2ZmZv9eXl7/WVlZ/2Nj + Y/9aWlr/i4uL/2tra/93d3f/VFRU/x0dHf8kJCT/Hh4e/x4eHv8eHh7/MjIy/1JSUv9eXl7/ZmZm/25u + bv91dXX/fn5+/4eHh/+QkJD/mZmZ/6Ojo/+tra3/tra2/7+/v//Gxsbx////AePj4zfi4uL/4ODg/93d + 3f/b29v/2NjY/9TU1P/Pz8//ysrK/8XFxf+/v7//uLi4/7Gxsf+pqan/n5+f/5OTk/+CgoL/ampq/0ZG + Rv9ISEj/YWFh/2VlZf9dXV3/cHBw/3Jycv/CwsL/jIyM/yQkJP8fHx//Hx8f/x4eHv8eHh7/HR0d/yEh + If8+Pj7/Wlpa/2NjY/9ra2v/dHR0/319ff+Hh4f/kZGR/5ycnP+np6f/s7Oz/7y8vP/FxcXx////AeLi + 4jfg4OD/3t7e/9vb2//Y2Nj/1dXV/9HR0f/Ly8v/xsbG/8DAwP+5ubn/srKy/6mpqf+fn5//kpKS/4SE + hP9zc3P/YWFh/0RERP9FRUX/ampq/3x8fP9WVlb/Xl5e/7e3t/+zs7P/KCgo/yIiIv8kJCT/JiYm/yIi + Iv8fHx//Hh4e/x4eHv8eHh7/KSkp/0xMTP9hYWH/ampq/3Nzc/99fX3/iIiI/5SUlP+ioqL/r6+v/7u7 + u//ExMTx////AeDg4Dff39//3Nzc/9nZ2f/V1dX/0dHR/8zMzP/Hx8f/wcHB/7q6uv+ysrL/qqqq/6Gh + of+Tk5P/hISE/3BwcP9lZWX/W1tb/15eXv9GRkb/fHx8/39/f/9hYWH/RERE/4iIiP8uLi7/IiIi/yMj + I/8lJSX/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x8fH/83Nzf/Wlpa/2dnZ/9xcXH/fX19/42N + jf+cnJz/q6ur/7m5uf/ExMTx////Ad/f3zfd3d3/2tra/9bW1v/R0dH/zc3N/8fHx//BwcH/u7u7/7Oz + s/+rq6v/oaGh/5aWlv+Hh4f/c3Nz/0pKSv9LS0v/XFxc/2ZmZv9GRkb/hISE/2JiYv+dnZ3/mpqa/xwc + HP8cHBz/IyMj/yYmJv8mJib/JSUl/yYmJv8mJib/JSUl/yMjI/8fHx//Hx8f/x4eHv8eHh7/JSUl/0VF + Rf9jY2P/dHR0/4aGhv+YmJj/qamp/7i4uP/ExMTx////Ad3d3Tfb29v/19fX/9LS0v/Ozs7/yMjI/8LC + wv+8vLz/tLS0/6ysrP+jo6P/l5eX/4mJif94eHj/ZmZm/0hISP9DQ0P/ZWVl/3Jycv89PT3/V1dX/5aW + lv/a2tr/Pj4+/yIiIv8kJCT/JiYm/yYmJv8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8kJCT/ISEh/x8f + H/8fHx//Hx8f/x8fH/8xMTH/YWFh/3BwcP+Li4v/paWl/7e3t//ExMTx////Advb2zfY2Nj/1NTU/8/P + z//Jycn/xMTE/729vf+1tbX/ra2t/6SkpP+ZmZn/jIyM/3t7e/9ra2v/X19f/1ZWVv9CQkL/cHBw/42N + jf9OTk7/ODg4/7S0tP9JSUn/IyMj/yIiIv8mJib/JiYm/yYmJv8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yMjI/8gICD/Hx8f/yAgIP8gICD/IiIi/zk5Of91dXX/paWl/7e3t//FxcXx////AdjY + 2DfV1dX/0NDQ/8vLy//FxcX/v7+//7e3t/+vr6//paWl/5ubm/+NjY3/fX19/1RUVP9OTk7/W1tb/2Rk + ZP8/Pz//i4uL/1xcXP+FhYX/h4eH/xsbG/8eHh7/ISEh/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IiIi/yAgIP8gICD/ICAg/yAgIP9jY2P/pqam/7q6 + uv/Gxsbx////AdXV1TfT09P/zc3N/8fHx//AwMD/ubm5/7CwsP+np6f/nJyc/4+Pj/+AgID/b29v/01N + Tf9AQED/YWFh/2xsbP83Nzf/VlZW/319ff/Y2Nj/aWlp/yEhIf8fHx//JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8lJSX/JiYm/yUlJf8lJSX/JSUl/yUlJf8gICD/ICAg/yAg + IP9YWFj/paWl/7+/v//IyMjx////AdPT0zfQ0ND/ysrK/8PDw/+7u7v/srKy/6mpqf+enp7/kZGR/4SE + hP90dHT/ZWVl/1RUVP8/Pz//aWlp/4qKiv9LS0v/NjY2/7u7u/+BgYH/JCQk/yEhIf8kJCT/JSUl/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JCQk/yAgIP9TU1P/paWl/8PDw//Ly8vx////AdDQ0DfNzc3/xsbG/76+vv+2trb/rKys/6Gh + of+UlJT/hoaG/2VlZf9VVVX/XV1d/2NjY/89PT3/hISE/2tra/9ubm7/YmJi/zY2Nv8jIyP/IiIi/yYm + Jv8lJSX/JCQk/yUlJf8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/yYmJv8lJSX/JiYm/yYmJv9sbGz/qKio/8fHx//Ozs7x////Ac3NzTfJycn/wsLC/7m5 + uf+vr6//pKSk/5eXl/+IiIj/dnZ2/1RUVP9BQUH/Xl5e/2pqav83Nzf/YWFh/2pqav+5ubn/pqam/yAg + IP8bGxv/IyMj/yQkJP8kJCT/JSUl/yUlJf8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JiYm/yUl + Jf8mJib/JiYm/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/xoaGv9iYmL/u7u7/8rKyv/Q0NDx////AcvL + yzfGxsb/vr6+/7Ozs/+np6f/mpqa/4uLi/96enr/bGxs/1hYWP8+Pj7/ZGRk/35+fv9UVFT/NjY2/6en + p/+4uLj/Jycn/yEhIf8iIiL/JCQk/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/HBwc/zU1Nf+vr6//xsbG/83N + zf/S0tLx////AcjIyDfDw8P/ubm5/62trf+goKD/kJCQ/3Z2dv9cXFz/Y2Nj/2NjY/9GRkb/cHBw/4GB + gf9dXV3/R0dH/0FBQf8wMDD/ICAg/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8lJSX/JiYm/yUlJf81NTX/Pz8//6mp + qf/ExMT/ysrK/8/Pz//V1dXx////AcbGxjfAwMD/tbW1/6ampv+Xl5f/g4OD/2JiYv9FRUX/X19f/2pq + av9BQUH/bm5u/1xcXP+VlZX/zc3N/yIiIv8YGBj/IyMj/yQkJP8kJCT/KCgo/0VFRf9jY2P/a2tr/11d + Xf89PT3/JiYm/yMjI/8jIyP/JCQk/yQkJP8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yAg + IP9HR0f/q6ur/8HBwf/Hx8f/zc3N/9LS0v/X19fx////AcTExDe+vr7/sbGx/6Kiov+Pj4//enp6/2Nj + Y/9AQED/Y2Nj/3Z2dv9eXl7/MTEx/4qKiv/Z2dn/Ozs7/yEhIf8kJCT/JCQk/yQkJP9kZGT/srKy/8rK + yv/Ly8v/zMzM/8zMzP/Kysr/qKio/1NTU/8kJCT/JCQk/yQkJP8kJCT/JSUl/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/IyMj/x0dHf+YmJj/wMDA/8bGxv/Ly8v/0NDQ/9XV1f/a2trx////AcTExDe9vb3/rq6u/5ub + m/92dnb/eXl5/2xsbP9VVVX/Y2Nj/5GRkf9XV1f/Nzc3/09PT/9OTk7/ICAg/yIiIv8kJCT/KSkp/4+P + j//MzMz/zMzM/8vLy//Ly8v/zMzM/8zMzP/MzMz/y8vL/8nJyf9/f3//JCQk/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8rKyv/ISEh/5GRkf+/v7//xcXF/8rKyv/Pz8//09PT/9jY2P/c3Nzx////AcTE + xDe9vb3/rq6u/4qKiv9SUlL/cHBw/3Jycv9UVFT/b29v/1paWv9+fn7/y8vL/y4uLv8bGxv/Hx8f/yMj + I/8kJCT/d3d3/8rKyv/Ly8v/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/8rKyv/Jycn/Y2Nj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8/Pz//mpqa/729vf/Dw8P/ycnJ/83Nzf/S0tL/1tbW/9ra + 2v/e3t7x////AcTExDe/v7//sbGx/42Njf9MTEz/cHBw/3p6ev9qamr/OTk5/3V1df/Q0ND/bW1t/yAg + IP8fHx//IyMj/yQkJP8xMTH/wMDA/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8rK + yv/Ly8v/srKy/ygoKP8kJCT/JCQk/yQkJP8kJCT/IiIi/xMTE/95eXn/u7u7/8PDw//IyMj/zc3N/9HR + 0f/W1tb/2dnZ/9zc3P/g4ODx////AcXFxTfAwMD/tbW1/5KSkv9qamr/ZWVl/5KSkv9lZWX/Ojo6/2ho + aP98fHz/ICAg/x8fH/8jIyP/JCQk/yQkJP9NTU3/zc3N/83Nzf/MzMz/zc3N/83Nzf/Nzc3/zc3N/83N + zf/MzMz/y8vL/8vLy//MzMz/y8vL/zg4OP8kJCT/JCQk/yQkJP8mJib/FRUV/29vb/+4uLj/wcHB/8fH + x//Nzc3/0dHR/9XV1f/Z2dn/3Nzc/9/f3//i4uLx////AcbGxjfBwcH/t7e3/4uLi/9vb2//aGho/29v + b/9paWn/srKy/zw8PP8jIyP/ICAg/yQkJP8jIyP/JCQk/yMjI/9MTEz/zMzM/8zMzP/MzMz/zMzM/83N + zf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/y8vL/zs7O/8jIyP/JCQk/yQkJP85OTn/gICA/7m5 + uf/AwMD/xsbG/8zMzP/R0dH/1dXV/9jY2P/b29v/39/f/+Hh4f/k5OTx////AcfHxzfDw8P/r6+v/4WF + hf99fX3/Pj4+/2VlZf+xsbH/qamp/yAgIP8fHx//JCQk/yQkJP8jIyP/JCQk/yQkJP8xMTH/wMDA/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/tra2/ykpKf8jIyP/IyMj/xIS + Ev9dXV3/tbW1/8DAwP/Gxsb/zMzM/9DQ0P/V1dX/2NjY/9zc3P/f39//4eHh/+Tk5P/m5ubx////AcnJ + yTfGxsb/rq6u/5CQkP+AgID/ODg4/3p6ev+tra3/JSUl/yAgIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/fn5+/83Nzf/MzMz/zc3N/83Nzf/MzMz/zc3N/83Nzf/MzMz/zMzM/8vLy//Kysr/bm5u/yQk + JP8kJCT/FhYW/01NTf+ysrL/wMDA/8bGxv/Ly8v/0NDQ/9TU1P/Y2Nj/29vb/9/f3//h4eH/4+Pj/+Xl + 5f/n5+fx////AczMzDfJycn/tLS0/4mJif9ZWVn/kZGR/05OTv8uLi7/Hx8f/yEhIf8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/Kysr/5iYmP/MzMz/zMzM/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8vL + y/+QkJD/Jycn/yMjI/81NTX/ZGRk/7S0tP/BwcH/xsbG/8vLy//Q0ND/1NTU/9jY2P/b29v/3t7e/+Hh + 4f/j4+P/5eXl/+fn5//p6enx////Ac/PzzfMzMz/vb29/11dXf+Ojo7/zs7O/zExMf8cHBz/ISEh/yIi + Iv8iIiL/NSIf/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/ygoKP9xcXH/vb29/8zMzP/Nzc3/zc3N/83N + zf/MzMz/ubm5/2pqav8nJyf/IyMj/xkZGf88PDz/ra2t/8HBwf/Gxsb/y8vL/9DQ0P/U1NT/2NjY/9vb + 2//e3t7/4ODg/+Pj4//l5eX/5+fn/+np6f/q6urx////AdLS0jfPz8//ysrK/62trf/Nzc3/OTk5/x8f + H/8hISH/IyMj/yIiIv9ZJBv/dCcZ/yIiIf8iIiL/IyMj/yMjI/8oIiH/IyIi/yMjI/8jIyP/Kysr/1NT + U/9vb2//fHx8/29vb/9OTk7/Kioq/yMjI/8jIyP/Gxsb/yoqKv+oqKj/wsLC/8fHx//MzMz/0NDQ/9TU + 1P/Y2Nj/29vb/97e3v/g4OD/4uLi/+Xl5f/n5+f/6enp/+rq6v/s7Ozx////AdXV1TfT09P/zs7O/7e3 + t/9CQkL/IiIi/yIiIv8kJCT/IiIi/00jHP+oKhP/SiMc/0MiHP9xJhj/WiQa/1wlG/9+KBj/LSMh/zEj + IP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yMjI/8vLy//TExM/6mpqf/Dw8P/yMjI/83N + zf/R0dH/1dXV/9jY2P/b29v/3t7e/+Dg4P/j4+P/5eXl/+fn5//o6Oj/6urq/+zs7P/t7e3x////AdnZ + 2TfW1tb/0tLS/7y8vP8zMzP/IyMj/yMjI/8iIiL/NyIe/50pFP8tIR//bSYZ/4knFv85Ix//TyQc/y4i + If9gJhv/XiUb/3ImGP9BIx7/KCMh/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/x4eHv8lJSX/o6Oj/8XF + xf/Kysr/zs7O/9LS0v/W1tb/2dnZ/9zc3P/e3t7/4ODg/+Pj4//l5eX/5+fn/+jo6P/q6ur/6+vr/+3t + 7f/u7u7x////Adzc3DfZ2dn/1dXV/7Gxsf8lJSX/IyMj/yMjI/8iIiL/JCEh/1gkG/97Jhb/aCQX/34n + F/95Jhf/aiUZ/3wmF/88Ix7/UCQc/20mGf9oJhr/bSYZ/zIjIP8iIiL/IyMj/yMjI/8jIyP/ISEh/xkZ + Gf+YmJj/yMjI/8zMzP/Q0ND/1NTU/9fX1//a2tr/3d3d/9/f3//h4eH/4+Pj/+Xl5f/n5+f/6Ojo/+rq + 6v/r6+v/7e3t/+7u7v/v7+/x////Ad/f3zfd3d3/2dnZ/8fHx/9OTk7/JCQk/yMjI/8iIiL/IiIi/yEh + If8pISD/QSMd/0QjHf9pJRn/ISAg/3QlF/9DIx3/WCQb/ywiIP84Ix//aiYa/2UmGv9TJRz/IiIi/yIi + Iv8rKyv/Pj4+/5WVlf/Ly8v/z8/P/9LS0v/V1dX/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXl/+fn + 5//p6en/6urq/+vr6//t7e3/7u7u/+/v7//w8PDx////AeHh4Tfg4OD/3d3d/9ra2v/V1dX/k5OT/zc3 + N/8iIiL/IiIi/yIiIv8hISH/ISEh/yQhIP9oJRn/cSQX/2glGf+EJxb/PiMe/0kjHP9BIx7/YiUa/28m + Gf8kIyL/IyMj/yIiIv8cHBz/kJCQ/87Ozv/S0tL/1dXV/9jY2P/b29v/3d3d/+Dg4P/i4uL/5OTk/+Xl + 5f/n5+f/6Ojo/+np6f/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fHx////AeTk5Dfj4+P/4ODg/97e + 3v/b29v/2dnZ/8vLy/91dXX/Kioq/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/1wkGv90Jhj/QyIc/4An + F/8mIiH/ZyYa/ygjIv8jIyP/JCQk/xQUFP99fX3/0dHR/9bW1v/Y2Nj/2tra/93d3f/f39//4uLi/+Tk + 5P/l5eX/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7u7u/+/v7//w8PD/8PDw//Hx8f/y8vLx////Aefn + 5zfm5ub/4+Pj/+Hh4f/g4OD/3t7e/9zc3P/Z2dn/t7e3/1paWv9PT0//NTU1/yIiIv8hISH/ISEh/yEh + If9UJBz/iSgW/0QjHf9yJhj/VCYd/yMjIv8nJyf/Nzc3/3Z2dv/S0tL/2dnZ/9vb2//e3t7/4ODg/+Li + 4v/k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fH/8vLy//Ly + 8v/z8/Px////Aenp6Tfp6en/5+fn/+Xl5f/j4+P/4uLi/+Dg4P/e3t7/3d3d/9vb2//a2tr/ysrK/0BA + QP8iIiL/IiIi/yIiIv8iIiL/KCIh/2snGv9RJR7/IyMi/yIiIv8bGxv/eXl5/9bW1v/d3d3/39/f/+Dg + 4P/i4uL/5OTk/+bm5v/n5+f/6Ojo/+np6f/q6ur/6+vr/+zs7P/t7e3/7u7u/+/v7//w8PD/8PDw//Hx + 8f/y8vL/8/Pz//Pz8//09PTx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Tk5P/j4+P/4eHh/+Dg + 4P/f39//3t7e/5SUlP8rKyv/IiIi/yIiIv8iIiL/IiIi/yMjI/8iIiL/IyMj/xYWFv9SUlL/1dXV/+Hh + 4f/i4uL/4+Pj/+Xl5f/m5ub/5+fn/+np6f/q6ur/6+vr/+zs7P/t7e3/7e3t/+7u7v/v7+//7+/v//Dw + 8P/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/19fXx////Ae3t7Tft7e3/7Ozs/+vr6//q6ur/6enp/+fn + 5//m5ub/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/IyMj/YmJi/yQkJP8jIyP/IyMj/yMjI/8kJCT/WFhY/11d + Xf/U1NT/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw + 8P/w8PD/8fHx//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/19fXx////Ae/v7zfu7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/7CwsP9HR0f/IyMj/yMj + I/+Dg4P/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//T09P/09PT/9fX1//X19f/29vbx////AfHx + 8Tfw8PD/7+/v/+/v7//u7u7/7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/6Ojo/+jo6P/n5+f/6Ojo/+jo + 6P/f39//kZGR/4GBgf/m5ub/6enp/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Hx8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//X19f/19fX/9vb2//b2 + 9v/29vbx////AfLy8jfy8vL/8fHx//Dw8P/w8PD/7+/v/+7u7v/u7u7/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//09PT/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//f39//39/fx////AfPz8zfz8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+/v + 7//u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//b29v/29vb/9/f3//f39//39/fx////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B7+/v8e/v7//u7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5OTk/+Pj4//h4eH/4ODg/97e3v/d3d3/29vb/9ra + 2v/Y2Nj/19fX/9XV1f/R0dH/zs7O/8vLy//Hx8f/xMTE/8HBwf++vr7/u7u7/7i4uP+1tbX/srKy/7Cw + sP+vr6//rq6u/62trf+urq7/r6+v/7CwsP+xsbH/s7Oz/7W1tf+3t7f/urq6/7y8vP+/v7//wcHB/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/0NDQ/9LS0v/V1dX/19fX/9nZ2f/c3Nz/3t7e/+Dg4Jf///8B////Ae/v + 7/Hu7u7/7e3t/+3t7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//l5eX/5OTk/+Li4v/h4eH/39/f/93d + 3f/c3Nz/2tra/9jY2P/W1tb/1dXV/9LS0v/Q0ND/zMzM/8jIyP/ExMT/wMDA/7y8vP+4uLj/tLS0/7Cw + sP+srKz/qKio/6Wlpf+kpKT/o6Oj/6Kiov+ioqL/o6Oj/6Wlpf+np6f/qKio/6qqqv+tra3/sLCw/7Oz + s/+2trb/uLi4/7u7u/++vr7/wcHB/8PDw//Gxsb/ycnJ/8vLy//Ozs7/0dHR/9TU1P/W1tb/2dnZ/9zc + 3P/e3t6X////Af///wHu7u7x7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/5+fn/+bm5v/l5eX/5OTk/+Li + 4v/g4OD/3t7e/93d3f/b29v/2dnZ/9fX1//U1NT/0tLS/9DQ0P/Nzc3/ycnJ/8bGxv/BwcH/vLy8/7e3 + t/+ysrL/rq6u/6ioqP+hoaH/k5OT/5iYmP+VlZX/lJSU/5SUlP+VlZX/lpaW/5iYmP+ampr/nJyc/5+f + n/+hoaH/paWl/6mpqf+srKz/r6+v/7Kysv+1tbX/uLi4/7u7u/++vr7/wcHB/8TExP/Hx8f/ysrK/87O + zv/R0dH/1NTU/9fX1//a2tr/3Nzcl////wH///8B7e3t8ezs7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm + 5v/k5OT/4+Pj/+Hh4f/f39//3t7e/9zc3P/a2tr/2NjY/9XV1f/T09P/0NDQ/87Ozv/Kysr/x8fH/8PD + w/+/v7//urq6/7W1tf+urq7/qKio/6Ghof+ZmZn/fX19/2RkZP94eHj/hoaG/4WFhf+Ghob/h4eH/4qK + iv+MjIz/jo6O/5GRkf+VlZX/mJiY/5ycnP+goKD/pKSk/6enp/+rq6v/rq6u/7Kysv+1tbX/uLi4/7u7 + u/+/v7//w8PD/8bGxv/Kysr/zs7O/9HR0f/U1NT/19fX/9ra2pf///8B////Aezs7PHr6+v/6urq/+np + 6f/o6Oj/5+fn/+Xl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9XV1f/S0tL/z8/P/8zM + zP/IyMj/xcXF/8HBwf+8vLz/uLi4/7Ozs/+tra3/pKSk/5ycnP+Tk5P/ioqK/2pqav9jY2P/ampq/3l5 + ef94eHj/eHh4/3p6ev99fX3/gYGB/4SEhP+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//o6Oj/6en + p/+rq6v/r6+v/7Kysv+2trb/urq6/76+vv/CwsL/xsbG/8rKyv/Nzc3/0dHR/9XV1f/X19eX////Af// + /wHq6urx6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra2v/Y2Nj/1tbW/9TU + 1P/R0dH/zs7O/8vLy//Hx8f/w8PD/7+/v/+6urr/tbW1/7CwsP+qqqr/oqKi/5iYmP+Ojo7/g4OD/3p6 + ev9oaGj/ZWVl/2dnZ/9tbW3/bGxs/21tbf9wcHD/c3Nz/3Z2dv96enr/fX19/4GBgf+FhYX/ioqK/46O + jv+Tk5P/l5eX/5ubm/+goKD/pKSk/6ioqP+srKz/sLCw/7W1tf+5ubn/vr6+/8LCwv/Gxsb/ysrK/87O + zv/S0tL/1dXVl////wH///8B6enp8ejo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra + 2v/Y2Nj/1tbW/9PT0//R0dH/zs7O/8rKyv/Hx8f/w8PD/76+vv+5ubn/s7Oz/66urv+oqKj/oKCg/5aW + lv+MjIz/gICA/3Z2dv9ubm7/Z2dn/2tra/9tbW3/Y2Nj/2JiYv9jY2P/Z2dn/2pqav9tbW3/cHBw/3Nz + c/93d3f/fHx8/4CAgP+FhYX/ioqK/46Ojv+Tk5P/mJiY/52dnf+hoaH/pqam/6urq/+vr6//tLS0/7m5 + uf+9vb3/wsLC/8bGxv/Ly8v/z8/P/9LS0pf///8B////Aejo6PHn5+f/5ubm/+Xl5f/j4+P/4uLi/+Dg + 4P/f39//3d3d/9ra2v/Y2Nj/1tbW/9PT0//Q0ND/zc3N/8rKyv/Hx8f/w8PD/76+vv+4uLj/s7Oz/62t + rf+mpqb/n5+f/5SUlP+Kior/eHh4/1dXV/9fX1//Z2dn/2lpaf9vb2//dHR0/2VlZf9aWlr/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9qamr/bm5u/3Nzc/93d3f/fHx8/4GBgf+Ghob/i4uL/5CQkP+VlZX/mpqa/5+f + n/+kpKT/qqqq/6+vr/+0tLT/ubm5/76+vv/Dw8P/yMjI/8zMzP/Pz8+X////Af///wHo6Ojx5ubm/+Xl + 5f/k5OT/4uLi/+Dg4P/f39//3d3d/9vb2//Y2Nj/1tbW/9PT0//Q0ND/zc3N/8nJyf/Gxsb/wsLC/729 + vf+4uLj/s7Oz/62trf+mpqb/nZ2d/5SUlP+IiIj/fHx8/2JiYv9MTEz/TExM/2JiYv9sbGz/cXFx/3Z2 + dv9jY2P/UlJS/1RUVP9PT0//NDQ0/0xMTP9eXl7/YmJi/2ZmZv9qamr/b29v/3Nzc/95eXn/fn5+/4OD + g/+JiYn/jo6O/5SUlP+ZmZn/np6e/6SkpP+qqqr/r6+v/7W1tf+6urr/v7+//8XFxf/Jycn/zc3Nl/// + /wH///8B5+fn8eXl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/1tbW/9PT0//Q0ND/zc3N/8nJ + yf/FxcX/wcHB/729vf+4uLj/s7Oz/62trf+mpqb/np6e/5SUlP+IiIj/fHx8/3BwcP9dXV3/TExM/0dH + R/9kZGT/b29v/319ff+CgoL/YWFh/0xMTP9JSUn/JCQk/xwcHP8gICD/NjY2/1RUVP9eXl7/YmJi/2Zm + Zv9ra2v/cHBw/3Z2dv97e3v/gYGB/4eHh/+MjIz/kpKS/5iYmP+enp7/pKSk/6urq/+xsbH/t7e3/7y8 + vP/CwsL/x8fH/8vLy5f///8B////Aebm5vHk5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9TU + 1P/R0dH/zc3N/8rKyv/Gxsb/wcHB/729vf+4uLj/s7Oz/6ysrP+mpqb/np6e/5WVlf+JiYn/fn5+/3Bw + cP9iYmL/W1tb/1dXV/9NTU3/ZWVl/3l5ef+Xl5f/ampq/2xsbP9GRkb/JSUl/xsbG/8vLy//Hh4e/x4e + Hv8kJCT/QkJC/1hYWP9eXl7/Y2Nj/2hoaP9ubm7/c3Nz/3l5ef9/f3//hYWF/4yMjP+SkpL/mJiY/5+f + n/+mpqb/ra2t/7Ozs/+6urr/v7+//8XFxf/JycmX////Af///wHk5OTx4+Pj/+Hh4f/f39//3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zs7O/8rKyv/Gxsb/wsLC/729vf+4uLj/s7Oz/62trf+mpqb/n5+f/5WV + lf+Kior/fX19/2FhYf9eXl7/VlZW/1paWv9mZmb/VlZW/21tbf+Wlpb/Z2dn/2xsbP+Ghob/RERE/xsb + G/8mJib/HBwc/x4eHv8eHh7/Hh4e/x4eHv8sLCz/TExM/1paWv9gYGD/ZmZm/2xsbP9xcXH/d3d3/35+ + fv+EhIT/i4uL/5KSkv+ampr/oaGh/6ioqP+wsLD/t7e3/729vf/Dw8P/yMjIl////wH///8B4+Pj8eHh + 4f/g4OD/3t7e/9zc3P/a2tr/2NjY/9XV1f/S0tL/zs7O/8rKyv/Hx8f/wsLC/729vf+4uLj/s7Oz/66u + rv+np6f/n5+f/5eXl/+Kior/fn5+/2dnZ/9ISEj/QUFB/1FRUf9jY2P/ampq/01NTf+EhIT/bm5u/2Vl + Zf+IiIj/5eXl/39/f/8jIyP/Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/HR0d/x8fH/83Nzf/VFRU/15e + Xv9kZGT/aWlp/3BwcP92dnb/fX19/4SEhP+MjIz/k5OT/5ycnP+kpKT/rKys/7S0tP+8vLz/wsLC/8fH + x5f///8B////AeLi4vHg4OD/3t7e/9zc3P/a2tr/2NjY/9bW1v/T09P/z8/P/8vLy//Hx8f/w8PD/76+ + vv+5ubn/s7Oz/62trf+np6f/n5+f/5aWlv+MjIz/f39//3Jycv9fX1//SUlJ/zo6Ov9XV1f/aWlp/3Bw + cP9PT0//V1dX/11dXf+IiIj/39/f/7S0tP8nJyf/Jycn/yEhIf8lJSX/JCQk/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/yUlJf9ERET/W1tb/2JiYv9oaGj/b29v/3Z2dv99fX3/hYWF/42Njf+Wlpb/n5+f/6mp + qf+ysrL/urq6/8HBwf/GxsaX////Af///wHh4eHx39/f/93d3f/b29v/2NjY/9bW1v/T09P/0NDQ/8zM + zP/IyMj/w8PD/76+vv+5ubn/tLS0/66urv+np6f/oKCg/5aWlv+Li4v/gICA/3R0dP9nZ2f/XV1d/01N + Tf86Ojr/WVlZ/25ubv+Li4v/c3Nz/05OTv9dXV3/0dHR/8bGxv8uLi7/JiYm/yAgIP8kJCT/JSUl/yYm + Jv8lJSX/IiIi/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/zAwMP9RUVH/YWFh/2dnZ/9ubm7/dXV1/319 + ff+Ghob/kJCQ/5qamv+lpaX/r6+v/7m5uf/BwcH/xsbGl////wH///8B4ODg8d7e3v/b29v/2dnZ/9bW + 1v/T09P/0NDQ/8zMzP/IyMj/xMTE/7+/v/+6urr/tLS0/66urv+oqKj/oaGh/5iYmP+MjIz/gYGB/25u + bv9mZmb/Xl5e/1paWv9iYmL/SkpK/1lZWf+Ghob/hYWF/1hYWP9paWn/Ozs7/2xsbP81NTX/JiYm/yAg + IP8kJCT/JSUl/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x4eHv8eHh7/IiIi/z4+ + Pv9bW1v/ZGRk/2tra/90dHT/fn5+/4qKiv+Wlpb/oaGh/62trf+3t7f/wcHB/8bGxpf///8B////Ad7e + 3vHc3Nz/2tra/9fX1//U1NT/0NDQ/8zMzP/IyMj/xMTE/8DAwP+7u7v/tbW1/6+vr/+oqKj/oaGh/5mZ + mf+Ojo7/goKC/3Jycv9OTk7/RUVF/1RUVP9dXV3/ZmZm/0ZGRv9qamr/ioqK/1RUVP99fX3/tLS0/4CA + gP8bGxv/HR0d/x4eHv8jIyP/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/KSkp/0pKSv9fX1//ampq/3d3d/+EhIT/kpKS/5+fn/+rq6v/tra2/8DA + wP/Hx8eX////Af///wHd3d3x2tra/9fX1//U1NT/0dHR/83Nzf/Jycn/xcXF/8DAwP+7u7v/tra2/7Cw + sP+qqqr/oqKi/5qamv+QkJD/hISE/3d3d/9nZ2f/TExM/zw8PP9SUlL/ZGRk/2pqav9BQUH/Wlpa/1RU + VP97e3v/ra2t/+rq6v9OTk7/IiIi/xsbG/8kJCT/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/NjY2/11dXf9ycnL/f39//4yM + jP+cnJz/qamp/7W1tf/AwMD/x8fHl////wH///8B29vb8djY2P/V1dX/0tLS/87Ozv/Kysr/xsbG/8HB + wf+8vLz/t7e3/7Gxsf+qqqr/pKSk/5ycnP+SkpL/h4eH/3p6ev9tbW3/YWFh/05OTv82Njb/VFRU/2lp + af94eHj/bGxs/zMzM/9fX1//pKSk/+/v7/9gYGD/JCQk/yAgIP8kJCT/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8mJib/Tk5O/1xcXP9oaGj/k5OT/6enp/+0tLT/wMDA/8fHx5f///8B////AdnZ2fHW1tb/09PT/8/P + z//Ly8v/x8fH/8LCwv+9vb3/t7e3/7Kysv+rq6v/pKSk/52dnf+Tk5P/iIiI/3t7e/9vb2//ZWVl/1xc + XP9cXFz/SkpK/09PT/92dnb/l5eX/1lZWf9GRkb/MTEx/6enp/9tbW3/IiIi/yAgIP8iIiL/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JCQk/yIi + Iv8fHx//Hx8f/yAgIP8gICD/ICAg/yAgIP8pKSn/Wlpa/46Ojv+np6f/tbW1/8HBwf/Hx8eX////Af// + /wHX19fx1NTU/9DQ0P/MzMz/yMjI/8PDw/++vr7/ubm5/7Ozs/+srKz/paWl/52dnf+UlJT/iYmJ/319 + ff9cXFz/SkpK/1lZWf9aWlr/Y2Nj/0xMTP9TU1P/k5OT/2BgYP9sbGz/i4uL/2BgYP8YGBj/Hh4e/yEh + If8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8lJSX/JCQk/yEhIf8gICD/ICAg/yAgIP8gICD/ICAg/zQ0NP+QkJD/qKio/7e3 + t//Dw8P/yMjIl////wH///8B1dXV8dLS0v/Ozs7/ycnJ/8XFxf/AwMD/urq6/7S0tP+urq7/p6en/5+f + n/+VlZX/i4uL/39/f/9xcXH/UVFR/zw8PP9OTk7/YWFh/2dnZ/9ISEj/UVFR/2lpaf9kZGT/ioqK/+fn + 5/+NjY3/Hh4e/xgYGP8fHx//JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/IyMj/yAgIP8gICD/ICAg/yEh + If8uLi7/jo6O/6urq/+7u7v/xcXF/8nJyZf///8B////AdPT0/HPz8//y8vL/8bGxv/BwcH/u7u7/7W1 + tf+vr6//qKio/6CgoP+Wlpb/jY2N/4GBgf91dXX/aWlp/1NTU/82Njb/TU1N/2dnZ/9vb2//Y2Nj/yoq + Kv9SUlL/hoaG/9/f3/+pqan/JSUl/yQkJP8gICD/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/ISEh/yAgIP8gICD/Jycn/4ODg/+qqqr/wMDA/8fHx//Ly8uX////Af///wHR0dHxzc3N/8jI + yP/Dw8P/vb29/7e3t/+wsLD/qqqq/6Kiov+YmJj/jo6O/4SEhP93d3f/bW1t/2NjY/9aWlr/R0dH/0hI + SP9tbW3/jIyM/3R0dP8vLy//MjIy/6+vr//AwMD/Jycn/yYmJv8gICD/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8kJCT/ICAg/yUlJf+EhIT/ra2t/8PDw//Jycn/zc3Nl/// + /wH///8Bz8/P8cvLy//Gxsb/wMDA/7q6uv+zs7P/rKys/6SkpP+bm5v/kZGR/4aGhv9xcXH/VVVV/19f + X/9dXV3/YmJi/1ZWVv8/Pz//h4eH/4GBgf9TU1P/cHBw/zc3N/8nJyf/R0dH/yQkJP8hISH/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf81NTX/i4uL/6+v + r//Gxsb/y8vL/8/Pz5f///8B////Ac3NzfHIyMj/w8PD/7y8vP+1tbX/rq6u/6ampv+dnZ3/kpKS/4eH + h/96enr/WVlZ/0RERP9NTU3/Xl5e/2dnZ/9UVFT/QUFB/4uLi/9PT0//fHx8/7y8vP/Gxsb/Hh4e/xgY + GP8dHR3/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/SUlJ/4+Pj/+4uLj/ycnJ/83Nzf/R0dGX////Af///wHLy8vxxcXF/7+/v/+4uLj/sLCw/6io + qP+fn5//lZWV/4mJif98fHz/b29v/1paWv8/Pz//SEhI/2VlZf9ra2v/YmJi/yQkJP9JSUn/enp6/7Gx + sf/k5OT/QEBA/yMjI/8dHR3/ISEh/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8kJCT/ERER/y8vL/+rq6v/xcXF/8rKyv/Pz8//0tLSl////wH///8BycnJ8cPD + w/+8vLz/tLS0/6urq/+ioqL/l5eX/4yMjP9/f3//c3Nz/2lpaf9eXl7/RERE/0VFRf9paWn/fHx8/4uL + i/8nJyf/Ojo6/5ycnP/o6Oj/UlJS/yIiIv8gICD/IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/FhYW/ywsLP+fn5//wsLC/8jIyP/MzMz/0NDQ/9TU + 1Jf///8B////AcbGxvHAwMD/ubm5/7CwsP+mpqb/m5ub/4+Pj/+AgID/YmJi/2ZmZv9kZGT/YWFh/2Bg + YP84ODj/d3d3/5SUlP9WVlb/W1tb/ygoKP87Ozv/XV1d/yEhIf8fHx//IiIi/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8nJyf/Kysr/ygoKP+ZmZn/wMDA/8bG + xv/Kysr/zs7O/9LS0v/W1taX////Af///wHFxcXxvr6+/7W1tf+rq6v/oKCg/5OTk/+Ghob/a2tr/0tL + S/9MTEz/YWFh/2ZmZv9hYWH/NjY2/5KSkv9dXV3/aWlp/5KSkv/FxcX/ISEh/yEhIf8bGxv/IiIi/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JiYm/ysrK/8rKyv/KCgo/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/NTU1/2tr + a/+jo6P/v7+//8TExP/IyMj/zMzM/9HR0f/V1dX/2NjYl////wH///8Bw8PD8bu7u/+xsbH/pqam/5qa + mv+MjIz/fHx8/2ZmZv9JSUn/RkZG/2RkZP9sbGz/Z2dn/ycnJ/9UVFT/YmJi/4uLi//p6en/hoaG/x8f + H/8bGxv/ICAg/yUlJf8kJCT/IyMj/ygoKP9OTk7/f39//6Ghof+ysrL/s7Oz/6ioqP+Pj4//YmJi/zMz + M/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yUl + Jf8lJSX/HBwc/xkZGf+Li4v/vLy8/8LCwv/Gxsb/y8vL/8/Pz//T09P/19fX/9nZ2Zf///8B////AcLC + wvG5ubn/r6+v/6Ojo/+Wlpb/hoaG/3d3d/9nZ2f/SkpK/0VFRf9qamr/dHR0/5CQkP8uLi7/Nzc3/4CA + gP/j4+P/m5ub/x0dHf8hISH/IiIi/yYmJv8kJCT/IyMj/0hISP+lpaX/ycnJ/8vLy//Ly8v/y8vL/8zM + zP/MzMz/zc3N/83Nzf++vr7/cnJy/yoqKv8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/IiIi/xEREf9/f3//u7u7/8LCwv/Gxsb/ycnJ/83Nzf/R0dH/1dXV/9jY + 2P/b29uX////Af///wHBwcHxuLi4/62trf+hoaH/h4eH/35+fv94eHj/bGxs/2hoaP9BQUH/bGxs/5OT + k/92dnb/RkZG/yQkJP9LS0v/lZWV/yAgIP8iIiL/ICAg/yUlJf8kJCT/JCQk/2lpaf/Gxsb/zc3N/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/y8vL/8rKyv+np6f/Nzc3/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/IyMj/wwMDP93d3f/uLi4/8HBwf/FxcX/ycnJ/8zM + zP/Q0ND/1NTU/9fX1//a2tr/3Nzcl////wH///8BwcHB8be3t/+srKz/mJiY/2FhYf9VVVX/eXl5/3Bw + cP9ubm7/Ojo6/4WFhf9+fn7/UFBQ/35+fv+bm5v/Jycn/zAwMP8bGxv/HR0d/yMjI/8kJCT/IyMj/19f + X//Gxsb/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8rKyv/Kysr/ycnJ/6Oj + o/8rKyv/IyMj/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/MjIy/1lZWf+AgID/t7e3/8DA + wP/ExMT/yMjI/8vLy//Pz8//0tLS/9bW1v/Z2dn/29vb/97e3pf///8B////AcLCwvG5ubn/ra2t/5WV + lf9fX1//SkpK/3l5ef90dHT/c3Nz/zIyMv9qamr/TU1N/3x8fP/CwsL/ycnJ/ywsLP8aGhr/Gxsb/yIi + Iv8jIyP/JCQk/zU1Nf+2trb/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vL + y//Kysr/ysrK/8rKyv/Kysr/c3Nz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8kJCT/ISEh/xUV + Ff9zc3P/s7Oz/7+/v//Dw8P/x8fH/8vLy//Ozs7/0tLS/9XV1f/Y2Nj/2tra/93d3f/f39+X////Af// + /wHDw8Pxu7u7/6+vr/+Wlpb/X19f/0dHR/96enr/enp6/4mJif9DQ0P/Pj4+/3Z2dv+0tLT/2dnZ/zk5 + Of8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP9paWn/zMzM/83Nzf/MzMz/zMzM/83Nzf/Nzc3/zs7O/83N + zf/Nzc3/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/zMzM/7Ozs/8rKyv/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8kJCT/ISEh/w0NDf9RUVH/r6+v/76+vv/CwsL/x8fH/8rKyv/Ozs7/0dHR/9TU1P/X19f/2tra/9zc + 3P/f39//4eHhl////wH///8Bw8PD8b29vf+zs7P/mZmZ/3V1df9VVVX/c3Nz/4qKiv+Tk5P/RERE/zAw + MP9qamr/09PT/0NDQ/8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/kJCQ/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/83Nzf/MzMz/zMzM/8vLy//Ly8v/zMzM/83Nzf/Jycn/PDw8/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IyMj/w4ODv9KSkr/qamp/729vf/BwcH/xsbG/8rKyv/Ozs7/0dHR/9TU + 1P/X19f/2tra/9zc3P/e3t7/4eHh/+Li4pf///8B////AcPDw/G9vb3/tra2/5aWlv9/f3//UFBQ/3R0 + dP+Xl5f/UlJS/29vb/92dnb/ISEh/y8vL/8fHx//Hx8f/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/5iY + mP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/0dHR/8kJCT/JCQk/yQkJP8kJCT/KSkp/0RERP9WVlb/q6ur/7y8vP/AwMD/xcXF/8rK + yv/Nzc3/0dHR/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OSX////Af///wHFxcXxvr6+/7Oz + s/+Hh4f/goKC/0xMTP9wcHD/V1dX/2pqav+Tk5P/7u7u/1NTU/8eHh7/GRkZ/yQkJP8lJSX/JCQk/yQk + JP8kJCT/JCQk/yQkJP+Ghob/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8bGxv87Ozv/JCQk/yQkJP8kJCT/IyMj/xoaGv9ZWVn/pKSk/7y8 + vP/AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXll/// + /wH///8BxsbG8cDAwP+oqKj/hYWF/4qKiv9fX1//Pj4+/2hoaP+Ojo7/6enp/3V1df8dHR3/ICAg/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/VlZW/8vLy//Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy/+pqan/KCgo/yQkJP8kJCT/IiIi/xIS + Ev8vLy//oqKi/7u7u//AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li + 4v/k5OT/5eXl/+bm5pf///8B////AcjIyPHDw8P/qKio/4qKiv+cnJz/X19f/zMzM/+CgoL/1tbW/4eH + h/8eHh7/ICAg/yEhIf8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/ysrK/+np6f/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Jycn/YWFh/yQk + JP8kJCT/IyMj/xUVFf8mJib/lZWV/7u7u//AwMD/xMTE/8nJyf/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb + 2//e3t7/4ODg/+Li4v/j4+P/5eXl/+fn5//o6OiX////Af///wHKysrxxcXF/6qqqv+bm5v/cnJy/1ZW + Vv9iYmL/MzMz/0NDQ/8qKir/ISEh/yAgIP8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/R0dH/729vf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vL + y//Kysr/kZGR/ycnJ/8kJCT/JSUl/zY2Nv8zMzP/lpaW/7u7u//AwMD/xMTE/8jIyP/MzMz/0NDQ/9PT + 0//W1tb/2dnZ/9vb2//d3d3/4ODg/+Li4v/j4+P/5eXl/+bm5v/o6Oj/6enpl////wH///8By8vL8cfH + x/+1tbX/e3t7/1BQUP9/f3//0dHR/4WFhf8mJib/GRkZ/x8fH/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP9LS0v/tbW1/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/8zMzP/IyMj/j4+P/y4uLv8kJCT/IyMj/yIiIv9LS0v/lJSU/729vf/BwcH/xcXF/8jI + yP/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5eXl/+bm5v/o6Oj/6enp/+rq + 6pf///8B////Ac7OzvHKysr/urq6/1lZWf96enr/xcXF/7y8vP8kJCT/Hx8f/x0dHf8iIiL/IiIi/yIi + Iv8oIiH/PiId/yMiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/zMzM/+Dg4P/v7+//8vL + y//Nzc3/zc3N/83Nzf/Nzc3/zMzM/8rKyv+srKz/XV1d/yYmJv8kJCT/IyMj/xsbG/8UFBT/goKC/7u7 + u//CwsL/xcXF/8nJyf/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm + 5v/o6Oj/6enp/+rq6v/r6+uX////Af///wHQ0NDxzc3N/8nJyf+wsLD/t7e3/9LS0v8oKCj/ICAg/x0d + Hf8jIyP/IyMj/yIiIv8jISH/gicW/3UnGf8jIiH/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/zAwMP9dXV3/fX19/5OTk/+ZmZn/jo6O/29vb/9HR0f/Jycn/yQkJP8kJCT/IyMj/x0d + Hf8NDQ3/dXV1/7q6uv/CwsL/xsbG/8rKyv/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh + 4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozsl////wH///8B09PT8dDQ0P/MzMz/xcXF/3Z2 + dv88PDz/Hx8f/x8fH/8lJSX/IyMj/yIiIv8iISH/dyYX/44oFv8lIiH/IiIi/yQhIf88Ih7/KCIh/y0i + IP9gJRr/aCYa/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/IyMj/y0tLf8bGxv/cnJy/7i4uP/Dw8P/xsbG/8rKyv/Ozs7/0dHR/9TU1P/W1tb/2dnZ/9vb + 2//d3d3/39/f/+Hh4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozs/+3t7Zf///8B////AdXV + 1fHS0tL/z8/P/8jIyP9kZGT/NDQ0/yMjI/8kJCT/IyMj/yIiIv8iISH/aCQY/5cpFf+RKBX/fSYW/3kl + Fv+WKBT/jykW/3slFv9uJhn/UyUd/1omHf9GJB3/WSQa/ygiIf8jIyL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/IyMj/yIiIv9FRUX/gICA/729vf/ExMT/x8fH/8vLy//Ozs7/0dHR/9TU + 1P/X19f/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t + 7f/u7u6X////Af///wHY2Njx1dXV/9LS0v/Ly8v/UlJS/ycnJ/8iIiL/IyMj/yIiIv8iIiL/RiMd/7Yr + Ev8zIR7/JiAg/2QlGv+SKBX/LSIg/ykhIP9GIx3/KCIh/2ImG/9EJB7/aSYZ/2IkGf94Jhj/NiMf/yci + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yAgIP8MDAz/Xl5e/7e3t//FxcX/ycnJ/8zM + zP/Pz8//0tLS/9XV1f/X19f/2tra/9zc3P/e3t7/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+np + 6f/r6+v/7Ozs/+3t7f/u7u7/7+/vl////wH///8B2tra8dfX1//U1NT/ysrK/z4+Pv8iIiL/IyMj/yMj + I/8iIiL/IiIi/yUhIP9dJRv/kicU/1QiGf9QIhn/oyoU/0QiHP+TKBT/fScX/4YmFf9eJRr/LiIg/2ol + Gf+DJxf/bCYZ/2UmG/9yJhj/LCIh/yMiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8NDQ3/TExM/7i4 + uP/IyMj/y8vL/83Nzf/Q0ND/09PT/9bW1v/Z2dn/29vb/93d3f/e3t7/4ODg/+Hh4f/j4+P/5OTk/+bm + 5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v75f///8B////Ad3d3fHa2tr/19fX/83N + zf8/Pz//IyMj/yQkJP8jIyP/IyMj/yIiIv8hISH/ISEh/y4hH/9tJhn/gScX/0cjHf+aKRT/OiIe/yEh + If9LIxz/fScX/yUhIf8tIiD/KiIg/1clHP9HIx3/bSca/2smGv88Ix7/LCMh/yMjI/8jIyP/IyMj/ycn + J/8WFhb/RkZG/7S0tP/Kysr/zc3N/8/Pz//S0tL/1NTU/9fX1//a2tr/3Nzc/97e3v/f39//4eHh/+Li + 4v/j4+P/5eXl/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v7//w8PCX////Af// + /wHf39/x3d3d/9ra2v/Y2Nj/vr6+/1xcXP8lJSX/IyMj/yMjI/8iIiL/IiIi/yIiIv8hISH/ISEh/yEh + If8nISD/likV/zAhHv8nIB//iSYU/1skG/92JRf/aCUZ/yIiIf8iIiH/RyMd/3QmGP9dJRv/ayca/zUk + IP8jIyP/IiIi/yMjI/9GRkb/a2tr/7m5uf/Nzc3/z8/P/9HR0f/U1NT/1tbW/9jY2P/b29v/3d3d/9/f + 3//g4OD/4uLi/+Pj4//k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHxl////wH///8B4eHh8d/f3//d3d3/29vb/9nZ2f/W1tb/paWl/0dHR/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8hISH/ISEh/zkiHv99Jhb/hyYV/14kGv9tJBf/gicX/yQhIP8+Ih3/fCYX/0Ij + Hv9YJRz/hSgX/ykjIv8jIyP/IyMj/yMjI/8TExP/NjY2/62trf/Q0ND/0tLS/9TU1P/W1tb/2NjY/9ra + 2v/c3Nz/3t7e/+Dg4P/i4uL/4+Pj/+Tk5P/l5eX/5+fn/+jo6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8pf///8B////AePj4/Hh4eH/39/f/93d3f/c3Nz/2tra/9jY + 2P/Pz8//ioqK/zU1Nf8iIiL/IyMj/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/yIhIP9QIxv/qioT/y0h + H/82IR3/nCkU/zojH/8mIiH/YiUa/ysjIf8jIyL/IyMj/yQkJP8YGBj/KCgo/6urq//S0tL/1dXV/9fX + 1//Y2Nj/2tra/9zc3P/e3t7/4ODg/+Li4v/j4+P/5OTk/+Xl5f/n5+f/6Ojo/+jo6P/p6en/6urq/+vr + 6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vKX////Af///wHl5eXx5OTk/+Li + 4v/g4OD/39/f/93d3f/c3Nz/2tra/9jY2P/BwcH/aWlp/ygoKP8iIiL/IiIi/yIiIv8iIiL/ISEh/yEh + If8hISH/KSEg/1kkG/+LJxT/pykT/00kHf8kIiH/fCcX/3QoGv8kIyL/IyMj/yQkJP8cHBz/ICAg/6Cg + oP/U1NT/19fX/9nZ2f/b29v/3Nzc/97e3v/g4OD/4eHh/+Pj4//k5OT/5ubm/+fn5//o6Oj/6Ojo/+np + 6f/q6ur/6+vr/+zs7P/s7Oz/7e3t/+7u7v/v7+//7+/v//Dw8P/x8fH/8fHx//Ly8v/z8/P/8/Pzl/// + /wH///8B5+fn8ebm5v/l5eX/4+Pj/+Li4v/g4OD/39/f/97e3v/c3Nz/29vb/9jY2P+tra3/lpaW/5eX + l/9aWlr/JCQk/yIiIv8iIiL/ISEh/yEhIf8iISH/MiIg/10mG/91Jhj/fSYX/30oGf8mIyL/IyMj/yMj + I/9BQUH/WVlZ/6ampv/X19f/2tra/9zc3P/d3d3/39/f/+Dg4P/i4uL/4+Pj/+Tk5P/m5ub/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7u7u/+7u7v/v7+//8PDw//Dw8P/x8fH/8fHx//Ly + 8v/z8/P/8/Pz//T09Jf///8B////Aenp6fHo6Oj/5+fn/+bm5v/k5OT/4+Pj/+Li4v/h4eH/39/f/97e + 3v/d3d3/3Nzc/9vb2//b29v/1NTU/1VVVf8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8kIiL/UCUd/1cm + Hf8mIyL/IyMj/yIiIv8aGhr/ICAg/5WVlf/Z2dn/3d3d/97e3v/f39//4eHh/+Li4v/j4+P/5eXl/+bm + 5v/n5+f/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Hx + 8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/09PSX////Af///wHr6+vx6urq/+np6f/o6Oj/5+fn/+bm + 5v/l5eX/5OTk/+Pj4//i4uL/4eHh/9/f3//f39//3t7e/93d3f+Xl5f/KSkp/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/IyMj/yIiIv8eHh7/DQ0N/4ODg//Z2dn/4ODg/+Hh4f/i4uL/4+Pj/+Tk + 5P/l5eX/5ubm/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Hx8f/x8fH/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9fX1l////wH///8B7e3t8ezs + 7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm5v/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/39/f/7m5 + uf9YWFj/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8gICD/DQ0N/3p6ev/Z2dn/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/6Ojo/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+/v + 7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Pz8//z8/P/9PT0//T09P/19fX/9fX1//b2 + 9pf///8B////Ae7u7vHt7e3/7Ozs/+zs7P/r6+v/6urq/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/i4uL/39/f/6Kiov8+Pj7/IyMj/yMjI/8jIyP/IyMj/yIiIv9ZWVn/tLS0/6en + p//c3Nz/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9fX1//X19f/29vaX////Af///wHv7+/x7u7u/+7u7v/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq + 6v/p6en/6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/l5eX/2NjY/4ODg/8xMTH/IiIi/yIi + Iv9NTU3/19fX/+bm5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2l////wH///8B8PDw8fDw8P/v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/6+vr/+rq6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+fn5//n5+f/5+fn/+fn + 5//m5ub/xMTE/2VlZf9LS0v/0tLS/+jo6P/p6en/6enp/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8vLy//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//X19f/19fX/9fX1//b29v/29vb/9vb2//f395f///8B////AfHx + 8fHx8fH/8PDw//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+3t7f/s7Oz/7Ozs/+vr6//q6ur/6urq/+rq + 6v/p6en/6enp/+np6f/p6en/6enp/+rq6v/n5+f/4eHh/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//f3 + 9//39/eX////Af///wHy8vLx8vLy//Hx8f/x8fH/8PDw//Dw8P/w8PD/7+/v/+/v7//u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3l////wH///8B8/Pz8fPz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Dw + 8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+7u7v/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/+Pj4//j4+Jf///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wHw8PDj8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW + 1v/V1dX/09PT/9LS0v/Q0ND/zs7O/83Nzf/Ly8v/ysrK/8jIyP/Hx8f/xcXF/8TExP/CwsL/wcHB/8DA + wP++vr7/vb29/7u7u/+6urr/uLi4/7e3t/+1tbX/tLS0/7Ozs/+ysrL/sbGx/7Gxsf+wsLD/sLCw/7Cw + sP+wsLD/sLCw/7Gxsf+xsbH/sbGx/7Kysv+ysrL/srKy/7S0tP+0tLT/tbW1/7a2tv+3t7f/uLi4/7m5 + uf+7u7v/u7u7/729vf++vr7/wMDA/8HBwf/BwcH/w8PD/8TExP/FxcX/xsbG/8jIyP/Jycn/ysrK/8vL + y//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e + 3v/e3t7/39/f/+Hh4f/h4eEx////Af///wH///8B////AfDw8OPv7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/3Nzc/9vb + 2//a2tr/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/z8/P/83Nzf/MzMz/ysrK/8jI + yP/Hx8f/xcXF/8PDw//BwcH/wMDA/7+/v/+9vb3/vLy8/7q6uv+4uLj/t7e3/7W1tf+zs7P/srKy/7Cw + sP+vr6//rq6u/62trf+tra3/rKys/6urq/+rq6v/q6ur/6urq/+rq6v/rKys/62trf+tra3/ra2t/66u + rv+urq7/sLCw/7CwsP+ysrL/srKy/7Ozs/+1tbX/tra2/7e3t/+5ubn/urq6/7y8vP+9vb3/vr6+/7+/ + v//AwMD/wsLC/8PDw//ExMT/xcXF/8bGxv/IyMj/ycnJ/8vLy//MzMz/zc3N/87Ozv/Pz8//0dHR/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e3v/f39//39/f/+Dg4DH///8B////Af// + /wH///8B7+/v4+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/93d3f/d3d3/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT + 0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Gxsb/xcXF/8LCwv/BwcH/v7+//729vf+8vLz/urq6/7i4 + uP+2trb/tLS0/7Kysv+wsLD/rq6u/6ysrP+rq6v/qamp/6ioqP+np6f/p6en/6ampv+lpaX/paWl/6Wl + pf+lpaX/paWl/6ampv+mpqb/p6en/6ioqP+oqKj/qamp/6qqqv+rq6v/rKys/62trf+vr6//sLCw/7Gx + sf+ysrL/tLS0/7a2tv+2trb/uLi4/7m5uf+7u7v/vLy8/729vf+/v7//wMDA/8LCwv/CwsL/w8PD/8XF + xf/Gxsb/yMjI/8nJyf/Ly8v/zMzM/83Nzf/Pz8//0NDQ/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ + 2f/b29v/3Nzc/97e3v/e3t7/39/fMf///wH///8B////Af///wHv7+/j7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/Pz//Nzc3/y8vL/8rKyv/Hx8f/xsbG/8PD + w//BwcH/v7+//729vf+7u7v/ubm5/7e3t/+1tbX/s7Oz/7Gxsf+urq7/rKys/6mpqf+np6f/paWl/6Oj + o/+ioqL/oaGh/6CgoP+goKD/n5+f/5+fn/+fn5//n5+f/5+fn/+goKD/oaGh/6Ghof+ioqL/o6Oj/6Sk + pP+lpaX/pqam/6enp/+oqKj/qamp/6qqqv+srKz/ra2t/6+vr/+xsbH/srKy/7Ozs/+1tbX/tra2/7i4 + uP+5ubn/u7u7/7y8vP+9vb3/v7+//8DAwP/BwcH/w8PD/8TExP/FxcX/x8fH/8jIyP/Kysr/y8vL/8zM + zP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/97e3v/e3t4x////Af// + /wH///8B////Ae7u7uPu7u7/7u7u/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/h4eH/4ODg/9/f + 3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/P + z//Ozs7/zMzM/8rKyv/IyMj/x8fH/8TExP/CwsL/v7+//729vf+7u7v/uLi4/7e3t/+0tLT/srKy/7Cw + sP+tra3/qqqq/6enp/+lpaX/oaGh/6CgoP+dnZ3/m5ub/5qamv+ZmZn/mJiY/5iYmP+YmJj/mJiY/5iY + mP+YmJj/mZmZ/5qamv+bm5v/nJyc/52dnf+dnZ3/n5+f/6CgoP+hoaH/oqKi/6Ojo/+lpaX/pqam/6io + qP+qqqr/q6ur/62trf+urq7/sLCw/7Kysv+zs7P/tbW1/7a2tv+4uLj/ubm5/7u7u/+8vLz/vb29/7+/ + v//AwMD/wsLC/8PDw//ExMT/xsbG/8fHx//Jycn/y8vL/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV + 1f/X19f/2dnZ/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8B7u7u4+3t7f/t7e3/7e3t/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/c3Nz/2tra/9nZ2f/Z2dn/19fX/9bW + 1v/V1dX/1NTU/9PT0//S0tL/0dHR/8/Pz//Nzc3/zMzM/8rKyv/IyMj/x8fH/8XFxf/Dw8P/wcHB/76+ + vv+7u7v/ubm5/7a2tv+0tLT/sbGx/66urv+srKz/qamp/6ampv+jo6P/n5+f/5mZmf+BgYH/ioqK/5SU + lP+Tk5P/kZGR/5CQkP+QkJD/kJCQ/5CQkP+QkJD/kZGR/5GRkf+SkpL/k5OT/5WVlf+Wlpb/lpaW/5eX + l/+ZmZn/mpqa/5ycnP+dnZ3/np6e/6CgoP+ioqL/o6Oj/6ampv+np6f/qamp/6urq/+srKz/rq6u/6+v + r/+xsbH/s7Oz/7S0tP+2trb/t7e3/7m5uf+6urr/vLy8/729vf+/v7//wMDA/8HBwf/ExMT/xcXF/8fH + x//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29v/3NzcMf// + /wH///8B////Af///wHt7e3j7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/q6ur/6enp/+np + 6f/o6Oj/5+fn/+bm5v/m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Li4v/i4uL/4ODg/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//S0tL/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Jycn/yMjI/8bGxv/Dw8P/wsLC/8DAwP++vr7/u7u7/7m5uf+2trb/s7Oz/6+vr/+srKz/qamp/6en + p/+jo6P/n5+f/5ycnP+VlZX/fX19/2RkZP9paWn/enp6/4qKiv+Li4v/iYmJ/4mJif+JiYn/iYmJ/4qK + iv+Kior/i4uL/4yMjP+Ojo7/j4+P/5CQkP+RkZH/kpKS/5SUlP+VlZX/l5eX/5mZmf+ampr/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/p6en/6ioqP+rq6v/rKys/66urv+wsLD/sbGx/7Ozs/+0tLT/tra2/7i4 + uP+5ubn/u7u7/7y8vP++vr7/wMDA/8HBwf/Dw8P/xcXF/8fHx//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR + 0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29sx////Af///wH///8B////Ae3t7ePs7Oz/7Ozs/+vr + 6//r6+v/6urq/+rq6v/q6ur/6enp/+np6f/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/k5OT/4+Pj/+Pj + 4//i4uL/4eHh/+Dg4P/f39//3t7e/93d3f/d3d3/29vb/9vb2//Z2dn/2NjY/9jY2P/W1tb/1dXV/9PT + 0//T09P/0tLS/9DQ0P/Pz8//zc3N/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP++vr7/vLy8/7m5 + uf+3t7f/tLS0/7Kysv+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4CAgP9jY2P/YmJi/2Fh + Yf9iYmL/enp6/4ODg/+CgoL/gYGB/4GBgf+CgoL/goKC/4ODg/+EhIT/hoaG/4eHh/+IiIj/iYmJ/4uL + i/+MjIz/jo6O/4+Pj/+RkZH/k5OT/5WVlf+Xl5f/mZmZ/5qamv+dnZ3/n5+f/6Ghof+ioqL/pKSk/6am + pv+oqKj/qqqq/6urq/+tra3/r6+v/7Gxsf+ysrL/tLS0/7a2tv+4uLj/ubm5/7u7u/+9vb3/v7+//8HB + wf/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9nZ + 2TH///8B////Af///wH///8B7Ozs4+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo/+fn + 5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Pj4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/X19f/1tbW/9XV1f/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fH + x//FxcX/xMTE/8HBwf+/v7//vb29/7u7u/+5ubn/tra2/7S0tP+wsLD/ra2t/6qqqv+lpaX/oqKi/52d + nf+ZmZn/lJSU/5CQkP+MjIz/dnZ2/2FhYf9jY2P/YmJi/2FhYf92dnb/fX19/3x8fP98fHz/e3t7/3x8 + fP98fHz/fX19/35+fv+AgID/gYGB/4ODg/+EhIT/hYWF/4eHh/+JiYn/i4uL/4yMjP+Ojo7/kJCQ/5KS + kv+UlJT/lpaW/5mZmf+bm5v/nZ2d/56env+goKD/oqKi/6SkpP+mpqb/qKio/6qqqv+srKz/ra2t/7Cw + sP+xsbH/s7Oz/7W1tf+2trb/ubm5/7q6uv+9vb3/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW1v/X19f/2NjYMf///wH///8B////Af///wHr6+vj6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/39/f/9/f3//e3t7/3Nzc/9zc3P/b29v/2tra/9jY2P/X19f/19fX/9XV1f/V1dX/09PT/9LS + 0v/R0dH/z8/P/87Ozv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7y8vP+5ubn/t7e3/7W1 + tf+ysrL/r6+v/6ysrP+pqan/pKSk/5+fn/+bm5v/lpaW/5GRkf+MjIz/iIiI/4SEhP9ycnL/YWFh/2Rk + ZP9iYmL/YWFh/3Fxcf92dnb/dnZ2/3V1df91dXX/dXV1/3V1df92dnb/eHh4/3p6ev97e3v/fX19/39/ + f/+AgID/goKC/4ODg/+Ghob/h4eH/4mJif+Li4v/jY2N/5CQkP+SkpL/lJSU/5aWlv+YmJj/mpqa/5yc + nP+enp7/oKCg/6Kiov+kpKT/pqam/6ioqP+qqqr/rKys/66urv+wsLD/srKy/7Ozs/+2trb/uLi4/7q6 + uv+8vLz/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW + 1v/X19cx////Af///wH///8B////Aevr6+Pr6+v/6urq/+np6f/p6en/6Ojo/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3t7e/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/v7+//729vf+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+rq6v/p6en/6Ojo/+enp7/mZmZ/5SU + lP+Ojo7/iYmJ/4SEhP9/f3//fHx8/21tbf9iYmL/ZWVl/2NjY/9iYmL/bW1t/3BwcP9wcHD/b29v/29v + b/9vb2//b29v/3Fxcf9zc3P/dHR0/3Z2dv94eHj/enp6/3t7e/99fX3/fn5+/4CAgP+CgoL/hISE/4aG + hv+JiYn/i4uL/42Njf+Pj4//kZGR/5SUlP+Wlpb/mJiY/5qamv+cnJz/np6e/6CgoP+jo6P/paWl/6am + pv+pqan/qqqq/62trf+vr6//sbGx/7Ozs/+1tbX/t7e3/7m5uf+8vLz/vr6+/7+/v//CwsL/xMTE/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/T09P/1dXV/9bW1jH///8B////Af///wH///8B6urq4+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh + 4f/f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1dXV/9TU1P/S0tL/0dHR/9DQ + 0P/Ozs7/zc3N/8vLy//Jycn/x8fH/8XFxf/Dw8P/wcHB/7+/v/+9vb3/urq6/7e3t/+1tbX/s7Oz/7Cw + sP+tra3/qamp/6ampv+ioqL/nZ2d/5iYmP+Tk5P/jY2N/4eHh/+CgoL/fX19/3h4eP91dXX/a2tr/2Rk + ZP9mZmb/ZWVl/2NjY/9paWn/ampq/2lpaf9paWn/aWlp/2pqav9ra2v/bW1t/25ubv9wcHD/cnJy/3Nz + c/91dXX/d3d3/3l5ef96enr/fHx8/319ff9/f3//gYGB/4SEhP+Hh4f/iYmJ/4uLi/+NjY3/kJCQ/5KS + kv+UlJT/lpaW/5iYmP+bm5v/nZ2d/5+fn/+hoaH/o6Oj/6ampv+oqKj/qqqq/6ysrP+urq7/sLCw/7Ky + sv+1tbX/t7e3/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS + 0v/U1NT/1dXVMf///wH///8B////Af///wHq6urj6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+Xl + 5f/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9fX + 1//X19f/1tbW/9TU1P/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/s7Oz/7Gxsf+urq7/rKys/6mpqf+lpaX/oaGh/5ubm/+Xl5f/kZGR/4uL + i/+Ghob/gYGB/3x8fP92dnb/cnJy/29vb/9oaGj/ZWVl/2lpaf9qamr/ampq/2hoaP9kZGT/Y2Nj/2Nj + Y/9kZGT/ZWVl/2ZmZv9oaGj/aWlp/2tra/9tbW3/bm5u/3BwcP9xcXH/c3Nz/3V1df92dnb/eHh4/3p6 + ev98fHz/fn5+/4GBgf+EhIT/hoaG/4mJif+Li4v/jY2N/4+Pj/+RkZH/lJSU/5aWlv+ZmZn/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/qKio/6urq/+tra3/r6+v/7Kysv+0tLT/tra2/7m5uf+7u7v/vb29/7+/ + v//CwsL/xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT0//T09Mx////Af///wH///8B////Aenp + 6ePp6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f + 3//f39//3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/09PT/9LS0v/R0dH/z8/P/87O + zv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7Ozs/+wsLD/rq6u/6ur + q/+oqKj/pKSk/6CgoP+cnJz/lZWV/5CQkP+Li4v/hoaG/39/f/96enr/dnZ2/3Fxcf9ubm7/a2tr/2dn + Z/9nZ2f/a2tr/25ubv9ycnL/cHBw/2dnZ/9fX1//X19f/2BgYP9hYWH/YmJi/2RkZP9lZWX/Z2dn/2ho + aP9qamr/a2tr/21tbf9vb2//cHBw/3Jycv90dHT/dnZ2/3l5ef97e3v/fX19/4CAgP+CgoL/hYWF/4eH + h/+JiYn/i4uL/46Ojv+QkJD/k5OT/5WVlf+YmJj/mpqa/5ycnP+fn5//oaGh/6Ojo/+lpaX/qKio/6qq + qv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8fHx//Jycn/y8vL/83N + zf/Pz8//0dHR/9LS0jH///8B////Af///wH///8B6enp4+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl + 5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg4P/g4OD/3t7e/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX + 1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+ + vv+7u7v/uLi4/7W1tf+zs7P/sLCw/62trf+qqqr/p6en/6Ojo/+fn5//mpqa/5WVlf+Pj4//ioqK/4WF + hf97e3v/Y2Nj/11dXf9nZ2f/ampq/2pqav9nZ2f/Z2dn/2lpaf9sbGz/b29v/3Nzc/90dHT/b29v/1xc + XP9bW1v/XFxc/11dXf9eXl7/X19f/2FhYf9iYmL/ZGRk/2VlZf9nZ2f/aWlp/2pqav9sbGz/bW1t/29v + b/9xcXH/dHR0/3Z2dv94eHj/enp6/35+fv+AgID/goKC/4SEhP+Hh4f/ioqK/4yMjP+Ojo7/kZGR/5SU + lP+Wlpb/mJiY/5ubm/+dnZ3/oKCg/6Kiov+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5 + uf+7u7v/vr6+/8DAwP/CwsL/xcXF/8fHx//Kysr/zMzM/87Ozv/Q0ND/0NDQMf///wH///8B////Af// + /wHp6enj6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Kysr/yMjI/8fHx//FxcX/w8PD/8DAwP++vr7/u7u7/7i4uP+1tbX/s7Oz/7CwsP+tra3/qamp/6am + pv+ioqL/np6e/5qamv+UlJT/j4+P/4mJif+EhIT/fX19/2NjY/9QUFD/S0tL/01NTf9dXV3/ZWVl/2Vl + Zf9oaGj/a2tr/25ubv9wcHD/c3Nz/3R0dP9wcHD/Wlpa/1dXV/9YWFj/WVlZ/1paWv9bW1v/XV1d/15e + Xv9gYGD/YWFh/2JiYv9kZGT/ZmZm/2dnZ/9paWn/a2tr/21tbf9vb2//cnJy/3R0dP92dnb/eXl5/3t7 + e/9+fn7/gICA/4ODg/+Ghob/iIiI/4uLi/+NjY3/kJCQ/5OTk/+VlZX/mJiY/5qamv+dnZ3/n5+f/6Gh + of+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/t7e3/7m5uf+7u7v/vr6+/8HBwf/Dw8P/xsbG/8jI + yP/Kysr/zMzM/8/Pz//Q0NAx////Af///wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/+Dg4P/f39//3t7e/93d3f/c3Nz/2tra/9nZ2f/Y2Nj/19fX/9bW + 1v/U1NT/09PT/9HR0f/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7u7 + u/+4uLj/tbW1/7Ozs/+wsLD/ra2t/6qqqv+mpqb/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/goKC/319 + ff9ycnL/VFRU/09PT/9JSUn/RUVF/1VVVf9hYWH/ZGRk/2pqav9tbW3/cHBw/3Jycv90dHT/dXV1/3Bw + cP9XV1f/VFRU/1VVVf9WVlb/V1dX/1hYWP9XV1f/S0tL/0lJSf9YWFj/Xl5e/2BgYP9hYWH/Y2Nj/2Vl + Zf9nZ2f/aWlp/2tra/9tbW3/cHBw/3Jycv91dXX/d3d3/3p6ev98fHz/fn5+/4GBgf+EhIT/h4eH/4qK + iv+MjIz/j4+P/5GRkf+UlJT/l5eX/5mZmf+cnJz/np6e/6Ghof+kpKT/p6en/6qqqv+srKz/r6+v/7Ky + sv+0tLT/t7e3/7q6uv+9vb3/v7+//8HBwf/ExMT/xsbG/8nJyf/Ly8v/zs7O/8/PzzH///8B////Af// + /wH///8B6Ojo4+fn5//m5ub/5ubm/+Xl5f/k5OT/5OTk/+Pj4//i4uL/4eHh/+Dg4P/g4OD/39/f/97e + 3v/d3d3/3Nzc/9vb2//Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/y8vL/8nJ + yf/IyMj/xsbG/8TExP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+ysrL/sLCw/62trf+qqqr/pqam/6Gh + of+enp7/mZmZ/5OTk/+Ojo7/h4eH/4KCgv98fHz/dnZ2/2xsbP9VVVX/UVFR/0dHR/9DQ0P/UlJS/15e + Xv9nZ2f/bGxs/25ubv9xcXH/dHR0/3d3d/93d3f/cXFx/1NTU/9QUFD/UVFR/1JSUv9TU1P/UlJS/z4+ + Pv8fHx//Hh4e/zExMf9KSkr/Wlpa/15eXv9fX1//YmJi/2NjY/9lZWX/Z2dn/2lpaf9ra2v/bm5u/3Bw + cP9ycnL/dXV1/3h4eP96enr/fX19/4CAgP+Dg4P/hYWF/4iIiP+Li4v/jo6O/5CQkP+Tk5P/lpaW/5mZ + mf+bm5v/np6e/6Ghof+kpKT/p6en/6qqqv+tra3/r6+v/7Kysv+1tbX/uLi4/7q6uv+9vb3/wMDA/8PD + w//FxcX/x8fH/8rKyv/MzMz/zc3NMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4uLi/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9jY2P/X19f/1tbW/9TU + 1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vLy//Jycn/x8fH/8bGxv/ExMT/wcHB/8DAwP+9vb3/u7u7/7m5 + uf+1tbX/s7Oz/7CwsP+tra3/qqqq/6ampv+jo6P/np6e/5mZmf+UlJT/j4+P/4iIiP+CgoL/fHx8/3Z2 + dv9wcHD/ZmZm/1ZWVv9TU1P/RkZG/0JCQv9PT0//X19f/2lpaf9tbW3/b29v/3Jycv96enr/fn5+/3h4 + eP9xcXH/UVFR/01NTf9OTk7/T09P/09PT/9AQED/ISEh/xoaGv8bGxv/Hh4e/yYmJv88PDz/VFRU/1xc + XP9eXl7/YGBg/2FhYf9jY2P/ZWVl/2dnZ/9qamr/bGxs/25ubv9xcXH/dHR0/3d3d/96enr/fHx8/39/ + f/+BgYH/hISE/4eHh/+Kior/jY2N/5CQkP+Tk5P/lZWV/5mZmf+cnJz/np6e/6Kiov+kpKT/p6en/6qq + qv+tra3/sLCw/7Ozs/+2trb/ubm5/7y8vP+/v7//wcHB/8TExP/Gxsb/ycnJ/8zMzP/MzMwx////Af// + /wH///8B////Aefn5+Pm5ub/5ubm/+Tk5P/k5OT/4+Pj/+Li4v/i4uL/4eHh/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/19fX/9fX1//V1dX/1NTU/9LS0v/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//Gxsb/w8PD/8HBwf+/v7//vb29/7u7u/+4uLj/tbW1/7Kysv+wsLD/ra2t/6mpqf+mpqb/oqKi/5+f + n/+ZmZn/lJSU/46Ojv+IiIj/goKC/3t7e/92dnb/b29v/2lpaf9gYGD/WFhY/1VVVf9ERET/QUFB/0tL + S/9eXl7/a2tr/25ubv9xcXH/enp6/46Ojv+VlZX/fHx8/3Nzc/9PT0//SUlJ/0pKSv9LS0v/PDw8/xsb + G/8TExP/HBwc/x4eHv8dHR3/Hh4e/x4eHv8oKCj/QEBA/1VVVf9bW1v/XV1d/19fX/9hYWH/Y2Nj/2Vl + Zf9oaGj/ampq/21tbf9wcHD/cnJy/3V1df94eHj/e3t7/319ff+AgID/g4OD/4aGhv+JiYn/jIyM/4+P + j/+SkpL/lZWV/5iYmP+bm5v/np6e/6Ghof+kpKT/qKio/6urq/+urq7/sbGx/7W1tf+3t7f/urq6/729 + vf/AwMD/w8PD/8XFxf/IyMj/y8vL/8vLyzH///8B////Af///wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj + 4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9jY2P/X19f/1dXV/9TU + 1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJyf/IyMj/xcXF/8TExP/BwcH/v7+//729vf+7u7v/uLi4/7W1 + tf+zs7P/r6+v/6ysrP+pqan/pqam/6Ojo/+fn5//mpqa/5SUlP+Pj4//iYmJ/4SEhP99fX3/dnZ2/3Bw + cP9paWn/YmJi/1xcXP9bW1v/V1dX/0ZGRv9FRUX/SkpK/11dXf9sbGz/cHBw/3Z2dv+MjIz/oKCg/4+P + j/9vb2//dnZ2/1dXV/9GRkb/R0dH/z4+Pv8dHR3/EhIS/xgYGP8uLi7/LCws/x4eHv8eHh7/Hh4e/x4e + Hv8hISH/NDQ0/0xMTP9ZWVn/W1tb/11dXf9fX1//YWFh/2RkZP9mZmb/aWlp/2xsbP9ubm7/cXFx/3R0 + dP93d3f/enp6/319ff+AgID/goKC/4aGhv+JiYn/jIyM/4+Pj/+SkpL/lZWV/5iYmP+cnJz/np6e/6Ki + ov+mpqb/qamp/6ysrP+vr6//s7Oz/7a2tv+5ubn/vLy8/76+vv/CwsL/xMTE/8fHx//Kysr/y8vLMf// + /wH///8B////Af///wHm5ubj5eXl/+Tk5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/U1NT/0tLS/9HR0f/Pz8//zc3N/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/7+/v/+9vb3/u7u7/7i4uP+2trb/s7Oz/7CwsP+srKz/qamp/6ampv+jo6P/np6e/5mZ + mf+VlZX/j4+P/4qKiv+EhIT/fn5+/3h4eP9wcHD/ampq/2JiYv9bW1v/WFhY/11dXf9fX1//X19f/1lZ + Wf9MTEz/Xl5e/25ubv92dnb/h4eH/5+fn/+SkpL/VVVV/1ZWVv93d3f/bGxs/05OTv89PT3/JCQk/xMT + E/8YGBj/KCgo/zY2Nv8rKyv/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/JSUl/z09Pf9QUFD/WFhY/1tb + W/9dXV3/X19f/2FhYf9kZGT/Z2dn/2pqav9tbW3/cHBw/3Nzc/91dXX/eHh4/3t7e/9+fn7/goKC/4WF + hf+IiIj/i4uL/46Ojv+SkpL/lZWV/5mZmf+cnJz/n5+f/6Ojo/+mpqb/qqqq/62trf+xsbH/tLS0/7e3 + t/+6urr/vb29/8DAwP/Dw8P/xsbG/8nJyf/Kysox////Af///wH///8B////AeXl5ePk5OT/5OTk/+Pj + 4//i4uL/4eHh/+Dg4P/f39//39/f/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9LS + 0v/R0dH/0NDQ/83Nzf/MzMz/ysrK/8jIyP/Gxsb/xMTE/8HBwf+/v7//vb29/7u7u/+4uLj/tra2/7S0 + tP+wsLD/ra2t/6qqqv+mpqb/o6Oj/6CgoP+ampr/lZWV/5CQkP+JiYn/hISE/35+fv9zc3P/aWlp/2lp + af9kZGT/XFxc/1VVVf9UVFT/YGBg/2NjY/9mZmb/XFxc/09PT/9dXV3/c3Nz/4WFhf+bm5v/lpaW/11d + Xf9MTEz/cHBw/4aGhv92dnb/Y2Nj/ykpKf8WFhb/GBgY/ycnJ/8rKyv/Hx8f/xwcHP8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/ywsLP9DQ0P/VVVV/1lZWf9bW1v/XV1d/2BgYP9jY2P/ZmZm/2lp + af9sbGz/b29v/3Jycv91dXX/eHh4/3t7e/9+fn7/gYGB/4SEhP+IiIj/i4uL/4+Pj/+SkpL/lpaW/5mZ + mf+dnZ3/oaGh/6SkpP+oqKj/q6ur/6+vr/+ysrL/tra2/7m5uf+8vLz/v7+//8LCwv/FxcX/yMjI/8rK + yjH///8B////Af///wH///8B5OTk4+Tk5P/j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2dnZ/9jY2P/X19f/1tbW/9XV1f/S0tL/0dHR/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+zs7P/sbGx/62trf+qqqr/pqam/6Ojo/+fn5//m5ub/5aW + lv+Pj4//ioqK/4ODg/9+fn7/dHR0/1paWv9NTU3/U1NT/1lZWf9XV1f/UVFR/1RUVP9iYmL/ZWVl/2ho + aP9dXV3/UFBQ/2FhYf+BgYH/mpqa/56env9hYWH/SEhI/2pqav+MjIz/fHx8/5+fn/9nZ2f/HBwc/xcX + F/8lJSX/Kysr/xwcHP8aGhr/HBwc/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/yMj + I/81NTX/S0tL/1ZWVv9aWlr/XFxc/19fX/9iYmL/ZmZm/2hoaP9ra2v/bm5u/3Fxcf90dHT/d3d3/3t7 + e/9+fn7/gYGB/4WFhf+IiIj/jIyM/4+Pj/+Tk5P/lpaW/5qamv+enp7/oaGh/6ampv+pqan/ra2t/7Gx + sf+0tLT/uLi4/7u7u/++vr7/wcHB/8XFxf/IyMj/ycnJMf///wH///8B////Af///wHj4+Pj4+Pj/+Li + 4v/h4eH/4ODg/9/f3//f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Y2Nj/2NjY/9bW1v/V1dX/09PT/9LS + 0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/s7Oz/7Cw + sP+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kJCQ/4qKiv+EhIT/fX19/3d3d/9eXl7/SkpK/0VF + Rf9BQUH/RUVF/1JSUv9PT0//XFxc/2VlZf9oaGj/ampq/1JSUv9OTk7/bW1t/5eXl/+cnJz/ampq/0dH + R/9mZmb/iYmJ/35+fv+vr6//+vr6/9HR0f84ODj/HR0d/ykpKf8hISH/GRkZ/xsbG/8dHR3/Hh4e/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/HR0d/x0dHf8lJSX/PT09/09PT/9YWFj/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9paWn/bGxs/3BwcP9zc3P/dnZ2/3p6ev9+fn7/gYGB/4SEhP+IiIj/i4uL/4+P + j/+Tk5P/l5eX/5ubm/+enp7/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/urq6/76+vv/BwcH/xMTE/8fH + x//IyMgx////Af///wH///8B////AePj4+Pi4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/W1tb/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8LC + wv/AwMD/vr6+/7u7u/+5ubn/tbW1/7Ozs/+wsLD/rq6u/6urq/+np6f/pKSk/6CgoP+cnJz/l5eX/5KS + kv+Li4v/hISE/39/f/93d3f/cHBw/1VVVf9MTEz/Q0ND/z4+Pv9BQUH/T09P/1NTU/9jY2P/Z2dn/2pq + av9ra2v/S0tL/0hISP9xcXH/m5ub/2tra/9GRkb/YWFh/4eHh/98fHz/nZ2d//Hx8f/8/Pz/wsLC/zAw + MP8gICD/JSUl/yIiIv8hISH/IiIi/yEhIf8fHx//Hh4e/x4eHv8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x0dHf8hISH/Ly8v/0hISP9XV1f/Wlpa/11dXf9gYGD/ZGRk/2ZmZv9paWn/bGxs/29v + b/9zc3P/dnZ2/3p6ev99fX3/gICA/4WFhf+IiIj/jY2N/5CQkP+UlJT/mZmZ/5ycnP+hoaH/paWl/6mp + qf+tra3/srKy/7a2tv+5ubn/vb29/8DAwP/ExMT/x8fH/8jIyDH///8B////Af///wH///8B4uLi4+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/0tLS/9HR + 0f/Ozs7/zc3N/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62t + rf+qqqr/p6en/6Ojo/+fn5//m5ub/5eXl/+RkZH/i4uL/4aGhv9+fn7/eHh4/3BwcP9qamr/VlZW/1BQ + UP9BQUH/Ojo6/z09Pf9NTU3/XFxc/2dnZ/9qamr/bGxs/25ubv9LS0v/R0dH/19fX/9mZmb/RERE/1tb + W/+IiIj/goKC/6CgoP/09PT//Pz8/7y8vP8+Pj7/HBwc/ygoKP8oKCj/ICAg/yIiIv8kJCT/JSUl/yQk + JP8gICD/Hh4e/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/IiIi/zY2 + Nv9MTEz/WFhY/1xcXP9fX1//YmJi/2VlZf9oaGj/a2tr/29vb/9ycnL/dnZ2/3l5ef98fHz/gYGB/4SE + hP+JiYn/jY2N/5GRkf+VlZX/mpqa/56env+ioqL/p6en/6ysrP+wsLD/tbW1/7m5uf+9vb3/wMDA/8PD + w//Gxsb/yMjIMf///wH///8B////Af///wHi4uLj4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/tLS0/7Gxsf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kZGR/4yM + jP+Ghob/gICA/3l5ef9zc3P/bGxs/2ZmZv9YWFj/UlJS/z8/P/83Nzf/Ozs7/09PT/9kZGT/aWlp/2tr + a/9tbW3/eHh4/2FhYf9LS0v/U1NT/0RERP9XV1f/f39//4aGhv+QkJD/6Ojo///////S0tL/R0dH/xwc + HP8nJyf/KSkp/yIiIv8fHx//IyMj/yQkJP8lJSX/JiYm/yUlJf8iIiL/Hx8f/x8fH/8fHx//Hx8f/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/yoqKv9CQkL/VFRU/1xcXP9fX1//YmJi/2Vl + Zf9oaGj/bGxs/29vb/9ycnL/dnZ2/3l5ef9+fn7/gYGB/4aGhv+Kior/jo6O/5KSkv+Xl5f/nJyc/6Cg + oP+mpqb/qqqq/6+vr/+zs7P/t7e3/7y8vP/AwMD/w8PD/8bGxv/IyMgx////Af///wH///8B////AeHh + 4ePg4OD/4ODg/9/f3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0tLS/9DQ + 0P/Ozs7/y8vL/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/rq6u/6ur + q/+np6f/pKSk/6CgoP+bm5v/lpaW/5CQkP+MjIz/hoaG/4CAgP96enr/c3Nz/25ubv9nZ2f/YWFh/1lZ + Wf9VVVX/PT09/zQ0NP85OTn/TU1N/2ZmZv9ra2v/bW1t/3Z2dv+NjY3/kZGR/15eXv9VVVX/QEBA/15e + Xv+Dg4P/jo6O/+Hh4f/8/Pz/1dXV/1dXV/8cHBz/JiYm/ykpKf8hISH/Hx8f/yIiIv8kJCT/JSUl/yYm + Jv8mJib/Jycn/yYmJv8jIyP/ISEh/x8fH/8fHx//Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/yEhIf8wMDD/TExM/1hYWP9eXl7/YWFh/2RkZP9oaGj/a2tr/25ubv9xcXH/dXV1/3p6 + ev99fX3/goKC/4WFhf+Kior/j4+P/5SUlP+ZmZn/np6e/6Ojo/+oqKj/ra2t/7Kysv+3t7f/u7u7/7+/ + v//Dw8P/xsbG/8jIyDH///8B////Af///wH///8B4eHh4+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/19fX/9bW1v/U1NT/09PT/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/Dw8P/wcHB/76+ + vv+8vLz/ubm5/7e3t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/m5ub/5aWlv+RkZH/i4uL/4aG + hv+AgID/enp6/3R0dP9ubm7/aGho/2JiYv9dXV3/W1tb/1paWv9ISEj/QkJC/zo6Ov9KSkr/Z2dn/2xs + bP91dXX/iYmJ/6CgoP+Kior/U1NT/1hYWP9JSUn/PT09/1dXV//X19f//////93d3f9oaGj/Hh4e/yYm + Jv8qKir/Hx8f/x4eHv8hISH/JCQk/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8mJib/Ozs7/1JS + Uv9dXV3/YGBg/2RkZP9nZ2f/ampq/21tbf9xcXH/dXV1/3h4eP99fX3/gYGB/4aGhv+Li4v/kZGR/5eX + l/+bm5v/oaGh/6ampv+srKz/sbGx/7a2tv+7u7v/v7+//8PDw//Gxsb/yMjIMf///wH///8B////Af// + /wHg4ODj4ODg/9/f3//d3d3/3d3d/9vb2//a2tr/2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/0NDQ/87O + zv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv+/v7//vb29/7q6uv+2trb/tLS0/7Kysv+urq7/q6ur/6io + qP+lpaX/oaGh/5ycnP+Xl5f/kZGR/4yMjP+Ghob/gYGB/3t7e/90dHT/b29v/2lpaf9jY2P/Xl5e/1lZ + Wf9cXFz/YGBg/2BgYP9YWFj/PT09/0dHR/9oaGj/cnJy/4aGhv+cnJz/kZGR/1dXV/9NTU3/YWFh/1hY + WP9AQED/NTU1/4uLi//W1tb/cHBw/yEhIf8iIiL/Kioq/yEhIf8eHh7/ISEh/yQkJP8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8mJib/JCQk/yIiIv8gICD/Hx8f/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8gICD/Li4u/0pKSv9aWlr/YGBg/2JiYv9lZWX/aGho/2xs + bP9wcHD/dHR0/3l5ef99fX3/goKC/4iIiP+Ojo7/lJSU/5mZmf+fn5//paWl/6urq/+wsLD/tbW1/7q6 + uv++vr7/w8PD/8bGxv/IyMgx////Af///wH///8B////AeDg4OPf39//3t7e/93d3f/b29v/2tra/9nZ + 2f/X19f/1tbW/9TU1P/T09P/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TExP/CwsL/v7+//729 + vf+6urr/t7e3/7S0tP+ysrL/rq6u/6urq/+oqKj/pKSk/6Ghof+dnZ3/mJiY/5KSkv+MjIz/h4eH/4GB + gf97e3v/b29v/1tbW/9dXV3/YmJi/19fX/9ZWVn/VlZW/15eXv9jY2P/ZWVl/1lZWf87Ozv/R0dH/29v + b/+EhIT/nJyc/5WVlf9QUFD/SkpK/3Jycv+CgoL/aWlp/1FRUf8jIyP/GRkZ/zY2Nv8jIyP/ISEh/yoq + Kv8hISH/HR0d/yIiIv8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/ISEh/zMzM/9PT0//W1tb/19fX/9jY2P/ZmZm/2pqav9ubm7/dHR0/3l5ef9/f3//hYWF/4uL + i/+SkpL/l5eX/52dnf+jo6P/qamp/7CwsP+0tLT/urq6/76+vv/Dw8P/xsbG/8jIyDH///8B////Af// + /wH///8B39/f497e3v/d3d3/3Nzc/9vb2//a2tr/2NjY/9fX1//V1dX/09PT/9LS0v/Q0ND/zs7O/8zM + zP/Kysr/yMjI/8fHx//ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/srKy/6+vr/+rq6v/qKio/6Wl + pf+hoaH/nZ2d/5mZmf+UlJT/jo6O/4iIiP+Dg4P/fHx8/3Nzc/9ZWVn/SkpK/0dHR/9OTk7/WFhY/1ZW + Vv9VVVX/YGBg/2RkZP9nZ2f/Wlpa/zo6Ov9KSkr/fX19/5mZmf+YmJj/YGBg/0ZGRv9oaGj/iYmJ/3t7 + e/+wsLD/hISE/x4eHv8RERH/IiIi/yYmJv8eHh7/IiIi/xwcHP8fHx//IyMj/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8iIiL/ISEh/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/ykpKf8/Pz//VVVV/11d + Xf9hYWH/ZWVl/2pqav9wcHD/dXV1/3x8fP+CgoL/iYmJ/5CQkP+VlZX/nJyc/6Kiov+pqan/r6+v/7Oz + s/+5ubn/vr6+/8PDw//Hx8f/yMjIMf///wH///8B////Af///wHe3t7j3t7e/9zc3P/b29v/2tra/9jY + 2P/X19f/1dXV/9TU1P/S0tL/0NDQ/8/Pz//MzMz/y8vL/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vb29/7u7 + u/+4uLj/tbW1/7Ozs/+vr6//rKys/6ioqP+lpaX/oaGh/52dnf+ZmZn/lJSU/4+Pj/+JiYn/goKC/319 + ff92dnb/ZWVl/05OTv9ISEj/QEBA/0BAQP9QUFD/U1NT/1paWv9jY2P/Z2dn/2hoaP9VVVX/MDAw/09P + T/+Tk5P/mZmZ/2BgYP9FRUX/aGho/4mJif97e3v/r6+v//f39//q6ur/dHR0/xgYGP8fHx//GBgY/xYW + Fv8ZGRn/Hx8f/yQkJP8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x4eHv8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x8fH/8tLS3/RkZG/1hYWP9gYGD/ZWVl/2xsbP9ycnL/eXl5/4CA + gP+Hh4f/jo6O/5SUlP+bm5v/oaGh/6enp/+tra3/s7Oz/7m5uf++vr7/w8PD/8fHx//IyMgx////Af// + /wH///8B////Ad7e3uPd3d3/3Nzc/9ra2v/Z2dn/19fX/9XV1f/U1NT/09PT/9HR0f/Pz8//zc3N/8vL + y//Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+pqan/pqam/6Ki + ov+enp7/mZmZ/5WVlf+QkJD/ioqK/4SEhP99fX3/d3d3/3BwcP9hYWH/UFBQ/0dHR/89PT3/PT09/01N + Tf9UVFT/YGBg/2VlZf9oaGj/ampq/1FRUf8rKyv/SkpK/5CQkP9paWn/RUVF/15eXv+IiIj/f39//6mp + qf/z8/P/+vr6/62trf83Nzf/HR0d/yAgIP8YGBj/Ghoa/x8fH/8lJSX/Jycn/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUl + Jf8kJCT/IiIi/yEhIf8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8kJCT/Nzc3/1RUVP9iYmL/ampq/3BwcP93d3f/fn5+/4WFhf+MjIz/kpKS/5mZmf+goKD/pqam/62t + rf+ysrL/uLi4/76+vv/Dw8P/x8fH/8jIyDH///8B////Af///wH///8B3d3d49zc3P/b29v/2dnZ/9jY + 2P/W1tb/1NTU/9PT0//R0dH/0NDQ/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HBwf++vr7/u7u7/7m5 + uf+2trb/s7Oz/7CwsP+tra3/qqqq/6ampv+ioqL/np6e/5qamv+VlZX/kZGR/4uLi/+FhYX/f39//3d3 + d/9xcXH/a2tr/19fX/9TU1P/RkZG/zo6Ov86Ojr/SkpK/1xcXP9lZWX/Z2dn/2lpaf9sbGz/WVlZ/y8v + L/87Ozv/UlJS/0ZGRv9dXV3/g4OD/4KCgv+ZmZn/8fHx//z8/P+/v7//ODg4/xwcHP8oKCj/JCQk/xwc + HP8fHx//JSUl/ycnJ/8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IyMj/yEhIf8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/LCws/0RERP9iYmL/bW1t/3V1 + df97e3v/fHx8/4ODg/+Pj4//mJiY/56env+lpaX/q6ur/7Gxsf+4uLj/vr6+/8PDw//Hx8f/yMjIMf// + /wH///8B////Af///wHc3Nzj29vb/9ra2v/Y2Nj/1tbW/9XV1f/U1NT/0dHR/9DQ0P/Ozs7/zMzM/8rK + yv/IyMj/xcXF/8PDw//AwMD/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/ra2t/6qqqv+np6f/o6Oj/5+f + n/+bm5v/lpaW/5GRkf+MjIz/hoaG/4CAgP95eXn/cnJy/2xsbP9mZmb/Xl5e/1VVVf9FRUX/Nzc3/zg4 + OP9ISEj/YWFh/2dnZ/9paWn/bGxs/3Z2dv97e3v/QUFB/zY2Nv8wMDD/SkpK/4KCgv+Ghob/mJiY/+rq + 6v/8/Pz/xsbG/0tLS/8aGhr/JiYm/yYmJv8dHR3/ISEh/yYmJv8nJyf/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yUlJf8kJCT/JCQk/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//ICAg/zg4OP9XV1f/b29v/3Fxcf9dXV3/Y2Nj/3l5ef+RkZH/nZ2d/6Oj + o/+qqqr/sbGx/7i4uP+9vb3/w8PD/8fHx//IyMgx////Af///wH///8B////Adzc3OPa2tr/2dnZ/9fX + 1//V1dX/1NTU/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wcHB/7+/v/+8vLz/ubm5/7e3 + t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/nJyc/5iYmP+Tk5P/jY2N/4iIiP+BgYH/e3t7/3R0 + dP9ubm7/aGho/2NjY/9dXV3/WFhY/0RERP81NTX/NTU1/0VFRf9iYmL/aWlp/2tra/90dHT/i4uL/5mZ + mf9cXFz/ODg4/y8vL/88PDz/dHR0/4eHh//q6ur//v7+/9jY2P9WVlb/Gxsb/yUlJf8pKSn/Hh4e/x8f + H/8kJCT/Jycn/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8lJSX/JSUl/yMj + I/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//ISEh/ykp + Kf9ISEj/VVVV/01NTf9fX1//ZWVl/4ODg/+cnJz/o6Oj/6qqqv+wsLD/uLi4/76+vv/Dw8P/x8fH/8jI + yDH///8B////Af///wH///8B2tra49nZ2f/X19f/1tbW/9TU1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJ + yf/Hx8f/xMTE/8LCwv+/v7//vLy8/7q6uv+3t7f/tbW1/7Gxsf+urq7/q6ur/6enp/+lpaX/oKCg/5yc + nP+Xl5f/kpKS/42Njf+IiIj/goKC/3x8fP92dnb/b29v/2lpaf9kZGT/X19f/1xcXP9bW1v/VFRU/09P + T/88PDz/QEBA/2RkZP9ra2v/dHR0/4yMjP+fn5//g4OD/0xMTP8+Pj7/NjY2/ysrK/89PT3/tra2//z8 + /P/c3Nz/UVFR/xkZGf8lJSX/KCgo/x4eHv8fHx//IyMj/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yQkJP8iIiL/ISEh/yAgIP8fHx//Hh4e/x8f + H/8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8oKCj/Ojo6/2BgYP9oaGj/f39//5ub + m/+jo6P/q6ur/7Gxsf+5ubn/vr6+/8TExP/Hx8f/yMjIMf///wH///8B////Af///wHa2trj2NjY/9bW + 1v/V1dX/09PT/9HR0f/Pz8//zs7O/8vLy//Jycn/x8fH/8XFxf/Dw8P/wMDA/729vf+6urr/uLi4/7W1 + tf+ysrL/r6+v/6urq/+oqKj/paWl/6Ghof+dnZ3/mZmZ/5OTk/+Ojo7/iYmJ/4ODg/99fX3/c3Nz/2tr + a/9qamr/ZWVl/2BgYP9cXFz/W1tb/15eXv9hYWH/YWFh/zs7O/8zMzP/ZGRk/3Fxcf+Ghob/n5+f/5GR + kf9NTU3/SkpK/2BgYP9DQ0P/NDQ0/ykpKf9LS0v/n5+f/2pqav8cHBz/IiIi/ykpKf8fHx//Gxsb/yEh + If8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/IyMj/yAgIP8eHh7/Hh4e/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8kJCT/Pj4+/2JiYv+BgYH/nJyc/6Ojo/+rq6v/srKy/7m5uf+/v7//xMTE/8fH + x//IyMgx////Af///wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8jI + yP/Gxsb/w8PD/8HBwf++vr7/u7u7/7i4uP+2trb/srKy/6+vr/+srKz/qKio/6Wlpf+hoaH/np6e/5mZ + mf+UlJT/jo6O/4mJif+EhIT/fX19/3Nzc/9WVlb/TU1N/1ZWVv9fX1//XFxc/1hYWP9bW1v/YWFh/2Rk + ZP9iYmL/OTk5/zIyMv9sbGz/hISE/5ycnP+QkJD/U1NT/0pKSv9ubm7/hoaG/21tbf9SUlL/GRkZ/xIS + Ev8gICD/IyMj/yEhIf8pKSn/IiIi/x8fH/8gICD/IyMj/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/yEh + If8fHx//ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8iIiL/R0dH/4KC + gv+cnJz/pKSk/6ysrP+ysrL/urq6/8DAwP/FxcX/yMjI/8jIyDH///8B////Af///wH///8B19fX49bW + 1v/U1NT/0tLS/9DQ0P/Pz8//zc3N/8vLy//IyMj/xsbG/8PDw//CwsL/v7+//7y8vP+5ubn/tra2/7Oz + s/+wsLD/ra2t/6mpqf+mpqb/oqKi/56env+ZmZn/lJSU/5CQkP+Kior/hISE/35+fv91dXX/XFxc/0tL + S/9ERET/QEBA/09PT/9ZWVn/WFhY/15eXv9jY2P/ZWVl/2JiYv8zMzP/MDAw/319ff+ampr/kpKS/1dX + V/9GRkb/a2tr/4uLi/9+fn7/vb29/8rKyv9NTU3/FRUV/xwcHP8dHR3/GBgY/x0dHf8dHR3/ISEh/yMj + I/8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yMjI/8iIiL/ISEh/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8gICD/ICAg/yEhIf9ERET/hYWF/52dnf+lpaX/rKys/7Ozs/+7u7v/wcHB/8XF + xf/IyMj/ycnJMf///wH///8B////Af///wHW1tbj1dXV/9TU1P/R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//FxcX/wsLC/7+/v/+8vLz/urq6/7e3t/+0tLT/sbGx/62trf+qqqr/pqam/6Kiov+enp7/mpqa/5aW + lv+QkJD/i4uL/4WFhf9+fn7/eXl5/25ubv9UVFT/TExM/0BAQP88PDz/SUlJ/1ZWVv9bW1v/YmJi/2Vl + Zf9nZ2f/YmJi/ywsLP8sLCz/ioqK/5ycnP9eXl7/RERE/2NjY/+IiIj/enp6/7S0tP/4+Pj/8fHx/39/ + f/8gICD/GRkZ/xUVFf8VFRX/Ghoa/yAgIP8jIyP/JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yQkJP8jIyP/ISEh/yAgIP8gICD/ICAg/yAgIP8hISH/ISEh/yEhIf8hISH/ISEh/0BA + QP+FhYX/np6e/6enp/+vr6//tra2/76+vv/CwsL/xsbG/8nJyf/Kysox////Af///wH///8B////AdbW + 1uPU1NT/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/Hx8f/xcXF/8PDw//AwMD/vb29/7q6uv+3t7f/tLS0/7Gx + sf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+VlZX/kZGR/4uLi/+FhYX/f39//3l5ef90dHT/aWlp/1VV + Vf9NTU3/PT09/zg4OP9GRkb/VVVV/2FhYf9lZWX/aGho/2lpaf9mZmb/LS0t/yUlJf9oaGj/ZmZm/0RE + RP9iYmL/hoaG/319ff+pqan/+vr6//f39/+cnJz/Jycn/xwcHP8kJCT/Ghoa/xsbG/8gICD/IyMj/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/yAgIP8hISH/ISEh/yEhIf8hISH/Nzc3/319ff+Xl5f/pqam/7Ozs/+6urr/wMDA/8TE + xP/Hx8f/ysrK/8vLyzH///8B////Af///wH///8B1dXV49PT0//R0dH/z8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/76+vv+8vLz/uLi4/7W1tf+ysrL/r6+v/6ysrP+oqKj/pKSk/6CgoP+bm5v/l5eX/5KS + kv+NjY3/hoaG/4GBgf96enr/dXV1/3BwcP9nZ2f/V1dX/05OTv85OTn/NTU1/0NDQ/9XV1f/ZWVl/2dn + Z/9paWn/bGxs/29vb/8zMzP/JSUl/zQ0NP9AQED/Wlpa/4ODg/98fHz/nZ2d/+/v7//7+/v/t7e3/zc3 + N/8cHBz/KCgo/yUlJf8eHh7/ICAg/yMjI/8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/IiIi/yAgIP8fHx//ICAg/yEhIf8hISH/ISEh/yEh + If8vLy//enp6/42Njf+cnJz/tra2/729vf/BwcH/xMTE/8fHx//Kysr/y8vLMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Nzc3/y8vL/8nJyf/Gxsb/xMTE/8HBwf+/v7//vLy8/7m5uf+1tbX/srKy/6+v + r/+srKz/qKio/6Wlpf+goKD/m5ub/5aWlv+SkpL/jY2N/4iIiP+BgYH/e3t7/3Z2dv9wcHD/a2tr/2Rk + ZP9ZWVn/UFBQ/zc3N/8yMjL/QUFB/1paWv9oaGj/aWlp/21tbf94eHj/jo6O/11dXf8oKCj/Jycn/zg4 + OP93d3f/gICA/5qamv/19fX//v7+/7m5uf86Ojr/Ghoa/ygoKP8mJib/HR0d/yAgIP8jIyP/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8hISH/ICAg/x8fH/8gICD/ISEh/ysrK/95eXn/jY2N/5ubm/+6urr/v7+//8PD + w//Gxsb/ycnJ/8zMzP/MzMwx////Af///wH///8B////AdPT0+PR0dH/z8/P/8zMzP/Kysr/x8fH/8XF + xf/Dw8P/wMDA/729vf+6urr/tra2/7Ozs/+wsLD/ra2t/6mpqf+mpqb/oaGh/52dnf+Xl5f/k5OT/46O + jv+JiYn/hISE/319ff93d3f/cnJy/2xsbP9nZ2f/YWFh/1tbW/9RUVH/Pj4+/zc3N/89PT3/W1tb/2lp + af9ra2v/d3d3/42Njf+goKD/bGxs/y4uLv8mJib/KSkp/01NTf+Li4v/5ubm//7+/v/a2tr/RUVF/xoa + Gv8lJSX/KCgo/x8fH/8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JiYm/yUlJf8hISH/Hh4e/x8f + H/8hISH/LCws/3p6ev+Ojo7/nZ2d/729vf/BwcH/xMTE/8bGxv/Jycn/zMzM/83NzTH///8B////Af// + /wH///8B0tLS49DQ0P/Ozs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/u7u7/7i4uP+0tLT/sbGx/62t + rf+qqqr/pqam/6Kiov+dnZ3/mZmZ/5SUlP+Pj4//ioqK/4WFhf9/f3//dnZ2/3Jycv9tbW3/aGho/2Rk + ZP9eXl7/XV1d/15eXv9eXl7/R0dH/zQ0NP9WVlb/bGxs/3R0dP+NjY3/oKCg/4CAgP9GRkb/Pj4+/ysr + K/8mJib/LCws/3Fxcf/b29v/0dHR/1hYWP8bGxv/JCQk/ykpKf8hISH/Hx8f/yMjI/8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yQkJP8iIiL/Hx8f/x8fH/8pKSn/d3d3/5CQkP+dnZ3/vr6+/8LC + wv/FxcX/yMjI/8vLy//Nzc3/zs7OMf///wH///8B////Af///wHR0dHjz8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/v7+//7y8vP+5ubn/tra2/7Kysv+vr6//q6ur/6enp/+jo6P/n5+f/5mZmf+VlZX/kJCQ/4qK + iv+FhYX/gICA/3Nzc/9cXFz/YmJi/2dnZ/9kZGT/YGBg/1xcXP9fX1//YmJi/2VlZf9ISEj/Kysr/1JS + Uv9zc3P/h4eH/56env+FhYX/S0tL/0xMTP9wcHD/VVVV/yoqKv8gICD/Ghoa/09PT/9nZ2f/ISEh/yMj + I/8oKCj/ICAg/yEhIf8kJCT/Jycn/yYmJv8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/IiIi/y0tLf97e3v/kZGR/56env+/v7//xMTE/8fHx//Jycn/zMzM/87Ozv/Pz88x////Af// + /wH///8B////Ac/Pz+POzs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/urq6/7e3t/+0tLT/sLCw/6ys + rP+oqKj/pKSk/6CgoP+cnJz/lpaW/5GRkf+MjIz/hoaG/4GBgf91dXX/W1tb/0tLS/9KSkr/UlJS/15e + Xv9cXFz/XFxc/2FhYf9lZWX/Z2dn/0VFRf8pKSn/VlZW/4aGhv+dnZ3/kJCQ/1BQUP9GRkb/bm5u/4iI + iP91dXX/dHR0/yAgIP8LCwv/KSkp/2tra/8pKSn/JSUl/yAgIP8fHx//JCQk/ycnJ/8mJib/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8rKyv/WVlZ/42Njf+SkpL/np6e/8DA + wP/FxcX/yMjI/8vLy//Nzc3/z8/P/9DQ0DH///8B////Af///wH///8Bzs7O48zMzP/Kysr/x8fH/8XF + xf/CwsL/v7+//7u7u/+4uLj/tbW1/7Gxsf+urq7/qamp/6Wlpf+hoaH/nJyc/5iYmP+RkZH/jY2N/4aG + hv+AgID/enp6/2RkZP9PT0//SEhI/0NDQ/9ERET/V1dX/1lZWf9gYGD/ZWVl/2dnZ/9paWn/QUFB/yYm + Jv9jY2P/np6e/5OTk/9TU1P/RUVF/2tra/+IiIj/dnZ2/87Ozv/4+Pj/nJyc/x8fH/8eHh7/IiIi/xMT + E/8YGBj/Hh4e/yMjI/8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/0lJSf+EhIT/k5OT/5OTk/+kpKT/w8PD/8bGxv/Kysr/y8vL/87Ozv/Q0ND/0dHRMf// + /wH///8B////Af///wHNzc3jy8vL/8nJyf/Gxsb/xMTE/8DAwP+9vb3/urq6/7a2tv+zs7P/rq6u/6ur + q/+np6f/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/gICA/3p6ev90dHT/YGBg/1FRUf9GRkb/Pz8//0JC + Qv9VVVX/Wlpa/2RkZP9mZmb/aWlp/2tra/89PT3/Hx8f/1tbW/+ampr/Xl5e/0JCQv9jY2P/hoaG/3p6 + ev+zs7P//Pz8//b29v+NjY3/Hx8f/x0dHf8VFRX/FBQU/x0dHf8gICD/IyMj/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQkJP8kJCT/Hx8f/zg4OP9+fn7/mZmZ/7W1 + tf/Gxsb/yMjI/8vLy//Nzc3/z8/P/9HR0f/S0tIx////Af///wH///8B////AczMzOPKysr/yMjI/8XF + xf/CwsL/vr6+/7u7u/+3t7f/s7Oz/7CwsP+srKz/qKio/6Ojo/+enp7/mZmZ/5SUlP+Pj4//iIiI/4KC + gv96enr/dHR0/25ubv9dXV3/VVVV/0RERP88PDz/Pj4+/1RUVP9gYGD/Z2dn/2lpaf9ra2v/bm5u/0FB + Qf8eHh7/MzMz/1VVVf9BQUH/Y2Nj/4WFhf95eXn/s7Oz//f39//z8/P/lJSU/yIiIv8cHBz/Jycn/x4e + Hv8bGxv/ICAg/yEhIf8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8jIyP/ISEh/w8PD/8CAgL/JSUl/4mJif+xsbH/w8PD/8fHx//Jycn/y8vL/83Nzf/Q0ND/0tLS/9LS + 0jH///8B////Af///wH///8BzMzM48nJyf/Gxsb/w8PD/8DAwP+8vLz/ubm5/7W1tf+xsbH/ra2t/6mp + qf+lpaX/oKCg/5ubm/+VlZX/kJCQ/4qKiv+Dg4P/fX19/3Z2dv9wcHD/a2tr/15eXv9YWFj/Q0ND/zg4 + OP88PDz/VFRU/2RkZP9paWn/a2tr/25ubv97e3v/Xl5e/x8fH/8hISH/NjY2/1hYWP+Dg4P/fHx8/6Gh + of/19fX//v7+/6enp/8wMDD/Ghoa/yYmJv8jIyP/Gxsb/x0dHf8hISH/IyMj/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8RERH/AwMD/yUlJf9vb2//r6+v/8HB + wf/FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PTMf///wH///8B////Af///wHLy8vjyMjI/8bG + xv/CwsL/v7+//7u7u/+3t7f/s7Oz/66urv+qqqr/pqam/6Kiov+cnJz/lpaW/5GRkf+Li4v/hYWF/35+ + fv94eHj/cnJy/21tbf9paWn/X19f/1tbW/9CQkL/Nzc3/zk5Of9TU1P/ZmZm/2tra/9ubm7/e3t7/5OT + k/+Hh4f/LCws/x8fH/8wMDD/YWFh/4GBgf+cnJz/7e3t//r6+v++vr7/MTEx/xoaGv8mJib/JSUl/x4e + Hv8fHx//ISEh/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQk + JP8nJyf/FxcX/wMDA/8eHh7/e3t7/6Ghof+/v7//xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT + 0//U1NQx////Af///wH///8B////AcrKyuPHx8f/xMTE/8DAwP+9vb3/ubm5/7W1tf+xsbH/rKys/6io + qP+ioqL/np6e/5iYmP+SkpL/jIyM/4aGhv+AgID/eHh4/3Nzc/9ubm7/ampq/2VlZf9fX1//Xl5e/1BQ + UP9JSUn/Nzc3/1BQUP9oaGj/bW1t/3h4eP+SkpL/oKCg/3R0dP8xMTH/Hx8f/yIiIv8zMzP/bGxs/+Xl + 5f/8/Pz/vLy8/0FBQf8ZGRn/JSUl/yQkJP8fHx//ICAg/yIiIv8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/xcXF/8DAwP/Hh4e/29vb/+kpKT/vb29/8LC + wv/ExMT/x8fH/8nJyf/Ly8v/zs7O/9DQ0P/S0tL/1NTU/9XV1TH///8B////Af///wH///8ByMjI48bG + xv/Dw8P/v7+//7y8vP+3t7f/s7Oz/6+vr/+qqqr/pqam/6CgoP+bm5v/lJSU/46Ojv+IiIj/goKC/3V1 + df9ubm7/b29v/2xsbP9nZ2f/YmJi/19fX/9hYWH/Y2Nj/1lZWf8yMjL/Q0ND/2hoaP92dnb/jIyM/5+f + n/+AgID/RkZG/0RERP84ODj/HR0d/yEhIf83Nzf/kJCQ/8XFxf9MTEz/GRkZ/yQkJP8lJSX/HR0d/x8f + H/8iIiL/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JSUl/ycn + J/8XFxf/BAQE/xEREf9mZmb/np6e/7u7u//CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/1tbWMf///wH///8B////Af///wHIyMjjxMTE/8HBwf+9vb3/urq6/7W1tf+xsbH/rKys/6en + p/+ioqL/m5ub/5aWlv+QkJD/ioqK/4ODg/90dHT/WFhY/09PT/9ZWVn/ZGRk/2RkZP9hYWH/YWFh/2Rk + ZP9nZ2f/W1tb/y4uLv88PDz/b29v/42Njf+hoaH/g4OD/0ZGRv9MTEz/dnZ2/3t7e/9BQUH/ISEh/w8P + D/8UFBT/QEBA/yEhIf8gICD/JiYm/x0dHf8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8uLi7/QUFB/y0tLf8hISH/aWlp/6SkpP+7u7v/wcHB/8PD + w//FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/X19cx////Af///wH///8B////AcbG + xuPExMT/wMDA/729vf+4uLj/s7Oz/6+vr/+pqan/pKSk/5+fn/+ZmZn/kpKS/4uLi/+FhYX/fHx8/2Fh + Yf9PT0//SEhI/0ZGRv9WVlb/YmJi/2BgYP9kZGT/ZmZm/2lpaf9aWlr/Kioq/0NDQ/+CgoL/oKCg/5GR + kf9KSkr/RkZG/29vb/+Ghob/e3t7/8DAwP95eXn/ExMT/xQUFP84ODj/ISEh/xwcHP8eHh7/Hh4e/yIi + Iv8kJCT/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/Kioq/0RE + RP9WVlb/e3t7/4KCgv+vr6//u7u7/8DAwP/CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9jY2DH///8B////Af///wH///8BxsbG48PDw/+/v7//u7u7/7e3t/+xsbH/rKys/6am + pv+hoaH/nJyc/5WVlf+Ojo7/hoaG/4CAgP92dnb/WVlZ/1FRUf9FRUX/QkJC/1JSUv9gYGD/YmJi/2dn + Z/9paWn/a2tr/1ZWVv8lJSX/RkZG/5WVlf+RkZH/UlJS/0ZGRv9qamr/hYWF/319ff/Kysr//f39/9/f + 3/9CQkL/HBwc/xsbG/8SEhL/FhYW/xwcHP8iIiL/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IyMj/yQkJP8nJyf/Kysr/zAwMP80NDT/NDQ0/zIyMv8uLi7/KSkp/yYmJv8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8qKir/PT09/1JSUv+IiIj/np6e/7u7u/+/v7//wcHB/8PD + w//FxcX/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/Y2Nj/2dnZMf///wH///8B////Af// + /wHFxcXjwsLC/729vf+5ubn/tbW1/6+vr/+qqqr/pKSk/5+fn/+ZmZn/kZGR/4qKiv+CgoL/e3t7/3Nz + c/9bW1v/U1NT/0FBQf8/Pz//UVFR/2BgYP9mZmb/aWlp/2tra/9tbW3/WFhY/yMjI/81NTX/f39//1ZW + Vv9BQUH/ZmZm/4aGhv96enr/u7u7//n5+f/s7Oz/gICA/xwcHP8fHx//Gxsb/xQUFP8aGhr/ISEh/yYm + Jv8lJSX/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/ygoKP85OTn/WVlZ/3Fxcf+EhIT/lZWV/52d + nf+dnZ3/mJiY/46Ojv9+fn7/ampq/09PT/85OTn/JiYm/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hh4e/wsL + C/8UFBT/WVlZ/5aWlv+zs7P/vr6+/8DAwP/Dw8P/xcXF/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9nZ2f/a2tox////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+0tLT/rq6u/6io + qP+ioqL/nJyc/5aWlv+Ojo7/hoaG/319ff93d3f/b29v/1xcXP9UVFT/PT09/zs7O/9PT0//Y2Nj/2lp + af9sbGz/bm5u/3Jycv9kZGT/JCQk/yEhIf86Ojr/QEBA/11dXf+FhYX/fn5+/7CwsP/5+fn/9vb2/4eH + h/8kJCT/HBwc/yYmJv8hISH/HR0d/yEhIf8mJib/JiYm/yUlJf8kJCT/IyMj/yMjI/8jIyP/JiYm/zIy + Mv9fX1//jY2N/6ysrP++vr7/xcXF/8nJyf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8nJyf/FxcX/vb29/6ur + q/99fX3/VFRU/zExMf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8lJSX/IyMj/yMjI/8LCwv/BgYG/0FBQf+Li4v/srKy/729vf/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1dXV/9bW1v/Y2Nj/2tra/9ra2jH///8B////Af// + /wH///8BxMTE48DAwP+8vLz/t7e3/7Kysv+srKz/p6en/6Ghof+ampr/k5OT/4uLi/+Dg4P/enp6/3R0 + dP9tbW3/X19f/1VVVf86Ojr/ODg4/09PT/9lZWX/bGxs/25ubv9ycnL/goKC/4eHh/8yMjL/Hh4e/ysr + K/9OTk7/gICA/39/f/+qqqr/9vb2//Pz8/+ampr/Hh4e/xoaGv8lJSX/IiIi/x4eHv8iIiL/JiYm/yYm + Jv8lJSX/JCQk/yMjI/8jIyP/IyMj/zAwMP9nZ2f/o6Oj/8XFxf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8vL + y//Ly8v/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/FxcX/m5ub/11dXf8uLi7/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8jIyP/CwsL/wYG + Bv85OTn/kJCQ/7Kysv+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9TU + 1P/V1dX/19fX/9nZ2f/a2tr/29vbMf///wH///8B////Af///wHExMTjwMDA/7u7u/+2trb/sbGx/6ur + q/+mpqb/oKCg/5mZmf+SkpL/iYmJ/4GBgf95eXn/dHR0/25ubv9iYmL/VlZW/0JCQv88PDz/T09P/2dn + Z/9vb2//cXFx/319ff+Xl5f/oaGh/0tLS/8dHR3/IyMj/0BAQP9lZWX/nJyc//Dw8P/6+vr/rKys/zMz + M/8YGBj/JSUl/yEhIf8cHBz/ISEh/yYmJv8mJib/JSUl/yQkJP8jIyP/IyMj/yMjI/9AQED/jY2N/8DA + wP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ly8v/vLy8/4GBgf89PT3/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yUlJf8kJCT/Kysr/xISEv8CAgL/Ly8v/4WFhf+tra3/vLy8/7+/v//BwcH/w8PD/8bG + xv/Hx8f/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//c3Nwx////Af// + /wH///8B////AcPDw+O/v7//u7u7/7W1tf+wsLD/qqqq/6Wlpf+enp7/l5eX/4yMjP+Hh4f/gYGB/3l5 + ef91dXX/b29v/2ZmZv9nZ2f/Z2dn/0lJSf9BQUH/ZWVl/3Jycv9/f3//lZWV/6Kiov91dXX/Ozs7/yws + LP8dHR3/JSUl/zg4OP+rq6v/7+/v/66urv8uLi7/GBgY/yUlJf8jIyP/HBwc/yAgIP8lJSX/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8qKir/XV1d/7W1tf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/7Cw + sP9nZ2f/KSkp/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/ycnJ/8PDw//AQEB/zIy + Mv+Hh4f/rKys/729vf+/v7//wcHB/8PDw//FxcX/x8fH/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9TU + 1P/W1tb/19fX/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8Bw8PD48DAwP+7u7v/tbW1/7Cw + sP+pqan/pKSk/52dnf+Li4v/bW1t/3Nzc/99fX3/e3t7/3h4eP9xcXH/aGho/2pqav9paWn/RUVF/zU1 + Nf9gYGD/e3t7/5OTk/+jo6P/fn5+/0VFRf9MTEz/ZGRk/zY2Nv8aGhr/HBwc/y4uLv9ycnL/Q0ND/xYW + Fv8iIiL/IyMj/xwcHP8fHx//IyMj/yUlJf8lJSX/JCQk/yQkJP8jIyP/KCgo/2lpaf+1tbX/zMzM/8zM + zP/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/7u7u/9mZmb/Kioq/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yQkJP8pKSn/FxcX/wEBAf8dHR3/fX19/6ioqP+6urr/vr6+/8DAwP/Dw8P/xcXF/8bG + xv/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3d3dMf// + /wH///8B////Af///wHDw8Pjv7+//7q6uv+0tLT/r6+v/6mpqf+jo6P/lJSU/21tbf9aWlr/VVVV/19f + X/94eHj/eXl5/3Jycv9sbGz/bm5u/2xsbP9ERET/MzMz/2pqav+Pj4//oqKi/4aGhv9BQUH/SUlJ/3R0 + dP+BgYH/b29v/1BQUP8VFRX/DQ0N/zs7O/9DQ0P/HR0d/yQkJP8bGxv/HR0d/yIiIv8kJCT/JCQk/yQk + JP8kJCT/IyMj/yUlJf9kZGT/u7u7/8rKyv/Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/8rK + yv/Kysr/ycnJ/7W1tf9dXV3/JSUl/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8lJSX/MzMz/0tLS/9TU1P/SUlJ/4GB + gf+rq6v/urq6/76+vv/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zs7O/8/Pz//R0dH/09PT/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/e3t4x////Af///wH///8B////AcPDw+O/v7//urq6/7W1 + tf+vr6//qamp/6Ojo/+Hh4f/Y2Nj/1dXV/9NTU3/UlJS/3h4eP96enr/cXFx/3BwcP9xcXH/bm5u/z8/ + P/8xMTH/eXl5/6Ghof+Hh4f/SkpK/0ZGRv9ubm7/g4OD/4KCgv/R0dH/3d3d/2hoaP8SEhL/IyMj/x0d + Hf8UFBT/GBgY/xwcHP8gICD/IiIi/yQkJP8kJCT/JCQk/yQkJP8jIyP/Q0ND/6+vr//Kysr/ysrK/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/y8vL/8vLy//Ly8v/y8vL/8rKyv/Kysr/ysrK/8rKyv/Kysr/ycnJ/7Gxsf9DQ0P/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/y0tLf9ERET/U1NT/3Nzc/+Kior/rq6u/7u7u/+9vb3/v7+//8LCwv/ExMT/xsbG/8jI + yP/Kysr/y8vL/83Nzf/Pz8//0dHR/9LS0v/U1NT/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3t7e/9/f + 3zH///8B////Af///wH///8BxMTE48DAwP+7u7v/tra2/7CwsP+pqan/o6Oj/4WFhf9nZ2f/VVVV/0hI + SP9PT0//enp6/3l5ef9zc3P/c3Nz/3R0dP9ubm7/Ozs7/ywsLP95eXn/k5OT/01NTf9CQkL/bGxs/4eH + h/97e3v/ycnJ//v7+//d3d3/X19f/xcXF/8YGBj/EhIS/xYWFv8bGxv/ICAg/yIiIv8jIyP/JCQk/yQk + JP8kJCT/JCQk/zAwMP+Hh4f/yMjI/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/ysrK/8rK + yv/Kysr/ysrK/8rKyv/Kysr/ycnJ/4qKiv8uLi7/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8mJib/HR0d/x8fH/9FRUX/enp6/56e + nv+3t7f/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1NTU/9XV + 1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/93d3f/f39//39/fMf///wH///8B////Af///wHExMTjwcHB/7y8 + vP+2trb/sbGx/6mpqf+jo6P/iIiI/2tra/9TU1P/RERE/0xMTP95eXn/d3d3/3V1df92dnb/d3d3/3Nz + c/8+Pj7/JCQk/0xMTP9RUVH/QUFB/2VlZf+Hh4f/eXl5/8fHx//+/v7/6Ojo/2RkZP8aGhr/Hh4e/yQk + JP8bGxv/HBwc/yEhIf8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/XFxc/76+vv/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Kysr/ysrK/8rKyv/Kysr/ysrK/8vLy//Ly8v/vLy8/1dX + V/8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8jIyP/IiIi/xkZGf8EBAT/ExMT/21tbf+goKD/uLi4/7y8vP++vr7/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Kysr/zc3N/87Ozv/Q0ND/0dHR/9PT0//V1dX/1tbW/9jY2P/Z2dn/2tra/9vb2//d3d3/3t7e/9/f + 3//g4OAx////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+ysrL/q6ur/6SkpP+Hh4f/bm5u/1BQ + UP9CQkL/TU1N/3t7e/93d3f/eHh4/3h4eP97e3v/g4OD/01NTf8iIiL/MDAw/0RERP9gYGD/hYWF/3V1 + df+vr6//+Pj4//Hx8f+IiIj/Hh4e/xwcHP8lJSX/Hx8f/x0dHf8gICD/IiIi/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf+SkpL/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zs7O/87Ozv/Ozs7/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/Jycn/hoaG/ywsLP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8bGxv/BAQE/wcHB/9RUVH/mZmZ/7S0 + tP+8vLz/vr6+/8DAwP/Dw8P/xcXF/8fHx//IyMj/ysrK/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9bW + 1v/X19f/2NjY/9ra2v/b29v/3d3d/97e3v/f39//4ODg/+Hh4TH///8B////Af///wH///8BxMTE48LC + wv++vr7/uLi4/7Ozs/+tra3/pqam/4iIiP9xcXH/T09P/0JCQv9LS0v/e3t7/3p6ev96enr/fX19/4iI + iP+enp7/eXl5/yUlJf8sLCz/Wlpa/3x8fP92dnb/srKy//j4+P/w8PD/ioqK/yIiIv8bGxv/JSUl/x8f + H/8cHBz/ICAg/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MjIy/7q6uv/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zc3N/83N + zf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/MzMz/zMzM/83N + zf+urq7/OTk5/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8iIiL/Gxsb/wYGBv8ODg7/UVFR/5mZmf+1tbX/u7u7/76+vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8rK + yv/MzMz/zs7O/9DQ0P/R0dH/09PT/9TU1P/V1dX/2NjY/9nZ2f/a2tr/29vb/9zc3P/e3t7/39/f/+Dg + 4P/h4eH/4eHhMf///wH///8B////Af///wHExMTjwsLC/76+vv+6urr/tbW1/66urv+oqKj/ioqK/3d3 + d/9oaGj/Xl5e/05OTv94eHj/fX19/35+fv+IiIj/mpqa/5+fn/9kZGT/KCgo/yAgIP9KSkr/aWlp/5WV + lf/29vb/+vr6/56env8oKCj/GRkZ/yUlJf8hISH/HBwc/yAgIP8iIiL/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP9LS0v/ysrK/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8HBwf9OTk7/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8kJCT/JSUl/x8fH/8HBwf/BgYG/05OTv+Pj4//r6+v/7u7 + u/+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Pz8//0dHR/9PT0//U1NT/1dXV/9fX + 1//Y2Nj/2tra/9vb2//d3d3/3d3d/97e3v/g4OD/4eHh/+Li4v/i4uIx////Af///wH///8B////AcTE + xOPCwsL/v7+//7u7u/+3t7f/sbGx/6qqqv+Kior/e3t7/3x8fP9sbGz/Pj4+/1lZWf9+fn7/iIiI/5ub + m/+jo6P/bm5u/z8/P/9GRkb/MTEx/yYmJv9JSUn/YGBg/7Gxsf+qqqr/Ly8v/xgYGP8kJCT/IiIi/x0d + Hf8fHx//IiIi/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/2BgYP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87O + zv/Ozs7/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/ysrK/11dXf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JCQk/yQk + JP8fHx//CQkJ/wcHB/9FRUX/kJCQ/62trf+6urr/vLy8/7+/v//BwcH/xMTE/8bGxv/IyMj/ysrK/8zM + zP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9ra2v/b29v/3Nzc/93d3f/e3t7/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4zH///8B////Af///wH///8BxcXF48LCwv+/v7//vLy8/7i4uP+zs7P/qqqq/4iI + iP9+fn7/fn5+/2lpaf83Nzf/VlZW/4aGhv+YmJj/oaGh/3x8fP8+Pj7/TU1N/3h4eP9oaGj/NjY2/xkZ + Gf8TExP/IyMj/z4+Pv8eHh7/IiIi/yQkJP8cHBz/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/aGho/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/a2tr/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yQkJP8mJib/NjY2/y0tLf8aGhr/Q0ND/5GRkf+urq7/ubm5/7y8 + vP+/v7//wcHB/8PDw//FxcX/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/09PT/9TU1P/V1dX/19fX/9jY + 2P/Z2dn/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTkMf///wH///8B////Af// + /wHFxcXjwsLC/7+/v/+8vLz/uLi4/7S0tP+jo6P/hISE/4CAgP+AgID/aWlp/zY2Nv9cXFz/l5eX/6Oj + o/+AgID/RUVF/0lJSf9ycnL/g4OD/4ODg/+1tbX/S0tL/w4ODv8iIiL/Ozs7/x8fH/8eHh7/Hh4e/x4e + Hv8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP9hYWH/zMzM/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zc3N/8vLy/9qamr/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8kJCT/JCQk/zQ0 + NP9MTEz/X19f/2pqav+SkpL/s7Oz/7m5uf+7u7v/vr6+/8DAwP/Dw8P/xcXF/8fHx//Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Tk5P/k5OQx////Af///wH///8B////AcbGxuPDw8P/wMDA/7y8vP+5ubn/sbGx/5KS + kv+CgoL/goKC/4GBgf9lZWX/NDQ0/1xcXP+ioqL/iIiI/0VFRf9ERET/dHR0/4SEhP+BgYH/3t7e//z8 + /P+wsLD/Li4u/ycnJ/8bGxv/FBQU/xoaGv8gICD/JSUl/yYmJv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/1FRUf/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/x8fH/1xcXP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/LS0t/0RERP9oaGj/hoaG/6+vr/+5ubn/vLy8/76+ + vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8vLy//Nzc3/z8/P/9DQ0P/S0tL/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+Xl5TH///8B////Af// + /wH///8BxsbG48TExP/BwcH/vb29/7q6uv+np6f/h4eH/4ODg/+Dg4P/g4OD/2VlZf8zMzP/Q0ND/4CA + gP9MTEz/QkJC/2hoaP+Hh4f/enp6/9DQ0P/9/f3/4ODg/1VVVf8ZGRn/Hx8f/xkZGf8WFhb/Hh4e/yUl + Jf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Ojo6/8HB + wf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP+8vLz/R0dH/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8iIiL/IiIi/xAQ + EP8GBgb/NjY2/4GBgf+hoaH/ubm5/7u7u/++vr7/wMDA/8LCwv/ExMT/xsbG/8nJyf/Ly8v/zc3N/8/P + z//Q0ND/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Xl5f/l5eX/5ubmMf///wH///8B////Af///wHHx8fjxMTE/8HBwf++vr7/u7u7/5iY + mP+EhIT/hYWF/4WFhf+IiIj/dnZ2/zc3N/8sLCz/RUVF/0NDQ/9paWn/hYWF/319ff/IyMj/+/v7/+Dg + 4P9lZWX/FhYW/x0dHf8kJCT/Hh4e/x8fH/8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8mJib/n5+f/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/ysrK/5ycnP8yMjL/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IiIi/yEhIf8TExP/AwMD/yoqKv+BgYH/qamp/7i4uP+8vLz/vr6+/8DA + wP/CwsL/xMTE/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9vb + 2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5uYx////Af// + /wH///8B////AcjIyOPFxcX/wsLC/7+/v/+8vLz/k5OT/4WFhf+Ghob/iIiI/5KSkv+Ojo7/QkJC/yoq + Kv9eXl7/cHBw/4ODg/93d3f/vr6+//n5+f/n5+f/dHR0/xwcHP8cHBz/JSUl/x4eHv8fHx//JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP9wcHD/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//FxcX/eHh4/ykpKf8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8hISH/ExMT/wMD + A/8bGxv/dHR0/6Wlpf+4uLj/vLy8/76+vv/AwMD/wsLC/8TExP/Gxsb/ycnJ/8vLy//Nzc3/z8/P/9DQ + 0P/S0tL/09PT/9XV1f/X19f/2NjY/9nZ2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj + 4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5zH///8B////Af///wH///8ByMjI48bGxv/ExMT/wcHB/729 + vf+SkpL/hoaG/4iIiP+RkZH/oKCg/5eXl/9HR0f/JSUl/1JSUv+Li4v/gICA/66urv/6+vr/8fHx/3x8 + fP8eHh7/Gxsb/yUlJf8fHx//Hh4e/yIiIv8kJCT/JCQk/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/z4+Pv+np6f/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/7CwsP9JSUn/JCQk/yQk + JP8kJCT/JCQk/yQkJP8jIyP/IyMj/xgYGP8EBAT/ExMT/2dnZ/+ampr/tra2/7y8vP++vr7/wMDA/8LC + wv/ExMT/xsbG/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/5+fnMf// + /wH///8B////Af///wHJycnjx8fH/8XFxf/CwsL/vr6+/5KSkv+JiYn/kZGR/6CgoP+fn5//Y2Nj/zo6 + Ov8sLCz/Kioq/21tbf+QkJD/w8PD/+zs7P+RkZH/Hh4e/xoaGv8kJCT/ICAg/x0dHf8gICD/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/KCgo/2dnZ//CwsL/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vL + y//Ly8v/y8vL/8vLy//Gxsb/ZmZm/ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8XFxf/BAQE/xkZ + Gf9oaGj/np6e/7S0tP+8vLz/vr6+/8DAwP/CwsL/xMTE/8fHx//IyMj/y8vL/8zMzP/Ozs7/0NDQ/9LS + 0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Ogx////Af///wH///8B////AcrKyuPIyMj/xsbG/8PD + w/+/v7//kpKS/5CQkP+dnZ3/o6Oj/3R0dP88PDz/Tk5O/2FhYf8vLy//LCws/z4+Pv8+Pj7/cHBw/zAw + MP8ZGRn/IyMj/yEhIf8dHR3/ICAg/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Li4u/5OTk//MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/y8vL/8vLy//Ly8v/ycnJ/56env8xMTH/JCQk/yQk + JP8kJCT/IyMj/yMjI/8mJib/ISEh/wcHB/8KCgr/YWFh/5mZmf+2trb/vLy8/76+vv/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/29vb/9zc + 3P/e3t7/39/f/+Dg4P/h4eH/4eHh/+Pj4//j4+P/5OTk/+Xl5f/l5eX/5ubm/+fn5//o6Oj/6Ojo/+np + 6TH///8B////Af///wH///8By8vL48nJyf/Hx8f/xcXF/7+/v/+YmJj/np6e/6Ojo/9ycnL/PT09/1JS + Uv96enr/fX19/3p6ev9RUVH/ERER/xISEv9MTEz/Pz8//yEhIf8iIiL/Hx8f/x8fH/8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/Nzc3/5WVlf/IyMj/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/y8vL/8rKyv+dnZ3/QEBA/yQkJP8kJCT/JCQk/yQkJP8jIyP/KSkp/0FBQf9RUVH/U1NT/2lp + af+qqqr/tra2/729vf+/v7//wcHB/8PDw//ExMT/x8fH/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9PT + 0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Li4v/i4uL/5OTk/+Tk + 5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+np6f/p6en/6enpMf///wH///8B////Af///wHMzMzjysrK/8jI + yP/Gxsb/wcHB/6Ojo/+mpqb/fX19/0FBQf9HR0f/dnZ2/4GBgf+Ghob/4eHh/9PT0/9MTEz/KSkp/zMz + M/8gICD/Ghoa/xwcHP8gICD/ISEh/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/QEBA/5aW + lv/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Kysr/qamp/0lJSf8mJib/JCQk/yQk + JP8kJCT/IyMj/yQkJP8zMzP/SkpK/1tbW/94eHj/mJiY/7q6uv+8vLz/v7+//8HBwf/Dw8P/xcXF/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3Nzc/93d + 3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq + 6v/q6uox////Af///wH///8B////Ac3NzePLy8v/ycnJ/8fHx//ExMT/rKys/4SEhP9ERET/R0dH/29v + b/+CgoL/hYWF/+Li4v/7+/v/wMDA/zY2Nv8eHh7/HR0d/xISEv8ZGRn/Hh4e/yEhIf8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MzMz/4KCgv+6urr/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/v7+//4qKiv9AQED/JSUl/yQkJP8kJCT/JCQk/yMjI/8iIiL/ICAg/xISEv8nJyf/YWFh/42N + jf+ysrL/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU + 1P/W1tb/19fX/9nZ2f/a2tr/29vb/93d3f/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6zH///8B////Af///wH///8Bz8/P483N + zf/Kysr/yMjI/8bGxv+jo6P/SkpK/0NDQ/9sbGz/goKC/35+fv/R0dH/+/v7/8zMzP9KSkr/ExMT/x0d + Hf8hISH/GRkZ/x4eHv8hISH/IiIi/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yQiIf8iIiL/IiIi/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/LCws/1dXV/+jo6P/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/x8fH/6mpqf9kZGT/Ly8v/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IiIi/x4eHv8LCwv/BwcH/0BAQP+QkJD/sbGx/729vf/AwMD/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Ly8v/zMzM/87Ozv/Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq + 6v/r6+v/6+vrMf///wH///8B////Af///wHPz8/jzs7O/8zMzP/Kysr/yMjI/7e3t/9vb2//aGho/4OD + g/94eHj/y8vL//v7+//T09P/VFRU/xcXF/8dHR3/IyMj/xwcHP8dHR3/ISEh/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv86Ih7/ciQW/0AhHP8jISH/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JiYm/zo6Ov9oaGj/o6Oj/8HB + wf/Jycn/zMzM/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Jycn/xMTE/62t + rf9wcHD/Pz8//ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8gICD/DAwM/wMDA/89PT3/h4eH/7Cw + sP+9vb3/v7+//8LCwv/ExMT/xsbG/8fHx//Jycn/y8vL/83Nzf/Pz8//0NDQ/9LS0v/T09P/1NTU/9bW + 1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Owx////Af///wH///8B////AdHR + 0ePPz8//zc3N/8vLy//Jycn/x8fH/7W1tf+SkpL/e3t7/76+vv/+/v7/5OTk/1paWv8UFBT/HBwc/yQk + JP8bGxv/HBwc/yEhIf8kJCT/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/NSIe/5EnFP/CLBH/ZCUa/yYi + If8iIiL/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8tLS3/TU1N/3Z2dv+goKD/rq6u/7q6uv/BwcH/yMjI/8nJ + yf/Hx8f/xcXF/729vf+urq7/m5ub/3p6ev9VVVX/MzMz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMj + I/8iIiL/ICAg/w4ODv8CAgL/Kioq/42Njf+tra3/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/d3d3/3t7e/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+np6f/p6en/6urq/+vr + 6//r6+v/7Ozs/+zs7DH///8B////Af///wH///8B0tLS49DQ0P/Ozs7/zMzM/8vLy//Jycn/xsbG/7Ky + sv+xsbH/9PT0/+np6f98fHz/GRkZ/xkZGf8jIyP/Hx8f/xwcHP8hISH/JSUl/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/ykhIP9/JRX/xCwR/4UoGP8qIiH/IiIi/yIiIv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/KCgo/zY2Nv9AQED/TExM/1lZWf9qamr/bW1t/2hoaP9iYmL/UVFR/0FBQf8zMzP/KCgo/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yEhIf8QEBD/AgIC/yAgIP90dHT/qqqq/7y8 + vP/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/0tLS/9PT0//U1NT/1tbW/9fX + 1//Z2dn/2tra/9zc3P/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4uLi/+Pj4//k5OT/5eXl/+bm + 5v/m5ub/5+fn/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7OzsMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/wsLC/5GRkf+kpKT/cHBw/xsbG/8ZGRn/IiIi/x8f + H/8eHh7/IyMj/yYmJv8lJSX/IyMj/yIiIv8iIiL/IiIi/yIiIv8sIR//eSYX/8UtEf+CKBj/LiIg/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yQiIv8jIyP/IyMj/yMjI/8jIiL/LCIh/0sjHP9vJRj/NSIf/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yQk + JP8nJyf/ERER/wICAv8lJSX/fX19/6ampv++vr7/wcHB/8PDw//ExMT/xsbG/8jIyP/Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3d3d/93d3f/e3t7/39/f/+Dg + 4P/h4eH/4uLi/+Pj4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+3t7f/t7e0x////Af///wH///8B////AdXV1ePT09P/0dHR/8/Pz//Nzc3/zMzM/8rK + yv/BwcH/aGho/zs7O/9DQ0P/ISEh/yIiIv8eHh7/HR0d/yIiIv8mJib/JSUl/yMjI/8iIiL/IiIi/yIi + Iv8hISH/JCEh/3QlF//DLBD/tSsS/z4iHf8iISH/IiIi/yIiIv8iIiL/IiEh/yohH/9JIhz/YiIX/zch + Hf8kIiL/JiIh/0ciG/9+Jhb/jCgW/7csE/9GJB7/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/Li4u/z4+Pv8sLCz/Kysr/35+fv+qqqr/vLy8/8HB + wf/Dw8P/xcXF/8bGxv/IyMj/ysrK/8zMzP/Nzc3/z8/P/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+bm + 5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7jH///8B////Af// + /wH///8B1dXV49TU1P/T09P/0dHR/8/Pz//Nzc3/y8vL/8LCwv9vb2//U1NT/0dHR/8tLS3/JiYm/x4e + Hv8iIiL/JSUl/yUlJf8jIyP/IyMj/yIiIv8hISH/ISEh/yYgIP9fIxj/xSwR/7QsE/+7KxL/lycT/1Ui + GP80IR7/OSEc/0ohGv9tIxb/nygT/7wrEv+6LBL/hiYV/1MiGf98Jhb/kSgV/2QmG/9YJhz/nisW/ywj + If8jIiL/MyIf/z8iHf8vIiD/IyIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/IyMj/yYm + Jv9DQ0P/UVFR/2xsbP9/f3//s7Oz/7+/v//BwcH/xMTE/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ + 0P/R0dH/09PT/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr + 6//s7Oz/7Ozs/+3t7f/u7u7/7u7uMf///wH///8B////Af///wHX19fj1dXV/9TU1P/S0tL/0NDQ/8/P + z//Nzc3/xcXF/35+fv9PT0//MDAw/ywsLP8mJib/ISEh/yQkJP8lJSX/IyMj/yMjI/8iIiL/IiIi/yEh + If8jICD/YiMZ/7srEf+fKhX/QSMd/1QkHP+eKhX/vCoQ/64pEf+sKBH/tioR/7ErE/+ZKhb/dCca/1Ml + HP98JRb/mCgU/3EnGv85JCD/JiMi/2smGv95KBn/IyMi/zQjIP+PJxT/hicW/3AkFv84Ix//IyIi/yMj + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/Hh4e/zIyMv9PT0//e3t7/5ycnP+9vb3/w8PD/8TE + xP/Gxsb/yMjI/8nJyf/Ly8v/zc3N/87Ozv/Q0ND/0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra + 2v/c3Nz/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//r6+v/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u4x////Af// + /wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/8/Pz//IyMj/gYGB/zc3N/8sLCz/KCgo/yEh + If8hISH/IyMj/yQkJP8jIyP/IiIi/yIiIv8hISH/ISEh/1EjG/+7KxH/tisS/0QjHf8iISD/IiEg/zUi + Hv9rJhn/tysS/7YqEf9eJBr/PiMe/y8iIP8lIiH/JCIh/0wkHf9DJB7/KCMi/yIiIv8qIiH/hSgX/1Ym + Hf8nIiH/QyQe/5YpFf9IIxz/TyUd/4gnFv9aJBn/JSIi/yMiIv8jIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/xoa + Gv8GBgb/FxcX/2RkZP+enp7/u7u7/8PDw//FxcX/x8fH/8jIyP/Kysr/zMzM/87Ozv/Pz8//0NDQ/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9ra2v/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7jH///8B////Af///wH///8B2tra49jY2P/W1tb/1NTU/9PT + 0//S0tL/0NDQ/8XFxf9kZGT/LS0t/ygoKP8iIiL/IiIi/yMjI/8kJCT/IyMj/yMjI/8iIiL/IiIi/yEh + If8oISD/gCcX/8ctEf+gKBP/QSEb/yYgH/8gICD/ICAg/yAgH/9MIxz/tisS/34mFv8mISD/ISEh/yYh + IP83IR3/RSIb/0MiHP8zIR7/IyEh/0IkHv+ZKRX/OyMf/1ckG/9zJRf/WSUc/4MmFf9uJBf/pSoU/1Yl + HP9EIx3/SyMc/zMiH/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8ZGRn/BQUF/wwMDP9bW1v/oaGh/7+/v//FxcX/xsbG/8jI + yP/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/n5+f/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7v/v7+//7+/vMf// + /wH///8B////Af///wHa2trj2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/w8PD/1dXV/8sLCz/IyMj/yEh + If8jIyP/JCQk/yQkJP8jIyP/IyMj/yIiIv8iIiL/IiIi/yEhIf8zIh//aiYa/64qE/+uKRH/bSMW/y0f + Hf8gICD/ICAg/zshHf+tKhL/oioU/y0hH/8rIB7/bCMW/6QpEv+0KhH/rykR/5onEv9aIhj/WiQa/3cn + Gf8pIiH/SSQd/40nFP9YIhn/fiYW/6YqFP9dJRv/WSQa/5goFf+JKBb/gCYW/zUiHv8kIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yMjI/8iIiL/HBwc/wcH + B/8GBgb/SkpK/5ycnP+9vb3/xcXF/8fHx//Jycn/ysrK/8zMzP/Nzc3/zs7O/9DQ0P/S0tL/09PT/9XV + 1f/W1tb/19fX/9nZ2f/Z2dn/2tra/9vb2//d3d3/3d3d/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+vr6//r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//w8PAx////Af///wH///8B////Advb2+Pa2tr/2dnZ/9fX + 1//W1tb/1NTU/9PT0//CwsL/UFBQ/yQkJP8hISH/IyMj/yQkJP8kJCT/JCQk/yMjI/8jIyP/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8iISD/OSIe/3wnGP+zKhL/nycR/2YiFv9WIRf/kCUS/8UsEf93Jxn/MSEe/4Ul + FP+5KxL/gygX/0wkHf9FIx3/dicY/68qEv98JRb/KiIg/yIiIf8kIiH/QyMe/38nGP+NKRb/XCYb/1wk + Gv+dKRT/SyUe/ykjIv98KBn/licU/z0iHv8tIiD/JSIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yMjI/8jIyP/JCQk/yEhIf8JCQn/CQkJ/0hISP+YmJj/wMDA/8fHx//IyMj/ycnJ/8vL + y//MzMz/zs7O/8/Pz//R0dH/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8DH///8B////Af///wH///8B3d3d49zc3P/a2tr/2dnZ/9fX1//W1tb/1NTU/8DAwP9GRkb/IiIi/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/JyEg/04j + HP+QKBX/tioR/70rEP+3KxL/gygX/zsiHv9tJRj/viwR/3AmGf8rISD/ISEh/yEhIf8nISD/dicY/7Eq + Ev88Ih7/IiIi/yIiIv8iIiL/JiIh/ykiIf82Ih7/likV/10mHP8kIiL/OCIe/5UpFv9pJxv/RCMe/3Ym + F/8xIyD/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yMjI/8jIyP/CgoK/wQE + BP9AQED/kpKS/7u7u//IyMj/ycnJ/8vLy//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//U1NT/1tbW/9fX + 1//Y2Nj/2tra/9vb2//c3Nz/3Nzc/97e3v/e3t7/39/f/+Dg4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDwMf///wH///8B////Af///wHe3t7j3d3d/9zc + 3P/a2tr/2dnZ/9fX1//W1tb/y8vL/2hoaP8sLCz/IyMj/yMjI/8kJCT/JCQk/yMjI/8jIyP/IyMj/yMj + I/8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEg/ywhH/9BIx3/TyQc/0AjHv8pISD/NCIe/6Iq + FP+cKRX/KyEf/yEhIf8hISH/ISEh/yQhIP9sJRj/vSsR/0sjHf8hISH/MCEf/0QiHP8oISD/IiIi/yci + If9CJB7/JyIh/zciH/+IJxX/cica/0YkHf+RKBX/YiYc/zoiHv9kJBn/RyMd/yUiIv8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/MTEx/x8fH/8NDQ3/Pz8//5WVlf+5ubn/ycnJ/8vLy//MzMz/zc3N/8/P + z//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg + 4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6enp/+np + 6f/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8P/x8fEx////Af///wH///8B////Ad/f3+Pe3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/xMTE/4yM + jP89PT3/JiYm/yMjI/8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yEhIf8hISH/ISEh/yEhIf8zIh//oioU/5AoFf8jICD/ISEh/yEhIf8gICD/OiEc/6Ao + Ev+rKhP/MiIf/ysgHv+EJhX/rikR/0QjHf8iIiL/IiIi/yIiIv8iIiL/TiMc/24nGv9CIx7/kikW/3co + Gf89Ix7/hicX/4EpGf9iJhv/KiMi/yMjI/8jIyP/IyMj/yMjI/8iIiL/JCQk/zg4OP9SUlL/XV1d/2Ji + Yv+ZmZn/xMTE/8zMzP/MzMz/zs7O/8/Pz//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/b29v/3Nzc/93d3f/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8TH///8B////Af///wH///8B4ODg49/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/0tLS/6qqqv9kZGT/Kysr/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/yYh + IP9zJxn/sCoS/1QhGP8oIB7/IyAf/zcgG/+MJRP/visR/2YlGf8oIB//aSMX/78rEf+CKBj/LCIg/yIi + Iv8iIiH/IyIh/yIhIf8oIiH/NyIe/4AmFv99KBj/PSId/4EnFv95KBn/LSMi/yYjIv8jIyL/IyMj/yMj + I/8jIyP/IiIi/yIiIv8lJSX/OTk5/1NTU/9nZ2f/hYWF/7m5uf/Nzc3/zs7O/8/Pz//Q0ND/0dHR/9LS + 0v/T09P/1NTU/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx + 8f/x8fH/8fHxMf///wH///8B////Af///wHh4eHj4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9TU1P+goKD/XFxc/y8vL/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/ykhIP9yJhj/qikS/54mEf+WJRH/rSgR/6sq + E/9kJRr/LyEe/3EkFv+/KxD/gygX/zAiH/8hISH/IiEh/zIiH/97JRX/VCMa/ysiIP9zJRf/eygZ/1Ek + HP+fKBP/likV/zMjIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JCQk/xEREf8HBwf/PT09/4GB + gf+0tLT/zs7O/8/Pz//R0dH/0tLS/9LS0v/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/x8fEx////Af///wH///8B////AeLi + 4uPh4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/ExMT/ioqK/0FB + Qf8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yghIP9FIx3/aCUZ/3UmGP9lJRn/QiMd/ychH/9YIhj/vSsR/5YpFf8wIh//ISEh/yEh + If8tIR//eSUW/7wsEf9lJhv/JyIh/0QkHv81IyD/YCUa/4spF/9UJR3/KyMh/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IiIi/yQkJP8XFxf/AgIC/xwcHP95eXn/sbGx/87Ozv/Q0ND/0tLS/9PT0//U1NT/1NTU/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/29vb/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx + 8f/y8vL/8vLy//Ly8jH///8B////Af///wH///8B4+Pj4+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/29vb/9ra2v/Z2dn/2NjY/9fX1//T09P/urq6/3t7e/81NTX/JSUl/yIiIv8jIyP/IyMj/yMj + I/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIP8iISD/JCEg/yIh + IP8lICD/WCIZ/7QqEf+sKxP/PiMe/yEhIP8hISH/KyAf/3klFv+7KxH/byca/yoiIf8iIiL/IyIi/y8i + IP9CIx3/MSMh/yQjIv8jIyL/IyMj/yMjI/8jIyP/IiIi/yMjI/8mJib/GBgY/wUFBf8eHh7/d3d3/7W1 + tf/Ozs7/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/19fX/9nZ2f/Z2dn/29vb/9zc3P/c3Nz/3t7e/97e + 3v/g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/PzMf///wH///8B////Af// + /wHk5OTj5OTk/+Li4v/i4uL/4ODg/+Dg4P/e3t7/3t7e/93d3f/c3Nz/29vb/9ra2v/a2tr/2dnZ/9jY + 2P/X19f/09PT/6SkpP9gYGD/Kioq/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/zIhHv+TKBT/qCoT/6EpFP82IR3/ISAg/yYg + H/9nIxf/uysR/4MoF/8uIiD/IiIi/yIiIv8xIiD/iSgW/48oFf81IyD/IyMj/yMjI/8jIyP/IyMj/yMj + I/8iIiL/KSkp/x8fH/8FBQX/FRUV/2lpaf+urq7/0NDQ/9TU1P/V1dX/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/Z2dn/29vb/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Pz8//z8/Mx////Af///wH///8B////AeXl5ePl5eX/5OTk/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/97e3v/c3Nz/3Nzc/9vb2//a2tr/2tra/9nZ2f/Y2Nj/1tbW/8nJyf+MjIz/RUVF/yYm + Jv8iIiL/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEh + If8hISH/JCEg/z0iHv9HIx3/pyoT/4gmE/9QIRj/dCQW/7orEf+OKRf/NCMf/yIiIv8iIiL/MCIf/4Em + Fv/ALRL/cCga/yojIv8jIyP/IyMj/yMjI/8jIyP/IiIi/yQkJP8eHh7/BQUF/wwMDP9hYWH/qamp/83N + zf/V1dX/1tbW/9fX1//X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8zH///8B////Af// + /wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/9/f3//e3t7/3d3d/9zc + 3P/c3Nz/29vb/9ra2v/Z2dn/2dnZ/9fX1/+8vLz/fHx8/zg4OP8kJCT/IiIi/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEh/yMhIP9TJBz/nSkV/7gr + Ef+2KxL/uiwS/08kHP8iIiL/IiIi/yoiIP+AJhX/vywS/3YoGv8pIyL/IyMj/yMjI/8jIyP/IyMj/yIi + Iv8qKir/JSUl/wkJCf8RERH/Xl5e/6enp//Pz8//19fX/9jY2P/Y2Nj/2dnZ/9ra2v/a2tr/3Nzc/9zc + 3P/d3d3/3t7e/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5+fn/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/PzMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5OTk/+Pj + 4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/29vb/9vb2//a2tr/2dnZ/9nZ + 2f/R0dH/pKSk/19fX/9LS0v/YmJi/2FhYf9PT0//LS0t/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8hISH/ISEh/yMhIP82Ix//TiQd/0okHf+iKhT/YCQZ/yQhIf8oISD/aCQY/8As + Ef+BKRn/MCMh/yMjI/8jIyP/IyMj/yMjI/8iIiL/Kysr/0xMTP9MTEz/QkJC/2RkZP+ysrL/zs7O/9jY + 2P/Z2dn/2dnZ/9ra2v/b29v/3Nzc/9zc3P/e3t7/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/z8/Mx////Af// + /wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg + 4P/g4OD/39/f/97e3v/e3t7/3d3d/9zc3P/c3Nz/29vb/9ra2v/a2tr/1tbW/9TU1P/Y2Nj/19fX/9TU + 1P+1tbX/ZWVl/ysrK/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEh + If8iIiH/IiIh/2YnG/+zKxL/nCgT/6MoEv/BLBH/gSkZ/zAkIf8jIyL/IyMj/yMjI/8jIyP/IiIi/ycn + J/84ODj/VFRU/2JiYv92dnb/q6ur/9fX1//a2tr/2tra/9vb2//c3Nz/3d3d/93d3f/e3t7/39/f/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Pz + 8//z8/P/8/Pz//Pz8//09PT/9PT0//Pz8zH///8B////Af///wH///8B6enp4+np6f/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d + 3f/d3d3/3Nzc/9vb2//b29v/29vb/9ra2v/a2tr/2dnZ/9nZ2f/Dw8P/YmJi/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/KiIh/10mHP+UKhb/nSsW/28o + G/8uIyH/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/ISEh/xQUFP8uLi7/Z2dn/4+Pj//Ozs7/29vb/9zc + 3P/c3Nz/3d3d/97e3v/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm + 5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx + 8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0Mf// + /wH///8B////Af///wHq6urj6urq/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/97e3v/e3t7/3d3d/93d3f/d3d3/3Nzc/9zc + 3P/b29v/29vb/9ra2v+mpqb/Kioq/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/JCMi/ysjIv8sIyH/JiMi/yMjIv8jIyP/IyMj/yMjI/8iIiL/IiIi/x0d + Hf8ICAj/BQUF/zs7O/+Wlpb/x8fH/9zc3P/d3d3/3t7e/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6urq/+rq + 6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//X19f/19fUx////Af///wH///8B////Aevr6+Pr6+v/6urq/+rq + 6v/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh + 4f/h4eH/4ODg/+Dg4P/f39//3t7e/97e3v/e3t7/3d3d/93d3f/c3Nz/3Nzc/8HBwf83Nzf/IiIi/yIi + Iv8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yIiIv8hISH/DQ0N/wMDA/80NDT/kJCQ/8nJyf/d3d3/39/f/9/f + 3//g4OD/4ODg/+Hh4f/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5eXl/+bm5v/n5+f/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X1 + 9TH///8B////Af///wH///8B7Ozs4+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Xl5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/9/f + 3//f39//3t7e/97e3v/d3d3/19fX/4uLi/89PT3/JCQk/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JSUl/w4O + Dv8CAgL/IyMj/4KCgv/FxcX/39/f/+Dg4P/g4OD/4eHh/+Hh4f/i4uL/4uLi/+Pj4//j4+P/5OTk/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr + 6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1Mf///wH///8B////Af///wHt7e3j7Ozs/+zs + 7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Xl + 5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Hh4f/g4OD/4ODg/9/f3//f39//3d3d/76+ + vv9ycnL/ODg4/yQkJP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yMjI/8RERH/AgIC/yYmJv+IiIj/xcXF/9/f3//i4uL/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+np + 6f/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vYx////Af///wH///8B////Ae3t7ePt7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Li + 4v/i4uL/4uLi/+Hh4f/h4eH/4eHh/+Dg4P/g4OD/4ODg/9TU1P+np6f/XFxc/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8nJyf/FBQU/wIC + Av8cHBz/dnZ2/8TExP/f39//4uLi/+Pj4//j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6enp/+np6f/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b29jH///8B////Af///wH///8B7u7u4+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo + 6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//i4uL/4uLi/+Li + 4v/i4uL/4eHh/+Hh4f/X19f/l5eX/05OTv8oKCj/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/Tk5O/5iYmP9zc3P/UVFR/5OTk//Gxsb/4uLi/+Tk5P/k5OT/5eXl/+Xl + 5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2Mf///wH///8B////Af///wHu7u7j7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/r6+v/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5eXl/+Tk5P/k5OT/5OTk/+Pj4//j4+P/4+Pj/+Pj4//i4uL/4uLi/+Pj4//g4OD/xMTE/3d3 + d/82Njb/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IiIi/0RERP+urq7/4uLi/+Li + 4v/a2tr/4ODg/+Tk5P/l5eX/5eXl/+Xl5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u + 7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 + 9P/09PT/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vYx////Af///wH///8B////Ae/v + 7+Pu7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq + 6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk + 5P/k5OT/5OTk/+Pj4//j4+P/5OTk/+Tk5P/k5OT/29vb/7i4uP9ra2v/LS0t/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IiIi/yMjI/84ODj/ra2t/+Li4v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm5v/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b2 + 9v/29vb/9vb2//b29jH///8B////Af///wH///8B8PDw4+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6enp/+jo + 6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm + 5v/m5ub/5ubm/9jY2P+dnZ3/V1dX/yYmJv8iIiL/IyMj/yMjI/8iIiL/PDw8/6CgoP/l5eX/5+fn/+fn + 5//n5+f/5+fn/+fn5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2Mf///wH///8B////Af// + /wHw8PDj8PDw//Dw8P/v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+np6f/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn + 5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+fn5//n5+f/5+fn/+Tk5P/MzMz/eHh4/zY2 + Nv8kJCT/IiIi/y0tLf+ampr/4ODg/+fn5//o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6enp/+np + 6f/p6en/6enp/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b2 + 9v/29vb/9vb2//f39//29vYx////Af///wH///8B////AfHx8ePx8fH/8PDw//Dw8P/w8PD/7+/v/+/v + 7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr + 6//q6ur/6urq/+rq6v/p6en/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo + 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/k5OT/xcXF/3R0dP9MTEz/kZGR/+bm5v/p6en/6enp/+np + 6f/p6en/6enp/+np6f/q6ur/6urq/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X1 + 9f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//b29jH///8B////Af// + /wH///8B8fHx4/Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u + 7v/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+np + 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np + 6f/p6en/3d3d/83Nzf/h4eH/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/39/f/9/f3//f39//39/f/9vb2Mf///wH///8B////Af///wHy8vLj8fHx//Hx8f/x8fH/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+rq + 6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//f39//39/cx////Af// + /wH///8B////AfLy8uPy8vL/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw/+/v + 7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX1//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f3 + 9//39/f/9/f3//f39//39/f/9/f3//j4+DH///8B////Af///wH///8B8/Pz4/Pz8//y8vL/8vLy//Ly + 8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7+/v/+/v + 7//u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T0 + 9P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//f39//39/f/9/f3//f39//4+Pj/+Pj4Mf// + /wH///8B////Af///wHz8/Pj8/Pz//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/9/f3//f3 + 9//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pgx////Af///wH///8B////AfT09OP09PT/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4 + +DH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ROMVault2/FrmProgressWindowFix.cs b/ROMVault2/FrmProgressWindowFix.cs new file mode 100644 index 0000000..9bbaa30 --- /dev/null +++ b/ROMVault2/FrmProgressWindowFix.cs @@ -0,0 +1,181 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Threading; +using System.Windows.Forms; +using ROMVault2.Properties; + +namespace ROMVault2 +{ + public partial class FrmProgressWindowFix : Form + { + + private bool _bDone; + private readonly Form _parentForm; + + private readonly Queue _rowQueue; + + public FrmProgressWindowFix(Form parentForm) + { + _rowQueue = new Queue(); + _parentForm = parentForm; + InitializeComponent(); + timer1.Interval = 100; + timer1.Enabled = true; + } + + + private void Timer1Tick(object sender, EventArgs e) + { + int rowCount = _rowQueue.Count; + if (rowCount == 0) + return; + + DataGridViewRow[] dgvr = new DataGridViewRow[rowCount]; + for (int i = 0; i < rowCount; i++) + dgvr[i] = _rowQueue.Dequeue(); + + dataGridView1.Rows.AddRange(dgvr); + int iRow = dataGridView1.Rows.Count - 1; + dataGridView1.FirstDisplayedScrollingRowIndex = iRow; + } + + + + protected override CreateParams CreateParams + { + get + { + const int CP_NOCLOSE_BUTTON = 0x200; + CreateParams mdiCp = base.CreateParams; + mdiCp.ClassStyle = mdiCp.ClassStyle | CP_NOCLOSE_BUTTON; + return mdiCp; + } + } + + + + private void FrmProgressWindowFixShown(object sender, EventArgs e) + { + bgWork.DoWork += FixFiles.PerformFixes; + bgWork.ProgressChanged += BgwProgressChanged; + bgWork.RunWorkerCompleted += BgwRunWorkerCompleted; + bgWork.RunWorkerAsync(SynchronizationContext.Current); + } + + private void BgwProgressChanged(object sender, ProgressChangedEventArgs e) + { + BgwProgressChanged(e.UserState); + } + + private void BgwProgressChanged(object e) + { + + + bgwShowFix bgwSf = e as bgwShowFix; + if (bgwSf != null) + { + DataGridViewRow dgrq = (DataGridViewRow)dataGridView1.RowTemplate.Clone(); + dgrq.CreateCells(dataGridView1, bgwSf.FixDir, bgwSf.FixZip, bgwSf.FixFile, bgwSf.Size, bgwSf.Dir, bgwSf.SourceDir, bgwSf.SourceZip, bgwSf.SourceFile); + _rowQueue.Enqueue(dgrq); + return; + + } + + bgwShowFixError bgwSFE = e as bgwShowFixError; + if (bgwSFE != null) + { + int iRow = dataGridView1.Rows.Count - 1; + dataGridView1.Rows[iRow].Cells[4].Style.BackColor = Color.Red; + dataGridView1.Rows[iRow].Cells[4].Style.ForeColor = Color.Black; + dataGridView1.Rows[iRow].Cells[4].Value = bgwSFE.FixError; + return; + } + + bgwProgress bgwProg = e as bgwProgress; + if (bgwProg != null) + { + if (bgwProg.Progress >= progressBar.Minimum && bgwProg.Progress <= progressBar.Maximum) + progressBar.Value = bgwProg.Progress; + UpdateStatusText(); + return; + } + + bgwText bgwT = e as bgwText; + if (bgwT != null) + { + label.Text = bgwT.Text; + return; + } + bgwSetRange bgwSR = e as bgwSetRange; + if (bgwSR != null) + { + progressBar.Minimum = 0; + progressBar.Maximum = bgwSR.MaxVal >= 0 ? bgwSR.MaxVal : 0; + progressBar.Value = 0; + UpdateStatusText(); + } + + + } + + private void BgwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + + cancelButton.Text = Resources.ProgressWindowFix_DoDone_Close; + cancelButton.Enabled = true; + _bDone = true; + } + + private void UpdateStatusText() + { + int range = progressBar.Maximum - progressBar.Minimum; + int percent = range > 0 ? (progressBar.Value * 100) / range : 0; + + Text = String.Format("Fixing Files - {0}% complete", percent); + } + + private void CancelButtonClick(object sender, EventArgs e) + { + if (_bDone) + Close(); + else + { + cancelButton.Enabled = false; + cancelButton.Text = Resources.ProgressWindowFix_OnClosing_Cancelling; + bgWork.CancelAsync(); + } + } + + private void DataGridView1SelectionChanged(object sender, EventArgs e) + { + dataGridView1.ClearSelection(); + } + + private void FrmProgressWindowFixResize(object sender, EventArgs e) + { + switch (WindowState) + { + case FormWindowState.Minimized: + if (_parentForm.Visible) _parentForm.Hide(); + return; + case FormWindowState.Maximized: + if (!_parentForm.Visible) _parentForm.Show(); + return; + case FormWindowState.Normal: + if (!_parentForm.Visible) _parentForm.Show(); + return; + } + } + + + + } +} diff --git a/ROMVault2/FrmProgressWindowFix.designer.cs b/ROMVault2/FrmProgressWindowFix.designer.cs new file mode 100644 index 0000000..59397e0 --- /dev/null +++ b/ROMVault2/FrmProgressWindowFix.designer.cs @@ -0,0 +1,290 @@ +namespace ROMVault2 +{ + partial class FrmProgressWindowFix + { + /// + /// 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(FrmProgressWindowFix)); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.cancelButton = new System.Windows.Forms.Button(); + this.progressBar = new System.Windows.Forms.ProgressBar(); + this.label = new System.Windows.Forms.Label(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.DatTo = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.GameTo = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.RomTo = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.FileSize = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Status = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.DatFrom = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.GameFrom = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ROMFrom = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn3 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn4 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn5 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn6 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn7 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.bgWork = new System.ComponentModel.BackgroundWorker(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.cancelButton); + this.splitContainer1.Panel1.Controls.Add(this.progressBar); + this.splitContainer1.Panel1.Controls.Add(this.label); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.dataGridView1); + this.splitContainer1.Size = new System.Drawing.Size(1027, 500); + this.splitContainer1.SplitterDistance = 64; + this.splitContainer1.TabIndex = 7; + // + // cancelButton + // + this.cancelButton.Location = new System.Drawing.Point(759, 32); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 9; + this.cancelButton.Text = "Cancel"; + this.cancelButton.Click += new System.EventHandler(this.CancelButtonClick); + // + // progressBar + // + this.progressBar.Location = new System.Drawing.Point(12, 32); + this.progressBar.Name = "progressBar"; + this.progressBar.Size = new System.Drawing.Size(741, 23); + this.progressBar.TabIndex = 8; + // + // label + // + this.label.Location = new System.Drawing.Point(13, 9); + this.label.Name = "label"; + this.label.Size = new System.Drawing.Size(480, 20); + this.label.TabIndex = 4; + this.label.Text = "Starting operation..."; + // + // dataGridView1 + // + this.dataGridView1.AllowUserToAddRows = false; + this.dataGridView1.AllowUserToDeleteRows = false; + this.dataGridView1.AllowUserToResizeRows = false; + this.dataGridView1.BackgroundColor = System.Drawing.Color.White; + this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.DatTo, + this.GameTo, + this.RomTo, + this.FileSize, + this.Status, + this.DatFrom, + this.GameFrom, + this.ROMFrom}); + this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.dataGridView1.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.dataGridView1.Location = new System.Drawing.Point(0, 0); + this.dataGridView1.MultiSelect = false; + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.ReadOnly = true; + this.dataGridView1.RowHeadersVisible = false; + this.dataGridView1.RowTemplate.Height = 17; + this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dataGridView1.ShowCellErrors = false; + this.dataGridView1.ShowCellToolTips = false; + this.dataGridView1.ShowEditingIcon = false; + this.dataGridView1.ShowRowErrors = false; + this.dataGridView1.Size = new System.Drawing.Size(1027, 432); + this.dataGridView1.TabIndex = 7; + this.dataGridView1.SelectionChanged += new System.EventHandler(this.DataGridView1SelectionChanged); + // + // DatTo + // + this.DatTo.HeaderText = "Directory (Fixing)"; + this.DatTo.Name = "DatTo"; + this.DatTo.ReadOnly = true; + this.DatTo.Width = 250; + // + // GameTo + // + this.GameTo.HeaderText = "Archive (Fixing)"; + this.GameTo.Name = "GameTo"; + this.GameTo.ReadOnly = true; + this.GameTo.Width = 200; + // + // RomTo + // + this.RomTo.HeaderText = "File (Fixing)"; + this.RomTo.Name = "RomTo"; + this.RomTo.ReadOnly = true; + this.RomTo.Width = 200; + // + // FileSize + // + this.FileSize.HeaderText = "Size (Fixing)"; + this.FileSize.Name = "FileSize"; + this.FileSize.ReadOnly = true; + // + // Status + // + this.Status.HeaderText = "Status"; + this.Status.Name = "Status"; + this.Status.ReadOnly = true; + // + // DatFrom + // + this.DatFrom.HeaderText = "Directory (From)"; + this.DatFrom.Name = "DatFrom"; + this.DatFrom.ReadOnly = true; + this.DatFrom.Width = 150; + // + // GameFrom + // + this.GameFrom.HeaderText = "Archive (From)"; + this.GameFrom.Name = "GameFrom"; + this.GameFrom.ReadOnly = true; + // + // ROMFrom + // + this.ROMFrom.HeaderText = "File (From)"; + this.ROMFrom.Name = "ROMFrom"; + this.ROMFrom.ReadOnly = true; + // + // dataGridViewTextBoxColumn1 + // + this.dataGridViewTextBoxColumn1.HeaderText = "Dat (Fixing)"; + this.dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1"; + this.dataGridViewTextBoxColumn1.ReadOnly = true; + this.dataGridViewTextBoxColumn1.Width = 150; + // + // dataGridViewTextBoxColumn2 + // + this.dataGridViewTextBoxColumn2.HeaderText = "Game (Fixing)"; + this.dataGridViewTextBoxColumn2.Name = "dataGridViewTextBoxColumn2"; + this.dataGridViewTextBoxColumn2.ReadOnly = true; + // + // dataGridViewTextBoxColumn3 + // + this.dataGridViewTextBoxColumn3.HeaderText = "ROM (Fixing)"; + this.dataGridViewTextBoxColumn3.Name = "dataGridViewTextBoxColumn3"; + this.dataGridViewTextBoxColumn3.ReadOnly = true; + // + // dataGridViewTextBoxColumn4 + // + this.dataGridViewTextBoxColumn4.HeaderText = "Status"; + this.dataGridViewTextBoxColumn4.Name = "dataGridViewTextBoxColumn4"; + this.dataGridViewTextBoxColumn4.ReadOnly = true; + // + // dataGridViewTextBoxColumn5 + // + this.dataGridViewTextBoxColumn5.HeaderText = "Dat (From)"; + this.dataGridViewTextBoxColumn5.Name = "dataGridViewTextBoxColumn5"; + this.dataGridViewTextBoxColumn5.ReadOnly = true; + this.dataGridViewTextBoxColumn5.Width = 150; + // + // dataGridViewTextBoxColumn6 + // + this.dataGridViewTextBoxColumn6.HeaderText = "Game (From)"; + this.dataGridViewTextBoxColumn6.Name = "dataGridViewTextBoxColumn6"; + this.dataGridViewTextBoxColumn6.ReadOnly = true; + // + // dataGridViewTextBoxColumn7 + // + this.dataGridViewTextBoxColumn7.HeaderText = "Rom (From)"; + this.dataGridViewTextBoxColumn7.Name = "dataGridViewTextBoxColumn7"; + this.dataGridViewTextBoxColumn7.ReadOnly = true; + // + // bgWork + // + this.bgWork.WorkerReportsProgress = true; + this.bgWork.WorkerSupportsCancellation = true; + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.Timer1Tick); + // + // FrmProgressWindowFix + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(1027, 500); + this.Controls.Add(this.splitContainer1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmProgressWindowFix"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Fixing Files"; + this.Shown += new System.EventHandler(this.FrmProgressWindowFixShown); + this.Resize += new System.EventHandler(this.FrmProgressWindowFixResize); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn2; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn3; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn4; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn5; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn6; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn7; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Label label; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.ProgressBar progressBar; + private System.ComponentModel.BackgroundWorker bgWork; + private System.Windows.Forms.DataGridViewTextBoxColumn DatTo; + private System.Windows.Forms.DataGridViewTextBoxColumn GameTo; + private System.Windows.Forms.DataGridViewTextBoxColumn RomTo; + private System.Windows.Forms.DataGridViewTextBoxColumn Status; + private System.Windows.Forms.DataGridViewTextBoxColumn DatFrom; + private System.Windows.Forms.DataGridViewTextBoxColumn GameFrom; + private System.Windows.Forms.DataGridViewTextBoxColumn ROMFrom; + private System.Windows.Forms.DataGridViewTextBoxColumn FileSize; + private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.Timer timer1; + } +} \ No newline at end of file diff --git a/ROMVault2/FrmProgressWindowFix.resx b/ROMVault2/FrmProgressWindowFix.resx new file mode 100644 index 0000000..1c6a769 --- /dev/null +++ b/ROMVault2/FrmProgressWindowFix.resx @@ -0,0 +1,1817 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + 17, 17 + + + 112, 17 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA7e3tvevr6//m5ub/4ODg/9nZ2f/Q0ND/wsLC/66urv+ampr/nJyc/6Kiov+tra3/ubm5/8XF + xf/R0dH/2trapenp6b3l5eX/3t7e/9bW1v/Kysr/ubm5/5+fn/92dnb/ampq/21tbf97e3v/jIyM/56e + nv+wsLD/wsLC/8/Pz6Xl5eW939/f/9bW1v/Jycn/uLi4/5ycnP9ubm7/YWFh/2pqav8tLS3/RERE/2lp + af+AgID/mJiY/7Kysv/FxcWl39/fvdjY2P/Ly8v/ubm5/56env9ycnL/VlZW/2RkZP92dnb/IyMj/yAg + IP8qKir/VlZW/319ff+ioqL/v7+/pdnZ2b3Nzc3/u7u7/6Kiov94eHj/U1NT/15eXv99fX3/IiIi/yYm + Jv8lJSX/IyMj/yAgIP8+Pj7/hoaG/76+vqXQ0NC9wMDA/6ampv+AgID/U1NT/1tbW/+BgYH/ISEh/yUl + Jf8lJSX/JiYm/yYmJv8lJSX/IiIi/2BgYP/Dw8OlxsbGva6urv+Hh4f/VlZW/1paWv+BgYH/JCQk/yUl + Jf8kJCT/JSUl/yUlJf8mJib/JiYm/yQkJP91dXX/zc3Npby8vL2Wlpb/XV1d/1tbW/+AgID/JiYm/zs7 + O/9ubm7/YWFh/ykpKf8kJCT/JSUl/yUlJf9ZWVn/xcXF/9XV1aW4uLi9dXV1/2JiYv9/f3//Kysr/0BA + QP/FxcX/zMzM/8vLy/+hoaH/JCQk/yQkJP9NTU3/v7+//9LS0v/c3NylvLy8vXJycv9/f3//NjY2/yMj + I/9lZWX/zc3N/83Nzf/MzMz/ycnJ/ykpKf9DQ0P/uLi4/9DQ0P/c3Nz/4+PjpcDAwL1/f3//QkJC/yQi + Iv8jIyP/Li4u/6ioqP/MzMz/ysrK/3h4eP88PDz/s7Oz/8/Pz//b29v/4+Pj/+jo6KXR0dG9bm5u/yQi + Iv9hJRr/SCQd/0QkHv8yJCH/Ozs7/zExMf82Njb/r6+v/9HR0f/b29v/4+Pj/+jo6P/s7Oyl29vbvX9/ + f/8lJSX/PiMe/1okGv9dJBr/VSQc/zokIP8yMjL/rq6u/9XV1f/e3t7/5OTk/+np6f/t7e3/8PDwpeXl + 5b3f39//t7e3/2tra/8lJSX/RyMd/1QlHP8vLi7/ra2t/93d3f/j4+P/6Ojo/+vr6//u7u7/8fHx//Pz + 86Xs7Oy96enp/+bm5v/i4uL/n5+f/zY2Nv9JSUn/q6ur/+bm5v/p6en/7Ozs/+7u7v/w8PD/8vLy//T0 + 9P/19fWl8fHxvfDw8P/u7u7/7Ozs/+rq6v/g4OD/39/f/+zs7P/u7u7/7+/v//Hx8f/y8vL/9PT0//X1 + 9f/29vb/9/f3pQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA7+/vee7u + 7v/t7e3/6+vr/+np6f/n5+f/5OTk/+Hh4f/e3t7/29vb/9fX1//T09P/zc3N/8XFxf++vr7/uLi4/7Cw + sP+rq6v/qKio/6ioqP+rq6v/rq6u/7Kysv+4uLj/vb29/8LCwv/Hx8f/zMzM/9HR0f/X19f/3Nzc/9/f + 303t7e157Ozs/+rq6v/o6Oj/5ubm/+Pj4//g4OD/3Nzc/9jY2P/U1NT/z8/P/8jIyP/AwMD/tra2/6qq + qv+YmJj/goKC/42Njf+NjY3/kZGR/5aWlv+bm5v/oqKi/6qqqv+wsLD/tra2/729vf/Dw8P/ysrK/9HR + 0f/X19f/29vbTevr63nq6ur/6Ojo/+Xl5f/i4uL/3t7e/9vb2//W1tb/0tLS/8zMzP/ExMT/u7u7/7Gx + sf+jo6P/kJCQ/3Z2dv9mZmb/c3Nz/3R0dP96enr/gICA/4iIiP+RkZH/mZmZ/6Ghof+pqan/sbGx/7m5 + uf/CwsL/ysrK/9HR0f/W1tZN6enpeefn5//l5eX/4uLi/97e3v/a2tr/1dXV/9DQ0P/Kysr/wsLC/7m5 + uf+tra3/n5+f/4mJif9ra2v/aWlp/29vb/9hYWH/YWFh/2dnZ/9tbW3/dXV1/35+fv+IiIj/kpKS/5yc + nP+lpaX/r6+v/7m5uf/CwsL/y8vL/9HR0U3n5+d55eXl/+Li4v/f39//29vb/9bW1v/Q0ND/ycnJ/8LC + wv+4uLj/ra2t/52dnf+IiIj/a2tr/0tLS/9oaGj/enp6/1hYWP9ERET/Ly8v/1NTU/9kZGT/bW1t/3d3 + d/+CgoL/jY2N/5iYmP+kpKT/sLCw/7u7u//Gxsb/zMzMTeXl5Xnj4+P/39/f/9vb2//X19f/0dHR/8rK + yv/BwcH/uLi4/62trf+enp7/iYmJ/2tra/9bW1v/WFhY/3h4eP91dXX/X19f/yAgIP8iIiL/Hx8f/zk5 + Of9aWlr/Z2dn/3Jycv9+fn7/i4uL/5mZmf+np6f/tbW1/8HBwf/JyclN4uLieeDg4P/c3Nz/2NjY/9LS + 0v/Kysr/wsLC/7i4uP+tra3/n5+f/4uLi/9tbW3/Q0ND/11dXf9dXV3/aWlp/5WVlf+QkJD/IiIi/yEh + If8eHh7/Hh4e/yQkJP9HR0f/YmJi/29vb/99fX3/jIyM/52dnf+vr6//vr6+/8fHx03g4OB53d3d/9jY + 2P/T09P/zMzM/8PDw/+5ubn/rq6u/6CgoP+MjIz/cnJy/19fX/9NTU3/ampq/3d3d/9TU1P/jo6O/yYm + Jv8jIyP/JiYm/yQkJP8hISH/Hh4e/x4eHv8wMDD/WFhY/21tbf99fX3/kpKS/6mpqf+8vLz/xsbGTd7e + 3nna2tr/1NTU/83Nzf/ExMT/u7u7/6+vr/+hoaH/j4+P/3V1df9HR0f/Wlpa/1ZWVv9paWn/fn5+/5ub + m/8dHR3/IyMj/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x4eHv8hISH/QEBA/2xsbP+IiIj/o6Oj/7u7 + u//Hx8dN2traedXV1f/Ozs7/xsbG/7y8vP+xsbH/pKSk/5KSkv97e3v/ZGRk/0pKSv9gYGD/dXV1/0JC + Qv+qqqr/MjIy/yMjI/8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/ISEh/x8fH/8fHx//LS0t/1JS + Uv+cnJz/u7u7/8fHx03W1tZ50dHR/8nJyf+/v7//s7Oz/6ampv+UlJT/fX19/01NTf9ZWVn/WFhY/2ho + aP9ubm7/mJiY/xsbG/8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yEh + If8gICD/KSkp/5ycnP++vr7/ycnJTdLS0nnMzMz/wsLC/7a2tv+pqan/l5eX/4KCgv9sbGz/SkpK/1tb + W/91dXX/Nzc3/7W1tf9HR0f/IiIi/yQkJP8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8jIyP/mJiY/8XFxf/MzMxNzs7OecfHx/+7u7v/ra2t/5ubm/+Ghob/WVlZ/1lZ + Wf9dXV3/ZWVl/2hoaP+Kior/KSkp/yEhIf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/zIyMv+goKD/ysrK/9DQ0E3Kysp5wcHB/7Kysv+goKD/ioqK/3Jy + cv9PT0//V1dX/3V1df8zMzP/q6ur/2ZmZv8gICD/JCQk/yUlJf8lJSX/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8hISH/Q0ND/76+vv/Nzc3/09PTTcXFxXm7u7v/qKio/5GR + kf9mZmb/Xl5e/2JiYv9eXl7/bGxs/3d3d/82Njb/Hx8f/yQkJP8kJCT/JSUl/ycnJ/8lJSX/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/Kioq/1hYWP+3t7f/ycnJ/9HR0f/X19dNwsLCebW1 + tf+enp7/gYGB/1hYWP9WVlb/dXV1/zg4OP+UlJT/ioqK/x8fH/8kJCT/LCws/3l5ef+tra3/v7+//7S0 + tP+IiIj/OTk5/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yQkJP8xMTH/sbGx/8bGxv/Ozs7/1tbW/9ra + 2k3BwcF5srKy/4iIiP9xcXH/bGxs/1tbW/92dnb/YWFh/05OTv8eHh7/IyMj/zMzM/+wsLD/zMzM/8vL + y//Ly8v/zMzM/8vLy//BwcH/SkpK/yMjI/8kJCT/JCQk/yUlJf8oKCj/QkJC/6qqqv/ExMT/zMzM/9PT + 0//Z2dn/3d3dTcLCwnm0tLT/enp6/2FhYf97e3v/SEhI/319ff+np6f/ISEh/yEhIf8jIyP/iIiI/8zM + zP/MzMz/zc3N/83Nzf/MzMz/y8vL/8rKyv+vr6//JSUl/yQkJP8kJCT/IyMj/yUlJf+lpaX/w8PD/8vL + y//R0dH/19fX/93d3f/g4OBNw8PDebm5uf+JiYn/Y2Nj/4GBgf9WVlb/Y2Nj/ykpKf8hISH/IyMj/yQk + JP+wsLD/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8zMzP8zMzP/JCQk/yUlJf8zMzP/lpaW/8HB + wf/Kysr/0dHR/9fX1//c3Nz/4ODg/+Pj403FxcV5tra2/4aGhv9WVlb/bm5u/7i4uP8rKyv/ISEh/yQk + JP8kJCT/JCQk/52dnf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/Ly8v/wcHB/yoqKv8jIyP/ICAg/5aW + lv/AwMD/ycnJ/9DQ0P/X19f/3Nzc/+Dg4P/k5OT/5ubmTcnJyXm2trb/jY2N/1JSUv9zc3P/PDw8/yEh + If8jIyP/IyMj/yMjI/8kJCT/T09P/8nJyf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vLy/95eXn/JCQk/ygo + KP+Dg4P/wMDA/8jIyP/Q0ND/1tbW/9vb2//g4OD/4+Pj/+bm5v/o6OhNzc3NecDAwP9nZ2f/tLS0/zw8 + PP8eHh7/IiIi/ysiIf8iIiL/IyMj/yMjI/8jIyP/VlZW/7e3t//MzMz/zc3N/8zMzP/ExMT/d3d3/yYm + Jv8dHR3/h4eH/8HBwf/Jycn/0NDQ/9bW1v/b29v/39/f/+Pj4//m5ub/6enp/+vr603S0tJ5zMzM/6mp + qf9VVVX/ICAg/yMjI/84Ix//ayYa/yIiIf8qIiH/NCMg/zQjIP8jIyP/JiYm/0hISP9dXV3/UVFR/y0t + Lf8jIyP/IiIi/2tra//BwcH/ysrK/9HR0f/W1tb/29vb/9/f3//j4+P/5ubm/+np6f/r6+v/7e3tTdfX + 13nS0tL/kpKS/ygoKP8jIyP/KyIg/3omF/9mJRn/cyYY/14lGv9TJRz/UyUc/1ckG/8oIyH/IyMj/yMj + I/8jIyP/IyMj/x0dHf93d3f/xMTE/8vLy//S0tL/19fX/9vb2//f39//4+Pj/+bm5v/o6Oj/6+vr/+3t + 7f/u7u5N29vbedfX1/+FhYX/IyMj/yMjI/8jISH/TyQc/2QkGP9yJhj/WyQa/2slGf86Ix7/XCUb/2Ml + G/8+Ix//JSMi/yMjI/8hISH/VVVV/8bGxv/Ozs7/1NTU/9nZ2f/d3d3/4ODg/+Pj4//m5ub/6Ojo/+vr + 6//t7e3/7+/v//Dw8E3g4OB53d3d/9PT0/9/f3//LCws/yIiIv8hISH/ISEh/0UjHf9XIxr/bCUY/2El + Gv8/Ix7/VSQc/10mG/8nIyL/Hx8f/2VlZf/Kysr/09PT/9fX1//b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/r6+v/7e3t/+/v7//w8PD/8fHxTeTk5Hni4uL/3t7e/9vb2//Dw8P/YGBg/yQkJP8iIiL/ISEh/yEh + If9fJRr/ZSUZ/1IkHP9eJRv/JSMi/yIiIv9AQED/ysrK/9jY2P/b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/q6ur/7Ozs/+7u7v/v7+//8fHx//Ly8v/z8/NN6Ojoeebm5v/k5OT/4eHh/9/f3//c3Nz/v7+//6io + qP8vLy//IiIi/yEhIf81IyD/ZiYa/zskIP8gICD/VFRU/83Nzf/d3d3/4ODg/+Pj4//l5eX/5+fn/+np + 6f/r6+v/7Ozs/+3t7f/v7+//8PDw//Hx8f/y8vL/8/Pz//T09E3s7Ox56+vr/+np6f/n5+f/5OTk/+Li + 4v/h4eH/39/f/5aWlv8wMDD/IiIi/yIiIv8jIyP/IiIi/ywsLP/Gxsb/4uLi/+Tk5P/m5ub/6Ojo/+np + 6f/r6+v/7Ozs/+7u7v/v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9fX1Te7u7nnt7e3/7Ozs/+vr + 6//p6en/6Ojo/+bm5v/k5OT/4+Pj/9PT0/9vb2//JiYm/y0tLf+ysrL/1NTU/+bm5v/n5+f/6enp/+rq + 6v/s7Oz/7e3t/+7u7v/v7+//8PDw//Hx8f/y8vL/8vLy//Pz8//09PT/9fX1//X19f/29vZN8fHxefDw + 8P/v7+//7u7u/+3t7f/s7Oz/6urq/+np6f/o6Oj/6Ojo/+jo6P++vr7/urq6/+np6f/q6ur/6+vr/+vr + 6//t7e3/7u7u/+/v7//v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/29vb/9vb2//f3 + 903z8/N58vLy//Hx8f/w8PD/8PDw/+/v7//u7u7/7e3t/+3t7f/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vL/8/Pz//T09P/09PT/9fX1//X19f/29vb/9vb2//f3 + 9//39/f/9/f3TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAPDw + 8Dfv7+//7u7u/+3t7f/s7Oz/6+vr/+rq6v/p6en/5+fn/+Xl5f/j4+P/4eHh/9/f3//d3d3/29vb/9nZ + 2f/X19f/1NTU/9DQ0P/Ly8v/x8fH/8LCwv++vr7/urq6/7a2tv+xsbH/rq6u/62trf+srKz/rKys/62t + rf+vr6//sbGx/7S0tP+3t7f/u7u7/76+vv/BwcH/xcXF/8jIyP/Ly8v/z8/P/9LS0v/V1dX/2NjY/9zc + 3P/f39/x////Ae7u7jfu7u7/7e3t/+zs7P/r6+v/6enp/+jo6P/m5ub/5eXl/+Pj4//g4OD/3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zc3N/8jIyP/CwsL/vLy8/7e3t/+xsbH/qqqq/6Ojo/+enp7/nJyc/5ub + m/+cnJz/np6e/6CgoP+jo6P/pqam/6qqqv+urq7/srKy/7a2tv+6urr/vr6+/8HBwf/FxcX/ycnJ/83N + zf/R0dH/1dXV/9nZ2f/c3Nzx////Ae3t7Tfs7Oz/6+vr/+rq6v/p6en/6Ojo/+bm5v/k5OT/4uLi/+Dg + 4P/d3d3/29vb/9jY2P/V1dX/0tLS/87Ozv/Kysr/xMTE/7+/v/+5ubn/sbGx/6ioqP+fn5//ioqK/21t + bf+Ghob/iIiI/4iIiP+Li4v/jo6O/5GRkf+VlZX/mZmZ/56env+kpKT/qKio/62trf+xsbH/tbW1/7q6 + uv++vr7/w8PD/8jIyP/MzMz/0dHR/9XV1f/Z2dnx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Pj + 4//h4eH/39/f/9zc3P/Z2dn/19fX/9TU1P/Q0ND/zMzM/8fHx//CwsL/vLy8/7a2tv+urq7/pKSk/5iY + mP+MjIz/cHBw/2JiYv9zc3P/dnZ2/3d3d/96enr/fn5+/4ODg/+Hh4f/jIyM/5KSkv+YmJj/nZ2d/6Oj + o/+oqKj/ra2t/7Kysv+3t7f/vb29/8LCwv/Hx8f/zMzM/9HR0f/W1tbx////Aerq6jfp6en/6Ojo/+fn + 5//l5eX/4+Pj/+Hh4f/e3t7/3Nzc/9nZ2f/W1tb/09PT/8/Pz//Ly8v/xsbG/8DAwP+6urr/s7Oz/6ur + q/+hoaH/lJSU/4WFhf94eHj/ampq/2hoaP9oaGj/ZmZm/2hoaP9tbW3/cXFx/3V1df96enr/f39//4aG + hv+MjIz/kpKS/5iYmP+enp7/pKSk/6qqqv+wsLD/tra2/7y8vP/CwsL/x8fH/83Nzf/S0tLx////Aenp + 6Tfo6Oj/5ubm/+Xl5f/j4+P/4eHh/9/f3//c3Nz/2dnZ/9bW1v/S0tL/zs7O/8rKyv/FxcX/v7+//7i4 + uP+xsbH/qamp/5+fn/+RkZH/f39//2BgYP9nZ2f/aGho/29vb/9vb2//W1tb/11dXf9hYWH/ZWVl/2lp + af9ubm7/c3Nz/3p6ev+AgID/h4eH/42Njf+UlJT/m5ub/6Ghof+oqKj/r6+v/7W1tf+8vLz/wsLC/8nJ + yf/Ozs7x////Aejo6Dfn5+f/5eXl/+Pj4//h4eH/39/f/9zc3P/Z2dn/1tbW/9LS0v/Ozs7/ycnJ/8TE + xP+/v7//uLi4/7Gxsf+oqKj/nZ2d/5CQkP+AgID/ZmZm/0pKSv9XV1f/a2tr/3R0dP9xcXH/UlJS/1NT + U/84ODj/PT09/1tbW/9jY2P/aGho/25ubv91dXX/fHx8/4ODg/+Kior/kZGR/5mZmf+goKD/qKio/6+v + r/+3t7f/vr6+/8XFxf/Ly8vx////Aefn5zfm5ub/4+Pj/+Hh4f/f39//3Nzc/9ra2v/W1tb/09PT/87O + zv/Jycn/xMTE/76+vv+4uLj/sLCw/6ioqP+enp7/kJCQ/4GBgf9vb2//Xl5e/01NTf9VVVX/cXFx/42N + jf9xcXH/S0tL/zExMf8gICD/Hh4e/ygoKP9JSUn/XV1d/2NjY/9paWn/cXFx/3h4eP+AgID/iIiI/5CQ + kP+YmJj/oKCg/6mpqf+ysrL/urq6/8LCwv/Jycnx////AeXl5Tfk5OT/4uLi/9/f3//d3d3/2tra/9fX + 1//T09P/z8/P/8rKyv/FxcX/v7+//7i4uP+xsbH/qKio/5+fn/+RkZH/gYGB/2ZmZv9eXl7/WVlZ/2Nj + Y/9aWlr/i4uL/2tra/93d3f/VFRU/x0dHf8kJCT/Hh4e/x4eHv8eHh7/MjIy/1JSUv9eXl7/ZmZm/25u + bv91dXX/fn5+/4eHh/+QkJD/mZmZ/6Ojo/+tra3/tra2/7+/v//Gxsbx////AePj4zfi4uL/4ODg/93d + 3f/b29v/2NjY/9TU1P/Pz8//ysrK/8XFxf+/v7//uLi4/7Gxsf+pqan/n5+f/5OTk/+CgoL/ampq/0ZG + Rv9ISEj/YWFh/2VlZf9dXV3/cHBw/3Jycv/CwsL/jIyM/yQkJP8fHx//Hx8f/x4eHv8eHh7/HR0d/yEh + If8+Pj7/Wlpa/2NjY/9ra2v/dHR0/319ff+Hh4f/kZGR/5ycnP+np6f/s7Oz/7y8vP/FxcXx////AeLi + 4jfg4OD/3t7e/9vb2//Y2Nj/1dXV/9HR0f/Ly8v/xsbG/8DAwP+5ubn/srKy/6mpqf+fn5//kpKS/4SE + hP9zc3P/YWFh/0RERP9FRUX/ampq/3x8fP9WVlb/Xl5e/7e3t/+zs7P/KCgo/yIiIv8kJCT/JiYm/yIi + Iv8fHx//Hh4e/x4eHv8eHh7/KSkp/0xMTP9hYWH/ampq/3Nzc/99fX3/iIiI/5SUlP+ioqL/r6+v/7u7 + u//ExMTx////AeDg4Dff39//3Nzc/9nZ2f/V1dX/0dHR/8zMzP/Hx8f/wcHB/7q6uv+ysrL/qqqq/6Gh + of+Tk5P/hISE/3BwcP9lZWX/W1tb/15eXv9GRkb/fHx8/39/f/9hYWH/RERE/4iIiP8uLi7/IiIi/yMj + I/8lJSX/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x8fH/83Nzf/Wlpa/2dnZ/9xcXH/fX19/42N + jf+cnJz/q6ur/7m5uf/ExMTx////Ad/f3zfd3d3/2tra/9bW1v/R0dH/zc3N/8fHx//BwcH/u7u7/7Oz + s/+rq6v/oaGh/5aWlv+Hh4f/c3Nz/0pKSv9LS0v/XFxc/2ZmZv9GRkb/hISE/2JiYv+dnZ3/mpqa/xwc + HP8cHBz/IyMj/yYmJv8mJib/JSUl/yYmJv8mJib/JSUl/yMjI/8fHx//Hx8f/x4eHv8eHh7/JSUl/0VF + Rf9jY2P/dHR0/4aGhv+YmJj/qamp/7i4uP/ExMTx////Ad3d3Tfb29v/19fX/9LS0v/Ozs7/yMjI/8LC + wv+8vLz/tLS0/6ysrP+jo6P/l5eX/4mJif94eHj/ZmZm/0hISP9DQ0P/ZWVl/3Jycv89PT3/V1dX/5aW + lv/a2tr/Pj4+/yIiIv8kJCT/JiYm/yYmJv8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8kJCT/ISEh/x8f + H/8fHx//Hx8f/x8fH/8xMTH/YWFh/3BwcP+Li4v/paWl/7e3t//ExMTx////Advb2zfY2Nj/1NTU/8/P + z//Jycn/xMTE/729vf+1tbX/ra2t/6SkpP+ZmZn/jIyM/3t7e/9ra2v/X19f/1ZWVv9CQkL/cHBw/42N + jf9OTk7/ODg4/7S0tP9JSUn/IyMj/yIiIv8mJib/JiYm/yYmJv8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yMjI/8gICD/Hx8f/yAgIP8gICD/IiIi/zk5Of91dXX/paWl/7e3t//FxcXx////AdjY + 2DfV1dX/0NDQ/8vLy//FxcX/v7+//7e3t/+vr6//paWl/5ubm/+NjY3/fX19/1RUVP9OTk7/W1tb/2Rk + ZP8/Pz//i4uL/1xcXP+FhYX/h4eH/xsbG/8eHh7/ISEh/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IiIi/yAgIP8gICD/ICAg/yAgIP9jY2P/pqam/7q6 + uv/Gxsbx////AdXV1TfT09P/zc3N/8fHx//AwMD/ubm5/7CwsP+np6f/nJyc/4+Pj/+AgID/b29v/01N + Tf9AQED/YWFh/2xsbP83Nzf/VlZW/319ff/Y2Nj/aWlp/yEhIf8fHx//JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8lJSX/JiYm/yUlJf8lJSX/JSUl/yUlJf8gICD/ICAg/yAg + IP9YWFj/paWl/7+/v//IyMjx////AdPT0zfQ0ND/ysrK/8PDw/+7u7v/srKy/6mpqf+enp7/kZGR/4SE + hP90dHT/ZWVl/1RUVP8/Pz//aWlp/4qKiv9LS0v/NjY2/7u7u/+BgYH/JCQk/yEhIf8kJCT/JSUl/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JCQk/yAgIP9TU1P/paWl/8PDw//Ly8vx////AdDQ0DfNzc3/xsbG/76+vv+2trb/rKys/6Gh + of+UlJT/hoaG/2VlZf9VVVX/XV1d/2NjY/89PT3/hISE/2tra/9ubm7/YmJi/zY2Nv8jIyP/IiIi/yYm + Jv8lJSX/JCQk/yUlJf8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/yYmJv8lJSX/JiYm/yYmJv9sbGz/qKio/8fHx//Ozs7x////Ac3NzTfJycn/wsLC/7m5 + uf+vr6//pKSk/5eXl/+IiIj/dnZ2/1RUVP9BQUH/Xl5e/2pqav83Nzf/YWFh/2pqav+5ubn/pqam/yAg + IP8bGxv/IyMj/yQkJP8kJCT/JSUl/yUlJf8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JiYm/yUl + Jf8mJib/JiYm/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/xoaGv9iYmL/u7u7/8rKyv/Q0NDx////AcvL + yzfGxsb/vr6+/7Ozs/+np6f/mpqa/4uLi/96enr/bGxs/1hYWP8+Pj7/ZGRk/35+fv9UVFT/NjY2/6en + p/+4uLj/Jycn/yEhIf8iIiL/JCQk/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/HBwc/zU1Nf+vr6//xsbG/83N + zf/S0tLx////AcjIyDfDw8P/ubm5/62trf+goKD/kJCQ/3Z2dv9cXFz/Y2Nj/2NjY/9GRkb/cHBw/4GB + gf9dXV3/R0dH/0FBQf8wMDD/ICAg/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8lJSX/JiYm/yUlJf81NTX/Pz8//6mp + qf/ExMT/ysrK/8/Pz//V1dXx////AcbGxjfAwMD/tbW1/6ampv+Xl5f/g4OD/2JiYv9FRUX/X19f/2pq + av9BQUH/bm5u/1xcXP+VlZX/zc3N/yIiIv8YGBj/IyMj/yQkJP8kJCT/KCgo/0VFRf9jY2P/a2tr/11d + Xf89PT3/JiYm/yMjI/8jIyP/JCQk/yQkJP8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yAg + IP9HR0f/q6ur/8HBwf/Hx8f/zc3N/9LS0v/X19fx////AcTExDe+vr7/sbGx/6Kiov+Pj4//enp6/2Nj + Y/9AQED/Y2Nj/3Z2dv9eXl7/MTEx/4qKiv/Z2dn/Ozs7/yEhIf8kJCT/JCQk/yQkJP9kZGT/srKy/8rK + yv/Ly8v/zMzM/8zMzP/Kysr/qKio/1NTU/8kJCT/JCQk/yQkJP8kJCT/JSUl/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/IyMj/x0dHf+YmJj/wMDA/8bGxv/Ly8v/0NDQ/9XV1f/a2trx////AcTExDe9vb3/rq6u/5ub + m/92dnb/eXl5/2xsbP9VVVX/Y2Nj/5GRkf9XV1f/Nzc3/09PT/9OTk7/ICAg/yIiIv8kJCT/KSkp/4+P + j//MzMz/zMzM/8vLy//Ly8v/zMzM/8zMzP/MzMz/y8vL/8nJyf9/f3//JCQk/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8rKyv/ISEh/5GRkf+/v7//xcXF/8rKyv/Pz8//09PT/9jY2P/c3Nzx////AcTE + xDe9vb3/rq6u/4qKiv9SUlL/cHBw/3Jycv9UVFT/b29v/1paWv9+fn7/y8vL/y4uLv8bGxv/Hx8f/yMj + I/8kJCT/d3d3/8rKyv/Ly8v/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/8rKyv/Jycn/Y2Nj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8/Pz//mpqa/729vf/Dw8P/ycnJ/83Nzf/S0tL/1tbW/9ra + 2v/e3t7x////AcTExDe/v7//sbGx/42Njf9MTEz/cHBw/3p6ev9qamr/OTk5/3V1df/Q0ND/bW1t/yAg + IP8fHx//IyMj/yQkJP8xMTH/wMDA/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8rK + yv/Ly8v/srKy/ygoKP8kJCT/JCQk/yQkJP8kJCT/IiIi/xMTE/95eXn/u7u7/8PDw//IyMj/zc3N/9HR + 0f/W1tb/2dnZ/9zc3P/g4ODx////AcXFxTfAwMD/tbW1/5KSkv9qamr/ZWVl/5KSkv9lZWX/Ojo6/2ho + aP98fHz/ICAg/x8fH/8jIyP/JCQk/yQkJP9NTU3/zc3N/83Nzf/MzMz/zc3N/83Nzf/Nzc3/zc3N/83N + zf/MzMz/y8vL/8vLy//MzMz/y8vL/zg4OP8kJCT/JCQk/yQkJP8mJib/FRUV/29vb/+4uLj/wcHB/8fH + x//Nzc3/0dHR/9XV1f/Z2dn/3Nzc/9/f3//i4uLx////AcbGxjfBwcH/t7e3/4uLi/9vb2//aGho/29v + b/9paWn/srKy/zw8PP8jIyP/ICAg/yQkJP8jIyP/JCQk/yMjI/9MTEz/zMzM/8zMzP/MzMz/zMzM/83N + zf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/y8vL/zs7O/8jIyP/JCQk/yQkJP85OTn/gICA/7m5 + uf/AwMD/xsbG/8zMzP/R0dH/1dXV/9jY2P/b29v/39/f/+Hh4f/k5OTx////AcfHxzfDw8P/r6+v/4WF + hf99fX3/Pj4+/2VlZf+xsbH/qamp/yAgIP8fHx//JCQk/yQkJP8jIyP/JCQk/yQkJP8xMTH/wMDA/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/tra2/ykpKf8jIyP/IyMj/xIS + Ev9dXV3/tbW1/8DAwP/Gxsb/zMzM/9DQ0P/V1dX/2NjY/9zc3P/f39//4eHh/+Tk5P/m5ubx////AcnJ + yTfGxsb/rq6u/5CQkP+AgID/ODg4/3p6ev+tra3/JSUl/yAgIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/fn5+/83Nzf/MzMz/zc3N/83Nzf/MzMz/zc3N/83Nzf/MzMz/zMzM/8vLy//Kysr/bm5u/yQk + JP8kJCT/FhYW/01NTf+ysrL/wMDA/8bGxv/Ly8v/0NDQ/9TU1P/Y2Nj/29vb/9/f3//h4eH/4+Pj/+Xl + 5f/n5+fx////AczMzDfJycn/tLS0/4mJif9ZWVn/kZGR/05OTv8uLi7/Hx8f/yEhIf8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/Kysr/5iYmP/MzMz/zMzM/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8vL + y/+QkJD/Jycn/yMjI/81NTX/ZGRk/7S0tP/BwcH/xsbG/8vLy//Q0ND/1NTU/9jY2P/b29v/3t7e/+Hh + 4f/j4+P/5eXl/+fn5//p6enx////Ac/PzzfMzMz/vb29/11dXf+Ojo7/zs7O/zExMf8cHBz/ISEh/yIi + Iv8iIiL/NSIf/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/ygoKP9xcXH/vb29/8zMzP/Nzc3/zc3N/83N + zf/MzMz/ubm5/2pqav8nJyf/IyMj/xkZGf88PDz/ra2t/8HBwf/Gxsb/y8vL/9DQ0P/U1NT/2NjY/9vb + 2//e3t7/4ODg/+Pj4//l5eX/5+fn/+np6f/q6urx////AdLS0jfPz8//ysrK/62trf/Nzc3/OTk5/x8f + H/8hISH/IyMj/yIiIv9ZJBv/dCcZ/yIiIf8iIiL/IyMj/yMjI/8oIiH/IyIi/yMjI/8jIyP/Kysr/1NT + U/9vb2//fHx8/29vb/9OTk7/Kioq/yMjI/8jIyP/Gxsb/yoqKv+oqKj/wsLC/8fHx//MzMz/0NDQ/9TU + 1P/Y2Nj/29vb/97e3v/g4OD/4uLi/+Xl5f/n5+f/6enp/+rq6v/s7Ozx////AdXV1TfT09P/zs7O/7e3 + t/9CQkL/IiIi/yIiIv8kJCT/IiIi/00jHP+oKhP/SiMc/0MiHP9xJhj/WiQa/1wlG/9+KBj/LSMh/zEj + IP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yMjI/8vLy//TExM/6mpqf/Dw8P/yMjI/83N + zf/R0dH/1dXV/9jY2P/b29v/3t7e/+Dg4P/j4+P/5eXl/+fn5//o6Oj/6urq/+zs7P/t7e3x////AdnZ + 2TfW1tb/0tLS/7y8vP8zMzP/IyMj/yMjI/8iIiL/NyIe/50pFP8tIR//bSYZ/4knFv85Ix//TyQc/y4i + If9gJhv/XiUb/3ImGP9BIx7/KCMh/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/x4eHv8lJSX/o6Oj/8XF + xf/Kysr/zs7O/9LS0v/W1tb/2dnZ/9zc3P/e3t7/4ODg/+Pj4//l5eX/5+fn/+jo6P/q6ur/6+vr/+3t + 7f/u7u7x////Adzc3DfZ2dn/1dXV/7Gxsf8lJSX/IyMj/yMjI/8iIiL/JCEh/1gkG/97Jhb/aCQX/34n + F/95Jhf/aiUZ/3wmF/88Ix7/UCQc/20mGf9oJhr/bSYZ/zIjIP8iIiL/IyMj/yMjI/8jIyP/ISEh/xkZ + Gf+YmJj/yMjI/8zMzP/Q0ND/1NTU/9fX1//a2tr/3d3d/9/f3//h4eH/4+Pj/+Xl5f/n5+f/6Ojo/+rq + 6v/r6+v/7e3t/+7u7v/v7+/x////Ad/f3zfd3d3/2dnZ/8fHx/9OTk7/JCQk/yMjI/8iIiL/IiIi/yEh + If8pISD/QSMd/0QjHf9pJRn/ISAg/3QlF/9DIx3/WCQb/ywiIP84Ix//aiYa/2UmGv9TJRz/IiIi/yIi + Iv8rKyv/Pj4+/5WVlf/Ly8v/z8/P/9LS0v/V1dX/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXl/+fn + 5//p6en/6urq/+vr6//t7e3/7u7u/+/v7//w8PDx////AeHh4Tfg4OD/3d3d/9ra2v/V1dX/k5OT/zc3 + N/8iIiL/IiIi/yIiIv8hISH/ISEh/yQhIP9oJRn/cSQX/2glGf+EJxb/PiMe/0kjHP9BIx7/YiUa/28m + Gf8kIyL/IyMj/yIiIv8cHBz/kJCQ/87Ozv/S0tL/1dXV/9jY2P/b29v/3d3d/+Dg4P/i4uL/5OTk/+Xl + 5f/n5+f/6Ojo/+np6f/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fHx////AeTk5Dfj4+P/4ODg/97e + 3v/b29v/2dnZ/8vLy/91dXX/Kioq/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/1wkGv90Jhj/QyIc/4An + F/8mIiH/ZyYa/ygjIv8jIyP/JCQk/xQUFP99fX3/0dHR/9bW1v/Y2Nj/2tra/93d3f/f39//4uLi/+Tk + 5P/l5eX/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7u7u/+/v7//w8PD/8PDw//Hx8f/y8vLx////Aefn + 5zfm5ub/4+Pj/+Hh4f/g4OD/3t7e/9zc3P/Z2dn/t7e3/1paWv9PT0//NTU1/yIiIv8hISH/ISEh/yEh + If9UJBz/iSgW/0QjHf9yJhj/VCYd/yMjIv8nJyf/Nzc3/3Z2dv/S0tL/2dnZ/9vb2//e3t7/4ODg/+Li + 4v/k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fH/8vLy//Ly + 8v/z8/Px////Aenp6Tfp6en/5+fn/+Xl5f/j4+P/4uLi/+Dg4P/e3t7/3d3d/9vb2//a2tr/ysrK/0BA + QP8iIiL/IiIi/yIiIv8iIiL/KCIh/2snGv9RJR7/IyMi/yIiIv8bGxv/eXl5/9bW1v/d3d3/39/f/+Dg + 4P/i4uL/5OTk/+bm5v/n5+f/6Ojo/+np6f/q6ur/6+vr/+zs7P/t7e3/7u7u/+/v7//w8PD/8PDw//Hx + 8f/y8vL/8/Pz//Pz8//09PTx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Tk5P/j4+P/4eHh/+Dg + 4P/f39//3t7e/5SUlP8rKyv/IiIi/yIiIv8iIiL/IiIi/yMjI/8iIiL/IyMj/xYWFv9SUlL/1dXV/+Hh + 4f/i4uL/4+Pj/+Xl5f/m5ub/5+fn/+np6f/q6ur/6+vr/+zs7P/t7e3/7e3t/+7u7v/v7+//7+/v//Dw + 8P/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/19fXx////Ae3t7Tft7e3/7Ozs/+vr6//q6ur/6enp/+fn + 5//m5ub/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/IyMj/YmJi/yQkJP8jIyP/IyMj/yMjI/8kJCT/WFhY/11d + Xf/U1NT/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw + 8P/w8PD/8fHx//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/19fXx////Ae/v7zfu7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/7CwsP9HR0f/IyMj/yMj + I/+Dg4P/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//T09P/09PT/9fX1//X19f/29vbx////AfHx + 8Tfw8PD/7+/v/+/v7//u7u7/7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/6Ojo/+jo6P/n5+f/6Ojo/+jo + 6P/f39//kZGR/4GBgf/m5ub/6enp/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Hx8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//X19f/19fX/9vb2//b2 + 9v/29vbx////AfLy8jfy8vL/8fHx//Dw8P/w8PD/7+/v/+7u7v/u7u7/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//09PT/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//f39//39/fx////AfPz8zfz8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+/v + 7//u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//b29v/29vb/9/f3//f39//39/fx////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B7+/v8e/v7//u7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5OTk/+Pj4//h4eH/4ODg/97e3v/d3d3/29vb/9ra + 2v/Y2Nj/19fX/9XV1f/R0dH/zs7O/8vLy//Hx8f/xMTE/8HBwf++vr7/u7u7/7i4uP+1tbX/srKy/7Cw + sP+vr6//rq6u/62trf+urq7/r6+v/7CwsP+xsbH/s7Oz/7W1tf+3t7f/urq6/7y8vP+/v7//wcHB/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/0NDQ/9LS0v/V1dX/19fX/9nZ2f/c3Nz/3t7e/+Dg4Jf///8B////Ae/v + 7/Hu7u7/7e3t/+3t7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//l5eX/5OTk/+Li4v/h4eH/39/f/93d + 3f/c3Nz/2tra/9jY2P/W1tb/1dXV/9LS0v/Q0ND/zMzM/8jIyP/ExMT/wMDA/7y8vP+4uLj/tLS0/7Cw + sP+srKz/qKio/6Wlpf+kpKT/o6Oj/6Kiov+ioqL/o6Oj/6Wlpf+np6f/qKio/6qqqv+tra3/sLCw/7Oz + s/+2trb/uLi4/7u7u/++vr7/wcHB/8PDw//Gxsb/ycnJ/8vLy//Ozs7/0dHR/9TU1P/W1tb/2dnZ/9zc + 3P/e3t6X////Af///wHu7u7x7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/5+fn/+bm5v/l5eX/5OTk/+Li + 4v/g4OD/3t7e/93d3f/b29v/2dnZ/9fX1//U1NT/0tLS/9DQ0P/Nzc3/ycnJ/8bGxv/BwcH/vLy8/7e3 + t/+ysrL/rq6u/6ioqP+hoaH/k5OT/5iYmP+VlZX/lJSU/5SUlP+VlZX/lpaW/5iYmP+ampr/nJyc/5+f + n/+hoaH/paWl/6mpqf+srKz/r6+v/7Kysv+1tbX/uLi4/7u7u/++vr7/wcHB/8TExP/Hx8f/ysrK/87O + zv/R0dH/1NTU/9fX1//a2tr/3Nzcl////wH///8B7e3t8ezs7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm + 5v/k5OT/4+Pj/+Hh4f/f39//3t7e/9zc3P/a2tr/2NjY/9XV1f/T09P/0NDQ/87Ozv/Kysr/x8fH/8PD + w/+/v7//urq6/7W1tf+urq7/qKio/6Ghof+ZmZn/fX19/2RkZP94eHj/hoaG/4WFhf+Ghob/h4eH/4qK + iv+MjIz/jo6O/5GRkf+VlZX/mJiY/5ycnP+goKD/pKSk/6enp/+rq6v/rq6u/7Kysv+1tbX/uLi4/7u7 + u/+/v7//w8PD/8bGxv/Kysr/zs7O/9HR0f/U1NT/19fX/9ra2pf///8B////Aezs7PHr6+v/6urq/+np + 6f/o6Oj/5+fn/+Xl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9XV1f/S0tL/z8/P/8zM + zP/IyMj/xcXF/8HBwf+8vLz/uLi4/7Ozs/+tra3/pKSk/5ycnP+Tk5P/ioqK/2pqav9jY2P/ampq/3l5 + ef94eHj/eHh4/3p6ev99fX3/gYGB/4SEhP+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//o6Oj/6en + p/+rq6v/r6+v/7Kysv+2trb/urq6/76+vv/CwsL/xsbG/8rKyv/Nzc3/0dHR/9XV1f/X19eX////Af// + /wHq6urx6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra2v/Y2Nj/1tbW/9TU + 1P/R0dH/zs7O/8vLy//Hx8f/w8PD/7+/v/+6urr/tbW1/7CwsP+qqqr/oqKi/5iYmP+Ojo7/g4OD/3p6 + ev9oaGj/ZWVl/2dnZ/9tbW3/bGxs/21tbf9wcHD/c3Nz/3Z2dv96enr/fX19/4GBgf+FhYX/ioqK/46O + jv+Tk5P/l5eX/5ubm/+goKD/pKSk/6ioqP+srKz/sLCw/7W1tf+5ubn/vr6+/8LCwv/Gxsb/ysrK/87O + zv/S0tL/1dXVl////wH///8B6enp8ejo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra + 2v/Y2Nj/1tbW/9PT0//R0dH/zs7O/8rKyv/Hx8f/w8PD/76+vv+5ubn/s7Oz/66urv+oqKj/oKCg/5aW + lv+MjIz/gICA/3Z2dv9ubm7/Z2dn/2tra/9tbW3/Y2Nj/2JiYv9jY2P/Z2dn/2pqav9tbW3/cHBw/3Nz + c/93d3f/fHx8/4CAgP+FhYX/ioqK/46Ojv+Tk5P/mJiY/52dnf+hoaH/pqam/6urq/+vr6//tLS0/7m5 + uf+9vb3/wsLC/8bGxv/Ly8v/z8/P/9LS0pf///8B////Aejo6PHn5+f/5ubm/+Xl5f/j4+P/4uLi/+Dg + 4P/f39//3d3d/9ra2v/Y2Nj/1tbW/9PT0//Q0ND/zc3N/8rKyv/Hx8f/w8PD/76+vv+4uLj/s7Oz/62t + rf+mpqb/n5+f/5SUlP+Kior/eHh4/1dXV/9fX1//Z2dn/2lpaf9vb2//dHR0/2VlZf9aWlr/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9qamr/bm5u/3Nzc/93d3f/fHx8/4GBgf+Ghob/i4uL/5CQkP+VlZX/mpqa/5+f + n/+kpKT/qqqq/6+vr/+0tLT/ubm5/76+vv/Dw8P/yMjI/8zMzP/Pz8+X////Af///wHo6Ojx5ubm/+Xl + 5f/k5OT/4uLi/+Dg4P/f39//3d3d/9vb2//Y2Nj/1tbW/9PT0//Q0ND/zc3N/8nJyf/Gxsb/wsLC/729 + vf+4uLj/s7Oz/62trf+mpqb/nZ2d/5SUlP+IiIj/fHx8/2JiYv9MTEz/TExM/2JiYv9sbGz/cXFx/3Z2 + dv9jY2P/UlJS/1RUVP9PT0//NDQ0/0xMTP9eXl7/YmJi/2ZmZv9qamr/b29v/3Nzc/95eXn/fn5+/4OD + g/+JiYn/jo6O/5SUlP+ZmZn/np6e/6SkpP+qqqr/r6+v/7W1tf+6urr/v7+//8XFxf/Jycn/zc3Nl/// + /wH///8B5+fn8eXl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/1tbW/9PT0//Q0ND/zc3N/8nJ + yf/FxcX/wcHB/729vf+4uLj/s7Oz/62trf+mpqb/np6e/5SUlP+IiIj/fHx8/3BwcP9dXV3/TExM/0dH + R/9kZGT/b29v/319ff+CgoL/YWFh/0xMTP9JSUn/JCQk/xwcHP8gICD/NjY2/1RUVP9eXl7/YmJi/2Zm + Zv9ra2v/cHBw/3Z2dv97e3v/gYGB/4eHh/+MjIz/kpKS/5iYmP+enp7/pKSk/6urq/+xsbH/t7e3/7y8 + vP/CwsL/x8fH/8vLy5f///8B////Aebm5vHk5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9TU + 1P/R0dH/zc3N/8rKyv/Gxsb/wcHB/729vf+4uLj/s7Oz/6ysrP+mpqb/np6e/5WVlf+JiYn/fn5+/3Bw + cP9iYmL/W1tb/1dXV/9NTU3/ZWVl/3l5ef+Xl5f/ampq/2xsbP9GRkb/JSUl/xsbG/8vLy//Hh4e/x4e + Hv8kJCT/QkJC/1hYWP9eXl7/Y2Nj/2hoaP9ubm7/c3Nz/3l5ef9/f3//hYWF/4yMjP+SkpL/mJiY/5+f + n/+mpqb/ra2t/7Ozs/+6urr/v7+//8XFxf/JycmX////Af///wHk5OTx4+Pj/+Hh4f/f39//3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zs7O/8rKyv/Gxsb/wsLC/729vf+4uLj/s7Oz/62trf+mpqb/n5+f/5WV + lf+Kior/fX19/2FhYf9eXl7/VlZW/1paWv9mZmb/VlZW/21tbf+Wlpb/Z2dn/2xsbP+Ghob/RERE/xsb + G/8mJib/HBwc/x4eHv8eHh7/Hh4e/x4eHv8sLCz/TExM/1paWv9gYGD/ZmZm/2xsbP9xcXH/d3d3/35+ + fv+EhIT/i4uL/5KSkv+ampr/oaGh/6ioqP+wsLD/t7e3/729vf/Dw8P/yMjIl////wH///8B4+Pj8eHh + 4f/g4OD/3t7e/9zc3P/a2tr/2NjY/9XV1f/S0tL/zs7O/8rKyv/Hx8f/wsLC/729vf+4uLj/s7Oz/66u + rv+np6f/n5+f/5eXl/+Kior/fn5+/2dnZ/9ISEj/QUFB/1FRUf9jY2P/ampq/01NTf+EhIT/bm5u/2Vl + Zf+IiIj/5eXl/39/f/8jIyP/Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/HR0d/x8fH/83Nzf/VFRU/15e + Xv9kZGT/aWlp/3BwcP92dnb/fX19/4SEhP+MjIz/k5OT/5ycnP+kpKT/rKys/7S0tP+8vLz/wsLC/8fH + x5f///8B////AeLi4vHg4OD/3t7e/9zc3P/a2tr/2NjY/9bW1v/T09P/z8/P/8vLy//Hx8f/w8PD/76+ + vv+5ubn/s7Oz/62trf+np6f/n5+f/5aWlv+MjIz/f39//3Jycv9fX1//SUlJ/zo6Ov9XV1f/aWlp/3Bw + cP9PT0//V1dX/11dXf+IiIj/39/f/7S0tP8nJyf/Jycn/yEhIf8lJSX/JCQk/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/yUlJf9ERET/W1tb/2JiYv9oaGj/b29v/3Z2dv99fX3/hYWF/42Njf+Wlpb/n5+f/6mp + qf+ysrL/urq6/8HBwf/GxsaX////Af///wHh4eHx39/f/93d3f/b29v/2NjY/9bW1v/T09P/0NDQ/8zM + zP/IyMj/w8PD/76+vv+5ubn/tLS0/66urv+np6f/oKCg/5aWlv+Li4v/gICA/3R0dP9nZ2f/XV1d/01N + Tf86Ojr/WVlZ/25ubv+Li4v/c3Nz/05OTv9dXV3/0dHR/8bGxv8uLi7/JiYm/yAgIP8kJCT/JSUl/yYm + Jv8lJSX/IiIi/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/zAwMP9RUVH/YWFh/2dnZ/9ubm7/dXV1/319 + ff+Ghob/kJCQ/5qamv+lpaX/r6+v/7m5uf/BwcH/xsbGl////wH///8B4ODg8d7e3v/b29v/2dnZ/9bW + 1v/T09P/0NDQ/8zMzP/IyMj/xMTE/7+/v/+6urr/tLS0/66urv+oqKj/oaGh/5iYmP+MjIz/gYGB/25u + bv9mZmb/Xl5e/1paWv9iYmL/SkpK/1lZWf+Ghob/hYWF/1hYWP9paWn/Ozs7/2xsbP81NTX/JiYm/yAg + IP8kJCT/JSUl/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x4eHv8eHh7/IiIi/z4+ + Pv9bW1v/ZGRk/2tra/90dHT/fn5+/4qKiv+Wlpb/oaGh/62trf+3t7f/wcHB/8bGxpf///8B////Ad7e + 3vHc3Nz/2tra/9fX1//U1NT/0NDQ/8zMzP/IyMj/xMTE/8DAwP+7u7v/tbW1/6+vr/+oqKj/oaGh/5mZ + mf+Ojo7/goKC/3Jycv9OTk7/RUVF/1RUVP9dXV3/ZmZm/0ZGRv9qamr/ioqK/1RUVP99fX3/tLS0/4CA + gP8bGxv/HR0d/x4eHv8jIyP/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/KSkp/0pKSv9fX1//ampq/3d3d/+EhIT/kpKS/5+fn/+rq6v/tra2/8DA + wP/Hx8eX////Af///wHd3d3x2tra/9fX1//U1NT/0dHR/83Nzf/Jycn/xcXF/8DAwP+7u7v/tra2/7Cw + sP+qqqr/oqKi/5qamv+QkJD/hISE/3d3d/9nZ2f/TExM/zw8PP9SUlL/ZGRk/2pqav9BQUH/Wlpa/1RU + VP97e3v/ra2t/+rq6v9OTk7/IiIi/xsbG/8kJCT/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/NjY2/11dXf9ycnL/f39//4yM + jP+cnJz/qamp/7W1tf/AwMD/x8fHl////wH///8B29vb8djY2P/V1dX/0tLS/87Ozv/Kysr/xsbG/8HB + wf+8vLz/t7e3/7Gxsf+qqqr/pKSk/5ycnP+SkpL/h4eH/3p6ev9tbW3/YWFh/05OTv82Njb/VFRU/2lp + af94eHj/bGxs/zMzM/9fX1//pKSk/+/v7/9gYGD/JCQk/yAgIP8kJCT/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8mJib/Tk5O/1xcXP9oaGj/k5OT/6enp/+0tLT/wMDA/8fHx5f///8B////AdnZ2fHW1tb/09PT/8/P + z//Ly8v/x8fH/8LCwv+9vb3/t7e3/7Kysv+rq6v/pKSk/52dnf+Tk5P/iIiI/3t7e/9vb2//ZWVl/1xc + XP9cXFz/SkpK/09PT/92dnb/l5eX/1lZWf9GRkb/MTEx/6enp/9tbW3/IiIi/yAgIP8iIiL/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JCQk/yIi + Iv8fHx//Hx8f/yAgIP8gICD/ICAg/yAgIP8pKSn/Wlpa/46Ojv+np6f/tbW1/8HBwf/Hx8eX////Af// + /wHX19fx1NTU/9DQ0P/MzMz/yMjI/8PDw/++vr7/ubm5/7Ozs/+srKz/paWl/52dnf+UlJT/iYmJ/319 + ff9cXFz/SkpK/1lZWf9aWlr/Y2Nj/0xMTP9TU1P/k5OT/2BgYP9sbGz/i4uL/2BgYP8YGBj/Hh4e/yEh + If8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8lJSX/JCQk/yEhIf8gICD/ICAg/yAgIP8gICD/ICAg/zQ0NP+QkJD/qKio/7e3 + t//Dw8P/yMjIl////wH///8B1dXV8dLS0v/Ozs7/ycnJ/8XFxf/AwMD/urq6/7S0tP+urq7/p6en/5+f + n/+VlZX/i4uL/39/f/9xcXH/UVFR/zw8PP9OTk7/YWFh/2dnZ/9ISEj/UVFR/2lpaf9kZGT/ioqK/+fn + 5/+NjY3/Hh4e/xgYGP8fHx//JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/IyMj/yAgIP8gICD/ICAg/yEh + If8uLi7/jo6O/6urq/+7u7v/xcXF/8nJyZf///8B////AdPT0/HPz8//y8vL/8bGxv/BwcH/u7u7/7W1 + tf+vr6//qKio/6CgoP+Wlpb/jY2N/4GBgf91dXX/aWlp/1NTU/82Njb/TU1N/2dnZ/9vb2//Y2Nj/yoq + Kv9SUlL/hoaG/9/f3/+pqan/JSUl/yQkJP8gICD/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/ISEh/yAgIP8gICD/Jycn/4ODg/+qqqr/wMDA/8fHx//Ly8uX////Af///wHR0dHxzc3N/8jI + yP/Dw8P/vb29/7e3t/+wsLD/qqqq/6Kiov+YmJj/jo6O/4SEhP93d3f/bW1t/2NjY/9aWlr/R0dH/0hI + SP9tbW3/jIyM/3R0dP8vLy//MjIy/6+vr//AwMD/Jycn/yYmJv8gICD/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8kJCT/ICAg/yUlJf+EhIT/ra2t/8PDw//Jycn/zc3Nl/// + /wH///8Bz8/P8cvLy//Gxsb/wMDA/7q6uv+zs7P/rKys/6SkpP+bm5v/kZGR/4aGhv9xcXH/VVVV/19f + X/9dXV3/YmJi/1ZWVv8/Pz//h4eH/4GBgf9TU1P/cHBw/zc3N/8nJyf/R0dH/yQkJP8hISH/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf81NTX/i4uL/6+v + r//Gxsb/y8vL/8/Pz5f///8B////Ac3NzfHIyMj/w8PD/7y8vP+1tbX/rq6u/6ampv+dnZ3/kpKS/4eH + h/96enr/WVlZ/0RERP9NTU3/Xl5e/2dnZ/9UVFT/QUFB/4uLi/9PT0//fHx8/7y8vP/Gxsb/Hh4e/xgY + GP8dHR3/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/SUlJ/4+Pj/+4uLj/ycnJ/83Nzf/R0dGX////Af///wHLy8vxxcXF/7+/v/+4uLj/sLCw/6io + qP+fn5//lZWV/4mJif98fHz/b29v/1paWv8/Pz//SEhI/2VlZf9ra2v/YmJi/yQkJP9JSUn/enp6/7Gx + sf/k5OT/QEBA/yMjI/8dHR3/ISEh/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8kJCT/ERER/y8vL/+rq6v/xcXF/8rKyv/Pz8//0tLSl////wH///8BycnJ8cPD + w/+8vLz/tLS0/6urq/+ioqL/l5eX/4yMjP9/f3//c3Nz/2lpaf9eXl7/RERE/0VFRf9paWn/fHx8/4uL + i/8nJyf/Ojo6/5ycnP/o6Oj/UlJS/yIiIv8gICD/IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/FhYW/ywsLP+fn5//wsLC/8jIyP/MzMz/0NDQ/9TU + 1Jf///8B////AcbGxvHAwMD/ubm5/7CwsP+mpqb/m5ub/4+Pj/+AgID/YmJi/2ZmZv9kZGT/YWFh/2Bg + YP84ODj/d3d3/5SUlP9WVlb/W1tb/ygoKP87Ozv/XV1d/yEhIf8fHx//IiIi/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8nJyf/Kysr/ygoKP+ZmZn/wMDA/8bG + xv/Kysr/zs7O/9LS0v/W1taX////Af///wHFxcXxvr6+/7W1tf+rq6v/oKCg/5OTk/+Ghob/a2tr/0tL + S/9MTEz/YWFh/2ZmZv9hYWH/NjY2/5KSkv9dXV3/aWlp/5KSkv/FxcX/ISEh/yEhIf8bGxv/IiIi/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JiYm/ysrK/8rKyv/KCgo/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/NTU1/2tr + a/+jo6P/v7+//8TExP/IyMj/zMzM/9HR0f/V1dX/2NjYl////wH///8Bw8PD8bu7u/+xsbH/pqam/5qa + mv+MjIz/fHx8/2ZmZv9JSUn/RkZG/2RkZP9sbGz/Z2dn/ycnJ/9UVFT/YmJi/4uLi//p6en/hoaG/x8f + H/8bGxv/ICAg/yUlJf8kJCT/IyMj/ygoKP9OTk7/f39//6Ghof+ysrL/s7Oz/6ioqP+Pj4//YmJi/zMz + M/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yUl + Jf8lJSX/HBwc/xkZGf+Li4v/vLy8/8LCwv/Gxsb/y8vL/8/Pz//T09P/19fX/9nZ2Zf///8B////AcLC + wvG5ubn/r6+v/6Ojo/+Wlpb/hoaG/3d3d/9nZ2f/SkpK/0VFRf9qamr/dHR0/5CQkP8uLi7/Nzc3/4CA + gP/j4+P/m5ub/x0dHf8hISH/IiIi/yYmJv8kJCT/IyMj/0hISP+lpaX/ycnJ/8vLy//Ly8v/y8vL/8zM + zP/MzMz/zc3N/83Nzf++vr7/cnJy/yoqKv8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/IiIi/xEREf9/f3//u7u7/8LCwv/Gxsb/ycnJ/83Nzf/R0dH/1dXV/9jY + 2P/b29uX////Af///wHBwcHxuLi4/62trf+hoaH/h4eH/35+fv94eHj/bGxs/2hoaP9BQUH/bGxs/5OT + k/92dnb/RkZG/yQkJP9LS0v/lZWV/yAgIP8iIiL/ICAg/yUlJf8kJCT/JCQk/2lpaf/Gxsb/zc3N/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/y8vL/8rKyv+np6f/Nzc3/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/IyMj/wwMDP93d3f/uLi4/8HBwf/FxcX/ycnJ/8zM + zP/Q0ND/1NTU/9fX1//a2tr/3Nzcl////wH///8BwcHB8be3t/+srKz/mJiY/2FhYf9VVVX/eXl5/3Bw + cP9ubm7/Ojo6/4WFhf9+fn7/UFBQ/35+fv+bm5v/Jycn/zAwMP8bGxv/HR0d/yMjI/8kJCT/IyMj/19f + X//Gxsb/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8rKyv/Kysr/ycnJ/6Oj + o/8rKyv/IyMj/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/MjIy/1lZWf+AgID/t7e3/8DA + wP/ExMT/yMjI/8vLy//Pz8//0tLS/9bW1v/Z2dn/29vb/97e3pf///8B////AcLCwvG5ubn/ra2t/5WV + lf9fX1//SkpK/3l5ef90dHT/c3Nz/zIyMv9qamr/TU1N/3x8fP/CwsL/ycnJ/ywsLP8aGhr/Gxsb/yIi + Iv8jIyP/JCQk/zU1Nf+2trb/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vL + y//Kysr/ysrK/8rKyv/Kysr/c3Nz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8kJCT/ISEh/xUV + Ff9zc3P/s7Oz/7+/v//Dw8P/x8fH/8vLy//Ozs7/0tLS/9XV1f/Y2Nj/2tra/93d3f/f39+X////Af// + /wHDw8Pxu7u7/6+vr/+Wlpb/X19f/0dHR/96enr/enp6/4mJif9DQ0P/Pj4+/3Z2dv+0tLT/2dnZ/zk5 + Of8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP9paWn/zMzM/83Nzf/MzMz/zMzM/83Nzf/Nzc3/zs7O/83N + zf/Nzc3/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/zMzM/7Ozs/8rKyv/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8kJCT/ISEh/w0NDf9RUVH/r6+v/76+vv/CwsL/x8fH/8rKyv/Ozs7/0dHR/9TU1P/X19f/2tra/9zc + 3P/f39//4eHhl////wH///8Bw8PD8b29vf+zs7P/mZmZ/3V1df9VVVX/c3Nz/4qKiv+Tk5P/RERE/zAw + MP9qamr/09PT/0NDQ/8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/kJCQ/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/83Nzf/MzMz/zMzM/8vLy//Ly8v/zMzM/83Nzf/Jycn/PDw8/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IyMj/w4ODv9KSkr/qamp/729vf/BwcH/xsbG/8rKyv/Ozs7/0dHR/9TU + 1P/X19f/2tra/9zc3P/e3t7/4eHh/+Li4pf///8B////AcPDw/G9vb3/tra2/5aWlv9/f3//UFBQ/3R0 + dP+Xl5f/UlJS/29vb/92dnb/ISEh/y8vL/8fHx//Hx8f/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/5iY + mP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/0dHR/8kJCT/JCQk/yQkJP8kJCT/KSkp/0RERP9WVlb/q6ur/7y8vP/AwMD/xcXF/8rK + yv/Nzc3/0dHR/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OSX////Af///wHFxcXxvr6+/7Oz + s/+Hh4f/goKC/0xMTP9wcHD/V1dX/2pqav+Tk5P/7u7u/1NTU/8eHh7/GRkZ/yQkJP8lJSX/JCQk/yQk + JP8kJCT/JCQk/yQkJP+Ghob/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8bGxv87Ozv/JCQk/yQkJP8kJCT/IyMj/xoaGv9ZWVn/pKSk/7y8 + vP/AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXll/// + /wH///8BxsbG8cDAwP+oqKj/hYWF/4qKiv9fX1//Pj4+/2hoaP+Ojo7/6enp/3V1df8dHR3/ICAg/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/VlZW/8vLy//Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy/+pqan/KCgo/yQkJP8kJCT/IiIi/xIS + Ev8vLy//oqKi/7u7u//AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li + 4v/k5OT/5eXl/+bm5pf///8B////AcjIyPHDw8P/qKio/4qKiv+cnJz/X19f/zMzM/+CgoL/1tbW/4eH + h/8eHh7/ICAg/yEhIf8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/ysrK/+np6f/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Jycn/YWFh/yQk + JP8kJCT/IyMj/xUVFf8mJib/lZWV/7u7u//AwMD/xMTE/8nJyf/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb + 2//e3t7/4ODg/+Li4v/j4+P/5eXl/+fn5//o6OiX////Af///wHKysrxxcXF/6qqqv+bm5v/cnJy/1ZW + Vv9iYmL/MzMz/0NDQ/8qKir/ISEh/yAgIP8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/R0dH/729vf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vL + y//Kysr/kZGR/ycnJ/8kJCT/JSUl/zY2Nv8zMzP/lpaW/7u7u//AwMD/xMTE/8jIyP/MzMz/0NDQ/9PT + 0//W1tb/2dnZ/9vb2//d3d3/4ODg/+Li4v/j4+P/5eXl/+bm5v/o6Oj/6enpl////wH///8By8vL8cfH + x/+1tbX/e3t7/1BQUP9/f3//0dHR/4WFhf8mJib/GRkZ/x8fH/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP9LS0v/tbW1/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/8zMzP/IyMj/j4+P/y4uLv8kJCT/IyMj/yIiIv9LS0v/lJSU/729vf/BwcH/xcXF/8jI + yP/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5eXl/+bm5v/o6Oj/6enp/+rq + 6pf///8B////Ac7OzvHKysr/urq6/1lZWf96enr/xcXF/7y8vP8kJCT/Hx8f/x0dHf8iIiL/IiIi/yIi + Iv8oIiH/PiId/yMiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/zMzM/+Dg4P/v7+//8vL + y//Nzc3/zc3N/83Nzf/Nzc3/zMzM/8rKyv+srKz/XV1d/yYmJv8kJCT/IyMj/xsbG/8UFBT/goKC/7u7 + u//CwsL/xcXF/8nJyf/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm + 5v/o6Oj/6enp/+rq6v/r6+uX////Af///wHQ0NDxzc3N/8nJyf+wsLD/t7e3/9LS0v8oKCj/ICAg/x0d + Hf8jIyP/IyMj/yIiIv8jISH/gicW/3UnGf8jIiH/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/zAwMP9dXV3/fX19/5OTk/+ZmZn/jo6O/29vb/9HR0f/Jycn/yQkJP8kJCT/IyMj/x0d + Hf8NDQ3/dXV1/7q6uv/CwsL/xsbG/8rKyv/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh + 4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozsl////wH///8B09PT8dDQ0P/MzMz/xcXF/3Z2 + dv88PDz/Hx8f/x8fH/8lJSX/IyMj/yIiIv8iISH/dyYX/44oFv8lIiH/IiIi/yQhIf88Ih7/KCIh/y0i + IP9gJRr/aCYa/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/IyMj/y0tLf8bGxv/cnJy/7i4uP/Dw8P/xsbG/8rKyv/Ozs7/0dHR/9TU1P/W1tb/2dnZ/9vb + 2//d3d3/39/f/+Hh4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozs/+3t7Zf///8B////AdXV + 1fHS0tL/z8/P/8jIyP9kZGT/NDQ0/yMjI/8kJCT/IyMj/yIiIv8iISH/aCQY/5cpFf+RKBX/fSYW/3kl + Fv+WKBT/jykW/3slFv9uJhn/UyUd/1omHf9GJB3/WSQa/ygiIf8jIyL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/IyMj/yIiIv9FRUX/gICA/729vf/ExMT/x8fH/8vLy//Ozs7/0dHR/9TU + 1P/X19f/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t + 7f/u7u6X////Af///wHY2Njx1dXV/9LS0v/Ly8v/UlJS/ycnJ/8iIiL/IyMj/yIiIv8iIiL/RiMd/7Yr + Ev8zIR7/JiAg/2QlGv+SKBX/LSIg/ykhIP9GIx3/KCIh/2ImG/9EJB7/aSYZ/2IkGf94Jhj/NiMf/yci + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yAgIP8MDAz/Xl5e/7e3t//FxcX/ycnJ/8zM + zP/Pz8//0tLS/9XV1f/X19f/2tra/9zc3P/e3t7/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+np + 6f/r6+v/7Ozs/+3t7f/u7u7/7+/vl////wH///8B2tra8dfX1//U1NT/ysrK/z4+Pv8iIiL/IyMj/yMj + I/8iIiL/IiIi/yUhIP9dJRv/kicU/1QiGf9QIhn/oyoU/0QiHP+TKBT/fScX/4YmFf9eJRr/LiIg/2ol + Gf+DJxf/bCYZ/2UmG/9yJhj/LCIh/yMiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8NDQ3/TExM/7i4 + uP/IyMj/y8vL/83Nzf/Q0ND/09PT/9bW1v/Z2dn/29vb/93d3f/e3t7/4ODg/+Hh4f/j4+P/5OTk/+bm + 5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v75f///8B////Ad3d3fHa2tr/19fX/83N + zf8/Pz//IyMj/yQkJP8jIyP/IyMj/yIiIv8hISH/ISEh/y4hH/9tJhn/gScX/0cjHf+aKRT/OiIe/yEh + If9LIxz/fScX/yUhIf8tIiD/KiIg/1clHP9HIx3/bSca/2smGv88Ix7/LCMh/yMjI/8jIyP/IyMj/ycn + J/8WFhb/RkZG/7S0tP/Kysr/zc3N/8/Pz//S0tL/1NTU/9fX1//a2tr/3Nzc/97e3v/f39//4eHh/+Li + 4v/j4+P/5eXl/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v7//w8PCX////Af// + /wHf39/x3d3d/9ra2v/Y2Nj/vr6+/1xcXP8lJSX/IyMj/yMjI/8iIiL/IiIi/yIiIv8hISH/ISEh/yEh + If8nISD/likV/zAhHv8nIB//iSYU/1skG/92JRf/aCUZ/yIiIf8iIiH/RyMd/3QmGP9dJRv/ayca/zUk + IP8jIyP/IiIi/yMjI/9GRkb/a2tr/7m5uf/Nzc3/z8/P/9HR0f/U1NT/1tbW/9jY2P/b29v/3d3d/9/f + 3//g4OD/4uLi/+Pj4//k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHxl////wH///8B4eHh8d/f3//d3d3/29vb/9nZ2f/W1tb/paWl/0dHR/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8hISH/ISEh/zkiHv99Jhb/hyYV/14kGv9tJBf/gicX/yQhIP8+Ih3/fCYX/0Ij + Hv9YJRz/hSgX/ykjIv8jIyP/IyMj/yMjI/8TExP/NjY2/62trf/Q0ND/0tLS/9TU1P/W1tb/2NjY/9ra + 2v/c3Nz/3t7e/+Dg4P/i4uL/4+Pj/+Tk5P/l5eX/5+fn/+jo6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8pf///8B////AePj4/Hh4eH/39/f/93d3f/c3Nz/2tra/9jY + 2P/Pz8//ioqK/zU1Nf8iIiL/IyMj/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/yIhIP9QIxv/qioT/y0h + H/82IR3/nCkU/zojH/8mIiH/YiUa/ysjIf8jIyL/IyMj/yQkJP8YGBj/KCgo/6urq//S0tL/1dXV/9fX + 1//Y2Nj/2tra/9zc3P/e3t7/4ODg/+Li4v/j4+P/5OTk/+Xl5f/n5+f/6Ojo/+jo6P/p6en/6urq/+vr + 6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vKX////Af///wHl5eXx5OTk/+Li + 4v/g4OD/39/f/93d3f/c3Nz/2tra/9jY2P/BwcH/aWlp/ygoKP8iIiL/IiIi/yIiIv8iIiL/ISEh/yEh + If8hISH/KSEg/1kkG/+LJxT/pykT/00kHf8kIiH/fCcX/3QoGv8kIyL/IyMj/yQkJP8cHBz/ICAg/6Cg + oP/U1NT/19fX/9nZ2f/b29v/3Nzc/97e3v/g4OD/4eHh/+Pj4//k5OT/5ubm/+fn5//o6Oj/6Ojo/+np + 6f/q6ur/6+vr/+zs7P/s7Oz/7e3t/+7u7v/v7+//7+/v//Dw8P/x8fH/8fHx//Ly8v/z8/P/8/Pzl/// + /wH///8B5+fn8ebm5v/l5eX/4+Pj/+Li4v/g4OD/39/f/97e3v/c3Nz/29vb/9jY2P+tra3/lpaW/5eX + l/9aWlr/JCQk/yIiIv8iIiL/ISEh/yEhIf8iISH/MiIg/10mG/91Jhj/fSYX/30oGf8mIyL/IyMj/yMj + I/9BQUH/WVlZ/6ampv/X19f/2tra/9zc3P/d3d3/39/f/+Dg4P/i4uL/4+Pj/+Tk5P/m5ub/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7u7u/+7u7v/v7+//8PDw//Dw8P/x8fH/8fHx//Ly + 8v/z8/P/8/Pz//T09Jf///8B////Aenp6fHo6Oj/5+fn/+bm5v/k5OT/4+Pj/+Li4v/h4eH/39/f/97e + 3v/d3d3/3Nzc/9vb2//b29v/1NTU/1VVVf8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8kIiL/UCUd/1cm + Hf8mIyL/IyMj/yIiIv8aGhr/ICAg/5WVlf/Z2dn/3d3d/97e3v/f39//4eHh/+Li4v/j4+P/5eXl/+bm + 5v/n5+f/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Hx + 8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/09PSX////Af///wHr6+vx6urq/+np6f/o6Oj/5+fn/+bm + 5v/l5eX/5OTk/+Pj4//i4uL/4eHh/9/f3//f39//3t7e/93d3f+Xl5f/KSkp/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/IyMj/yIiIv8eHh7/DQ0N/4ODg//Z2dn/4ODg/+Hh4f/i4uL/4+Pj/+Tk + 5P/l5eX/5ubm/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Hx8f/x8fH/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9fX1l////wH///8B7e3t8ezs + 7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm5v/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/39/f/7m5 + uf9YWFj/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8gICD/DQ0N/3p6ev/Z2dn/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/6Ojo/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+/v + 7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Pz8//z8/P/9PT0//T09P/19fX/9fX1//b2 + 9pf///8B////Ae7u7vHt7e3/7Ozs/+zs7P/r6+v/6urq/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/i4uL/39/f/6Kiov8+Pj7/IyMj/yMjI/8jIyP/IyMj/yIiIv9ZWVn/tLS0/6en + p//c3Nz/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9fX1//X19f/29vaX////Af///wHv7+/x7u7u/+7u7v/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq + 6v/p6en/6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/l5eX/2NjY/4ODg/8xMTH/IiIi/yIi + Iv9NTU3/19fX/+bm5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2l////wH///8B8PDw8fDw8P/v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/6+vr/+rq6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+fn5//n5+f/5+fn/+fn + 5//m5ub/xMTE/2VlZf9LS0v/0tLS/+jo6P/p6en/6enp/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8vLy//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//X19f/19fX/9fX1//b29v/29vb/9vb2//f395f///8B////AfHx + 8fHx8fH/8PDw//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+3t7f/s7Oz/7Ozs/+vr6//q6ur/6urq/+rq + 6v/p6en/6enp/+np6f/p6en/6enp/+rq6v/n5+f/4eHh/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//f3 + 9//39/eX////Af///wHy8vLx8vLy//Hx8f/x8fH/8PDw//Dw8P/w8PD/7+/v/+/v7//u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3l////wH///8B8/Pz8fPz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Dw + 8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+7u7v/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/+Pj4//j4+Jf///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wHw8PDj8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW + 1v/V1dX/09PT/9LS0v/Q0ND/zs7O/83Nzf/Ly8v/ysrK/8jIyP/Hx8f/xcXF/8TExP/CwsL/wcHB/8DA + wP++vr7/vb29/7u7u/+6urr/uLi4/7e3t/+1tbX/tLS0/7Ozs/+ysrL/sbGx/7Gxsf+wsLD/sLCw/7Cw + sP+wsLD/sLCw/7Gxsf+xsbH/sbGx/7Kysv+ysrL/srKy/7S0tP+0tLT/tbW1/7a2tv+3t7f/uLi4/7m5 + uf+7u7v/u7u7/729vf++vr7/wMDA/8HBwf/BwcH/w8PD/8TExP/FxcX/xsbG/8jIyP/Jycn/ysrK/8vL + y//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e + 3v/e3t7/39/f/+Hh4f/h4eEx////Af///wH///8B////AfDw8OPv7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/3Nzc/9vb + 2//a2tr/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/z8/P/83Nzf/MzMz/ysrK/8jI + yP/Hx8f/xcXF/8PDw//BwcH/wMDA/7+/v/+9vb3/vLy8/7q6uv+4uLj/t7e3/7W1tf+zs7P/srKy/7Cw + sP+vr6//rq6u/62trf+tra3/rKys/6urq/+rq6v/q6ur/6urq/+rq6v/rKys/62trf+tra3/ra2t/66u + rv+urq7/sLCw/7CwsP+ysrL/srKy/7Ozs/+1tbX/tra2/7e3t/+5ubn/urq6/7y8vP+9vb3/vr6+/7+/ + v//AwMD/wsLC/8PDw//ExMT/xcXF/8bGxv/IyMj/ycnJ/8vLy//MzMz/zc3N/87Ozv/Pz8//0dHR/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e3v/f39//39/f/+Dg4DH///8B////Af// + /wH///8B7+/v4+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/93d3f/d3d3/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT + 0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Gxsb/xcXF/8LCwv/BwcH/v7+//729vf+8vLz/urq6/7i4 + uP+2trb/tLS0/7Kysv+wsLD/rq6u/6ysrP+rq6v/qamp/6ioqP+np6f/p6en/6ampv+lpaX/paWl/6Wl + pf+lpaX/paWl/6ampv+mpqb/p6en/6ioqP+oqKj/qamp/6qqqv+rq6v/rKys/62trf+vr6//sLCw/7Gx + sf+ysrL/tLS0/7a2tv+2trb/uLi4/7m5uf+7u7v/vLy8/729vf+/v7//wMDA/8LCwv/CwsL/w8PD/8XF + xf/Gxsb/yMjI/8nJyf/Ly8v/zMzM/83Nzf/Pz8//0NDQ/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ + 2f/b29v/3Nzc/97e3v/e3t7/39/fMf///wH///8B////Af///wHv7+/j7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/Pz//Nzc3/y8vL/8rKyv/Hx8f/xsbG/8PD + w//BwcH/v7+//729vf+7u7v/ubm5/7e3t/+1tbX/s7Oz/7Gxsf+urq7/rKys/6mpqf+np6f/paWl/6Oj + o/+ioqL/oaGh/6CgoP+goKD/n5+f/5+fn/+fn5//n5+f/5+fn/+goKD/oaGh/6Ghof+ioqL/o6Oj/6Sk + pP+lpaX/pqam/6enp/+oqKj/qamp/6qqqv+srKz/ra2t/6+vr/+xsbH/srKy/7Ozs/+1tbX/tra2/7i4 + uP+5ubn/u7u7/7y8vP+9vb3/v7+//8DAwP/BwcH/w8PD/8TExP/FxcX/x8fH/8jIyP/Kysr/y8vL/8zM + zP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/97e3v/e3t4x////Af// + /wH///8B////Ae7u7uPu7u7/7u7u/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/h4eH/4ODg/9/f + 3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/P + z//Ozs7/zMzM/8rKyv/IyMj/x8fH/8TExP/CwsL/v7+//729vf+7u7v/uLi4/7e3t/+0tLT/srKy/7Cw + sP+tra3/qqqq/6enp/+lpaX/oaGh/6CgoP+dnZ3/m5ub/5qamv+ZmZn/mJiY/5iYmP+YmJj/mJiY/5iY + mP+YmJj/mZmZ/5qamv+bm5v/nJyc/52dnf+dnZ3/n5+f/6CgoP+hoaH/oqKi/6Ojo/+lpaX/pqam/6io + qP+qqqr/q6ur/62trf+urq7/sLCw/7Kysv+zs7P/tbW1/7a2tv+4uLj/ubm5/7u7u/+8vLz/vb29/7+/ + v//AwMD/wsLC/8PDw//ExMT/xsbG/8fHx//Jycn/y8vL/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV + 1f/X19f/2dnZ/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8B7u7u4+3t7f/t7e3/7e3t/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/c3Nz/2tra/9nZ2f/Z2dn/19fX/9bW + 1v/V1dX/1NTU/9PT0//S0tL/0dHR/8/Pz//Nzc3/zMzM/8rKyv/IyMj/x8fH/8XFxf/Dw8P/wcHB/76+ + vv+7u7v/ubm5/7a2tv+0tLT/sbGx/66urv+srKz/qamp/6ampv+jo6P/n5+f/5mZmf+BgYH/ioqK/5SU + lP+Tk5P/kZGR/5CQkP+QkJD/kJCQ/5CQkP+QkJD/kZGR/5GRkf+SkpL/k5OT/5WVlf+Wlpb/lpaW/5eX + l/+ZmZn/mpqa/5ycnP+dnZ3/np6e/6CgoP+ioqL/o6Oj/6ampv+np6f/qamp/6urq/+srKz/rq6u/6+v + r/+xsbH/s7Oz/7S0tP+2trb/t7e3/7m5uf+6urr/vLy8/729vf+/v7//wMDA/8HBwf/ExMT/xcXF/8fH + x//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29v/3NzcMf// + /wH///8B////Af///wHt7e3j7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/q6ur/6enp/+np + 6f/o6Oj/5+fn/+bm5v/m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Li4v/i4uL/4ODg/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//S0tL/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Jycn/yMjI/8bGxv/Dw8P/wsLC/8DAwP++vr7/u7u7/7m5uf+2trb/s7Oz/6+vr/+srKz/qamp/6en + p/+jo6P/n5+f/5ycnP+VlZX/fX19/2RkZP9paWn/enp6/4qKiv+Li4v/iYmJ/4mJif+JiYn/iYmJ/4qK + iv+Kior/i4uL/4yMjP+Ojo7/j4+P/5CQkP+RkZH/kpKS/5SUlP+VlZX/l5eX/5mZmf+ampr/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/p6en/6ioqP+rq6v/rKys/66urv+wsLD/sbGx/7Ozs/+0tLT/tra2/7i4 + uP+5ubn/u7u7/7y8vP++vr7/wMDA/8HBwf/Dw8P/xcXF/8fHx//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR + 0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29sx////Af///wH///8B////Ae3t7ePs7Oz/7Ozs/+vr + 6//r6+v/6urq/+rq6v/q6ur/6enp/+np6f/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/k5OT/4+Pj/+Pj + 4//i4uL/4eHh/+Dg4P/f39//3t7e/93d3f/d3d3/29vb/9vb2//Z2dn/2NjY/9jY2P/W1tb/1dXV/9PT + 0//T09P/0tLS/9DQ0P/Pz8//zc3N/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP++vr7/vLy8/7m5 + uf+3t7f/tLS0/7Kysv+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4CAgP9jY2P/YmJi/2Fh + Yf9iYmL/enp6/4ODg/+CgoL/gYGB/4GBgf+CgoL/goKC/4ODg/+EhIT/hoaG/4eHh/+IiIj/iYmJ/4uL + i/+MjIz/jo6O/4+Pj/+RkZH/k5OT/5WVlf+Xl5f/mZmZ/5qamv+dnZ3/n5+f/6Ghof+ioqL/pKSk/6am + pv+oqKj/qqqq/6urq/+tra3/r6+v/7Gxsf+ysrL/tLS0/7a2tv+4uLj/ubm5/7u7u/+9vb3/v7+//8HB + wf/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9nZ + 2TH///8B////Af///wH///8B7Ozs4+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo/+fn + 5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Pj4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/X19f/1tbW/9XV1f/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fH + x//FxcX/xMTE/8HBwf+/v7//vb29/7u7u/+5ubn/tra2/7S0tP+wsLD/ra2t/6qqqv+lpaX/oqKi/52d + nf+ZmZn/lJSU/5CQkP+MjIz/dnZ2/2FhYf9jY2P/YmJi/2FhYf92dnb/fX19/3x8fP98fHz/e3t7/3x8 + fP98fHz/fX19/35+fv+AgID/gYGB/4ODg/+EhIT/hYWF/4eHh/+JiYn/i4uL/4yMjP+Ojo7/kJCQ/5KS + kv+UlJT/lpaW/5mZmf+bm5v/nZ2d/56env+goKD/oqKi/6SkpP+mpqb/qKio/6qqqv+srKz/ra2t/7Cw + sP+xsbH/s7Oz/7W1tf+2trb/ubm5/7q6uv+9vb3/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW1v/X19f/2NjYMf///wH///8B////Af///wHr6+vj6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/39/f/9/f3//e3t7/3Nzc/9zc3P/b29v/2tra/9jY2P/X19f/19fX/9XV1f/V1dX/09PT/9LS + 0v/R0dH/z8/P/87Ozv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7y8vP+5ubn/t7e3/7W1 + tf+ysrL/r6+v/6ysrP+pqan/pKSk/5+fn/+bm5v/lpaW/5GRkf+MjIz/iIiI/4SEhP9ycnL/YWFh/2Rk + ZP9iYmL/YWFh/3Fxcf92dnb/dnZ2/3V1df91dXX/dXV1/3V1df92dnb/eHh4/3p6ev97e3v/fX19/39/ + f/+AgID/goKC/4ODg/+Ghob/h4eH/4mJif+Li4v/jY2N/5CQkP+SkpL/lJSU/5aWlv+YmJj/mpqa/5yc + nP+enp7/oKCg/6Kiov+kpKT/pqam/6ioqP+qqqr/rKys/66urv+wsLD/srKy/7Ozs/+2trb/uLi4/7q6 + uv+8vLz/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW + 1v/X19cx////Af///wH///8B////Aevr6+Pr6+v/6urq/+np6f/p6en/6Ojo/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3t7e/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/v7+//729vf+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+rq6v/p6en/6Ojo/+enp7/mZmZ/5SU + lP+Ojo7/iYmJ/4SEhP9/f3//fHx8/21tbf9iYmL/ZWVl/2NjY/9iYmL/bW1t/3BwcP9wcHD/b29v/29v + b/9vb2//b29v/3Fxcf9zc3P/dHR0/3Z2dv94eHj/enp6/3t7e/99fX3/fn5+/4CAgP+CgoL/hISE/4aG + hv+JiYn/i4uL/42Njf+Pj4//kZGR/5SUlP+Wlpb/mJiY/5qamv+cnJz/np6e/6CgoP+jo6P/paWl/6am + pv+pqan/qqqq/62trf+vr6//sbGx/7Ozs/+1tbX/t7e3/7m5uf+8vLz/vr6+/7+/v//CwsL/xMTE/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/T09P/1dXV/9bW1jH///8B////Af///wH///8B6urq4+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh + 4f/f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1dXV/9TU1P/S0tL/0dHR/9DQ + 0P/Ozs7/zc3N/8vLy//Jycn/x8fH/8XFxf/Dw8P/wcHB/7+/v/+9vb3/urq6/7e3t/+1tbX/s7Oz/7Cw + sP+tra3/qamp/6ampv+ioqL/nZ2d/5iYmP+Tk5P/jY2N/4eHh/+CgoL/fX19/3h4eP91dXX/a2tr/2Rk + ZP9mZmb/ZWVl/2NjY/9paWn/ampq/2lpaf9paWn/aWlp/2pqav9ra2v/bW1t/25ubv9wcHD/cnJy/3Nz + c/91dXX/d3d3/3l5ef96enr/fHx8/319ff9/f3//gYGB/4SEhP+Hh4f/iYmJ/4uLi/+NjY3/kJCQ/5KS + kv+UlJT/lpaW/5iYmP+bm5v/nZ2d/5+fn/+hoaH/o6Oj/6ampv+oqKj/qqqq/6ysrP+urq7/sLCw/7Ky + sv+1tbX/t7e3/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS + 0v/U1NT/1dXVMf///wH///8B////Af///wHq6urj6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+Xl + 5f/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9fX + 1//X19f/1tbW/9TU1P/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/s7Oz/7Gxsf+urq7/rKys/6mpqf+lpaX/oaGh/5ubm/+Xl5f/kZGR/4uL + i/+Ghob/gYGB/3x8fP92dnb/cnJy/29vb/9oaGj/ZWVl/2lpaf9qamr/ampq/2hoaP9kZGT/Y2Nj/2Nj + Y/9kZGT/ZWVl/2ZmZv9oaGj/aWlp/2tra/9tbW3/bm5u/3BwcP9xcXH/c3Nz/3V1df92dnb/eHh4/3p6 + ev98fHz/fn5+/4GBgf+EhIT/hoaG/4mJif+Li4v/jY2N/4+Pj/+RkZH/lJSU/5aWlv+ZmZn/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/qKio/6urq/+tra3/r6+v/7Kysv+0tLT/tra2/7m5uf+7u7v/vb29/7+/ + v//CwsL/xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT0//T09Mx////Af///wH///8B////Aenp + 6ePp6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f + 3//f39//3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/09PT/9LS0v/R0dH/z8/P/87O + zv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7Ozs/+wsLD/rq6u/6ur + q/+oqKj/pKSk/6CgoP+cnJz/lZWV/5CQkP+Li4v/hoaG/39/f/96enr/dnZ2/3Fxcf9ubm7/a2tr/2dn + Z/9nZ2f/a2tr/25ubv9ycnL/cHBw/2dnZ/9fX1//X19f/2BgYP9hYWH/YmJi/2RkZP9lZWX/Z2dn/2ho + aP9qamr/a2tr/21tbf9vb2//cHBw/3Jycv90dHT/dnZ2/3l5ef97e3v/fX19/4CAgP+CgoL/hYWF/4eH + h/+JiYn/i4uL/46Ojv+QkJD/k5OT/5WVlf+YmJj/mpqa/5ycnP+fn5//oaGh/6Ojo/+lpaX/qKio/6qq + qv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8fHx//Jycn/y8vL/83N + zf/Pz8//0dHR/9LS0jH///8B////Af///wH///8B6enp4+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl + 5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg4P/g4OD/3t7e/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX + 1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+ + vv+7u7v/uLi4/7W1tf+zs7P/sLCw/62trf+qqqr/p6en/6Ojo/+fn5//mpqa/5WVlf+Pj4//ioqK/4WF + hf97e3v/Y2Nj/11dXf9nZ2f/ampq/2pqav9nZ2f/Z2dn/2lpaf9sbGz/b29v/3Nzc/90dHT/b29v/1xc + XP9bW1v/XFxc/11dXf9eXl7/X19f/2FhYf9iYmL/ZGRk/2VlZf9nZ2f/aWlp/2pqav9sbGz/bW1t/29v + b/9xcXH/dHR0/3Z2dv94eHj/enp6/35+fv+AgID/goKC/4SEhP+Hh4f/ioqK/4yMjP+Ojo7/kZGR/5SU + lP+Wlpb/mJiY/5ubm/+dnZ3/oKCg/6Kiov+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5 + uf+7u7v/vr6+/8DAwP/CwsL/xcXF/8fHx//Kysr/zMzM/87Ozv/Q0ND/0NDQMf///wH///8B////Af// + /wHp6enj6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Kysr/yMjI/8fHx//FxcX/w8PD/8DAwP++vr7/u7u7/7i4uP+1tbX/s7Oz/7CwsP+tra3/qamp/6am + pv+ioqL/np6e/5qamv+UlJT/j4+P/4mJif+EhIT/fX19/2NjY/9QUFD/S0tL/01NTf9dXV3/ZWVl/2Vl + Zf9oaGj/a2tr/25ubv9wcHD/c3Nz/3R0dP9wcHD/Wlpa/1dXV/9YWFj/WVlZ/1paWv9bW1v/XV1d/15e + Xv9gYGD/YWFh/2JiYv9kZGT/ZmZm/2dnZ/9paWn/a2tr/21tbf9vb2//cnJy/3R0dP92dnb/eXl5/3t7 + e/9+fn7/gICA/4ODg/+Ghob/iIiI/4uLi/+NjY3/kJCQ/5OTk/+VlZX/mJiY/5qamv+dnZ3/n5+f/6Gh + of+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/t7e3/7m5uf+7u7v/vr6+/8HBwf/Dw8P/xsbG/8jI + yP/Kysr/zMzM/8/Pz//Q0NAx////Af///wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/+Dg4P/f39//3t7e/93d3f/c3Nz/2tra/9nZ2f/Y2Nj/19fX/9bW + 1v/U1NT/09PT/9HR0f/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7u7 + u/+4uLj/tbW1/7Ozs/+wsLD/ra2t/6qqqv+mpqb/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/goKC/319 + ff9ycnL/VFRU/09PT/9JSUn/RUVF/1VVVf9hYWH/ZGRk/2pqav9tbW3/cHBw/3Jycv90dHT/dXV1/3Bw + cP9XV1f/VFRU/1VVVf9WVlb/V1dX/1hYWP9XV1f/S0tL/0lJSf9YWFj/Xl5e/2BgYP9hYWH/Y2Nj/2Vl + Zf9nZ2f/aWlp/2tra/9tbW3/cHBw/3Jycv91dXX/d3d3/3p6ev98fHz/fn5+/4GBgf+EhIT/h4eH/4qK + iv+MjIz/j4+P/5GRkf+UlJT/l5eX/5mZmf+cnJz/np6e/6Ghof+kpKT/p6en/6qqqv+srKz/r6+v/7Ky + sv+0tLT/t7e3/7q6uv+9vb3/v7+//8HBwf/ExMT/xsbG/8nJyf/Ly8v/zs7O/8/PzzH///8B////Af// + /wH///8B6Ojo4+fn5//m5ub/5ubm/+Xl5f/k5OT/5OTk/+Pj4//i4uL/4eHh/+Dg4P/g4OD/39/f/97e + 3v/d3d3/3Nzc/9vb2//Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/y8vL/8nJ + yf/IyMj/xsbG/8TExP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+ysrL/sLCw/62trf+qqqr/pqam/6Gh + of+enp7/mZmZ/5OTk/+Ojo7/h4eH/4KCgv98fHz/dnZ2/2xsbP9VVVX/UVFR/0dHR/9DQ0P/UlJS/15e + Xv9nZ2f/bGxs/25ubv9xcXH/dHR0/3d3d/93d3f/cXFx/1NTU/9QUFD/UVFR/1JSUv9TU1P/UlJS/z4+ + Pv8fHx//Hh4e/zExMf9KSkr/Wlpa/15eXv9fX1//YmJi/2NjY/9lZWX/Z2dn/2lpaf9ra2v/bm5u/3Bw + cP9ycnL/dXV1/3h4eP96enr/fX19/4CAgP+Dg4P/hYWF/4iIiP+Li4v/jo6O/5CQkP+Tk5P/lpaW/5mZ + mf+bm5v/np6e/6Ghof+kpKT/p6en/6qqqv+tra3/r6+v/7Kysv+1tbX/uLi4/7q6uv+9vb3/wMDA/8PD + w//FxcX/x8fH/8rKyv/MzMz/zc3NMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4uLi/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9jY2P/X19f/1tbW/9TU + 1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vLy//Jycn/x8fH/8bGxv/ExMT/wcHB/8DAwP+9vb3/u7u7/7m5 + uf+1tbX/s7Oz/7CwsP+tra3/qqqq/6ampv+jo6P/np6e/5mZmf+UlJT/j4+P/4iIiP+CgoL/fHx8/3Z2 + dv9wcHD/ZmZm/1ZWVv9TU1P/RkZG/0JCQv9PT0//X19f/2lpaf9tbW3/b29v/3Jycv96enr/fn5+/3h4 + eP9xcXH/UVFR/01NTf9OTk7/T09P/09PT/9AQED/ISEh/xoaGv8bGxv/Hh4e/yYmJv88PDz/VFRU/1xc + XP9eXl7/YGBg/2FhYf9jY2P/ZWVl/2dnZ/9qamr/bGxs/25ubv9xcXH/dHR0/3d3d/96enr/fHx8/39/ + f/+BgYH/hISE/4eHh/+Kior/jY2N/5CQkP+Tk5P/lZWV/5mZmf+cnJz/np6e/6Kiov+kpKT/p6en/6qq + qv+tra3/sLCw/7Ozs/+2trb/ubm5/7y8vP+/v7//wcHB/8TExP/Gxsb/ycnJ/8zMzP/MzMwx////Af// + /wH///8B////Aefn5+Pm5ub/5ubm/+Tk5P/k5OT/4+Pj/+Li4v/i4uL/4eHh/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/19fX/9fX1//V1dX/1NTU/9LS0v/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//Gxsb/w8PD/8HBwf+/v7//vb29/7u7u/+4uLj/tbW1/7Kysv+wsLD/ra2t/6mpqf+mpqb/oqKi/5+f + n/+ZmZn/lJSU/46Ojv+IiIj/goKC/3t7e/92dnb/b29v/2lpaf9gYGD/WFhY/1VVVf9ERET/QUFB/0tL + S/9eXl7/a2tr/25ubv9xcXH/enp6/46Ojv+VlZX/fHx8/3Nzc/9PT0//SUlJ/0pKSv9LS0v/PDw8/xsb + G/8TExP/HBwc/x4eHv8dHR3/Hh4e/x4eHv8oKCj/QEBA/1VVVf9bW1v/XV1d/19fX/9hYWH/Y2Nj/2Vl + Zf9oaGj/ampq/21tbf9wcHD/cnJy/3V1df94eHj/e3t7/319ff+AgID/g4OD/4aGhv+JiYn/jIyM/4+P + j/+SkpL/lZWV/5iYmP+bm5v/np6e/6Ghof+kpKT/qKio/6urq/+urq7/sbGx/7W1tf+3t7f/urq6/729 + vf/AwMD/w8PD/8XFxf/IyMj/y8vL/8vLyzH///8B////Af///wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj + 4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9jY2P/X19f/1dXV/9TU + 1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJyf/IyMj/xcXF/8TExP/BwcH/v7+//729vf+7u7v/uLi4/7W1 + tf+zs7P/r6+v/6ysrP+pqan/pqam/6Ojo/+fn5//mpqa/5SUlP+Pj4//iYmJ/4SEhP99fX3/dnZ2/3Bw + cP9paWn/YmJi/1xcXP9bW1v/V1dX/0ZGRv9FRUX/SkpK/11dXf9sbGz/cHBw/3Z2dv+MjIz/oKCg/4+P + j/9vb2//dnZ2/1dXV/9GRkb/R0dH/z4+Pv8dHR3/EhIS/xgYGP8uLi7/LCws/x4eHv8eHh7/Hh4e/x4e + Hv8hISH/NDQ0/0xMTP9ZWVn/W1tb/11dXf9fX1//YWFh/2RkZP9mZmb/aWlp/2xsbP9ubm7/cXFx/3R0 + dP93d3f/enp6/319ff+AgID/goKC/4aGhv+JiYn/jIyM/4+Pj/+SkpL/lZWV/5iYmP+cnJz/np6e/6Ki + ov+mpqb/qamp/6ysrP+vr6//s7Oz/7a2tv+5ubn/vLy8/76+vv/CwsL/xMTE/8fHx//Kysr/y8vLMf// + /wH///8B////Af///wHm5ubj5eXl/+Tk5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/U1NT/0tLS/9HR0f/Pz8//zc3N/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/7+/v/+9vb3/u7u7/7i4uP+2trb/s7Oz/7CwsP+srKz/qamp/6ampv+jo6P/np6e/5mZ + mf+VlZX/j4+P/4qKiv+EhIT/fn5+/3h4eP9wcHD/ampq/2JiYv9bW1v/WFhY/11dXf9fX1//X19f/1lZ + Wf9MTEz/Xl5e/25ubv92dnb/h4eH/5+fn/+SkpL/VVVV/1ZWVv93d3f/bGxs/05OTv89PT3/JCQk/xMT + E/8YGBj/KCgo/zY2Nv8rKyv/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/JSUl/z09Pf9QUFD/WFhY/1tb + W/9dXV3/X19f/2FhYf9kZGT/Z2dn/2pqav9tbW3/cHBw/3Nzc/91dXX/eHh4/3t7e/9+fn7/goKC/4WF + hf+IiIj/i4uL/46Ojv+SkpL/lZWV/5mZmf+cnJz/n5+f/6Ojo/+mpqb/qqqq/62trf+xsbH/tLS0/7e3 + t/+6urr/vb29/8DAwP/Dw8P/xsbG/8nJyf/Kysox////Af///wH///8B////AeXl5ePk5OT/5OTk/+Pj + 4//i4uL/4eHh/+Dg4P/f39//39/f/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9LS + 0v/R0dH/0NDQ/83Nzf/MzMz/ysrK/8jIyP/Gxsb/xMTE/8HBwf+/v7//vb29/7u7u/+4uLj/tra2/7S0 + tP+wsLD/ra2t/6qqqv+mpqb/o6Oj/6CgoP+ampr/lZWV/5CQkP+JiYn/hISE/35+fv9zc3P/aWlp/2lp + af9kZGT/XFxc/1VVVf9UVFT/YGBg/2NjY/9mZmb/XFxc/09PT/9dXV3/c3Nz/4WFhf+bm5v/lpaW/11d + Xf9MTEz/cHBw/4aGhv92dnb/Y2Nj/ykpKf8WFhb/GBgY/ycnJ/8rKyv/Hx8f/xwcHP8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/ywsLP9DQ0P/VVVV/1lZWf9bW1v/XV1d/2BgYP9jY2P/ZmZm/2lp + af9sbGz/b29v/3Jycv91dXX/eHh4/3t7e/9+fn7/gYGB/4SEhP+IiIj/i4uL/4+Pj/+SkpL/lpaW/5mZ + mf+dnZ3/oaGh/6SkpP+oqKj/q6ur/6+vr/+ysrL/tra2/7m5uf+8vLz/v7+//8LCwv/FxcX/yMjI/8rK + yjH///8B////Af///wH///8B5OTk4+Tk5P/j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2dnZ/9jY2P/X19f/1tbW/9XV1f/S0tL/0dHR/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+zs7P/sbGx/62trf+qqqr/pqam/6Ojo/+fn5//m5ub/5aW + lv+Pj4//ioqK/4ODg/9+fn7/dHR0/1paWv9NTU3/U1NT/1lZWf9XV1f/UVFR/1RUVP9iYmL/ZWVl/2ho + aP9dXV3/UFBQ/2FhYf+BgYH/mpqa/56env9hYWH/SEhI/2pqav+MjIz/fHx8/5+fn/9nZ2f/HBwc/xcX + F/8lJSX/Kysr/xwcHP8aGhr/HBwc/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/yMj + I/81NTX/S0tL/1ZWVv9aWlr/XFxc/19fX/9iYmL/ZmZm/2hoaP9ra2v/bm5u/3Fxcf90dHT/d3d3/3t7 + e/9+fn7/gYGB/4WFhf+IiIj/jIyM/4+Pj/+Tk5P/lpaW/5qamv+enp7/oaGh/6ampv+pqan/ra2t/7Gx + sf+0tLT/uLi4/7u7u/++vr7/wcHB/8XFxf/IyMj/ycnJMf///wH///8B////Af///wHj4+Pj4+Pj/+Li + 4v/h4eH/4ODg/9/f3//f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Y2Nj/2NjY/9bW1v/V1dX/09PT/9LS + 0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/s7Oz/7Cw + sP+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kJCQ/4qKiv+EhIT/fX19/3d3d/9eXl7/SkpK/0VF + Rf9BQUH/RUVF/1JSUv9PT0//XFxc/2VlZf9oaGj/ampq/1JSUv9OTk7/bW1t/5eXl/+cnJz/ampq/0dH + R/9mZmb/iYmJ/35+fv+vr6//+vr6/9HR0f84ODj/HR0d/ykpKf8hISH/GRkZ/xsbG/8dHR3/Hh4e/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/HR0d/x0dHf8lJSX/PT09/09PT/9YWFj/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9paWn/bGxs/3BwcP9zc3P/dnZ2/3p6ev9+fn7/gYGB/4SEhP+IiIj/i4uL/4+P + j/+Tk5P/l5eX/5ubm/+enp7/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/urq6/76+vv/BwcH/xMTE/8fH + x//IyMgx////Af///wH///8B////AePj4+Pi4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/W1tb/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8LC + wv/AwMD/vr6+/7u7u/+5ubn/tbW1/7Ozs/+wsLD/rq6u/6urq/+np6f/pKSk/6CgoP+cnJz/l5eX/5KS + kv+Li4v/hISE/39/f/93d3f/cHBw/1VVVf9MTEz/Q0ND/z4+Pv9BQUH/T09P/1NTU/9jY2P/Z2dn/2pq + av9ra2v/S0tL/0hISP9xcXH/m5ub/2tra/9GRkb/YWFh/4eHh/98fHz/nZ2d//Hx8f/8/Pz/wsLC/zAw + MP8gICD/JSUl/yIiIv8hISH/IiIi/yEhIf8fHx//Hh4e/x4eHv8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x0dHf8hISH/Ly8v/0hISP9XV1f/Wlpa/11dXf9gYGD/ZGRk/2ZmZv9paWn/bGxs/29v + b/9zc3P/dnZ2/3p6ev99fX3/gICA/4WFhf+IiIj/jY2N/5CQkP+UlJT/mZmZ/5ycnP+hoaH/paWl/6mp + qf+tra3/srKy/7a2tv+5ubn/vb29/8DAwP/ExMT/x8fH/8jIyDH///8B////Af///wH///8B4uLi4+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/0tLS/9HR + 0f/Ozs7/zc3N/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62t + rf+qqqr/p6en/6Ojo/+fn5//m5ub/5eXl/+RkZH/i4uL/4aGhv9+fn7/eHh4/3BwcP9qamr/VlZW/1BQ + UP9BQUH/Ojo6/z09Pf9NTU3/XFxc/2dnZ/9qamr/bGxs/25ubv9LS0v/R0dH/19fX/9mZmb/RERE/1tb + W/+IiIj/goKC/6CgoP/09PT//Pz8/7y8vP8+Pj7/HBwc/ygoKP8oKCj/ICAg/yIiIv8kJCT/JSUl/yQk + JP8gICD/Hh4e/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/IiIi/zY2 + Nv9MTEz/WFhY/1xcXP9fX1//YmJi/2VlZf9oaGj/a2tr/29vb/9ycnL/dnZ2/3l5ef98fHz/gYGB/4SE + hP+JiYn/jY2N/5GRkf+VlZX/mpqa/56env+ioqL/p6en/6ysrP+wsLD/tbW1/7m5uf+9vb3/wMDA/8PD + w//Gxsb/yMjIMf///wH///8B////Af///wHi4uLj4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/tLS0/7Gxsf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kZGR/4yM + jP+Ghob/gICA/3l5ef9zc3P/bGxs/2ZmZv9YWFj/UlJS/z8/P/83Nzf/Ozs7/09PT/9kZGT/aWlp/2tr + a/9tbW3/eHh4/2FhYf9LS0v/U1NT/0RERP9XV1f/f39//4aGhv+QkJD/6Ojo///////S0tL/R0dH/xwc + HP8nJyf/KSkp/yIiIv8fHx//IyMj/yQkJP8lJSX/JiYm/yUlJf8iIiL/Hx8f/x8fH/8fHx//Hx8f/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/yoqKv9CQkL/VFRU/1xcXP9fX1//YmJi/2Vl + Zf9oaGj/bGxs/29vb/9ycnL/dnZ2/3l5ef9+fn7/gYGB/4aGhv+Kior/jo6O/5KSkv+Xl5f/nJyc/6Cg + oP+mpqb/qqqq/6+vr/+zs7P/t7e3/7y8vP/AwMD/w8PD/8bGxv/IyMgx////Af///wH///8B////AeHh + 4ePg4OD/4ODg/9/f3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0tLS/9DQ + 0P/Ozs7/y8vL/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/rq6u/6ur + q/+np6f/pKSk/6CgoP+bm5v/lpaW/5CQkP+MjIz/hoaG/4CAgP96enr/c3Nz/25ubv9nZ2f/YWFh/1lZ + Wf9VVVX/PT09/zQ0NP85OTn/TU1N/2ZmZv9ra2v/bW1t/3Z2dv+NjY3/kZGR/15eXv9VVVX/QEBA/15e + Xv+Dg4P/jo6O/+Hh4f/8/Pz/1dXV/1dXV/8cHBz/JiYm/ykpKf8hISH/Hx8f/yIiIv8kJCT/JSUl/yYm + Jv8mJib/Jycn/yYmJv8jIyP/ISEh/x8fH/8fHx//Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/yEhIf8wMDD/TExM/1hYWP9eXl7/YWFh/2RkZP9oaGj/a2tr/25ubv9xcXH/dXV1/3p6 + ev99fX3/goKC/4WFhf+Kior/j4+P/5SUlP+ZmZn/np6e/6Ojo/+oqKj/ra2t/7Kysv+3t7f/u7u7/7+/ + v//Dw8P/xsbG/8jIyDH///8B////Af///wH///8B4eHh4+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/19fX/9bW1v/U1NT/09PT/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/Dw8P/wcHB/76+ + vv+8vLz/ubm5/7e3t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/m5ub/5aWlv+RkZH/i4uL/4aG + hv+AgID/enp6/3R0dP9ubm7/aGho/2JiYv9dXV3/W1tb/1paWv9ISEj/QkJC/zo6Ov9KSkr/Z2dn/2xs + bP91dXX/iYmJ/6CgoP+Kior/U1NT/1hYWP9JSUn/PT09/1dXV//X19f//////93d3f9oaGj/Hh4e/yYm + Jv8qKir/Hx8f/x4eHv8hISH/JCQk/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8mJib/Ozs7/1JS + Uv9dXV3/YGBg/2RkZP9nZ2f/ampq/21tbf9xcXH/dXV1/3h4eP99fX3/gYGB/4aGhv+Li4v/kZGR/5eX + l/+bm5v/oaGh/6ampv+srKz/sbGx/7a2tv+7u7v/v7+//8PDw//Gxsb/yMjIMf///wH///8B////Af// + /wHg4ODj4ODg/9/f3//d3d3/3d3d/9vb2//a2tr/2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/0NDQ/87O + zv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv+/v7//vb29/7q6uv+2trb/tLS0/7Kysv+urq7/q6ur/6io + qP+lpaX/oaGh/5ycnP+Xl5f/kZGR/4yMjP+Ghob/gYGB/3t7e/90dHT/b29v/2lpaf9jY2P/Xl5e/1lZ + Wf9cXFz/YGBg/2BgYP9YWFj/PT09/0dHR/9oaGj/cnJy/4aGhv+cnJz/kZGR/1dXV/9NTU3/YWFh/1hY + WP9AQED/NTU1/4uLi//W1tb/cHBw/yEhIf8iIiL/Kioq/yEhIf8eHh7/ISEh/yQkJP8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8mJib/JCQk/yIiIv8gICD/Hx8f/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8gICD/Li4u/0pKSv9aWlr/YGBg/2JiYv9lZWX/aGho/2xs + bP9wcHD/dHR0/3l5ef99fX3/goKC/4iIiP+Ojo7/lJSU/5mZmf+fn5//paWl/6urq/+wsLD/tbW1/7q6 + uv++vr7/w8PD/8bGxv/IyMgx////Af///wH///8B////AeDg4OPf39//3t7e/93d3f/b29v/2tra/9nZ + 2f/X19f/1tbW/9TU1P/T09P/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TExP/CwsL/v7+//729 + vf+6urr/t7e3/7S0tP+ysrL/rq6u/6urq/+oqKj/pKSk/6Ghof+dnZ3/mJiY/5KSkv+MjIz/h4eH/4GB + gf97e3v/b29v/1tbW/9dXV3/YmJi/19fX/9ZWVn/VlZW/15eXv9jY2P/ZWVl/1lZWf87Ozv/R0dH/29v + b/+EhIT/nJyc/5WVlf9QUFD/SkpK/3Jycv+CgoL/aWlp/1FRUf8jIyP/GRkZ/zY2Nv8jIyP/ISEh/yoq + Kv8hISH/HR0d/yIiIv8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/ISEh/zMzM/9PT0//W1tb/19fX/9jY2P/ZmZm/2pqav9ubm7/dHR0/3l5ef9/f3//hYWF/4uL + i/+SkpL/l5eX/52dnf+jo6P/qamp/7CwsP+0tLT/urq6/76+vv/Dw8P/xsbG/8jIyDH///8B////Af// + /wH///8B39/f497e3v/d3d3/3Nzc/9vb2//a2tr/2NjY/9fX1//V1dX/09PT/9LS0v/Q0ND/zs7O/8zM + zP/Kysr/yMjI/8fHx//ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/srKy/6+vr/+rq6v/qKio/6Wl + pf+hoaH/nZ2d/5mZmf+UlJT/jo6O/4iIiP+Dg4P/fHx8/3Nzc/9ZWVn/SkpK/0dHR/9OTk7/WFhY/1ZW + Vv9VVVX/YGBg/2RkZP9nZ2f/Wlpa/zo6Ov9KSkr/fX19/5mZmf+YmJj/YGBg/0ZGRv9oaGj/iYmJ/3t7 + e/+wsLD/hISE/x4eHv8RERH/IiIi/yYmJv8eHh7/IiIi/xwcHP8fHx//IyMj/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8iIiL/ISEh/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/ykpKf8/Pz//VVVV/11d + Xf9hYWH/ZWVl/2pqav9wcHD/dXV1/3x8fP+CgoL/iYmJ/5CQkP+VlZX/nJyc/6Kiov+pqan/r6+v/7Oz + s/+5ubn/vr6+/8PDw//Hx8f/yMjIMf///wH///8B////Af///wHe3t7j3t7e/9zc3P/b29v/2tra/9jY + 2P/X19f/1dXV/9TU1P/S0tL/0NDQ/8/Pz//MzMz/y8vL/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vb29/7u7 + u/+4uLj/tbW1/7Ozs/+vr6//rKys/6ioqP+lpaX/oaGh/52dnf+ZmZn/lJSU/4+Pj/+JiYn/goKC/319 + ff92dnb/ZWVl/05OTv9ISEj/QEBA/0BAQP9QUFD/U1NT/1paWv9jY2P/Z2dn/2hoaP9VVVX/MDAw/09P + T/+Tk5P/mZmZ/2BgYP9FRUX/aGho/4mJif97e3v/r6+v//f39//q6ur/dHR0/xgYGP8fHx//GBgY/xYW + Fv8ZGRn/Hx8f/yQkJP8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x4eHv8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x8fH/8tLS3/RkZG/1hYWP9gYGD/ZWVl/2xsbP9ycnL/eXl5/4CA + gP+Hh4f/jo6O/5SUlP+bm5v/oaGh/6enp/+tra3/s7Oz/7m5uf++vr7/w8PD/8fHx//IyMgx////Af// + /wH///8B////Ad7e3uPd3d3/3Nzc/9ra2v/Z2dn/19fX/9XV1f/U1NT/09PT/9HR0f/Pz8//zc3N/8vL + y//Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+pqan/pqam/6Ki + ov+enp7/mZmZ/5WVlf+QkJD/ioqK/4SEhP99fX3/d3d3/3BwcP9hYWH/UFBQ/0dHR/89PT3/PT09/01N + Tf9UVFT/YGBg/2VlZf9oaGj/ampq/1FRUf8rKyv/SkpK/5CQkP9paWn/RUVF/15eXv+IiIj/f39//6mp + qf/z8/P/+vr6/62trf83Nzf/HR0d/yAgIP8YGBj/Ghoa/x8fH/8lJSX/Jycn/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUl + Jf8kJCT/IiIi/yEhIf8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8kJCT/Nzc3/1RUVP9iYmL/ampq/3BwcP93d3f/fn5+/4WFhf+MjIz/kpKS/5mZmf+goKD/pqam/62t + rf+ysrL/uLi4/76+vv/Dw8P/x8fH/8jIyDH///8B////Af///wH///8B3d3d49zc3P/b29v/2dnZ/9jY + 2P/W1tb/1NTU/9PT0//R0dH/0NDQ/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HBwf++vr7/u7u7/7m5 + uf+2trb/s7Oz/7CwsP+tra3/qqqq/6ampv+ioqL/np6e/5qamv+VlZX/kZGR/4uLi/+FhYX/f39//3d3 + d/9xcXH/a2tr/19fX/9TU1P/RkZG/zo6Ov86Ojr/SkpK/1xcXP9lZWX/Z2dn/2lpaf9sbGz/WVlZ/y8v + L/87Ozv/UlJS/0ZGRv9dXV3/g4OD/4KCgv+ZmZn/8fHx//z8/P+/v7//ODg4/xwcHP8oKCj/JCQk/xwc + HP8fHx//JSUl/ycnJ/8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IyMj/yEhIf8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/LCws/0RERP9iYmL/bW1t/3V1 + df97e3v/fHx8/4ODg/+Pj4//mJiY/56env+lpaX/q6ur/7Gxsf+4uLj/vr6+/8PDw//Hx8f/yMjIMf// + /wH///8B////Af///wHc3Nzj29vb/9ra2v/Y2Nj/1tbW/9XV1f/U1NT/0dHR/9DQ0P/Ozs7/zMzM/8rK + yv/IyMj/xcXF/8PDw//AwMD/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/ra2t/6qqqv+np6f/o6Oj/5+f + n/+bm5v/lpaW/5GRkf+MjIz/hoaG/4CAgP95eXn/cnJy/2xsbP9mZmb/Xl5e/1VVVf9FRUX/Nzc3/zg4 + OP9ISEj/YWFh/2dnZ/9paWn/bGxs/3Z2dv97e3v/QUFB/zY2Nv8wMDD/SkpK/4KCgv+Ghob/mJiY/+rq + 6v/8/Pz/xsbG/0tLS/8aGhr/JiYm/yYmJv8dHR3/ISEh/yYmJv8nJyf/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yUlJf8kJCT/JCQk/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//ICAg/zg4OP9XV1f/b29v/3Fxcf9dXV3/Y2Nj/3l5ef+RkZH/nZ2d/6Oj + o/+qqqr/sbGx/7i4uP+9vb3/w8PD/8fHx//IyMgx////Af///wH///8B////Adzc3OPa2tr/2dnZ/9fX + 1//V1dX/1NTU/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wcHB/7+/v/+8vLz/ubm5/7e3 + t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/nJyc/5iYmP+Tk5P/jY2N/4iIiP+BgYH/e3t7/3R0 + dP9ubm7/aGho/2NjY/9dXV3/WFhY/0RERP81NTX/NTU1/0VFRf9iYmL/aWlp/2tra/90dHT/i4uL/5mZ + mf9cXFz/ODg4/y8vL/88PDz/dHR0/4eHh//q6ur//v7+/9jY2P9WVlb/Gxsb/yUlJf8pKSn/Hh4e/x8f + H/8kJCT/Jycn/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8lJSX/JSUl/yMj + I/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//ISEh/ykp + Kf9ISEj/VVVV/01NTf9fX1//ZWVl/4ODg/+cnJz/o6Oj/6qqqv+wsLD/uLi4/76+vv/Dw8P/x8fH/8jI + yDH///8B////Af///wH///8B2tra49nZ2f/X19f/1tbW/9TU1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJ + yf/Hx8f/xMTE/8LCwv+/v7//vLy8/7q6uv+3t7f/tbW1/7Gxsf+urq7/q6ur/6enp/+lpaX/oKCg/5yc + nP+Xl5f/kpKS/42Njf+IiIj/goKC/3x8fP92dnb/b29v/2lpaf9kZGT/X19f/1xcXP9bW1v/VFRU/09P + T/88PDz/QEBA/2RkZP9ra2v/dHR0/4yMjP+fn5//g4OD/0xMTP8+Pj7/NjY2/ysrK/89PT3/tra2//z8 + /P/c3Nz/UVFR/xkZGf8lJSX/KCgo/x4eHv8fHx//IyMj/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yQkJP8iIiL/ISEh/yAgIP8fHx//Hh4e/x8f + H/8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8oKCj/Ojo6/2BgYP9oaGj/f39//5ub + m/+jo6P/q6ur/7Gxsf+5ubn/vr6+/8TExP/Hx8f/yMjIMf///wH///8B////Af///wHa2trj2NjY/9bW + 1v/V1dX/09PT/9HR0f/Pz8//zs7O/8vLy//Jycn/x8fH/8XFxf/Dw8P/wMDA/729vf+6urr/uLi4/7W1 + tf+ysrL/r6+v/6urq/+oqKj/paWl/6Ghof+dnZ3/mZmZ/5OTk/+Ojo7/iYmJ/4ODg/99fX3/c3Nz/2tr + a/9qamr/ZWVl/2BgYP9cXFz/W1tb/15eXv9hYWH/YWFh/zs7O/8zMzP/ZGRk/3Fxcf+Ghob/n5+f/5GR + kf9NTU3/SkpK/2BgYP9DQ0P/NDQ0/ykpKf9LS0v/n5+f/2pqav8cHBz/IiIi/ykpKf8fHx//Gxsb/yEh + If8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/IyMj/yAgIP8eHh7/Hh4e/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8kJCT/Pj4+/2JiYv+BgYH/nJyc/6Ojo/+rq6v/srKy/7m5uf+/v7//xMTE/8fH + x//IyMgx////Af///wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8jI + yP/Gxsb/w8PD/8HBwf++vr7/u7u7/7i4uP+2trb/srKy/6+vr/+srKz/qKio/6Wlpf+hoaH/np6e/5mZ + mf+UlJT/jo6O/4mJif+EhIT/fX19/3Nzc/9WVlb/TU1N/1ZWVv9fX1//XFxc/1hYWP9bW1v/YWFh/2Rk + ZP9iYmL/OTk5/zIyMv9sbGz/hISE/5ycnP+QkJD/U1NT/0pKSv9ubm7/hoaG/21tbf9SUlL/GRkZ/xIS + Ev8gICD/IyMj/yEhIf8pKSn/IiIi/x8fH/8gICD/IyMj/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/yEh + If8fHx//ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8iIiL/R0dH/4KC + gv+cnJz/pKSk/6ysrP+ysrL/urq6/8DAwP/FxcX/yMjI/8jIyDH///8B////Af///wH///8B19fX49bW + 1v/U1NT/0tLS/9DQ0P/Pz8//zc3N/8vLy//IyMj/xsbG/8PDw//CwsL/v7+//7y8vP+5ubn/tra2/7Oz + s/+wsLD/ra2t/6mpqf+mpqb/oqKi/56env+ZmZn/lJSU/5CQkP+Kior/hISE/35+fv91dXX/XFxc/0tL + S/9ERET/QEBA/09PT/9ZWVn/WFhY/15eXv9jY2P/ZWVl/2JiYv8zMzP/MDAw/319ff+ampr/kpKS/1dX + V/9GRkb/a2tr/4uLi/9+fn7/vb29/8rKyv9NTU3/FRUV/xwcHP8dHR3/GBgY/x0dHf8dHR3/ISEh/yMj + I/8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yMjI/8iIiL/ISEh/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8gICD/ICAg/yEhIf9ERET/hYWF/52dnf+lpaX/rKys/7Ozs/+7u7v/wcHB/8XF + xf/IyMj/ycnJMf///wH///8B////Af///wHW1tbj1dXV/9TU1P/R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//FxcX/wsLC/7+/v/+8vLz/urq6/7e3t/+0tLT/sbGx/62trf+qqqr/pqam/6Kiov+enp7/mpqa/5aW + lv+QkJD/i4uL/4WFhf9+fn7/eXl5/25ubv9UVFT/TExM/0BAQP88PDz/SUlJ/1ZWVv9bW1v/YmJi/2Vl + Zf9nZ2f/YmJi/ywsLP8sLCz/ioqK/5ycnP9eXl7/RERE/2NjY/+IiIj/enp6/7S0tP/4+Pj/8fHx/39/ + f/8gICD/GRkZ/xUVFf8VFRX/Ghoa/yAgIP8jIyP/JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yQkJP8jIyP/ISEh/yAgIP8gICD/ICAg/yAgIP8hISH/ISEh/yEhIf8hISH/ISEh/0BA + QP+FhYX/np6e/6enp/+vr6//tra2/76+vv/CwsL/xsbG/8nJyf/Kysox////Af///wH///8B////AdbW + 1uPU1NT/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/Hx8f/xcXF/8PDw//AwMD/vb29/7q6uv+3t7f/tLS0/7Gx + sf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+VlZX/kZGR/4uLi/+FhYX/f39//3l5ef90dHT/aWlp/1VV + Vf9NTU3/PT09/zg4OP9GRkb/VVVV/2FhYf9lZWX/aGho/2lpaf9mZmb/LS0t/yUlJf9oaGj/ZmZm/0RE + RP9iYmL/hoaG/319ff+pqan/+vr6//f39/+cnJz/Jycn/xwcHP8kJCT/Ghoa/xsbG/8gICD/IyMj/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/yAgIP8hISH/ISEh/yEhIf8hISH/Nzc3/319ff+Xl5f/pqam/7Ozs/+6urr/wMDA/8TE + xP/Hx8f/ysrK/8vLyzH///8B////Af///wH///8B1dXV49PT0//R0dH/z8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/76+vv+8vLz/uLi4/7W1tf+ysrL/r6+v/6ysrP+oqKj/pKSk/6CgoP+bm5v/l5eX/5KS + kv+NjY3/hoaG/4GBgf96enr/dXV1/3BwcP9nZ2f/V1dX/05OTv85OTn/NTU1/0NDQ/9XV1f/ZWVl/2dn + Z/9paWn/bGxs/29vb/8zMzP/JSUl/zQ0NP9AQED/Wlpa/4ODg/98fHz/nZ2d/+/v7//7+/v/t7e3/zc3 + N/8cHBz/KCgo/yUlJf8eHh7/ICAg/yMjI/8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/IiIi/yAgIP8fHx//ICAg/yEhIf8hISH/ISEh/yEh + If8vLy//enp6/42Njf+cnJz/tra2/729vf/BwcH/xMTE/8fHx//Kysr/y8vLMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Nzc3/y8vL/8nJyf/Gxsb/xMTE/8HBwf+/v7//vLy8/7m5uf+1tbX/srKy/6+v + r/+srKz/qKio/6Wlpf+goKD/m5ub/5aWlv+SkpL/jY2N/4iIiP+BgYH/e3t7/3Z2dv9wcHD/a2tr/2Rk + ZP9ZWVn/UFBQ/zc3N/8yMjL/QUFB/1paWv9oaGj/aWlp/21tbf94eHj/jo6O/11dXf8oKCj/Jycn/zg4 + OP93d3f/gICA/5qamv/19fX//v7+/7m5uf86Ojr/Ghoa/ygoKP8mJib/HR0d/yAgIP8jIyP/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8hISH/ICAg/x8fH/8gICD/ISEh/ysrK/95eXn/jY2N/5ubm/+6urr/v7+//8PD + w//Gxsb/ycnJ/8zMzP/MzMwx////Af///wH///8B////AdPT0+PR0dH/z8/P/8zMzP/Kysr/x8fH/8XF + xf/Dw8P/wMDA/729vf+6urr/tra2/7Ozs/+wsLD/ra2t/6mpqf+mpqb/oaGh/52dnf+Xl5f/k5OT/46O + jv+JiYn/hISE/319ff93d3f/cnJy/2xsbP9nZ2f/YWFh/1tbW/9RUVH/Pj4+/zc3N/89PT3/W1tb/2lp + af9ra2v/d3d3/42Njf+goKD/bGxs/y4uLv8mJib/KSkp/01NTf+Li4v/5ubm//7+/v/a2tr/RUVF/xoa + Gv8lJSX/KCgo/x8fH/8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JiYm/yUlJf8hISH/Hh4e/x8f + H/8hISH/LCws/3p6ev+Ojo7/nZ2d/729vf/BwcH/xMTE/8bGxv/Jycn/zMzM/83NzTH///8B////Af// + /wH///8B0tLS49DQ0P/Ozs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/u7u7/7i4uP+0tLT/sbGx/62t + rf+qqqr/pqam/6Kiov+dnZ3/mZmZ/5SUlP+Pj4//ioqK/4WFhf9/f3//dnZ2/3Jycv9tbW3/aGho/2Rk + ZP9eXl7/XV1d/15eXv9eXl7/R0dH/zQ0NP9WVlb/bGxs/3R0dP+NjY3/oKCg/4CAgP9GRkb/Pj4+/ysr + K/8mJib/LCws/3Fxcf/b29v/0dHR/1hYWP8bGxv/JCQk/ykpKf8hISH/Hx8f/yMjI/8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yQkJP8iIiL/Hx8f/x8fH/8pKSn/d3d3/5CQkP+dnZ3/vr6+/8LC + wv/FxcX/yMjI/8vLy//Nzc3/zs7OMf///wH///8B////Af///wHR0dHjz8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/v7+//7y8vP+5ubn/tra2/7Kysv+vr6//q6ur/6enp/+jo6P/n5+f/5mZmf+VlZX/kJCQ/4qK + iv+FhYX/gICA/3Nzc/9cXFz/YmJi/2dnZ/9kZGT/YGBg/1xcXP9fX1//YmJi/2VlZf9ISEj/Kysr/1JS + Uv9zc3P/h4eH/56env+FhYX/S0tL/0xMTP9wcHD/VVVV/yoqKv8gICD/Ghoa/09PT/9nZ2f/ISEh/yMj + I/8oKCj/ICAg/yEhIf8kJCT/Jycn/yYmJv8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/IiIi/y0tLf97e3v/kZGR/56env+/v7//xMTE/8fHx//Jycn/zMzM/87Ozv/Pz88x////Af// + /wH///8B////Ac/Pz+POzs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/urq6/7e3t/+0tLT/sLCw/6ys + rP+oqKj/pKSk/6CgoP+cnJz/lpaW/5GRkf+MjIz/hoaG/4GBgf91dXX/W1tb/0tLS/9KSkr/UlJS/15e + Xv9cXFz/XFxc/2FhYf9lZWX/Z2dn/0VFRf8pKSn/VlZW/4aGhv+dnZ3/kJCQ/1BQUP9GRkb/bm5u/4iI + iP91dXX/dHR0/yAgIP8LCwv/KSkp/2tra/8pKSn/JSUl/yAgIP8fHx//JCQk/ycnJ/8mJib/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8rKyv/WVlZ/42Njf+SkpL/np6e/8DA + wP/FxcX/yMjI/8vLy//Nzc3/z8/P/9DQ0DH///8B////Af///wH///8Bzs7O48zMzP/Kysr/x8fH/8XF + xf/CwsL/v7+//7u7u/+4uLj/tbW1/7Gxsf+urq7/qamp/6Wlpf+hoaH/nJyc/5iYmP+RkZH/jY2N/4aG + hv+AgID/enp6/2RkZP9PT0//SEhI/0NDQ/9ERET/V1dX/1lZWf9gYGD/ZWVl/2dnZ/9paWn/QUFB/yYm + Jv9jY2P/np6e/5OTk/9TU1P/RUVF/2tra/+IiIj/dnZ2/87Ozv/4+Pj/nJyc/x8fH/8eHh7/IiIi/xMT + E/8YGBj/Hh4e/yMjI/8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/0lJSf+EhIT/k5OT/5OTk/+kpKT/w8PD/8bGxv/Kysr/y8vL/87Ozv/Q0ND/0dHRMf// + /wH///8B////Af///wHNzc3jy8vL/8nJyf/Gxsb/xMTE/8DAwP+9vb3/urq6/7a2tv+zs7P/rq6u/6ur + q/+np6f/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/gICA/3p6ev90dHT/YGBg/1FRUf9GRkb/Pz8//0JC + Qv9VVVX/Wlpa/2RkZP9mZmb/aWlp/2tra/89PT3/Hx8f/1tbW/+ampr/Xl5e/0JCQv9jY2P/hoaG/3p6 + ev+zs7P//Pz8//b29v+NjY3/Hx8f/x0dHf8VFRX/FBQU/x0dHf8gICD/IyMj/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQkJP8kJCT/Hx8f/zg4OP9+fn7/mZmZ/7W1 + tf/Gxsb/yMjI/8vLy//Nzc3/z8/P/9HR0f/S0tIx////Af///wH///8B////AczMzOPKysr/yMjI/8XF + xf/CwsL/vr6+/7u7u/+3t7f/s7Oz/7CwsP+srKz/qKio/6Ojo/+enp7/mZmZ/5SUlP+Pj4//iIiI/4KC + gv96enr/dHR0/25ubv9dXV3/VVVV/0RERP88PDz/Pj4+/1RUVP9gYGD/Z2dn/2lpaf9ra2v/bm5u/0FB + Qf8eHh7/MzMz/1VVVf9BQUH/Y2Nj/4WFhf95eXn/s7Oz//f39//z8/P/lJSU/yIiIv8cHBz/Jycn/x4e + Hv8bGxv/ICAg/yEhIf8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8jIyP/ISEh/w8PD/8CAgL/JSUl/4mJif+xsbH/w8PD/8fHx//Jycn/y8vL/83Nzf/Q0ND/0tLS/9LS + 0jH///8B////Af///wH///8BzMzM48nJyf/Gxsb/w8PD/8DAwP+8vLz/ubm5/7W1tf+xsbH/ra2t/6mp + qf+lpaX/oKCg/5ubm/+VlZX/kJCQ/4qKiv+Dg4P/fX19/3Z2dv9wcHD/a2tr/15eXv9YWFj/Q0ND/zg4 + OP88PDz/VFRU/2RkZP9paWn/a2tr/25ubv97e3v/Xl5e/x8fH/8hISH/NjY2/1hYWP+Dg4P/fHx8/6Gh + of/19fX//v7+/6enp/8wMDD/Ghoa/yYmJv8jIyP/Gxsb/x0dHf8hISH/IyMj/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8RERH/AwMD/yUlJf9vb2//r6+v/8HB + wf/FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PTMf///wH///8B////Af///wHLy8vjyMjI/8bG + xv/CwsL/v7+//7u7u/+3t7f/s7Oz/66urv+qqqr/pqam/6Kiov+cnJz/lpaW/5GRkf+Li4v/hYWF/35+ + fv94eHj/cnJy/21tbf9paWn/X19f/1tbW/9CQkL/Nzc3/zk5Of9TU1P/ZmZm/2tra/9ubm7/e3t7/5OT + k/+Hh4f/LCws/x8fH/8wMDD/YWFh/4GBgf+cnJz/7e3t//r6+v++vr7/MTEx/xoaGv8mJib/JSUl/x4e + Hv8fHx//ISEh/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQk + JP8nJyf/FxcX/wMDA/8eHh7/e3t7/6Ghof+/v7//xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT + 0//U1NQx////Af///wH///8B////AcrKyuPHx8f/xMTE/8DAwP+9vb3/ubm5/7W1tf+xsbH/rKys/6io + qP+ioqL/np6e/5iYmP+SkpL/jIyM/4aGhv+AgID/eHh4/3Nzc/9ubm7/ampq/2VlZf9fX1//Xl5e/1BQ + UP9JSUn/Nzc3/1BQUP9oaGj/bW1t/3h4eP+SkpL/oKCg/3R0dP8xMTH/Hx8f/yIiIv8zMzP/bGxs/+Xl + 5f/8/Pz/vLy8/0FBQf8ZGRn/JSUl/yQkJP8fHx//ICAg/yIiIv8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/xcXF/8DAwP/Hh4e/29vb/+kpKT/vb29/8LC + wv/ExMT/x8fH/8nJyf/Ly8v/zs7O/9DQ0P/S0tL/1NTU/9XV1TH///8B////Af///wH///8ByMjI48bG + xv/Dw8P/v7+//7y8vP+3t7f/s7Oz/6+vr/+qqqr/pqam/6CgoP+bm5v/lJSU/46Ojv+IiIj/goKC/3V1 + df9ubm7/b29v/2xsbP9nZ2f/YmJi/19fX/9hYWH/Y2Nj/1lZWf8yMjL/Q0ND/2hoaP92dnb/jIyM/5+f + n/+AgID/RkZG/0RERP84ODj/HR0d/yEhIf83Nzf/kJCQ/8XFxf9MTEz/GRkZ/yQkJP8lJSX/HR0d/x8f + H/8iIiL/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JSUl/ycn + J/8XFxf/BAQE/xEREf9mZmb/np6e/7u7u//CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/1tbWMf///wH///8B////Af///wHIyMjjxMTE/8HBwf+9vb3/urq6/7W1tf+xsbH/rKys/6en + p/+ioqL/m5ub/5aWlv+QkJD/ioqK/4ODg/90dHT/WFhY/09PT/9ZWVn/ZGRk/2RkZP9hYWH/YWFh/2Rk + ZP9nZ2f/W1tb/y4uLv88PDz/b29v/42Njf+hoaH/g4OD/0ZGRv9MTEz/dnZ2/3t7e/9BQUH/ISEh/w8P + D/8UFBT/QEBA/yEhIf8gICD/JiYm/x0dHf8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8uLi7/QUFB/y0tLf8hISH/aWlp/6SkpP+7u7v/wcHB/8PD + w//FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/X19cx////Af///wH///8B////AcbG + xuPExMT/wMDA/729vf+4uLj/s7Oz/6+vr/+pqan/pKSk/5+fn/+ZmZn/kpKS/4uLi/+FhYX/fHx8/2Fh + Yf9PT0//SEhI/0ZGRv9WVlb/YmJi/2BgYP9kZGT/ZmZm/2lpaf9aWlr/Kioq/0NDQ/+CgoL/oKCg/5GR + kf9KSkr/RkZG/29vb/+Ghob/e3t7/8DAwP95eXn/ExMT/xQUFP84ODj/ISEh/xwcHP8eHh7/Hh4e/yIi + Iv8kJCT/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/Kioq/0RE + RP9WVlb/e3t7/4KCgv+vr6//u7u7/8DAwP/CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9jY2DH///8B////Af///wH///8BxsbG48PDw/+/v7//u7u7/7e3t/+xsbH/rKys/6am + pv+hoaH/nJyc/5WVlf+Ojo7/hoaG/4CAgP92dnb/WVlZ/1FRUf9FRUX/QkJC/1JSUv9gYGD/YmJi/2dn + Z/9paWn/a2tr/1ZWVv8lJSX/RkZG/5WVlf+RkZH/UlJS/0ZGRv9qamr/hYWF/319ff/Kysr//f39/9/f + 3/9CQkL/HBwc/xsbG/8SEhL/FhYW/xwcHP8iIiL/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IyMj/yQkJP8nJyf/Kysr/zAwMP80NDT/NDQ0/zIyMv8uLi7/KSkp/yYmJv8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8qKir/PT09/1JSUv+IiIj/np6e/7u7u/+/v7//wcHB/8PD + w//FxcX/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/Y2Nj/2dnZMf///wH///8B////Af// + /wHFxcXjwsLC/729vf+5ubn/tbW1/6+vr/+qqqr/pKSk/5+fn/+ZmZn/kZGR/4qKiv+CgoL/e3t7/3Nz + c/9bW1v/U1NT/0FBQf8/Pz//UVFR/2BgYP9mZmb/aWlp/2tra/9tbW3/WFhY/yMjI/81NTX/f39//1ZW + Vv9BQUH/ZmZm/4aGhv96enr/u7u7//n5+f/s7Oz/gICA/xwcHP8fHx//Gxsb/xQUFP8aGhr/ISEh/yYm + Jv8lJSX/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/ygoKP85OTn/WVlZ/3Fxcf+EhIT/lZWV/52d + nf+dnZ3/mJiY/46Ojv9+fn7/ampq/09PT/85OTn/JiYm/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hh4e/wsL + C/8UFBT/WVlZ/5aWlv+zs7P/vr6+/8DAwP/Dw8P/xcXF/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9nZ2f/a2tox////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+0tLT/rq6u/6io + qP+ioqL/nJyc/5aWlv+Ojo7/hoaG/319ff93d3f/b29v/1xcXP9UVFT/PT09/zs7O/9PT0//Y2Nj/2lp + af9sbGz/bm5u/3Jycv9kZGT/JCQk/yEhIf86Ojr/QEBA/11dXf+FhYX/fn5+/7CwsP/5+fn/9vb2/4eH + h/8kJCT/HBwc/yYmJv8hISH/HR0d/yEhIf8mJib/JiYm/yUlJf8kJCT/IyMj/yMjI/8jIyP/JiYm/zIy + Mv9fX1//jY2N/6ysrP++vr7/xcXF/8nJyf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8nJyf/FxcX/vb29/6ur + q/99fX3/VFRU/zExMf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8lJSX/IyMj/yMjI/8LCwv/BgYG/0FBQf+Li4v/srKy/729vf/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1dXV/9bW1v/Y2Nj/2tra/9ra2jH///8B////Af// + /wH///8BxMTE48DAwP+8vLz/t7e3/7Kysv+srKz/p6en/6Ghof+ampr/k5OT/4uLi/+Dg4P/enp6/3R0 + dP9tbW3/X19f/1VVVf86Ojr/ODg4/09PT/9lZWX/bGxs/25ubv9ycnL/goKC/4eHh/8yMjL/Hh4e/ysr + K/9OTk7/gICA/39/f/+qqqr/9vb2//Pz8/+ampr/Hh4e/xoaGv8lJSX/IiIi/x4eHv8iIiL/JiYm/yYm + Jv8lJSX/JCQk/yMjI/8jIyP/IyMj/zAwMP9nZ2f/o6Oj/8XFxf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8vL + y//Ly8v/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/FxcX/m5ub/11dXf8uLi7/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8jIyP/CwsL/wYG + Bv85OTn/kJCQ/7Kysv+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9TU + 1P/V1dX/19fX/9nZ2f/a2tr/29vbMf///wH///8B////Af///wHExMTjwMDA/7u7u/+2trb/sbGx/6ur + q/+mpqb/oKCg/5mZmf+SkpL/iYmJ/4GBgf95eXn/dHR0/25ubv9iYmL/VlZW/0JCQv88PDz/T09P/2dn + Z/9vb2//cXFx/319ff+Xl5f/oaGh/0tLS/8dHR3/IyMj/0BAQP9lZWX/nJyc//Dw8P/6+vr/rKys/zMz + M/8YGBj/JSUl/yEhIf8cHBz/ISEh/yYmJv8mJib/JSUl/yQkJP8jIyP/IyMj/yMjI/9AQED/jY2N/8DA + wP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ly8v/vLy8/4GBgf89PT3/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yUlJf8kJCT/Kysr/xISEv8CAgL/Ly8v/4WFhf+tra3/vLy8/7+/v//BwcH/w8PD/8bG + xv/Hx8f/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//c3Nwx////Af// + /wH///8B////AcPDw+O/v7//u7u7/7W1tf+wsLD/qqqq/6Wlpf+enp7/l5eX/4yMjP+Hh4f/gYGB/3l5 + ef91dXX/b29v/2ZmZv9nZ2f/Z2dn/0lJSf9BQUH/ZWVl/3Jycv9/f3//lZWV/6Kiov91dXX/Ozs7/yws + LP8dHR3/JSUl/zg4OP+rq6v/7+/v/66urv8uLi7/GBgY/yUlJf8jIyP/HBwc/yAgIP8lJSX/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8qKir/XV1d/7W1tf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/7Cw + sP9nZ2f/KSkp/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/ycnJ/8PDw//AQEB/zIy + Mv+Hh4f/rKys/729vf+/v7//wcHB/8PDw//FxcX/x8fH/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9TU + 1P/W1tb/19fX/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8Bw8PD48DAwP+7u7v/tbW1/7Cw + sP+pqan/pKSk/52dnf+Li4v/bW1t/3Nzc/99fX3/e3t7/3h4eP9xcXH/aGho/2pqav9paWn/RUVF/zU1 + Nf9gYGD/e3t7/5OTk/+jo6P/fn5+/0VFRf9MTEz/ZGRk/zY2Nv8aGhr/HBwc/y4uLv9ycnL/Q0ND/xYW + Fv8iIiL/IyMj/xwcHP8fHx//IyMj/yUlJf8lJSX/JCQk/yQkJP8jIyP/KCgo/2lpaf+1tbX/zMzM/8zM + zP/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/7u7u/9mZmb/Kioq/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yQkJP8pKSn/FxcX/wEBAf8dHR3/fX19/6ioqP+6urr/vr6+/8DAwP/Dw8P/xcXF/8bG + xv/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3d3dMf// + /wH///8B////Af///wHDw8Pjv7+//7q6uv+0tLT/r6+v/6mpqf+jo6P/lJSU/21tbf9aWlr/VVVV/19f + X/94eHj/eXl5/3Jycv9sbGz/bm5u/2xsbP9ERET/MzMz/2pqav+Pj4//oqKi/4aGhv9BQUH/SUlJ/3R0 + dP+BgYH/b29v/1BQUP8VFRX/DQ0N/zs7O/9DQ0P/HR0d/yQkJP8bGxv/HR0d/yIiIv8kJCT/JCQk/yQk + JP8kJCT/IyMj/yUlJf9kZGT/u7u7/8rKyv/Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/8rK + yv/Kysr/ycnJ/7W1tf9dXV3/JSUl/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8lJSX/MzMz/0tLS/9TU1P/SUlJ/4GB + gf+rq6v/urq6/76+vv/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zs7O/8/Pz//R0dH/09PT/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/e3t4x////Af///wH///8B////AcPDw+O/v7//urq6/7W1 + tf+vr6//qamp/6Ojo/+Hh4f/Y2Nj/1dXV/9NTU3/UlJS/3h4eP96enr/cXFx/3BwcP9xcXH/bm5u/z8/ + P/8xMTH/eXl5/6Ghof+Hh4f/SkpK/0ZGRv9ubm7/g4OD/4KCgv/R0dH/3d3d/2hoaP8SEhL/IyMj/x0d + Hf8UFBT/GBgY/xwcHP8gICD/IiIi/yQkJP8kJCT/JCQk/yQkJP8jIyP/Q0ND/6+vr//Kysr/ysrK/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/y8vL/8vLy//Ly8v/y8vL/8rKyv/Kysr/ysrK/8rKyv/Kysr/ycnJ/7Gxsf9DQ0P/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/y0tLf9ERET/U1NT/3Nzc/+Kior/rq6u/7u7u/+9vb3/v7+//8LCwv/ExMT/xsbG/8jI + yP/Kysr/y8vL/83Nzf/Pz8//0dHR/9LS0v/U1NT/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3t7e/9/f + 3zH///8B////Af///wH///8BxMTE48DAwP+7u7v/tra2/7CwsP+pqan/o6Oj/4WFhf9nZ2f/VVVV/0hI + SP9PT0//enp6/3l5ef9zc3P/c3Nz/3R0dP9ubm7/Ozs7/ywsLP95eXn/k5OT/01NTf9CQkL/bGxs/4eH + h/97e3v/ycnJ//v7+//d3d3/X19f/xcXF/8YGBj/EhIS/xYWFv8bGxv/ICAg/yIiIv8jIyP/JCQk/yQk + JP8kJCT/JCQk/zAwMP+Hh4f/yMjI/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/ysrK/8rK + yv/Kysr/ysrK/8rKyv/Kysr/ycnJ/4qKiv8uLi7/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8mJib/HR0d/x8fH/9FRUX/enp6/56e + nv+3t7f/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1NTU/9XV + 1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/93d3f/f39//39/fMf///wH///8B////Af///wHExMTjwcHB/7y8 + vP+2trb/sbGx/6mpqf+jo6P/iIiI/2tra/9TU1P/RERE/0xMTP95eXn/d3d3/3V1df92dnb/d3d3/3Nz + c/8+Pj7/JCQk/0xMTP9RUVH/QUFB/2VlZf+Hh4f/eXl5/8fHx//+/v7/6Ojo/2RkZP8aGhr/Hh4e/yQk + JP8bGxv/HBwc/yEhIf8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/XFxc/76+vv/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Kysr/ysrK/8rKyv/Kysr/ysrK/8vLy//Ly8v/vLy8/1dX + V/8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8jIyP/IiIi/xkZGf8EBAT/ExMT/21tbf+goKD/uLi4/7y8vP++vr7/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Kysr/zc3N/87Ozv/Q0ND/0dHR/9PT0//V1dX/1tbW/9jY2P/Z2dn/2tra/9vb2//d3d3/3t7e/9/f + 3//g4OAx////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+ysrL/q6ur/6SkpP+Hh4f/bm5u/1BQ + UP9CQkL/TU1N/3t7e/93d3f/eHh4/3h4eP97e3v/g4OD/01NTf8iIiL/MDAw/0RERP9gYGD/hYWF/3V1 + df+vr6//+Pj4//Hx8f+IiIj/Hh4e/xwcHP8lJSX/Hx8f/x0dHf8gICD/IiIi/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf+SkpL/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zs7O/87Ozv/Ozs7/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/Jycn/hoaG/ywsLP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8bGxv/BAQE/wcHB/9RUVH/mZmZ/7S0 + tP+8vLz/vr6+/8DAwP/Dw8P/xcXF/8fHx//IyMj/ysrK/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9bW + 1v/X19f/2NjY/9ra2v/b29v/3d3d/97e3v/f39//4ODg/+Hh4TH///8B////Af///wH///8BxMTE48LC + wv++vr7/uLi4/7Ozs/+tra3/pqam/4iIiP9xcXH/T09P/0JCQv9LS0v/e3t7/3p6ev96enr/fX19/4iI + iP+enp7/eXl5/yUlJf8sLCz/Wlpa/3x8fP92dnb/srKy//j4+P/w8PD/ioqK/yIiIv8bGxv/JSUl/x8f + H/8cHBz/ICAg/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MjIy/7q6uv/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zc3N/83N + zf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/MzMz/zMzM/83N + zf+urq7/OTk5/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8iIiL/Gxsb/wYGBv8ODg7/UVFR/5mZmf+1tbX/u7u7/76+vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8rK + yv/MzMz/zs7O/9DQ0P/R0dH/09PT/9TU1P/V1dX/2NjY/9nZ2f/a2tr/29vb/9zc3P/e3t7/39/f/+Dg + 4P/h4eH/4eHhMf///wH///8B////Af///wHExMTjwsLC/76+vv+6urr/tbW1/66urv+oqKj/ioqK/3d3 + d/9oaGj/Xl5e/05OTv94eHj/fX19/35+fv+IiIj/mpqa/5+fn/9kZGT/KCgo/yAgIP9KSkr/aWlp/5WV + lf/29vb/+vr6/56env8oKCj/GRkZ/yUlJf8hISH/HBwc/yAgIP8iIiL/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP9LS0v/ysrK/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8HBwf9OTk7/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8kJCT/JSUl/x8fH/8HBwf/BgYG/05OTv+Pj4//r6+v/7u7 + u/+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Pz8//0dHR/9PT0//U1NT/1dXV/9fX + 1//Y2Nj/2tra/9vb2//d3d3/3d3d/97e3v/g4OD/4eHh/+Li4v/i4uIx////Af///wH///8B////AcTE + xOPCwsL/v7+//7u7u/+3t7f/sbGx/6qqqv+Kior/e3t7/3x8fP9sbGz/Pj4+/1lZWf9+fn7/iIiI/5ub + m/+jo6P/bm5u/z8/P/9GRkb/MTEx/yYmJv9JSUn/YGBg/7Gxsf+qqqr/Ly8v/xgYGP8kJCT/IiIi/x0d + Hf8fHx//IiIi/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/2BgYP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87O + zv/Ozs7/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/ysrK/11dXf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JCQk/yQk + JP8fHx//CQkJ/wcHB/9FRUX/kJCQ/62trf+6urr/vLy8/7+/v//BwcH/xMTE/8bGxv/IyMj/ysrK/8zM + zP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9ra2v/b29v/3Nzc/93d3f/e3t7/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4zH///8B////Af///wH///8BxcXF48LCwv+/v7//vLy8/7i4uP+zs7P/qqqq/4iI + iP9+fn7/fn5+/2lpaf83Nzf/VlZW/4aGhv+YmJj/oaGh/3x8fP8+Pj7/TU1N/3h4eP9oaGj/NjY2/xkZ + Gf8TExP/IyMj/z4+Pv8eHh7/IiIi/yQkJP8cHBz/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/aGho/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/a2tr/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yQkJP8mJib/NjY2/y0tLf8aGhr/Q0ND/5GRkf+urq7/ubm5/7y8 + vP+/v7//wcHB/8PDw//FxcX/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/09PT/9TU1P/V1dX/19fX/9jY + 2P/Z2dn/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTkMf///wH///8B////Af// + /wHFxcXjwsLC/7+/v/+8vLz/uLi4/7S0tP+jo6P/hISE/4CAgP+AgID/aWlp/zY2Nv9cXFz/l5eX/6Oj + o/+AgID/RUVF/0lJSf9ycnL/g4OD/4ODg/+1tbX/S0tL/w4ODv8iIiL/Ozs7/x8fH/8eHh7/Hh4e/x4e + Hv8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP9hYWH/zMzM/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zc3N/8vLy/9qamr/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8kJCT/JCQk/zQ0 + NP9MTEz/X19f/2pqav+SkpL/s7Oz/7m5uf+7u7v/vr6+/8DAwP/Dw8P/xcXF/8fHx//Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Tk5P/k5OQx////Af///wH///8B////AcbGxuPDw8P/wMDA/7y8vP+5ubn/sbGx/5KS + kv+CgoL/goKC/4GBgf9lZWX/NDQ0/1xcXP+ioqL/iIiI/0VFRf9ERET/dHR0/4SEhP+BgYH/3t7e//z8 + /P+wsLD/Li4u/ycnJ/8bGxv/FBQU/xoaGv8gICD/JSUl/yYmJv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/1FRUf/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/x8fH/1xcXP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/LS0t/0RERP9oaGj/hoaG/6+vr/+5ubn/vLy8/76+ + vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8vLy//Nzc3/z8/P/9DQ0P/S0tL/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+Xl5TH///8B////Af// + /wH///8BxsbG48TExP/BwcH/vb29/7q6uv+np6f/h4eH/4ODg/+Dg4P/g4OD/2VlZf8zMzP/Q0ND/4CA + gP9MTEz/QkJC/2hoaP+Hh4f/enp6/9DQ0P/9/f3/4ODg/1VVVf8ZGRn/Hx8f/xkZGf8WFhb/Hh4e/yUl + Jf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Ojo6/8HB + wf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP+8vLz/R0dH/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8iIiL/IiIi/xAQ + EP8GBgb/NjY2/4GBgf+hoaH/ubm5/7u7u/++vr7/wMDA/8LCwv/ExMT/xsbG/8nJyf/Ly8v/zc3N/8/P + z//Q0ND/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Xl5f/l5eX/5ubmMf///wH///8B////Af///wHHx8fjxMTE/8HBwf++vr7/u7u7/5iY + mP+EhIT/hYWF/4WFhf+IiIj/dnZ2/zc3N/8sLCz/RUVF/0NDQ/9paWn/hYWF/319ff/IyMj/+/v7/+Dg + 4P9lZWX/FhYW/x0dHf8kJCT/Hh4e/x8fH/8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8mJib/n5+f/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/ysrK/5ycnP8yMjL/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IiIi/yEhIf8TExP/AwMD/yoqKv+BgYH/qamp/7i4uP+8vLz/vr6+/8DA + wP/CwsL/xMTE/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9vb + 2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5uYx////Af// + /wH///8B////AcjIyOPFxcX/wsLC/7+/v/+8vLz/k5OT/4WFhf+Ghob/iIiI/5KSkv+Ojo7/QkJC/yoq + Kv9eXl7/cHBw/4ODg/93d3f/vr6+//n5+f/n5+f/dHR0/xwcHP8cHBz/JSUl/x4eHv8fHx//JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP9wcHD/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//FxcX/eHh4/ykpKf8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8hISH/ExMT/wMD + A/8bGxv/dHR0/6Wlpf+4uLj/vLy8/76+vv/AwMD/wsLC/8TExP/Gxsb/ycnJ/8vLy//Nzc3/z8/P/9DQ + 0P/S0tL/09PT/9XV1f/X19f/2NjY/9nZ2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj + 4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5zH///8B////Af///wH///8ByMjI48bGxv/ExMT/wcHB/729 + vf+SkpL/hoaG/4iIiP+RkZH/oKCg/5eXl/9HR0f/JSUl/1JSUv+Li4v/gICA/66urv/6+vr/8fHx/3x8 + fP8eHh7/Gxsb/yUlJf8fHx//Hh4e/yIiIv8kJCT/JCQk/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/z4+Pv+np6f/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/7CwsP9JSUn/JCQk/yQk + JP8kJCT/JCQk/yQkJP8jIyP/IyMj/xgYGP8EBAT/ExMT/2dnZ/+ampr/tra2/7y8vP++vr7/wMDA/8LC + wv/ExMT/xsbG/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/5+fnMf// + /wH///8B////Af///wHJycnjx8fH/8XFxf/CwsL/vr6+/5KSkv+JiYn/kZGR/6CgoP+fn5//Y2Nj/zo6 + Ov8sLCz/Kioq/21tbf+QkJD/w8PD/+zs7P+RkZH/Hh4e/xoaGv8kJCT/ICAg/x0dHf8gICD/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/KCgo/2dnZ//CwsL/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vL + y//Ly8v/y8vL/8vLy//Gxsb/ZmZm/ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8XFxf/BAQE/xkZ + Gf9oaGj/np6e/7S0tP+8vLz/vr6+/8DAwP/CwsL/xMTE/8fHx//IyMj/y8vL/8zMzP/Ozs7/0NDQ/9LS + 0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Ogx////Af///wH///8B////AcrKyuPIyMj/xsbG/8PD + w/+/v7//kpKS/5CQkP+dnZ3/o6Oj/3R0dP88PDz/Tk5O/2FhYf8vLy//LCws/z4+Pv8+Pj7/cHBw/zAw + MP8ZGRn/IyMj/yEhIf8dHR3/ICAg/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Li4u/5OTk//MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/y8vL/8vLy//Ly8v/ycnJ/56env8xMTH/JCQk/yQk + JP8kJCT/IyMj/yMjI/8mJib/ISEh/wcHB/8KCgr/YWFh/5mZmf+2trb/vLy8/76+vv/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/29vb/9zc + 3P/e3t7/39/f/+Dg4P/h4eH/4eHh/+Pj4//j4+P/5OTk/+Xl5f/l5eX/5ubm/+fn5//o6Oj/6Ojo/+np + 6TH///8B////Af///wH///8By8vL48nJyf/Hx8f/xcXF/7+/v/+YmJj/np6e/6Ojo/9ycnL/PT09/1JS + Uv96enr/fX19/3p6ev9RUVH/ERER/xISEv9MTEz/Pz8//yEhIf8iIiL/Hx8f/x8fH/8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/Nzc3/5WVlf/IyMj/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/y8vL/8rKyv+dnZ3/QEBA/yQkJP8kJCT/JCQk/yQkJP8jIyP/KSkp/0FBQf9RUVH/U1NT/2lp + af+qqqr/tra2/729vf+/v7//wcHB/8PDw//ExMT/x8fH/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9PT + 0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Li4v/i4uL/5OTk/+Tk + 5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+np6f/p6en/6enpMf///wH///8B////Af///wHMzMzjysrK/8jI + yP/Gxsb/wcHB/6Ojo/+mpqb/fX19/0FBQf9HR0f/dnZ2/4GBgf+Ghob/4eHh/9PT0/9MTEz/KSkp/zMz + M/8gICD/Ghoa/xwcHP8gICD/ISEh/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/QEBA/5aW + lv/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Kysr/qamp/0lJSf8mJib/JCQk/yQk + JP8kJCT/IyMj/yQkJP8zMzP/SkpK/1tbW/94eHj/mJiY/7q6uv+8vLz/v7+//8HBwf/Dw8P/xcXF/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3Nzc/93d + 3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq + 6v/q6uox////Af///wH///8B////Ac3NzePLy8v/ycnJ/8fHx//ExMT/rKys/4SEhP9ERET/R0dH/29v + b/+CgoL/hYWF/+Li4v/7+/v/wMDA/zY2Nv8eHh7/HR0d/xISEv8ZGRn/Hh4e/yEhIf8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MzMz/4KCgv+6urr/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/v7+//4qKiv9AQED/JSUl/yQkJP8kJCT/JCQk/yMjI/8iIiL/ICAg/xISEv8nJyf/YWFh/42N + jf+ysrL/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU + 1P/W1tb/19fX/9nZ2f/a2tr/29vb/93d3f/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6zH///8B////Af///wH///8Bz8/P483N + zf/Kysr/yMjI/8bGxv+jo6P/SkpK/0NDQ/9sbGz/goKC/35+fv/R0dH/+/v7/8zMzP9KSkr/ExMT/x0d + Hf8hISH/GRkZ/x4eHv8hISH/IiIi/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yQiIf8iIiL/IiIi/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/LCws/1dXV/+jo6P/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/x8fH/6mpqf9kZGT/Ly8v/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IiIi/x4eHv8LCwv/BwcH/0BAQP+QkJD/sbGx/729vf/AwMD/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Ly8v/zMzM/87Ozv/Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq + 6v/r6+v/6+vrMf///wH///8B////Af///wHPz8/jzs7O/8zMzP/Kysr/yMjI/7e3t/9vb2//aGho/4OD + g/94eHj/y8vL//v7+//T09P/VFRU/xcXF/8dHR3/IyMj/xwcHP8dHR3/ISEh/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv86Ih7/ciQW/0AhHP8jISH/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JiYm/zo6Ov9oaGj/o6Oj/8HB + wf/Jycn/zMzM/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Jycn/xMTE/62t + rf9wcHD/Pz8//ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8gICD/DAwM/wMDA/89PT3/h4eH/7Cw + sP+9vb3/v7+//8LCwv/ExMT/xsbG/8fHx//Jycn/y8vL/83Nzf/Pz8//0NDQ/9LS0v/T09P/1NTU/9bW + 1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Owx////Af///wH///8B////AdHR + 0ePPz8//zc3N/8vLy//Jycn/x8fH/7W1tf+SkpL/e3t7/76+vv/+/v7/5OTk/1paWv8UFBT/HBwc/yQk + JP8bGxv/HBwc/yEhIf8kJCT/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/NSIe/5EnFP/CLBH/ZCUa/yYi + If8iIiL/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8tLS3/TU1N/3Z2dv+goKD/rq6u/7q6uv/BwcH/yMjI/8nJ + yf/Hx8f/xcXF/729vf+urq7/m5ub/3p6ev9VVVX/MzMz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMj + I/8iIiL/ICAg/w4ODv8CAgL/Kioq/42Njf+tra3/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/d3d3/3t7e/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+np6f/p6en/6urq/+vr + 6//r6+v/7Ozs/+zs7DH///8B////Af///wH///8B0tLS49DQ0P/Ozs7/zMzM/8vLy//Jycn/xsbG/7Ky + sv+xsbH/9PT0/+np6f98fHz/GRkZ/xkZGf8jIyP/Hx8f/xwcHP8hISH/JSUl/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/ykhIP9/JRX/xCwR/4UoGP8qIiH/IiIi/yIiIv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/KCgo/zY2Nv9AQED/TExM/1lZWf9qamr/bW1t/2hoaP9iYmL/UVFR/0FBQf8zMzP/KCgo/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yEhIf8QEBD/AgIC/yAgIP90dHT/qqqq/7y8 + vP/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/0tLS/9PT0//U1NT/1tbW/9fX + 1//Z2dn/2tra/9zc3P/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4uLi/+Pj4//k5OT/5eXl/+bm + 5v/m5ub/5+fn/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7OzsMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/wsLC/5GRkf+kpKT/cHBw/xsbG/8ZGRn/IiIi/x8f + H/8eHh7/IyMj/yYmJv8lJSX/IyMj/yIiIv8iIiL/IiIi/yIiIv8sIR//eSYX/8UtEf+CKBj/LiIg/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yQiIv8jIyP/IyMj/yMjI/8jIiL/LCIh/0sjHP9vJRj/NSIf/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yQk + JP8nJyf/ERER/wICAv8lJSX/fX19/6ampv++vr7/wcHB/8PDw//ExMT/xsbG/8jIyP/Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3d3d/93d3f/e3t7/39/f/+Dg + 4P/h4eH/4uLi/+Pj4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+3t7f/t7e0x////Af///wH///8B////AdXV1ePT09P/0dHR/8/Pz//Nzc3/zMzM/8rK + yv/BwcH/aGho/zs7O/9DQ0P/ISEh/yIiIv8eHh7/HR0d/yIiIv8mJib/JSUl/yMjI/8iIiL/IiIi/yIi + Iv8hISH/JCEh/3QlF//DLBD/tSsS/z4iHf8iISH/IiIi/yIiIv8iIiL/IiEh/yohH/9JIhz/YiIX/zch + Hf8kIiL/JiIh/0ciG/9+Jhb/jCgW/7csE/9GJB7/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/Li4u/z4+Pv8sLCz/Kysr/35+fv+qqqr/vLy8/8HB + wf/Dw8P/xcXF/8bGxv/IyMj/ysrK/8zMzP/Nzc3/z8/P/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+bm + 5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7jH///8B////Af// + /wH///8B1dXV49TU1P/T09P/0dHR/8/Pz//Nzc3/y8vL/8LCwv9vb2//U1NT/0dHR/8tLS3/JiYm/x4e + Hv8iIiL/JSUl/yUlJf8jIyP/IyMj/yIiIv8hISH/ISEh/yYgIP9fIxj/xSwR/7QsE/+7KxL/lycT/1Ui + GP80IR7/OSEc/0ohGv9tIxb/nygT/7wrEv+6LBL/hiYV/1MiGf98Jhb/kSgV/2QmG/9YJhz/nisW/ywj + If8jIiL/MyIf/z8iHf8vIiD/IyIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/IyMj/yYm + Jv9DQ0P/UVFR/2xsbP9/f3//s7Oz/7+/v//BwcH/xMTE/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ + 0P/R0dH/09PT/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr + 6//s7Oz/7Ozs/+3t7f/u7u7/7u7uMf///wH///8B////Af///wHX19fj1dXV/9TU1P/S0tL/0NDQ/8/P + z//Nzc3/xcXF/35+fv9PT0//MDAw/ywsLP8mJib/ISEh/yQkJP8lJSX/IyMj/yMjI/8iIiL/IiIi/yEh + If8jICD/YiMZ/7srEf+fKhX/QSMd/1QkHP+eKhX/vCoQ/64pEf+sKBH/tioR/7ErE/+ZKhb/dCca/1Ml + HP98JRb/mCgU/3EnGv85JCD/JiMi/2smGv95KBn/IyMi/zQjIP+PJxT/hicW/3AkFv84Ix//IyIi/yMj + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/Hh4e/zIyMv9PT0//e3t7/5ycnP+9vb3/w8PD/8TE + xP/Gxsb/yMjI/8nJyf/Ly8v/zc3N/87Ozv/Q0ND/0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra + 2v/c3Nz/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//r6+v/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u4x////Af// + /wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/8/Pz//IyMj/gYGB/zc3N/8sLCz/KCgo/yEh + If8hISH/IyMj/yQkJP8jIyP/IiIi/yIiIv8hISH/ISEh/1EjG/+7KxH/tisS/0QjHf8iISD/IiEg/zUi + Hv9rJhn/tysS/7YqEf9eJBr/PiMe/y8iIP8lIiH/JCIh/0wkHf9DJB7/KCMi/yIiIv8qIiH/hSgX/1Ym + Hf8nIiH/QyQe/5YpFf9IIxz/TyUd/4gnFv9aJBn/JSIi/yMiIv8jIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/xoa + Gv8GBgb/FxcX/2RkZP+enp7/u7u7/8PDw//FxcX/x8fH/8jIyP/Kysr/zMzM/87Ozv/Pz8//0NDQ/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9ra2v/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7jH///8B////Af///wH///8B2tra49jY2P/W1tb/1NTU/9PT + 0//S0tL/0NDQ/8XFxf9kZGT/LS0t/ygoKP8iIiL/IiIi/yMjI/8kJCT/IyMj/yMjI/8iIiL/IiIi/yEh + If8oISD/gCcX/8ctEf+gKBP/QSEb/yYgH/8gICD/ICAg/yAgH/9MIxz/tisS/34mFv8mISD/ISEh/yYh + IP83IR3/RSIb/0MiHP8zIR7/IyEh/0IkHv+ZKRX/OyMf/1ckG/9zJRf/WSUc/4MmFf9uJBf/pSoU/1Yl + HP9EIx3/SyMc/zMiH/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8ZGRn/BQUF/wwMDP9bW1v/oaGh/7+/v//FxcX/xsbG/8jI + yP/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/n5+f/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7v/v7+//7+/vMf// + /wH///8B////Af///wHa2trj2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/w8PD/1dXV/8sLCz/IyMj/yEh + If8jIyP/JCQk/yQkJP8jIyP/IyMj/yIiIv8iIiL/IiIi/yEhIf8zIh//aiYa/64qE/+uKRH/bSMW/y0f + Hf8gICD/ICAg/zshHf+tKhL/oioU/y0hH/8rIB7/bCMW/6QpEv+0KhH/rykR/5onEv9aIhj/WiQa/3cn + Gf8pIiH/SSQd/40nFP9YIhn/fiYW/6YqFP9dJRv/WSQa/5goFf+JKBb/gCYW/zUiHv8kIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yMjI/8iIiL/HBwc/wcH + B/8GBgb/SkpK/5ycnP+9vb3/xcXF/8fHx//Jycn/ysrK/8zMzP/Nzc3/zs7O/9DQ0P/S0tL/09PT/9XV + 1f/W1tb/19fX/9nZ2f/Z2dn/2tra/9vb2//d3d3/3d3d/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+vr6//r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//w8PAx////Af///wH///8B////Advb2+Pa2tr/2dnZ/9fX + 1//W1tb/1NTU/9PT0//CwsL/UFBQ/yQkJP8hISH/IyMj/yQkJP8kJCT/JCQk/yMjI/8jIyP/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8iISD/OSIe/3wnGP+zKhL/nycR/2YiFv9WIRf/kCUS/8UsEf93Jxn/MSEe/4Ul + FP+5KxL/gygX/0wkHf9FIx3/dicY/68qEv98JRb/KiIg/yIiIf8kIiH/QyMe/38nGP+NKRb/XCYb/1wk + Gv+dKRT/SyUe/ykjIv98KBn/licU/z0iHv8tIiD/JSIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yMjI/8jIyP/JCQk/yEhIf8JCQn/CQkJ/0hISP+YmJj/wMDA/8fHx//IyMj/ycnJ/8vL + y//MzMz/zs7O/8/Pz//R0dH/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8DH///8B////Af///wH///8B3d3d49zc3P/a2tr/2dnZ/9fX1//W1tb/1NTU/8DAwP9GRkb/IiIi/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/JyEg/04j + HP+QKBX/tioR/70rEP+3KxL/gygX/zsiHv9tJRj/viwR/3AmGf8rISD/ISEh/yEhIf8nISD/dicY/7Eq + Ev88Ih7/IiIi/yIiIv8iIiL/JiIh/ykiIf82Ih7/likV/10mHP8kIiL/OCIe/5UpFv9pJxv/RCMe/3Ym + F/8xIyD/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yMjI/8jIyP/CgoK/wQE + BP9AQED/kpKS/7u7u//IyMj/ycnJ/8vLy//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//U1NT/1tbW/9fX + 1//Y2Nj/2tra/9vb2//c3Nz/3Nzc/97e3v/e3t7/39/f/+Dg4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDwMf///wH///8B////Af///wHe3t7j3d3d/9zc + 3P/a2tr/2dnZ/9fX1//W1tb/y8vL/2hoaP8sLCz/IyMj/yMjI/8kJCT/JCQk/yMjI/8jIyP/IyMj/yMj + I/8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEg/ywhH/9BIx3/TyQc/0AjHv8pISD/NCIe/6Iq + FP+cKRX/KyEf/yEhIf8hISH/ISEh/yQhIP9sJRj/vSsR/0sjHf8hISH/MCEf/0QiHP8oISD/IiIi/yci + If9CJB7/JyIh/zciH/+IJxX/cica/0YkHf+RKBX/YiYc/zoiHv9kJBn/RyMd/yUiIv8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/MTEx/x8fH/8NDQ3/Pz8//5WVlf+5ubn/ycnJ/8vLy//MzMz/zc3N/8/P + z//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg + 4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6enp/+np + 6f/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8P/x8fEx////Af///wH///8B////Ad/f3+Pe3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/xMTE/4yM + jP89PT3/JiYm/yMjI/8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yEhIf8hISH/ISEh/yEhIf8zIh//oioU/5AoFf8jICD/ISEh/yEhIf8gICD/OiEc/6Ao + Ev+rKhP/MiIf/ysgHv+EJhX/rikR/0QjHf8iIiL/IiIi/yIiIv8iIiL/TiMc/24nGv9CIx7/kikW/3co + Gf89Ix7/hicX/4EpGf9iJhv/KiMi/yMjI/8jIyP/IyMj/yMjI/8iIiL/JCQk/zg4OP9SUlL/XV1d/2Ji + Yv+ZmZn/xMTE/8zMzP/MzMz/zs7O/8/Pz//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/b29v/3Nzc/93d3f/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8TH///8B////Af///wH///8B4ODg49/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/0tLS/6qqqv9kZGT/Kysr/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/yYh + IP9zJxn/sCoS/1QhGP8oIB7/IyAf/zcgG/+MJRP/visR/2YlGf8oIB//aSMX/78rEf+CKBj/LCIg/yIi + Iv8iIiH/IyIh/yIhIf8oIiH/NyIe/4AmFv99KBj/PSId/4EnFv95KBn/LSMi/yYjIv8jIyL/IyMj/yMj + I/8jIyP/IiIi/yIiIv8lJSX/OTk5/1NTU/9nZ2f/hYWF/7m5uf/Nzc3/zs7O/8/Pz//Q0ND/0dHR/9LS + 0v/T09P/1NTU/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx + 8f/x8fH/8fHxMf///wH///8B////Af///wHh4eHj4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9TU1P+goKD/XFxc/y8vL/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/ykhIP9yJhj/qikS/54mEf+WJRH/rSgR/6sq + E/9kJRr/LyEe/3EkFv+/KxD/gygX/zAiH/8hISH/IiEh/zIiH/97JRX/VCMa/ysiIP9zJRf/eygZ/1Ek + HP+fKBP/likV/zMjIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JCQk/xEREf8HBwf/PT09/4GB + gf+0tLT/zs7O/8/Pz//R0dH/0tLS/9LS0v/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/x8fEx////Af///wH///8B////AeLi + 4uPh4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/ExMT/ioqK/0FB + Qf8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yghIP9FIx3/aCUZ/3UmGP9lJRn/QiMd/ychH/9YIhj/vSsR/5YpFf8wIh//ISEh/yEh + If8tIR//eSUW/7wsEf9lJhv/JyIh/0QkHv81IyD/YCUa/4spF/9UJR3/KyMh/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IiIi/yQkJP8XFxf/AgIC/xwcHP95eXn/sbGx/87Ozv/Q0ND/0tLS/9PT0//U1NT/1NTU/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/29vb/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx + 8f/y8vL/8vLy//Ly8jH///8B////Af///wH///8B4+Pj4+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/29vb/9ra2v/Z2dn/2NjY/9fX1//T09P/urq6/3t7e/81NTX/JSUl/yIiIv8jIyP/IyMj/yMj + I/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIP8iISD/JCEg/yIh + IP8lICD/WCIZ/7QqEf+sKxP/PiMe/yEhIP8hISH/KyAf/3klFv+7KxH/byca/yoiIf8iIiL/IyIi/y8i + IP9CIx3/MSMh/yQjIv8jIyL/IyMj/yMjI/8jIyP/IiIi/yMjI/8mJib/GBgY/wUFBf8eHh7/d3d3/7W1 + tf/Ozs7/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/19fX/9nZ2f/Z2dn/29vb/9zc3P/c3Nz/3t7e/97e + 3v/g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/PzMf///wH///8B////Af// + /wHk5OTj5OTk/+Li4v/i4uL/4ODg/+Dg4P/e3t7/3t7e/93d3f/c3Nz/29vb/9ra2v/a2tr/2dnZ/9jY + 2P/X19f/09PT/6SkpP9gYGD/Kioq/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/zIhHv+TKBT/qCoT/6EpFP82IR3/ISAg/yYg + H/9nIxf/uysR/4MoF/8uIiD/IiIi/yIiIv8xIiD/iSgW/48oFf81IyD/IyMj/yMjI/8jIyP/IyMj/yMj + I/8iIiL/KSkp/x8fH/8FBQX/FRUV/2lpaf+urq7/0NDQ/9TU1P/V1dX/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/Z2dn/29vb/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Pz8//z8/Mx////Af///wH///8B////AeXl5ePl5eX/5OTk/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/97e3v/c3Nz/3Nzc/9vb2//a2tr/2tra/9nZ2f/Y2Nj/1tbW/8nJyf+MjIz/RUVF/yYm + Jv8iIiL/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEh + If8hISH/JCEg/z0iHv9HIx3/pyoT/4gmE/9QIRj/dCQW/7orEf+OKRf/NCMf/yIiIv8iIiL/MCIf/4Em + Fv/ALRL/cCga/yojIv8jIyP/IyMj/yMjI/8jIyP/IiIi/yQkJP8eHh7/BQUF/wwMDP9hYWH/qamp/83N + zf/V1dX/1tbW/9fX1//X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8zH///8B////Af// + /wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/9/f3//e3t7/3d3d/9zc + 3P/c3Nz/29vb/9ra2v/Z2dn/2dnZ/9fX1/+8vLz/fHx8/zg4OP8kJCT/IiIi/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEh/yMhIP9TJBz/nSkV/7gr + Ef+2KxL/uiwS/08kHP8iIiL/IiIi/yoiIP+AJhX/vywS/3YoGv8pIyL/IyMj/yMjI/8jIyP/IyMj/yIi + Iv8qKir/JSUl/wkJCf8RERH/Xl5e/6enp//Pz8//19fX/9jY2P/Y2Nj/2dnZ/9ra2v/a2tr/3Nzc/9zc + 3P/d3d3/3t7e/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5+fn/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/PzMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5OTk/+Pj + 4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/29vb/9vb2//a2tr/2dnZ/9nZ + 2f/R0dH/pKSk/19fX/9LS0v/YmJi/2FhYf9PT0//LS0t/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8hISH/ISEh/yMhIP82Ix//TiQd/0okHf+iKhT/YCQZ/yQhIf8oISD/aCQY/8As + Ef+BKRn/MCMh/yMjI/8jIyP/IyMj/yMjI/8iIiL/Kysr/0xMTP9MTEz/QkJC/2RkZP+ysrL/zs7O/9jY + 2P/Z2dn/2dnZ/9ra2v/b29v/3Nzc/9zc3P/e3t7/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/z8/Mx////Af// + /wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg + 4P/g4OD/39/f/97e3v/e3t7/3d3d/9zc3P/c3Nz/29vb/9ra2v/a2tr/1tbW/9TU1P/Y2Nj/19fX/9TU + 1P+1tbX/ZWVl/ysrK/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEh + If8iIiH/IiIh/2YnG/+zKxL/nCgT/6MoEv/BLBH/gSkZ/zAkIf8jIyL/IyMj/yMjI/8jIyP/IiIi/ycn + J/84ODj/VFRU/2JiYv92dnb/q6ur/9fX1//a2tr/2tra/9vb2//c3Nz/3d3d/93d3f/e3t7/39/f/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Pz + 8//z8/P/8/Pz//Pz8//09PT/9PT0//Pz8zH///8B////Af///wH///8B6enp4+np6f/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d + 3f/d3d3/3Nzc/9vb2//b29v/29vb/9ra2v/a2tr/2dnZ/9nZ2f/Dw8P/YmJi/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/KiIh/10mHP+UKhb/nSsW/28o + G/8uIyH/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/ISEh/xQUFP8uLi7/Z2dn/4+Pj//Ozs7/29vb/9zc + 3P/c3Nz/3d3d/97e3v/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm + 5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx + 8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0Mf// + /wH///8B////Af///wHq6urj6urq/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/97e3v/e3t7/3d3d/93d3f/d3d3/3Nzc/9zc + 3P/b29v/29vb/9ra2v+mpqb/Kioq/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/JCMi/ysjIv8sIyH/JiMi/yMjIv8jIyP/IyMj/yMjI/8iIiL/IiIi/x0d + Hf8ICAj/BQUF/zs7O/+Wlpb/x8fH/9zc3P/d3d3/3t7e/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6urq/+rq + 6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//X19f/19fUx////Af///wH///8B////Aevr6+Pr6+v/6urq/+rq + 6v/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh + 4f/h4eH/4ODg/+Dg4P/f39//3t7e/97e3v/e3t7/3d3d/93d3f/c3Nz/3Nzc/8HBwf83Nzf/IiIi/yIi + Iv8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yIiIv8hISH/DQ0N/wMDA/80NDT/kJCQ/8nJyf/d3d3/39/f/9/f + 3//g4OD/4ODg/+Hh4f/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5eXl/+bm5v/n5+f/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X1 + 9TH///8B////Af///wH///8B7Ozs4+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Xl5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/9/f + 3//f39//3t7e/97e3v/d3d3/19fX/4uLi/89PT3/JCQk/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JSUl/w4O + Dv8CAgL/IyMj/4KCgv/FxcX/39/f/+Dg4P/g4OD/4eHh/+Hh4f/i4uL/4uLi/+Pj4//j4+P/5OTk/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr + 6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1Mf///wH///8B////Af///wHt7e3j7Ozs/+zs + 7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Xl + 5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Hh4f/g4OD/4ODg/9/f3//f39//3d3d/76+ + vv9ycnL/ODg4/yQkJP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yMjI/8RERH/AgIC/yYmJv+IiIj/xcXF/9/f3//i4uL/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+np + 6f/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vYx////Af///wH///8B////Ae3t7ePt7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Li + 4v/i4uL/4uLi/+Hh4f/h4eH/4eHh/+Dg4P/g4OD/4ODg/9TU1P+np6f/XFxc/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8nJyf/FBQU/wIC + Av8cHBz/dnZ2/8TExP/f39//4uLi/+Pj4//j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6enp/+np6f/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b29jH///8B////Af///wH///8B7u7u4+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo + 6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//i4uL/4uLi/+Li + 4v/i4uL/4eHh/+Hh4f/X19f/l5eX/05OTv8oKCj/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/Tk5O/5iYmP9zc3P/UVFR/5OTk//Gxsb/4uLi/+Tk5P/k5OT/5eXl/+Xl + 5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2Mf///wH///8B////Af///wHu7u7j7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/r6+v/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5eXl/+Tk5P/k5OT/5OTk/+Pj4//j4+P/4+Pj/+Pj4//i4uL/4uLi/+Pj4//g4OD/xMTE/3d3 + d/82Njb/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IiIi/0RERP+urq7/4uLi/+Li + 4v/a2tr/4ODg/+Tk5P/l5eX/5eXl/+Xl5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u + 7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 + 9P/09PT/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vYx////Af///wH///8B////Ae/v + 7+Pu7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq + 6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk + 5P/k5OT/5OTk/+Pj4//j4+P/5OTk/+Tk5P/k5OT/29vb/7i4uP9ra2v/LS0t/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IiIi/yMjI/84ODj/ra2t/+Li4v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm5v/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b2 + 9v/29vb/9vb2//b29jH///8B////Af///wH///8B8PDw4+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6enp/+jo + 6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm + 5v/m5ub/5ubm/9jY2P+dnZ3/V1dX/yYmJv8iIiL/IyMj/yMjI/8iIiL/PDw8/6CgoP/l5eX/5+fn/+fn + 5//n5+f/5+fn/+fn5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2Mf///wH///8B////Af// + /wHw8PDj8PDw//Dw8P/v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+np6f/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn + 5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+fn5//n5+f/5+fn/+Tk5P/MzMz/eHh4/zY2 + Nv8kJCT/IiIi/y0tLf+ampr/4ODg/+fn5//o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6enp/+np + 6f/p6en/6enp/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b2 + 9v/29vb/9vb2//f39//29vYx////Af///wH///8B////AfHx8ePx8fH/8PDw//Dw8P/w8PD/7+/v/+/v + 7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr + 6//q6ur/6urq/+rq6v/p6en/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo + 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/k5OT/xcXF/3R0dP9MTEz/kZGR/+bm5v/p6en/6enp/+np + 6f/p6en/6enp/+np6f/q6ur/6urq/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X1 + 9f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//b29jH///8B////Af// + /wH///8B8fHx4/Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u + 7v/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+np + 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np + 6f/p6en/3d3d/83Nzf/h4eH/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/39/f/9/f3//f39//39/f/9vb2Mf///wH///8B////Af///wHy8vLj8fHx//Hx8f/x8fH/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+rq + 6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//f39//39/cx////Af// + /wH///8B////AfLy8uPy8vL/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw/+/v + 7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX1//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f3 + 9//39/f/9/f3//f39//39/f/9/f3//j4+DH///8B////Af///wH///8B8/Pz4/Pz8//y8vL/8vLy//Ly + 8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7+/v/+/v + 7//u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T0 + 9P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//f39//39/f/9/f3//f39//4+Pj/+Pj4Mf// + /wH///8B////Af///wHz8/Pj8/Pz//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/9/f3//f3 + 9//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pgx////Af///wH///8B////AfT09OP09PT/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4 + +DH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ROMVault2/FrmRegistration.Designer.cs b/ROMVault2/FrmRegistration.Designer.cs new file mode 100644 index 0000000..bb0ccaf --- /dev/null +++ b/ROMVault2/FrmRegistration.Designer.cs @@ -0,0 +1,121 @@ +namespace ROMVault2 +{ + partial class FrmRegistration + { + /// + /// 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.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.txtName = new System.Windows.Forms.TextBox(); + this.txtEmail = new System.Windows.Forms.TextBox(); + this.btnOK = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(420, 49); + this.label1.TabIndex = 0; + this.label1.Text = "To make RomVault 2 the best is can be, RomVault 2 will send error reports to the " + + "author. Please fill out this from so that the Author can contact you in the case" + + " of a crash."; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 58); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(120, 13); + this.label2.TabIndex = 1; + this.label2.Text = "Your Name: (Username)"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 100); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(103, 13); + this.label3.TabIndex = 2; + this.label3.Text = "Your Contact Email :"; + // + // txtName + // + this.txtName.Location = new System.Drawing.Point(15, 74); + this.txtName.Name = "txtName"; + this.txtName.Size = new System.Drawing.Size(417, 20); + this.txtName.TabIndex = 3; + // + // txtEmail + // + this.txtEmail.Location = new System.Drawing.Point(15, 116); + this.txtEmail.Name = "txtEmail"; + this.txtEmail.Size = new System.Drawing.Size(417, 20); + this.txtEmail.TabIndex = 4; + // + // btnOK + // + this.btnOK.Location = new System.Drawing.Point(303, 145); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(128, 23); + this.btnOK.TabIndex = 5; + this.btnOK.Text = "OK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // FrmRegistration + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(444, 178); + this.ControlBox = false; + this.Controls.Add(this.btnOK); + this.Controls.Add(this.txtEmail); + this.Controls.Add(this.txtName); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "FrmRegistration"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Registration"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtName; + private System.Windows.Forms.TextBox txtEmail; + private System.Windows.Forms.Button btnOK; + } +} \ No newline at end of file diff --git a/ROMVault2/FrmRegistration.cs b/ROMVault2/FrmRegistration.cs new file mode 100644 index 0000000..22f08ad --- /dev/null +++ b/ROMVault2/FrmRegistration.cs @@ -0,0 +1,28 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Windows.Forms; + +namespace ROMVault2 +{ + public partial class FrmRegistration : Form + { + public FrmRegistration() + { + InitializeComponent(); + txtName.Text = Settings.Username; + txtEmail.Text = Settings.EMail; + } + + private void btnOK_Click(object sender, EventArgs e) + { + Settings.Username = txtName.Text; + Settings.EMail = txtEmail.Text; + Close(); + } + } +} diff --git a/ROMVault2/FrmRegistration.resx b/ROMVault2/FrmRegistration.resx new file mode 100644 index 0000000..5ea0895 --- /dev/null +++ b/ROMVault2/FrmRegistration.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ROMVault2/IO/RVIO.cs b/ROMVault2/IO/RVIO.cs new file mode 100644 index 0000000..0d90862 --- /dev/null +++ b/ROMVault2/IO/RVIO.cs @@ -0,0 +1,606 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using Microsoft.Win32.SafeHandles; + +namespace ROMVault2.IO +{ + [Flags] + [ComVisible(true)] + [Serializable] + public enum FileAttributes + { + ReadOnly = 1, + Hidden = 2, + System = 4, + Directory = 16, + Archive = 32, + Device = 64, + Normal = 128, + Temporary = 256, + SparseFile = 512, + ReparsePoint = 1024, + Compressed = 2048, + Offline = 4096, + NotContentIndexed = 8192, + Encrypted = 16384, + } + public static class Error + { + public static int GetLastError() + { + return Marshal.GetLastWin32Error(); + } + } + + public class FileInfo + { + + public string Name; + public string FullName; + public long LastWriteTime; + public long Length; + public int fileAttributes; + + public bool isHidden + { + get { return (fileAttributes & Win32Native.FILE_ATTRIBUTE_HIDDEN) != 0; } + } + + public FileInfo() + { } + + public FileInfo(string path) + { + FullName = path; + Name = Path.GetFileName(path); + + string fileName = NameFix.AddLongPathPrefix(path); + Win32Native.WIN32_FILE_ATTRIBUTE_DATA wIn32FileAttributeData = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); + + bool b = Win32Native.GetFileAttributesEx(fileName, 0, ref wIn32FileAttributeData); + + if (!b || (wIn32FileAttributeData.fileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) != 0) return; + + Length = Convert.Length(wIn32FileAttributeData.fileSizeHigh, wIn32FileAttributeData.fileSizeLow); + LastWriteTime = Convert.Time(wIn32FileAttributeData.ftLastWriteTimeHigh, wIn32FileAttributeData.ftLastWriteTimeLow); + fileAttributes = wIn32FileAttributeData.fileAttributes; + } + + } + + public class DirectoryInfo + { + public string Name; + public string FullName; + public long LastWriteTime; + public int fileAttributes; + + public bool isHidden + { + get { return (fileAttributes & Win32Native.FILE_ATTRIBUTE_HIDDEN) != 0; } + } + + public DirectoryInfo() + { } + public DirectoryInfo(string path) + { + FullName = path; + Name = Path.GetFileName(path); + + string fileName = NameFix.AddLongPathPrefix(path); + Win32Native.WIN32_FILE_ATTRIBUTE_DATA wIn32FileAttributeData = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); + + bool b = Win32Native.GetFileAttributesEx(fileName, 0, ref wIn32FileAttributeData); + + if (!b || (wIn32FileAttributeData.fileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) == 0) return; + LastWriteTime = Convert.Time(wIn32FileAttributeData.ftLastWriteTimeHigh, wIn32FileAttributeData.ftLastWriteTimeLow); + fileAttributes = wIn32FileAttributeData.fileAttributes; + } + + + + public DirectoryInfo[] GetDirectories(bool includeHidden = true) + { + return GetDirectories("*", includeHidden); + } + public DirectoryInfo[] GetDirectories(string SearchPattern, bool includeHidden = true) + { + List dirs = new List(); + + string dirName = NameFix.AddLongPathPrefix(FullName); + + Win32Native.WIN32_FIND_DATA findData = new Win32Native.WIN32_FIND_DATA(); + SafeFindHandle findHandle = Win32Native.FindFirstFile(dirName + @"\" + SearchPattern, findData); + + if (!findHandle.IsInvalid) + { + do + { + string currentFileName = findData.cFileName; + + // if this is a directory, find its contents + if ((findData.dwFileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) == 0) continue; + if (currentFileName == "." || currentFileName == "..") continue; + if (!includeHidden && (findData.dwFileAttributes & Win32Native.FILE_ATTRIBUTE_HIDDEN) != 0) continue; + + DirectoryInfo di = new DirectoryInfo + { + Name = currentFileName, + FullName = Path.Combine(FullName, currentFileName), + LastWriteTime = Convert.Time(findData.ftLastWriteTimeHigh, findData.ftLastWriteTimeLow), + fileAttributes = findData.dwFileAttributes + }; + dirs.Add(di); + } + while (Win32Native.FindNextFile(findHandle, findData)); + } + + // close the find handle + findHandle.Dispose(); + + return dirs.ToArray(); + } + + public FileInfo[] GetFiles() + { + return GetFiles("*"); + } + public FileInfo[] GetFiles(string SearchPattern, bool includeHidden = true) + { + List files = new List(); + + string dirName = NameFix.AddLongPathPrefix(FullName); + + Win32Native.WIN32_FIND_DATA findData = new Win32Native.WIN32_FIND_DATA(); + SafeFindHandle findHandle = Win32Native.FindFirstFile(dirName + @"\" + SearchPattern, findData); + + if (!findHandle.IsInvalid) + { + do + { + string currentFileName = findData.cFileName; + + // if this is a directory, find its contents + if ((findData.dwFileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) != 0) continue; + if (!includeHidden && (findData.dwFileAttributes & Win32Native.FILE_ATTRIBUTE_HIDDEN) != 0) continue; + + FileInfo fi = new FileInfo + { + Name = currentFileName, + FullName = Path.Combine(FullName, currentFileName), + Length = Convert.Length(findData.nFileSizeHigh, findData.nFileSizeLow), + LastWriteTime = Convert.Time(findData.ftLastWriteTimeHigh, findData.ftLastWriteTimeLow), + fileAttributes = findData.dwFileAttributes + }; + files.Add(fi); + } + while (Win32Native.FindNextFile(findHandle, findData)); + } + + // close the find handle + findHandle.Dispose(); + + return files.ToArray(); + } + } + + public static class Directory + { + public static bool Exists(string path) + { + string fixPath = NameFix.AddLongPathPrefix(path); + + Win32Native.WIN32_FILE_ATTRIBUTE_DATA wIn32FileAttributeData = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); + + bool b = Win32Native.GetFileAttributesEx(fixPath, 0, ref wIn32FileAttributeData); + return b && (wIn32FileAttributeData.fileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) != 0; + } + public static void Move(String sourceDirName, String destDirName) + { + if (sourceDirName == null) + throw new ArgumentNullException("sourceDirName"); + if (sourceDirName.Length == 0) + throw new ArgumentException("Argument_EmptyFileName", "sourceDirName"); + + if (destDirName == null) + throw new ArgumentNullException("destDirName"); + if (destDirName.Length == 0) + throw new ArgumentException("Argument_EmptyFileName", "destDirName"); + + String fullsourceDirName = NameFix.AddLongPathPrefix(sourceDirName); + + String fulldestDirName = NameFix.AddLongPathPrefix(destDirName); + + if (!Win32Native.MoveFile(fullsourceDirName, fulldestDirName)) + { + int hr = Marshal.GetLastWin32Error(); + if (hr == Win32Native.ERROR_FILE_NOT_FOUND) // Source dir not found + { + throw new Exception("ERROR_PATH_NOT_FOUND " + fullsourceDirName); + } + if (hr == Win32Native.ERROR_ACCESS_DENIED) // WinNT throws IOException. This check is for Win9x. We can't change it for backcomp. + { + throw new Exception("UnauthorizedAccess_IODenied_Path" + sourceDirName); + } + } + } + public static void Delete(String path) + { + String fullPath = NameFix.AddLongPathPrefix(path); + + Win32Native.RemoveDirectory(fullPath); + } + + public static void CreateDirectory(String path) + { + if (path == null) + throw new ArgumentNullException("path"); + if (path.Length == 0) + throw new ArgumentException("Argument_PathEmpty"); + + String fullPath = NameFix.AddLongPathPrefix(path); + + Win32Native.CreateDirectory(fullPath, IntPtr.Zero); + } + } + + public static class File + { + public static bool Exists(string path) + { + string fixPath = NameFix.AddLongPathPrefix(path); + + Win32Native.WIN32_FILE_ATTRIBUTE_DATA wIn32FileAttributeData = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); + + bool b = Win32Native.GetFileAttributesEx(fixPath, 0, ref wIn32FileAttributeData); + return b && (wIn32FileAttributeData.fileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) == 0; + } + public static void Copy(String sourceFileName, string destfileName) + { + Copy(sourceFileName, destfileName, true); + } + public static void Copy(String sourceFileName, String destFileName, bool overwrite) + { + if (sourceFileName == null || destFileName == null) + throw new ArgumentNullException((sourceFileName == null ? "sourceFileName" : "destFileName"), "ArgumentNull_FileName"); + if (sourceFileName.Length == 0 || destFileName.Length == 0) + throw new ArgumentException("Argument_EmptyFileName", (sourceFileName.Length == 0 ? "sourceFileName" : "destFileName")); + + String fullSourceFileName = NameFix.AddLongPathPrefix(sourceFileName); + String fullDestFileName = NameFix.AddLongPathPrefix(destFileName); + + bool r = Win32Native.CopyFile(fullSourceFileName, fullDestFileName, !overwrite); + if (!r) + { + // Save Win32 error because subsequent checks will overwrite this HRESULT. + int errorCode = Marshal.GetLastWin32Error(); + String fileName = destFileName; + + /* + if (errorCode != Win32Native.ERROR_FILE_EXISTS) + { + // For a number of error codes (sharing violation, path + // not found, etc) we don't know if the problem was with + // the source or dest file. Try reading the source file. + using (SafeFileHandle handle = Win32Native.UnsafeCreateFile(fullSourceFileName, FileStream.GENERIC_READ, FileShare.Read, null, FileMode.Open, 0, IntPtr.Zero)) + { + if (handle.IsInvalid) + fileName = sourceFileName; + } + + if (errorCode == Win32Native.ERROR_ACCESS_DENIED) + { + if (Directory.InternalExists(fullDestFileName)) + throw new IOException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Arg_FileIsDirectory_Name"), destFileName), Win32Native.ERROR_ACCESS_DENIED, fullDestFileName); + } + } + + __Error.WinIOError(errorCode, fileName); + + */ + } + } + public static void Move(String sourceFileName, String destFileName) + { + if (sourceFileName == null || destFileName == null) + throw new ArgumentNullException((sourceFileName == null ? "sourceFileName" : "destFileName"), "ArgumentNull_FileName"); + if (sourceFileName.Length == 0 || destFileName.Length == 0) + throw new ArgumentException("Argument_EmptyFileName", (sourceFileName.Length == 0 ? "sourceFileName" : "destFileName")); + + String fullSourceFileName = NameFix.AddLongPathPrefix(sourceFileName); + String fullDestFileName = NameFix.AddLongPathPrefix(destFileName); + + if (!Exists(fullSourceFileName)) + throw new Exception("ERROR_FILE_NOT_FOUND" + fullSourceFileName); + + if (!Win32Native.MoveFile(fullSourceFileName, fullDestFileName)) + { + int hr = Marshal.GetLastWin32Error(); + throw new Exception("ERROR_MOVING_FILE. Error Code ("+hr+")"); + } + } + public static void Delete(String path) + { + string fixPath = NameFix.AddLongPathPrefix(path); + + if (!Win32Native.DeleteFile(fixPath)) + { + int hr = Marshal.GetLastWin32Error(); + if (hr != Win32Native.ERROR_FILE_NOT_FOUND) + throw new Exception("Error while deleting file :" + path); + } + } + + public static bool SetAttributes(String path, FileAttributes fileAttributes) + { + String fullPath = NameFix.AddLongPathPrefix(path); + return Win32Native.SetFileAttributes(fullPath, (int)fileAttributes); + } + + + private const int ERROR_INVALID_PARAMETER = 87; + private const int ERROR_ACCESS_DENIED = 0x5; + } + + public static class Path + { + public static readonly char DirectorySeparatorChar = '\\'; + public static readonly char AltDirectorySeparatorChar = '/'; + public static readonly char VolumeSeparatorChar = ':'; + + public static string GetExtension(String path) + { + return System.IO.Path.GetExtension(path); + } + public static string Combine(string path1, string path2) + { + if (path1 == null || path2 == null) + throw new ArgumentNullException((path1 == null) ? "path1" : "path2"); + //CheckInvalidPathChars(path1); + //CheckInvalidPathChars(path2); + + if (path2.Length == 0) + return path1; + + if (path1.Length == 0) + return path2; + + if (IsPathRooted(path2)) + return path2; + + char ch = path1[path1.Length - 1]; + if (ch != DirectorySeparatorChar && ch != AltDirectorySeparatorChar && ch != VolumeSeparatorChar) + return path1 + DirectorySeparatorChar + path2; + return path1 + path2; + } + private static bool IsPathRooted(String path) + { + if (path != null) + { + //CheckInvalidPathChars(path); + + int length = path.Length; + if ( + (length >= 1 && (path[0] == DirectorySeparatorChar || + path[0] == AltDirectorySeparatorChar)) || + (length >= 2 && path[1] == VolumeSeparatorChar) + ) return true; + } + return false; + } + /* + private static void CheckInvalidPathChars(string path) + { + for (int index = 0; index < path.Length; ++index) + { + int num = path[index]; + switch (num) + { + case 34: + case 60: + case 62: + case 124: + ReportError.SendErrorMessage("Invalid Character " + num + " in filename " + path); + continue; + default: + if (num >= 32) + continue; + + goto case 34; + } + } + } + */ + + public static string GetFileNameWithoutExtension(string path) + { + return System.IO.Path.GetFileNameWithoutExtension(path); + } + + public static string GetFileName(String path) + { + return System.IO.Path.GetFileName(path); + } + public static String GetDirectoryName(String path) + { + if (path != null) + { + int root = GetRootLength(path); + int i = path.Length; + if (i > root) + { + i = path.Length; + if (i == root) return null; + while (i > root && path[--i] != DirectorySeparatorChar && path[i] != AltDirectorySeparatorChar) ; + return path.Substring(0, i); + } + } + return null; + } + + private static int GetRootLength(String path) + { + int i = 0; + int length = path.Length; + + if (length >= 1 && (IsDirectorySeparator(path[0]))) + { + // handles UNC names and directories off current drive's root. + i = 1; + if (length >= 2 && (IsDirectorySeparator(path[1]))) + { + i = 2; + int n = 2; + while (i < length && ((path[i] != DirectorySeparatorChar && path[i] != AltDirectorySeparatorChar) || --n > 0)) i++; + } + } + else if (length >= 2 && path[1] == VolumeSeparatorChar) + { + // handles A:\foo. + i = 2; + if (length >= 3 && (IsDirectorySeparator(path[2]))) i++; + } + return i; + } + private static bool IsDirectorySeparator(char c) + { + return (c == DirectorySeparatorChar || c == AltDirectorySeparatorChar); + } + + } + + + public static class FileStream + { + private const uint GENERIC_READ = 0x80000000; + private const uint GENERIC_WRITE = 0x40000000; + + private const uint FILE_ATTRIBUTE_NORMAL = 0x80; + + // errorMessage = new Win32Exception(errorCode).Message; + + public static int OpenFileRead(string path, out System.IO.Stream stream) + { + + string filename = NameFix.AddLongPathPrefix(path); + SafeFileHandle hFile = Win32Native.CreateFile(filename, + GENERIC_READ, + System.IO.FileShare.Read, + IntPtr.Zero, + System.IO.FileMode.Open, + FILE_ATTRIBUTE_NORMAL, + IntPtr.Zero); + + if (hFile.IsInvalid) + { + stream = null; + return Marshal.GetLastWin32Error(); + } + stream = new System.IO.FileStream(hFile, System.IO.FileAccess.Read); + return 0; + } + + public static int OpenFileWrite(string path, out System.IO.Stream stream) + { + string filename = NameFix.AddLongPathPrefix(path); + SafeFileHandle hFile = Win32Native.CreateFile(filename, + GENERIC_WRITE, + System.IO.FileShare.None, + IntPtr.Zero, + System.IO.FileMode.Create, + FILE_ATTRIBUTE_NORMAL, + IntPtr.Zero); + + if (hFile.IsInvalid) + { + stream = null; + return Marshal.GetLastWin32Error(); + } + + stream = new System.IO.FileStream(hFile, System.IO.FileAccess.Write); + return 0; + } + + + } + + public static class NameFix + { + public static string GetShortPath(string path) + { + int remove = 0; + string retPath; + if (path.StartsWith(@"\\")) + { + retPath = @"\\?\UNC\" + path.Substring(2); + remove = 8; + } + else + { + retPath = path; + if (path.Substring(1, 1) != ":") + retPath = Path.Combine(System.IO.Directory.GetCurrentDirectory(), retPath); + + retPath = cleandots(retPath); + retPath = @"\\?\" + retPath; + remove = 4; + } + + + const int MAX_PATH = 300; + var shortPath = new StringBuilder(MAX_PATH); + Win32Native.GetShortPathName(retPath, shortPath, MAX_PATH); + retPath = shortPath.ToString(); + + retPath = retPath.Substring(remove); + if (remove == 8) retPath = "\\" + retPath; + + return retPath; + } + + + + internal static string AddLongPathPrefix(string path) + { + if (string.IsNullOrEmpty(path) || path.StartsWith(@"\\?\")) + return path; + + if (path.StartsWith(@"\\")) + return @"\\?\UNC\" + path.Substring(2); + + string retPath = path; + if (path.Substring(1, 1) != ":") + retPath = Path.Combine(System.IO.Directory.GetCurrentDirectory(), retPath); + + retPath = cleandots(retPath); + + return @"\\?\" + retPath; + + } + + private static string cleandots(string path) + { + string retPath = path; + while (retPath.Contains(@"\..\")) + { + int index = retPath.IndexOf(@"\..\"); + string path1 = retPath.Substring(0, index); + string path2 = retPath.Substring(index + 4); + + int path1Back = path1.LastIndexOf(@"\"); + + retPath = path1.Substring(0, path1Back + 1) + path2; + } + return retPath; + + } + } +} diff --git a/ROMVault2/IO/Win32Native.cs b/ROMVault2/IO/Win32Native.cs new file mode 100644 index 0000000..400c183 --- /dev/null +++ b/ROMVault2/IO/Win32Native.cs @@ -0,0 +1,181 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.IO; +using System.Runtime.ConstrainedExecution; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; +using System.Security.Permissions; +using System.Text; +using Microsoft.Win32.SafeHandles; + +namespace ROMVault2.IO +{ + internal static class Win32Native + { + + private const String KERNEL32 = "kernel32.dll"; + + public const int FILE_ATTRIBUTE_DIRECTORY = 0x00000010; + public const int FILE_ATTRIBUTE_HIDDEN = 0x00000002; + + + internal const int ERROR_FILE_NOT_FOUND = 0x2; + internal const int ERROR_ACCESS_DENIED = 0x5; + internal const int ERROR_FILE_EXISTS = 0x50; + + + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + [BestFitMapping(false)] + internal class WIN32_FIND_DATA + { + internal int dwFileAttributes = 0; + internal uint ftCreationTimeLow; + internal uint ftCreationTimeHigh; + internal uint ftLastAccessTimeLow; + internal uint ftLastAccessTimeHigh; + internal uint ftLastWriteTimeLow; + internal uint ftLastWriteTimeHigh; + internal int nFileSizeHigh = 0; + internal int nFileSizeLow = 0; + internal int dwReserved0 = 0; + internal int dwReserved1 = 0; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + internal String cFileName = null; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] + internal String cAlternateFileName = null; + } + + [StructLayout(LayoutKind.Sequential), Serializable] + internal struct WIN32_FILE_ATTRIBUTE_DATA + { + internal int fileAttributes; + internal uint ftCreationTimeLow; + internal uint ftCreationTimeHigh; + internal uint ftLastAccessTimeLow; + internal uint ftLastAccessTimeHigh; + internal uint ftLastWriteTimeLow; + internal uint ftLastWriteTimeHigh; + internal int fileSizeHigh; + internal int fileSizeLow; + } + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.None)] + internal static extern bool GetFileAttributesEx(String fileName, int fileInfoLevel, ref WIN32_FILE_ATTRIBUTE_DATA lpFileInformation); + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.None)] + internal static extern SafeFindHandle FindFirstFile(String fileName, [In, Out] WIN32_FIND_DATA data); + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.None)] + internal static extern bool FindNextFile(SafeFindHandle hndFindFile, [In, Out, MarshalAs(UnmanagedType.LPStruct)] WIN32_FIND_DATA lpFindFileData); + + [DllImport(KERNEL32)] + [ResourceExposure(ResourceScope.None)] + [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] + internal static extern bool FindClose(IntPtr handle); + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.Machine)] + internal static extern SafeFileHandle CreateFile(String lpFileName, + uint dwDesiredAccess, FileShare dwShareMode, + IntPtr securityAttrs, FileMode dwCreationDisposition, + uint dwFlagsAndAttributes, IntPtr hTemplateFile); + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.Machine)] + internal static extern bool CreateDirectory(String path, IntPtr lpSecurityAttributes); + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.Machine)] + internal static extern bool RemoveDirectory(String path); + + + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.Machine)] + internal static extern bool CopyFile(String src, String dst, bool failIfExists); + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.Machine)] + internal static extern bool MoveFile(String src, String dst); + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.Machine)] + internal static extern bool DeleteFile(String path); + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.None)] + internal static extern bool SetFileAttributes(String name, int attr); + + + [DllImport(KERNEL32, SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] + [ResourceExposure(ResourceScope.Machine)] + internal static extern int GetShortPathName( + [MarshalAs(UnmanagedType.LPTStr)] string path, + [MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath, + int shortPathLength + ); + + } + + internal sealed class SafeFindHandle : SafeHandleZeroOrMinusOneIsInvalid + { + [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] + internal SafeFindHandle() : base(true) { } + + override protected bool ReleaseHandle() + { + return Win32Native.FindClose(handle); + } + } + + + + internal static class Convert + { + private const long TicksPerMillisecond = 10000; + private const long TicksPerSecond = TicksPerMillisecond * 1000; + private const long TicksPerMinute = TicksPerSecond * 60; + private const long TicksPerHour = TicksPerMinute * 60; + private const long TicksPerDay = TicksPerHour * 24; + + // Number of days in a non-leap year + private const int DaysPerYear = 365; + // Number of days in 4 years + private const int DaysPer4Years = DaysPerYear * 4 + 1; + // Number of days in 100 years + private const int DaysPer100Years = DaysPer4Years * 25 - 1; + // Number of days in 400 years + private const int DaysPer400Years = DaysPer100Years * 4 + 1; + + // Number of days from 1/1/0001 to 12/31/1600 + private const int DaysTo1601 = DaysPer400Years * 4; + public const long FileTimeOffset = DaysTo1601 * TicksPerDay; + + + // Number of days from 1/1/0001 to 12/31/9999 + private const int DaysTo10000 = DaysPer400Years * 25 - 366; + private const long MinTicks = 0; + private const long MaxTicks = DaysTo10000 * TicksPerDay - 1; + + + public static long Length(int high, int low) + { + return ((long) high) << 32 | ((long) low & 0xFFFFFFFFL); + } + + public static long Time(uint high, uint low) + { + return ((long)high << 32) | low; + } + + } +} diff --git a/ROMVault2/Program.cs b/ROMVault2/Program.cs new file mode 100644 index 0000000..b7f9035 --- /dev/null +++ b/ROMVault2/Program.cs @@ -0,0 +1,54 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ +using System; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace ROMVault2 +{ + static class Program + { + //public static UsernamePassword Up; + public static readonly Encoding Enc = Encoding.GetEncoding(28591); + public const string Version = "2.1"; + public const int SubVersion = 25; + + public static string ErrorMessage; + public static string URL; + + public static SynchronizationContext SyncCont; + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + +#if !DEBUG + Application.ThreadException += ReportError.UnhandledExceptionHandler; +#endif + + FrmSplashScreen progress = new FrmSplashScreen(); + progress.ShowDialog(); + + progress.Dispose(); + + if (!String.IsNullOrEmpty(ErrorMessage)) + { + MessageBox.Show(ErrorMessage); + if (!String.IsNullOrEmpty(URL)) + System.Diagnostics.Process.Start(URL); + return; + } + + Application.Run(new FrmMain()); + } + } +} diff --git a/ROMVault2/Properties/AssemblyInfo.cs b/ROMVault2/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9e1d7e2 --- /dev/null +++ b/ROMVault2/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("ROMVault2")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("ROMVault2")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] +[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("12c7682b-3530-4e92-a696-94a92cf3fedf")] + +// 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/ROMVault2/Properties/Resources.Designer.cs b/ROMVault2/Properties/Resources.Designer.cs new file mode 100644 index 0000000..0b9414f --- /dev/null +++ b/ROMVault2/Properties/Resources.Designer.cs @@ -0,0 +1,741 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34003 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ROMVault2.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("ROMVault2.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; + } + } + + /// + /// Looks up a localized string similar to , . + /// + internal static string Comma { + get { + return ResourceManager.GetString("Comma", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error Keyword . + /// + internal static string DatCmpReader_LoadDirFromDat_Error_Keyword { + get { + return ResourceManager.GetString("DatCmpReader_LoadDirFromDat_Error_Keyword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to not know in dir. + /// + internal static string DatCmpReader_LoadDirFromDat_not_know_in_dir { + get { + return ResourceManager.GetString("DatCmpReader_LoadDirFromDat_not_know_in_dir", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name not found as first object in ( ). + /// + internal static string DatCmpReader_LoadGameFromDat_Name_not_found_as_first_object_in { + get { + return ResourceManager.GetString("DatCmpReader_LoadGameFromDat_Name_not_found_as_first_object_in", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ( not found after game. + /// + internal static string DatCmpReader_LoadGameFromDat_not_found_after_game { + get { + return ResourceManager.GetString("DatCmpReader_LoadGameFromDat_not_found_after_game", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ' not known in game. + /// + internal static string DatCmpReader_LoadGameFromDat_not_known_in_game { + get { + return ResourceManager.GetString("DatCmpReader_LoadGameFromDat_not_known_in_game", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ( not found after clrmamepro. + /// + internal static string DatCmpReader_LoadHeaderFromDat_not_found_after_clrmamepro { + get { + return ResourceManager.GetString("DatCmpReader_LoadHeaderFromDat_not_found_after_clrmamepro", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ' not known in clrmamepro. + /// + internal static string DatCmpReader_LoadHeaderFromDat_not_known_in_clrmamepro { + get { + return ResourceManager.GetString("DatCmpReader_LoadHeaderFromDat_not_known_in_clrmamepro", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ( not found after rom. + /// + internal static string DatCmpReader_LoadRomFromDat_not_found_after_rom { + get { + return ResourceManager.GetString("DatCmpReader_LoadRomFromDat_not_found_after_rom", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ' not known in rom. + /// + internal static string DatCmpReader_LoadRomFromDat_not_known_in_rom { + get { + return ResourceManager.GetString("DatCmpReader_LoadRomFromDat_not_known_in_rom", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error: key word '. + /// + internal static string DatCmpReader_ReadDat_Error_keyword { + get { + return ResourceManager.GetString("DatCmpReader_ReadDat_Error_keyword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ' not known. + /// + internal static string DatCmpReader_ReadDat_not_known { + get { + return ResourceManager.GetString("DatCmpReader_ReadDat_not_known", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error dat found on item listed as not in dat. + /// + internal static string DatUpdate_ClearOldDats_Error_dat_found_on_item_listed_as_not_in_dat { + get { + return ResourceManager.GetString("DatUpdate_ClearOldDats_Error_dat_found_on_item_listed_as_not_in_dat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Got to a non dir when checking Dir's for dats to remove. + /// + internal static string DatUpdate_ClearOldDats_Got_to_a_non_dir_when_checking_Dir_s_for_dats_to_remove { + get { + return ResourceManager.GetString("DatUpdate_ClearOldDats_Got_to_a_non_dir_when_checking_Dir_s_for_dats_to_remove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This is bad, rBase.Dat is set to a dat, and rBase.DatStatus is not. + /// + internal static string DatUpdate_ClearOldDats_This_is_bad__rBase_Dat_is_set_to_a_dat_and_rBase_DatStatus_is_not { + get { + return ResourceManager.GetString("DatUpdate_ClearOldDats_This_is_bad__rBase_Dat_is_set_to_a_dat_and_rBase_DatStatus" + + "_is_not", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown File Delete Test . + /// + internal static string DatUpdate_ClearOldDats_Unknown_File_Delete_Test { + get { + return ResourceManager.GetString("DatUpdate_ClearOldDats_Unknown_File_Delete_Test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown file setup. + /// + internal static string DatUpdate_ClearOldDats_Unknown_file_setup { + get { + return ResourceManager.GetString("DatUpdate_ClearOldDats_Unknown_file_setup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This should also never happen.. + /// + internal static string DatUpdate_ClearRemovedDatsFromTheDb_This_should_also_never_happen { + get { + return ResourceManager.GetString("DatUpdate_ClearRemovedDatsFromTheDb_This_should_also_never_happen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error in Logic. + /// + internal static string DatUpdate_MergeInDat_Error_in_Logic { + get { + return ResourceManager.GetString("DatUpdate_MergeInDat_Error_in_Logic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unkown Update Dat Status . + /// + internal static string DatUpdate_MergeInDat_Unkown_Update_Dat_Status { + get { + return ResourceManager.GetString("DatUpdate_MergeInDat_Unkown_Update_Dat_Status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown Merge Status. + /// + internal static string DatUpdate_UpdateDatFile_Unknown_Merge_Status { + get { + return ResourceManager.GetString("DatUpdate_UpdateDatFile_Unknown_Merge_Status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ' Directory will be ignored.. + /// + internal static string DatUpdate_UpdateDatList_Directory_will_be_ignored { + get { + return ResourceManager.GetString("DatUpdate_UpdateDatList_Directory_will_be_ignored", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Empty Directories found in '. + /// + internal static string DatUpdate_UpdateDatList_Empty_Directories_found_in { + get { + return ResourceManager.GetString("DatUpdate_UpdateDatList_Empty_Directories_found_in", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ERROR Deleting a DAT that should already be deleted. + /// + internal static string DatUpdate_UpdateDatList_ERROR_Deleting_a_DAT_that_should_already_be_deleted { + get { + return ResourceManager.GetString("DatUpdate_UpdateDatList_ERROR_Deleting_a_DAT_that_should_already_be_deleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Not Found.. + /// + internal static string DatUpdate_UpdateDatList_Not_Found { + get { + return ResourceManager.GetString("DatUpdate_UpdateDatList_Not_Found", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Path: . + /// + internal static string DatUpdate_UpdateDatList_Path { + get { + return ResourceManager.GetString("DatUpdate_UpdateDatList_Path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to RomValue Scan Error:. + /// + internal static string DatUpdate_UpdateDatList_RomValue_Scan_Error { + get { + return ResourceManager.GetString("DatUpdate_UpdateDatList_RomValue_Scan_Error", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data Cache version is out of date you should now rescan your dat directory and roms directory.. + /// + internal static string DB_Read_Data_Cache_version_is_out_of_date_you_should_now_rescan_your_dat_directory_and_roms_directory_ { + get { + return ResourceManager.GetString("DB_Read_Data_Cache_version_is_out_of_date_you_should_now_rescan_your_dat_director" + + "y_and_roms_directory_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error in File Scanning Code.. + /// + internal static string FileScanning_CheckADir_Error_in_File_Scanning_Code { + get { + return ResourceManager.GetString("FileScanning_CheckADir_Error_in_File_Scanning_Code", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error Case . + /// + internal static string FindFixes_ListCheck_Error_Case { + get { + return ResourceManager.GetString("FindFixes_ListCheck_Error_Case", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nothing Set For . + /// + internal static string FindFixes_ListCheck_Nothing_Set_For { + get { + return ResourceManager.GetString("FindFixes_ListCheck_Nothing_Set_For", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown test status . + /// + internal static string FindFixes_ListCheck_Unknown_test_status { + get { + return ResourceManager.GetString("FindFixes_ListCheck_Unknown_test_status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown result type. + /// + internal static string FixFiles_FixDirChildren_Unknown_result_type { + get { + return ResourceManager.GetString("FixFiles_FixDirChildren_Unknown_result_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to But the case of the unknown file is wrong. Rescan and try agian.. + /// + internal static string FixFiles_FixFile__But_the_case_of_the_unknown_file_is_wrong_Rescan_and_try_agian { + get { + return ResourceManager.GetString("FixFiles_FixFile__But_the_case_of_the_unknown_file_is_wrong_Rescan_and_try_agian", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Did you manualy fix this file without rescanning?. + /// + internal static string FixFiles_FixFile__Did_you_manualy_fix_this_file_without_rescanning { + get { + return ResourceManager.GetString("FixFiles_FixFile__Did_you_manualy_fix_this_file_without_rescanning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trying to fix a file that already exists . + /// + internal static string FixFiles_FixFile_Trying_to_fix_a_file_that_already_exists { + get { + return ResourceManager.GetString("FixFiles_FixFile_Trying_to_fix_a_file_that_already_exists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to Find the file used to fix . + /// + internal static string FixFiles_FixFile_Unable_to_Find_the_file_used_to_fix { + get { + return ResourceManager.GetString("FixFiles_FixFile_Unable_to_Find_the_file_used_to_fix", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown fix file type . + /// + internal static string FixFiles_FixFile_Unknown_fix_file_type { + get { + return ResourceManager.GetString("FixFiles_FixFile_Unknown_fix_file_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unsupported file Fix. + /// + internal static string FixFiles_FixFile_Unsupported_file_Fix { + get { + return ResourceManager.GetString("FixFiles_FixFile_Unsupported_file_Fix", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to : . + /// + internal static string FixFiles_FixZip_Colon { + get { + return ResourceManager.GetString("FixFiles_FixZip_Colon", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error finding Fixing Rom, Database is corrupt.. + /// + internal static string FixFiles_FixZip_Error_finding_Fixing_Rom_Database_is_corrupt { + get { + return ResourceManager.GetString("FixFiles_FixZip_Error_finding_Fixing_Rom_Database_is_corrupt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error in Fix Rom Status . + /// + internal static string FixFiles_FixZip_Error_in_Fix_Rom_Status { + get { + return ResourceManager.GetString("FixFiles_FixZip_Error_in_Fix_Rom_Status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error processing zip . + /// + internal static string FixFiles_FixZip_Error_processing_zip { + get { + return ResourceManager.GetString("FixFiles_FixZip_Error_processing_zip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This Delete case should never happen, help . + /// + internal static string FixFiles_FixZip_This_Delete_case_should_never_happen__help { + get { + return ResourceManager.GetString("FixFiles_FixZip_This_Delete_case_should_never_happen__help", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This Delete case should never happen, you do not delete a rom you collect.. + /// + internal static string FixFiles_FixZip_This_Delete_case_should_never_happen__you_do_not_delete_a_rom_you_collect { + get { + return ResourceManager.GetString("FixFiles_FixZip_This_Delete_case_should_never_happen__you_do_not_delete_a_rom_you" + + "_collect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown type. + /// + internal static string FixFiles_FixZip_Unknown_type { + get { + return ResourceManager.GetString("FixFiles_FixZip_Unknown_type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to did you delete it?. + /// + internal static string FixFiles_OpenOriginalZip_did_you_delete_it { + get { + return ResourceManager.GetString("FixFiles_OpenOriginalZip_did_you_delete_it", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File not found :. + /// + internal static string FixFiles_OpenOriginalZip_File_not_found { + get { + return ResourceManager.GetString("FixFiles_OpenOriginalZip_File_not_found", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File TimeStamp has changed in file . + /// + internal static string FixFiles_OpenOriginalZip_File_TimeStamp_has_changed_in_file { + get { + return ResourceManager.GetString("FixFiles_OpenOriginalZip_File_TimeStamp_has_changed_in_file", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found an unknown file :. + /// + internal static string FixFiles_OpenOriginalZip_Found_an_unknown_file { + get { + return ResourceManager.GetString("FixFiles_OpenOriginalZip_Found_an_unknown_file", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trying to open an unscanned file :. + /// + internal static string FixFiles_OpenOriginalZip_Trying_to_open_an_unscanned_file { + get { + return ResourceManager.GetString("FixFiles_OpenOriginalZip_Trying_to_open_an_unscanned_file", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown File Open Type.. + /// + internal static string FixFiles_OpenOriginalZip_Unknown_File_Open_Type { + get { + return ResourceManager.GetString("FixFiles_OpenOriginalZip_Unknown_File_Open_Type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trying to fix unscanned dir's. + /// + internal static string FixFiles_PerformFixes_Trying_to_fix_unscanned_dir_s { + get { + return ResourceManager.GetString("FixFiles_PerformFixes_Trying_to_fix_unscanned_dir_s", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set ROM DIR. + /// + internal static string FrmMain_DirTreeRvSelected_Set_ROM_DIR { + get { + return ResourceManager.GetString("FrmMain_DirTreeRvSelected_Set_ROM_DIR", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File Type Missing . + /// + internal static string FrmMain_UpdateRomGrid_File_Type_Missing_ { + get { + return ResourceManager.GetString("FrmMain_UpdateRomGrid_File_Type_Missing_", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Directory Settings. + /// + internal static string FrmSetDir_BtnDeleteSelectedClick_Directory_Settings { + get { + return ResourceManager.GetString("FrmSetDir_BtnDeleteSelectedClick_Directory_Settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to RomVault Rom Location. + /// + internal static string FrmSetDir_BtnDeleteSelectedClick_RomVault_Rom_Location { + get { + return ResourceManager.GetString("FrmSetDir_BtnDeleteSelectedClick_RomVault_Rom_Location", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You cannot delete the . + /// + internal static string FrmSetDir_BtnDeleteSelectedClick_You_cannot_delete_the { + get { + return ResourceManager.GetString("FrmSetDir_BtnDeleteSelectedClick_You_cannot_delete_the", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please select a folder for This Rom Set. + /// + internal static string FrmSetDir_BtnSetRomLocationClick_Please_select_a_folder_for_This_Rom_Set { + get { + return ResourceManager.GetString("FrmSetDir_BtnSetRomLocationClick_Please_select_a_folder_for_This_Rom_Set", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit Existing Directory Mapping. + /// + internal static string FrmSetDir_DataGridGamesDoubleClick_Edit_Existing_Directory_Mapping { + get { + return ResourceManager.GetString("FrmSetDir_DataGridGamesDoubleClick_Edit_Existing_Directory_Mapping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please select a folder for DAT Root. + /// + internal static string FrmSettings_BtnDatClick_Please_select_a_folder_for_DAT_Root { + get { + return ResourceManager.GetString("FrmSettings_BtnDatClick_Please_select_a_folder_for_DAT_Root", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is a new release download now from . + /// + internal static string Program_Main_There_is_a_new_release_download_now_from { + get { + return ResourceManager.GetString("Program_Main_There_is_a_new_release_download_now_from", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You are not Authorised to use this program.. + /// + internal static string Program_Main_You_are_not_Authorised_to_use_this_program { + get { + return ResourceManager.GetString("Program_Main_You_are_not_Authorised_to_use_this_program", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You must have a 'user - <NAME>.xml' file to use RomVault. + /// + internal static string Program_Main_You_must_have_a__user____NAME__xml__file_to_use_RomVault { + get { + return ResourceManager.GetString("Program_Main_You_must_have_a__user____NAME__xml__file_to_use_RomVault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close. + /// + internal static string ProgressWindowFix_DoDone_Close { + get { + return ResourceManager.GetString("ProgressWindowFix_DoDone_Close", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancelling. + /// + internal static string ProgressWindowFix_OnClosing_Cancelling { + get { + return ResourceManager.GetString("ProgressWindowFix_OnClosing_Cancelling", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please select a folder for Dats. + /// + internal static string Report_MakeFixFiles_Please_select_a_folder_for_Dats { + get { + return ResourceManager.GetString("Report_MakeFixFiles_Please_select_a_folder_for_Dats", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to , . + /// + internal static string RvBase_Check { + get { + return ResourceManager.GetString("RvBase_Check", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown Error Status File . + /// + internal static string RvBase_Check_Unknown_Error_Status_File { + get { + return ResourceManager.GetString("RvBase_Check_Unknown_Error_Status_File", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dat found without an index. + /// + internal static string RvBase_Read_Dat_found_without_an_index { + get { + return ResourceManager.GetString("RvBase_Read_Dat_found_without_an_index", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown Set Got Status . + /// + internal static string RvBase_SetGot_Unknown_Set_Got_Status { + get { + return ResourceManager.GetString("RvBase_SetGot_Unknown_Set_Got_Status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clearing Dir with a dat list. + /// + internal static string RvDir_ClearDat_Clearing_Dir_with_a_dat_list { + get { + return ResourceManager.GetString("RvDir_ClearDat_Clearing_Dir_with_a_dat_list", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Setting Dir with a dat list. + /// + internal static string RvDir_SetDat_Setting_Dir_with_a_dat_list { + get { + return ResourceManager.GetString("RvDir_SetDat_Setting_Dir_with_a_dat_list", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Count went negative.. + /// + internal static string RvDir_UpdateArrGotStatus_Count_went_negative { + get { + return ResourceManager.GetString("RvDir_UpdateArrGotStatus_Count_went_negative", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown Reset Got status . + /// + internal static string Utils_ResetGotStatus_Unknown_Reset_Got_status { + get { + return ResourceManager.GetString("Utils_ResetGotStatus_Unknown_Reset_Got_status", resourceCulture); + } + } + } +} diff --git a/ROMVault2/Properties/Resources.resx b/ROMVault2/Properties/Resources.resx new file mode 100644 index 0000000..26249ad --- /dev/null +++ b/ROMVault2/Properties/Resources.resx @@ -0,0 +1,345 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Error dat found on item listed as not in dat + + + This is bad, rBase.Dat is set to a dat, and rBase.DatStatus is not + + + Unknown File Delete Test + + + Got to a non dir when checking Dir's for dats to remove + + + Unknown file setup + + + Path: + + + Not Found. + + + Empty Directories found in ' + + + ' Directory will be ignored. + + + RomValue Scan Error: + + + Error: key word ' + + + ' not known + + + ( not found after clrmamepro + + + ' not known in clrmamepro + + + ( not found after game + + + Name not found as first object in ( ) + + + ' not known in game + + + ( not found after rom + + + ' not known in rom + + + Trying to fix a file that already exists + + + Did you manualy fix this file without rescanning? + + + But the case of the unknown file is wrong. Rescan and try agian. + + + Unable to Find the file used to fix + + + Unsupported file Fix + + + Unknown fix file type + + + Error finding Fixing Rom, Database is corrupt. + + + Unknown type + + + This Delete case should never happen, you do not delete a rom you collect. + + + This Delete case should never happen, help + + + Unknown File Open Type. + + + File TimeStamp has changed in file + + + File not found : + + + Trying to open an unscanned file : + + + Found an unknown file : + + + did you delete it? + + + Trying to fix unscanned dir's + + + Error in Logic + + + Unkown Update Dat Status + + + File Type Missing + + + Dat found without an index + + + Clearing Dir with a dat list + + + Setting Dir with a dat list + + + Data Cache version is out of date you should now rescan your dat directory and roms directory. + + + Cancelling + + + Close + + + Unknown test status + + + , + + + Error Case + + + Nothing Set For + + + Unknown Reset Got status + + + Please select a folder for This Rom Set + + + You cannot delete the + + + Directory Settings + + + RomVault Rom Location + + + Edit Existing Directory Mapping + + + Please select a folder for DAT Root + + + Unknown Error Status File + + + , + + + Unknown Set Got Status + + + Count went negative. + + + This should also never happen. + + + Unknown Merge Status + + + Unknown result type + + + Error in Fix Rom Status + + + : + + + Error in File Scanning Code. + + + Error Keyword + + + not know in dir + + + You must have a 'user - <NAME>.xml' file to use RomVault + + + You are not Authorised to use this program. + + + There is a new release download now from + + + ERROR Deleting a DAT that should already be deleted + + + Error processing zip + + + Please select a folder for Dats + + + Set ROM DIR + + \ No newline at end of file diff --git a/ROMVault2/Properties/Settings.Designer.cs b/ROMVault2/Properties/Settings.Designer.cs new file mode 100644 index 0000000..8d7048d --- /dev/null +++ b/ROMVault2/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34003 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ROMVault2.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.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/ROMVault2/Properties/Settings.settings b/ROMVault2/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/ROMVault2/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ROMVault2/ROMVault2.csproj b/ROMVault2/ROMVault2.csproj new file mode 100644 index 0000000..3af2556 --- /dev/null +++ b/ROMVault2/ROMVault2.csproj @@ -0,0 +1,337 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {437E12AB-46F3-4A75-A3D5-6C524B5A79B5} + WinExe + Properties + ROMVault2 + ROMVault21 + v3.5 + + + 512 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + x86 + true + full + false + ..\..\Stage\ + TRACE;DEBUG;UNMANAGED, COMPRESS, LZMA_STREAM, DOTNET20 + prompt + 4 + false + false + + + x86 + pdbonly + true + ..\..\Stage\ + TRACE + prompt + 4 + false + + + true + ..\..\Stage\ + TRACE;DEBUG;UNMANAGED, COMPRESS, LZMA_STREAM, DOTNET20 + full + x86 + ..\..\Stage2\ROMVault2.exe.CodeAnalysisLog.xml + true + GlobalSuppressions.cs + prompt + MinimumRecommendedRules.ruleset + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets + false + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules + false + + + ..\..\Stage\ + TRACE;UNMANAGED, COMPRESS, LZMA_STREAM, DOTNET20 + true + pdbonly + AnyCPU + bin\Release\ROMVault2.exe.CodeAnalysisLog.xml + true + GlobalSuppressions.cs + prompt + MinimumRecommendedRules.ruleset + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules + false + + + chip.ico + + + + + + + + + + + + + + + + + + + + + Form + + + FrmProgressWindowFix.cs + + + + + + + + + + + + + + + + + + + + + Form + + + frmHelpAbout.cs + + + Form + + + frmKey.cs + + + Form + + + FrmProgressWindow.cs + + + Form + + + FrmRegistration.cs + + + Form + + + frmSetDir.cs + + + Form + + + frmSettings.cs + + + + Form + + + frmShowError.cs + + + Form + + + frmSplashScreen.cs + + + + True + True + rvImages1.resx + + + + UserControl + + + rvTree.cs + + + True + True + Reference.svcmap + + + + + Form + + + FrmMain.cs + + + + + + + + + + + + + + + + + + + + + + + + + frmHelpAbout.cs + + + frmKey.cs + Designer + + + FrmMain.cs + + + FrmProgressWindow.cs + + + FrmProgressWindowFix.cs + + + FrmRegistration.cs + + + frmSettings.cs + Designer + + + frmShowError.cs + + + frmSplashScreen.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + ResXFileCodeGenerator + rvImages1.Designer.cs + Designer + + + rvTree.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Designer + + + + Designer + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + PreserveNewest + + + + + WCF Proxy Generator + Reference.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ROMVault2/RepairStatus.cs b/ROMVault2/RepairStatus.cs new file mode 100644 index 0000000..0e05480 --- /dev/null +++ b/ROMVault2/RepairStatus.cs @@ -0,0 +1,318 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using ROMVault2.RvDB; + +namespace ROMVault2 +{ + + public enum RepStatus + { + + // Scanning Status: + Error, + + UnSet, + + UnScanned, + + DirCorrect, + DirMissing, + DirUnknown, + DirInToSort, + DirCorrupt, + + + Missing, // a files or directory from a DAT that we do not have + Correct, // a files or directory from a DAT that we have + NotCollected, // a file from a DAT that is not collected that we do not have (either a merged or bad file.) + UnNeeded, // a file from a DAT that is not collected that we do have, and so do not need. (a merged file in a child set) + Unknown, // a file that is not in a DAT + InToSort, // a file that is in the ToSort directory + + Corrupt, // either a Zip file that is corrupt, or a Zipped file that is corrupt + Ignore, // a file found in the ignore list + + + // Fix Status: + CanBeFixed, // a missing file that can be fixed from another file. (Will be set to correct once it has been corrected) + MoveToSort, // a file that is not in any DAT (Unknown) and should be moved to ToSort + Delete, // a file that can be deleted + NeededForFix, // a file that is Unknown where it is, but is needed somewhere else. + Rename, // a file that is Unknown where it is, but is needed with other name inside the same Zip. + + CorruptCanBeFixed, // a corrupt file that can be replaced and fixed from another file. + MoveToCorrupt, // a corrupt file that should just be moved out the way to a corrupt directory in ToSort. + + Deleted, // this is a temporary value used while fixing sets, this value should never been seen. + + EndValue + + } + + public static class RepairStatus + { + public static List[, ,] StatusCheck; + + public static RepStatus[] DisplayOrder; + + + public static void InitStatusCheck() + { + StatusCheck = new List + [ + Enum.GetValues(typeof(FileType)).Length, + Enum.GetValues(typeof(DatStatus)).Length, + Enum.GetValues(typeof(GotStatus)).Length + ]; + + //sorted alphabetically + StatusCheck[(int)FileType.Dir, (int)DatStatus.InDatCollect, (int)GotStatus.Got] = new List { RepStatus.DirCorrect }; + StatusCheck[(int)FileType.Dir, (int)DatStatus.InDatCollect, (int)GotStatus.NotGot] = new List { RepStatus.DirMissing }; + StatusCheck[(int)FileType.Dir, (int)DatStatus.InToSort, (int)GotStatus.Got] = new List { RepStatus.DirInToSort }; + StatusCheck[(int)FileType.Dir, (int)DatStatus.InToSort, (int)GotStatus.NotGot] = new List { RepStatus.Deleted }; + StatusCheck[(int)FileType.Dir, (int)DatStatus.NotInDat, (int)GotStatus.Got] = new List { RepStatus.DirUnknown }; + StatusCheck[(int)FileType.Dir, (int)DatStatus.NotInDat, (int)GotStatus.NotGot] = new List { RepStatus.Deleted }; + + StatusCheck[(int)FileType.Zip, (int)DatStatus.InDatCollect, (int)GotStatus.Got] = new List { RepStatus.DirCorrect }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.InDatCollect, (int)GotStatus.Corrupt] = new List { RepStatus.DirCorrupt }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.InDatCollect, (int)GotStatus.FileLocked] = new List { RepStatus.UnScanned }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.InDatCollect, (int)GotStatus.NotGot] = new List { RepStatus.DirMissing }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.InToSort, (int)GotStatus.Got] = new List { RepStatus.DirInToSort }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.InToSort, (int)GotStatus.Corrupt] = new List { RepStatus.DirCorrupt }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.InToSort, (int)GotStatus.FileLocked] = new List { RepStatus.UnScanned }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.InToSort, (int)GotStatus.NotGot] = new List { RepStatus.Deleted }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.NotInDat, (int)GotStatus.Got] = new List { RepStatus.DirUnknown }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.NotInDat, (int)GotStatus.Corrupt] = new List { RepStatus.DirCorrupt }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.NotInDat, (int)GotStatus.FileLocked] = new List { RepStatus.UnScanned }; + StatusCheck[(int)FileType.Zip, (int)DatStatus.NotInDat, (int)GotStatus.NotGot] = new List { RepStatus.Deleted }; + + + StatusCheck[(int)FileType.File, (int)DatStatus.InDatBad, (int)GotStatus.FileLocked] = new List { RepStatus.UnScanned }; + StatusCheck[(int)FileType.File, (int)DatStatus.InDatBad, (int)GotStatus.NotGot] = new List { RepStatus.NotCollected }; + StatusCheck[(int)FileType.File, (int)DatStatus.InDatCollect, (int)GotStatus.Corrupt] = new List { RepStatus.Corrupt, RepStatus.MoveToCorrupt, RepStatus.CorruptCanBeFixed }; + StatusCheck[(int)FileType.File, (int)DatStatus.InDatCollect, (int)GotStatus.FileLocked] = new List { RepStatus.UnScanned }; + StatusCheck[(int)FileType.File, (int)DatStatus.InDatCollect, (int)GotStatus.Got] = new List { RepStatus.Correct }; + StatusCheck[(int)FileType.File, (int)DatStatus.InDatCollect, (int)GotStatus.NotGot] = new List { RepStatus.Missing, RepStatus.CanBeFixed }; + StatusCheck[(int)FileType.File, (int)DatStatus.InDatMerged, (int)GotStatus.Corrupt] = new List { RepStatus.Corrupt, RepStatus.MoveToCorrupt, RepStatus.Delete }; + StatusCheck[(int)FileType.File, (int)DatStatus.InDatMerged, (int)GotStatus.FileLocked] = new List { RepStatus.UnScanned }; + StatusCheck[(int)FileType.File, (int)DatStatus.InDatMerged, (int)GotStatus.Got] = new List { RepStatus.UnNeeded, RepStatus.Delete, RepStatus.NeededForFix }; + StatusCheck[(int)FileType.File, (int)DatStatus.InDatMerged, (int)GotStatus.NotGot] = new List { RepStatus.NotCollected }; + StatusCheck[(int)FileType.File, (int)DatStatus.InToSort, (int)GotStatus.Corrupt] = new List { RepStatus.Corrupt, RepStatus.Delete }; + StatusCheck[(int)FileType.File, (int)DatStatus.InToSort, (int)GotStatus.FileLocked] = new List { RepStatus.UnScanned }; + StatusCheck[(int)FileType.File, (int)DatStatus.InToSort, (int)GotStatus.Got] = new List { RepStatus.InToSort, RepStatus.Ignore, RepStatus.NeededForFix, RepStatus.Delete }; + StatusCheck[(int)FileType.File, (int)DatStatus.InToSort, (int)GotStatus.NotGot] = new List { RepStatus.Deleted }; + StatusCheck[(int)FileType.File, (int)DatStatus.NotInDat, (int)GotStatus.Corrupt] = new List { RepStatus.Corrupt, RepStatus.MoveToCorrupt, RepStatus.Delete }; + StatusCheck[(int)FileType.File, (int)DatStatus.NotInDat, (int)GotStatus.Got] = new List { RepStatus.Unknown, RepStatus.Ignore, RepStatus.Delete, RepStatus.MoveToSort, RepStatus.NeededForFix, RepStatus.Rename }; + StatusCheck[(int)FileType.File, (int)DatStatus.NotInDat, (int)GotStatus.FileLocked] = new List { RepStatus.UnScanned }; + StatusCheck[(int)FileType.File, (int)DatStatus.NotInDat, (int)GotStatus.NotGot] = new List { RepStatus.Deleted }; + + + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InDatBad, (int)GotStatus.NotGot] = new List { RepStatus.NotCollected }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InDatBad, (int)GotStatus.Got] = new List { RepStatus.Correct }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InDatCollect, (int)GotStatus.Corrupt] = new List { RepStatus.Corrupt, RepStatus.MoveToCorrupt, RepStatus.CorruptCanBeFixed }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InDatCollect, (int)GotStatus.Got] = new List { RepStatus.Correct }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InDatCollect, (int)GotStatus.FileLocked] = new List { RepStatus.UnScanned }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InDatCollect, (int)GotStatus.NotGot] = new List { RepStatus.Missing, RepStatus.CanBeFixed }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InDatMerged, (int)GotStatus.Got] = new List { RepStatus.UnNeeded, RepStatus.Delete, RepStatus.NeededForFix, RepStatus.Rename }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InDatMerged, (int)GotStatus.NotGot] = new List { RepStatus.NotCollected }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InToSort, (int)GotStatus.Corrupt] = new List { RepStatus.Corrupt, RepStatus.Delete }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InToSort, (int)GotStatus.Got] = new List { RepStatus.InToSort, RepStatus.NeededForFix, RepStatus.Delete }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.InToSort, (int)GotStatus.NotGot] = new List { RepStatus.Deleted }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.NotInDat, (int)GotStatus.Corrupt] = new List { RepStatus.Corrupt, RepStatus.MoveToCorrupt, RepStatus.Delete }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.NotInDat, (int)GotStatus.Got] = new List { RepStatus.Unknown, RepStatus.Delete, RepStatus.MoveToSort, RepStatus.NeededForFix, RepStatus.Rename }; + StatusCheck[(int)FileType.ZipFile, (int)DatStatus.NotInDat, (int)GotStatus.NotGot] = new List { RepStatus.Deleted }; + + DisplayOrder = new[] + { + RepStatus.Error, + RepStatus.UnSet, + + RepStatus.UnScanned, + + //RepStatus.DirCorrect, + //RepStatus.DirCorrectBadCase, + //RepStatus.DirMissing, + //RepStatus.DirUnknown, + RepStatus.DirCorrupt, + + RepStatus.MoveToCorrupt, + RepStatus.CorruptCanBeFixed, + RepStatus.CanBeFixed, + RepStatus.MoveToSort, + RepStatus.Delete, + RepStatus.NeededForFix, + RepStatus.Rename, + + RepStatus.Corrupt, + RepStatus.Unknown, + RepStatus.UnNeeded, + RepStatus.Missing, + RepStatus.Correct, + RepStatus.InToSort, + + RepStatus.NotCollected, + RepStatus.Ignore, + RepStatus.Deleted + }; + + } + + public static void ReportStatusReset(RvBase tBase) + { + + tBase.RepStatusReset(); + + FileType ftBase = tBase.FileType; + if (ftBase != FileType.Zip && ftBase != FileType.Dir) return; + + RvDir tDir = (RvDir)tBase; + + for (int i = 0; i < tDir.ChildCount; i++) + ReportStatusReset(tDir.Child(i)); + } + } + + public class ReportStatus + { + private readonly int[] _arrRepStatus = new int[(int)RepStatus.EndValue]; + + public void UpdateRepStatus(ReportStatus rs, int dir) + { + for (int i = 0; i < _arrRepStatus.Length; i++) + _arrRepStatus[i] += rs.Get((RepStatus)i) * dir; + } + + public void UpdateRepStatus(RepStatus rs, int dir) + { + _arrRepStatus[(int)rs] += dir; + } + + #region "arrGotStatus Processing" + + + + public int Get(RepStatus v) + { + return _arrRepStatus[(int)v]; + } + + public int CountCorrect() + { + return _arrRepStatus[(int)RepStatus.Correct]; + } + public bool HasCorrect() + { + return CountCorrect() > 0; + } + + public int CountMissing() + { + return ( + _arrRepStatus[(int)RepStatus.UnScanned] + + _arrRepStatus[(int)RepStatus.Missing] + + _arrRepStatus[(int)RepStatus.DirCorrupt] + + _arrRepStatus[(int)RepStatus.Corrupt] + + _arrRepStatus[(int)RepStatus.CanBeFixed] + + _arrRepStatus[(int)RepStatus.CorruptCanBeFixed] + ); + } + public bool HasMissing() + { + return CountMissing() > 0; + } + + + + public int CountFixesNeeded() + { + return ( + _arrRepStatus[(int)RepStatus.CanBeFixed] + + _arrRepStatus[(int)RepStatus.MoveToSort] + + _arrRepStatus[(int)RepStatus.Delete] + + _arrRepStatus[(int)RepStatus.NeededForFix] + + _arrRepStatus[(int)RepStatus.Rename] + + _arrRepStatus[(int)RepStatus.CorruptCanBeFixed] + + _arrRepStatus[(int)RepStatus.MoveToCorrupt] + ); + } + public bool HasFixesNeeded() + { + return CountFixesNeeded() > 0; + } + + + public int CountCanBeFixed() + { + return ( + _arrRepStatus[(int)RepStatus.CanBeFixed] + + _arrRepStatus[(int)RepStatus.CorruptCanBeFixed]); + } + + private int CountFixable() + { + return ( + _arrRepStatus[(int)RepStatus.CanBeFixed] + + _arrRepStatus[(int)RepStatus.MoveToSort] + + _arrRepStatus[(int)RepStatus.Delete] + + _arrRepStatus[(int)RepStatus.CorruptCanBeFixed] + + _arrRepStatus[(int)RepStatus.MoveToCorrupt] + ); + } + public bool HasFixable() + { + return CountFixable() > 0; + } + + private int CountAnyFiles() + { + // this list include probably more status's than are needed, but all are here to double check I don't delete something I should not. + return ( + _arrRepStatus[(int)RepStatus.Correct] + + _arrRepStatus[(int)RepStatus.UnNeeded] + + _arrRepStatus[(int)RepStatus.Unknown] + + _arrRepStatus[(int)RepStatus.InToSort] + + _arrRepStatus[(int)RepStatus.Corrupt] + + _arrRepStatus[(int)RepStatus.Ignore] + + _arrRepStatus[(int)RepStatus.MoveToSort] + + _arrRepStatus[(int)RepStatus.Delete] + + _arrRepStatus[(int)RepStatus.NeededForFix] + + _arrRepStatus[(int)RepStatus.Rename] + + _arrRepStatus[(int)RepStatus.MoveToCorrupt] + ); + } + public bool HasAnyFiles() + { + return CountAnyFiles() > 0; + } + + public int CountUnknown() + { + return _arrRepStatus[(int)RepStatus.Unknown]; + } + public bool HasUnknown() + { + return CountUnknown() > 0; + } + + + + public int CountInToSort() + { + return _arrRepStatus[(int)RepStatus.InToSort]; + } + public bool HasInToSort() + { + return CountInToSort() > 0; + } + + #endregion + + + } +} diff --git a/ROMVault2/Report.cs b/ROMVault2/Report.cs new file mode 100644 index 0000000..373f77c --- /dev/null +++ b/ROMVault2/Report.cs @@ -0,0 +1,430 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2 +{ + static class Report + { + private static StreamWriter _ts; + private static RvDat _tDat; + private static string _outdir; + + private static string Etxt(string e) + { + string ret = e; + ret = ret.Replace("&", "&"); + ret = ret.Replace("\"", """); + ret = ret.Replace("'", "'"); + ret = ret.Replace("<", "<"); + ret = ret.Replace(">", ">"); + + return ret; + } + + public static void MakeFixFiles() + { + _tDat = null; + _ts = null; + + FolderBrowserDialog browse = new FolderBrowserDialog + { + ShowNewFolderButton = true, + Description = @"Please select a folder for Dats", + RootFolder = Environment.SpecialFolder.DesktopDirectory, + SelectedPath = @"apps" + }; + + if (browse.ShowDialog() != DialogResult.OK) return; + + _outdir = browse.SelectedPath; + _tDat = null; + MakeFixFilesRecurse(DB.DirTree.Child(0), true); + + if (_ts == null) return; + + _ts.WriteLine(""); + _ts.Close(); + } + + private static void MakeFixFilesRecurse(RvBase b, bool selected) + { + if (selected) + { + if (b.Dat != null) + { + RvDir tDir = b as RvDir; + if (tDir != null && tDir.Game != null && tDir.DirStatus.HasMissing()) + { + if (_tDat != b.Dat) + { + if (_tDat != null) + { + _ts.WriteLine(""); + _ts.WriteLine(); + } + + if (_ts != null) _ts.Close(); + + _tDat = b.Dat; + int test = 0; + string datFilename = Path.Combine(_outdir, "fixDat_" + Path.GetFileNameWithoutExtension(_tDat.GetData(RvDat.DatData.DatFullName)) + ".dat"); + while (File.Exists(datFilename)) + { + test++; + datFilename = Path.Combine(_outdir, "fixDat_" + Path.GetFileNameWithoutExtension(_tDat.GetData(RvDat.DatData.DatFullName)) + "(" + test + ").dat"); + } + _ts = new StreamWriter(datFilename); + + _ts.WriteLine(""); + _ts.WriteLine( + ""); + _ts.WriteLine(""); + _ts.WriteLine(""); + _ts.WriteLine("\t
"); + _ts.WriteLine("\t\tfix_" + Etxt(_tDat.GetData(RvDat.DatData.DatName)) + ""); + if (_tDat.GetData(RvDat.DatData.SuperDat) == "superdat") + _ts.WriteLine("\t\tSuperDAT"); + _ts.WriteLine("\t\tfix_" + Etxt(_tDat.GetData(RvDat.DatData.Description)) + ""); + _ts.WriteLine("\t\tFIXDATFILE"); + _ts.WriteLine("\t\t" + DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss") + ""); + _ts.WriteLine("\t\t" + DateTime.Now.ToString("MM/dd/yyyy") + ""); + _ts.WriteLine("\t\tRomVault"); + _ts.WriteLine("\t
"); + } + + _ts.WriteLine("\t"); + if (!string.IsNullOrEmpty(tDir.Game.GetData(RvGame.GameData.Description))) + _ts.WriteLine("\t\t" + Etxt(tDir.Game.GetData(RvGame.GameData.Description)) + ""); + + } + + RvFile tRom = b as RvFile; + if (tRom != null) + { + + if (tRom.DatStatus == DatStatus.InDatCollect && tRom.GotStatus != GotStatus.Got) + { + string strRom; + if (tRom.FileStatusIs(FileStatus.SHA1CHDFromDAT | FileStatus.MD5CHDFromDAT)) + strRom = "\t\t"); + } + } + } + + } + + private enum ReportType + { + Complete, + CompletelyMissing, + PartialMissing, + Fixing + } + + private static string CleanTime() + { + return " (" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ")"; + } + + public static void GenerateReport() + { + SaveFileDialog saveFileDialog1 = new SaveFileDialog + { + Title = @"Generate Full Report", + FileName = @"RVFullReport"+CleanTime()+".txt", + Filter = @"Rom Vault Report (*.txt)|*.txt|All Files (*.*)|*.*", + FilterIndex = 1 + }; + + if (saveFileDialog1.ShowDialog() == DialogResult.OK) + { + _ts = new StreamWriter(saveFileDialog1.FileName); + + _ts.WriteLine("Complete DAT Sets"); + _ts.WriteLine("-----------------------------------------"); + FindAllDats(DB.DirTree.Child(0), ReportType.Complete); + _ts.WriteLine(""); + _ts.WriteLine(""); + _ts.WriteLine("Empty DAT Sets"); + _ts.WriteLine("-----------------------------------------"); + FindAllDats(DB.DirTree.Child(0), ReportType.CompletelyMissing); + _ts.WriteLine(""); + _ts.WriteLine(""); + _ts.WriteLine("Partial DAT Sets - (Listing Missing ROMs)"); + _ts.WriteLine("-----------------------------------------"); + FindAllDats(DB.DirTree.Child(0), ReportType.PartialMissing); + _ts.Close(); + } + } + + public static void GenerateFixReport() + { + SaveFileDialog saveFileDialog1 = new SaveFileDialog + { + Title = @"Generate Fix Report", + FileName = @"RVFixReport"+CleanTime()+".txt", + Filter = @"Rom Vault Fixing Report (*.txt)|*.txt|All Files (*.*)|*.*", + FilterIndex = 1 + }; + + if (saveFileDialog1.ShowDialog() == DialogResult.OK) + { + _ts = new StreamWriter(saveFileDialog1.FileName); + + _ts.WriteLine("Listing Fixes"); + _ts.WriteLine("-----------------------------------------"); + FindAllDats(DB.DirTree.Child(0), ReportType.Fixing); + _ts.Close(); + } + } + + private static void FindAllDats(RvBase b, ReportType rt) + { + RvDir d = b as RvDir; + if (d == null) return; + if (d.DirDatCount > 0) + { + for (int i = 0; i < d.DirDatCount; i++) + { + RvDat dat = d.DirDat(i); + + int correct = 0; + int missing = 0; + int fixesNeeded = 0; + + if (d.Dat == dat) + { + correct += d.DirStatus.CountCorrect(); + missing += d.DirStatus.CountMissing(); + fixesNeeded += d.DirStatus.CountFixesNeeded(); + } + else + { + for (int j = 0; j < d.ChildCount; j++) + { + RvDir c = d.Child(j) as RvDir; + + if (c == null || c.Dat != dat) continue; + + correct += c.DirStatus.CountCorrect(); + missing += c.DirStatus.CountMissing(); + fixesNeeded += c.DirStatus.CountFixesNeeded(); + + } + } + + switch (rt) + { + case ReportType.Complete: + if (correct > 0 && missing == 0 && fixesNeeded == 0) + _ts.WriteLine(RemoveBase(dat.GetData(RvDat.DatData.DatFullName))); + break; + case ReportType.CompletelyMissing: + if (correct == 0 && missing > 0 && fixesNeeded == 0) + _ts.WriteLine(RemoveBase(dat.GetData(RvDat.DatData.DatFullName))); + break; + case ReportType.PartialMissing: + if ((correct > 0 && missing > 0) || fixesNeeded > 0) + { + _ts.WriteLine(RemoveBase(dat.GetData(RvDat.DatData.DatFullName))); + _fileNameLength = 0; + _fileSizeLength = 0; + _repStatusLength = 0; + ReportMissingFindSizes(d, dat, rt); + ReportDrawBars(); + ReportMissing(d, dat, rt); + ReportDrawBars(); + _ts.WriteLine(); + } + break; + case ReportType.Fixing: + if (fixesNeeded > 0) + { + _ts.WriteLine(RemoveBase(dat.GetData(RvDat.DatData.DatFullName))); + _fileNameLength = 0; + _fileSizeLength = 0; + _repStatusLength = 0; + ReportMissingFindSizes(d, dat, rt); + ReportDrawBars(); + ReportMissing(d, dat, rt); + ReportDrawBars(); + _ts.WriteLine(); + } + break; + } + } + } + + if (b.Dat != null) return; + + for (int i = 0; i < d.ChildCount; i++) + FindAllDats(d.Child(i), rt); + } + + private static string RemoveBase(string name) + { + int p = name.IndexOf("\\", StringComparison.Ordinal); + return p > 0 ? name.Substring(p + 1) : name; + } + + private static int _fileNameLength; + private static int _fileSizeLength; + private static int _repStatusLength; + + private static readonly RepStatus[] Partial = + { + RepStatus.UnScanned, + RepStatus.Missing, + RepStatus.Corrupt, + RepStatus.CanBeFixed, + RepStatus.CorruptCanBeFixed, + }; + + private static readonly RepStatus[] Fixing = + { + RepStatus.CanBeFixed, + RepStatus.MoveToSort, + RepStatus.Delete, + RepStatus.NeededForFix, + RepStatus.Rename, + RepStatus.CorruptCanBeFixed, + RepStatus.MoveToCorrupt + }; + + + private static void ReportMissingFindSizes(RvDir dir, RvDat dat, ReportType rt) + { + for (int i = 0; i < dir.ChildCount; i++) + { + RvBase b = dir.Child(i); + if (b.Dat != null && b.Dat != dat) + continue; + + RvFile f = b as RvFile; + + if (f != null) + { + if ( + (rt == ReportType.PartialMissing && Partial.Contains(f.RepStatus)) || + (rt == ReportType.Fixing && Fixing.Contains(f.RepStatus)) + ) + { + int fileNameLength = f.FileNameInsideGame().Length; + int fileSizeLength = f.Size.ToString().Length; + int repStatusLength = f.RepStatus.ToString().Length; + + if (fileNameLength > _fileNameLength) _fileNameLength = fileNameLength; + if (fileSizeLength > _fileSizeLength) _fileSizeLength = fileSizeLength; + if (repStatusLength > _repStatusLength) _repStatusLength = repStatusLength; + } + } + RvDir d = b as RvDir; + if (d != null) + ReportMissingFindSizes(d, dat, rt); + } + + } + + private static void ReportDrawBars() + { + _ts.WriteLine("+" + new string('-', _fileNameLength + 2) + "+" + new string('-', _fileSizeLength + 2) + "+----------+" + new string('-', _repStatusLength + 2) + "+"); + } + + private static void ReportMissing(RvDir dir, RvDat dat, ReportType rt) + { + for (int i = 0; i < dir.ChildCount; i++) + { + RvBase b = dir.Child(i); + if (b.Dat != null && b.Dat != dat) + continue; + + RvFile f = b as RvFile; + + if (f != null) + { + if ( + (rt == ReportType.PartialMissing && Partial.Contains(f.RepStatus)) || + (rt == ReportType.Fixing && Fixing.Contains(f.RepStatus)) + ) + { + string filename = f.FileNameInsideGame(); + string crc = ArrByte.ToString(f.CRC); + _ts.WriteLine("| " + filename + new string(' ', _fileNameLength + 1 - filename.Length) + "| " + + f.Size + new string(' ', _fileSizeLength + 1 - f.Size.ToString().Length) + "| " + + crc + new string(' ', 9 - crc.Length) + "| " + + f.RepStatus + new string(' ', _repStatusLength + 1 - f.RepStatus.ToString().Length) + "|"); + } + } + RvDir d = b as RvDir; + if (d != null) + ReportMissing(d, dat, rt); + } + + } + + } +} diff --git a/ROMVault2/ReportError.cs b/ROMVault2/ReportError.cs new file mode 100644 index 0000000..6abeefd --- /dev/null +++ b/ROMVault2/ReportError.cs @@ -0,0 +1,228 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.ServiceModel; +using System.Windows.Forms; +using ROMVault2.RVRef; +using ROMVault2.RvDB; +using ROMVault2.Utils; + + +namespace ROMVault2 +{ + public static class ReportError + { + + public static void UnhandledExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e) + { + try + { + // Create Error Message + string message = string.Format("An Application Error has occurred.\r\n\r\nEXCEPTION:\r\nSource: {0}\r\nMessage: {1}\r\n", e.Exception.Source, e.Exception.Message); + if (e.Exception.InnerException != null) + { + message += string.Format("\r\nINNER EXCEPTION:\r\nSource: {0}\r\nMessage: {1}\r\n", e.Exception.InnerException.Source, e.Exception.InnerException.Message); + } + message += string.Format("\r\nSTACK TRACE:\r\n{0}", e.Exception.StackTrace); + + SendErrorMessage(message); + + frmShowError fshow = new frmShowError(); + fshow.settype(message); + fshow.ShowDialog(); + + Environment.Exit(0); + } + catch + { + Environment.Exit(0); + } + } + + public static void UnhandledExceptionHandler(Exception e) + { + try + { + // Create Error Message + string message = string.Format("An Application Error has occurred.\r\n\r\nEXCEPTION:\r\nSource: {0}\r\nMessage: {1}\r\n", e.Source, e.Message); + if (e.InnerException != null) + { + message += string.Format("\r\nINNER EXCEPTION:\r\nSource: {0}\r\nMessage: {1}\r\n", e.InnerException.Source, e.InnerException.Message); + } + message += string.Format("\r\nSTACK TRACE:\r\n{0}", e.StackTrace); + + SendErrorMessage(message); + + frmShowError fshow = new frmShowError(); + fshow.settype(message); + fshow.ShowDialog(); + + } + catch + { + } + } + + public static void UnhandledExceptionHandler(string e1) + { + try + { + // Create Error Message + string message = string.Format("An Application Error has occurred.\r\n\r\nEXCEPTION:\r\nMessage:"); + message += e1 + "\r\n"; + + message += string.Format("\r\nSTACK TRACE:\r\n{0}", Environment.StackTrace); + + SendErrorMessage(message); + + frmShowError fshow = new frmShowError(); + fshow.settype(message); + fshow.ShowDialog(); + + Environment.Exit(0); + } + catch + { + Environment.Exit(0); + } + } + + + //public static void SendAndShowDat(string message, string filename) + //{ + // SendErrorMessageDat(message, filename); + // Show(message, "RomVault - Dat Reading Error"); + //} + + public static void SendAndShow(string message, string caption = "RomVault", MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxIcon icon = MessageBoxIcon.Exclamation) + { + SendErrorMessage(message); + Show(message, caption, buttons, icon); + } + + public static void Show(string text, string caption = "RomVault", MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxIcon icon = MessageBoxIcon.Exclamation) + { + if (Program.SyncCont != null) + Program.SyncCont.Send(callback => MessageBox.Show(text, caption, buttons, icon), null); + else + MessageBox.Show(text, caption, buttons, icon); + } + + public static void SendErrorMessage(string message) + { + + bool isNetworkAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); + if (!isNetworkAvailable) return; + + string st = Environment.StackTrace; + + BasicHttpBinding b = new BasicHttpBinding { SendTimeout = new TimeSpan(0, 0, 5), ReceiveTimeout = new TimeSpan(0, 0, 5) }; + EndpointAddress e = new EndpointAddress(@"http://services.romvault.com/Service1.svc"); + + Service1Client s = new Service1Client(b, e); + + try + { + s.SendErrorMessage3(Settings.Username, Settings.EMail, Program.Version, Program.SubVersion, message + "\n" + st); + } + catch + { + } + s.Close(); + } + + public static void SendErrorMessageDat(string message, string filename) + { + bool isNetworkAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); + if (!isNetworkAvailable) return; + + BasicHttpBinding b = new BasicHttpBinding { SendTimeout = new TimeSpan(0, 0, 5), ReceiveTimeout = new TimeSpan(0, 0, 5) }; + EndpointAddress e = new EndpointAddress(@"http://services.romvault.com/Service1.svc"); + + Service1Client s = new Service1Client(b, e); + + try + { + s.SendDATErrorMessage3(Settings.Username, Settings.EMail, Program.Version, Program.SubVersion, message, filename); + } + catch + { + } + s.Close(); + } + + private static string _logfilename; + + public static void ReportList(List files) + { + if (!Settings.DebugLogsEnabled) return; + + string dir, now; + OpenLogFile(out dir, out now); + dir = Path.Combine(dir, now + " DataBaseLog.txt"); + TextWriter sw = new StreamWriter(dir, false); + for (int i = 0; i < files.Count; i++) + { + RvFile f = files[i]; + f.ReportIndex = i; + ReportFile(sw, f); + } + + sw.Flush(); + sw.Close(); + } + + private static void OpenLogFile(out string dir, out string now) + { + dir = Path.Combine(Application.StartupPath, "Logs"); + if (!Directory.Exists(dir)) + Directory.CreateDirectory(dir); + + now = DateTime.Now.ToString(CultureInfo.InvariantCulture); + now = now.Replace("\\", "-"); + now = now.Replace("/", "-"); + now = now.Replace(":", "-"); + + _logfilename = Path.Combine(dir, now + " UpdateLog.txt"); + + } + + private static void ReportFile(TextWriter sw, RvFile f) + { + sw.WriteLine(f.ReportIndex.ToString("D8") + " " + ArrByte.ToString(f.CRC) + " " + f.GotStatus.ToString().PadRight(10) + " " + f.RepStatus.ToString().PadRight(15) + " " + f.TreeFullName); + } + + public static void LogOut(string s) + { + if (!Settings.DebugLogsEnabled) return; + + if (_logfilename == null) + { + string dir, now; + OpenLogFile(out dir, out now); + } + + StreamWriter sw = new StreamWriter(_logfilename, true); + sw.WriteLine(s); + sw.Flush(); + sw.Close(); + + } + public static void LogOut(RvFile f) + { + if (!Settings.DebugLogsEnabled) return; + + StreamWriter sw = new StreamWriter(_logfilename, true); + ReportFile(sw, f); + sw.Flush(); + sw.Close(); + } + } +} \ No newline at end of file diff --git a/ROMVault2/RvDB/DB.cs b/ROMVault2/RvDB/DB.cs new file mode 100644 index 0000000..a37b81e --- /dev/null +++ b/ROMVault2/RvDB/DB.cs @@ -0,0 +1,138 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System.ComponentModel; +using System.IO; +using System.Threading; +using ROMVault2.Properties; + +namespace ROMVault2.RvDB +{ + + + public static class DBVersion + { + public static int VersionNow; + public const int Version = 7; + } + + public static class DB + { + private const ulong EndCacheMarker = 0x15a600dda7; + + public static BackgroundWorker Bgw; + + public static RvDir DirTree; + + private static void OpenDefaultDB() + { + DirTree = new RvDir(FileType.Dir) + { + Tree = new RvTreeRow(), + DatStatus = DatStatus.InDatCollect + }; + + RvDir rv = new RvDir(FileType.Dir) + { + Name = "RomVault", + Tree = new RvTreeRow(), + DatStatus = DatStatus.InDatCollect + }; + DirTree.ChildAdd(rv); + + RvDir ts = new RvDir(FileType.Dir) + { + Name = "ToSort", + Tree = new RvTreeRow(), + DatStatus = DatStatus.InDatCollect + }; + DirTree.ChildAdd(ts); + } + + public static void Write() + { + if (File.Exists(Settings.CacheFile)) + { + string bname = Settings.CacheFile + "Backup"; + if (File.Exists(bname)) + File.Delete(bname); + File.Move(Settings.CacheFile, bname); + + } + FileStream fs = new FileStream(Settings.CacheFile, FileMode.CreateNew, FileAccess.Write); + BinaryWriter bw = new BinaryWriter(fs); + DBVersion.VersionNow = DBVersion.Version; + bw.Write(DBVersion.Version); + DirTree.Write(bw); + + bw.Write(EndCacheMarker); + + bw.Flush(); + bw.Close(); + + fs.Close(); + fs.Dispose(); + } + public static void Read(object sender, DoWorkEventArgs e) + { + Bgw = sender as BackgroundWorker; + Program.SyncCont = e.Argument as SynchronizationContext; + + if (!File.Exists(Settings.CacheFile)) + { + OpenDefaultDB(); + Bgw = null; + Program.SyncCont = null; + return; + } + DirTree = new RvDir(FileType.Dir); + FileStream fs = new FileStream(Settings.CacheFile, FileMode.Open, FileAccess.Read); + if (fs.Length < 4) + ReportError.UnhandledExceptionHandler("Cache is Corrupt, revert to Backup."); + + + BinaryReader br = new BinaryReader(fs); + + if (Bgw != null) + Bgw.ReportProgress(0, new bgwSetRange((int)fs.Length)); + + DBVersion.VersionNow = br.ReadInt32(); + + if (DBVersion.VersionNow != DBVersion.Version) + { + ReportError.Show(Resources.DB_Read_Data_Cache_version_is_out_of_date_you_should_now_rescan_your_dat_directory_and_roms_directory_); + OpenDefaultDB(); + } + else + { + DirTree.Read(br, null); + } + + if (fs.Position > fs.Length - 8) + ReportError.UnhandledExceptionHandler("Cache is Corrupt, revert to Backup."); + + ulong testEOF = br.ReadUInt64(); + if (testEOF != EndCacheMarker) + ReportError.UnhandledExceptionHandler("Cache is Corrupt, revert to Backup."); + + br.Close(); + fs.Close(); + fs.Dispose(); + + Bgw = null; + Program.SyncCont = null; + } + + public static string Fn(string v) + { + return v ?? ""; + } + } + +} + + + diff --git a/ROMVault2/RvDB/FileStatus.cs b/ROMVault2/RvDB/FileStatus.cs new file mode 100644 index 0000000..074e331 --- /dev/null +++ b/ROMVault2/RvDB/FileStatus.cs @@ -0,0 +1,35 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; + +namespace ROMVault2.RvDB +{ + [Flags] + public enum FileStatus + { + SizeFromDAT = 0x00000001, + CRCFromDAT = 0x00000002, + SHA1FromDAT = 0x00000004, + MD5FromDAT = 0x00000008, + SHA1CHDFromDAT = 0x00000010, + MD5CHDFromDAT = 0x00000020, + + SizeFromHeader = 0x00000100, + CRCFromHeader = 0x00000200, + SHA1FromHeader = 0x00000400, + MD5FromHeader = 0x00000800, + SHA1CHDFromHeader = 0x00001000, + MD5CHDFromHeader = 0x00002000, + + SizeVerified = 0x00010000, + CRCVerified = 0x00020000, + SHA1Verified = 0x00040000, + MD5Verified = 0x00080000, + SHA1CHDVerified = 0x00100000, + MD5CHDVerified = 0x00200000 + } +} diff --git a/ROMVault2/RvDB/RvBase.cs b/ROMVault2/RvDB/RvBase.cs new file mode 100644 index 0000000..063ad43 --- /dev/null +++ b/ROMVault2/RvDB/RvBase.cs @@ -0,0 +1,308 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using ROMVault2.Properties; + +namespace ROMVault2.RvDB +{ + public enum DatStatus { InDatCollect, InDatMerged, InDatBad, NotInDat, InToSort } + public enum GotStatus { NotGot, Got, Corrupt, FileLocked } + public enum FileType { Unknown, Dir, Zip, xSevenZip, xRAR, File, ZipFile, xSevenZipFile } + + public abstract class RvBase + { + private readonly FileType _type; + + public string Name; // The Name of the File or Directory + public string FileName; // Found filename if different from Name + public RvDir Parent; // A link to the Parent Directory + public RvDat Dat; + public long TimeStamp; + public int ReportIndex; + + public bool SearchFound; + + private DatStatus _datStatus = DatStatus.NotInDat; + private GotStatus _gotStatus = GotStatus.NotGot; + private RepStatus _repStatus = RepStatus.UnSet; + + protected RvBase(FileType type) + { + _type = type; + } + + public FileType FileType + { + get { return _type; } + } + + public virtual void Write(BinaryWriter bw) + { + bw.Write(DB.Fn(Name)); + bw.Write(DB.Fn(FileName)); + bw.Write(TimeStamp); + if (Dat == null) + { + bw.Write(false); + } + else + { + //Debug.WriteLine("Dat is not null"); + bw.Write(true); + //Debug.WriteLine("Dat index is "+ Dat.DatIndex); + bw.Write(Dat.DatIndex); + } + + bw.Write((byte)_datStatus); + bw.Write((byte)_gotStatus); + } + public virtual void Read(BinaryReader br, List parentDirDats) + { + Name = br.ReadString(); + FileName = br.ReadString(); + TimeStamp = br.ReadInt64(); + bool foundDat = br.ReadBoolean(); + if (foundDat) + { + int index = br.ReadInt32(); + if (index == -1) + ReportError.SendAndShow(Resources.RvBase_Read_Dat_found_without_an_index); + else + Dat = parentDirDats[index]; + } + else + { + Dat = null; + } + + _datStatus = (DatStatus)br.ReadByte(); + _gotStatus = (GotStatus)br.ReadByte(); + RepStatusReset(); + } + + + public virtual EFile DatRemove() + { + Dat = null; + if (GotStatus == GotStatus.NotGot) + return EFile.Delete; + + if (!String.IsNullOrEmpty(FileName)) + { + Name = FileName; + FileName = null; + } + DatStatus = DatStatus.NotInDat; + return EFile.Keep; + } + public virtual void DatAdd(RvBase b) + { + // Parent , TimeStamp Should already be correct. + + if (GotStatus == GotStatus.NotGot) + ReportError.SendAndShow("Error Adding DAT to NotGot File " + b.GotStatus); + + SetStatus(b.DatStatus, GotStatus.Got); + + if (Name == b.Name) // case match so all is good + { + FileName = null; + } + else + { + FileName = Name; + Name = b.Name; + } + + Dat = b.Dat; + } + + public virtual EFile FileRemove() + { + TimeStamp = 0; + FileName = null; + + GotStatus = (Parent.GotStatus == GotStatus.FileLocked) ? GotStatus.FileLocked : GotStatus.NotGot; + switch (DatStatus) + { + case DatStatus.InDatCollect: + case DatStatus.InDatMerged: + case DatStatus.InDatBad: + return EFile.Keep; + + case DatStatus.NotInDat: + case DatStatus.InToSort: + return EFile.Delete; // this item should be removed from the db. + default: + ReportError.SendAndShow(Resources.RvBase_SetGot_Unknown_Set_Got_Status + DatStatus); + return EFile.Keep; + } + } + public virtual void FileAdd(RvBase file) + { + TimeStamp = file.TimeStamp; + FileCheckName(file); + if (file.GotStatus == GotStatus.NotGot) + ReportError.SendAndShow("Error setting got to a NotGot File"); + GotStatus = file.GotStatus; + } + + public void FileCheckName(RvBase file) + { + // Don't care about bad case if the file is not in a dat. + if (DatStatus == DatStatus.NotInDat || DatStatus == DatStatus.InToSort) + Name = file.Name; + + FileName = Name == file.Name ? null : file.Name; + } + + public virtual void CopyTo(RvBase c) + { + c.Name = Name; + c.FileName = FileName; + //c.Parent = Parent; + c.Dat = Dat; + c.TimeStamp = TimeStamp; + c.ReportIndex = ReportIndex; + c._datStatus = _datStatus; + c._gotStatus = _gotStatus; + c.RepStatus = RepStatus; + } + + + + private string Extention + { + get + { + switch (FileType) + { + case FileType.Zip: return ".zip"; + //case FileType.SevenZip: return ".7z"; + //case FileType.RAR: return ".rar"; + } + return ""; + } + } + public string FullName + { + get { return DBHelper.GetRealPath(TreeFullName); } + } + public string DatFullName + { + get { return DBHelper.GetDatPath(TreeFullName); } + } + public string TreeFullName + { + get + { + if (Parent == null) return Name + Extention; + return IO.Path.Combine(Parent.TreeFullName, Name + Extention); + } + } + public bool IsInToSort + { + get + { + string fullName = TreeFullName; + return fullName.Substring(0, 6) == "ToSort"; + } + } + + public string SuperDatFileName() + { + return SuperDatFileName(Dat); + } + + private string SuperDatFileName(RvDat dat) + { + if (dat.AutoAddDirectory) + { + if (Parent == null || Parent.Parent == null || Parent.Parent.Dat != dat) return Name; + } + else + { + if (Parent == null || Parent.Dat != dat) return Name; + } + return IO.Path.Combine(Parent.SuperDatFileName(dat), Name); + } + + public string FileNameInsideGame() + { + RvDir d = this as RvDir; + if (d != null && d.Game != null) return Name; + + return IO.Path.Combine(Parent.FileNameInsideGame(), Name); + } + + public DatStatus DatStatus + { + set + { + _datStatus = value; + RepStatusReset(); + } + get { return _datStatus; } + } + + + + public GotStatus GotStatus + { + get { return _gotStatus; } + set + { + _gotStatus = value; + RepStatusReset(); + } + } + + public void SetStatus(DatStatus dt, GotStatus flag) + { + _datStatus = dt; + _gotStatus = flag; + RepStatusReset(); + } + + + public RepStatus RepStatus + { + get { return _repStatus; } + set + { + if (Parent != null) Parent.UpdateRepStatusUpTree(_repStatus, -1); + + List rs = RepairStatus.StatusCheck[(int)FileType, (int)_datStatus, (int)_gotStatus]; + if (rs == null || !rs.Contains(value)) + { + ReportError.SendAndShow(FullName + " " + Resources.RvBase_Check + FileType + Resources.RvBase_Check + _datStatus + Resources.RvBase_Check + _gotStatus + " from: " + _repStatus + " to: " + value); + _repStatus = RepStatus.Error; + } + else + _repStatus = value; + + if (Parent != null) Parent.UpdateRepStatusUpTree(_repStatus, 1); + } + } + public void RepStatusReset() + { + SearchFound = false; + if ((RepStatus == RepStatus.UnSet || RepStatus == RepStatus.Unknown || RepStatus == RepStatus.Ignore) && FileType == FileType.File && GotStatus == GotStatus.Got && DatStatus==DatStatus.NotInDat) + foreach (string file in Settings.IgnoreFiles) + if (Name == file) + { + RepStatus = RepStatus.Ignore; + return; + } + + List rs = RepairStatus.StatusCheck[(int)FileType, (int)_datStatus, (int)_gotStatus]; + RepStatus = rs == null ? RepStatus.Error : rs[0]; + } + } +} diff --git a/ROMVault2/RvDB/RvDat.cs b/ROMVault2/RvDB/RvDat.cs new file mode 100644 index 0000000..20ea3d6 --- /dev/null +++ b/ROMVault2/RvDB/RvDat.cs @@ -0,0 +1,118 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; + +namespace ROMVault2.RvDB +{ + public enum DatUpdateStatus + { + Delete, + Correct + } + + public class RvDat + { + public int DatIndex = -1; + public DatUpdateStatus Status; + + public long TimeStamp; + public bool AutoAddDirectory; + + public enum DatData + { + DatName = 1, + DatFullName = 2, + + RootDir = 3, + Description = 4, + Category = 5, + Version = 6, + Date = 7, + Author = 8, + Email = 9, + HomePage = 10, + URL = 11, + FileType = 12, + MergeType = 13, + SuperDat = 14, + DirSetup = 15 + } + + private class GameMetaData + { + public DatData Id { get; private set; } + public String Value { get; private set; } + + public GameMetaData(DatData id, String value) + { + Id = id; + Value = value; + } + public GameMetaData(BinaryReader br) + { + Id = (DatData)br.ReadByte(); + Value = br.ReadString(); + } + + public void Write(BinaryWriter bw) + { + bw.Write((byte)Id); + bw.Write(DB.Fn(Value)); + } + } + + private readonly List _gameMetaData = new List(); + + + public void Write(BinaryWriter bw) + { + bw.Write(TimeStamp); + bw.Write(AutoAddDirectory); + + bw.Write((byte)_gameMetaData.Count); + foreach (GameMetaData gameMD in _gameMetaData) + gameMD.Write(bw); + } + + public void Read(BinaryReader br) + { + TimeStamp = br.ReadInt64(); + AutoAddDirectory = br.ReadBoolean(); + + byte c = br.ReadByte(); + _gameMetaData.Clear(); + _gameMetaData.Capacity = c; + for (byte i = 0; i < c; i++) + _gameMetaData.Add(new GameMetaData(br)); + } + + public void AddData(DatData id, string val) + { + if (string.IsNullOrEmpty(val)) + return; + + int pos = 0; + while (pos < _gameMetaData.Count && _gameMetaData[pos].Id < id) + pos++; + + _gameMetaData.Insert(pos, new GameMetaData(id, val)); + } + + public string GetData(DatData id) + { + foreach (GameMetaData gameMD in _gameMetaData) + { + if (id == gameMD.Id) return gameMD.Value; + if (id < gameMD.Id) return ""; + } + return ""; + } + } + +} diff --git a/ROMVault2/RvDB/RvDir.cs b/ROMVault2/RvDB/RvDir.cs new file mode 100644 index 0000000..f245de0 --- /dev/null +++ b/ROMVault2/RvDB/RvDir.cs @@ -0,0 +1,345 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System.Collections.Generic; +using System.IO; +using ROMVault2.Properties; +using ROMVault2.SupportedFiles; +using ROMVault2.Utils; + +namespace ROMVault2.RvDB +{ + public class RvDir : RvBase + { + + public RvTreeRow Tree; + public RvGame Game; + private readonly List _dirDats = new List(); + private readonly List _children = new List(); + public readonly ReportStatus DirStatus = new ReportStatus(); + + public ZipStatus ZipStatus; + + public RvDir(FileType type) + : base(type) + { + if (type != FileType.Dir && type != FileType.Zip) + ReportError.SendAndShow("Trying to set Dir type to " + type); + } + + + + public override void Write(BinaryWriter bw) + { + base.Write(bw); + if (Tree == null) + bw.Write(false); + else + { + bw.Write(true); + Tree.Write(bw); + } + + if (Game == null) + bw.Write(false); + else + { + bw.Write(true); + Game.Write(bw); + } + + int count = _dirDats.Count; + bw.Write(count); + for (int i = 0; i < count; i++) + { + _dirDats[i].Write(bw); + } + + count = _children.Count; + bw.Write(count); + for (int i = 0; i < count; i++) + { + FileType type = _children[i].FileType; + bw.Write((byte)type); + _children[i].Write(bw); + } + + if (DBTypeGet.isCompressedDir(FileType)) + bw.Write((byte)ZipStatus); + + } + public override void Read(BinaryReader br, List parentDirDats) + { + base.Read(br, parentDirDats); + bool foundTree = br.ReadBoolean(); + if (foundTree) + { + Tree = new RvTreeRow(); + Tree.Read(br); + } + else + Tree = null; + + bool foundGame = br.ReadBoolean(); + if (foundGame) + { + Game = new RvGame(); + Game.Read(br); + } + else + Game = null; + + int count = br.ReadInt32(); + _dirDats.Clear(); + for (int i = 0; i < count; i++) + { + RvDat dat = new RvDat { DatIndex = i }; + dat.Read(br); + _dirDats.Add(dat); + + string datname = TreeFullName + @"\" + dat.GetData(RvDat.DatData.DatName); + if (datname.Length >= 9 && datname.Substring(0, 9) == @"RomVault\") + datname = datname.Substring(9); + + DB.Bgw.ReportProgress(0, new bgwText("Loading: " + datname)); + DB.Bgw.ReportProgress((int)br.BaseStream.Position); + + } + if (_dirDats.Count > 0) + parentDirDats = _dirDats; + + count = br.ReadInt32(); + _children.Clear(); + for (int i = 0; i < count; i++) + { + RvBase tChild = DBTypeGet.GetRvType((FileType)br.ReadByte()); + + tChild.Parent = this; + tChild.Read(br, parentDirDats); + _children.Add(tChild); + } + + if (DBTypeGet.isCompressedDir(FileType)) + ZipStatus = (ZipStatus)br.ReadByte(); + + } + + + public override EFile DatRemove() + { + Tree = null; + Game = null; + _dirDats.Clear(); + return base.DatRemove(); + } + public override void DatAdd(RvBase b) + { + Tree = ((RvDir)b).Tree; + Game = ((RvDir)b).Game; + if (_dirDats.Count > 0) + ReportError.SendAndShow(Resources.RvDir_SetDat_Setting_Dir_with_a_dat_list); + base.DatAdd(b); + } + + + public override EFile FileRemove() + { + ZipStatus = ZipStatus.None; + return base.FileRemove(); + } + + + + + + + + public int DirDatCount + { + get + { + return _dirDats.Count; + } + } + public RvDat DirDat(int index) + { + return _dirDats[index]; + } + public void DirDatAdd(RvDat dat) + { + int index; + DirDatSearch(dat, out index); + _dirDats.Insert(index, dat); + for (int i = 0; i < _dirDats.Count; i++) + _dirDats[i].DatIndex = i; + } + public void DirDatRemove(int index) + { + _dirDats.RemoveAt(index); + for (int i = 0; i < _dirDats.Count; i++) + _dirDats[i].DatIndex = i; + } + + private void DirDatSearch(RvDat dat, out int index) + { + int intBottom = 0; + int intTop = _dirDats.Count; + int intMid = 0; + int intRes = -1; + + //Binary chop to find the closest match + while (intBottom < intTop && intRes != 0) + { + intMid = (intBottom + intTop) / 2; + + intRes = DBHelper.DatCompare(dat, _dirDats[intMid]); + if (intRes < 0) + intTop = intMid; + else if (intRes > 0) + intBottom = intMid + 1; + } + index = intMid; + + // if match was found check up the list for the first match + if (intRes == 0) + { + int intRes1 = 0; + while (index > 0 && intRes1 == 0) + { + intRes1 = DBHelper.DatCompare(dat, _dirDats[index - 1]); + if (intRes1 == 0) + index--; + } + } + // if the search is greater than the closest match move one up the list + else if (intRes > 0) + index++; + } + + + + public int ChildCount + { + get + { + return _children.Count; + } + } + public RvBase Child(int index) + { + return _children[index]; + } + + public int ChildAdd(RvBase child) + { + int index; + ChildNameSearch(child, out index); + ChildAdd(child, index); + return index; + } + public void ChildAdd(RvBase child, int index) + { + if ( + (FileType == FileType.Dir && child.FileType == FileType.ZipFile) || + (FileType == FileType.Zip && child.FileType != FileType.ZipFile) + ) + ReportError.SendAndShow("Typing to add a " + child.FileType + " to a " + FileType); + + _children.Insert(index, child); + child.Parent = this; + UpdateRepStatusArrUpTree(child, 1); + } + + public void ChildRemove(int index) + { + UpdateRepStatusArrUpTree(_children[index], -1); + if (_children[index].Parent == this) + _children[index].Parent = null; + _children.RemoveAt(index); + } + + public int ChildNameSearch(RvBase lName, out int index) + { + int intBottom = 0; + int intTop = _children.Count; + int intMid = 0; + int intRes = -1; + + //Binary chop to find the closest match + while (intBottom < intTop && intRes != 0) + { + intMid = (intBottom + intTop) / 2; + + intRes = DBHelper.CompareName(lName, _children[intMid]); + if (intRes < 0) + intTop = intMid; + else if (intRes > 0) + intBottom = intMid + 1; + } + index = intMid; + + // if match was found check up the list for the first match + if (intRes == 0) + { + int intRes1 = 0; + while (index > 0 && intRes1 == 0) + { + intRes1 = DBHelper.CompareName(lName, _children[index - 1]); + if (intRes1 == 0) + index--; + } + } + // if the search is greater than the closest match move one up the list + else if (intRes > 0) + index++; + + return intRes; + } + + + public bool FindChild(RvBase lName, out int index) + { + if (ChildNameSearch(lName, out index) != 0) + { + ReportError.UnhandledExceptionHandler("Could not find self in Parent " + FullName); + return false; + } + + do + { + if (_children[index] == lName) + return true; + index++; + + } while (index < _children.Count && DBHelper.CompareName(lName, _children[index]) == 0); + + return false; + } + + + + public void UpdateRepStatusUpTree(RepStatus rStat, int dir) + { + DirStatus.UpdateRepStatus(rStat, dir); + if (Parent != null) + Parent.UpdateRepStatusUpTree(rStat, dir); + } + + private void UpdateRepStatusArrUpTree(RvBase child, int dir) + { + DirStatus.UpdateRepStatus(child.RepStatus, dir); + RvDir rvDir = child as RvDir; + if (rvDir != null) + DirStatus.UpdateRepStatus(rvDir.DirStatus, dir); + + if (Parent != null) + Parent.UpdateRepStatusArrUpTree(child, dir); + } + + + } + +} diff --git a/ROMVault2/RvDB/RvFile.cs b/ROMVault2/RvDB/RvFile.cs new file mode 100644 index 0000000..cfda15c --- /dev/null +++ b/ROMVault2/RvDB/RvFile.cs @@ -0,0 +1,251 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using ROMVault2.Utils; + +namespace ROMVault2.RvDB +{ + public class RvFile : RvBase + { + public ulong? Size; + public byte[] CRC; + public byte[] SHA1; + public byte[] MD5; + public byte[] SHA1CHD; + public byte[] MD5CHD; + + public string Merge = ""; + public string Status; + private FileStatus _fileStatus; + + public int ZipFileIndex = -1; + public ulong? ZipFileHeaderPosition; + + public uint? CHDVersion; + + public RvFile(FileType type) + : base(type) + { + if (type != FileType.File && type != FileType.ZipFile) + ReportError.SendAndShow("Trying to set file type to " + type); + } + + [Flags] + private enum FileFlags + { + Size = 0x01, + CRC = 0x02, + SHA1 = 0x04, + MD5 = 0x08, + SHA1CHD = 0x10, + MD5CHD = 0x20, + Merge = 0x40, + Status = 0x80, + ZipFileIndex = 0x100, + ZipFileHeader = 0x200, + CHDVersion = 0x400 + } + + public override void Write(BinaryWriter bw) + { + base.Write(bw); + + FileFlags fFlags = 0; + if (Size != null) fFlags |= FileFlags.Size; + if (CRC != null) fFlags |= FileFlags.CRC; + if (SHA1 != null) fFlags |= FileFlags.SHA1; + if (MD5 != null) fFlags |= FileFlags.MD5; + if (SHA1CHD != null) fFlags |= FileFlags.SHA1CHD; + if (MD5CHD != null) fFlags |= FileFlags.MD5CHD; + if (!String.IsNullOrEmpty(Merge)) fFlags |= FileFlags.Merge; + if (!String.IsNullOrEmpty(Status)) fFlags |= FileFlags.Status; + if (ZipFileIndex >= 0) fFlags |= FileFlags.ZipFileIndex; + if (ZipFileHeaderPosition != null) fFlags |= FileFlags.ZipFileHeader; + if (CHDVersion != null) fFlags |= FileFlags.CHDVersion; + + bw.Write((UInt16)fFlags); + + if (Size != null) bw.Write((ulong)Size); + if (CRC != null) ArrByte.Write(bw, CRC); + if (SHA1 != null) ArrByte.Write(bw, SHA1); + if (MD5 != null) ArrByte.Write(bw, MD5); + if (SHA1CHD != null) ArrByte.Write(bw, SHA1CHD); + if (MD5CHD != null) ArrByte.Write(bw, MD5CHD); + if (!String.IsNullOrEmpty(Merge)) bw.Write(Merge); + if (!String.IsNullOrEmpty(Status)) bw.Write(Status); + if (ZipFileIndex >= 0) bw.Write(ZipFileIndex); + if (ZipFileHeaderPosition != null) bw.Write((long)ZipFileHeaderPosition); + if (CHDVersion != null) bw.Write((uint)CHDVersion); + + bw.Write((uint)_fileStatus); + } + public override void Read(BinaryReader br, List parentDirDats) + { + base.Read(br, parentDirDats); + + FileFlags fFlags = (FileFlags)br.ReadUInt16(); + + Size = (fFlags & FileFlags.Size) > 0 ? (ulong?)br.ReadUInt64() : null; + CRC = (fFlags & FileFlags.CRC) > 0 ? ArrByte.Read(br) : null; + SHA1 = (fFlags & FileFlags.SHA1) > 0 ? ArrByte.Read(br) : null; + MD5 = (fFlags & FileFlags.MD5) > 0 ? ArrByte.Read(br) : null; + SHA1CHD = (fFlags & FileFlags.SHA1CHD) > 0 ? ArrByte.Read(br) : null; + MD5CHD = (fFlags & FileFlags.MD5CHD) > 0 ? ArrByte.Read(br) : null; + Merge = (fFlags & FileFlags.Merge) > 0 ? br.ReadString() : null; + Status = (fFlags & FileFlags.Status) > 0 ? br.ReadString() : null; + ZipFileIndex = (fFlags & FileFlags.ZipFileIndex) > 0 ? br.ReadInt32() : -1; + ZipFileHeaderPosition = (fFlags & FileFlags.ZipFileHeader) > 0 ? (ulong?)br.ReadUInt64() : null; + CHDVersion = (fFlags & FileFlags.CHDVersion) > 0 ? (uint?)br.ReadInt32() : null; + + _fileStatus = (FileStatus)br.ReadUInt32(); + } + + public override EFile DatRemove() + { + if (!FileStatusIs(FileStatus.SizeFromHeader) && !FileStatusIs(FileStatus.SizeVerified)) Size = null; + if (!FileStatusIs(FileStatus.CRCFromHeader) && !FileStatusIs(FileStatus.CRCVerified)) CRC = null; + if (!FileStatusIs(FileStatus.SHA1FromHeader) && !FileStatusIs(FileStatus.SHA1Verified)) SHA1 = null; + if (!FileStatusIs(FileStatus.MD5FromHeader) && !FileStatusIs(FileStatus.MD5Verified)) MD5 = null; + if (!FileStatusIs(FileStatus.SHA1CHDFromHeader) && !FileStatusIs(FileStatus.SHA1CHDVerified)) SHA1CHD = null; + if (!FileStatusIs(FileStatus.MD5CHDFromHeader) && !FileStatusIs(FileStatus.MD5CHDVerified)) MD5CHD = null; + + FileStatusClear(FileStatus.SizeFromDAT | FileStatus.CRCFromDAT | FileStatus.SHA1FromDAT | FileStatus.MD5FromDAT | FileStatus.SHA1CHDFromDAT | FileStatus.MD5CHDFromDAT); + + Merge = ""; + Status = ""; + return base.DatRemove(); + } + public override void DatAdd(RvBase file) + { + RvFile tFile = file as RvFile; + if (tFile == null) + { + ReportError.SendAndShow("Error setting Dat Set Got"); + return; + } + + if (Size == null && tFile.Size != null) Size = tFile.Size; + if (CRC == null && tFile.CRC != null) CRC = tFile.CRC; + if (SHA1 == null && tFile.SHA1 != null) SHA1 = tFile.SHA1; + if (MD5 == null && tFile.MD5 != null) MD5 = tFile.MD5; + if (SHA1CHD == null && tFile.SHA1CHD != null) SHA1CHD = tFile.SHA1CHD; + if (MD5CHD == null && tFile.MD5CHD != null) MD5CHD = tFile.MD5CHD; + + FileStatusSet( + FileStatus.SizeFromDAT | FileStatus.CRCFromDAT | FileStatus.SHA1FromDAT | FileStatus.MD5FromDAT | FileStatus.SHA1CHDFromDAT | FileStatus.MD5CHDFromDAT, + tFile); + + Merge = tFile.Merge; + Status = tFile.Status; + base.DatAdd(file); + } + + public override EFile FileRemove() + { + ZipFileIndex = -1; + ZipFileHeaderPosition = null; + + if (base.FileRemove() == EFile.Delete) + return EFile.Delete; + + if (!FileStatusIs(FileStatus.SizeFromDAT)) Size = null; + if (!FileStatusIs(FileStatus.CRCFromDAT)) CRC = null; + if (!FileStatusIs(FileStatus.SHA1FromDAT)) SHA1 = null; + if (!FileStatusIs(FileStatus.MD5FromDAT)) MD5 = null; + if (!FileStatusIs(FileStatus.SHA1CHDFromDAT)) SHA1CHD = null; + if (!FileStatusIs(FileStatus.MD5CHDFromDAT)) MD5CHD = null; + + CHDVersion = null; + + FileStatusClear( + FileStatus.SizeFromHeader | FileStatus.CRCFromHeader | FileStatus.SHA1FromHeader | FileStatus.MD5FromHeader | FileStatus.SHA1CHDFromHeader | FileStatus.MD5CHDFromHeader | + FileStatus.SizeVerified | FileStatus.CRCVerified | FileStatus.SHA1Verified | FileStatus.MD5Verified | FileStatus.SHA1CHDVerified | FileStatus.MD5CHDVerified); + + return EFile.Keep; + } + public override void FileAdd(RvBase file) + { + RvFile tFile = file as RvFile; + if (tFile == null) + { + ReportError.SendAndShow("Error setting File Got"); + return; + } + + if (Size == null && tFile.Size != null) Size = tFile.Size; + if (CRC == null && tFile.CRC != null) CRC = tFile.CRC; + if (SHA1 == null && tFile.SHA1 != null) SHA1 = tFile.SHA1; + if (MD5 == null && tFile.MD5 != null) MD5 = tFile.MD5; + if (SHA1CHD == null && tFile.SHA1CHD != null) SHA1CHD = tFile.SHA1CHD; + if (MD5CHD == null && tFile.MD5CHD != null) MD5CHD = tFile.MD5CHD; + + CHDVersion = tFile.CHDVersion; + + FileStatusSet( + FileStatus.SizeFromHeader | FileStatus.CRCFromHeader | FileStatus.SHA1FromHeader | FileStatus.MD5FromHeader | FileStatus.SHA1CHDFromHeader | FileStatus.MD5CHDFromHeader | + FileStatus.SizeVerified | FileStatus.CRCVerified | FileStatus.SHA1Verified | FileStatus.MD5Verified | FileStatus.SHA1CHDVerified | FileStatus.MD5CHDVerified, + tFile); + + ZipFileIndex = tFile.ZipFileIndex; + ZipFileHeaderPosition = tFile.ZipFileHeaderPosition; + + base.FileAdd(file); + } + + public override void CopyTo(RvBase c) + { + RvFile cf = c as RvFile; + if (cf != null) + { + cf.Size = Size; + cf.CRC = CRC; + cf.SHA1 = SHA1; + cf.MD5 = MD5; + cf.Merge = Merge; + cf.Status = Status; + cf._fileStatus = _fileStatus; + cf.SHA1CHD = SHA1CHD; + cf.MD5CHD = MD5CHD; + + cf.ZipFileIndex = ZipFileIndex; + cf.ZipFileHeaderPosition = ZipFileHeaderPosition; + + cf.CHDVersion = CHDVersion; + } + base.CopyTo(c); + } + + + + + public void FileStatusSet(FileStatus flag) + { + _fileStatus |= flag; + } + public void FileStatusSet(FileStatus flag, RvFile copyFrom) + { + _fileStatus |= (flag & copyFrom._fileStatus); + } + + + + private void FileStatusClear(FileStatus flag) + { + _fileStatus &= ~flag; + } + public bool FileStatusIs(FileStatus flag) + { + return (_fileStatus & flag) == flag; + } + + + + } + +} diff --git a/ROMVault2/RvDB/RvGame.cs b/ROMVault2/RvDB/RvGame.cs new file mode 100644 index 0000000..c2cd0c3 --- /dev/null +++ b/ROMVault2/RvDB/RvGame.cs @@ -0,0 +1,122 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; + +namespace ROMVault2.RvDB +{ + public class RvGame + { + + public enum GameData + { + Description = 1, + RomOf = 2, + IsBios = 3, + Sourcefile = 4, + CloneOf = 5, + SampleOf = 6, + Board = 7, + Year = 8, + Manufacturer = 9, + + Trurip = 10, + Publisher = 11, + Developer = 12, + Edition = 13, + Version = 14, + Type = 15, + Media = 16, + Language = 17, + Players = 18, + Ratings = 19, + Peripheral = 20, + Genre = 21, + MediaCatalogNumber=22, + BarCode=23 + } + + private class GameMetaData + { + public GameData Id { get; private set; } + public String Value { get; private set; } + + public GameMetaData(GameData id, String value) + { + Id = id; + Value = value; + } + public GameMetaData(BinaryReader br) + { + Id = (GameData)br.ReadByte(); + Value = br.ReadString(); + } + + public void Write(BinaryWriter bw) + { + bw.Write((byte)Id); + bw.Write(DB.Fn(Value)); + } + } + + private readonly List _gameMetaData = new List(); + + + public void Write(BinaryWriter bw) + { + bw.Write((byte)_gameMetaData.Count); + foreach (GameMetaData gameMD in _gameMetaData) + gameMD.Write(bw); + } + + public void Read(BinaryReader br) + { + byte c = br.ReadByte(); + _gameMetaData.Clear(); + _gameMetaData.Capacity = c; + for (byte i = 0; i < c; i++) + _gameMetaData.Add(new GameMetaData(br)); + } + + public void AddData(GameData id, string val) + { + if (string.IsNullOrEmpty(val)) + return; + + int pos = 0; + while (pos < _gameMetaData.Count && _gameMetaData[pos].Id < id) + pos++; + + _gameMetaData.Insert(pos, new GameMetaData(id, val)); + } + + public string GetData(GameData id) + { + foreach (GameMetaData gameMD in _gameMetaData) + { + if (id == gameMD.Id) return gameMD.Value; + if (id < gameMD.Id) return ""; + } + return ""; + } + + public void DeleteData(GameData id) + { + for (int i = 0; i < _gameMetaData.Count; i++) + { + if (id == _gameMetaData[i].Id) + { + _gameMetaData.RemoveAt(i); + return; + } + if (id < _gameMetaData[i].Id) return; + } + } + } + +} diff --git a/ROMVault2/Service References/RVRef/Reference.cs b/ROMVault2/Service References/RVRef/Reference.cs new file mode 100644 index 0000000..23e665c --- /dev/null +++ b/ROMVault2/Service References/RVRef/Reference.cs @@ -0,0 +1,137 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34003 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ROMVault2.RVRef { + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.ServiceContractAttribute(ConfigurationName="RVRef.IService1")] + public interface IService1 { + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/CheckPassword", ReplyAction="http://tempuri.org/IService1/CheckPasswordResponse")] + string CheckPassword(string username, string password); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendUser", ReplyAction="http://tempuri.org/IService1/SendUserResponse")] + string SendUser(string username, string email, int version); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendUser1", ReplyAction="http://tempuri.org/IService1/SendUser1Response")] + string SendUser1(string username, string email, string version, int subversion); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetLatestVersion", ReplyAction="http://tempuri.org/IService1/GetLatestVersionResponse")] + int GetLatestVersion(int versionNow); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetLatestVersion1", ReplyAction="http://tempuri.org/IService1/GetLatestVersion1Response")] + string GetLatestVersion1(string version, int subversion); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetUpdateLink", ReplyAction="http://tempuri.org/IService1/GetUpdateLinkResponse")] + string GetUpdateLink(); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetUpdateLink1", ReplyAction="http://tempuri.org/IService1/GetUpdateLink1Response")] + string GetUpdateLink1(string version, int subversion); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendErrorMessage", ReplyAction="http://tempuri.org/IService1/SendErrorMessageResponse")] + void SendErrorMessage(string username, string error); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendErrorMessage1", ReplyAction="http://tempuri.org/IService1/SendErrorMessage1Response")] + void SendErrorMessage1(string username, string email, string error); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendErrorMessage2", ReplyAction="http://tempuri.org/IService1/SendErrorMessage2Response")] + void SendErrorMessage2(string username, string email, int version, string error); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendErrorMessage3", ReplyAction="http://tempuri.org/IService1/SendErrorMessage3Response")] + void SendErrorMessage3(string username, string email, string version, int subversion, string error); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendDATErrorMessage2", ReplyAction="http://tempuri.org/IService1/SendDATErrorMessage2Response")] + void SendDATErrorMessage2(string username, string email, int version, string error, string filename); + + [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendDATErrorMessage3", ReplyAction="http://tempuri.org/IService1/SendDATErrorMessage3Response")] + void SendDATErrorMessage3(string username, string email, string version, int subversion, string error, string filename); + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + public interface IService1Channel : ROMVault2.RVRef.IService1, System.ServiceModel.IClientChannel { + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + public partial class Service1Client : System.ServiceModel.ClientBase, ROMVault2.RVRef.IService1 { + + public Service1Client() { + } + + public Service1Client(string endpointConfigurationName) : + base(endpointConfigurationName) { + } + + public Service1Client(string endpointConfigurationName, string remoteAddress) : + base(endpointConfigurationName, remoteAddress) { + } + + public Service1Client(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : + base(endpointConfigurationName, remoteAddress) { + } + + public Service1Client(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : + base(binding, remoteAddress) { + } + + public string CheckPassword(string username, string password) { + return base.Channel.CheckPassword(username, password); + } + + public string SendUser(string username, string email, int version) { + return base.Channel.SendUser(username, email, version); + } + + public string SendUser1(string username, string email, string version, int subversion) { + return base.Channel.SendUser1(username, email, version, subversion); + } + + public int GetLatestVersion(int versionNow) { + return base.Channel.GetLatestVersion(versionNow); + } + + public string GetLatestVersion1(string version, int subversion) { + return base.Channel.GetLatestVersion1(version, subversion); + } + + public string GetUpdateLink() { + return base.Channel.GetUpdateLink(); + } + + public string GetUpdateLink1(string version, int subversion) { + return base.Channel.GetUpdateLink1(version, subversion); + } + + public void SendErrorMessage(string username, string error) { + base.Channel.SendErrorMessage(username, error); + } + + public void SendErrorMessage1(string username, string email, string error) { + base.Channel.SendErrorMessage1(username, email, error); + } + + public void SendErrorMessage2(string username, string email, int version, string error) { + base.Channel.SendErrorMessage2(username, email, version, error); + } + + public void SendErrorMessage3(string username, string email, string version, int subversion, string error) { + base.Channel.SendErrorMessage3(username, email, version, subversion, error); + } + + public void SendDATErrorMessage2(string username, string email, int version, string error, string filename) { + base.Channel.SendDATErrorMessage2(username, email, version, error, filename); + } + + public void SendDATErrorMessage3(string username, string email, string version, int subversion, string error, string filename) { + base.Channel.SendDATErrorMessage3(username, email, version, subversion, error, filename); + } + } +} diff --git a/ROMVault2/Service References/RVRef/Reference.svcmap b/ROMVault2/Service References/RVRef/Reference.svcmap new file mode 100644 index 0000000..5c2ebfa --- /dev/null +++ b/ROMVault2/Service References/RVRef/Reference.svcmap @@ -0,0 +1,33 @@ + + + + false + true + + false + false + false + + + true + Auto + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/Service1.xsd b/ROMVault2/Service References/RVRef/Service1.xsd new file mode 100644 index 0000000..32e1c19 --- /dev/null +++ b/ROMVault2/Service References/RVRef/Service1.xsd @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/Service11.disco b/ROMVault2/Service References/RVRef/Service11.disco new file mode 100644 index 0000000..d705778 --- /dev/null +++ b/ROMVault2/Service References/RVRef/Service11.disco @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/Service11.wsdl b/ROMVault2/Service References/RVRef/Service11.wsdl new file mode 100644 index 0000000..9dd5eac --- /dev/null +++ b/ROMVault2/Service References/RVRef/Service11.wsdl @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/Service11.xsd b/ROMVault2/Service References/RVRef/Service11.xsd new file mode 100644 index 0000000..e6bd8df --- /dev/null +++ b/ROMVault2/Service References/RVRef/Service11.xsd @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/configuration.svcinfo b/ROMVault2/Service References/RVRef/configuration.svcinfo new file mode 100644 index 0000000..36c7f28 --- /dev/null +++ b/ROMVault2/Service References/RVRef/configuration.svcinfo @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/configuration91.svcinfo b/ROMVault2/Service References/RVRef/configuration91.svcinfo new file mode 100644 index 0000000..a1e7b23 --- /dev/null +++ b/ROMVault2/Service References/RVRef/configuration91.svcinfo @@ -0,0 +1,201 @@ + + + + + + + BasicHttpBinding_IService1 + + + + + + + + + + + + + + + + + + + + + StrongWildcard + + + + + + 65536 + + + + + + + + + System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + System.Text.UTF8Encoding + + + Buffered + + + + + + Text + + + System.ServiceModel.Configuration.BasicHttpSecurityElement + + + None + + + System.ServiceModel.Configuration.HttpTransportSecurityElement + + + None + + + None + + + System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement + + + Never + + + TransportSelected + + + (Collection) + + + + + + System.ServiceModel.Configuration.BasicHttpMessageSecurityElement + + + UserName + + + Default + + + + + + + + + http://services.romvault.com/Service1.svc + + + + + + basicHttpBinding + + + BasicHttpBinding_IService1 + + + RVRef.IService1 + + + System.ServiceModel.Configuration.AddressHeaderCollectionElement + + + <Header /> + + + System.ServiceModel.Configuration.IdentityElement + + + System.ServiceModel.Configuration.UserPrincipalNameElement + + + + + + System.ServiceModel.Configuration.ServicePrincipalNameElement + + + + + + System.ServiceModel.Configuration.DnsElement + + + + + + System.ServiceModel.Configuration.RsaElement + + + + + + System.ServiceModel.Configuration.CertificateElement + + + + + + System.ServiceModel.Configuration.CertificateReferenceElement + + + My + + + LocalMachine + + + FindBySubjectDistinguishedName + + + + + + False + + + BasicHttpBinding_IService1 + + + + + + + + + + + \ No newline at end of file diff --git a/ROMVault2/Settings.cs b/ROMVault2/Settings.cs new file mode 100644 index 0000000..a5b726b --- /dev/null +++ b/ROMVault2/Settings.cs @@ -0,0 +1,314 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.Win32; +using ROMVault2.RvDB; + +namespace ROMVault2 +{ + + public enum eScanLevel + { + Level1, + Level2, + Level3 + } + + + public enum eFixLevel + { + TrrntZipLevel1, + TrrntZipLevel2, + TrrntZipLevel3, + Level1, + Level2, + Level3 + } + + public static class Settings + { + + public static string DatRoot; + public static string CacheFile; + public static eScanLevel ScanLevel; + public static eFixLevel FixLevel; + + public static List DirPathMap; + + public static List IgnoreFiles; + + public static bool DoubleCheckDelete = true; + public static bool DebugLogsEnabled; + public static bool CacheSaveTimerEnabled = true; + public static int CacheSaveTimePeriod = 10; + + public static string EMail + { + get + { + RegistryKey regKey1 = Registry.CurrentUser; + regKey1 = regKey1.CreateSubKey("Software\\RomVault2\\User"); + return regKey1.GetValue("Email", "").ToString(); + + } + + set + { + RegistryKey regKey = Registry.CurrentUser; + regKey = regKey.CreateSubKey("Software\\RomVault2\\User"); + regKey.SetValue("Email", value); + } + } + + public static string Username + { + get + { + RegistryKey regKey1 = Registry.CurrentUser; + regKey1 = regKey1.CreateSubKey("Software\\RomVault2\\User"); + return regKey1.GetValue("UserName", "").ToString(); + + } + set + { + RegistryKey regKey = Registry.CurrentUser; + regKey = regKey.CreateSubKey("Software\\RomVault2\\User"); + regKey.SetValue("UserName", value); + } + } + + + + + public static void SetDefaults() + { + CacheFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RomVault2_"+DBVersion.Version+".Cache"); + + //DatRoot = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DatRoot"); + DatRoot = "DatRoot"; + + ScanLevel = eScanLevel.Level2; + FixLevel = eFixLevel.TrrntZipLevel2; + + IgnoreFiles = new List { "_ReadMe_.txt" }; + + ResetDirectories(); + + ReadConfig(); + + DirPathMap.Sort(); + } + + public static void ResetDirectories() + { + DirPathMap = new List + { + new DirMap("RomVault", "RomRoot"), + new DirMap("ToSort", "ToSort") + }; + } + + public static string ToSort() + { + foreach (DirMap t in DirPathMap) + { + if (t.DirKey == "ToSort") + return t.DirPath; + } + return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ToSort"); + } + + public static void WriteConfig() + { + if (File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RomVault2.cfg"))) + File.Delete(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RomVault2.cfg")); + + FileStream fs = new FileStream(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RomVault2.cfg"), FileMode.CreateNew, FileAccess.Write); + BinaryWriter bw = new BinaryWriter(fs); + const int ver = 5; + + bw.Write(ver); //int + bw.Write(DatRoot); //string + bw.Write((Int32)ScanLevel); + bw.Write((Int32)FixLevel); + bw.Write(DebugLogsEnabled); //bool + + bw.Write(IgnoreFiles.Count); //int + foreach (string t in IgnoreFiles) + { + bw.Write(t); //string + } + + bw.Write(DirPathMap.Count); //int + foreach (DirMap t in DirPathMap) + { + bw.Write(t.DirKey); //string + bw.Write(t.DirPath); //string + } + + bw.Write(CacheSaveTimerEnabled); //bool + bw.Write(CacheSaveTimePeriod); //int + bw.Write(DoubleCheckDelete); //bool + + fs.Flush(); + fs.Close(); + } + + private static void ReadConfig() + { + if (!File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RomVault2.cfg"))) return; + + FileStream fs = new FileStream(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RomVault2.cfg"), FileMode.Open, FileAccess.Read); + BinaryReader br = new BinaryReader(fs); + + int ver = br.ReadInt32(); + if (ver == 1) + { + DatRoot = br.ReadString(); + ScanLevel = eScanLevel.Level1; + FixLevel = (eFixLevel)br.ReadInt32(); + + IgnoreFiles = new List(); + int c = br.ReadInt32(); + for (int i = 0; i < c; i++) + IgnoreFiles.Add(br.ReadString()); + + DirPathMap = new List(); + c = br.ReadInt32(); + for (int i = 0; i < c; i++) + DirPathMap.Add(new DirMap(br.ReadString(), br.ReadString())); + } + if (ver == 2) + { + DatRoot = br.ReadString(); + ScanLevel = (eScanLevel)br.ReadInt32(); + FixLevel = (eFixLevel)br.ReadInt32(); + + IgnoreFiles = new List(); + int c = br.ReadInt32(); + for (int i = 0; i < c; i++) + IgnoreFiles.Add(br.ReadString()); + + DirPathMap = new List(); + c = br.ReadInt32(); + for (int i = 0; i < c; i++) + DirPathMap.Add(new DirMap(br.ReadString(), br.ReadString())); + } + if (ver == 3) + { + DatRoot = br.ReadString(); + ScanLevel = (eScanLevel)br.ReadInt32(); + FixLevel = (eFixLevel)br.ReadInt32(); + DebugLogsEnabled = br.ReadBoolean(); + + IgnoreFiles = new List(); + int c = br.ReadInt32(); + for (int i = 0; i < c; i++) + IgnoreFiles.Add(br.ReadString()); + + DirPathMap = new List(); + c = br.ReadInt32(); + for (int i = 0; i < c; i++) + DirPathMap.Add(new DirMap(br.ReadString(), br.ReadString())); + } + + if (ver == 4) + { + DatRoot = br.ReadString(); + ScanLevel = (eScanLevel)br.ReadInt32(); + FixLevel = (eFixLevel)br.ReadInt32(); + DebugLogsEnabled = br.ReadBoolean(); + + IgnoreFiles = new List(); + int c = br.ReadInt32(); + for (int i = 0; i < c; i++) + IgnoreFiles.Add(br.ReadString()); + + DirPathMap = new List(); + c = br.ReadInt32(); + for (int i = 0; i < c; i++) + DirPathMap.Add(new DirMap(br.ReadString(), br.ReadString())); + + CacheSaveTimerEnabled = br.ReadBoolean(); + CacheSaveTimePeriod = br.ReadInt32(); + } + + if (ver == 5) + { + DatRoot = br.ReadString(); + ScanLevel = (eScanLevel)br.ReadInt32(); + FixLevel = (eFixLevel)br.ReadInt32(); + DebugLogsEnabled = br.ReadBoolean(); + + IgnoreFiles = new List(); + int c = br.ReadInt32(); + for (int i = 0; i < c; i++) + IgnoreFiles.Add(br.ReadString()); + + DirPathMap = new List(); + c = br.ReadInt32(); + for (int i = 0; i < c; i++) + DirPathMap.Add(new DirMap(br.ReadString(), br.ReadString())); + + CacheSaveTimerEnabled = br.ReadBoolean(); + CacheSaveTimePeriod = br.ReadInt32(); + + DoubleCheckDelete = br.ReadBoolean(); + } + + if (ver == 6) + { + DatRoot = br.ReadString(); + ScanLevel = (eScanLevel)br.ReadInt32(); + FixLevel = (eFixLevel)br.ReadInt32(); + DebugLogsEnabled = br.ReadBoolean(); + bool UserLongFilenames = br.ReadBoolean(); + + IgnoreFiles = new List(); + int c = br.ReadInt32(); + for (int i = 0; i < c; i++) + IgnoreFiles.Add(br.ReadString()); + + DirPathMap = new List(); + c = br.ReadInt32(); + for (int i = 0; i < c; i++) + DirPathMap.Add(new DirMap(br.ReadString(), br.ReadString())); + + CacheSaveTimerEnabled = br.ReadBoolean(); + CacheSaveTimePeriod = br.ReadInt32(); + + DoubleCheckDelete = br.ReadBoolean(); + } + + + br.Close(); + fs.Close(); + } + } + + + public class DirMap : IComparable + { + public readonly string DirKey; + public readonly string DirPath; + + public DirMap(string key, string path) + { + DirKey = key; + DirPath = path; + } + + public int CompareTo(DirMap obj) + { + return Math.Sign(String.Compare(DirKey, obj.DirKey, StringComparison.Ordinal)); + } + } +} + + diff --git a/ROMVault2/SupportedFiles/CHD/CHD.cs b/ROMVault2/SupportedFiles/CHD/CHD.cs new file mode 100644 index 0000000..36131b7 --- /dev/null +++ b/ROMVault2/SupportedFiles/CHD/CHD.cs @@ -0,0 +1,438 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using ROMVault2.IO; +using File = System.IO.File; +using Path = System.IO.Path; + +namespace ROMVault2.SupportedFiles.CHD +{ + public static class CHD + { + private const int MaxHeader = 124; + + public static int CheckFile(IO.FileInfo ofile, out byte[] SHA1CHD, out byte[] MD5CHD, out uint? version) + { + + SHA1CHD = null; + MD5CHD = null; + version = null; + + string ext = IO.Path.GetExtension(ofile.Name).ToLower(); + if (ext != ".chd") + return 0; + + + if (ofile.Length < MaxHeader) + return 0; + + + Stream s; + int retval = IO.FileStream.OpenFileRead(ofile.FullName, out s); + if (retval != 0) + return retval; + if (s == null) return 1; + + CheckFile(s, out SHA1CHD, out MD5CHD, out version); + + s.Close(); + s.Dispose(); + + return 0; + } + + + private static void CheckFile(Stream s, out byte[] SHA1CHD, out byte[] MD5CHD, out uint? version) + { + using (BinaryReader br = new BinaryReader(s)) + { + byte[] buff = br.ReadBytes(MaxHeader); + + CheckFile(buff, out SHA1CHD, out MD5CHD, out version); + } + } + + private static void CheckFile(byte[] buff, out byte[] SHA1CHD, out byte[] MD5CHD, out uint? version) + { + + SHA1CHD = null; + MD5CHD = null; + version = null; + UInt32 compression = 0; + + byte[] header = new[] { (byte)'M', (byte)'C', (byte)'o', (byte)'m', (byte)'p', (byte)'r', (byte)'H', (byte)'D' }; + + for (int i = 0; i < header.Length; i++) + { + if (buff[i] != header[i]) + return; + } + + UInt32 length = ReadUInt32(buff, 8); + version = ReadUInt32(buff, 12); + + if (version > 5) + return; + + switch (version) + { + case 1: + if (length != 76) return; + + // V1 header: + // [ 0] char tag[8]; // 'MComprHD' + // [ 8] UINT32 length; // length of header (including tag and length fields) + // [ 12] UINT32 version; // drive format version + // [ 16] UINT32 flags; // flags (see below) + // [ 20] UINT32 compression; // compression type + compression = ReadUInt32(buff, 20); + if (compression == 0) return; + + // [ 24] UINT32 hunksize; // 512-byte sectors per hunk + // [ 28] UINT32 totalhunks; // total # of hunks represented + // [ 32] UINT32 cylinders; // number of cylinders on hard disk + // [ 36] UINT32 heads; // number of heads on hard disk + // [ 40] UINT32 sectors; // number of sectors on hard disk + // [ 44] UINT8 md5[16]; // MD5 checksum of raw data + MD5CHD = ReadBytes(buff, 44, 16); + // [ 60] UINT8 parentmd5[16]; // MD5 checksum of parent file + // [ 76] (V1 header length) + + return; + + case 2: + if (length != 80) return; + + // V2 header: + // [ 0] char tag[8]; // 'MComprHD' + // [ 8] UINT32 length; // length of header (including tag and length fields) + // [ 12] UINT32 version; // drive format version + // [ 16] UINT32 flags; // flags (see below) + // [ 20] UINT32 compression; // compression type + compression = ReadUInt32(buff, 20); + if (compression == 0) return; + + // [ 24] UINT32 hunksize; // seclen-byte sectors per hunk + // [ 28] UINT32 totalhunks; // total # of hunks represented + // [ 32] UINT32 cylinders; // number of cylinders on hard disk + // [ 36] UINT32 heads; // number of heads on hard disk + // [ 40] UINT32 sectors; // number of sectors on hard disk + // [ 44] UINT8 md5[16]; // MD5 checksum of raw data + MD5CHD = ReadBytes(buff, 44, 16); + // [ 60] UINT8 parentmd5[16]; // MD5 checksum of parent file + // [ 76] UINT32 seclen; // number of bytes per sector + // [ 80] (V2 header length) + return; + + case 3: + if (length != 120) return; + + // V3 header: + // [ 0] char tag[8]; // 'MComprHD' + // [ 8] UINT32 length; // length of header (including tag and length fields) + // [ 12] UINT32 version; // drive format version + // [ 16] UINT32 flags; // flags (see below) + // [ 20] UINT32 compression; // compression type + compression = ReadUInt32(buff, 20); + if (compression == 0) return; + // [ 24] UINT32 totalhunks; // total # of hunks represented + // [ 28] UINT64 logicalbytes; // logical size of the data (in bytes) + // [ 36] UINT64 metaoffset; // offset to the first blob of metadata + // [ 44] UINT8 md5[16]; // MD5 checksum of raw data + MD5CHD = ReadBytes(buff, 44, 16); + // [ 60] UINT8 parentmd5[16]; // MD5 checksum of parent file + // [ 76] UINT32 hunkbytes; // number of bytes per hunk + // [ 80] UINT8 sha1[20]; // SHA1 checksum of raw data + SHA1CHD = ReadBytes(buff, 80, 20); + // [100] UINT8 parentsha1[20];// SHA1 checksum of parent file + // [120] (V3 header length) + return; + + case 4: + if (length != 108) return; + + // V4 header: + // [ 0] char tag[8]; // 'MComprHD' + // [ 8] UINT32 length; // length of header (including tag and length fields) + // [ 12] UINT32 version; // drive format version + // [ 16] UINT32 flags; // flags (see below) + // [ 20] UINT32 compression; // compression type + compression = ReadUInt32(buff, 20); + if (compression == 0) return; + // [ 24] UINT32 totalhunks; // total # of hunks represented + // [ 28] UINT64 logicalbytes; // logical size of the data (in bytes) + // [ 36] UINT64 metaoffset; // offset to the first blob of metadata + // [ 44] UINT32 hunkbytes; // number of bytes per hunk + // [ 48] UINT8 sha1[20]; // combined raw+meta SHA1 + SHA1CHD = ReadBytes(buff, 48, 20); + // [ 68] UINT8 parentsha1[20];// combined raw+meta SHA1 of parent + // [ 88] UINT8 rawsha1[20]; // raw data SHA1 + // [108] (V4 header length) + return; + + case 5: + if (length != 124) return; + + // V5 header: + // [ 0] char tag[8]; // 'MComprHD' + // [ 8] UINT32 length; // length of header (including tag and length fields) + // [ 12] UINT32 version; // drive format version + // [ 16] UINT32 compressors[4];// which custom compressors are used? + UInt32 compression0 = ReadUInt32(buff, 16); + UInt32 compression1 = ReadUInt32(buff, 20); + UInt32 compression2 = ReadUInt32(buff, 24); + UInt32 compression3 = ReadUInt32(buff, 28); + if (compression0 == 0 && compression1 == 0 && compression2 == 0 && compression3 == 0) return; + // [ 32] UINT64 logicalbytes; // logical size of the data (in bytes) + // [ 40] UINT64 mapoffset; // offset to the map + // [ 48] UINT64 metaoffset; // offset to the first blob of metadata + // [ 56] UINT32 hunkbytes; // number of bytes per hunk (512k maximum) + // [ 60] UINT32 unitbytes; // number of bytes per unit within each hunk + // [ 64] UINT8 rawsha1[20]; // raw data SHA1 + // [ 84] UINT8 sha1[20]; // combined raw+meta SHA1 + SHA1CHD = ReadBytes(buff, 84, 20); + // [104] UINT8 parentsha1[20];// combined raw+meta SHA1 of parent + // [124] (V5 header length) + return; + } + } + + + private static UInt32 ReadUInt32(byte[] b, int p) + { + return + ((UInt32)b[p + 0]) << 24 | + ((UInt32)b[p + 1]) << 16 | + ((UInt32)b[p + 2]) << 8 | + (b[p + 3]); + } + + private static byte[] ReadBytes(byte[] b, int p, int length) + { + byte[] ret = new byte[length]; + for (int i = 0; i < length; i++) + ret[i] = b[p + i]; + return ret; + } + + private static string _result; + private static BackgroundWorker _bgw; + private static CHDManCheck _resultType; + + public enum CHDManCheck + { + Unset, + Good, + Corrupt, + CHDNotFound, + ChdmanNotFound, + CHDUnknownError, + CHDReturnError + } + + + + public static CHDManCheck ChdmanCheck(string filename, BackgroundWorker bgw, out string result) + { + _bgw = bgw; + _result = ""; + _resultType = CHDManCheck.Unset; + + string chdPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "chdman.exe"); + if (!File.Exists(chdPath)) + { + result = "chdman not found"; + return CHDManCheck.ChdmanNotFound; + } + + if (!IO.File.Exists(filename)) + { + result = filename + " Not Found."; + return CHDManCheck.CHDNotFound; + } + + string shortName = NameFix.GetShortPath(filename); + + + using (Process exeProcess = new Process()) + { + exeProcess.StartInfo.FileName = chdPath; + ReportError.LogOut("CHD: FileName :" + exeProcess.StartInfo.FileName); + + + exeProcess.StartInfo.Arguments = "verify -i \"" + shortName + "\""; + ReportError.LogOut("CHD: Arguments :" + exeProcess.StartInfo.Arguments); + + // Set UseShellExecute to false for redirection. + exeProcess.StartInfo.UseShellExecute = false; + // Stops the Command window from popping up. + exeProcess.StartInfo.CreateNoWindow = true; + + // Redirect the standard output. + // This stream is read asynchronously using an event handler. + exeProcess.StartInfo.RedirectStandardOutput = true; + exeProcess.StartInfo.RedirectStandardError = true; + + // Set our event handler to asynchronously read the process output. + exeProcess.OutputDataReceived += CHDOutputHandler; + exeProcess.ErrorDataReceived += CHDErrorHandler; + + _outputLineCount = 0; + _errorLines=0; + + ReportError.LogOut("CHD: Scanning Starting"); + exeProcess.Start(); + + // Start the asynchronous read of the process output stream. + exeProcess.BeginOutputReadLine(); + exeProcess.BeginErrorReadLine(); + + // Wait for the process finish. + exeProcess.WaitForExit(); + ReportError.LogOut("CHD: Scanning Finished"); + + } + + result = _result; + + if (_resultType == CHDManCheck.Unset) + _resultType = CHDManCheck.Good; + + _bgw.ReportProgress(0, new bgwText3("")); + + ReportError.LogOut("CHD: returning result " + _resultType + " " + result); + + return _resultType; + } + + /* + chdman - MAME Compressed Hunks of Data (CHD) manager 0.147 (Sep 18 2012) + Raw SHA1 verification successful! + Overall SHA1 verification successful! + */ + + private static int _outputLineCount; + + private static void CHDOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) + { + // Collect the process command output. + if (String.IsNullOrEmpty(outLine.Data)) return; + + string sOut = outLine.Data; + //ReportError.LogOut("CHDOutput: " + _outputLineCount + " : " + sOut); + switch (_outputLineCount) + { + case 0: + if (sOut.Length < 53 || sOut.Substring(0, 53) != "chdman - MAME Compressed Hunks of Data (CHD) manager ") + { + _result = "Incorrect startup of CHDMan :" + sOut; + _resultType = CHDManCheck.CHDReturnError; + } + break; + case 1: + if (sOut != "Raw SHA1 verification successful!") + { + _result = "Raw SHA1 check failed :" + sOut; + _resultType = CHDManCheck.CHDReturnError; + } + break; + case 2: + if (sOut != "Overall SHA1 verification successful!") + { + _result = "Overall SHA1 check failed :" + sOut; + _resultType = CHDManCheck.CHDReturnError; + } + break; + default: + _result = "Unexpected output from chdman :" + sOut; + ReportError.SendErrorMessage("CHDOutputHandler returned =" + sOut); + _resultType = CHDManCheck.CHDUnknownError; + break; + } + + _outputLineCount++; + } + + private static int _errorLines; + + private static void CHDErrorHandler(object sendingProcess, DataReceivedEventArgs outLine) + { + // Collect the process command output. + if (String.IsNullOrEmpty(outLine.Data)) return; + + string sOut = outLine.Data; + ReportError.LogOut("CHDError: " + sOut); + + _bgw.ReportProgress(0, new bgwText3(sOut)); + + if (_resultType != CHDManCheck.Unset) + { + if(_errorLines>0) + { + _errorLines -= 1; + _result += "\r\n" + sOut; + } + return; + } + + if (sOut.Length > 44) + if (sOut.Substring(0, 23) == "Error reading CHD file " && sOut.Substring(sOut.Length - 21, 21) == ": decompression error") + { + _result = sOut; + _resultType = CHDManCheck.Corrupt; + return; + } + if (sOut.Length > 35) + if (sOut.Substring(0, 23) == "Error opening CHD file " && sOut.Substring(sOut.Length - 21, 21) == ": decompression error") + { + _result = sOut; + _resultType = CHDManCheck.Corrupt; + return; + } + if (sOut.Length > 35) + if (sOut.Substring(0, 23) == "Error opening CHD file " && sOut.Substring(sOut.Length - 12, 12) == ": read error") + { + _result = sOut; + _resultType = CHDManCheck.Corrupt; + return; + } + if (sOut.Length > 25) + if (sOut.Substring(0, 25) == "Error: Raw SHA1 in header") + { + _result = sOut; + _errorLines = 1; + _resultType = CHDManCheck.Corrupt; + return; + } + if (sOut.Length == 13) + if (sOut == "Out of memory") + { + _result = sOut; + _resultType = CHDManCheck.Corrupt; + return; + } + + // check for Verifying message + if (sOut.Length >= 24) + if (sOut.Substring(0, 11) == "Verifying, " && sOut.Substring(sOut.Length - 13, 13) == " complete... ") + { + //_resultType = CHDManCheck.Good; + return; + } + + + ReportError.SendErrorMessage("CHDErrorHandler returned =" + sOut); + _result = "Unknown message : " + sOut; + _resultType = CHDManCheck.CHDUnknownError; + } + + + } +} diff --git a/ROMVault2/SupportedFiles/Files/UnCompFiles.cs b/ROMVault2/SupportedFiles/Files/UnCompFiles.cs new file mode 100644 index 0000000..11bc1fb --- /dev/null +++ b/ROMVault2/SupportedFiles/Files/UnCompFiles.cs @@ -0,0 +1,70 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System.IO; +using System.Security.Cryptography; +using ROMVault2.SupportedFiles.Zip.ZLib; + +namespace ROMVault2.SupportedFiles.Files +{ + public static class UnCompFiles + { + private const int Buffersize = 4096; + private static readonly byte[] Buffer; + + static UnCompFiles() + { + Buffer = new byte[Buffersize]; + } + + public static int CheckSumRead(string filename, bool testDeep, out byte[] crc, out byte[] bMD5, out byte[] bSHA1) + { + bMD5 = null; + bSHA1 = null; + crc = null; + + Stream ds; + int errorCode = IO.FileStream.OpenFileRead(filename, out ds); + if (errorCode != 0) + return errorCode; + + CRC32Hash crc32 = new CRC32Hash(); + + MD5 md5 = null; + if (testDeep) md5 = MD5.Create(); + SHA1 sha1 = null; + if (testDeep) sha1 = SHA1.Create(); + + long sizetogo = ds.Length; + + while (sizetogo > 0) + { + int sizenow = sizetogo > Buffersize ? Buffersize : (int)sizetogo; + + ds.Read(Buffer, 0, sizenow); + crc32.TransformBlock(Buffer, 0, sizenow, null, 0); + if (testDeep) md5.TransformBlock(Buffer, 0, sizenow, null, 0); + if (testDeep) sha1.TransformBlock(Buffer, 0, sizenow, null, 0); + sizetogo -= sizenow; + } + + crc32.TransformFinalBlock(Buffer, 0, 0); + if (testDeep) md5.TransformFinalBlock(Buffer, 0, 0); + if (testDeep) sha1.TransformFinalBlock(Buffer, 0, 0); + + ds.Close(); + + crc = crc32.Hash; + if (testDeep) bMD5 = md5.Hash; + if (testDeep) bSHA1 = sha1.Hash; + + return 0; + } + + + + } +} diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/Crc32.cs b/ROMVault2/SupportedFiles/Zip/ZLib/Crc32.cs new file mode 100644 index 0000000..8e6ac29 --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/Crc32.cs @@ -0,0 +1,856 @@ +// CRC32.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2011 Dino Chiesa. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// Last Saved: <2011-August-02 18:25:54> +// +// ------------------------------------------------------------------ +// +// This module defines the CRC32 class, which can do the CRC32 algorithm, using +// arbitrary starting polynomials, and bit reversal. The bit reversal is what +// distinguishes this CRC-32 used in BZip2 from the CRC-32 that is used in PKZIP +// files, or GZIP files. This class does both. +// +// ------------------------------------------------------------------ + + +using System; +using System.Security.Cryptography; +using System.Runtime.InteropServices; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + /// + /// Computes a CRC-32. The CRC-32 algorithm is parameterized - you + /// can set the polynomial and enable or disable bit + /// reversal. This can be used for GZIP, BZip2, or ZIP. + /// + /// + /// This type is used internally by DotNetZip; it is generally not used + /// directly by applications wishing to create, read, or manipulate zip + /// archive files. + /// + + [Guid("ebc25cf6-9120-4283-b972-0e5520d0000C")] + [System.Runtime.InteropServices.ComVisible(true)] +#if !NETCF + [System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDispatch)] +#endif + public class CRC32 + { + /// + /// Indicates the total number of bytes applied to the CRC. + /// + public Int64 TotalBytesRead + { + get + { + return _TotalBytesRead; + } + } + + /// + /// Indicates the current CRC for all blocks slurped in. + /// + public Int32 Crc32Result + { + get + { + return unchecked((Int32)(~_register)); + } + } + public uint Crc32ResultU + { + get + { + return ~_register; + } + } + + + /// + /// Returns the CRC32 for the specified stream. + /// + /// The stream over which to calculate the CRC32 + /// the CRC32 calculation + public Int32 GetCrc32(System.IO.Stream input) + { + return GetCrc32AndCopy(input, null); + } + + /// + /// Returns the CRC32 for the specified stream, and writes the input into the + /// output stream. + /// + /// The stream over which to calculate the CRC32 + /// The stream into which to deflate the input + /// the CRC32 calculation + public Int32 GetCrc32AndCopy(System.IO.Stream input, System.IO.Stream output) + { + if (input == null) + throw new Exception("The input stream must not be null."); + + unchecked + { + byte[] buffer = new byte[BUFFER_SIZE]; + int readSize = BUFFER_SIZE; + + _TotalBytesRead = 0; + int count = input.Read(buffer, 0, readSize); + if (output != null) output.Write(buffer, 0, count); + _TotalBytesRead += count; + while (count > 0) + { + SlurpBlock(buffer, 0, count); + count = input.Read(buffer, 0, readSize); + if (output != null) output.Write(buffer, 0, count); + _TotalBytesRead += count; + } + + return (Int32)(~_register); + } + } + + + /// + /// Get the CRC32 for the given (word,byte) combo. This is a + /// computation defined by PKzip for PKZIP 2.0 (weak) encryption. + /// + /// The word to start with. + /// The byte to combine it with. + /// The CRC-ized result. + public Int32 ComputeCrc32(Int32 W, byte B) + { + return _InternalComputeCrc32((UInt32)W, B); + } + + internal Int32 _InternalComputeCrc32(UInt32 W, byte B) + { + return (Int32)(crc32Table[(W ^ B) & 0xFF] ^ (W >> 8)); + } + + + /// + /// Update the value for the running CRC32 using the given block of bytes. + /// This is useful when using the CRC32() class in a Stream. + /// + /// block of bytes to slurp + /// starting point in the block + /// how many bytes within the block to slurp + public void SlurpBlock(byte[] block, int offset, int count) + { + if (block == null) + throw new Exception("The data buffer must not be null."); + + // bzip algorithm + for (int i = 0; i < count; i++) + { + int x = offset + i; + byte b = block[x]; + if (this.reverseBits) + { + UInt32 temp = (_register >> 24) ^ b; + _register = (_register << 8) ^ crc32Table[temp]; + } + else + { + UInt32 temp = (_register & 0x000000FF) ^ b; + _register = (_register >> 8) ^ crc32Table[temp]; + } + } + _TotalBytesRead += count; + } + + + /// + /// Process one byte in the CRC. + /// + /// the byte to include into the CRC . + public void UpdateCRC(byte b) + { + if (this.reverseBits) + { + UInt32 temp = (_register >> 24) ^ b; + _register = (_register << 8) ^ crc32Table[temp]; + } + else + { + UInt32 temp = (_register & 0x000000FF) ^ b; + _register = (_register >> 8) ^ crc32Table[temp]; + } + } + + /// + /// Process a run of N identical bytes into the CRC. + /// + /// + /// + /// This method serves as an optimization for updating the CRC when a + /// run of identical bytes is found. Rather than passing in a buffer of + /// length n, containing all identical bytes b, this method accepts the + /// byte value and the length of the (virtual) buffer - the length of + /// the run. + /// + /// + /// the byte to include into the CRC. + /// the number of times that byte should be repeated. + public void UpdateCRC(byte b, int n) + { + while (n-- > 0) + { + if (this.reverseBits) + { + uint temp = (_register >> 24) ^ b; + _register = (_register << 8) ^ crc32Table[(temp >= 0) + ? temp + : (temp + 256)]; + } + else + { + UInt32 temp = (_register & 0x000000FF) ^ b; + _register = (_register >> 8) ^ crc32Table[(temp >= 0) + ? temp + : (temp + 256)]; + + } + } + } + + + + private static uint ReverseBits(uint data) + { + unchecked + { + uint ret = data; + ret = (ret & 0x55555555) << 1 | (ret >> 1) & 0x55555555; + ret = (ret & 0x33333333) << 2 | (ret >> 2) & 0x33333333; + ret = (ret & 0x0F0F0F0F) << 4 | (ret >> 4) & 0x0F0F0F0F; + ret = (ret << 24) | ((ret & 0xFF00) << 8) | ((ret >> 8) & 0xFF00) | (ret >> 24); + return ret; + } + } + + private static byte ReverseBits(byte data) + { + unchecked + { + uint u = (uint)data * 0x00020202; + uint m = 0x01044010; + uint s = u & m; + uint t = (u << 2) & (m << 1); + return (byte)((0x01001001 * (s + t)) >> 24); + } + } + + + + private void GenerateLookupTable() + { + crc32Table = new UInt32[256]; + unchecked + { + UInt32 dwCrc; + byte i = 0; + do + { + dwCrc = i; + for (byte j = 8; j > 0; j--) + { + if ((dwCrc & 1) == 1) + { + dwCrc = (dwCrc >> 1) ^ dwPolynomial; + } + else + { + dwCrc >>= 1; + } + } + if (reverseBits) + { + crc32Table[ReverseBits(i)] = ReverseBits(dwCrc); + } + else + { + crc32Table[i] = dwCrc; + } + i++; + } while (i != 0); + } + +#if VERBOSE + Console.WriteLine(); + Console.WriteLine("private static readonly UInt32[] crc32Table = {"); + for (int i = 0; i < crc32Table.Length; i+=4) + { + Console.Write(" "); + for (int j=0; j < 4; j++) + { + Console.Write(" 0x{0:X8}U,", crc32Table[i+j]); + } + Console.WriteLine(); + } + Console.WriteLine("};"); + Console.WriteLine(); +#endif + } + + + private uint gf2_matrix_times(uint[] matrix, uint vec) + { + uint sum = 0; + int i = 0; + while (vec != 0) + { + if ((vec & 0x01) == 0x01) + sum ^= matrix[i]; + vec >>= 1; + i++; + } + return sum; + } + + private void gf2_matrix_square(uint[] square, uint[] mat) + { + for (int i = 0; i < 32; i++) + square[i] = gf2_matrix_times(mat, mat[i]); + } + + + + /// + /// Combines the given CRC32 value with the current running total. + /// + /// + /// This is useful when using a divide-and-conquer approach to + /// calculating a CRC. Multiple threads can each calculate a + /// CRC32 on a segment of the data, and then combine the + /// individual CRC32 values at the end. + /// + /// the crc value to be combined with this one + /// the length of data the CRC value was calculated on + public void Combine(int crc, int length) + { + uint[] even = new uint[32]; // even-power-of-two zeros operator + uint[] odd = new uint[32]; // odd-power-of-two zeros operator + + if (length == 0) + return; + + uint crc1 = ~_register; + uint crc2 = (uint)crc; + + // put operator for one zero bit in odd + odd[0] = this.dwPolynomial; // the CRC-32 polynomial + uint row = 1; + for (int i = 1; i < 32; i++) + { + odd[i] = row; + row <<= 1; + } + + // put operator for two zero bits in even + gf2_matrix_square(even, odd); + + // put operator for four zero bits in odd + gf2_matrix_square(odd, even); + + uint len2 = (uint)length; + + // apply len2 zeros to crc1 (first square will put the operator for one + // zero byte, eight zero bits, in even) + do + { + // apply zeros operator for this bit of len2 + gf2_matrix_square(even, odd); + + if ((len2 & 1) == 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + if (len2 == 0) + break; + + // another iteration of the loop with odd and even swapped + gf2_matrix_square(odd, even); + if ((len2 & 1) == 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + + } while (len2 != 0); + + crc1 ^= crc2; + + _register = ~crc1; + + //return (int) crc1; + return; + } + + + /// + /// Create an instance of the CRC32 class using the default settings: no + /// bit reversal, and a polynomial of 0xEDB88320. + /// + public CRC32() + : this(false) + { + } + + /// + /// Create an instance of the CRC32 class, specifying whether to reverse + /// data bits or not. + /// + /// + /// specify true if the instance should reverse data bits. + /// + /// + /// + /// In the CRC-32 used by BZip2, the bits are reversed. Therefore if you + /// want a CRC32 with compatibility with BZip2, you should pass true + /// here. In the CRC-32 used by GZIP and PKZIP, the bits are not + /// reversed; Therefore if you want a CRC32 with compatibility with + /// those, you should pass false. + /// + /// + public CRC32(bool reverseBits) : + this(unchecked((int)0xEDB88320), reverseBits) + { + } + + + /// + /// Create an instance of the CRC32 class, specifying the polynomial and + /// whether to reverse data bits or not. + /// + /// + /// The polynomial to use for the CRC, expressed in the reversed (LSB) + /// format: the highest ordered bit in the polynomial value is the + /// coefficient of the 0th power; the second-highest order bit is the + /// coefficient of the 1 power, and so on. Expressed this way, the + /// polynomial for the CRC-32C used in IEEE 802.3, is 0xEDB88320. + /// + /// + /// specify true if the instance should reverse data bits. + /// + /// + /// + /// + /// In the CRC-32 used by BZip2, the bits are reversed. Therefore if you + /// want a CRC32 with compatibility with BZip2, you should pass true + /// here for the reverseBits parameter. In the CRC-32 used by + /// GZIP and PKZIP, the bits are not reversed; Therefore if you want a + /// CRC32 with compatibility with those, you should pass false for the + /// reverseBits parameter. + /// + /// + public CRC32(int polynomial, bool reverseBits) + { + this.reverseBits = reverseBits; + this.dwPolynomial = (uint)polynomial; + this.GenerateLookupTable(); + } + + /// + /// Reset the CRC-32 class - clear the CRC "remainder register." + /// + /// + /// + /// Use this when employing a single instance of this class to compute + /// multiple, distinct CRCs on multiple, distinct data blocks. + /// + /// + public void Reset() + { + _register = 0xFFFFFFFFU; + } + + // private member vars + private UInt32 dwPolynomial; + private Int64 _TotalBytesRead; + private bool reverseBits; + private UInt32[] crc32Table; + private const int BUFFER_SIZE = 8192; + private UInt32 _register = 0xFFFFFFFFU; + } + + + /// + /// A Stream that calculates a CRC32 (a checksum) on all bytes read, + /// or on all bytes written. + /// + /// + /// + /// + /// This class can be used to verify the CRC of a ZipEntry when + /// reading from a stream, or to calculate a CRC when writing to a + /// stream. The stream should be used to either read, or write, but + /// not both. If you intermix reads and writes, the results are not + /// defined. + /// + /// + /// + /// This class is intended primarily for use internally by the + /// DotNetZip library. + /// + /// + public class CrcCalculatorStream : System.IO.Stream, System.IDisposable + { + private static readonly Int64 UnsetLengthLimit = -99; + + internal System.IO.Stream _innerStream; + private CRC32 _Crc32; + private Int64 _lengthLimit = -99; + private bool _leaveOpen; + + /// + /// The default constructor. + /// + /// + /// + /// Instances returned from this constructor will leave the underlying + /// stream open upon Close(). The stream uses the default CRC32 + /// algorithm, which implies a polynomial of 0xEDB88320. + /// + /// + /// The underlying stream + public CrcCalculatorStream(System.IO.Stream stream) + : this(true, CrcCalculatorStream.UnsetLengthLimit, stream, null) + { + } + + /// + /// The constructor allows the caller to specify how to handle the + /// underlying stream at close. + /// + /// + /// + /// The stream uses the default CRC32 algorithm, which implies a + /// polynomial of 0xEDB88320. + /// + /// + /// The underlying stream + /// true to leave the underlying stream + /// open upon close of the CrcCalculatorStream; false otherwise. + public CrcCalculatorStream(System.IO.Stream stream, bool leaveOpen) + : this(leaveOpen, CrcCalculatorStream.UnsetLengthLimit, stream, null) + { + } + + /// + /// A constructor allowing the specification of the length of the stream + /// to read. + /// + /// + /// + /// The stream uses the default CRC32 algorithm, which implies a + /// polynomial of 0xEDB88320. + /// + /// + /// Instances returned from this constructor will leave the underlying + /// stream open upon Close(). + /// + /// + /// The underlying stream + /// The length of the stream to slurp + public CrcCalculatorStream(System.IO.Stream stream, Int64 length) + : this(true, length, stream, null) + { + if (length < 0) + throw new ArgumentException("length"); + } + + /// + /// A constructor allowing the specification of the length of the stream + /// to read, as well as whether to keep the underlying stream open upon + /// Close(). + /// + /// + /// + /// The stream uses the default CRC32 algorithm, which implies a + /// polynomial of 0xEDB88320. + /// + /// + /// The underlying stream + /// The length of the stream to slurp + /// true to leave the underlying stream + /// open upon close of the CrcCalculatorStream; false otherwise. + public CrcCalculatorStream(System.IO.Stream stream, Int64 length, bool leaveOpen) + : this(leaveOpen, length, stream, null) + { + if (length < 0) + throw new ArgumentException("length"); + } + + /// + /// A constructor allowing the specification of the length of the stream + /// to read, as well as whether to keep the underlying stream open upon + /// Close(), and the CRC32 instance to use. + /// + /// + /// + /// The stream uses the specified CRC32 instance, which allows the + /// application to specify how the CRC gets calculated. + /// + /// + /// The underlying stream + /// The length of the stream to slurp + /// true to leave the underlying stream + /// open upon close of the CrcCalculatorStream; false otherwise. + /// the CRC32 instance to use to calculate the CRC32 + public CrcCalculatorStream(System.IO.Stream stream, Int64 length, bool leaveOpen, + CRC32 crc32) + : this(leaveOpen, length, stream, crc32) + { + if (length < 0) + throw new ArgumentException("length"); + } + + + // This ctor is private - no validation is done here. This is to allow the use + // of a (specific) negative value for the _lengthLimit, to indicate that there + // is no length set. So we validate the length limit in those ctors that use an + // explicit param, otherwise we don't validate, because it could be our special + // value. + private CrcCalculatorStream + (bool leaveOpen, Int64 length, System.IO.Stream stream, CRC32 crc32) + : base() + { + _innerStream = stream; + _Crc32 = crc32 ?? new CRC32(); + _lengthLimit = length; + _leaveOpen = leaveOpen; + } + + + /// + /// Gets the total number of bytes run through the CRC32 calculator. + /// + /// + /// + /// This is either the total number of bytes read, or the total number of + /// bytes written, depending on the direction of this stream. + /// + public Int64 TotalBytesSlurped + { + get { return _Crc32.TotalBytesRead; } + } + + /// + /// Provides the current CRC for all blocks slurped in. + /// + /// + /// + /// The running total of the CRC is kept as data is written or read + /// through the stream. read this property after all reads or writes to + /// get an accurate CRC for the entire stream. + /// + /// + public Int32 Crc + { + get { return _Crc32.Crc32Result; } + } + + /// + /// Indicates whether the underlying stream will be left open when the + /// CrcCalculatorStream is Closed. + /// + /// + /// + /// Set this at any point before calling . + /// + /// + public bool LeaveOpen + { + get { return _leaveOpen; } + set { _leaveOpen = value; } + } + + /// + /// Read from the stream + /// + /// the buffer to read + /// the offset at which to start + /// the number of bytes to read + /// the number of bytes actually read + public override int Read(byte[] buffer, int offset, int count) + { + int bytesToRead = count; + + // Need to limit the # of bytes returned, if the stream is intended to have + // a definite length. This is especially useful when returning a stream for + // the uncompressed data directly to the application. The app won't + // necessarily read only the UncompressedSize number of bytes. For example + // wrapping the stream returned from OpenReader() into a StreadReader() and + // calling ReadToEnd() on it, We can "over-read" the zip data and get a + // corrupt string. The length limits that, prevents that problem. + + if (_lengthLimit != CrcCalculatorStream.UnsetLengthLimit) + { + if (_Crc32.TotalBytesRead >= _lengthLimit) return 0; // EOF + Int64 bytesRemaining = _lengthLimit - _Crc32.TotalBytesRead; + if (bytesRemaining < count) bytesToRead = (int)bytesRemaining; + } + int n = _innerStream.Read(buffer, offset, bytesToRead); + if (n > 0) _Crc32.SlurpBlock(buffer, offset, n); + return n; + } + + /// + /// Write to the stream. + /// + /// the buffer from which to write + /// the offset at which to start writing + /// the number of bytes to write + public override void Write(byte[] buffer, int offset, int count) + { + if (count > 0) _Crc32.SlurpBlock(buffer, offset, count); + _innerStream.Write(buffer, offset, count); + } + + /// + /// Indicates whether the stream supports reading. + /// + public override bool CanRead + { + get { return _innerStream.CanRead; } + } + + /// + /// Indicates whether the stream supports seeking. + /// + /// + /// + /// Always returns false. + /// + /// + public override bool CanSeek + { + get { return false; } + } + + /// + /// Indicates whether the stream supports writing. + /// + public override bool CanWrite + { + get { return _innerStream.CanWrite; } + } + + /// + /// Flush the stream. + /// + public override void Flush() + { + _innerStream.Flush(); + } + + /// + /// Returns the length of the underlying stream. + /// + public override long Length + { + get + { + if (_lengthLimit == CrcCalculatorStream.UnsetLengthLimit) + return _innerStream.Length; + else return _lengthLimit; + } + } + + /// + /// The getter for this property returns the total bytes read. + /// If you use the setter, it will throw + /// . + /// + public override long Position + { + get { return _Crc32.TotalBytesRead; } + set { throw new NotSupportedException(); } + } + + /// + /// Seeking is not supported on this stream. This method always throws + /// + /// + /// N/A + /// N/A + /// N/A + public override long Seek(long offset, System.IO.SeekOrigin origin) + { + throw new NotSupportedException(); + } + + /// + /// This method always throws + /// + /// + /// N/A + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + + void IDisposable.Dispose() + { + Close(); + } + + /// + /// Closes the stream. + /// + public override void Close() + { + base.Close(); + if (!_leaveOpen) + _innerStream.Close(); + } + + } + + + public class CRC32Hash : HashAlgorithm + { + private CRC32 _Crc32=new CRC32(); + + public override void Initialize() + { + _Crc32.Reset(); + } + protected override void HashCore(byte[] buffer, int start, int length) + { + _Crc32.SlurpBlock(buffer, start, length); + } + protected override byte[] HashFinal() + { + uint crcValue =(uint) _Crc32.Crc32Result; + HashValue = new[] + { + (byte) ((crcValue >> 24) & 0xff), + (byte) ((crcValue >> 16) & 0xff), + (byte) ((crcValue >> 8) & 0xff), + (byte) (crcValue & 0xff) + }; + return HashValue; + } + + public override int HashSize + { + get { return 32; } + } + } +} \ No newline at end of file diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/Deflate.cs b/ROMVault2/SupportedFiles/Zip/ZLib/Deflate.cs new file mode 100644 index 0000000..84c6b83 --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/Deflate.cs @@ -0,0 +1,1890 @@ +// Deflate.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// last saved (in emacs): +// Time-stamp: <2011-August-03 19:52:15> +// +// ------------------------------------------------------------------ +// +// This module defines logic for handling the Deflate or compression. +// +// This code is based on multiple sources: +// - the original zlib v1.2.3 source, which is Copyright (C) 1995-2005 Jean-loup Gailly. +// - the original jzlib, which is Copyright (c) 2000-2003 ymnk, JCraft,Inc. +// +// However, this code is significantly different from both. +// The object model is not the same, and many of the behaviors are different. +// +// In keeping with the license for these other works, the copyrights for +// jzlib and zlib are here. +// +// ----------------------------------------------------------------------- +// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the distribution. +// +// 3. The names of the authors may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------- +// +// This program is based on zlib-1.1.3; credit to authors +// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +// and contributors of zlib. +// +// ----------------------------------------------------------------------- + + +using System; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + + internal enum BlockState + { + NeedMore = 0, // block not completed, need more input or more output + BlockDone, // block flush performed + FinishStarted, // finish started, need only more output at next deflate + FinishDone // finish done, accept no more input or output + } + + internal enum DeflateFlavor + { + Store, + Fast, + Slow + } + + internal sealed class DeflateManager + { + private static readonly int MEM_LEVEL_MAX = 9; + private static readonly int MEM_LEVEL_DEFAULT = 8; + + internal delegate BlockState CompressFunc(FlushType flush); + + internal class Config + { + // Use a faster search when the previous match is longer than this + internal int GoodLength; // reduce lazy search above this match length + + // Attempt to find a better match only when the current match is + // strictly smaller than this value. This mechanism is used only for + // compression levels >= 4. For levels 1,2,3: MaxLazy is actually + // MaxInsertLength. (See DeflateFast) + + internal int MaxLazy; // do not perform lazy search above this match length + + internal int NiceLength; // quit search above this match length + + // To speed up deflation, hash chains are never searched beyond this + // length. A higher limit improves compression ratio but degrades the speed. + + internal int MaxChainLength; + + internal DeflateFlavor Flavor; + + private Config(int goodLength, int maxLazy, int niceLength, int maxChainLength, DeflateFlavor flavor) + { + this.GoodLength = goodLength; + this.MaxLazy = maxLazy; + this.NiceLength = niceLength; + this.MaxChainLength = maxChainLength; + this.Flavor = flavor; + } + + public static Config Lookup(CompressionLevel level) + { + return Table[(int)level]; + } + + + static Config() + { + Table = new Config[] { + new Config(0, 0, 0, 0, DeflateFlavor.Store), + new Config(4, 4, 8, 4, DeflateFlavor.Fast), + new Config(4, 5, 16, 8, DeflateFlavor.Fast), + new Config(4, 6, 32, 32, DeflateFlavor.Fast), + + new Config(4, 4, 16, 16, DeflateFlavor.Slow), + new Config(8, 16, 32, 32, DeflateFlavor.Slow), + new Config(8, 16, 128, 128, DeflateFlavor.Slow), + new Config(8, 32, 128, 256, DeflateFlavor.Slow), + new Config(32, 128, 258, 1024, DeflateFlavor.Slow), + new Config(32, 258, 258, 4096, DeflateFlavor.Slow), + }; + } + + private static readonly Config[] Table; + } + + + private CompressFunc DeflateFunction; + + private static readonly System.String[] _ErrorMessage = new System.String[] + { + "need dictionary", + "stream end", + "", + "file error", + "stream error", + "data error", + "insufficient memory", + "buffer error", + "incompatible version", + "" + }; + + // preset dictionary flag in zlib header + private static readonly int PRESET_DICT = 0x20; + + private static readonly int INIT_STATE = 42; + private static readonly int BUSY_STATE = 113; + private static readonly int FINISH_STATE = 666; + + // The deflate compression method + private static readonly int Z_DEFLATED = 8; + + private static readonly int STORED_BLOCK = 0; + private static readonly int STATIC_TREES = 1; + private static readonly int DYN_TREES = 2; + + // The three kinds of block type + private static readonly int Z_BINARY = 0; + private static readonly int Z_ASCII = 1; + private static readonly int Z_UNKNOWN = 2; + + private static readonly int Buf_size = 8 * 2; + + private static readonly int MIN_MATCH = 3; + private static readonly int MAX_MATCH = 258; + + private static readonly int MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); + + private static readonly int HEAP_SIZE = (2 * InternalConstants.L_CODES + 1); + + private static readonly int END_BLOCK = 256; + + internal ZlibCodec _codec; // the zlib encoder/decoder + internal int status; // as the name implies + internal byte[] pending; // output still pending - waiting to be compressed + internal int nextPending; // index of next pending byte to output to the stream + internal int pendingCount; // number of bytes in the pending buffer + + internal sbyte data_type; // UNKNOWN, BINARY or ASCII + internal int last_flush; // value of flush param for previous deflate call + + internal int w_size; // LZ77 window size (32K by default) + internal int w_bits; // log2(w_size) (8..16) + internal int w_mask; // w_size - 1 + + //internal byte[] dictionary; + internal byte[] window; + + // Sliding window. Input bytes are read into the second half of the window, + // and move to the first half later to keep a dictionary of at least wSize + // bytes. With this organization, matches are limited to a distance of + // wSize-MAX_MATCH bytes, but this ensures that IO is always + // performed with a length multiple of the block size. + // + // To do: use the user input buffer as sliding window. + + internal int window_size; + // Actual size of window: 2*wSize, except when the user input buffer + // is directly used as sliding window. + + internal short[] prev; + // Link to older string with same hash index. To limit the size of this + // array to 64K, this link is maintained only for the last 32K strings. + // An index in this array is thus a window index modulo 32K. + + internal short[] head; // Heads of the hash chains or NIL. + + internal int ins_h; // hash index of string to be inserted + internal int hash_size; // number of elements in hash table + internal int hash_bits; // log2(hash_size) + internal int hash_mask; // hash_size-1 + + // Number of bits by which ins_h must be shifted at each input + // step. It must be such that after MIN_MATCH steps, the oldest + // byte no longer takes part in the hash key, that is: + // hash_shift * MIN_MATCH >= hash_bits + internal int hash_shift; + + // Window position at the beginning of the current output block. Gets + // negative when the window is moved backwards. + + internal int block_start; + + Config config; + internal int match_length; // length of best match + internal int prev_match; // previous match + internal int match_available; // set if previous match exists + internal int strstart; // start of string to insert into.....???? + internal int match_start; // start of matching string + internal int lookahead; // number of valid bytes ahead in window + + // Length of the best match at previous step. Matches not greater than this + // are discarded. This is used in the lazy match evaluation. + internal int prev_length; + + // Insert new strings in the hash table only if the match length is not + // greater than this length. This saves time but degrades compression. + // max_insert_length is used only for compression levels <= 3. + + internal CompressionLevel compressionLevel; // compression level (1..9) + internal CompressionStrategy compressionStrategy; // favor or force Huffman coding + + + internal short[] dyn_ltree; // literal and length tree + internal short[] dyn_dtree; // distance tree + internal short[] bl_tree; // Huffman tree for bit lengths + + internal Tree treeLiterals = new Tree(); // desc for literal tree + internal Tree treeDistances = new Tree(); // desc for distance tree + internal Tree treeBitLengths = new Tree(); // desc for bit length tree + + // number of codes at each bit length for an optimal tree + internal short[] bl_count = new short[InternalConstants.MAX_BITS + 1]; + + // heap used to build the Huffman trees + internal int[] heap = new int[2 * InternalConstants.L_CODES + 1]; + + internal int heap_len; // number of elements in the heap + internal int heap_max; // element of largest frequency + + // The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + // The same heap array is used to build all trees. + + // Depth of each subtree used as tie breaker for trees of equal frequency + internal sbyte[] depth = new sbyte[2 * InternalConstants.L_CODES + 1]; + + internal int _lengthOffset; // index for literals or lengths + + + // Size of match buffer for literals/lengths. There are 4 reasons for + // limiting lit_bufsize to 64K: + // - frequencies can be kept in 16 bit counters + // - if compression is not successful for the first block, all input + // data is still in the window so we can still emit a stored block even + // when input comes from standard input. (This can also be done for + // all blocks if lit_bufsize is not greater than 32K.) + // - if compression is not successful for a file smaller than 64K, we can + // even emit a stored file instead of a stored block (saving 5 bytes). + // This is applicable only for zip (not gzip or zlib). + // - creating new Huffman trees less frequently may not provide fast + // adaptation to changes in the input data statistics. (Take for + // example a binary file with poorly compressible code followed by + // a highly compressible string table.) Smaller buffer sizes give + // fast adaptation but have of course the overhead of transmitting + // trees more frequently. + + internal int lit_bufsize; + + internal int last_lit; // running index in l_buf + + // Buffer for distances. To simplify the code, d_buf and l_buf have + // the same number of elements. To use different lengths, an extra flag + // array would be necessary. + + internal int _distanceOffset; // index into pending; points to distance data?? + + internal int opt_len; // bit length of current block with optimal trees + internal int static_len; // bit length of current block with static trees + internal int matches; // number of string matches in current block + internal int last_eob_len; // bit length of EOB code for last block + + // Output buffer. bits are inserted starting at the bottom (least + // significant bits). + internal short bi_buf; + + // Number of valid bits in bi_buf. All bits above the last valid bit + // are always zero. + internal int bi_valid; + + + internal DeflateManager() + { + dyn_ltree = new short[HEAP_SIZE * 2]; + dyn_dtree = new short[(2 * InternalConstants.D_CODES + 1) * 2]; // distance tree + bl_tree = new short[(2 * InternalConstants.BL_CODES + 1) * 2]; // Huffman tree for bit lengths + } + + + // lm_init + private void _InitializeLazyMatch() + { + window_size = 2 * w_size; + + // clear the hash - workitem 9063 + Array.Clear(head, 0, hash_size); + //for (int i = 0; i < hash_size; i++) head[i] = 0; + + config = Config.Lookup(compressionLevel); + SetDeflater(); + + strstart = 0; + block_start = 0; + lookahead = 0; + match_length = prev_length = MIN_MATCH - 1; + match_available = 0; + ins_h = 0; + } + + // Initialize the tree data structures for a new zlib stream. + private void _InitializeTreeData() + { + treeLiterals.dyn_tree = dyn_ltree; + treeLiterals.staticTree = StaticTree.Literals; + + treeDistances.dyn_tree = dyn_dtree; + treeDistances.staticTree = StaticTree.Distances; + + treeBitLengths.dyn_tree = bl_tree; + treeBitLengths.staticTree = StaticTree.BitLengths; + + bi_buf = 0; + bi_valid = 0; + last_eob_len = 8; // enough lookahead for inflate + + // Initialize the first block of the first file: + _InitializeBlocks(); + } + + internal void _InitializeBlocks() + { + // Initialize the trees. + for (int i = 0; i < InternalConstants.L_CODES; i++) + dyn_ltree[i * 2] = 0; + for (int i = 0; i < InternalConstants.D_CODES; i++) + dyn_dtree[i * 2] = 0; + for (int i = 0; i < InternalConstants.BL_CODES; i++) + bl_tree[i * 2] = 0; + + dyn_ltree[END_BLOCK * 2] = 1; + opt_len = static_len = 0; + last_lit = matches = 0; + } + + // Restore the heap property by moving down the tree starting at node k, + // exchanging a node with the smallest of its two sons if necessary, stopping + // when the heap property is re-established (each father smaller than its + // two sons). + internal void pqdownheap(short[] tree, int k) + { + int v = heap[k]; + int j = k << 1; // left son of k + while (j <= heap_len) + { + // Set j to the smallest of the two sons: + if (j < heap_len && _IsSmaller(tree, heap[j + 1], heap[j], depth)) + { + j++; + } + // Exit if v is smaller than both sons + if (_IsSmaller(tree, v, heap[j], depth)) + break; + + // Exchange v with the smallest son + heap[k] = heap[j]; k = j; + // And continue down the tree, setting j to the left son of k + j <<= 1; + } + heap[k] = v; + } + + internal static bool _IsSmaller(short[] tree, int n, int m, sbyte[] depth) + { + short tn2 = tree[n * 2]; + short tm2 = tree[m * 2]; + return (tn2 < tm2 || (tn2 == tm2 && depth[n] <= depth[m])); + } + + + // Scan a literal or distance tree to determine the frequencies of the codes + // in the bit length tree. + internal void scan_tree(short[] tree, int max_code) + { + int n; // iterates over all tree elements + int prevlen = -1; // last emitted length + int curlen; // length of current code + int nextlen = (int)tree[0 * 2 + 1]; // length of next code + int count = 0; // repeat count of the current code + int max_count = 7; // max repeat count + int min_count = 4; // min repeat count + + if (nextlen == 0) + { + max_count = 138; min_count = 3; + } + tree[(max_code + 1) * 2 + 1] = (short)0x7fff; // guard //?? + + for (n = 0; n <= max_code; n++) + { + curlen = nextlen; nextlen = (int)tree[(n + 1) * 2 + 1]; + if (++count < max_count && curlen == nextlen) + { + continue; + } + else if (count < min_count) + { + bl_tree[curlen * 2] = (short)(bl_tree[curlen * 2] + count); + } + else if (curlen != 0) + { + if (curlen != prevlen) + bl_tree[curlen * 2]++; + bl_tree[InternalConstants.REP_3_6 * 2]++; + } + else if (count <= 10) + { + bl_tree[InternalConstants.REPZ_3_10 * 2]++; + } + else + { + bl_tree[InternalConstants.REPZ_11_138 * 2]++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) + { + max_count = 138; min_count = 3; + } + else if (curlen == nextlen) + { + max_count = 6; min_count = 3; + } + else + { + max_count = 7; min_count = 4; + } + } + } + + // Construct the Huffman tree for the bit lengths and return the index in + // bl_order of the last bit length code to send. + internal int build_bl_tree() + { + int max_blindex; // index of last bit length code of non zero freq + + // Determine the bit length frequencies for literal and distance trees + scan_tree(dyn_ltree, treeLiterals.max_code); + scan_tree(dyn_dtree, treeDistances.max_code); + + // Build the bit length tree: + treeBitLengths.build_tree(this); + // opt_len now includes the length of the tree representations, except + // the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + + // Determine the number of bit length codes to send. The pkzip format + // requires that at least 4 bit length codes be sent. (appnote.txt says + // 3 but the actual value used is 4.) + for (max_blindex = InternalConstants.BL_CODES - 1; max_blindex >= 3; max_blindex--) + { + if (bl_tree[Tree.bl_order[max_blindex] * 2 + 1] != 0) + break; + } + // Update opt_len to include the bit length tree and counts + opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + + return max_blindex; + } + + + // Send the header for a block using dynamic Huffman trees: the counts, the + // lengths of the bit length codes, the literal tree and the distance tree. + // IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + internal void send_all_trees(int lcodes, int dcodes, int blcodes) + { + int rank; // index in bl_order + + send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt + send_bits(dcodes - 1, 5); + send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt + for (rank = 0; rank < blcodes; rank++) + { + send_bits(bl_tree[Tree.bl_order[rank] * 2 + 1], 3); + } + send_tree(dyn_ltree, lcodes - 1); // literal tree + send_tree(dyn_dtree, dcodes - 1); // distance tree + } + + // Send a literal or distance tree in compressed form, using the codes in + // bl_tree. + internal void send_tree(short[] tree, int max_code) + { + int n; // iterates over all tree elements + int prevlen = -1; // last emitted length + int curlen; // length of current code + int nextlen = tree[0 * 2 + 1]; // length of next code + int count = 0; // repeat count of the current code + int max_count = 7; // max repeat count + int min_count = 4; // min repeat count + + if (nextlen == 0) + { + max_count = 138; min_count = 3; + } + + for (n = 0; n <= max_code; n++) + { + curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; + if (++count < max_count && curlen == nextlen) + { + continue; + } + else if (count < min_count) + { + do + { + send_code(curlen, bl_tree); + } + while (--count != 0); + } + else if (curlen != 0) + { + if (curlen != prevlen) + { + send_code(curlen, bl_tree); count--; + } + send_code(InternalConstants.REP_3_6, bl_tree); + send_bits(count - 3, 2); + } + else if (count <= 10) + { + send_code(InternalConstants.REPZ_3_10, bl_tree); + send_bits(count - 3, 3); + } + else + { + send_code(InternalConstants.REPZ_11_138, bl_tree); + send_bits(count - 11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) + { + max_count = 138; min_count = 3; + } + else if (curlen == nextlen) + { + max_count = 6; min_count = 3; + } + else + { + max_count = 7; min_count = 4; + } + } + } + + // Output a block of bytes on the stream. + // IN assertion: there is enough room in pending_buf. + private void put_bytes(byte[] p, int start, int len) + { + Array.Copy(p, start, pending, pendingCount, len); + pendingCount += len; + } + +#if NOTNEEDED + private void put_byte(byte c) + { + pending[pendingCount++] = c; + } + internal void put_short(int b) + { + unchecked + { + pending[pendingCount++] = (byte)b; + pending[pendingCount++] = (byte)(b >> 8); + } + } + internal void putShortMSB(int b) + { + unchecked + { + pending[pendingCount++] = (byte)(b >> 8); + pending[pendingCount++] = (byte)b; + } + } +#endif + + internal void send_code(int c, short[] tree) + { + int c2 = c * 2; + send_bits((tree[c2] & 0xffff), (tree[c2 + 1] & 0xffff)); + } + + internal void send_bits(int value, int length) + { + int len = length; + unchecked + { + if (bi_valid > (int)Buf_size - len) + { + //int val = value; + // bi_buf |= (val << bi_valid); + + bi_buf |= (short)((value << bi_valid) & 0xffff); + //put_short(bi_buf); + pending[pendingCount++] = (byte)bi_buf; + pending[pendingCount++] = (byte)(bi_buf >> 8); + + + bi_buf = (short)((uint)value >> (Buf_size - bi_valid)); + bi_valid += len - Buf_size; + } + else + { + // bi_buf |= (value) << bi_valid; + bi_buf |= (short)((value << bi_valid) & 0xffff); + bi_valid += len; + } + } + } + + // Send one empty static block to give enough lookahead for inflate. + // This takes 10 bits, of which 7 may remain in the bit buffer. + // The current inflate code requires 9 bits of lookahead. If the + // last two codes for the previous block (real code plus EOB) were coded + // on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + // the last real code. In this case we send two empty static blocks instead + // of one. (There are no problems if the previous block is stored or fixed.) + // To simplify the code, we assume the worst case of last real code encoded + // on one bit only. + internal void _tr_align() + { + send_bits(STATIC_TREES << 1, 3); + send_code(END_BLOCK, StaticTree.lengthAndLiteralsTreeCodes); + + bi_flush(); + + // Of the 10 bits for the empty block, we have already sent + // (10 - bi_valid) bits. The lookahead for the last real code (before + // the EOB of the previous block) was thus at least one plus the length + // of the EOB plus what we have just sent of the empty static block. + if (1 + last_eob_len + 10 - bi_valid < 9) + { + send_bits(STATIC_TREES << 1, 3); + send_code(END_BLOCK, StaticTree.lengthAndLiteralsTreeCodes); + bi_flush(); + } + last_eob_len = 7; + } + + + // Save the match info and tally the frequency counts. Return true if + // the current block must be flushed. + internal bool _tr_tally(int dist, int lc) + { + pending[_distanceOffset + last_lit * 2] = unchecked((byte)((uint)dist >> 8)); + pending[_distanceOffset + last_lit * 2 + 1] = unchecked((byte)dist); + pending[_lengthOffset + last_lit] = unchecked((byte)lc); + last_lit++; + + if (dist == 0) + { + // lc is the unmatched char + dyn_ltree[lc * 2]++; + } + else + { + matches++; + // Here, lc is the match length - MIN_MATCH + dist--; // dist = match distance - 1 + dyn_ltree[(Tree.LengthCode[lc] + InternalConstants.LITERALS + 1) * 2]++; + dyn_dtree[Tree.DistanceCode(dist) * 2]++; + } + + /* ************************************************************ + * * + * this code is not turned on by default in ZLIB Trrntzip code * + * * + * ************************************************************* + */ + /* + if (false) //CompSettings + { + if ((last_lit & 0x1fff) == 0 && (int)compressionLevel > 2) + { + // Compute an upper bound for the compressed length + int out_length = last_lit << 3; + int in_length = strstart - block_start; + int dcode; + for (dcode = 0; dcode < InternalConstants.D_CODES; dcode++) + { + out_length = (int)(out_length + (int)dyn_dtree[dcode * 2] * (5L + Tree.ExtraDistanceBits[dcode])); + } + out_length >>= 3; + if ((matches < (last_lit / 2)) && out_length < in_length / 2) + return true; + } + } + */ + + return (last_lit == lit_bufsize - 1) || (last_lit == lit_bufsize); + // dinoch - wraparound? + // We avoid equality with lit_bufsize because of wraparound at 64K + // on 16 bit machines and because stored blocks are restricted to + // 64K-1 bytes. + } + + + + // Send the block data compressed using the given Huffman trees + internal void send_compressed_block(short[] ltree, short[] dtree) + { + int distance; // distance of matched string + int lc; // match length or unmatched char (if dist == 0) + int lx = 0; // running index in l_buf + int code; // the code to send + int extra; // number of extra bits to send + + if (last_lit != 0) + { + do + { + int ix = _distanceOffset + lx * 2; + distance = ((pending[ix] << 8) & 0xff00) | + (pending[ix + 1] & 0xff); + lc = (pending[_lengthOffset + lx]) & 0xff; + lx++; + + if (distance == 0) + { + send_code(lc, ltree); // send a literal byte + } + else + { + // literal or match pair + // Here, lc is the match length - MIN_MATCH + code = Tree.LengthCode[lc]; + + // send the length code + send_code(code + InternalConstants.LITERALS + 1, ltree); + extra = Tree.ExtraLengthBits[code]; + if (extra != 0) + { + // send the extra length bits + lc -= Tree.LengthBase[code]; + send_bits(lc, extra); + } + distance--; // dist is now the match distance - 1 + code = Tree.DistanceCode(distance); + + // send the distance code + send_code(code, dtree); + + extra = Tree.ExtraDistanceBits[code]; + if (extra != 0) + { + // send the extra distance bits + distance -= Tree.DistanceBase[code]; + send_bits(distance, extra); + } + } + + // Check that the overlay between pending and d_buf+l_buf is ok: + } + while (lx < last_lit); + } + + send_code(END_BLOCK, ltree); + last_eob_len = ltree[END_BLOCK * 2 + 1]; + } + + + + // Set the data type to ASCII or BINARY, using a crude approximation: + // binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. + // IN assertion: the fields freq of dyn_ltree are set and the total of all + // frequencies does not exceed 64K (to fit in an int on 16 bit machines). + internal void set_data_type() + { + int n = 0; + int ascii_freq = 0; + int bin_freq = 0; + while (n < 7) + { + bin_freq += dyn_ltree[n * 2]; n++; + } + while (n < 128) + { + ascii_freq += dyn_ltree[n * 2]; n++; + } + while (n < InternalConstants.LITERALS) + { + bin_freq += dyn_ltree[n * 2]; n++; + } + data_type = (sbyte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); + } + + + + // Flush the bit buffer, keeping at most 7 bits in it. + internal void bi_flush() + { + if (bi_valid == 16) + { + pending[pendingCount++] = (byte)bi_buf; + pending[pendingCount++] = (byte)(bi_buf >> 8); + bi_buf = 0; + bi_valid = 0; + } + else if (bi_valid >= 8) + { + //put_byte((byte)bi_buf); + pending[pendingCount++] = (byte)bi_buf; + bi_buf >>= 8; + bi_valid -= 8; + } + } + + // Flush the bit buffer and align the output on a byte boundary + internal void bi_windup() + { + if (bi_valid > 8) + { + pending[pendingCount++] = (byte)bi_buf; + pending[pendingCount++] = (byte)(bi_buf >> 8); + } + else if (bi_valid > 0) + { + //put_byte((byte)bi_buf); + pending[pendingCount++] = (byte)bi_buf; + } + bi_buf = 0; + bi_valid = 0; + } + + // Copy a stored block, storing first the length and its + // one's complement if requested. + internal void copy_block(int buf, int len, bool header) + { + bi_windup(); // align on byte boundary + last_eob_len = 8; // enough lookahead for inflate + + if (header) + unchecked + { + //put_short((short)len); + pending[pendingCount++] = (byte)len; + pending[pendingCount++] = (byte)(len >> 8); + //put_short((short)~len); + pending[pendingCount++] = (byte)~len; + pending[pendingCount++] = (byte)(~len >> 8); + } + + put_bytes(window, buf, len); + } + + internal void flush_block_only(bool eof) + { + _tr_flush_block(block_start >= 0 ? block_start : -1, strstart - block_start, eof); + block_start = strstart; + _codec.flush_pending(); + } + + // Copy without compression as much as possible from the input stream, return + // the current block state. + // This function does not insert new strings in the dictionary since + // uncompressible data is probably not useful. This function is used + // only for the level=0 compression option. + // NOTE: this function should be optimized to avoid extra copying from + // window to pending_buf. + internal BlockState DeflateNone(FlushType flush) + { + // Stored blocks are limited to 0xffff bytes, pending is limited + // to pending_buf_size, and each stored block has a 5 byte header: + + int max_block_size = 0xffff; + int max_start; + + if (max_block_size > pending.Length - 5) + { + max_block_size = pending.Length - 5; + } + + // Copy as much as possible from input to output: + while (true) + { + // Fill the window as much as possible: + if (lookahead <= 1) + { + _fillWindow(); + if (lookahead == 0 && flush == FlushType.None) + return BlockState.NeedMore; + if (lookahead == 0) + break; // flush the current block + } + + strstart += lookahead; + lookahead = 0; + + // Emit a stored block if pending will be full: + max_start = block_start + max_block_size; + if (strstart == 0 || strstart >= max_start) + { + // strstart == 0 is possible when wraparound on 16-bit machine + lookahead = (int)(strstart - max_start); + strstart = (int)max_start; + + flush_block_only(false); + if (_codec.AvailableBytesOut == 0) + return BlockState.NeedMore; + } + + // Flush if we may have to slide, otherwise block_start may become + // negative and the data will be gone: + if (strstart - block_start >= w_size - MIN_LOOKAHEAD) + { + flush_block_only(false); + if (_codec.AvailableBytesOut == 0) + return BlockState.NeedMore; + } + } + + flush_block_only(flush == FlushType.Finish); + if (_codec.AvailableBytesOut == 0) + return (flush == FlushType.Finish) ? BlockState.FinishStarted : BlockState.NeedMore; + + return flush == FlushType.Finish ? BlockState.FinishDone : BlockState.BlockDone; + } + + + // Send a stored block + internal void _tr_stored_block(int buf, int stored_len, bool eof) + { + send_bits((STORED_BLOCK << 1) + (eof ? 1 : 0), 3); // send block type + copy_block(buf, stored_len, true); // with header + } + + // Determine the best encoding for the current block: dynamic trees, static + // trees or store, and output the encoded block to the zip file. + internal void _tr_flush_block(int buf, int stored_len, bool eof) + { + int opt_lenb, static_lenb; // opt_len and static_len in bytes + int max_blindex = 0; // index of last bit length code of non zero freq + + // Build the Huffman trees unless a stored block is forced + if (compressionLevel > 0) + { + // Check if the file is ascii or binary + if (data_type == Z_UNKNOWN) + set_data_type(); + + // Construct the literal and distance trees + treeLiterals.build_tree(this); + + treeDistances.build_tree(this); + + // At this point, opt_len and static_len are the total bit lengths of + // the compressed block data, excluding the tree representations. + + // Build the bit length tree for the above two trees, and get the index + // in bl_order of the last bit length code to send. + max_blindex = build_bl_tree(); + + // Determine the best encoding. Compute first the block length in bytes + opt_lenb = (opt_len + 3 + 7) >> 3; + static_lenb = (static_len + 3 + 7) >> 3; + + if (static_lenb <= opt_lenb) + opt_lenb = static_lenb; + } + else + { + opt_lenb = static_lenb = stored_len + 5; // force a stored block + } + + if (stored_len + 4 <= opt_lenb && buf != -1) + { + // 4: two words for the lengths + // The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + // Otherwise we can't have processed more than WSIZE input bytes since + // the last block flush, because compression would have been + // successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + // transform a block into a stored block. + _tr_stored_block(buf, stored_len, eof); + } + else if (static_lenb == opt_lenb) + { + send_bits((STATIC_TREES << 1) + (eof ? 1 : 0), 3); + send_compressed_block(StaticTree.lengthAndLiteralsTreeCodes, StaticTree.distTreeCodes); + } + else + { + send_bits((DYN_TREES << 1) + (eof ? 1 : 0), 3); + send_all_trees(treeLiterals.max_code + 1, treeDistances.max_code + 1, max_blindex + 1); + send_compressed_block(dyn_ltree, dyn_dtree); + } + + // The above check is made mod 2^32, for files larger than 512 MB + // and uLong implemented on 32 bits. + + _InitializeBlocks(); + + if (eof) + { + bi_windup(); + } + } + + // Fill the window when the lookahead becomes insufficient. + // Updates strstart and lookahead. + // + // IN assertion: lookahead < MIN_LOOKAHEAD + // OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + // At least one byte has been read, or avail_in == 0; reads are + // performed for at least two bytes (required for the zip translate_eol + // option -- not supported here). + private void _fillWindow() + { + int n, m; + int p; + int more; // Amount of free space at the end of the window. + + do + { + more = (window_size - lookahead - strstart); + + // Deal with !@#$% 64K limit: + if (more == 0 && strstart == 0 && lookahead == 0) + { + more = w_size; + } + else if (more == -1) + { + // Very unlikely, but possible on 16 bit machine if strstart == 0 + // and lookahead == 1 (input done one byte at time) + more--; + + // If the window is almost full and there is insufficient lookahead, + // move the upper half to the lower one to make room in the upper half. + } + else if (strstart >= w_size + w_size - MIN_LOOKAHEAD) + { + Array.Copy(window, w_size, window, 0, w_size); + match_start -= w_size; + strstart -= w_size; // we now have strstart >= MAX_DIST + block_start -= w_size; + + // Slide the hash table (could be avoided with 32 bit values + // at the expense of memory usage). We slide even when level == 0 + // to keep the hash table consistent if we switch back to level > 0 + // later. (Using level 0 permanently is not an optimal usage of + // zlib, so we don't care about this pathological case.) + + n = hash_size; + p = n; + do + { + m = (head[--p] & 0xffff); + head[p] = (short)((m >= w_size) ? (m - w_size) : 0); + } + while (--n != 0); + + n = w_size; + p = n; + do + { + m = (prev[--p] & 0xffff); + prev[p] = (short)((m >= w_size) ? (m - w_size) : 0); + // If n is not on any hash chain, prev[n] is garbage but + // its value will never be used. + } + while (--n != 0); + more += w_size; + } + + if (_codec.AvailableBytesIn == 0) + return; + + // If there was no sliding: + // strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + // more == window_size - lookahead - strstart + // => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + // => more >= window_size - 2*WSIZE + 2 + // In the BIG_MEM or MMAP case (not yet supported), + // window_size == input_size + MIN_LOOKAHEAD && + // strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + // Otherwise, window_size == 2*WSIZE so more >= 2. + // If there was sliding, more >= WSIZE. So in all cases, more >= 2. + + n = _codec.read_buf(window, strstart + lookahead, more); + lookahead += n; + + // Initialize the hash value now that we have some input: + if (lookahead >= MIN_MATCH) + { + ins_h = window[strstart] & 0xff; + ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; + } + // If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + // but this is not important since only literal bytes will be emitted. + } + while (lookahead < MIN_LOOKAHEAD && _codec.AvailableBytesIn != 0); + } + + // Compress as much as possible from the input stream, return the current + // block state. + // This function does not perform lazy evaluation of matches and inserts + // new strings in the dictionary only for unmatched strings or for short + // matches. It is used only for the fast compression options. + internal BlockState DeflateFast(FlushType flush) + { + // short hash_head = 0; // head of the hash chain + int hash_head = 0; // head of the hash chain + bool bflush; // set if current block must be flushed + + while (true) + { + // Make sure that we always have enough lookahead, except + // at the end of the input file. We need MAX_MATCH bytes + // for the next match, plus MIN_MATCH bytes to insert the + // string following the next match. + if (lookahead < MIN_LOOKAHEAD) + { + _fillWindow(); + if (lookahead < MIN_LOOKAHEAD && flush == FlushType.None) + { + return BlockState.NeedMore; + } + if (lookahead == 0) + break; // flush the current block + } + + // Insert the string window[strstart .. strstart+2] in the + // dictionary, and set hash_head to the head of the hash chain: + if (lookahead >= MIN_MATCH) + { + ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + + // prev[strstart&w_mask]=hash_head=head[ins_h]; + hash_head = (head[ins_h] & 0xffff); + prev[strstart & w_mask] = head[ins_h]; + head[ins_h] = unchecked((short)strstart); + } + + // Find the longest match, discarding those <= prev_length. + // At this point we have always match_length < MIN_MATCH + + if (hash_head != 0L && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) + { + // To simplify the code, we prevent matches with the string + // of window index 0 (in particular we have to avoid a match + // of the string with itself at the start of the input file). + if (compressionStrategy != CompressionStrategy.HuffmanOnly) + { + match_length = longest_match(hash_head); + } + // longest_match() sets match_start + } + if (match_length >= MIN_MATCH) + { + // check_match(strstart, match_start, match_length); + + bflush = _tr_tally(strstart - match_start, match_length - MIN_MATCH); + + lookahead -= match_length; + + // Insert new strings in the hash table only if the match length + // is not too large. This saves time but degrades compression. + if (match_length <= config.MaxLazy && lookahead >= MIN_MATCH) + { + match_length--; // string at strstart already in hash table + do + { + strstart++; + + ins_h = ((ins_h << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + // prev[strstart&w_mask]=hash_head=head[ins_h]; + hash_head = (head[ins_h] & 0xffff); + prev[strstart & w_mask] = head[ins_h]; + head[ins_h] = unchecked((short)strstart); + + // strstart never exceeds WSIZE-MAX_MATCH, so there are + // always MIN_MATCH bytes ahead. + } + while (--match_length != 0); + strstart++; + } + else + { + strstart += match_length; + match_length = 0; + ins_h = window[strstart] & 0xff; + + ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; + // If lookahead < MIN_MATCH, ins_h is garbage, but it does not + // matter since it will be recomputed at next deflate call. + } + } + else + { + // No match, output a literal byte + + bflush = _tr_tally(0, window[strstart] & 0xff); + lookahead--; + strstart++; + } + if (bflush) + { + flush_block_only(false); + if (_codec.AvailableBytesOut == 0) + return BlockState.NeedMore; + } + } + + flush_block_only(flush == FlushType.Finish); + if (_codec.AvailableBytesOut == 0) + { + if (flush == FlushType.Finish) + return BlockState.FinishStarted; + else + return BlockState.NeedMore; + } + return flush == FlushType.Finish ? BlockState.FinishDone : BlockState.BlockDone; + } + + // Same as above, but achieves better compression. We use a lazy + // evaluation for matches: a match is finally adopted only if there is + // no better match at the next window position. + internal BlockState DeflateSlow(FlushType flush) + { + // short hash_head = 0; // head of hash chain + int hash_head = 0; // head of hash chain + bool bflush; // set if current block must be flushed + + // Process the input block. + while (true) + { + // Make sure that we always have enough lookahead, except + // at the end of the input file. We need MAX_MATCH bytes + // for the next match, plus MIN_MATCH bytes to insert the + // string following the next match. + + if (lookahead < MIN_LOOKAHEAD) + { + _fillWindow(); + if (lookahead < MIN_LOOKAHEAD && flush == FlushType.None) + return BlockState.NeedMore; + + if (lookahead == 0) + break; // flush the current block + } + + // Insert the string window[strstart .. strstart+2] in the + // dictionary, and set hash_head to the head of the hash chain: + + if (lookahead >= MIN_MATCH) + { + ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + // prev[strstart&w_mask]=hash_head=head[ins_h]; + hash_head = (head[ins_h] & 0xffff); + prev[strstart & w_mask] = head[ins_h]; + head[ins_h] = unchecked((short)strstart); + } + + // Find the longest match, discarding those <= prev_length. + prev_length = match_length; + prev_match = match_start; + match_length = MIN_MATCH - 1; + + if (hash_head != 0 && prev_length < config.MaxLazy && + ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) + { + // To simplify the code, we prevent matches with the string + // of window index 0 (in particular we have to avoid a match + // of the string with itself at the start of the input file). + + if (compressionStrategy != CompressionStrategy.HuffmanOnly) + { + match_length = longest_match(hash_head); + } + // longest_match() sets match_start + + if (match_length <= 5 && (compressionStrategy == CompressionStrategy.Filtered || + (match_length == MIN_MATCH && strstart - match_start > 4096))) + { + + // If prev_match is also MIN_MATCH, match_start is garbage + // but we will ignore the current match anyway. + match_length = MIN_MATCH - 1; + } + } + + // If there was a match at the previous step and the current + // match is not better, output the previous match: + if (prev_length >= MIN_MATCH && match_length <= prev_length) + { + int max_insert = strstart + lookahead - MIN_MATCH; + // Do not insert strings in hash table beyond this. + + // check_match(strstart-1, prev_match, prev_length); + + bflush = _tr_tally(strstart - 1 - prev_match, prev_length - MIN_MATCH); + + // Insert in hash table all strings up to the end of the match. + // strstart-1 and strstart are already inserted. If there is not + // enough lookahead, the last two strings are not inserted in + // the hash table. + lookahead -= (prev_length - 1); + prev_length -= 2; + do + { + if (++strstart <= max_insert) + { + ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + //prev[strstart&w_mask]=hash_head=head[ins_h]; + hash_head = (head[ins_h] & 0xffff); + prev[strstart & w_mask] = head[ins_h]; + head[ins_h] = unchecked((short)strstart); + } + } + while (--prev_length != 0); + match_available = 0; + match_length = MIN_MATCH - 1; + strstart++; + + if (bflush) + { + flush_block_only(false); + if (_codec.AvailableBytesOut == 0) + return BlockState.NeedMore; + } + } + else if (match_available != 0) + { + + // If there was no match at the previous position, output a + // single literal. If there was a match but the current match + // is longer, truncate the previous match to a single literal. + + bflush = _tr_tally(0, window[strstart - 1] & 0xff); + + if (bflush) + { + flush_block_only(false); + } + strstart++; + lookahead--; + if (_codec.AvailableBytesOut == 0) + return BlockState.NeedMore; + } + else + { + // There is no previous match to compare with, wait for + // the next step to decide. + + match_available = 1; + strstart++; + lookahead--; + } + } + + if (match_available != 0) + { + bflush = _tr_tally(0, window[strstart - 1] & 0xff); + match_available = 0; + } + flush_block_only(flush == FlushType.Finish); + + if (_codec.AvailableBytesOut == 0) + { + if (flush == FlushType.Finish) + return BlockState.FinishStarted; + else + return BlockState.NeedMore; + } + + return flush == FlushType.Finish ? BlockState.FinishDone : BlockState.BlockDone; + } + + + internal int longest_match(int cur_match) + { + int chain_length = config.MaxChainLength; // max hash chain length + int scan = strstart; // current string + int match; // matched string + int len; // length of current match + int best_len = prev_length; // best match length so far + int limit = strstart > (w_size - MIN_LOOKAHEAD) ? strstart - (w_size - MIN_LOOKAHEAD) : 0; + + int niceLength = config.NiceLength; + + // Stop when cur_match becomes <= limit. To simplify the code, + // we prevent matches with the string of window index 0. + + int wmask = w_mask; + + int strend = strstart + MAX_MATCH; + byte scan_end1 = window[scan + best_len - 1]; + byte scan_end = window[scan + best_len]; + + // The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + // It is easy to get rid of this optimization if necessary. + + // Do not waste too much time if we already have a good match: + if (prev_length >= config.GoodLength) + { + chain_length >>= 2; + } + + // Do not look for matches beyond the end of the input. This is necessary + // to make deflate deterministic. + if (niceLength > lookahead) + niceLength = lookahead; + + do + { + match = cur_match; + + // Skip to next match if the match length cannot increase + // or if the match length is less than 2: + if (window[match + best_len] != scan_end || + window[match + best_len - 1] != scan_end1 || + window[match] != window[scan] || + window[++match] != window[scan + 1]) + continue; + + // The check at best_len-1 can be removed because it will be made + // again later. (This heuristic is not always a win.) + // It is not necessary to compare scan[2] and match[2] since they + // are always equal when the other bytes match, given that + // the hash keys are equal and that HASH_BITS >= 8. + scan += 2; match++; + + // We check for insufficient lookahead only every 8th comparison; + // the 256th check will be made at strstart+258. + do + { + } + while (window[++scan] == window[++match] && + window[++scan] == window[++match] && + window[++scan] == window[++match] && + window[++scan] == window[++match] && + window[++scan] == window[++match] && + window[++scan] == window[++match] && + window[++scan] == window[++match] && + window[++scan] == window[++match] && scan < strend); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + + if (len > best_len) + { + match_start = cur_match; + best_len = len; + if (len >= niceLength) + break; + scan_end1 = window[scan + best_len - 1]; + scan_end = window[scan + best_len]; + } + } + while ((cur_match = (prev[cur_match & wmask] & 0xffff)) > limit && --chain_length != 0); + + if (best_len <= lookahead) + return best_len; + return lookahead; + } + + + private bool Rfc1950BytesEmitted = false; + private bool _WantRfc1950HeaderBytes = true; + internal bool WantRfc1950HeaderBytes + { + get { return _WantRfc1950HeaderBytes; } + set { _WantRfc1950HeaderBytes = value; } + } + + + internal int Initialize(ZlibCodec codec, CompressionLevel level) + { + return Initialize(codec, level, ZlibConstants.WindowBitsMax); + } + + internal int Initialize(ZlibCodec codec, CompressionLevel level, int bits) + { + return Initialize(codec, level, bits, MEM_LEVEL_DEFAULT, CompressionStrategy.Default); + } + + internal int Initialize(ZlibCodec codec, CompressionLevel level, int bits, CompressionStrategy compressionStrategy) + { + return Initialize(codec, level, bits, MEM_LEVEL_DEFAULT, compressionStrategy); + } + + internal int Initialize(ZlibCodec codec, CompressionLevel level, int windowBits, int memLevel, CompressionStrategy strategy) + { + _codec = codec; + _codec.Message = null; + + // validation + if (windowBits < 9 || windowBits > 15) + throw new ZlibException("windowBits must be in the range 9..15."); + + if (memLevel < 1 || memLevel > MEM_LEVEL_MAX) + throw new ZlibException(String.Format("memLevel must be in the range 1.. {0}", MEM_LEVEL_MAX)); + + _codec.dstate = this; + + w_bits = windowBits; + w_size = 1 << w_bits; + w_mask = w_size - 1; + + hash_bits = memLevel + 7; + hash_size = 1 << hash_bits; + hash_mask = hash_size - 1; + hash_shift = ((hash_bits + MIN_MATCH - 1) / MIN_MATCH); + + window = new byte[w_size * 2]; + prev = new short[w_size]; + head = new short[hash_size]; + + // for memLevel==8, this will be 16384, 16k + lit_bufsize = 1 << (memLevel + 6); + + // Use a single array as the buffer for data pending compression, + // the output distance codes, and the output length codes (aka tree). + // orig comment: This works just fine since the average + // output size for (length,distance) codes is <= 24 bits. + pending = new byte[lit_bufsize * 4]; + _distanceOffset = lit_bufsize; + _lengthOffset = (1 + 2) * lit_bufsize; + + // So, for memLevel 8, the length of the pending buffer is 65536. 64k. + // The first 16k are pending bytes. + // The middle slice, of 32k, is used for distance codes. + // The final 16k are length codes. + + this.compressionLevel = level; + this.compressionStrategy = strategy; + + Reset(); + return ZlibConstants.Z_OK; + } + + + internal void Reset() + { + _codec.TotalBytesIn = _codec.TotalBytesOut = 0; + _codec.Message = null; + //strm.data_type = Z_UNKNOWN; + + pendingCount = 0; + nextPending = 0; + + Rfc1950BytesEmitted = false; + + status = (WantRfc1950HeaderBytes) ? INIT_STATE : BUSY_STATE; + _codec._Adler32 = Adler.Adler32(0, null, 0, 0); + + last_flush = (int)FlushType.None; + + _InitializeTreeData(); + _InitializeLazyMatch(); + } + + + internal int End() + { + if (status != INIT_STATE && status != BUSY_STATE && status != FINISH_STATE) + { + return ZlibConstants.Z_STREAM_ERROR; + } + // Deallocate in reverse order of allocations: + pending = null; + head = null; + prev = null; + window = null; + // free + // dstate=null; + return status == BUSY_STATE ? ZlibConstants.Z_DATA_ERROR : ZlibConstants.Z_OK; + } + + + private void SetDeflater() + { + switch (config.Flavor) + { + case DeflateFlavor.Store: + DeflateFunction = DeflateNone; + break; + case DeflateFlavor.Fast: + DeflateFunction = DeflateFast; + break; + case DeflateFlavor.Slow: + DeflateFunction = DeflateSlow; + break; + } + } + + + internal int SetParams(CompressionLevel level, CompressionStrategy strategy) + { + int result = ZlibConstants.Z_OK; + + if (compressionLevel != level) + { + Config newConfig = Config.Lookup(level); + + // change in the deflate flavor (Fast vs slow vs none)? + if (newConfig.Flavor != config.Flavor && _codec.TotalBytesIn != 0) + { + // Flush the last buffer: + result = _codec.Deflate(FlushType.Partial); + } + + compressionLevel = level; + config = newConfig; + SetDeflater(); + } + + // no need to flush with change in strategy? Really? + compressionStrategy = strategy; + + return result; + } + + + internal int SetDictionary(byte[] dictionary) + { + int length = dictionary.Length; + int index = 0; + + if (dictionary == null || status != INIT_STATE) + throw new ZlibException("Stream error."); + + _codec._Adler32 = Adler.Adler32(_codec._Adler32, dictionary, 0, dictionary.Length); + + if (length < MIN_MATCH) + return ZlibConstants.Z_OK; + if (length > w_size - MIN_LOOKAHEAD) + { + length = w_size - MIN_LOOKAHEAD; + index = dictionary.Length - length; // use the tail of the dictionary + } + Array.Copy(dictionary, index, window, 0, length); + strstart = length; + block_start = length; + + // Insert all strings in the hash table (except for the last two bytes). + // s->lookahead stays null, so s->ins_h will be recomputed at the next + // call of fill_window. + + ins_h = window[0] & 0xff; + ins_h = (((ins_h) << hash_shift) ^ (window[1] & 0xff)) & hash_mask; + + for (int n = 0; n <= length - MIN_MATCH; n++) + { + ins_h = (((ins_h) << hash_shift) ^ (window[(n) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; + prev[n & w_mask] = head[ins_h]; + head[ins_h] = (short)n; + } + return ZlibConstants.Z_OK; + } + + + + internal int Deflate(FlushType flush) + { + int old_flush; + + if (_codec.OutputBuffer == null || + (_codec.InputBuffer == null && _codec.AvailableBytesIn != 0) || + (status == FINISH_STATE && flush != FlushType.Finish)) + { + _codec.Message = _ErrorMessage[ZlibConstants.Z_NEED_DICT - (ZlibConstants.Z_STREAM_ERROR)]; + throw new ZlibException(String.Format("Something is fishy. [{0}]", _codec.Message)); + } + if (_codec.AvailableBytesOut == 0) + { + _codec.Message = _ErrorMessage[ZlibConstants.Z_NEED_DICT - (ZlibConstants.Z_BUF_ERROR)]; + throw new ZlibException("OutputBuffer is full (AvailableBytesOut == 0)"); + } + + old_flush = last_flush; + last_flush = (int)flush; + + // Write the zlib (rfc1950) header bytes + if (status == INIT_STATE) + { + int header = (Z_DEFLATED + ((w_bits - 8) << 4)) << 8; + int level_flags = (((int)compressionLevel - 1) & 0xff) >> 1; + + if (level_flags > 3) + level_flags = 3; + header |= (level_flags << 6); + if (strstart != 0) + header |= PRESET_DICT; + header += 31 - (header % 31); + + status = BUSY_STATE; + //putShortMSB(header); + unchecked + { + pending[pendingCount++] = (byte)(header >> 8); + pending[pendingCount++] = (byte)header; + } + // Save the adler32 of the preset dictionary: + if (strstart != 0) + { + pending[pendingCount++] = (byte)((_codec._Adler32 & 0xFF000000) >> 24); + pending[pendingCount++] = (byte)((_codec._Adler32 & 0x00FF0000) >> 16); + pending[pendingCount++] = (byte)((_codec._Adler32 & 0x0000FF00) >> 8); + pending[pendingCount++] = (byte)(_codec._Adler32 & 0x000000FF); + } + _codec._Adler32 = Adler.Adler32(0, null, 0, 0); + } + + // Flush as much pending output as possible + if (pendingCount != 0) + { + _codec.flush_pending(); + if (_codec.AvailableBytesOut == 0) + { + //System.out.println(" avail_out==0"); + // Since avail_out is 0, deflate will be called again with + // more output space, but possibly with both pending and + // avail_in equal to zero. There won't be anything to do, + // but this is not an error situation so make sure we + // return OK instead of BUF_ERROR at next call of deflate: + last_flush = -1; + return ZlibConstants.Z_OK; + } + + // Make sure there is something to do and avoid duplicate consecutive + // flushes. For repeated and useless calls with Z_FINISH, we keep + // returning Z_STREAM_END instead of Z_BUFF_ERROR. + } + else if (_codec.AvailableBytesIn == 0 && + (int)flush <= old_flush && + flush != FlushType.Finish) + { + // workitem 8557 + // + // Not sure why this needs to be an error. pendingCount == 0, which + // means there's nothing to deflate. And the caller has not asked + // for a FlushType.Finish, but... that seems very non-fatal. We + // can just say "OK" and do nothing. + + // _codec.Message = z_errmsg[ZlibConstants.Z_NEED_DICT - (ZlibConstants.Z_BUF_ERROR)]; + // throw new ZlibException("AvailableBytesIn == 0 && flush<=old_flush && flush != FlushType.Finish"); + + return ZlibConstants.Z_OK; + } + + // User must not provide more input after the first FINISH: + if (status == FINISH_STATE && _codec.AvailableBytesIn != 0) + { + _codec.Message = _ErrorMessage[ZlibConstants.Z_NEED_DICT - (ZlibConstants.Z_BUF_ERROR)]; + throw new ZlibException("status == FINISH_STATE && _codec.AvailableBytesIn != 0"); + } + + // Start a new block or continue the current one. + if (_codec.AvailableBytesIn != 0 || lookahead != 0 || (flush != FlushType.None && status != FINISH_STATE)) + { + BlockState bstate = DeflateFunction(flush); + + if (bstate == BlockState.FinishStarted || bstate == BlockState.FinishDone) + { + status = FINISH_STATE; + } + if (bstate == BlockState.NeedMore || bstate == BlockState.FinishStarted) + { + if (_codec.AvailableBytesOut == 0) + { + last_flush = -1; // avoid BUF_ERROR next call, see above + } + return ZlibConstants.Z_OK; + // If flush != Z_NO_FLUSH && avail_out == 0, the next call + // of deflate should use the same flush parameter to make sure + // that the flush is complete. So we don't have to output an + // empty block here, this will be done at next call. This also + // ensures that for a very small output buffer, we emit at most + // one empty block. + } + + if (bstate == BlockState.BlockDone) + { + if (flush == FlushType.Partial) + { + _tr_align(); + } + else + { + // FlushType.Full or FlushType.Sync + _tr_stored_block(0, 0, false); + // For a full flush, this empty block will be recognized + // as a special marker by inflate_sync(). + if (flush == FlushType.Full) + { + // clear hash (forget the history) + for (int i = 0; i < hash_size; i++) + head[i] = 0; + } + } + _codec.flush_pending(); + if (_codec.AvailableBytesOut == 0) + { + last_flush = -1; // avoid BUF_ERROR at next call, see above + return ZlibConstants.Z_OK; + } + } + } + + if (flush != FlushType.Finish) + return ZlibConstants.Z_OK; + + if (!WantRfc1950HeaderBytes || Rfc1950BytesEmitted) + return ZlibConstants.Z_STREAM_END; + + // Write the zlib trailer (adler32) + pending[pendingCount++] = (byte)((_codec._Adler32 & 0xFF000000) >> 24); + pending[pendingCount++] = (byte)((_codec._Adler32 & 0x00FF0000) >> 16); + pending[pendingCount++] = (byte)((_codec._Adler32 & 0x0000FF00) >> 8); + pending[pendingCount++] = (byte)(_codec._Adler32 & 0x000000FF); + //putShortMSB((int)(SharedUtils.URShift(_codec._Adler32, 16))); + //putShortMSB((int)(_codec._Adler32 & 0xffff)); + + _codec.flush_pending(); + + // If avail_out is zero, the application will call deflate again + // to flush the rest. + + Rfc1950BytesEmitted = true; // write the trailer only once! + + return pendingCount != 0 ? ZlibConstants.Z_OK : ZlibConstants.Z_STREAM_END; + } + + } +} \ No newline at end of file diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/DeflateStream.cs b/ROMVault2/SupportedFiles/Zip/ZLib/DeflateStream.cs new file mode 100644 index 0000000..4e5557c --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/DeflateStream.cs @@ -0,0 +1,740 @@ +// DeflateStream.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009-2010 Dino Chiesa. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// last saved (in emacs): +// Time-stamp: <2011-July-31 14:48:11> +// +// ------------------------------------------------------------------ +// +// This module defines the DeflateStream class, which can be used as a replacement for +// the System.IO.Compression.DeflateStream class in the .NET BCL. +// +// ------------------------------------------------------------------ + + +using System; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + /// + /// A class for compressing and decompressing streams using the Deflate algorithm. + /// + /// + /// + /// + /// + /// The DeflateStream is a Decorator on a . It adds DEFLATE compression or decompression to any + /// stream. + /// + /// + /// + /// Using this stream, applications can compress or decompress data via stream + /// Read and Write operations. Either compresssion or decompression + /// can occur through either reading or writing. The compression format used is + /// DEFLATE, which is documented in IETF RFC 1951, "DEFLATE + /// Compressed Data Format Specification version 1.3.". + /// + /// + /// + /// This class is similar to , except that + /// ZlibStream adds the RFC + /// 1950 - ZLIB framing bytes to a compressed stream when compressing, or + /// expects the RFC1950 framing bytes when decompressing. The DeflateStream + /// does not. + /// + /// + /// + /// + /// + /// + public class DeflateStream : System.IO.Stream + { + internal ZlibBaseStream _baseStream; + internal System.IO.Stream _innerStream; + bool _disposed; + + /// + /// Create a DeflateStream using the specified CompressionMode. + /// + /// + /// + /// When mode is CompressionMode.Compress, the DeflateStream will use + /// the default compression level. The "captive" stream will be closed when + /// the DeflateStream is closed. + /// + /// + /// + /// This example uses a DeflateStream to compress data from a file, and writes + /// the compressed data to another file. + /// + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (var raw = System.IO.File.Create(fileToCompress + ".deflated")) + /// { + /// using (Stream compressor = new DeflateStream(raw, CompressionMode.Compress)) + /// { + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n; + /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + /// { + /// compressor.Write(buffer, 0, n); + /// } + /// } + /// } + /// } + /// + /// + /// + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using raw As FileStream = File.Create(fileToCompress & ".deflated") + /// Using compressor As Stream = New DeflateStream(raw, CompressionMode.Compress) + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// End Using + /// + /// + /// The stream which will be read or written. + /// Indicates whether the DeflateStream will compress or decompress. + public DeflateStream(System.IO.Stream stream, CompressionMode mode) + : this(stream, mode, CompressionLevel.Default, false) + { + } + + /// + /// Create a DeflateStream using the specified CompressionMode and the specified CompressionLevel. + /// + /// + /// + /// + /// + /// When mode is CompressionMode.Decompress, the level parameter is + /// ignored. The "captive" stream will be closed when the DeflateStream is + /// closed. + /// + /// + /// + /// + /// + /// + /// This example uses a DeflateStream to compress data from a file, and writes + /// the compressed data to another file. + /// + /// + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (var raw = System.IO.File.Create(fileToCompress + ".deflated")) + /// { + /// using (Stream compressor = new DeflateStream(raw, + /// CompressionMode.Compress, + /// CompressionLevel.BestCompression)) + /// { + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n= -1; + /// while (n != 0) + /// { + /// if (n > 0) + /// compressor.Write(buffer, 0, n); + /// n= input.Read(buffer, 0, buffer.Length); + /// } + /// } + /// } + /// } + /// + /// + /// + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using raw As FileStream = File.Create(fileToCompress & ".deflated") + /// Using compressor As Stream = New DeflateStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// End Using + /// + /// + /// The stream to be read or written while deflating or inflating. + /// Indicates whether the DeflateStream will compress or decompress. + /// A tuning knob to trade speed for effectiveness. + public DeflateStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level) + : this(stream, mode, level, false) + { + } + + /// + /// Create a DeflateStream using the specified + /// CompressionMode, and explicitly specify whether the + /// stream should be left open after Deflation or Inflation. + /// + /// + /// + /// + /// + /// This constructor allows the application to request that the captive stream + /// remain open after the deflation or inflation occurs. By default, after + /// Close() is called on the stream, the captive stream is also + /// closed. In some cases this is not desired, for example if the stream is a + /// memory stream that will be re-read after compression. Specify true for + /// the parameter to leave the stream open. + /// + /// + /// + /// The DeflateStream will use the default compression level. + /// + /// + /// + /// See the other overloads of this constructor for example code. + /// + /// + /// + /// + /// The stream which will be read or written. This is called the + /// "captive" stream in other places in this documentation. + /// + /// + /// + /// Indicates whether the DeflateStream will compress or decompress. + /// + /// + /// true if the application would like the stream to + /// remain open after inflation/deflation. + public DeflateStream(System.IO.Stream stream, CompressionMode mode, bool leaveOpen) + : this(stream, mode, CompressionLevel.Default, leaveOpen) + { + } + + /// + /// Create a DeflateStream using the specified CompressionMode + /// and the specified CompressionLevel, and explicitly specify whether + /// the stream should be left open after Deflation or Inflation. + /// + /// + /// + /// + /// + /// When mode is CompressionMode.Decompress, the level parameter is ignored. + /// + /// + /// + /// This constructor allows the application to request that the captive stream + /// remain open after the deflation or inflation occurs. By default, after + /// Close() is called on the stream, the captive stream is also + /// closed. In some cases this is not desired, for example if the stream is a + /// that will be re-read after + /// compression. Specify true for the parameter + /// to leave the stream open. + /// + /// + /// + /// + /// + /// + /// This example shows how to use a DeflateStream to compress data from + /// a file, and store the compressed data into another file. + /// + /// + /// using (var output = System.IO.File.Create(fileToCompress + ".deflated")) + /// { + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (Stream compressor = new DeflateStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, true)) + /// { + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n= -1; + /// while (n != 0) + /// { + /// if (n > 0) + /// compressor.Write(buffer, 0, n); + /// n= input.Read(buffer, 0, buffer.Length); + /// } + /// } + /// } + /// // can write additional data to the output stream here + /// } + /// + /// + /// + /// Using output As FileStream = File.Create(fileToCompress & ".deflated") + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using compressor As Stream = New DeflateStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, True) + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// ' can write additional data to the output stream here. + /// End Using + /// + /// + /// The stream which will be read or written. + /// Indicates whether the DeflateStream will compress or decompress. + /// true if the application would like the stream to remain open after inflation/deflation. + /// A tuning knob to trade speed for effectiveness. + public DeflateStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level, bool leaveOpen) + { + _innerStream = stream; + _baseStream = new ZlibBaseStream(stream, mode, level, ZlibStreamFlavor.DEFLATE, leaveOpen); + } + + #region Zlib properties + + /// + /// This property sets the flush behavior on the stream. + /// + /// See the ZLIB documentation for the meaning of the flush behavior. + /// + virtual public FlushType FlushMode + { + get { return (this._baseStream._flushMode); } + set + { + if (_disposed) throw new ObjectDisposedException("DeflateStream"); + this._baseStream._flushMode = value; + } + } + + /// + /// The size of the working buffer for the compression codec. + /// + /// + /// + /// + /// The working buffer is used for all stream operations. The default size is + /// 1024 bytes. The minimum size is 128 bytes. You may get better performance + /// with a larger buffer. Then again, you might not. You would have to test + /// it. + /// + /// + /// + /// Set this before the first call to Read() or Write() on the + /// stream. If you try to set it afterwards, it will throw. + /// + /// + public int BufferSize + { + get + { + return this._baseStream._bufferSize; + } + set + { + if (_disposed) throw new ObjectDisposedException("DeflateStream"); + if (this._baseStream._workingBuffer != null) + throw new ZlibException("The working buffer is already set."); + if (value < ZlibConstants.WorkingBufferSizeMin) + throw new ZlibException(String.Format("Don't be silly. {0} bytes?? Use a bigger buffer, at least {1}.", value, ZlibConstants.WorkingBufferSizeMin)); + this._baseStream._bufferSize = value; + } + } + + /// + /// The ZLIB strategy to be used during compression. + /// + /// + /// + /// By tweaking this parameter, you may be able to optimize the compression for + /// data with particular characteristics. + /// + public CompressionStrategy Strategy + { + get + { + return this._baseStream.Strategy; + } + set + { + if (_disposed) throw new ObjectDisposedException("DeflateStream"); + this._baseStream.Strategy = value; + } + } + + /// Returns the total number of bytes input so far. + virtual public long TotalIn + { + get + { + return this._baseStream._z.TotalBytesIn; + } + } + + /// Returns the total number of bytes output so far. + virtual public long TotalOut + { + get + { + return this._baseStream._z.TotalBytesOut; + } + } + + #endregion + + #region System.IO.Stream methods + /// + /// Dispose the stream. + /// + /// + /// + /// This may or may not result in a Close() call on the captive + /// stream. See the constructors that have a leaveOpen parameter + /// for more information. + /// + /// + /// Application code won't call this code directly. This method may be + /// invoked in two distinct scenarios. If disposing == true, the method + /// has been called directly or indirectly by a user's code, for example + /// via the public Dispose() method. In this case, both managed and + /// unmanaged resources can be referenced and disposed. If disposing == + /// false, the method has been called by the runtime from inside the + /// object finalizer and this method should not reference other objects; + /// in that case only unmanaged resources must be referenced or + /// disposed. + /// + /// + /// + /// true if the Dispose method was invoked by user code. + /// + protected override void Dispose(bool disposing) + { + try + { + if (!_disposed) + { + if (disposing && (this._baseStream != null)) + this._baseStream.Close(); + _disposed = true; + } + } + finally + { + base.Dispose(disposing); + } + } + + + + /// + /// Indicates whether the stream can be read. + /// + /// + /// The return value depends on whether the captive stream supports reading. + /// + public override bool CanRead + { + get + { + if (_disposed) throw new ObjectDisposedException("DeflateStream"); + return _baseStream._stream.CanRead; + } + } + + /// + /// Indicates whether the stream supports Seek operations. + /// + /// + /// Always returns false. + /// + public override bool CanSeek + { + get { return false; } + } + + + /// + /// Indicates whether the stream can be written. + /// + /// + /// The return value depends on whether the captive stream supports writing. + /// + public override bool CanWrite + { + get + { + if (_disposed) throw new ObjectDisposedException("DeflateStream"); + return _baseStream._stream.CanWrite; + } + } + + /// + /// Flush the stream. + /// + public override void Flush() + { + if (_disposed) throw new ObjectDisposedException("DeflateStream"); + _baseStream.Flush(); + } + + /// + /// Reading this property always throws a . + /// + public override long Length + { + get { throw new NotImplementedException(); } + } + + /// + /// The position of the stream pointer. + /// + /// + /// + /// Setting this property always throws a . Reading will return the total bytes + /// written out, if used in writing, or the total bytes read in, if used in + /// reading. The count may refer to compressed bytes or uncompressed bytes, + /// depending on how you've used the stream. + /// + public override long Position + { + get + { + if (this._baseStream._streamMode == ZlibBaseStream.StreamMode.Writer) + return this._baseStream._z.TotalBytesOut; + if (this._baseStream._streamMode == ZlibBaseStream.StreamMode.Reader) + return this._baseStream._z.TotalBytesIn; + return 0; + } + set { throw new NotImplementedException(); } + } + + /// + /// Read data from the stream. + /// + /// + /// + /// + /// If you wish to use the DeflateStream to compress data while + /// reading, you can create a DeflateStream with + /// CompressionMode.Compress, providing an uncompressed data stream. + /// Then call Read() on that DeflateStream, and the data read will be + /// compressed as you read. If you wish to use the DeflateStream to + /// decompress data while reading, you can create a DeflateStream with + /// CompressionMode.Decompress, providing a readable compressed data + /// stream. Then call Read() on that DeflateStream, and the data read + /// will be decompressed as you read. + /// + /// + /// + /// A DeflateStream can be used for Read() or Write(), but not both. + /// + /// + /// + /// The buffer into which the read data should be placed. + /// the offset within that data array to put the first byte read. + /// the number of bytes to read. + /// the number of bytes actually read + public override int Read(byte[] buffer, int offset, int count) + { + if (_disposed) throw new ObjectDisposedException("DeflateStream"); + return _baseStream.Read(buffer, offset, count); + } + + + /// + /// Calling this method always throws a . + /// + /// this is irrelevant, since it will always throw! + /// this is irrelevant, since it will always throw! + /// irrelevant! + public override long Seek(long offset, System.IO.SeekOrigin origin) + { + throw new NotImplementedException(); + } + + /// + /// Calling this method always throws a . + /// + /// this is irrelevant, since it will always throw! + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + /// + /// Write data to the stream. + /// + /// + /// + /// + /// If you wish to use the DeflateStream to compress data while + /// writing, you can create a DeflateStream with + /// CompressionMode.Compress, and a writable output stream. Then call + /// Write() on that DeflateStream, providing uncompressed data + /// as input. The data sent to the output stream will be the compressed form + /// of the data written. If you wish to use the DeflateStream to + /// decompress data while writing, you can create a DeflateStream with + /// CompressionMode.Decompress, and a writable output stream. Then + /// call Write() on that stream, providing previously compressed + /// data. The data sent to the output stream will be the decompressed form of + /// the data written. + /// + /// + /// + /// A DeflateStream can be used for Read() or Write(), + /// but not both. + /// + /// + /// + /// + /// The buffer holding data to write to the stream. + /// the offset within that data array to find the first byte to write. + /// the number of bytes to write. + public override void Write(byte[] buffer, int offset, int count) + { + if (_disposed) throw new ObjectDisposedException("DeflateStream"); + _baseStream.Write(buffer, offset, count); + } + #endregion + + + + + /// + /// Compress a string into a byte array using DEFLATE (RFC 1951). + /// + /// + /// + /// Uncompress it with . + /// + /// + /// DeflateStream.UncompressString(byte[]) + /// DeflateStream.CompressBuffer(byte[]) + /// GZipStream.CompressString(string) + /// ZlibStream.CompressString(string) + /// + /// + /// A string to compress. The string will first be encoded + /// using UTF8, then compressed. + /// + /// + /// The string in compressed form + public static byte[] CompressString(String s) + { + using (var ms = new System.IO.MemoryStream()) + { + System.IO.Stream compressor = + new DeflateStream(ms, CompressionMode.Compress, CompressionLevel.BestCompression); + ZlibBaseStream.CompressString(s, compressor); + return ms.ToArray(); + } + } + + + /// + /// Compress a byte array into a new byte array using DEFLATE. + /// + /// + /// + /// Uncompress it with . + /// + /// + /// DeflateStream.CompressString(string) + /// DeflateStream.UncompressBuffer(byte[]) + /// GZipStream.CompressBuffer(byte[]) + /// ZlibStream.CompressBuffer(byte[]) + /// + /// + /// A buffer to compress. + /// + /// + /// The data in compressed form + public static byte[] CompressBuffer(byte[] b) + { + using (var ms = new System.IO.MemoryStream()) + { + System.IO.Stream compressor = + new DeflateStream( ms, CompressionMode.Compress, CompressionLevel.BestCompression ); + + ZlibBaseStream.CompressBuffer(b, compressor); + return ms.ToArray(); + } + } + + + /// + /// Uncompress a DEFLATE'd byte array into a single string. + /// + /// + /// DeflateStream.CompressString(String) + /// DeflateStream.UncompressBuffer(byte[]) + /// GZipStream.UncompressString(byte[]) + /// ZlibStream.UncompressString(byte[]) + /// + /// + /// A buffer containing DEFLATE-compressed data. + /// + /// + /// The uncompressed string + public static String UncompressString(byte[] compressed) + { + using (var input = new System.IO.MemoryStream(compressed)) + { + System.IO.Stream decompressor = + new DeflateStream(input, CompressionMode.Decompress); + + return ZlibBaseStream.UncompressString(compressed, decompressor); + } + } + + + /// + /// Uncompress a DEFLATE'd byte array into a byte array. + /// + /// + /// DeflateStream.CompressBuffer(byte[]) + /// DeflateStream.UncompressString(byte[]) + /// GZipStream.UncompressBuffer(byte[]) + /// ZlibStream.UncompressBuffer(byte[]) + /// + /// + /// A buffer containing data that has been compressed with DEFLATE. + /// + /// + /// The data in uncompressed form + public static byte[] UncompressBuffer(byte[] compressed) + { + using (var input = new System.IO.MemoryStream(compressed)) + { + System.IO.Stream decompressor = + new DeflateStream( input, CompressionMode.Decompress ); + + return ZlibBaseStream.UncompressBuffer(compressed, decompressor); + } + } + + } + +} + diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/GZipStream.cs b/ROMVault2/SupportedFiles/Zip/ZLib/GZipStream.cs new file mode 100644 index 0000000..9ed7d5e --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/GZipStream.cs @@ -0,0 +1,1033 @@ +// GZipStream.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// last saved (in emacs): +// Time-stamp: <2011-August-08 18:14:39> +// +// ------------------------------------------------------------------ +// +// This module defines the GZipStream class, which can be used as a replacement for +// the System.IO.Compression.GZipStream class in the .NET BCL. NB: The design is not +// completely OO clean: there is some intelligence in the ZlibBaseStream that reads the +// GZip header. +// +// ------------------------------------------------------------------ + + +using System; +using System.IO; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + /// + /// A class for compressing and decompressing GZIP streams. + /// + /// + /// + /// + /// The GZipStream is a Decorator on a + /// . It adds GZIP compression or decompression to any + /// stream. + /// + /// + /// + /// Like the System.IO.Compression.GZipStream in the .NET Base Class Library, the + /// Ionic.Zlib.GZipStream can compress while writing, or decompress while + /// reading, but not vice versa. The compression method used is GZIP, which is + /// documented in IETF RFC + /// 1952, "GZIP file format specification version 4.3". + /// + /// + /// A GZipStream can be used to decompress data (through Read()) or + /// to compress data (through Write()), but not both. + /// + /// + /// + /// If you wish to use the GZipStream to compress data, you must wrap it + /// around a write-able stream. As you call Write() on the GZipStream, the + /// data will be compressed into the GZIP format. If you want to decompress data, + /// you must wrap the GZipStream around a readable stream that contains an + /// IETF RFC 1952-compliant stream. The data will be decompressed as you call + /// Read() on the GZipStream. + /// + /// + /// + /// Though the GZIP format allows data from multiple files to be concatenated + /// together, this stream handles only a single segment of GZIP format, typically + /// representing a single file. + /// + /// + /// + /// This class is similar to and . + /// ZlibStream handles RFC1950-compliant streams. + /// handles RFC1951-compliant streams. This class handles RFC1952-compliant streams. + /// + /// + /// + /// + /// + /// + public class GZipStream : System.IO.Stream + { + // GZip format + // source: http://tools.ietf.org/html/rfc1952 + // + // header id: 2 bytes 1F 8B + // compress method 1 byte 8= DEFLATE (none other supported) + // flag 1 byte bitfield (See below) + // mtime 4 bytes time_t (seconds since jan 1, 1970 UTC of the file. + // xflg 1 byte 2 = max compress used , 4 = max speed (can be ignored) + // OS 1 byte OS for originating archive. set to 0xFF in compression. + // extra field length 2 bytes optional - only if FEXTRA is set. + // extra field varies + // filename varies optional - if FNAME is set. zero terminated. ISO-8859-1. + // file comment varies optional - if FCOMMENT is set. zero terminated. ISO-8859-1. + // crc16 1 byte optional - present only if FHCRC bit is set + // compressed data varies + // CRC32 4 bytes + // isize 4 bytes data size modulo 2^32 + // + // FLG (FLaGs) + // bit 0 FTEXT - indicates file is ASCII text (can be safely ignored) + // bit 1 FHCRC - there is a CRC16 for the header immediately following the header + // bit 2 FEXTRA - extra fields are present + // bit 3 FNAME - the zero-terminated filename is present. encoding; ISO-8859-1. + // bit 4 FCOMMENT - a zero-terminated file comment is present. encoding: ISO-8859-1 + // bit 5 reserved + // bit 6 reserved + // bit 7 reserved + // + // On consumption: + // Extra field is a bunch of nonsense and can be safely ignored. + // Header CRC and OS, likewise. + // + // on generation: + // all optional fields get 0, except for the OS, which gets 255. + // + + + + /// + /// The comment on the GZIP stream. + /// + /// + /// + /// + /// The GZIP format allows for each file to optionally have an associated + /// comment stored with the file. The comment is encoded with the ISO-8859-1 + /// code page. To include a comment in a GZIP stream you create, set this + /// property before calling Write() for the first time on the + /// GZipStream. + /// + /// + /// + /// When using GZipStream to decompress, you can retrieve this property + /// after the first call to Read(). If no comment has been set in the + /// GZIP bytestream, the Comment property will return null + /// (Nothing in VB). + /// + /// + public String Comment + { + get + { + return _Comment; + } + set + { + if (_disposed) throw new ObjectDisposedException("GZipStream"); + _Comment = value; + } + } + + /// + /// The FileName for the GZIP stream. + /// + /// + /// + /// + /// + /// The GZIP format optionally allows each file to have an associated + /// filename. When compressing data (through Write()), set this + /// FileName before calling Write() the first time on the GZipStream. + /// The actual filename is encoded into the GZIP bytestream with the + /// ISO-8859-1 code page, according to RFC 1952. It is the application's + /// responsibility to insure that the FileName can be encoded and decoded + /// correctly with this code page. + /// + /// + /// + /// When decompressing (through Read()), you can retrieve this value + /// any time after the first Read(). In the case where there was no filename + /// encoded into the GZIP bytestream, the property will return null (Nothing + /// in VB). + /// + /// + public String FileName + { + get { return _FileName; } + set + { + if (_disposed) throw new ObjectDisposedException("GZipStream"); + _FileName = value; + if (_FileName == null) return; + if (_FileName.IndexOf("/") != -1) + { + _FileName = _FileName.Replace("/", "\\"); + } + if (_FileName.EndsWith("\\")) + throw new Exception("Illegal filename"); + if (_FileName.IndexOf("\\") != -1) + { + // trim any leading path + _FileName = Path.GetFileName(_FileName); + } + } + } + + /// + /// The last modified time for the GZIP stream. + /// + /// + /// + /// GZIP allows the storage of a last modified time with each GZIP entry. + /// When compressing data, you can set this before the first call to + /// Write(). When decompressing, you can retrieve this value any time + /// after the first call to Read(). + /// + public DateTime? LastModified; + + /// + /// The CRC on the GZIP stream. + /// + /// + /// This is used for internal error checking. You probably don't need to look at this property. + /// + public int Crc32 { get { return _Crc32; } } + + private int _headerByteCount; + internal ZlibBaseStream _baseStream; + bool _disposed; + bool _firstReadDone; + string _FileName; + string _Comment; + int _Crc32; + + + /// + /// Create a GZipStream using the specified CompressionMode. + /// + /// + /// + /// + /// When mode is CompressionMode.Compress, the GZipStream will use the + /// default compression level. + /// + /// + /// + /// As noted in the class documentation, the CompressionMode (Compress + /// or Decompress) also establishes the "direction" of the stream. A + /// GZipStream with CompressionMode.Compress works only through + /// Write(). A GZipStream with + /// CompressionMode.Decompress works only through Read(). + /// + /// + /// + /// + /// + /// This example shows how to use a GZipStream to compress data. + /// + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (var raw = System.IO.File.Create(outputFile)) + /// { + /// using (Stream compressor = new GZipStream(raw, CompressionMode.Compress)) + /// { + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n; + /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + /// { + /// compressor.Write(buffer, 0, n); + /// } + /// } + /// } + /// } + /// + /// + /// Dim outputFile As String = (fileToCompress & ".compressed") + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using raw As FileStream = File.Create(outputFile) + /// Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress) + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// End Using + /// + /// + /// + /// + /// This example shows how to use a GZipStream to uncompress a file. + /// + /// private void GunZipFile(string filename) + /// { + /// if (!filename.EndsWith(".gz)) + /// throw new ArgumentException("filename"); + /// var DecompressedFile = filename.Substring(0,filename.Length-3); + /// byte[] working = new byte[WORKING_BUFFER_SIZE]; + /// int n= 1; + /// using (System.IO.Stream input = System.IO.File.OpenRead(filename)) + /// { + /// using (Stream decompressor= new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, true)) + /// { + /// using (var output = System.IO.File.Create(DecompressedFile)) + /// { + /// while (n !=0) + /// { + /// n= decompressor.Read(working, 0, working.Length); + /// if (n > 0) + /// { + /// output.Write(working, 0, n); + /// } + /// } + /// } + /// } + /// } + /// } + /// + /// + /// + /// Private Sub GunZipFile(ByVal filename as String) + /// If Not (filename.EndsWith(".gz)) Then + /// Throw New ArgumentException("filename") + /// End If + /// Dim DecompressedFile as String = filename.Substring(0,filename.Length-3) + /// Dim working(WORKING_BUFFER_SIZE) as Byte + /// Dim n As Integer = 1 + /// Using input As Stream = File.OpenRead(filename) + /// Using decompressor As Stream = new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, True) + /// Using output As Stream = File.Create(UncompressedFile) + /// Do + /// n= decompressor.Read(working, 0, working.Length) + /// If n > 0 Then + /// output.Write(working, 0, n) + /// End IF + /// Loop While (n > 0) + /// End Using + /// End Using + /// End Using + /// End Sub + /// + /// + /// + /// The stream which will be read or written. + /// Indicates whether the GZipStream will compress or decompress. + public GZipStream(Stream stream, CompressionMode mode) + : this(stream, mode, CompressionLevel.Default, false) + { + } + + /// + /// Create a GZipStream using the specified CompressionMode and + /// the specified CompressionLevel. + /// + /// + /// + /// + /// The CompressionMode (Compress or Decompress) also establishes the + /// "direction" of the stream. A GZipStream with + /// CompressionMode.Compress works only through Write(). A + /// GZipStream with CompressionMode.Decompress works only + /// through Read(). + /// + /// + /// + /// + /// + /// + /// This example shows how to use a GZipStream to compress a file into a .gz file. + /// + /// + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (var raw = System.IO.File.Create(fileToCompress + ".gz")) + /// { + /// using (Stream compressor = new GZipStream(raw, + /// CompressionMode.Compress, + /// CompressionLevel.BestCompression)) + /// { + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n; + /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + /// { + /// compressor.Write(buffer, 0, n); + /// } + /// } + /// } + /// } + /// + /// + /// + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using raw As FileStream = File.Create(fileToCompress & ".gz") + /// Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// End Using + /// + /// + /// The stream to be read or written while deflating or inflating. + /// Indicates whether the GZipStream will compress or decompress. + /// A tuning knob to trade speed for effectiveness. + public GZipStream(Stream stream, CompressionMode mode, CompressionLevel level) + : this(stream, mode, level, false) + { + } + + /// + /// Create a GZipStream using the specified CompressionMode, and + /// explicitly specify whether the stream should be left open after Deflation + /// or Inflation. + /// + /// + /// + /// + /// This constructor allows the application to request that the captive stream + /// remain open after the deflation or inflation occurs. By default, after + /// Close() is called on the stream, the captive stream is also + /// closed. In some cases this is not desired, for example if the stream is a + /// memory stream that will be re-read after compressed data has been written + /// to it. Specify true for the parameter to leave + /// the stream open. + /// + /// + /// + /// The (Compress or Decompress) also + /// establishes the "direction" of the stream. A GZipStream with + /// CompressionMode.Compress works only through Write(). A GZipStream + /// with CompressionMode.Decompress works only through Read(). + /// + /// + /// + /// The GZipStream will use the default compression level. If you want + /// to specify the compression level, see . + /// + /// + /// + /// See the other overloads of this constructor for example code. + /// + /// + /// + /// + /// + /// The stream which will be read or written. This is called the "captive" + /// stream in other places in this documentation. + /// + /// + /// Indicates whether the GZipStream will compress or decompress. + /// + /// + /// + /// true if the application would like the base stream to remain open after + /// inflation/deflation. + /// + public GZipStream(Stream stream, CompressionMode mode, bool leaveOpen) + : this(stream, mode, CompressionLevel.Default, leaveOpen) + { + } + + /// + /// Create a GZipStream using the specified CompressionMode and the + /// specified CompressionLevel, and explicitly specify whether the + /// stream should be left open after Deflation or Inflation. + /// + /// + /// + /// + /// + /// This constructor allows the application to request that the captive stream + /// remain open after the deflation or inflation occurs. By default, after + /// Close() is called on the stream, the captive stream is also + /// closed. In some cases this is not desired, for example if the stream is a + /// memory stream that will be re-read after compressed data has been written + /// to it. Specify true for the parameter to + /// leave the stream open. + /// + /// + /// + /// As noted in the class documentation, the CompressionMode (Compress + /// or Decompress) also establishes the "direction" of the stream. A + /// GZipStream with CompressionMode.Compress works only through + /// Write(). A GZipStream with CompressionMode.Decompress works only + /// through Read(). + /// + /// + /// + /// + /// + /// This example shows how to use a GZipStream to compress data. + /// + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (var raw = System.IO.File.Create(outputFile)) + /// { + /// using (Stream compressor = new GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression, true)) + /// { + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n; + /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + /// { + /// compressor.Write(buffer, 0, n); + /// } + /// } + /// } + /// } + /// + /// + /// Dim outputFile As String = (fileToCompress & ".compressed") + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using raw As FileStream = File.Create(outputFile) + /// Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression, True) + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// End Using + /// + /// + /// The stream which will be read or written. + /// Indicates whether the GZipStream will compress or decompress. + /// true if the application would like the stream to remain open after inflation/deflation. + /// A tuning knob to trade speed for effectiveness. + public GZipStream(Stream stream, CompressionMode mode, CompressionLevel level, bool leaveOpen) + { + _baseStream = new ZlibBaseStream(stream, mode, level, ZlibStreamFlavor.GZIP, leaveOpen); + } + + #region Zlib properties + + /// + /// This property sets the flush behavior on the stream. + /// + virtual public FlushType FlushMode + { + get { return (this._baseStream._flushMode); } + set { + if (_disposed) throw new ObjectDisposedException("GZipStream"); + this._baseStream._flushMode = value; + } + } + + /// + /// The size of the working buffer for the compression codec. + /// + /// + /// + /// + /// The working buffer is used for all stream operations. The default size is + /// 1024 bytes. The minimum size is 128 bytes. You may get better performance + /// with a larger buffer. Then again, you might not. You would have to test + /// it. + /// + /// + /// + /// Set this before the first call to Read() or Write() on the + /// stream. If you try to set it afterwards, it will throw. + /// + /// + public int BufferSize + { + get + { + return this._baseStream._bufferSize; + } + set + { + if (_disposed) throw new ObjectDisposedException("GZipStream"); + if (this._baseStream._workingBuffer != null) + throw new ZlibException("The working buffer is already set."); + if (value < ZlibConstants.WorkingBufferSizeMin) + throw new ZlibException(String.Format("Don't be silly. {0} bytes?? Use a bigger buffer, at least {1}.", value, ZlibConstants.WorkingBufferSizeMin)); + this._baseStream._bufferSize = value; + } + } + + + /// Returns the total number of bytes input so far. + virtual public long TotalIn + { + get + { + return this._baseStream._z.TotalBytesIn; + } + } + + /// Returns the total number of bytes output so far. + virtual public long TotalOut + { + get + { + return this._baseStream._z.TotalBytesOut; + } + } + + #endregion + + #region Stream methods + + /// + /// Dispose the stream. + /// + /// + /// + /// This may or may not result in a Close() call on the captive + /// stream. See the constructors that have a leaveOpen parameter + /// for more information. + /// + /// + /// This method may be invoked in two distinct scenarios. If disposing + /// == true, the method has been called directly or indirectly by a + /// user's code, for example via the public Dispose() method. In this + /// case, both managed and unmanaged resources can be referenced and + /// disposed. If disposing == false, the method has been called by the + /// runtime from inside the object finalizer and this method should not + /// reference other objects; in that case only unmanaged resources must + /// be referenced or disposed. + /// + /// + /// + /// indicates whether the Dispose method was invoked by user code. + /// + protected override void Dispose(bool disposing) + { + try + { + if (!_disposed) + { + if (disposing && (this._baseStream != null)) + { + this._baseStream.Close(); + this._Crc32 = _baseStream.Crc32; + } + _disposed = true; + } + } + finally + { + base.Dispose(disposing); + } + } + + + /// + /// Indicates whether the stream can be read. + /// + /// + /// The return value depends on whether the captive stream supports reading. + /// + public override bool CanRead + { + get + { + if (_disposed) throw new ObjectDisposedException("GZipStream"); + return _baseStream._stream.CanRead; + } + } + + /// + /// Indicates whether the stream supports Seek operations. + /// + /// + /// Always returns false. + /// + public override bool CanSeek + { + get { return false; } + } + + + /// + /// Indicates whether the stream can be written. + /// + /// + /// The return value depends on whether the captive stream supports writing. + /// + public override bool CanWrite + { + get + { + if (_disposed) throw new ObjectDisposedException("GZipStream"); + return _baseStream._stream.CanWrite; + } + } + + /// + /// Flush the stream. + /// + public override void Flush() + { + if (_disposed) throw new ObjectDisposedException("GZipStream"); + _baseStream.Flush(); + } + + /// + /// Reading this property always throws a . + /// + public override long Length + { + get { throw new NotImplementedException(); } + } + + /// + /// The position of the stream pointer. + /// + /// + /// + /// Setting this property always throws a . Reading will return the total bytes + /// written out, if used in writing, or the total bytes read in, if used in + /// reading. The count may refer to compressed bytes or uncompressed bytes, + /// depending on how you've used the stream. + /// + public override long Position + { + get + { + if (this._baseStream._streamMode == ZlibBaseStream.StreamMode.Writer) + return this._baseStream._z.TotalBytesOut + _headerByteCount; + if (this._baseStream._streamMode == ZlibBaseStream.StreamMode.Reader) + return this._baseStream._z.TotalBytesIn + this._baseStream._gzipHeaderByteCount; + return 0; + } + + set { throw new NotImplementedException(); } + } + + /// + /// Read and decompress data from the source stream. + /// + /// + /// + /// With a GZipStream, decompression is done through reading. + /// + /// + /// + /// + /// byte[] working = new byte[WORKING_BUFFER_SIZE]; + /// using (System.IO.Stream input = System.IO.File.OpenRead(_CompressedFile)) + /// { + /// using (Stream decompressor= new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, true)) + /// { + /// using (var output = System.IO.File.Create(_DecompressedFile)) + /// { + /// int n; + /// while ((n= decompressor.Read(working, 0, working.Length)) !=0) + /// { + /// output.Write(working, 0, n); + /// } + /// } + /// } + /// } + /// + /// + /// The buffer into which the decompressed data should be placed. + /// the offset within that data array to put the first byte read. + /// the number of bytes to read. + /// the number of bytes actually read + public override int Read(byte[] buffer, int offset, int count) + { + if (_disposed) throw new ObjectDisposedException("GZipStream"); + int n = _baseStream.Read(buffer, offset, count); + + // Console.WriteLine("GZipStream::Read(buffer, off({0}), c({1}) = {2}", offset, count, n); + // Console.WriteLine( Util.FormatByteArray(buffer, offset, n) ); + + if (!_firstReadDone) + { + _firstReadDone = true; + FileName = _baseStream._GzipFileName; + Comment = _baseStream._GzipComment; + } + return n; + } + + + + /// + /// Calling this method always throws a . + /// + /// irrelevant; it will always throw! + /// irrelevant; it will always throw! + /// irrelevant! + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + + /// + /// Calling this method always throws a . + /// + /// irrelevant; this method will always throw! + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + /// + /// Write data to the stream. + /// + /// + /// + /// + /// If you wish to use the GZipStream to compress data while writing, + /// you can create a GZipStream with CompressionMode.Compress, and a + /// writable output stream. Then call Write() on that GZipStream, + /// providing uncompressed data as input. The data sent to the output stream + /// will be the compressed form of the data written. + /// + /// + /// + /// A GZipStream can be used for Read() or Write(), but not + /// both. Writing implies compression. Reading implies decompression. + /// + /// + /// + /// The buffer holding data to write to the stream. + /// the offset within that data array to find the first byte to write. + /// the number of bytes to write. + public override void Write(byte[] buffer, int offset, int count) + { + if (_disposed) throw new ObjectDisposedException("GZipStream"); + if (_baseStream._streamMode == ZlibBaseStream.StreamMode.Undefined) + { + //Console.WriteLine("GZipStream: First write"); + if (_baseStream._wantCompress) + { + // first write in compression, therefore, emit the GZIP header + _headerByteCount = EmitHeader(); + } + else + { + throw new InvalidOperationException(); + } + } + + _baseStream.Write(buffer, offset, count); + } + #endregion + + + internal static readonly System.DateTime _unixEpoch = new System.DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); +#if SILVERLIGHT || NETCF + internal static readonly System.Text.Encoding iso8859dash1 = new Ionic.Encoding.Iso8859Dash1Encoding(); +#else + internal static readonly System.Text.Encoding iso8859dash1 = System.Text.Encoding.GetEncoding("iso-8859-1"); +#endif + + + private int EmitHeader() + { + byte[] commentBytes = (Comment == null) ? null : iso8859dash1.GetBytes(Comment); + byte[] filenameBytes = (FileName == null) ? null : iso8859dash1.GetBytes(FileName); + + int cbLength = (Comment == null) ? 0 : commentBytes.Length + 1; + int fnLength = (FileName == null) ? 0 : filenameBytes.Length + 1; + + int bufferLength = 10 + cbLength + fnLength; + byte[] header = new byte[bufferLength]; + int i = 0; + // ID + header[i++] = 0x1F; + header[i++] = 0x8B; + + // compression method + header[i++] = 8; + byte flag = 0; + if (Comment != null) + flag ^= 0x10; + if (FileName != null) + flag ^= 0x8; + + // flag + header[i++] = flag; + + // mtime + if (!LastModified.HasValue) LastModified = DateTime.Now; + System.TimeSpan delta = LastModified.Value - _unixEpoch; + Int32 timet = (Int32)delta.TotalSeconds; + Array.Copy(BitConverter.GetBytes(timet), 0, header, i, 4); + i += 4; + + // xflg + header[i++] = 0; // this field is totally useless + // OS + header[i++] = 0xFF; // 0xFF == unspecified + + // extra field length - only if FEXTRA is set, which it is not. + //header[i++]= 0; + //header[i++]= 0; + + // filename + if (fnLength != 0) + { + Array.Copy(filenameBytes, 0, header, i, fnLength - 1); + i += fnLength - 1; + header[i++] = 0; // terminate + } + + // comment + if (cbLength != 0) + { + Array.Copy(commentBytes, 0, header, i, cbLength - 1); + i += cbLength - 1; + header[i++] = 0; // terminate + } + + _baseStream._stream.Write(header, 0, header.Length); + + return header.Length; // bytes written + } + + + + /// + /// Compress a string into a byte array using GZip. + /// + /// + /// + /// Uncompress it with . + /// + /// + /// + /// + /// + /// + /// A string to compress. The string will first be encoded + /// using UTF8, then compressed. + /// + /// + /// The string in compressed form + public static byte[] CompressString(String s) + { + using (var ms = new MemoryStream()) + { + System.IO.Stream compressor = + new GZipStream(ms, CompressionMode.Compress, CompressionLevel.BestCompression); + ZlibBaseStream.CompressString(s, compressor); + return ms.ToArray(); + } + } + + + /// + /// Compress a byte array into a new byte array using GZip. + /// + /// + /// + /// Uncompress it with . + /// + /// + /// + /// + /// + /// + /// A buffer to compress. + /// + /// + /// The data in compressed form + public static byte[] CompressBuffer(byte[] b) + { + using (var ms = new MemoryStream()) + { + System.IO.Stream compressor = + new GZipStream( ms, CompressionMode.Compress, CompressionLevel.BestCompression ); + + ZlibBaseStream.CompressBuffer(b, compressor); + return ms.ToArray(); + } + } + + + /// + /// Uncompress a GZip'ed byte array into a single string. + /// + /// + /// + /// + /// + /// + /// A buffer containing GZIP-compressed data. + /// + /// + /// The uncompressed string + public static String UncompressString(byte[] compressed) + { + using (var input = new MemoryStream(compressed)) + { + Stream decompressor = new GZipStream(input, CompressionMode.Decompress); + return ZlibBaseStream.UncompressString(compressed, decompressor); + } + } + + + /// + /// Uncompress a GZip'ed byte array into a byte array. + /// + /// + /// + /// + /// + /// + /// A buffer containing data that has been compressed with GZip. + /// + /// + /// The data in uncompressed form + public static byte[] UncompressBuffer(byte[] compressed) + { + using (var input = new System.IO.MemoryStream(compressed)) + { + System.IO.Stream decompressor = + new GZipStream( input, CompressionMode.Decompress ); + + return ZlibBaseStream.UncompressBuffer(compressed, decompressor); + } + } + + + } +} diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/InfTree.cs b/ROMVault2/SupportedFiles/Zip/ZLib/InfTree.cs new file mode 100644 index 0000000..7d8faf7 --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/InfTree.cs @@ -0,0 +1,436 @@ +// Inftree.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// last saved (in emacs): +// Time-stamp: <2009-October-28 12:43:54> +// +// ------------------------------------------------------------------ +// +// This module defines classes used in decompression. This code is derived +// from the jzlib implementation of zlib. In keeping with the license for jzlib, +// the copyright to that code is below. +// +// ------------------------------------------------------------------ +// +// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the distribution. +// +// 3. The names of the authors may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------- +// +// This program is based on zlib-1.1.3; credit to authors +// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +// and contributors of zlib. +// +// ----------------------------------------------------------------------- + + +using System; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + + sealed class InfTree + { + + private const int MANY = 1440; + + private const int Z_OK = 0; + private const int Z_STREAM_END = 1; + private const int Z_NEED_DICT = 2; + private const int Z_ERRNO = - 1; + private const int Z_STREAM_ERROR = - 2; + private const int Z_DATA_ERROR = - 3; + private const int Z_MEM_ERROR = - 4; + private const int Z_BUF_ERROR = - 5; + private const int Z_VERSION_ERROR = - 6; + + internal const int fixed_bl = 9; + internal const int fixed_bd = 5; + + //UPGRADE_NOTE: Final was removed from the declaration of 'fixed_tl'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] fixed_tl = new int[]{96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186, + 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 193, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8, + 14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255}; + //UPGRADE_NOTE: Final was removed from the declaration of 'fixed_td'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] fixed_td = new int[]{80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577}; + + // Tables for deflate from PKZIP's appnote.txt. + //UPGRADE_NOTE: Final was removed from the declaration of 'cplens'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] cplens = new int[]{3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + + // see note #13 above about 258 + //UPGRADE_NOTE: Final was removed from the declaration of 'cplext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] cplext = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; + + //UPGRADE_NOTE: Final was removed from the declaration of 'cpdist'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] cpdist = new int[]{1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; + + //UPGRADE_NOTE: Final was removed from the declaration of 'cpdext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" + internal static readonly int[] cpdext = new int[]{0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + + // If BMAX needs to be larger than 16, then h and x[] should be uLong. + internal const int BMAX = 15; // maximum bit length of any code + + internal int[] hn = null; // hufts used in space + internal int[] v = null; // work area for huft_build + internal int[] c = null; // bit length count table + internal int[] r = null; // table entry for structure assignment + internal int[] u = null; // table stack + internal int[] x = null; // bit offsets, then code stack + + private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v) + { + // Given a list of code lengths and a maximum table size, make a set of + // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR + // if the given code set is incomplete (the tables are still built in this + // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of + // lengths), or Z_MEM_ERROR if not enough memory. + + int a; // counter for codes of length k + int f; // i repeats in table every f entries + int g; // maximum code length + int h; // table level + int i; // counter, current code + int j; // counter + int k; // number of bits in current code + int l; // bits per table (returned in m) + int mask; // (1 << w) - 1, to avoid cc -O bug on HP + int p; // pointer into c[], b[], or v[] + int q; // points to current table + int w; // bits before this table == (l * h) + int xp; // pointer into x + int y; // number of dummy codes added + int z; // number of entries in current table + + // Generate counts for each bit length + + p = 0; i = n; + do + { + c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX + } + while (i != 0); + + if (c[0] == n) + { + // null input--all zero length codes + t[0] = - 1; + m[0] = 0; + return Z_OK; + } + + // Find minimum and maximum length, bound *m by those + l = m[0]; + for (j = 1; j <= BMAX; j++) + if (c[j] != 0) + break; + k = j; // minimum code length + if (l < j) + { + l = j; + } + for (i = BMAX; i != 0; i--) + { + if (c[i] != 0) + break; + } + g = i; // maximum code length + if (l > i) + { + l = i; + } + m[0] = l; + + // Adjust last length count to fill out codes, if needed + for (y = 1 << j; j < i; j++, y <<= 1) + { + if ((y -= c[j]) < 0) + { + return Z_DATA_ERROR; + } + } + if ((y -= c[i]) < 0) + { + return Z_DATA_ERROR; + } + c[i] += y; + + // Generate starting offsets into the value table for each length + x[1] = j = 0; + p = 1; xp = 2; + while (--i != 0) + { + // note that i == g from above + x[xp] = (j += c[p]); + xp++; + p++; + } + + // Make a table of values in order of bit lengths + i = 0; p = 0; + do + { + if ((j = b[bindex + p]) != 0) + { + v[x[j]++] = i; + } + p++; + } + while (++i < n); + n = x[g]; // set n to length of v + + // Generate the Huffman codes and for each, make the table entries + x[0] = i = 0; // first Huffman code is zero + p = 0; // grab values in bit order + h = - 1; // no tables yet--level -1 + w = - l; // bits decoded == (l * h) + u[0] = 0; // just to keep compilers happy + q = 0; // ditto + z = 0; // ditto + + // go through the bit lengths (k already is bits in shortest code) + for (; k <= g; k++) + { + a = c[k]; + while (a-- != 0) + { + // here i is the Huffman code of length k bits for value *p + // make tables up to required level + while (k > w + l) + { + h++; + w += l; // previous table always l bits + // compute minimum size table less than or equal to l bits + z = g - w; + z = (z > l)?l:z; // table size upper limit + if ((f = 1 << (j = k - w)) > a + 1) + { + // try a k-w bit table + // too few codes for k-w bit table + f -= (a + 1); // deduct codes from patterns left + xp = k; + if (j < z) + { + while (++j < z) + { + // try smaller tables up to z bits + if ((f <<= 1) <= c[++xp]) + break; // enough codes to use up j bits + f -= c[xp]; // else deduct codes from patterns + } + } + } + z = 1 << j; // table entries for j-bit table + + // allocate new table + if (hn[0] + z > MANY) + { + // (note: doesn't matter for fixed) + return Z_DATA_ERROR; // overflow of MANY + } + u[h] = q = hn[0]; // DEBUG + hn[0] += z; + + // connect to last table, if there is one + if (h != 0) + { + x[h] = i; // save pattern for backing up + r[0] = (sbyte) j; // bits in this table + r[1] = (sbyte) l; // bits to dump before this table + j = SharedUtils.URShift(i, (w - l)); + r[2] = (int) (q - u[h - 1] - j); // offset to this table + Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table + } + else + { + t[0] = q; // first table is returned result + } + } + + // set up table entry in r + r[1] = (sbyte) (k - w); + if (p >= n) + { + r[0] = 128 + 64; // out of values--invalid code + } + else if (v[p] < s) + { + r[0] = (sbyte) (v[p] < 256?0:32 + 64); // 256 is end-of-block + r[2] = v[p++]; // simple code is just the value + } + else + { + r[0] = (sbyte) (e[v[p] - s] + 16 + 64); // non-simple--look up in lists + r[2] = d[v[p++] - s]; + } + + // fill code-like entries with r + f = 1 << (k - w); + for (j = SharedUtils.URShift(i, w); j < z; j += f) + { + Array.Copy(r, 0, hp, (q + j) * 3, 3); + } + + // backwards increment the k-bit code i + for (j = 1 << (k - 1); (i & j) != 0; j = SharedUtils.URShift(j, 1)) + { + i ^= j; + } + i ^= j; + + // backup over finished tables + mask = (1 << w) - 1; // needed on HP, cc -O bug + while ((i & mask) != x[h]) + { + h--; // don't need to update q + w -= l; + mask = (1 << w) - 1; + } + } + } + // Return Z_BUF_ERROR if we were given an incomplete table + return y != 0 && g != 1?Z_BUF_ERROR:Z_OK; + } + + internal int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZlibCodec z) + { + int result; + initWorkArea(19); + hn[0] = 0; + result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v); + + if (result == Z_DATA_ERROR) + { + z.Message = "oversubscribed dynamic bit lengths tree"; + } + else if (result == Z_BUF_ERROR || bb[0] == 0) + { + z.Message = "incomplete dynamic bit lengths tree"; + result = Z_DATA_ERROR; + } + return result; + } + + internal int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZlibCodec z) + { + int result; + + // build literal/length tree + initWorkArea(288); + hn[0] = 0; + result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v); + if (result != Z_OK || bl[0] == 0) + { + if (result == Z_DATA_ERROR) + { + z.Message = "oversubscribed literal/length tree"; + } + else if (result != Z_MEM_ERROR) + { + z.Message = "incomplete literal/length tree"; + result = Z_DATA_ERROR; + } + return result; + } + + // build distance tree + initWorkArea(288); + result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v); + + if (result != Z_OK || (bd[0] == 0 && nl > 257)) + { + if (result == Z_DATA_ERROR) + { + z.Message = "oversubscribed distance tree"; + } + else if (result == Z_BUF_ERROR) + { + z.Message = "incomplete distance tree"; + result = Z_DATA_ERROR; + } + else if (result != Z_MEM_ERROR) + { + z.Message = "empty distance tree with lengths"; + result = Z_DATA_ERROR; + } + return result; + } + + return Z_OK; + } + + internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZlibCodec z) + { + bl[0] = fixed_bl; + bd[0] = fixed_bd; + tl[0] = fixed_tl; + td[0] = fixed_td; + return Z_OK; + } + + private void initWorkArea(int vsize) + { + if (hn == null) + { + hn = new int[1]; + v = new int[vsize]; + c = new int[BMAX + 1]; + r = new int[3]; + u = new int[BMAX]; + x = new int[BMAX + 1]; + } + else + { + if (v.Length < vsize) + { + v = new int[vsize]; + } + Array.Clear(v,0,vsize); + Array.Clear(c,0,BMAX+1); + r[0]=0; r[1]=0; r[2]=0; + // for(int i=0; i +// +// ------------------------------------------------------------------ +// +// This module defines classes for decompression. This code is derived +// from the jzlib implementation of zlib, but significantly modified. +// The object model is not the same, and many of the behaviors are +// different. Nonetheless, in keeping with the license for jzlib, I am +// reproducing the copyright to that code here. +// +// ------------------------------------------------------------------ +// +// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the distribution. +// +// 3. The names of the authors may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------- +// +// This program is based on zlib-1.1.3; credit to authors +// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +// and contributors of zlib. +// +// ----------------------------------------------------------------------- + + +using System; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + sealed class InflateBlocks + { + private const int MANY = 1440; + + // Table for deflate from PKZIP's appnote.txt. + internal static readonly int[] border = new int[] + { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; + + private enum InflateBlockMode + { + TYPE = 0, // get type bits (3, including end bit) + LENS = 1, // get lengths for stored + STORED = 2, // processing stored block + TABLE = 3, // get table lengths + BTREE = 4, // get bit lengths tree for a dynamic block + DTREE = 5, // get length, distance trees for a dynamic block + CODES = 6, // processing fixed or dynamic block + DRY = 7, // output remaining window bytes + DONE = 8, // finished last block, done + BAD = 9, // ot a data error--stuck here + } + + private InflateBlockMode mode; // current inflate_block mode + + internal int left; // if STORED, bytes left to copy + + internal int table; // table lengths (14 bits) + internal int index; // index into blens (or border) + internal int[] blens; // bit lengths of codes + internal int[] bb = new int[1]; // bit length tree depth + internal int[] tb = new int[1]; // bit length decoding tree + + internal InflateCodes codes = new InflateCodes(); // if CODES, current state + + internal int last; // true if this block is the last block + + internal ZlibCodec _codec; // pointer back to this zlib stream + + // mode independent information + internal int bitk; // bits in bit buffer + internal int bitb; // bit buffer + internal int[] hufts; // single malloc for tree space + internal byte[] window; // sliding window + internal int end; // one byte after sliding window + internal int readAt; // window read pointer + internal int writeAt; // window write pointer + internal System.Object checkfn; // check function + internal uint check; // check on output + + internal InfTree inftree = new InfTree(); + + internal InflateBlocks(ZlibCodec codec, System.Object checkfn, int w) + { + _codec = codec; + hufts = new int[MANY * 3]; + window = new byte[w]; + end = w; + this.checkfn = checkfn; + mode = InflateBlockMode.TYPE; + Reset(); + } + + internal uint Reset() + { + uint oldCheck = check; + mode = InflateBlockMode.TYPE; + bitk = 0; + bitb = 0; + readAt = writeAt = 0; + + if (checkfn != null) + _codec._Adler32 = check = Adler.Adler32(0, null, 0, 0); + return oldCheck; + } + + + internal int Process(int r) + { + int t; // temporary storage + int b; // bit buffer + int k; // bits in bit buffer + int p; // input data pointer + int n; // bytes available there + int q; // output window write pointer + int m; // bytes to end of window or read pointer + + // copy input/output information to locals (UPDATE macro restores) + + p = _codec.NextIn; + n = _codec.AvailableBytesIn; + b = bitb; + k = bitk; + + q = writeAt; + m = (int)(q < readAt ? readAt - q - 1 : end - q); + + + // process input based on current state + while (true) + { + switch (mode) + { + case InflateBlockMode.TYPE: + + while (k < (3)) + { + if (n != 0) + { + r = ZlibConstants.Z_OK; + } + else + { + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + + n--; + b |= (_codec.InputBuffer[p++] & 0xff) << k; + k += 8; + } + t = (int)(b & 7); + last = t & 1; + + switch ((uint)t >> 1) + { + case 0: // stored + b >>= 3; k -= (3); + t = k & 7; // go to byte boundary + b >>= t; k -= t; + mode = InflateBlockMode.LENS; // get length of stored block + break; + + case 1: // fixed + int[] bl = new int[1]; + int[] bd = new int[1]; + int[][] tl = new int[1][]; + int[][] td = new int[1][]; + InfTree.inflate_trees_fixed(bl, bd, tl, td, _codec); + codes.Init(bl[0], bd[0], tl[0], 0, td[0], 0); + b >>= 3; k -= 3; + mode = InflateBlockMode.CODES; + break; + + case 2: // dynamic + b >>= 3; k -= 3; + mode = InflateBlockMode.TABLE; + break; + + case 3: // illegal + b >>= 3; k -= 3; + mode = InflateBlockMode.BAD; + _codec.Message = "invalid block type"; + r = ZlibConstants.Z_DATA_ERROR; + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + break; + + case InflateBlockMode.LENS: + + while (k < (32)) + { + if (n != 0) + { + r = ZlibConstants.Z_OK; + } + else + { + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + ; + n--; + b |= (_codec.InputBuffer[p++] & 0xff) << k; + k += 8; + } + + if ( ( ((~b)>>16) & 0xffff) != (b & 0xffff)) + { + mode = InflateBlockMode.BAD; + _codec.Message = "invalid stored block lengths"; + r = ZlibConstants.Z_DATA_ERROR; + + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + left = (b & 0xffff); + b = k = 0; // dump bits + mode = left != 0 ? InflateBlockMode.STORED : (last != 0 ? InflateBlockMode.DRY : InflateBlockMode.TYPE); + break; + + case InflateBlockMode.STORED: + if (n == 0) + { + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + + if (m == 0) + { + if (q == end && readAt != 0) + { + q = 0; m = (int)(q < readAt ? readAt - q - 1 : end - q); + } + if (m == 0) + { + writeAt = q; + r = Flush(r); + q = writeAt; m = (int)(q < readAt ? readAt - q - 1 : end - q); + if (q == end && readAt != 0) + { + q = 0; m = (int)(q < readAt ? readAt - q - 1 : end - q); + } + if (m == 0) + { + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + } + } + r = ZlibConstants.Z_OK; + + t = left; + if (t > n) + t = n; + if (t > m) + t = m; + Array.Copy(_codec.InputBuffer, p, window, q, t); + p += t; n -= t; + q += t; m -= t; + if ((left -= t) != 0) + break; + mode = last != 0 ? InflateBlockMode.DRY : InflateBlockMode.TYPE; + break; + + case InflateBlockMode.TABLE: + + while (k < (14)) + { + if (n != 0) + { + r = ZlibConstants.Z_OK; + } + else + { + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + + n--; + b |= (_codec.InputBuffer[p++] & 0xff) << k; + k += 8; + } + + table = t = (b & 0x3fff); + if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) + { + mode = InflateBlockMode.BAD; + _codec.Message = "too many length or distance symbols"; + r = ZlibConstants.Z_DATA_ERROR; + + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); + if (blens == null || blens.Length < t) + { + blens = new int[t]; + } + else + { + Array.Clear(blens, 0, t); + // for (int i = 0; i < t; i++) + // { + // blens[i] = 0; + // } + } + + b >>= 14; + k -= 14; + + + index = 0; + mode = InflateBlockMode.BTREE; + goto case InflateBlockMode.BTREE; + + case InflateBlockMode.BTREE: + while (index < 4 + (table >> 10)) + { + while (k < (3)) + { + if (n != 0) + { + r = ZlibConstants.Z_OK; + } + else + { + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + + n--; + b |= (_codec.InputBuffer[p++] & 0xff) << k; + k += 8; + } + + blens[border[index++]] = b & 7; + + b >>= 3; k -= 3; + } + + while (index < 19) + { + blens[border[index++]] = 0; + } + + bb[0] = 7; + t = inftree.inflate_trees_bits(blens, bb, tb, hufts, _codec); + if (t != ZlibConstants.Z_OK) + { + r = t; + if (r == ZlibConstants.Z_DATA_ERROR) + { + blens = null; + mode = InflateBlockMode.BAD; + } + + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + + index = 0; + mode = InflateBlockMode.DTREE; + goto case InflateBlockMode.DTREE; + + case InflateBlockMode.DTREE: + while (true) + { + t = table; + if (!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))) + { + break; + } + + int i, j, c; + + t = bb[0]; + + while (k < t) + { + if (n != 0) + { + r = ZlibConstants.Z_OK; + } + else + { + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + + n--; + b |= (_codec.InputBuffer[p++] & 0xff) << k; + k += 8; + } + + t = hufts[(tb[0] + (b & InternalInflateConstants.InflateMask[t])) * 3 + 1]; + c = hufts[(tb[0] + (b & InternalInflateConstants.InflateMask[t])) * 3 + 2]; + + if (c < 16) + { + b >>= t; k -= t; + blens[index++] = c; + } + else + { + // c == 16..18 + i = c == 18 ? 7 : c - 14; + j = c == 18 ? 11 : 3; + + while (k < (t + i)) + { + if (n != 0) + { + r = ZlibConstants.Z_OK; + } + else + { + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + + n--; + b |= (_codec.InputBuffer[p++] & 0xff) << k; + k += 8; + } + + b >>= t; k -= t; + + j += (b & InternalInflateConstants.InflateMask[i]); + + b >>= i; k -= i; + + i = index; + t = table; + if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) + { + blens = null; + mode = InflateBlockMode.BAD; + _codec.Message = "invalid bit length repeat"; + r = ZlibConstants.Z_DATA_ERROR; + + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + + c = (c == 16) ? blens[i-1] : 0; + do + { + blens[i++] = c; + } + while (--j != 0); + index = i; + } + } + + tb[0] = -1; + { + int[] bl = new int[] { 9 }; // must be <= 9 for lookahead assumptions + int[] bd = new int[] { 6 }; // must be <= 9 for lookahead assumptions + int[] tl = new int[1]; + int[] td = new int[1]; + + t = table; + t = inftree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), blens, bl, bd, tl, td, hufts, _codec); + + if (t != ZlibConstants.Z_OK) + { + if (t == ZlibConstants.Z_DATA_ERROR) + { + blens = null; + mode = InflateBlockMode.BAD; + } + r = t; + + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + codes.Init(bl[0], bd[0], hufts, tl[0], hufts, td[0]); + } + mode = InflateBlockMode.CODES; + goto case InflateBlockMode.CODES; + + case InflateBlockMode.CODES: + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + + r = codes.Process(this, r); + if (r != ZlibConstants.Z_STREAM_END) + { + return Flush(r); + } + + r = ZlibConstants.Z_OK; + p = _codec.NextIn; + n = _codec.AvailableBytesIn; + b = bitb; + k = bitk; + q = writeAt; + m = (int)(q < readAt ? readAt - q - 1 : end - q); + + if (last == 0) + { + mode = InflateBlockMode.TYPE; + break; + } + mode = InflateBlockMode.DRY; + goto case InflateBlockMode.DRY; + + case InflateBlockMode.DRY: + writeAt = q; + r = Flush(r); + q = writeAt; m = (int)(q < readAt ? readAt - q - 1 : end - q); + if (readAt != writeAt) + { + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + mode = InflateBlockMode.DONE; + goto case InflateBlockMode.DONE; + + case InflateBlockMode.DONE: + r = ZlibConstants.Z_STREAM_END; + bitb = b; + bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + + case InflateBlockMode.BAD: + r = ZlibConstants.Z_DATA_ERROR; + + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + + + default: + r = ZlibConstants.Z_STREAM_ERROR; + + bitb = b; bitk = k; + _codec.AvailableBytesIn = n; + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + writeAt = q; + return Flush(r); + } + } + } + + + internal void Free() + { + Reset(); + window = null; + hufts = null; + } + + internal void SetDictionary(byte[] d, int start, int n) + { + Array.Copy(d, start, window, 0, n); + readAt = writeAt = n; + } + + // Returns true if inflate is currently at the end of a block generated + // by Z_SYNC_FLUSH or Z_FULL_FLUSH. + internal int SyncPoint() + { + return mode == InflateBlockMode.LENS ? 1 : 0; + } + + // copy as much as possible from the sliding window to the output area + internal int Flush(int r) + { + int nBytes; + + for (int pass=0; pass < 2; pass++) + { + if (pass==0) + { + // compute number of bytes to copy as far as end of window + nBytes = (int)((readAt <= writeAt ? writeAt : end) - readAt); + } + else + { + // compute bytes to copy + nBytes = writeAt - readAt; + } + + // workitem 8870 + if (nBytes == 0) + { + if (r == ZlibConstants.Z_BUF_ERROR) + r = ZlibConstants.Z_OK; + return r; + } + + if (nBytes > _codec.AvailableBytesOut) + nBytes = _codec.AvailableBytesOut; + + if (nBytes != 0 && r == ZlibConstants.Z_BUF_ERROR) + r = ZlibConstants.Z_OK; + + // update counters + _codec.AvailableBytesOut -= nBytes; + _codec.TotalBytesOut += nBytes; + + // update check information + if (checkfn != null) + _codec._Adler32 = check = Adler.Adler32(check, window, readAt, nBytes); + + // copy as far as end of window + Array.Copy(window, readAt, _codec.OutputBuffer, _codec.NextOut, nBytes); + _codec.NextOut += nBytes; + readAt += nBytes; + + // see if more to copy at beginning of window + if (readAt == end && pass == 0) + { + // wrap pointers + readAt = 0; + if (writeAt == end) + writeAt = 0; + } + else pass++; + } + + // done + return r; + } + } + + + internal static class InternalInflateConstants + { + // And'ing with mask[n] masks the lower n bits + internal static readonly int[] InflateMask = new int[] { + 0x00000000, 0x00000001, 0x00000003, 0x00000007, + 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, + 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, + 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff }; + } + + + sealed class InflateCodes + { + // waiting for "i:"=input, + // "o:"=output, + // "x:"=nothing + private const int START = 0; // x: set up for LEN + private const int LEN = 1; // i: get length/literal/eob next + private const int LENEXT = 2; // i: getting length extra (have base) + private const int DIST = 3; // i: get distance next + private const int DISTEXT = 4; // i: getting distance extra + private const int COPY = 5; // o: copying bytes in window, waiting for space + private const int LIT = 6; // o: got literal, waiting for output space + private const int WASH = 7; // o: got eob, possibly still output waiting + private const int END = 8; // x: got eob and all data flushed + private const int BADCODE = 9; // x: got error + + internal int mode; // current inflate_codes mode + + // mode dependent information + internal int len; + + internal int[] tree; // pointer into tree + internal int tree_index = 0; + internal int need; // bits needed + + internal int lit; + + // if EXT or COPY, where and how much + internal int bitsToGet; // bits to get for extra + internal int dist; // distance back to copy from + + internal byte lbits; // ltree bits decoded per branch + internal byte dbits; // dtree bits decoder per branch + internal int[] ltree; // literal/length/eob tree + internal int ltree_index; // literal/length/eob tree + internal int[] dtree; // distance tree + internal int dtree_index; // distance tree + + internal InflateCodes() + { + } + + internal void Init(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index) + { + mode = START; + lbits = (byte)bl; + dbits = (byte)bd; + ltree = tl; + ltree_index = tl_index; + dtree = td; + dtree_index = td_index; + tree = null; + } + + internal int Process(InflateBlocks blocks, int r) + { + int j; // temporary storage + int tindex; // temporary pointer + int e; // extra bits or operation + int b = 0; // bit buffer + int k = 0; // bits in bit buffer + int p = 0; // input data pointer + int n; // bytes available there + int q; // output window write pointer + int m; // bytes to end of window or read pointer + int f; // pointer to copy strings from + + ZlibCodec z = blocks._codec; + + // copy input/output information to locals (UPDATE macro restores) + p = z.NextIn; + n = z.AvailableBytesIn; + b = blocks.bitb; + k = blocks.bitk; + q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; + + // process input and output based on current state + while (true) + { + switch (mode) + { + // waiting for "i:"=input, "o:"=output, "x:"=nothing + case START: // x: set up for LEN + if (m >= 258 && n >= 10) + { + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; + blocks.writeAt = q; + r = InflateFast(lbits, dbits, ltree, ltree_index, dtree, dtree_index, blocks, z); + + p = z.NextIn; + n = z.AvailableBytesIn; + b = blocks.bitb; + k = blocks.bitk; + q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; + + if (r != ZlibConstants.Z_OK) + { + mode = (r == ZlibConstants.Z_STREAM_END) ? WASH : BADCODE; + break; + } + } + need = lbits; + tree = ltree; + tree_index = ltree_index; + + mode = LEN; + goto case LEN; + + case LEN: // i: get length/literal/eob next + j = need; + + while (k < j) + { + if (n != 0) + r = ZlibConstants.Z_OK; + else + { + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + } + n--; + b |= (z.InputBuffer[p++] & 0xff) << k; + k += 8; + } + + tindex = (tree_index + (b & InternalInflateConstants.InflateMask[j])) * 3; + + b >>= (tree[tindex + 1]); + k -= (tree[tindex + 1]); + + e = tree[tindex]; + + if (e == 0) + { + // literal + lit = tree[tindex + 2]; + mode = LIT; + break; + } + if ((e & 16) != 0) + { + // length + bitsToGet = e & 15; + len = tree[tindex + 2]; + mode = LENEXT; + break; + } + if ((e & 64) == 0) + { + // next table + need = e; + tree_index = tindex / 3 + tree[tindex + 2]; + break; + } + if ((e & 32) != 0) + { + // end of block + mode = WASH; + break; + } + mode = BADCODE; // invalid code + z.Message = "invalid literal/length code"; + r = ZlibConstants.Z_DATA_ERROR; + + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + + + case LENEXT: // i: getting length extra (have base) + j = bitsToGet; + + while (k < j) + { + if (n != 0) + r = ZlibConstants.Z_OK; + else + { + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + } + n--; b |= (z.InputBuffer[p++] & 0xff) << k; + k += 8; + } + + len += (b & InternalInflateConstants.InflateMask[j]); + + b >>= j; + k -= j; + + need = dbits; + tree = dtree; + tree_index = dtree_index; + mode = DIST; + goto case DIST; + + case DIST: // i: get distance next + j = need; + + while (k < j) + { + if (n != 0) + r = ZlibConstants.Z_OK; + else + { + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + } + n--; b |= (z.InputBuffer[p++] & 0xff) << k; + k += 8; + } + + tindex = (tree_index + (b & InternalInflateConstants.InflateMask[j])) * 3; + + b >>= tree[tindex + 1]; + k -= tree[tindex + 1]; + + e = (tree[tindex]); + if ((e & 0x10) != 0) + { + // distance + bitsToGet = e & 15; + dist = tree[tindex + 2]; + mode = DISTEXT; + break; + } + if ((e & 64) == 0) + { + // next table + need = e; + tree_index = tindex / 3 + tree[tindex + 2]; + break; + } + mode = BADCODE; // invalid code + z.Message = "invalid distance code"; + r = ZlibConstants.Z_DATA_ERROR; + + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + + + case DISTEXT: // i: getting distance extra + j = bitsToGet; + + while (k < j) + { + if (n != 0) + r = ZlibConstants.Z_OK; + else + { + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + } + n--; b |= (z.InputBuffer[p++] & 0xff) << k; + k += 8; + } + + dist += (b & InternalInflateConstants.InflateMask[j]); + + b >>= j; + k -= j; + + mode = COPY; + goto case COPY; + + case COPY: // o: copying bytes in window, waiting for space + f = q - dist; + while (f < 0) + { + // modulo window size-"while" instead + f += blocks.end; // of "if" handles invalid distances + } + while (len != 0) + { + if (m == 0) + { + if (q == blocks.end && blocks.readAt != 0) + { + q = 0; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; + } + if (m == 0) + { + blocks.writeAt = q; r = blocks.Flush(r); + q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; + + if (q == blocks.end && blocks.readAt != 0) + { + q = 0; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; + } + + if (m == 0) + { + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; + z.TotalBytesIn += p - z.NextIn; + z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + } + } + } + + blocks.window[q++] = blocks.window[f++]; m--; + + if (f == blocks.end) + f = 0; + len--; + } + mode = START; + break; + + case LIT: // o: got literal, waiting for output space + if (m == 0) + { + if (q == blocks.end && blocks.readAt != 0) + { + q = 0; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; + } + if (m == 0) + { + blocks.writeAt = q; r = blocks.Flush(r); + q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; + + if (q == blocks.end && blocks.readAt != 0) + { + q = 0; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; + } + if (m == 0) + { + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + } + } + } + r = ZlibConstants.Z_OK; + + blocks.window[q++] = (byte)lit; m--; + + mode = START; + break; + + case WASH: // o: got eob, possibly more output + if (k > 7) + { + // return unused byte, if any + k -= 8; + n++; + p--; // can always return one + } + + blocks.writeAt = q; r = blocks.Flush(r); + q = blocks.writeAt; m = q < blocks.readAt ? blocks.readAt - q - 1 : blocks.end - q; + + if (blocks.readAt != blocks.writeAt) + { + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + } + mode = END; + goto case END; + + case END: + r = ZlibConstants.Z_STREAM_END; + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + + case BADCODE: // x: got error + + r = ZlibConstants.Z_DATA_ERROR; + + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + + default: + r = ZlibConstants.Z_STREAM_ERROR; + + blocks.bitb = b; blocks.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + blocks.writeAt = q; + return blocks.Flush(r); + } + } + } + + + // Called with number of bytes left to write in window at least 258 + // (the maximum string length) and number of input bytes available + // at least ten. The ten bytes are six bytes for the longest length/ + // distance pair plus four bytes for overloading the bit buffer. + + internal int InflateFast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InflateBlocks s, ZlibCodec z) + { + int t; // temporary pointer + int[] tp; // temporary pointer + int tp_index; // temporary pointer + int e; // extra bits or operation + int b; // bit buffer + int k; // bits in bit buffer + int p; // input data pointer + int n; // bytes available there + int q; // output window write pointer + int m; // bytes to end of window or read pointer + int ml; // mask for literal/length tree + int md; // mask for distance tree + int c; // bytes to copy + int d; // distance back to copy from + int r; // copy source pointer + + int tp_index_t_3; // (tp_index+t)*3 + + // load input, output, bit values + p = z.NextIn; n = z.AvailableBytesIn; b = s.bitb; k = s.bitk; + q = s.writeAt; m = q < s.readAt ? s.readAt - q - 1 : s.end - q; + + // initialize masks + ml = InternalInflateConstants.InflateMask[bl]; + md = InternalInflateConstants.InflateMask[bd]; + + // do until not enough input or output space for fast loop + do + { + // assume called with m >= 258 && n >= 10 + // get literal/length code + while (k < (20)) + { + // max bits for literal/length code + n--; + b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; + } + + t = b & ml; + tp = tl; + tp_index = tl_index; + tp_index_t_3 = (tp_index + t) * 3; + if ((e = tp[tp_index_t_3]) == 0) + { + b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); + + s.window[q++] = (byte)tp[tp_index_t_3 + 2]; + m--; + continue; + } + do + { + + b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); + + if ((e & 16) != 0) + { + e &= 15; + c = tp[tp_index_t_3 + 2] + ((int)b & InternalInflateConstants.InflateMask[e]); + + b >>= e; k -= e; + + // decode distance base of block to copy + while (k < 15) + { + // max bits for distance code + n--; + b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; + } + + t = b & md; + tp = td; + tp_index = td_index; + tp_index_t_3 = (tp_index + t) * 3; + e = tp[tp_index_t_3]; + + do + { + + b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); + + if ((e & 16) != 0) + { + // get extra bits to add to distance base + e &= 15; + while (k < e) + { + // get extra bits (up to 13) + n--; + b |= (z.InputBuffer[p++] & 0xff) << k; k += 8; + } + + d = tp[tp_index_t_3 + 2] + (b & InternalInflateConstants.InflateMask[e]); + + b >>= e; k -= e; + + // do the copy + m -= c; + if (q >= d) + { + // offset before dest + // just copy + r = q - d; + if (q - r > 0 && 2 > (q - r)) + { + s.window[q++] = s.window[r++]; // minimum count is three, + s.window[q++] = s.window[r++]; // so unroll loop a little + c -= 2; + } + else + { + Array.Copy(s.window, r, s.window, q, 2); + q += 2; r += 2; c -= 2; + } + } + else + { + // else offset after destination + r = q - d; + do + { + r += s.end; // force pointer in window + } + while (r < 0); // covers invalid distances + e = s.end - r; + if (c > e) + { + // if source crosses, + c -= e; // wrapped copy + if (q - r > 0 && e > (q - r)) + { + do + { + s.window[q++] = s.window[r++]; + } + while (--e != 0); + } + else + { + Array.Copy(s.window, r, s.window, q, e); + q += e; r += e; e = 0; + } + r = 0; // copy rest from start of window + } + } + + // copy all or what's left + if (q - r > 0 && c > (q - r)) + { + do + { + s.window[q++] = s.window[r++]; + } + while (--c != 0); + } + else + { + Array.Copy(s.window, r, s.window, q, c); + q += c; r += c; c = 0; + } + break; + } + else if ((e & 64) == 0) + { + t += tp[tp_index_t_3 + 2]; + t += (b & InternalInflateConstants.InflateMask[e]); + tp_index_t_3 = (tp_index + t) * 3; + e = tp[tp_index_t_3]; + } + else + { + z.Message = "invalid distance code"; + + c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); + + s.bitb = b; s.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + s.writeAt = q; + + return ZlibConstants.Z_DATA_ERROR; + } + } + while (true); + break; + } + + if ((e & 64) == 0) + { + t += tp[tp_index_t_3 + 2]; + t += (b & InternalInflateConstants.InflateMask[e]); + tp_index_t_3 = (tp_index + t) * 3; + if ((e = tp[tp_index_t_3]) == 0) + { + b >>= (tp[tp_index_t_3 + 1]); k -= (tp[tp_index_t_3 + 1]); + s.window[q++] = (byte)tp[tp_index_t_3 + 2]; + m--; + break; + } + } + else if ((e & 32) != 0) + { + c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); + + s.bitb = b; s.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + s.writeAt = q; + + return ZlibConstants.Z_STREAM_END; + } + else + { + z.Message = "invalid literal/length code"; + + c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); + + s.bitb = b; s.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + s.writeAt = q; + + return ZlibConstants.Z_DATA_ERROR; + } + } + while (true); + } + while (m >= 258 && n >= 10); + + // not enough input or output--restore pointers and return + c = z.AvailableBytesIn - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); + + s.bitb = b; s.bitk = k; + z.AvailableBytesIn = n; z.TotalBytesIn += p - z.NextIn; z.NextIn = p; + s.writeAt = q; + + return ZlibConstants.Z_OK; + } + } + + + internal sealed class InflateManager + { + // preset dictionary flag in zlib header + private const int PRESET_DICT = 0x20; + + private const int Z_DEFLATED = 8; + + private enum InflateManagerMode + { + METHOD = 0, // waiting for method byte + FLAG = 1, // waiting for flag byte + DICT4 = 2, // four dictionary check bytes to go + DICT3 = 3, // three dictionary check bytes to go + DICT2 = 4, // two dictionary check bytes to go + DICT1 = 5, // one dictionary check byte to go + DICT0 = 6, // waiting for inflateSetDictionary + BLOCKS = 7, // decompressing blocks + CHECK4 = 8, // four check bytes to go + CHECK3 = 9, // three check bytes to go + CHECK2 = 10, // two check bytes to go + CHECK1 = 11, // one check byte to go + DONE = 12, // finished check, done + BAD = 13, // got an error--stay here + } + + private InflateManagerMode mode; // current inflate mode + internal ZlibCodec _codec; // pointer back to this zlib stream + + // mode dependent information + internal int method; // if FLAGS, method byte + + // if CHECK, check values to compare + internal uint computedCheck; // computed check value + internal uint expectedCheck; // stream check value + + // if BAD, inflateSync's marker bytes count + internal int marker; + + // mode independent information + //internal int nowrap; // flag for no wrapper + private bool _handleRfc1950HeaderBytes = true; + internal bool HandleRfc1950HeaderBytes + { + get { return _handleRfc1950HeaderBytes; } + set { _handleRfc1950HeaderBytes = value; } + } + internal int wbits; // log2(window size) (8..15, defaults to 15) + + internal InflateBlocks blocks; // current inflate_blocks state + + public InflateManager() { } + + public InflateManager(bool expectRfc1950HeaderBytes) + { + _handleRfc1950HeaderBytes = expectRfc1950HeaderBytes; + } + + internal int Reset() + { + _codec.TotalBytesIn = _codec.TotalBytesOut = 0; + _codec.Message = null; + mode = HandleRfc1950HeaderBytes ? InflateManagerMode.METHOD : InflateManagerMode.BLOCKS; + blocks.Reset(); + return ZlibConstants.Z_OK; + } + + internal int End() + { + if (blocks != null) + blocks.Free(); + blocks = null; + return ZlibConstants.Z_OK; + } + + internal int Initialize(ZlibCodec codec, int w) + { + _codec = codec; + _codec.Message = null; + blocks = null; + + // handle undocumented nowrap option (no zlib header or check) + //nowrap = 0; + //if (w < 0) + //{ + // w = - w; + // nowrap = 1; + //} + + // set window size + if (w < 8 || w > 15) + { + End(); + throw new ZlibException("Bad window size."); + + //return ZlibConstants.Z_STREAM_ERROR; + } + wbits = w; + + blocks = new InflateBlocks(codec, + HandleRfc1950HeaderBytes ? this : null, + 1 << w); + + // reset state + Reset(); + return ZlibConstants.Z_OK; + } + + + internal int Inflate(FlushType flush) + { + int b; + + if (_codec.InputBuffer == null) + throw new ZlibException("InputBuffer is null. "); + +// int f = (flush == FlushType.Finish) +// ? ZlibConstants.Z_BUF_ERROR +// : ZlibConstants.Z_OK; + + // workitem 8870 + int f = ZlibConstants.Z_OK; + int r = ZlibConstants.Z_BUF_ERROR; + + while (true) + { + switch (mode) + { + case InflateManagerMode.METHOD: + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; + _codec.TotalBytesIn++; + if (((method = _codec.InputBuffer[_codec.NextIn++]) & 0xf) != Z_DEFLATED) + { + mode = InflateManagerMode.BAD; + _codec.Message = String.Format("unknown compression method (0x{0:X2})", method); + marker = 5; // can't try inflateSync + break; + } + if ((method >> 4) + 8 > wbits) + { + mode = InflateManagerMode.BAD; + _codec.Message = String.Format("invalid window size ({0})", (method >> 4) + 8); + marker = 5; // can't try inflateSync + break; + } + mode = InflateManagerMode.FLAG; + break; + + + case InflateManagerMode.FLAG: + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; + _codec.TotalBytesIn++; + b = (_codec.InputBuffer[_codec.NextIn++]) & 0xff; + + if ((((method << 8) + b) % 31) != 0) + { + mode = InflateManagerMode.BAD; + _codec.Message = "incorrect header check"; + marker = 5; // can't try inflateSync + break; + } + + mode = ((b & PRESET_DICT) == 0) + ? InflateManagerMode.BLOCKS + : InflateManagerMode.DICT4; + break; + + case InflateManagerMode.DICT4: + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; + _codec.TotalBytesIn++; + expectedCheck = (uint)((_codec.InputBuffer[_codec.NextIn++] << 24) & 0xff000000); + mode = InflateManagerMode.DICT3; + break; + + case InflateManagerMode.DICT3: + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; + _codec.TotalBytesIn++; + expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 16) & 0x00ff0000); + mode = InflateManagerMode.DICT2; + break; + + case InflateManagerMode.DICT2: + + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; + _codec.TotalBytesIn++; + expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 8) & 0x0000ff00); + mode = InflateManagerMode.DICT1; + break; + + + case InflateManagerMode.DICT1: + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; _codec.TotalBytesIn++; + expectedCheck += (uint)(_codec.InputBuffer[_codec.NextIn++] & 0x000000ff); + _codec._Adler32 = expectedCheck; + mode = InflateManagerMode.DICT0; + return ZlibConstants.Z_NEED_DICT; + + + case InflateManagerMode.DICT0: + mode = InflateManagerMode.BAD; + _codec.Message = "need dictionary"; + marker = 0; // can try inflateSync + return ZlibConstants.Z_STREAM_ERROR; + + + case InflateManagerMode.BLOCKS: + r = blocks.Process(r); + if (r == ZlibConstants.Z_DATA_ERROR) + { + mode = InflateManagerMode.BAD; + marker = 0; // can try inflateSync + break; + } + + if (r == ZlibConstants.Z_OK) r = f; + + if (r != ZlibConstants.Z_STREAM_END) + return r; + + r = f; + computedCheck = blocks.Reset(); + if (!HandleRfc1950HeaderBytes) + { + mode = InflateManagerMode.DONE; + return ZlibConstants.Z_STREAM_END; + } + mode = InflateManagerMode.CHECK4; + break; + + case InflateManagerMode.CHECK4: + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; + _codec.TotalBytesIn++; + expectedCheck = (uint)((_codec.InputBuffer[_codec.NextIn++] << 24) & 0xff000000); + mode = InflateManagerMode.CHECK3; + break; + + case InflateManagerMode.CHECK3: + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; _codec.TotalBytesIn++; + expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 16) & 0x00ff0000); + mode = InflateManagerMode.CHECK2; + break; + + case InflateManagerMode.CHECK2: + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; + _codec.TotalBytesIn++; + expectedCheck += (uint)((_codec.InputBuffer[_codec.NextIn++] << 8) & 0x0000ff00); + mode = InflateManagerMode.CHECK1; + break; + + case InflateManagerMode.CHECK1: + if (_codec.AvailableBytesIn == 0) return r; + r = f; + _codec.AvailableBytesIn--; _codec.TotalBytesIn++; + expectedCheck += (uint)(_codec.InputBuffer[_codec.NextIn++] & 0x000000ff); + if (computedCheck != expectedCheck) + { + mode = InflateManagerMode.BAD; + _codec.Message = "incorrect data check"; + marker = 5; // can't try inflateSync + break; + } + mode = InflateManagerMode.DONE; + return ZlibConstants.Z_STREAM_END; + + case InflateManagerMode.DONE: + return ZlibConstants.Z_STREAM_END; + + case InflateManagerMode.BAD: + throw new ZlibException(String.Format("Bad state ({0})", _codec.Message)); + + default: + throw new ZlibException("Stream error."); + + } + } + } + + + + internal int SetDictionary(byte[] dictionary) + { + int index = 0; + int length = dictionary.Length; + if (mode != InflateManagerMode.DICT0) + throw new ZlibException("Stream error."); + + if (Adler.Adler32(1, dictionary, 0, dictionary.Length) != _codec._Adler32) + { + return ZlibConstants.Z_DATA_ERROR; + } + + _codec._Adler32 = Adler.Adler32(0, null, 0, 0); + + if (length >= (1 << wbits)) + { + length = (1 << wbits) - 1; + index = dictionary.Length - length; + } + blocks.SetDictionary(dictionary, index, length); + mode = InflateManagerMode.BLOCKS; + return ZlibConstants.Z_OK; + } + + + private static readonly byte[] mark = new byte[] { 0, 0, 0xff, 0xff }; + + internal int Sync() + { + int n; // number of bytes to look at + int p; // pointer to bytes + int m; // number of marker bytes found in a row + long r, w; // temporaries to save total_in and total_out + + // set up + if (mode != InflateManagerMode.BAD) + { + mode = InflateManagerMode.BAD; + marker = 0; + } + if ((n = _codec.AvailableBytesIn) == 0) + return ZlibConstants.Z_BUF_ERROR; + p = _codec.NextIn; + m = marker; + + // search + while (n != 0 && m < 4) + { + if (_codec.InputBuffer[p] == mark[m]) + { + m++; + } + else if (_codec.InputBuffer[p] != 0) + { + m = 0; + } + else + { + m = 4 - m; + } + p++; n--; + } + + // restore + _codec.TotalBytesIn += p - _codec.NextIn; + _codec.NextIn = p; + _codec.AvailableBytesIn = n; + marker = m; + + // return no joy or set up to restart on a new block + if (m != 4) + { + return ZlibConstants.Z_DATA_ERROR; + } + r = _codec.TotalBytesIn; + w = _codec.TotalBytesOut; + Reset(); + _codec.TotalBytesIn = r; + _codec.TotalBytesOut = w; + mode = InflateManagerMode.BLOCKS; + return ZlibConstants.Z_OK; + } + + + // Returns true if inflate is currently at the end of a block generated + // by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + // implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH + // but removes the length bytes of the resulting empty stored block. When + // decompressing, PPP checks that at the end of input packet, inflate is + // waiting for these length bytes. + internal int SyncPoint(ZlibCodec z) + { + return blocks.SyncPoint(); + } + } +} \ No newline at end of file diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/Tree.cs b/ROMVault2/SupportedFiles/Zip/ZLib/Tree.cs new file mode 100644 index 0000000..0059796 --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/Tree.cs @@ -0,0 +1,421 @@ +// Tree.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// last saved (in emacs): +// Time-stamp: <2009-October-28 13:29:50> +// +// ------------------------------------------------------------------ +// +// This module defines classes for zlib compression and +// decompression. This code is derived from the jzlib implementation of +// zlib. In keeping with the license for jzlib, the copyright to that +// code is below. +// +// ------------------------------------------------------------------ +// +// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the distribution. +// +// 3. The names of the authors may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------- +// +// This program is based on zlib-1.1.3; credit to authors +// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +// and contributors of zlib. +// +// ----------------------------------------------------------------------- + + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + sealed class Tree + { + private static readonly int HEAP_SIZE = (2 * InternalConstants.L_CODES + 1); + + // extra bits for each length code + internal static readonly int[] ExtraLengthBits = new int[] + { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 + }; + + // extra bits for each distance code + internal static readonly int[] ExtraDistanceBits = new int[] + { + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 + }; + + // extra bits for each bit length code + internal static readonly int[] extra_blbits = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7}; + + internal static readonly sbyte[] bl_order = new sbyte[]{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + + // The lengths of the bit length codes are sent in order of decreasing + // probability, to avoid transmitting the lengths for unused bit + // length codes. + + internal const int Buf_size = 8 * 2; + + // see definition of array dist_code below + //internal const int DIST_CODE_LEN = 512; + + private static readonly sbyte[] _dist_code = new sbyte[] + { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, + 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 + }; + + internal static readonly sbyte[] LengthCode = new sbyte[] + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, + 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 + }; + + + internal static readonly int[] LengthBase = new int[] + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, + 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 + }; + + + internal static readonly int[] DistanceBase = new int[] + { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, + 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 + }; + + + /// + /// Map from a distance to a distance code. + /// + /// + /// No side effects. _dist_code[256] and _dist_code[257] are never used. + /// + internal static int DistanceCode(int dist) + { + return (dist < 256) + ? _dist_code[dist] + : _dist_code[256 + SharedUtils.URShift(dist, 7)]; + } + + internal short[] dyn_tree; // the dynamic tree + internal int max_code; // largest code with non zero frequency + internal StaticTree staticTree; // the corresponding static tree + + // Compute the optimal bit lengths for a tree and update the total bit length + // for the current block. + // IN assertion: the fields freq and dad are set, heap[heap_max] and + // above are the tree nodes sorted by increasing frequency. + // OUT assertions: the field len is set to the optimal bit length, the + // array bl_count contains the frequencies for each bit length. + // The length opt_len is updated; static_len is also updated if stree is + // not null. + internal void gen_bitlen(DeflateManager s) + { + short[] tree = dyn_tree; + short[] stree = staticTree.treeCodes; + int[] extra = staticTree.extraBits; + int base_Renamed = staticTree.extraBase; + int max_length = staticTree.maxLength; + int h; // heap index + int n, m; // iterate over the tree elements + int bits; // bit length + int xbits; // extra bits + short f; // frequency + int overflow = 0; // number of elements with bit length too large + + for (bits = 0; bits <= InternalConstants.MAX_BITS; bits++) + s.bl_count[bits] = 0; + + // In a first pass, compute the optimal bit lengths (which may + // overflow in the case of the bit length tree). + tree[s.heap[s.heap_max] * 2 + 1] = 0; // root of the heap + + for (h = s.heap_max + 1; h < HEAP_SIZE; h++) + { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1] * 2 + 1] + 1; + if (bits > max_length) + { + bits = max_length; overflow++; + } + tree[n * 2 + 1] = (short) bits; + // We overwrite tree[n*2+1] which is no longer needed + + if (n > max_code) + continue; // not a leaf node + + s.bl_count[bits]++; + xbits = 0; + if (n >= base_Renamed) + xbits = extra[n - base_Renamed]; + f = tree[n * 2]; + s.opt_len += f * (bits + xbits); + if (stree != null) + s.static_len += f * (stree[n * 2 + 1] + xbits); + } + if (overflow == 0) + return ; + + // This happens for example on obj2 and pic of the Calgary corpus + // Find the first bit length which could increase: + do + { + bits = max_length - 1; + while (s.bl_count[bits] == 0) + bits--; + s.bl_count[bits]--; // move one leaf down the tree + s.bl_count[bits + 1] = (short) (s.bl_count[bits + 1] + 2); // move one overflow item as its brother + s.bl_count[max_length]--; + // The brother of the overflow item also moves one step up, + // but this does not affect bl_count[max_length] + overflow -= 2; + } + while (overflow > 0); + + for (bits = max_length; bits != 0; bits--) + { + n = s.bl_count[bits]; + while (n != 0) + { + m = s.heap[--h]; + if (m > max_code) + continue; + if (tree[m * 2 + 1] != bits) + { + s.opt_len = (int) (s.opt_len + ((long) bits - (long) tree[m * 2 + 1]) * (long) tree[m * 2]); + tree[m * 2 + 1] = (short) bits; + } + n--; + } + } + } + + // Construct one Huffman tree and assigns the code bit strings and lengths. + // Update the total bit length for the current block. + // IN assertion: the field freq is set for all tree elements. + // OUT assertions: the fields len and code are set to the optimal bit length + // and corresponding code. The length opt_len is updated; static_len is + // also updated if stree is not null. The field max_code is set. + internal void build_tree(DeflateManager s) + { + short[] tree = dyn_tree; + short[] stree = staticTree.treeCodes; + int elems = staticTree.elems; + int n, m; // iterate over heap elements + int max_code = -1; // largest code with non zero frequency + int node; // new node being created + + // Construct the initial heap, with least frequent element in + // heap[1]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + // heap[0] is not used. + s.heap_len = 0; + s.heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) + { + if (tree[n * 2] != 0) + { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; + } + else + { + tree[n * 2 + 1] = 0; + } + } + + // The pkzip format requires that at least one distance code exists, + // and that at least one bit should be sent even if there is only one + // possible code. So to avoid special checks later on we force at least + // two codes of non zero frequency. + while (s.heap_len < 2) + { + node = s.heap[++s.heap_len] = (max_code < 2?++max_code:0); + tree[node * 2] = 1; + s.depth[node] = 0; + s.opt_len--; + if (stree != null) + s.static_len -= stree[node * 2 + 1]; + // node is 0 or 1 so it does not have extra bits + } + this.max_code = max_code; + + // The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + // establish sub-heaps of increasing lengths: + + for (n = s.heap_len / 2; n >= 1; n--) + s.pqdownheap(tree, n); + + // Construct the Huffman tree by repeatedly combining the least two + // frequent nodes. + + node = elems; // next internal node of the tree + do + { + // n = node of least frequency + n = s.heap[1]; + s.heap[1] = s.heap[s.heap_len--]; + s.pqdownheap(tree, 1); + m = s.heap[1]; // m = node of next least frequency + + s.heap[--s.heap_max] = n; // keep the nodes sorted by frequency + s.heap[--s.heap_max] = m; + + // Create a new node father of n and m + tree[node * 2] = unchecked((short) (tree[n * 2] + tree[m * 2])); + s.depth[node] = (sbyte) (System.Math.Max((byte) s.depth[n], (byte) s.depth[m]) + 1); + tree[n * 2 + 1] = tree[m * 2 + 1] = (short) node; + + // and insert the new node in the heap + s.heap[1] = node++; + s.pqdownheap(tree, 1); + } + while (s.heap_len >= 2); + + s.heap[--s.heap_max] = s.heap[1]; + + // At this point, the fields freq and dad are set. We can now + // generate the bit lengths. + + gen_bitlen(s); + + // The field len is now set, we can generate the bit codes + gen_codes(tree, max_code, s.bl_count); + } + + // Generate the codes for a given tree and bit counts (which need not be + // optimal). + // IN assertion: the array bl_count contains the bit length statistics for + // the given tree and the field len is set for all tree elements. + // OUT assertion: the field code is set for all tree elements of non + // zero code length. + internal static void gen_codes(short[] tree, int max_code, short[] bl_count) + { + short[] next_code = new short[InternalConstants.MAX_BITS + 1]; // next code value for each bit length + short code = 0; // running code value + int bits; // bit index + int n; // code index + + // The distribution counts are first used to generate the code values + // without bit reversal. + for (bits = 1; bits <= InternalConstants.MAX_BITS; bits++) + unchecked { + next_code[bits] = code = (short) ((code + bl_count[bits - 1]) << 1); + } + + // Check that the bit counts in bl_count are consistent. The last code + // must be all ones. + //Assert (code + bl_count[MAX_BITS]-1 == (1<>= 1; //SharedUtils.URShift(code, 1); + res <<= 1; + } + while (--len > 0); + return res >> 1; + } + } +} \ No newline at end of file diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/Zlib.cs b/ROMVault2/SupportedFiles/Zip/ZLib/Zlib.cs new file mode 100644 index 0000000..9a5fd5e --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/Zlib.cs @@ -0,0 +1,544 @@ +// Zlib.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009-2011 Dino Chiesa and Microsoft Corporation. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// Last Saved: <2011-August-03 19:52:28> +// +// ------------------------------------------------------------------ +// +// This module defines classes for ZLIB compression and +// decompression. This code is derived from the jzlib implementation of +// zlib, but significantly modified. The object model is not the same, +// and many of the behaviors are new or different. Nonetheless, in +// keeping with the license for jzlib, the copyright to that code is +// included below. +// +// ------------------------------------------------------------------ +// +// The following notice applies to jzlib: +// +// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the distribution. +// +// 3. The names of the authors may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------- +// +// jzlib is based on zlib-1.1.3. +// +// The following notice applies to zlib: +// +// ----------------------------------------------------------------------- +// +// Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler +// +// The ZLIB software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// +// Jean-loup Gailly jloup@gzip.org +// Mark Adler madler@alumni.caltech.edu +// +// ----------------------------------------------------------------------- + + +using System.Runtime.InteropServices; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + + /// + /// Describes how to flush the current deflate operation. + /// + /// + /// The different FlushType values are useful when using a Deflate in a streaming application. + /// + public enum FlushType + { + /// No flush at all. + None = 0, + + /// Closes the current block, but doesn't flush it to + /// the output. Used internally only in hypothetical + /// scenarios. This was supposed to be removed by Zlib, but it is + /// still in use in some edge cases. + /// + Partial, + + /// + /// Use this during compression to specify that all pending output should be + /// flushed to the output buffer and the output should be aligned on a byte + /// boundary. You might use this in a streaming communication scenario, so that + /// the decompressor can get all input data available so far. When using this + /// with a ZlibCodec, AvailableBytesIn will be zero after the call if + /// enough output space has been provided before the call. Flushing will + /// degrade compression and so it should be used only when necessary. + /// + Sync, + + /// + /// Use this during compression to specify that all output should be flushed, as + /// with FlushType.Sync, but also, the compression state should be reset + /// so that decompression can restart from this point if previous compressed + /// data has been damaged or if random access is desired. Using + /// FlushType.Full too often can significantly degrade the compression. + /// + Full, + + /// Signals the end of the compression/decompression stream. + Finish, + } + + + /// + /// The compression level to be used when using a DeflateStream or ZlibStream with CompressionMode.Compress. + /// + public enum CompressionLevel + { + /// + /// None means that the data will be simply stored, with no change at all. + /// If you are producing ZIPs for use on Mac OSX, be aware that archives produced with CompressionLevel.None + /// cannot be opened with the default zip reader. Use a different CompressionLevel. + /// + None= 0, + /// + /// Same as None. + /// + Level0 = 0, + + /// + /// The fastest but least effective compression. + /// + BestSpeed = 1, + + /// + /// A synonym for BestSpeed. + /// + Level1 = 1, + + /// + /// A little slower, but better, than level 1. + /// + Level2 = 2, + + /// + /// A little slower, but better, than level 2. + /// + Level3 = 3, + + /// + /// A little slower, but better, than level 3. + /// + Level4 = 4, + + /// + /// A little slower than level 4, but with better compression. + /// + Level5 = 5, + + /// + /// The default compression level, with a good balance of speed and compression efficiency. + /// + Default = 6, + /// + /// A synonym for Default. + /// + Level6 = 6, + + /// + /// Pretty good compression! + /// + Level7 = 7, + + /// + /// Better compression than Level7! + /// + Level8 = 8, + + /// + /// The "best" compression, where best means greatest reduction in size of the input data stream. + /// This is also the slowest compression. + /// + BestCompression = 9, + + /// + /// A synonym for BestCompression. + /// + Level9 = 9, + } + + /// + /// Describes options for how the compression algorithm is executed. Different strategies + /// work better on different sorts of data. The strategy parameter can affect the compression + /// ratio and the speed of compression but not the correctness of the compresssion. + /// + public enum CompressionStrategy + { + /// + /// The default strategy is probably the best for normal data. + /// + Default = 0, + + /// + /// The Filtered strategy is intended to be used most effectively with data produced by a + /// filter or predictor. By this definition, filtered data consists mostly of small + /// values with a somewhat random distribution. In this case, the compression algorithm + /// is tuned to compress them better. The effect of Filtered is to force more Huffman + /// coding and less string matching; it is a half-step between Default and HuffmanOnly. + /// + Filtered = 1, + + /// + /// Using HuffmanOnly will force the compressor to do Huffman encoding only, with no + /// string matching. + /// + HuffmanOnly = 2, + } + + + /// + /// An enum to specify the direction of transcoding - whether to compress or decompress. + /// + public enum CompressionMode + { + /// + /// Used to specify that the stream should compress the data. + /// + Compress= 0, + /// + /// Used to specify that the stream should decompress the data. + /// + Decompress = 1, + } + + + /// + /// A general purpose exception class for exceptions in the Zlib library. + /// + [Guid("ebc25cf6-9120-4283-b972-0e5520d0000E")] + public class ZlibException : System.Exception + { + /// + /// The ZlibException class captures exception information generated + /// by the Zlib library. + /// + public ZlibException() + : base() + { + } + + /// + /// This ctor collects a message attached to the exception. + /// + /// the message for the exception. + public ZlibException(System.String s) + : base(s) + { + } + } + + + internal class SharedUtils + { + /// + /// Performs an unsigned bitwise right shift with the specified number + /// + /// Number to operate on + /// Ammount of bits to shift + /// The resulting number from the shift operation + public static int URShift(int number, int bits) + { + return (int)((uint)number >> bits); + } + +#if NOT + /// + /// Performs an unsigned bitwise right shift with the specified number + /// + /// Number to operate on + /// Ammount of bits to shift + /// The resulting number from the shift operation + public static long URShift(long number, int bits) + { + return (long) ((UInt64)number >> bits); + } +#endif + + /// + /// Reads a number of characters from the current source TextReader and writes + /// the data to the target array at the specified index. + /// + /// + /// The source TextReader to read from + /// Contains the array of characteres read from the source TextReader. + /// The starting index of the target array. + /// The maximum number of characters to read from the source TextReader. + /// + /// + /// The number of characters read. The number will be less than or equal to + /// count depending on the data available in the source TextReader. Returns -1 + /// if the end of the stream is reached. + /// + public static System.Int32 ReadInput(System.IO.TextReader sourceTextReader, byte[] target, int start, int count) + { + // Returns 0 bytes if not enough space in target + if (target.Length == 0) return 0; + + char[] charArray = new char[target.Length]; + int bytesRead = sourceTextReader.Read(charArray, start, count); + + // Returns -1 if EOF + if (bytesRead == 0) return -1; + + for (int index = start; index < start + bytesRead; index++) + target[index] = (byte)charArray[index]; + + return bytesRead; + } + + + internal static byte[] ToByteArray(System.String sourceString) + { + return System.Text.UTF8Encoding.UTF8.GetBytes(sourceString); + } + + + internal static char[] ToCharArray(byte[] byteArray) + { + return System.Text.UTF8Encoding.UTF8.GetChars(byteArray); + } + } + + internal static class InternalConstants + { + internal static readonly int MAX_BITS = 15; + internal static readonly int BL_CODES = 19; + internal static readonly int D_CODES = 30; + internal static readonly int LITERALS = 256; + internal static readonly int LENGTH_CODES = 29; + internal static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); + + // Bit length codes must not exceed MAX_BL_BITS bits + internal static readonly int MAX_BL_BITS = 7; + + // repeat previous bit length 3-6 times (2 bits of repeat count) + internal static readonly int REP_3_6 = 16; + + // repeat a zero length 3-10 times (3 bits of repeat count) + internal static readonly int REPZ_3_10 = 17; + + // repeat a zero length 11-138 times (7 bits of repeat count) + internal static readonly int REPZ_11_138 = 18; + + } + + internal sealed class StaticTree + { + internal static readonly short[] lengthAndLiteralsTreeCodes = new short[] { + 12, 8, 140, 8, 76, 8, 204, 8, 44, 8, 172, 8, 108, 8, 236, 8, + 28, 8, 156, 8, 92, 8, 220, 8, 60, 8, 188, 8, 124, 8, 252, 8, + 2, 8, 130, 8, 66, 8, 194, 8, 34, 8, 162, 8, 98, 8, 226, 8, + 18, 8, 146, 8, 82, 8, 210, 8, 50, 8, 178, 8, 114, 8, 242, 8, + 10, 8, 138, 8, 74, 8, 202, 8, 42, 8, 170, 8, 106, 8, 234, 8, + 26, 8, 154, 8, 90, 8, 218, 8, 58, 8, 186, 8, 122, 8, 250, 8, + 6, 8, 134, 8, 70, 8, 198, 8, 38, 8, 166, 8, 102, 8, 230, 8, + 22, 8, 150, 8, 86, 8, 214, 8, 54, 8, 182, 8, 118, 8, 246, 8, + 14, 8, 142, 8, 78, 8, 206, 8, 46, 8, 174, 8, 110, 8, 238, 8, + 30, 8, 158, 8, 94, 8, 222, 8, 62, 8, 190, 8, 126, 8, 254, 8, + 1, 8, 129, 8, 65, 8, 193, 8, 33, 8, 161, 8, 97, 8, 225, 8, + 17, 8, 145, 8, 81, 8, 209, 8, 49, 8, 177, 8, 113, 8, 241, 8, + 9, 8, 137, 8, 73, 8, 201, 8, 41, 8, 169, 8, 105, 8, 233, 8, + 25, 8, 153, 8, 89, 8, 217, 8, 57, 8, 185, 8, 121, 8, 249, 8, + 5, 8, 133, 8, 69, 8, 197, 8, 37, 8, 165, 8, 101, 8, 229, 8, + 21, 8, 149, 8, 85, 8, 213, 8, 53, 8, 181, 8, 117, 8, 245, 8, + 13, 8, 141, 8, 77, 8, 205, 8, 45, 8, 173, 8, 109, 8, 237, 8, + 29, 8, 157, 8, 93, 8, 221, 8, 61, 8, 189, 8, 125, 8, 253, 8, + 19, 9, 275, 9, 147, 9, 403, 9, 83, 9, 339, 9, 211, 9, 467, 9, + 51, 9, 307, 9, 179, 9, 435, 9, 115, 9, 371, 9, 243, 9, 499, 9, + 11, 9, 267, 9, 139, 9, 395, 9, 75, 9, 331, 9, 203, 9, 459, 9, + 43, 9, 299, 9, 171, 9, 427, 9, 107, 9, 363, 9, 235, 9, 491, 9, + 27, 9, 283, 9, 155, 9, 411, 9, 91, 9, 347, 9, 219, 9, 475, 9, + 59, 9, 315, 9, 187, 9, 443, 9, 123, 9, 379, 9, 251, 9, 507, 9, + 7, 9, 263, 9, 135, 9, 391, 9, 71, 9, 327, 9, 199, 9, 455, 9, + 39, 9, 295, 9, 167, 9, 423, 9, 103, 9, 359, 9, 231, 9, 487, 9, + 23, 9, 279, 9, 151, 9, 407, 9, 87, 9, 343, 9, 215, 9, 471, 9, + 55, 9, 311, 9, 183, 9, 439, 9, 119, 9, 375, 9, 247, 9, 503, 9, + 15, 9, 271, 9, 143, 9, 399, 9, 79, 9, 335, 9, 207, 9, 463, 9, + 47, 9, 303, 9, 175, 9, 431, 9, 111, 9, 367, 9, 239, 9, 495, 9, + 31, 9, 287, 9, 159, 9, 415, 9, 95, 9, 351, 9, 223, 9, 479, 9, + 63, 9, 319, 9, 191, 9, 447, 9, 127, 9, 383, 9, 255, 9, 511, 9, + 0, 7, 64, 7, 32, 7, 96, 7, 16, 7, 80, 7, 48, 7, 112, 7, + 8, 7, 72, 7, 40, 7, 104, 7, 24, 7, 88, 7, 56, 7, 120, 7, + 4, 7, 68, 7, 36, 7, 100, 7, 20, 7, 84, 7, 52, 7, 116, 7, + 3, 8, 131, 8, 67, 8, 195, 8, 35, 8, 163, 8, 99, 8, 227, 8 + }; + + internal static readonly short[] distTreeCodes = new short[] { + 0, 5, 16, 5, 8, 5, 24, 5, 4, 5, 20, 5, 12, 5, 28, 5, + 2, 5, 18, 5, 10, 5, 26, 5, 6, 5, 22, 5, 14, 5, 30, 5, + 1, 5, 17, 5, 9, 5, 25, 5, 5, 5, 21, 5, 13, 5, 29, 5, + 3, 5, 19, 5, 11, 5, 27, 5, 7, 5, 23, 5 }; + + internal static readonly StaticTree Literals; + internal static readonly StaticTree Distances; + internal static readonly StaticTree BitLengths; + + internal short[] treeCodes; // static tree or null + internal int[] extraBits; // extra bits for each code or null + internal int extraBase; // base index for extra_bits + internal int elems; // max number of elements in the tree + internal int maxLength; // max bit length for the codes + + private StaticTree(short[] treeCodes, int[] extraBits, int extraBase, int elems, int maxLength) + { + this.treeCodes = treeCodes; + this.extraBits = extraBits; + this.extraBase = extraBase; + this.elems = elems; + this.maxLength = maxLength; + } + static StaticTree() + { + Literals = new StaticTree(lengthAndLiteralsTreeCodes, Tree.ExtraLengthBits, InternalConstants.LITERALS + 1, InternalConstants.L_CODES, InternalConstants.MAX_BITS); + Distances = new StaticTree(distTreeCodes, Tree.ExtraDistanceBits, 0, InternalConstants.D_CODES, InternalConstants.MAX_BITS); + BitLengths = new StaticTree(null, Tree.extra_blbits, 0, InternalConstants.BL_CODES, InternalConstants.MAX_BL_BITS); + } + } + + + + /// + /// Computes an Adler-32 checksum. + /// + /// + /// The Adler checksum is similar to a CRC checksum, but faster to compute, though less + /// reliable. It is used in producing RFC1950 compressed streams. The Adler checksum + /// is a required part of the "ZLIB" standard. Applications will almost never need to + /// use this class directly. + /// + /// + /// + public sealed class Adler + { + // largest prime smaller than 65536 + private static readonly uint BASE = 65521; + // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 + private static readonly int NMAX = 5552; + + +#pragma warning disable 3001 +#pragma warning disable 3002 + + /// + /// Calculates the Adler32 checksum. + /// + /// + /// + /// This is used within ZLIB. You probably don't need to use this directly. + /// + /// + /// + /// To compute an Adler32 checksum on a byte array: + /// + /// var adler = Adler.Adler32(0, null, 0, 0); + /// adler = Adler.Adler32(adler, buffer, index, length); + /// + /// + public static uint Adler32(uint adler, byte[] buf, int index, int len) + { + if (buf == null) + return 1; + + uint s1 = (uint) (adler & 0xffff); + uint s2 = (uint) ((adler >> 16) & 0xffff); + + while (len > 0) + { + int k = len < NMAX ? len : NMAX; + len -= k; + while (k >= 16) + { + //s1 += (buf[index++] & 0xff); s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + s1 += buf[index++]; s2 += s1; + k -= 16; + } + if (k != 0) + { + do + { + s1 += buf[index++]; + s2 += s1; + } + while (--k != 0); + } + s1 %= BASE; + s2 %= BASE; + } + return (uint)((s2 << 16) | s1); + } +#pragma warning restore 3001 +#pragma warning restore 3002 + + } + +} \ No newline at end of file diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/ZlibBaseStream.cs b/ROMVault2/SupportedFiles/Zip/ZLib/ZlibBaseStream.cs new file mode 100644 index 0000000..83d72f5 --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/ZlibBaseStream.cs @@ -0,0 +1,627 @@ +// ZlibBaseStream.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// last saved (in emacs): +// Time-stamp: <2011-August-06 21:22:38> +// +// ------------------------------------------------------------------ +// +// This module defines the ZlibBaseStream class, which is an intnernal +// base class for DeflateStream, ZlibStream and GZipStream. +// +// ------------------------------------------------------------------ + +using System; +using System.IO; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + + internal enum ZlibStreamFlavor { ZLIB = 1950, DEFLATE = 1951, GZIP = 1952 } + + internal class ZlibBaseStream : System.IO.Stream + { + protected internal ZlibCodec _z = null; // deferred init... new ZlibCodec(); + + protected internal StreamMode _streamMode = StreamMode.Undefined; + protected internal FlushType _flushMode; + protected internal ZlibStreamFlavor _flavor; + protected internal CompressionMode _compressionMode; + protected internal CompressionLevel _level; + protected internal bool _leaveOpen; + protected internal byte[] _workingBuffer; + protected internal int _bufferSize = ZlibConstants.WorkingBufferSizeDefault; + protected internal byte[] _buf1 = new byte[1]; + + protected internal System.IO.Stream _stream; + protected internal CompressionStrategy Strategy = CompressionStrategy.Default; + + // workitem 7159 + CRC32 crc; + protected internal string _GzipFileName; + protected internal string _GzipComment; + protected internal DateTime _GzipMtime; + protected internal int _gzipHeaderByteCount; + + internal int Crc32 { get { if (crc == null) return 0; return crc.Crc32Result; } } + + public ZlibBaseStream(System.IO.Stream stream, + CompressionMode compressionMode, + CompressionLevel level, + ZlibStreamFlavor flavor, + bool leaveOpen) + : base() + { + this._flushMode = FlushType.None; + //this._workingBuffer = new byte[WORKING_BUFFER_SIZE_DEFAULT]; + this._stream = stream; + this._leaveOpen = leaveOpen; + this._compressionMode = compressionMode; + this._flavor = flavor; + this._level = level; + // workitem 7159 + if (flavor == ZlibStreamFlavor.GZIP) + { + this.crc = new CRC32(); + } + } + + + protected internal bool _wantCompress + { + get + { + return (this._compressionMode == CompressionMode.Compress); + } + } + + private ZlibCodec z + { + get + { + if (_z == null) + { + bool wantRfc1950Header = (this._flavor == ZlibStreamFlavor.ZLIB); + _z = new ZlibCodec(); + if (this._compressionMode == CompressionMode.Decompress) + { + _z.InitializeInflate(wantRfc1950Header); + } + else + { + _z.Strategy = Strategy; + _z.InitializeDeflate(this._level, wantRfc1950Header); + } + } + return _z; + } + } + + + + private byte[] workingBuffer + { + get + { + if (_workingBuffer == null) + _workingBuffer = new byte[_bufferSize]; + return _workingBuffer; + } + } + + + + public override void Write(System.Byte[] buffer, int offset, int count) + { + // workitem 7159 + // calculate the CRC on the unccompressed data (before writing) + if (crc != null) + crc.SlurpBlock(buffer, offset, count); + + if (_streamMode == StreamMode.Undefined) + _streamMode = StreamMode.Writer; + else if (_streamMode != StreamMode.Writer) + throw new ZlibException("Cannot Write after Reading."); + + if (count == 0) + return; + + // first reference of z property will initialize the private var _z + z.InputBuffer = buffer; + _z.NextIn = offset; + _z.AvailableBytesIn = count; + bool done = false; + do + { + _z.OutputBuffer = workingBuffer; + _z.NextOut = 0; + _z.AvailableBytesOut = _workingBuffer.Length; + int rc = (_wantCompress) + ? _z.Deflate(_flushMode) + : _z.Inflate(_flushMode); + if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) + throw new ZlibException((_wantCompress ? "de" : "in") + "flating: " + _z.Message); + + //if (_workingBuffer.Length - _z.AvailableBytesOut > 0) + _stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut); + + done = _z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0; + + // If GZIP and de-compress, we're done when 8 bytes remain. + if (_flavor == ZlibStreamFlavor.GZIP && !_wantCompress) + done = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0); + + } + while (!done); + } + + + + private void finish() + { + if (_z == null) return; + + if (_streamMode == StreamMode.Writer) + { + bool done = false; + do + { + _z.OutputBuffer = workingBuffer; + _z.NextOut = 0; + _z.AvailableBytesOut = _workingBuffer.Length; + int rc = (_wantCompress) + ? _z.Deflate(FlushType.Finish) + : _z.Inflate(FlushType.Finish); + + if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) + { + string verb = (_wantCompress ? "de" : "in") + "flating"; + if (_z.Message == null) + throw new ZlibException(String.Format("{0}: (rc = {1})", verb, rc)); + else + throw new ZlibException(verb + ": " + _z.Message); + } + + if (_workingBuffer.Length - _z.AvailableBytesOut > 0) + { + _stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut); + } + + done = _z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0; + // If GZIP and de-compress, we're done when 8 bytes remain. + if (_flavor == ZlibStreamFlavor.GZIP && !_wantCompress) + done = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0); + + } + while (!done); + + Flush(); + + // workitem 7159 + if (_flavor == ZlibStreamFlavor.GZIP) + { + if (_wantCompress) + { + // Emit the GZIP trailer: CRC32 and size mod 2^32 + int c1 = crc.Crc32Result; + _stream.Write(BitConverter.GetBytes(c1), 0, 4); + int c2 = (Int32)(crc.TotalBytesRead & 0x00000000FFFFFFFF); + _stream.Write(BitConverter.GetBytes(c2), 0, 4); + } + else + { + throw new ZlibException("Writing with decompression is not supported."); + } + } + } + // workitem 7159 + else if (_streamMode == StreamMode.Reader) + { + if (_flavor == ZlibStreamFlavor.GZIP) + { + if (!_wantCompress) + { + // workitem 8501: handle edge case (decompress empty stream) + if (_z.TotalBytesOut == 0L) + return; + + // Read and potentially verify the GZIP trailer: + // CRC32 and size mod 2^32 + byte[] trailer = new byte[8]; + + // workitems 8679 & 12554 + if (_z.AvailableBytesIn < 8) + { + // Make sure we have read to the end of the stream + Array.Copy(_z.InputBuffer, _z.NextIn, trailer, 0, _z.AvailableBytesIn); + int bytesNeeded = 8 - _z.AvailableBytesIn; + int bytesRead = _stream.Read(trailer, + _z.AvailableBytesIn, + bytesNeeded); + if (bytesNeeded != bytesRead) + { + throw new ZlibException(String.Format("Missing or incomplete GZIP trailer. Expected 8 bytes, got {0}.", + _z.AvailableBytesIn + bytesRead)); + } + } + else + { + Array.Copy(_z.InputBuffer, _z.NextIn, trailer, 0, trailer.Length); + } + + Int32 crc32_expected = BitConverter.ToInt32(trailer, 0); + Int32 crc32_actual = crc.Crc32Result; + Int32 isize_expected = BitConverter.ToInt32(trailer, 4); + Int32 isize_actual = (Int32)(_z.TotalBytesOut & 0x00000000FFFFFFFF); + + if (crc32_actual != crc32_expected) + throw new ZlibException(String.Format("Bad CRC32 in GZIP trailer. (actual({0:X8})!=expected({1:X8}))", crc32_actual, crc32_expected)); + + if (isize_actual != isize_expected) + throw new ZlibException(String.Format("Bad size in GZIP trailer. (actual({0})!=expected({1}))", isize_actual, isize_expected)); + + } + else + { + throw new ZlibException("Reading with compression is not supported."); + } + } + } + } + + + private void end() + { + if (z == null) + return; + if (_wantCompress) + { + _z.EndDeflate(); + } + else + { + _z.EndInflate(); + } + _z = null; + } + + + public override void Close() + { + if (_stream == null) return; + try + { + finish(); + } + finally + { + end(); + if (!_leaveOpen) _stream.Close(); + _stream = null; + } + } + + public override void Flush() + { + _stream.Flush(); + } + + public override System.Int64 Seek(System.Int64 offset, System.IO.SeekOrigin origin) + { + throw new NotImplementedException(); + //_outStream.Seek(offset, origin); + } + public override void SetLength(System.Int64 value) + { + _stream.SetLength(value); + } + + +#if NOT + public int Read() + { + if (Read(_buf1, 0, 1) == 0) + return 0; + // calculate CRC after reading + if (crc!=null) + crc.SlurpBlock(_buf1,0,1); + return (_buf1[0] & 0xFF); + } +#endif + + private bool nomoreinput = false; + + + + private string ReadZeroTerminatedString() + { + var list = new System.Collections.Generic.List(); + bool done = false; + do + { + // workitem 7740 + int n = _stream.Read(_buf1, 0, 1); + if (n != 1) + throw new ZlibException("Unexpected EOF reading GZIP header."); + else + { + if (_buf1[0] == 0) + done = true; + else + list.Add(_buf1[0]); + } + } while (!done); + byte[] a = list.ToArray(); + return GZipStream.iso8859dash1.GetString(a, 0, a.Length); + } + + + private int _ReadAndValidateGzipHeader() + { + int totalBytesRead = 0; + // read the header on the first read + byte[] header = new byte[10]; + int n = _stream.Read(header, 0, header.Length); + + // workitem 8501: handle edge case (decompress empty stream) + if (n == 0) + return 0; + + if (n != 10) + throw new ZlibException("Not a valid GZIP stream."); + + if (header[0] != 0x1F || header[1] != 0x8B || header[2] != 8) + throw new ZlibException("Bad GZIP header."); + + Int32 timet = BitConverter.ToInt32(header, 4); + _GzipMtime = GZipStream._unixEpoch.AddSeconds(timet); + totalBytesRead += n; + if ((header[3] & 0x04) == 0x04) + { + // read and discard extra field + n = _stream.Read(header, 0, 2); // 2-byte length field + totalBytesRead += n; + + Int16 extraLength = (Int16)(header[0] + header[1] * 256); + byte[] extra = new byte[extraLength]; + n = _stream.Read(extra, 0, extra.Length); + if (n != extraLength) + throw new ZlibException("Unexpected end-of-file reading GZIP header."); + totalBytesRead += n; + } + if ((header[3] & 0x08) == 0x08) + _GzipFileName = ReadZeroTerminatedString(); + if ((header[3] & 0x10) == 0x010) + _GzipComment = ReadZeroTerminatedString(); + if ((header[3] & 0x02) == 0x02) + Read(_buf1, 0, 1); // CRC16, ignore + + return totalBytesRead; + } + + + + public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, System.Int32 count) + { + // According to MS documentation, any implementation of the IO.Stream.Read function must: + // (a) throw an exception if offset & count reference an invalid part of the buffer, + // or if count < 0, or if buffer is null + // (b) return 0 only upon EOF, or if count = 0 + // (c) if not EOF, then return at least 1 byte, up to bytes + + if (_streamMode == StreamMode.Undefined) + { + if (!this._stream.CanRead) throw new ZlibException("The stream is not readable."); + // for the first read, set up some controls. + _streamMode = StreamMode.Reader; + // (The first reference to _z goes through the private accessor which + // may initialize it.) + z.AvailableBytesIn = 0; + if (_flavor == ZlibStreamFlavor.GZIP) + { + _gzipHeaderByteCount = _ReadAndValidateGzipHeader(); + // workitem 8501: handle edge case (decompress empty stream) + if (_gzipHeaderByteCount == 0) + return 0; + } + } + + if (_streamMode != StreamMode.Reader) + throw new ZlibException("Cannot Read after Writing."); + + if (count == 0) return 0; + if (nomoreinput && _wantCompress) return 0; // workitem 8557 + if (buffer == null) throw new ArgumentNullException("buffer"); + if (count < 0) throw new ArgumentOutOfRangeException("count"); + if (offset < buffer.GetLowerBound(0)) throw new ArgumentOutOfRangeException("offset"); + if ((offset + count) > buffer.GetLength(0)) throw new ArgumentOutOfRangeException("count"); + + int rc = 0; + + // set up the output of the deflate/inflate codec: + _z.OutputBuffer = buffer; + _z.NextOut = offset; + _z.AvailableBytesOut = count; + + // This is necessary in case _workingBuffer has been resized. (new byte[]) + // (The first reference to _workingBuffer goes through the private accessor which + // may initialize it.) + _z.InputBuffer = workingBuffer; + + do + { + // need data in _workingBuffer in order to deflate/inflate. Here, we check if we have any. + if ((_z.AvailableBytesIn == 0) && (!nomoreinput)) + { + // No data available, so try to Read data from the captive stream. + _z.NextIn = 0; + _z.AvailableBytesIn = _stream.Read(_workingBuffer, 0, _workingBuffer.Length); + if (_z.AvailableBytesIn == 0) + nomoreinput = true; + + } + // we have data in InputBuffer; now compress or decompress as appropriate + rc = (_wantCompress) + ? _z.Deflate(_flushMode) + : _z.Inflate(_flushMode); + + if (nomoreinput && (rc == ZlibConstants.Z_BUF_ERROR)) + return 0; + + if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) + throw new ZlibException(String.Format("{0}flating: rc={1} msg={2}", (_wantCompress ? "de" : "in"), rc, _z.Message)); + + if ((nomoreinput || rc == ZlibConstants.Z_STREAM_END) && (_z.AvailableBytesOut == count)) + break; // nothing more to read + } + //while (_z.AvailableBytesOut == count && rc == ZlibConstants.Z_OK); + while (_z.AvailableBytesOut > 0 && !nomoreinput && rc == ZlibConstants.Z_OK); + + + // workitem 8557 + // is there more room in output? + if (_z.AvailableBytesOut > 0) + { + if (rc == ZlibConstants.Z_OK && _z.AvailableBytesIn == 0) + { + // deferred + } + + // are we completely done reading? + if (nomoreinput) + { + // and in compression? + if (_wantCompress) + { + // no more input data available; therefore we flush to + // try to complete the read + rc = _z.Deflate(FlushType.Finish); + + if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) + throw new ZlibException(String.Format("Deflating: rc={0} msg={1}", rc, _z.Message)); + } + } + } + + + rc = (count - _z.AvailableBytesOut); + + // calculate CRC after reading + if (crc != null) + crc.SlurpBlock(buffer, offset, rc); + + return rc; + } + + + + public override System.Boolean CanRead + { + get { return this._stream.CanRead; } + } + + public override System.Boolean CanSeek + { + get { return this._stream.CanSeek; } + } + + public override System.Boolean CanWrite + { + get { return this._stream.CanWrite; } + } + + public override System.Int64 Length + { + get { return _stream.Length; } + } + + public override long Position + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + internal enum StreamMode + { + Writer, + Reader, + Undefined, + } + + + public static void CompressString(String s, Stream compressor) + { + byte[] uncompressed = System.Text.Encoding.UTF8.GetBytes(s); + using (compressor) + { + compressor.Write(uncompressed, 0, uncompressed.Length); + } + } + + public static void CompressBuffer(byte[] b, Stream compressor) + { + // workitem 8460 + using (compressor) + { + compressor.Write(b, 0, b.Length); + } + } + + public static String UncompressString(byte[] compressed, Stream decompressor) + { + // workitem 8460 + byte[] working = new byte[1024]; + var encoding = System.Text.Encoding.UTF8; + using (var output = new MemoryStream()) + { + using (decompressor) + { + int n; + while ((n = decompressor.Read(working, 0, working.Length)) != 0) + { + output.Write(working, 0, n); + } + } + + // reset to allow read from start + output.Seek(0, SeekOrigin.Begin); + var sr = new StreamReader(output, encoding); + return sr.ReadToEnd(); + } + } + + public static byte[] UncompressBuffer(byte[] compressed, Stream decompressor) + { + // workitem 8460 + byte[] working = new byte[1024]; + using (var output = new MemoryStream()) + { + using (decompressor) + { + int n; + while ((n = decompressor.Read(working, 0, working.Length)) != 0) + { + output.Write(working, 0, n); + } + } + return output.ToArray(); + } + } + + } + + +} diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/ZlibCodec.cs b/ROMVault2/SupportedFiles/Zip/ZLib/ZlibCodec.cs new file mode 100644 index 0000000..f11bcca --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/ZlibCodec.cs @@ -0,0 +1,717 @@ +// ZlibCodec.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// last saved (in emacs): +// Time-stamp: <2009-November-03 15:40:51> +// +// ------------------------------------------------------------------ +// +// This module defines a Codec for ZLIB compression and +// decompression. This code extends code that was based the jzlib +// implementation of zlib, but this code is completely novel. The codec +// class is new, and encapsulates some behaviors that are new, and some +// that were present in other classes in the jzlib code base. In +// keeping with the license for jzlib, the copyright to the jzlib code +// is included below. +// +// ------------------------------------------------------------------ +// +// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the distribution. +// +// 3. The names of the authors may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------- +// +// This program is based on zlib-1.1.3; credit to authors +// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +// and contributors of zlib. +// +// ----------------------------------------------------------------------- + + +using System; +using System.Runtime.InteropServices; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + /// + /// Encoder and Decoder for ZLIB and DEFLATE (IETF RFC1950 and RFC1951). + /// + /// + /// + /// This class compresses and decompresses data according to the Deflate algorithm + /// and optionally, the ZLIB format, as documented in RFC 1950 - ZLIB and RFC 1951 - DEFLATE. + /// + [Guid("ebc25cf6-9120-4283-b972-0e5520d0000D")] + [System.Runtime.InteropServices.ComVisible(true)] +#if !NETCF + [System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDispatch)] +#endif + sealed public class ZlibCodec + { + /// + /// The buffer from which data is taken. + /// + public byte[] InputBuffer; + + /// + /// An index into the InputBuffer array, indicating where to start reading. + /// + public int NextIn; + + /// + /// The number of bytes available in the InputBuffer, starting at NextIn. + /// + /// + /// Generally you should set this to InputBuffer.Length before the first Inflate() or Deflate() call. + /// The class will update this number as calls to Inflate/Deflate are made. + /// + public int AvailableBytesIn; + + /// + /// Total number of bytes read so far, through all calls to Inflate()/Deflate(). + /// + public long TotalBytesIn; + + /// + /// Buffer to store output data. + /// + public byte[] OutputBuffer; + + /// + /// An index into the OutputBuffer array, indicating where to start writing. + /// + public int NextOut; + + /// + /// The number of bytes available in the OutputBuffer, starting at NextOut. + /// + /// + /// Generally you should set this to OutputBuffer.Length before the first Inflate() or Deflate() call. + /// The class will update this number as calls to Inflate/Deflate are made. + /// + public int AvailableBytesOut; + + /// + /// Total number of bytes written to the output so far, through all calls to Inflate()/Deflate(). + /// + public long TotalBytesOut; + + /// + /// used for diagnostics, when something goes wrong! + /// + public System.String Message; + + internal DeflateManager dstate; + internal InflateManager istate; + + internal uint _Adler32; + + /// + /// The compression level to use in this codec. Useful only in compression mode. + /// + public CompressionLevel CompressLevel = CompressionLevel.Default; + + /// + /// The number of Window Bits to use. + /// + /// + /// This gauges the size of the sliding window, and hence the + /// compression effectiveness as well as memory consumption. It's best to just leave this + /// setting alone if you don't know what it is. The maximum value is 15 bits, which implies + /// a 32k window. + /// + public int WindowBits = ZlibConstants.WindowBitsDefault; + + /// + /// The compression strategy to use. + /// + /// + /// This is only effective in compression. The theory offered by ZLIB is that different + /// strategies could potentially produce significant differences in compression behavior + /// for different data sets. Unfortunately I don't have any good recommendations for how + /// to set it differently. When I tested changing the strategy I got minimally different + /// compression performance. It's best to leave this property alone if you don't have a + /// good feel for it. Or, you may want to produce a test harness that runs through the + /// different strategy options and evaluates them on different file types. If you do that, + /// let me know your results. + /// + public CompressionStrategy Strategy = CompressionStrategy.Default; + + + /// + /// The Adler32 checksum on the data transferred through the codec so far. You probably don't need to look at this. + /// + public int Adler32 { get { return (int)_Adler32; } } + + + /// + /// Create a ZlibCodec. + /// + /// + /// If you use this default constructor, you will later have to explicitly call + /// InitializeInflate() or InitializeDeflate() before using the ZlibCodec to compress + /// or decompress. + /// + public ZlibCodec() { } + + /// + /// Create a ZlibCodec that either compresses or decompresses. + /// + /// + /// Indicates whether the codec should compress (deflate) or decompress (inflate). + /// + public ZlibCodec(CompressionMode mode) + { + if (mode == CompressionMode.Compress) + { + int rc = InitializeDeflate(); + if (rc != ZlibConstants.Z_OK) throw new ZlibException("Cannot initialize for deflate."); + } + else if (mode == CompressionMode.Decompress) + { + int rc = InitializeInflate(); + if (rc != ZlibConstants.Z_OK) throw new ZlibException("Cannot initialize for inflate."); + } + else throw new ZlibException("Invalid ZlibStreamFlavor."); + } + + /// + /// Initialize the inflation state. + /// + /// + /// It is not necessary to call this before using the ZlibCodec to inflate data; + /// It is implicitly called when you call the constructor. + /// + /// Z_OK if everything goes well. + public int InitializeInflate() + { + return InitializeInflate(this.WindowBits); + } + + /// + /// Initialize the inflation state with an explicit flag to + /// govern the handling of RFC1950 header bytes. + /// + /// + /// + /// By default, the ZLIB header defined in RFC 1950 is expected. If + /// you want to read a zlib stream you should specify true for + /// expectRfc1950Header. If you have a deflate stream, you will want to specify + /// false. It is only necessary to invoke this initializer explicitly if you + /// want to specify false. + /// + /// + /// whether to expect an RFC1950 header byte + /// pair when reading the stream of data to be inflated. + /// + /// Z_OK if everything goes well. + public int InitializeInflate(bool expectRfc1950Header) + { + return InitializeInflate(this.WindowBits, expectRfc1950Header); + } + + /// + /// Initialize the ZlibCodec for inflation, with the specified number of window bits. + /// + /// The number of window bits to use. If you need to ask what that is, + /// then you shouldn't be calling this initializer. + /// Z_OK if all goes well. + public int InitializeInflate(int windowBits) + { + this.WindowBits = windowBits; + return InitializeInflate(windowBits, true); + } + + /// + /// Initialize the inflation state with an explicit flag to govern the handling of + /// RFC1950 header bytes. + /// + /// + /// + /// If you want to read a zlib stream you should specify true for + /// expectRfc1950Header. In this case, the library will expect to find a ZLIB + /// header, as defined in RFC + /// 1950, in the compressed stream. If you will be reading a DEFLATE or + /// GZIP stream, which does not have such a header, you will want to specify + /// false. + /// + /// + /// whether to expect an RFC1950 header byte pair when reading + /// the stream of data to be inflated. + /// The number of window bits to use. If you need to ask what that is, + /// then you shouldn't be calling this initializer. + /// Z_OK if everything goes well. + public int InitializeInflate(int windowBits, bool expectRfc1950Header) + { + this.WindowBits = windowBits; + if (dstate != null) throw new ZlibException("You may not call InitializeInflate() after calling InitializeDeflate()."); + istate = new InflateManager(expectRfc1950Header); + return istate.Initialize(this, windowBits); + } + + /// + /// Inflate the data in the InputBuffer, placing the result in the OutputBuffer. + /// + /// + /// You must have set InputBuffer and OutputBuffer, NextIn and NextOut, and AvailableBytesIn and + /// AvailableBytesOut before calling this method. + /// + /// + /// + /// private void InflateBuffer() + /// { + /// int bufferSize = 1024; + /// byte[] buffer = new byte[bufferSize]; + /// ZlibCodec decompressor = new ZlibCodec(); + /// + /// Console.WriteLine("\n============================================"); + /// Console.WriteLine("Size of Buffer to Inflate: {0} bytes.", CompressedBytes.Length); + /// MemoryStream ms = new MemoryStream(DecompressedBytes); + /// + /// int rc = decompressor.InitializeInflate(); + /// + /// decompressor.InputBuffer = CompressedBytes; + /// decompressor.NextIn = 0; + /// decompressor.AvailableBytesIn = CompressedBytes.Length; + /// + /// decompressor.OutputBuffer = buffer; + /// + /// // pass 1: inflate + /// do + /// { + /// decompressor.NextOut = 0; + /// decompressor.AvailableBytesOut = buffer.Length; + /// rc = decompressor.Inflate(FlushType.None); + /// + /// if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) + /// throw new Exception("inflating: " + decompressor.Message); + /// + /// ms.Write(decompressor.OutputBuffer, 0, buffer.Length - decompressor.AvailableBytesOut); + /// } + /// while (decompressor.AvailableBytesIn > 0 || decompressor.AvailableBytesOut == 0); + /// + /// // pass 2: finish and flush + /// do + /// { + /// decompressor.NextOut = 0; + /// decompressor.AvailableBytesOut = buffer.Length; + /// rc = decompressor.Inflate(FlushType.Finish); + /// + /// if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) + /// throw new Exception("inflating: " + decompressor.Message); + /// + /// if (buffer.Length - decompressor.AvailableBytesOut > 0) + /// ms.Write(buffer, 0, buffer.Length - decompressor.AvailableBytesOut); + /// } + /// while (decompressor.AvailableBytesIn > 0 || decompressor.AvailableBytesOut == 0); + /// + /// decompressor.EndInflate(); + /// } + /// + /// + /// + /// The flush to use when inflating. + /// Z_OK if everything goes well. + public int Inflate(FlushType flush) + { + if (istate == null) + throw new ZlibException("No Inflate State!"); + return istate.Inflate(flush); + } + + + /// + /// Ends an inflation session. + /// + /// + /// Call this after successively calling Inflate(). This will cause all buffers to be flushed. + /// After calling this you cannot call Inflate() without a intervening call to one of the + /// InitializeInflate() overloads. + /// + /// Z_OK if everything goes well. + public int EndInflate() + { + if (istate == null) + throw new ZlibException("No Inflate State!"); + int ret = istate.End(); + istate = null; + return ret; + } + + /// + /// I don't know what this does! + /// + /// Z_OK if everything goes well. + public int SyncInflate() + { + if (istate == null) + throw new ZlibException("No Inflate State!"); + return istate.Sync(); + } + + /// + /// Initialize the ZlibCodec for deflation operation. + /// + /// + /// The codec will use the MAX window bits and the default level of compression. + /// + /// + /// + /// int bufferSize = 40000; + /// byte[] CompressedBytes = new byte[bufferSize]; + /// byte[] DecompressedBytes = new byte[bufferSize]; + /// + /// ZlibCodec compressor = new ZlibCodec(); + /// + /// compressor.InitializeDeflate(CompressionLevel.Default); + /// + /// compressor.InputBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToCompress); + /// compressor.NextIn = 0; + /// compressor.AvailableBytesIn = compressor.InputBuffer.Length; + /// + /// compressor.OutputBuffer = CompressedBytes; + /// compressor.NextOut = 0; + /// compressor.AvailableBytesOut = CompressedBytes.Length; + /// + /// while (compressor.TotalBytesIn != TextToCompress.Length && compressor.TotalBytesOut < bufferSize) + /// { + /// compressor.Deflate(FlushType.None); + /// } + /// + /// while (true) + /// { + /// int rc= compressor.Deflate(FlushType.Finish); + /// if (rc == ZlibConstants.Z_STREAM_END) break; + /// } + /// + /// compressor.EndDeflate(); + /// + /// + /// + /// Z_OK if all goes well. You generally don't need to check the return code. + public int InitializeDeflate() + { + return _InternalInitializeDeflate(true); + } + + /// + /// Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel. + /// + /// + /// The codec will use the maximum window bits (15) and the specified + /// CompressionLevel. It will emit a ZLIB stream as it compresses. + /// + /// The compression level for the codec. + /// Z_OK if all goes well. + public int InitializeDeflate(CompressionLevel level) + { + this.CompressLevel = level; + return _InternalInitializeDeflate(true); + } + + + /// + /// Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel, + /// and the explicit flag governing whether to emit an RFC1950 header byte pair. + /// + /// + /// The codec will use the maximum window bits (15) and the specified CompressionLevel. + /// If you want to generate a zlib stream, you should specify true for + /// wantRfc1950Header. In this case, the library will emit a ZLIB + /// header, as defined in RFC + /// 1950, in the compressed stream. + /// + /// The compression level for the codec. + /// whether to emit an initial RFC1950 byte pair in the compressed stream. + /// Z_OK if all goes well. + public int InitializeDeflate(CompressionLevel level, bool wantRfc1950Header) + { + this.CompressLevel = level; + return _InternalInitializeDeflate(wantRfc1950Header); + } + + + /// + /// Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel, + /// and the specified number of window bits. + /// + /// + /// The codec will use the specified number of window bits and the specified CompressionLevel. + /// + /// The compression level for the codec. + /// the number of window bits to use. If you don't know what this means, don't use this method. + /// Z_OK if all goes well. + public int InitializeDeflate(CompressionLevel level, int bits) + { + this.CompressLevel = level; + this.WindowBits = bits; + return _InternalInitializeDeflate(true); + } + + /// + /// Initialize the ZlibCodec for deflation operation, using the specified + /// CompressionLevel, the specified number of window bits, and the explicit flag + /// governing whether to emit an RFC1950 header byte pair. + /// + /// + /// The compression level for the codec. + /// whether to emit an initial RFC1950 byte pair in the compressed stream. + /// the number of window bits to use. If you don't know what this means, don't use this method. + /// Z_OK if all goes well. + public int InitializeDeflate(CompressionLevel level, int bits, bool wantRfc1950Header) + { + this.CompressLevel = level; + this.WindowBits = bits; + return _InternalInitializeDeflate(wantRfc1950Header); + } + + private int _InternalInitializeDeflate(bool wantRfc1950Header) + { + if (istate != null) throw new ZlibException("You may not call InitializeDeflate() after calling InitializeInflate()."); + dstate = new DeflateManager(); + dstate.WantRfc1950HeaderBytes = wantRfc1950Header; + + return dstate.Initialize(this, this.CompressLevel, this.WindowBits, this.Strategy); + } + + /// + /// Deflate one batch of data. + /// + /// + /// You must have set InputBuffer and OutputBuffer before calling this method. + /// + /// + /// + /// private void DeflateBuffer(CompressionLevel level) + /// { + /// int bufferSize = 1024; + /// byte[] buffer = new byte[bufferSize]; + /// ZlibCodec compressor = new ZlibCodec(); + /// + /// Console.WriteLine("\n============================================"); + /// Console.WriteLine("Size of Buffer to Deflate: {0} bytes.", UncompressedBytes.Length); + /// MemoryStream ms = new MemoryStream(); + /// + /// int rc = compressor.InitializeDeflate(level); + /// + /// compressor.InputBuffer = UncompressedBytes; + /// compressor.NextIn = 0; + /// compressor.AvailableBytesIn = UncompressedBytes.Length; + /// + /// compressor.OutputBuffer = buffer; + /// + /// // pass 1: deflate + /// do + /// { + /// compressor.NextOut = 0; + /// compressor.AvailableBytesOut = buffer.Length; + /// rc = compressor.Deflate(FlushType.None); + /// + /// if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) + /// throw new Exception("deflating: " + compressor.Message); + /// + /// ms.Write(compressor.OutputBuffer, 0, buffer.Length - compressor.AvailableBytesOut); + /// } + /// while (compressor.AvailableBytesIn > 0 || compressor.AvailableBytesOut == 0); + /// + /// // pass 2: finish and flush + /// do + /// { + /// compressor.NextOut = 0; + /// compressor.AvailableBytesOut = buffer.Length; + /// rc = compressor.Deflate(FlushType.Finish); + /// + /// if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) + /// throw new Exception("deflating: " + compressor.Message); + /// + /// if (buffer.Length - compressor.AvailableBytesOut > 0) + /// ms.Write(buffer, 0, buffer.Length - compressor.AvailableBytesOut); + /// } + /// while (compressor.AvailableBytesIn > 0 || compressor.AvailableBytesOut == 0); + /// + /// compressor.EndDeflate(); + /// + /// ms.Seek(0, SeekOrigin.Begin); + /// CompressedBytes = new byte[compressor.TotalBytesOut]; + /// ms.Read(CompressedBytes, 0, CompressedBytes.Length); + /// } + /// + /// + /// whether to flush all data as you deflate. Generally you will want to + /// use Z_NO_FLUSH here, in a series of calls to Deflate(), and then call EndDeflate() to + /// flush everything. + /// + /// Z_OK if all goes well. + public int Deflate(FlushType flush) + { + if (dstate == null) + throw new ZlibException("No Deflate State!"); + return dstate.Deflate(flush); + } + + /// + /// End a deflation session. + /// + /// + /// Call this after making a series of one or more calls to Deflate(). All buffers are flushed. + /// + /// Z_OK if all goes well. + public int EndDeflate() + { + if (dstate == null) + throw new ZlibException("No Deflate State!"); + // TODO: dinoch Tue, 03 Nov 2009 15:39 (test this) + //int ret = dstate.End(); + dstate = null; + return ZlibConstants.Z_OK; //ret; + } + + /// + /// Reset a codec for another deflation session. + /// + /// + /// Call this to reset the deflation state. For example if a thread is deflating + /// non-consecutive blocks, you can call Reset() after the Deflate(Sync) of the first + /// block and before the next Deflate(None) of the second block. + /// + /// Z_OK if all goes well. + public void ResetDeflate() + { + if (dstate == null) + throw new ZlibException("No Deflate State!"); + dstate.Reset(); + } + + + /// + /// Set the CompressionStrategy and CompressionLevel for a deflation session. + /// + /// the level of compression to use. + /// the strategy to use for compression. + /// Z_OK if all goes well. + public int SetDeflateParams(CompressionLevel level, CompressionStrategy strategy) + { + if (dstate == null) + throw new ZlibException("No Deflate State!"); + return dstate.SetParams(level, strategy); + } + + + /// + /// Set the dictionary to be used for either Inflation or Deflation. + /// + /// The dictionary bytes to use. + /// Z_OK if all goes well. + public int SetDictionary(byte[] dictionary) + { + if (istate != null) + return istate.SetDictionary(dictionary); + + if (dstate != null) + return dstate.SetDictionary(dictionary); + + throw new ZlibException("No Inflate or Deflate state!"); + } + + // Flush as much pending output as possible. All deflate() output goes + // through this function so some applications may wish to modify it + // to avoid allocating a large strm->next_out buffer and copying into it. + // (See also read_buf()). + internal void flush_pending() + { + int len = dstate.pendingCount; + + if (len > AvailableBytesOut) + len = AvailableBytesOut; + if (len == 0) + return; + + if (dstate.pending.Length <= dstate.nextPending || + OutputBuffer.Length <= NextOut || + dstate.pending.Length < (dstate.nextPending + len) || + OutputBuffer.Length < (NextOut + len)) + { + throw new ZlibException(String.Format("Invalid State. (pending.Length={0}, pendingCount={1})", + dstate.pending.Length, dstate.pendingCount)); + } + + Array.Copy(dstate.pending, dstate.nextPending, OutputBuffer, NextOut, len); + + NextOut += len; + dstate.nextPending += len; + TotalBytesOut += len; + AvailableBytesOut -= len; + dstate.pendingCount -= len; + if (dstate.pendingCount == 0) + { + dstate.nextPending = 0; + } + } + + // Read a new buffer from the current input stream, update the adler32 + // and total number of bytes read. All deflate() input goes through + // this function so some applications may wish to modify it to avoid + // allocating a large strm->next_in buffer and copying from it. + // (See also flush_pending()). + internal int read_buf(byte[] buf, int start, int size) + { + int len = AvailableBytesIn; + + if (len > size) + len = size; + if (len == 0) + return 0; + + AvailableBytesIn -= len; + + if (dstate.WantRfc1950HeaderBytes) + { + _Adler32 = Adler.Adler32(_Adler32, InputBuffer, NextIn, len); + } + Array.Copy(InputBuffer, NextIn, buf, start, len); + NextIn += len; + TotalBytesIn += len; + return len; + } + + } +} \ No newline at end of file diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/ZlibConstants.cs b/ROMVault2/SupportedFiles/Zip/ZLib/ZlibConstants.cs new file mode 100644 index 0000000..964f977 --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/ZlibConstants.cs @@ -0,0 +1,126 @@ +// ZlibConstants.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// last saved (in emacs): +// Time-stamp: <2009-November-03 18:50:19> +// +// ------------------------------------------------------------------ +// +// This module defines constants used by the zlib class library. This +// code is derived from the jzlib implementation of zlib, but +// significantly modified. In keeping with the license for jzlib, the +// copyright to that code is included here. +// +// ------------------------------------------------------------------ +// +// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in +// the documentation and/or other materials provided with the distribution. +// +// 3. The names of the authors may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------- +// +// This program is based on zlib-1.1.3; credit to authors +// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) +// and contributors of zlib. +// +// ----------------------------------------------------------------------- + + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + /// + /// A bunch of constants used in the Zlib interface. + /// + public static class ZlibConstants + { + /// + /// The maximum number of window bits for the Deflate algorithm. + /// + public const int WindowBitsMax = 15; // 32K LZ77 window + + /// + /// The default number of window bits for the Deflate algorithm. + /// + public const int WindowBitsDefault = WindowBitsMax; + + /// + /// indicates everything is A-OK + /// + public const int Z_OK = 0; + + /// + /// Indicates that the last operation reached the end of the stream. + /// + public const int Z_STREAM_END = 1; + + /// + /// The operation ended in need of a dictionary. + /// + public const int Z_NEED_DICT = 2; + + /// + /// There was an error with the stream - not enough data, not open and readable, etc. + /// + public const int Z_STREAM_ERROR = -2; + + /// + /// There was an error with the data - not enough data, bad data, etc. + /// + public const int Z_DATA_ERROR = -3; + + /// + /// There was an error with the working buffer. + /// + public const int Z_BUF_ERROR = -5; + + /// + /// The size of the working buffer used in the ZlibCodec class. Defaults to 8192 bytes. + /// +#if NETCF + public const int WorkingBufferSizeDefault = 8192; +#else + public const int WorkingBufferSizeDefault = 16384; +#endif + /// + /// The minimum size of the working buffer used in the ZlibCodec class. Currently it is 128 bytes. + /// + public const int WorkingBufferSizeMin = 1024; + } + +} + diff --git a/ROMVault2/SupportedFiles/Zip/ZLib/ZlibStream.cs b/ROMVault2/SupportedFiles/Zip/ZLib/ZlibStream.cs new file mode 100644 index 0000000..1ce03e5 --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/ZLib/ZlibStream.cs @@ -0,0 +1,725 @@ +// ZlibStream.cs +// ------------------------------------------------------------------ +// +// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation. +// All rights reserved. +// +// This code module is part of DotNetZip, a zipfile class library. +// +// ------------------------------------------------------------------ +// +// This code is licensed under the Microsoft Public License. +// See the file License.txt for the license details. +// More info on: http://dotnetzip.codeplex.com +// +// ------------------------------------------------------------------ +// +// last saved (in emacs): +// Time-stamp: <2011-July-31 14:53:33> +// +// ------------------------------------------------------------------ +// +// This module defines the ZlibStream class, which is similar in idea to +// the System.IO.Compression.DeflateStream and +// System.IO.Compression.GZipStream classes in the .NET BCL. +// +// ------------------------------------------------------------------ + +using System; +using System.IO; + +namespace ROMVault2.SupportedFiles.Zip.ZLib +{ + + /// + /// Represents a Zlib stream for compression or decompression. + /// + /// + /// + /// + /// The ZlibStream is a Decorator on a . It adds ZLIB compression or decompression to any + /// stream. + /// + /// + /// Using this stream, applications can compress or decompress data via + /// stream Read() and Write() operations. Either compresssion or + /// decompression can occur through either reading or writing. The compression + /// format used is ZLIB, which is documented in IETF RFC 1950, "ZLIB Compressed + /// Data Format Specification version 3.3". This implementation of ZLIB always uses + /// DEFLATE as the compression method. (see IETF RFC 1951, "DEFLATE + /// Compressed Data Format Specification version 1.3.") + /// + /// + /// The ZLIB format allows for varying compression methods, window sizes, and dictionaries. + /// This implementation always uses the DEFLATE compression method, a preset dictionary, + /// and 15 window bits by default. + /// + /// + /// + /// This class is similar to , except that it adds the + /// RFC1950 header and trailer bytes to a compressed stream when compressing, or expects + /// the RFC1950 header and trailer bytes when decompressing. It is also similar to the + /// . + /// + /// + /// + /// + public class ZlibStream : System.IO.Stream + { + internal ZlibBaseStream _baseStream; + bool _disposed; + + /// + /// Create a ZlibStream using the specified CompressionMode. + /// + /// + /// + /// + /// When mode is CompressionMode.Compress, the ZlibStream + /// will use the default compression level. The "captive" stream will be + /// closed when the ZlibStream is closed. + /// + /// + /// + /// + /// + /// This example uses a ZlibStream to compress a file, and writes the + /// compressed data to another file. + /// + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (var raw = System.IO.File.Create(fileToCompress + ".zlib")) + /// { + /// using (Stream compressor = new ZlibStream(raw, CompressionMode.Compress)) + /// { + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n; + /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + /// { + /// compressor.Write(buffer, 0, n); + /// } + /// } + /// } + /// } + /// + /// + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using raw As FileStream = File.Create(fileToCompress & ".zlib") + /// Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress) + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// End Using + /// + /// + /// + /// The stream which will be read or written. + /// Indicates whether the ZlibStream will compress or decompress. + public ZlibStream(System.IO.Stream stream, CompressionMode mode) + : this(stream, mode, CompressionLevel.Default, false) + { + } + + /// + /// Create a ZlibStream using the specified CompressionMode and + /// the specified CompressionLevel. + /// + /// + /// + /// + /// + /// When mode is CompressionMode.Decompress, the level parameter is ignored. + /// The "captive" stream will be closed when the ZlibStream is closed. + /// + /// + /// + /// + /// + /// This example uses a ZlibStream to compress data from a file, and writes the + /// compressed data to another file. + /// + /// + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (var raw = System.IO.File.Create(fileToCompress + ".zlib")) + /// { + /// using (Stream compressor = new ZlibStream(raw, + /// CompressionMode.Compress, + /// CompressionLevel.BestCompression)) + /// { + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n; + /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + /// { + /// compressor.Write(buffer, 0, n); + /// } + /// } + /// } + /// } + /// + /// + /// + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using raw As FileStream = File.Create(fileToCompress & ".zlib") + /// Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// End Using + /// + /// + /// + /// The stream to be read or written while deflating or inflating. + /// Indicates whether the ZlibStream will compress or decompress. + /// A tuning knob to trade speed for effectiveness. + public ZlibStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level) + : this(stream, mode, level, false) + { + } + + /// + /// Create a ZlibStream using the specified CompressionMode, and + /// explicitly specify whether the captive stream should be left open after + /// Deflation or Inflation. + /// + /// + /// + /// + /// + /// When mode is CompressionMode.Compress, the ZlibStream will use + /// the default compression level. + /// + /// + /// + /// This constructor allows the application to request that the captive stream + /// remain open after the deflation or inflation occurs. By default, after + /// Close() is called on the stream, the captive stream is also + /// closed. In some cases this is not desired, for example if the stream is a + /// that will be re-read after + /// compression. Specify true for the parameter to leave the stream + /// open. + /// + /// + /// + /// See the other overloads of this constructor for example code. + /// + /// + /// + /// + /// The stream which will be read or written. This is called the + /// "captive" stream in other places in this documentation. + /// Indicates whether the ZlibStream will compress or decompress. + /// true if the application would like the stream to remain + /// open after inflation/deflation. + public ZlibStream(System.IO.Stream stream, CompressionMode mode, bool leaveOpen) + : this(stream, mode, CompressionLevel.Default, leaveOpen) + { + } + + /// + /// Create a ZlibStream using the specified CompressionMode + /// and the specified CompressionLevel, and explicitly specify + /// whether the stream should be left open after Deflation or Inflation. + /// + /// + /// + /// + /// + /// This constructor allows the application to request that the captive + /// stream remain open after the deflation or inflation occurs. By + /// default, after Close() is called on the stream, the captive + /// stream is also closed. In some cases this is not desired, for example + /// if the stream is a that will be + /// re-read after compression. Specify true for the parameter to leave the stream open. + /// + /// + /// + /// When mode is CompressionMode.Decompress, the level parameter is + /// ignored. + /// + /// + /// + /// + /// + /// + /// This example shows how to use a ZlibStream to compress the data from a file, + /// and store the result into another file. The filestream remains open to allow + /// additional data to be written to it. + /// + /// + /// using (var output = System.IO.File.Create(fileToCompress + ".zlib")) + /// { + /// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + /// { + /// using (Stream compressor = new ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, true)) + /// { + /// byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + /// int n; + /// while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + /// { + /// compressor.Write(buffer, 0, n); + /// } + /// } + /// } + /// // can write additional data to the output stream here + /// } + /// + /// + /// Using output As FileStream = File.Create(fileToCompress & ".zlib") + /// Using input As Stream = File.OpenRead(fileToCompress) + /// Using compressor As Stream = New ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, True) + /// Dim buffer As Byte() = New Byte(4096) {} + /// Dim n As Integer = -1 + /// Do While (n <> 0) + /// If (n > 0) Then + /// compressor.Write(buffer, 0, n) + /// End If + /// n = input.Read(buffer, 0, buffer.Length) + /// Loop + /// End Using + /// End Using + /// ' can write additional data to the output stream here. + /// End Using + /// + /// + /// + /// The stream which will be read or written. + /// + /// Indicates whether the ZlibStream will compress or decompress. + /// + /// + /// true if the application would like the stream to remain open after + /// inflation/deflation. + /// + /// + /// + /// A tuning knob to trade speed for effectiveness. This parameter is + /// effective only when mode is CompressionMode.Compress. + /// + public ZlibStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level, bool leaveOpen) + { + _baseStream = new ZlibBaseStream(stream, mode, level, ZlibStreamFlavor.ZLIB, leaveOpen); + } + + #region Zlib properties + + /// + /// This property sets the flush behavior on the stream. + /// Sorry, though, not sure exactly how to describe all the various settings. + /// + virtual public FlushType FlushMode + { + get { return (this._baseStream._flushMode); } + set + { + if (_disposed) throw new ObjectDisposedException("ZlibStream"); + this._baseStream._flushMode = value; + } + } + + /// + /// The size of the working buffer for the compression codec. + /// + /// + /// + /// + /// The working buffer is used for all stream operations. The default size is + /// 1024 bytes. The minimum size is 128 bytes. You may get better performance + /// with a larger buffer. Then again, you might not. You would have to test + /// it. + /// + /// + /// + /// Set this before the first call to Read() or Write() on the + /// stream. If you try to set it afterwards, it will throw. + /// + /// + public int BufferSize + { + get + { + return this._baseStream._bufferSize; + } + set + { + if (_disposed) throw new ObjectDisposedException("ZlibStream"); + if (this._baseStream._workingBuffer != null) + throw new ZlibException("The working buffer is already set."); + if (value < ZlibConstants.WorkingBufferSizeMin) + throw new ZlibException(String.Format("Don't be silly. {0} bytes?? Use a bigger buffer, at least {1}.", value, ZlibConstants.WorkingBufferSizeMin)); + this._baseStream._bufferSize = value; + } + } + + /// Returns the total number of bytes input so far. + virtual public long TotalIn + { + get { return this._baseStream._z.TotalBytesIn; } + } + + /// Returns the total number of bytes output so far. + virtual public long TotalOut + { + get { return this._baseStream._z.TotalBytesOut; } + } + + #endregion + + #region System.IO.Stream methods + + /// + /// Dispose the stream. + /// + /// + /// + /// This may or may not result in a Close() call on the captive + /// stream. See the constructors that have a leaveOpen parameter + /// for more information. + /// + /// + /// This method may be invoked in two distinct scenarios. If disposing + /// == true, the method has been called directly or indirectly by a + /// user's code, for example via the public Dispose() method. In this + /// case, both managed and unmanaged resources can be referenced and + /// disposed. If disposing == false, the method has been called by the + /// runtime from inside the object finalizer and this method should not + /// reference other objects; in that case only unmanaged resources must + /// be referenced or disposed. + /// + /// + /// + /// indicates whether the Dispose method was invoked by user code. + /// + protected override void Dispose(bool disposing) + { + try + { + if (!_disposed) + { + if (disposing && (this._baseStream != null)) + this._baseStream.Close(); + _disposed = true; + } + } + finally + { + base.Dispose(disposing); + } + } + + + /// + /// Indicates whether the stream can be read. + /// + /// + /// The return value depends on whether the captive stream supports reading. + /// + public override bool CanRead + { + get + { + if (_disposed) throw new ObjectDisposedException("ZlibStream"); + return _baseStream._stream.CanRead; + } + } + + /// + /// Indicates whether the stream supports Seek operations. + /// + /// + /// Always returns false. + /// + public override bool CanSeek + { + get { return false; } + } + + /// + /// Indicates whether the stream can be written. + /// + /// + /// The return value depends on whether the captive stream supports writing. + /// + public override bool CanWrite + { + get + { + if (_disposed) throw new ObjectDisposedException("ZlibStream"); + return _baseStream._stream.CanWrite; + } + } + + /// + /// Flush the stream. + /// + public override void Flush() + { + if (_disposed) throw new ObjectDisposedException("ZlibStream"); + _baseStream.Flush(); + } + + /// + /// Reading this property always throws a . + /// + public override long Length + { + get { throw new NotSupportedException(); } + } + + /// + /// The position of the stream pointer. + /// + /// + /// + /// Setting this property always throws a . Reading will return the total bytes + /// written out, if used in writing, or the total bytes read in, if used in + /// reading. The count may refer to compressed bytes or uncompressed bytes, + /// depending on how you've used the stream. + /// + public override long Position + { + get + { + if (this._baseStream._streamMode == ZlibBaseStream.StreamMode.Writer) + return this._baseStream._z.TotalBytesOut; + if (this._baseStream._streamMode == ZlibBaseStream.StreamMode.Reader) + return this._baseStream._z.TotalBytesIn; + return 0; + } + + set { throw new NotSupportedException(); } + } + + /// + /// Read data from the stream. + /// + /// + /// + /// + /// + /// If you wish to use the ZlibStream to compress data while reading, + /// you can create a ZlibStream with CompressionMode.Compress, + /// providing an uncompressed data stream. Then call Read() on that + /// ZlibStream, and the data read will be compressed. If you wish to + /// use the ZlibStream to decompress data while reading, you can create + /// a ZlibStream with CompressionMode.Decompress, providing a + /// readable compressed data stream. Then call Read() on that + /// ZlibStream, and the data will be decompressed as it is read. + /// + /// + /// + /// A ZlibStream can be used for Read() or Write(), but + /// not both. + /// + /// + /// + /// + /// + /// The buffer into which the read data should be placed. + /// + /// + /// the offset within that data array to put the first byte read. + /// + /// the number of bytes to read. + /// + /// the number of bytes read + public override int Read(byte[] buffer, int offset, int count) + { + if (_disposed) throw new ObjectDisposedException("ZlibStream"); + return _baseStream.Read(buffer, offset, count); + } + + /// + /// Calling this method always throws a . + /// + /// + /// The offset to seek to.... + /// IF THIS METHOD ACTUALLY DID ANYTHING. + /// + /// + /// The reference specifying how to apply the offset.... IF + /// THIS METHOD ACTUALLY DID ANYTHING. + /// + /// + /// nothing. This method always throws. + public override long Seek(long offset, System.IO.SeekOrigin origin) + { + throw new NotSupportedException(); + } + + /// + /// Calling this method always throws a . + /// + /// + /// The new value for the stream length.... IF + /// THIS METHOD ACTUALLY DID ANYTHING. + /// + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + /// + /// Write data to the stream. + /// + /// + /// + /// + /// + /// If you wish to use the ZlibStream to compress data while writing, + /// you can create a ZlibStream with CompressionMode.Compress, + /// and a writable output stream. Then call Write() on that + /// ZlibStream, providing uncompressed data as input. The data sent to + /// the output stream will be the compressed form of the data written. If you + /// wish to use the ZlibStream to decompress data while writing, you + /// can create a ZlibStream with CompressionMode.Decompress, and a + /// writable output stream. Then call Write() on that stream, + /// providing previously compressed data. The data sent to the output stream + /// will be the decompressed form of the data written. + /// + /// + /// + /// A ZlibStream can be used for Read() or Write(), but not both. + /// + /// + /// The buffer holding data to write to the stream. + /// the offset within that data array to find the first byte to write. + /// the number of bytes to write. + public override void Write(byte[] buffer, int offset, int count) + { + if (_disposed) throw new ObjectDisposedException("ZlibStream"); + _baseStream.Write(buffer, offset, count); + } + #endregion + + + /// + /// Compress a string into a byte array using ZLIB. + /// + /// + /// + /// Uncompress it with . + /// + /// + /// + /// + /// + /// + /// + /// A string to compress. The string will first be encoded + /// using UTF8, then compressed. + /// + /// + /// The string in compressed form + public static byte[] CompressString(String s) + { + using (var ms = new MemoryStream()) + { + Stream compressor = + new ZlibStream(ms, CompressionMode.Compress, CompressionLevel.BestCompression); + ZlibBaseStream.CompressString(s, compressor); + return ms.ToArray(); + } + } + + + /// + /// Compress a byte array into a new byte array using ZLIB. + /// + /// + /// + /// Uncompress it with . + /// + /// + /// + /// + /// + /// + /// A buffer to compress. + /// + /// + /// The data in compressed form + public static byte[] CompressBuffer(byte[] b) + { + using (var ms = new MemoryStream()) + { + Stream compressor = + new ZlibStream( ms, CompressionMode.Compress, CompressionLevel.BestCompression ); + + ZlibBaseStream.CompressBuffer(b, compressor); + return ms.ToArray(); + } + } + + + /// + /// Uncompress a ZLIB-compressed byte array into a single string. + /// + /// + /// + /// + /// + /// + /// A buffer containing ZLIB-compressed data. + /// + /// + /// The uncompressed string + public static String UncompressString(byte[] compressed) + { + using (var input = new MemoryStream(compressed)) + { + Stream decompressor = + new ZlibStream(input, CompressionMode.Decompress); + + return ZlibBaseStream.UncompressString(compressed, decompressor); + } + } + + + /// + /// Uncompress a ZLIB-compressed byte array into a byte array. + /// + /// + /// + /// + /// + /// + /// A buffer containing ZLIB-compressed data. + /// + /// + /// The data in uncompressed form + public static byte[] UncompressBuffer(byte[] compressed) + { + using (var input = new MemoryStream(compressed)) + { + Stream decompressor = + new ZlibStream( input, CompressionMode.Decompress ); + + return ZlibBaseStream.UncompressBuffer(compressed, decompressor); + } + } + + } + + +} \ No newline at end of file diff --git a/ROMVault2/SupportedFiles/Zip/zipFile.cs b/ROMVault2/SupportedFiles/Zip/zipFile.cs new file mode 100644 index 0000000..a31b24d --- /dev/null +++ b/ROMVault2/SupportedFiles/Zip/zipFile.cs @@ -0,0 +1,1549 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.Cryptography; +using System.Text; +using ROMVault2.SupportedFiles.Zip.ZLib; + +// UInt16 = ushort +// UInt32 = uint +// ULong = ulong + +namespace ROMVault2.SupportedFiles.Zip +{ + + public class ZipFile + { + const int Buffersize = 4096 * 128; + private static byte[] _buffer; + + private const uint LocalFileHeaderSignature = 0x04034b50; + private const uint CentralDirectoryHeaderSigniature = 0x02014b50; + private const uint EndOfCentralDirSignature = 0x06054b50; + private const uint Zip64EndOfCentralDirSignatue = 0x06064b50; + private const uint Zip64EndOfCentralDirectoryLocator = 0x07064b50; + + class LocalFile + { + private readonly Stream _zipFs; + public string FileName { get; private set; } + public ushort _generalPurposeBitFlag { get; private set; } + private ushort _compressionMethod; + private ushort _lastModFileTime; + private ushort _lastModFileDate; + public byte[] CRC { get; private set; } + private ulong _compressedSize; + public ulong UncompressedSize { get; private set; } + public ulong RelativeOffsetOfLocalHeader; // only in centeral directory + + private ulong _crc32Location; + private ulong _extraLocation; + private ulong _dataLocation; + + public bool Zip64 { get; private set; } + public bool TrrntZip { get; private set; } + + public byte[] sha1 { get; private set; } + public byte[] md5 { get; private set; } + + public ZipReturn FileStatus = ZipReturn.ZipUntested; + public LocalFile(Stream zipFs) + { + _zipFs = zipFs; + } + public LocalFile(Stream zipFs, string filename) + { + Zip64 = false; + _zipFs = zipFs; + _generalPurposeBitFlag = 2; // Maximum Compression Deflating + _compressionMethod = 8; // Compression Method Deflate + _lastModFileTime = 48128; + _lastModFileDate = 8600; + + FileName = filename; + } + + + public ZipReturn CenteralDirectoryRead() + { + try + { + BinaryReader br = new BinaryReader(_zipFs); + + uint thisSignature = br.ReadUInt32(); + if (thisSignature != CentralDirectoryHeaderSigniature) + return ZipReturn.ZipCenteralDirError; + + br.ReadUInt16(); // Version Made By + + br.ReadUInt16(); // Version Needed To Extract + + + _generalPurposeBitFlag = br.ReadUInt16(); + _compressionMethod = br.ReadUInt16(); + if (_compressionMethod != 8 && _compressionMethod != 0) + return ZipReturn.ZipUnsupportedCompression; + + _lastModFileTime = br.ReadUInt16(); + _lastModFileDate = br.ReadUInt16(); + CRC = ReadCRC(br); + + _compressedSize = br.ReadUInt32(); + UncompressedSize = br.ReadUInt32(); + + ushort fileNameLength = br.ReadUInt16(); + ushort extraFieldLength = br.ReadUInt16(); + ushort fileCommentLength = br.ReadUInt16(); + + br.ReadUInt16(); // diskNumberStart + br.ReadUInt16(); // internalFileAttributes + br.ReadUInt32(); // externalFileAttributes + + RelativeOffsetOfLocalHeader = br.ReadUInt32(); + + byte[] bFileName = br.ReadBytes(fileNameLength); + FileName = (_generalPurposeBitFlag & (1 << 11)) == 0 ? + GetString(bFileName) : + Encoding.UTF8.GetString(bFileName, 0, fileNameLength); + + Byte[] extraField = br.ReadBytes(extraFieldLength); + br.ReadBytes(fileCommentLength); // File Comments + + int pos = 0; + while (extraFieldLength > pos) + { + ushort type = BitConverter.ToUInt16(extraField, pos); + pos += 2; + ushort blockLength = BitConverter.ToUInt16(extraField, pos); + pos += 2; + switch (type) + { + case 0x0001: + Zip64 = true; + if (UncompressedSize == 0xffffffff) + { + UncompressedSize = BitConverter.ToUInt64(extraField, pos); + pos += 8; + } + if (_compressedSize == 0xffffffff) + { + _compressedSize = BitConverter.ToUInt64(extraField, pos); + pos += 8; + } + if (RelativeOffsetOfLocalHeader == 0xffffffff) + { + RelativeOffsetOfLocalHeader = BitConverter.ToUInt64(extraField, pos); + pos += 8; + } + break; + case 0x7075: + //byte version = extraField[pos]; + pos += 1; + uint nameCRC32 = BitConverter.ToUInt32(extraField, pos); + pos += 4; + + CRC32 crcTest = new CRC32(); + crcTest.SlurpBlock(bFileName, 0, fileNameLength); + uint fCRC = crcTest.Crc32ResultU; + + if (nameCRC32 != fCRC) return ZipReturn.ZipCenteralDirError; + + int charLen = blockLength - 5; + + FileName = Encoding.UTF8.GetString(extraField, pos, charLen); + pos += charLen; + + break; + default: + pos += blockLength; + break; + } + } + + return ZipReturn.ZipGood; + } + catch + { + return ZipReturn.ZipCenteralDirError; + } + + } + public void CenteralDirectoryWrite(Stream crcStream) + { + BinaryWriter bw = new BinaryWriter(crcStream); + + const uint header = 0x2014B50; + + List extraField = new List(); + + uint cdUncompressedSize; + if (UncompressedSize >= 0xffffffff) + { + Zip64 = true; + cdUncompressedSize = 0xffffffff; + extraField.AddRange(BitConverter.GetBytes(UncompressedSize)); + } + else + cdUncompressedSize = (uint)UncompressedSize; + + uint cdCompressedSize; + if (_compressedSize >= 0xffffffff) + { + Zip64 = true; + cdCompressedSize = 0xffffffff; + extraField.AddRange(BitConverter.GetBytes(_compressedSize)); + } + else + cdCompressedSize = (uint)_compressedSize; + + uint cdRelativeOffsetOfLocalHeader; + if (RelativeOffsetOfLocalHeader >= 0xffffffff) + { + Zip64 = true; + cdRelativeOffsetOfLocalHeader = 0xffffffff; + extraField.AddRange(BitConverter.GetBytes(RelativeOffsetOfLocalHeader)); + } + else + cdRelativeOffsetOfLocalHeader = (uint)RelativeOffsetOfLocalHeader; + + + if (extraField.Count > 0) + { + ushort exfl = (ushort)extraField.Count; + extraField.InsertRange(0, BitConverter.GetBytes((ushort)0x0001)); + extraField.InsertRange(2, BitConverter.GetBytes(exfl)); + } + ushort extraFieldLength = (ushort)extraField.Count; + + byte[] bFileName; + if (IsUnicode(FileName)) + { + _generalPurposeBitFlag |= 1 << 11; + bFileName = Encoding.UTF8.GetBytes(FileName); + } + else + bFileName = GetBytes(FileName); + ushort fileNameLength = (ushort)bFileName.Length; + + ushort versionNeededToExtract = (ushort)(Zip64 ? 45 : 20); + + bw.Write(header); + bw.Write((ushort)0); + bw.Write(versionNeededToExtract); + bw.Write(_generalPurposeBitFlag); + bw.Write(_compressionMethod); + bw.Write(_lastModFileTime); + bw.Write(_lastModFileDate); + bw.Write(CRC[3]); + bw.Write(CRC[2]); + bw.Write(CRC[1]); + bw.Write(CRC[0]); + bw.Write(cdCompressedSize); + bw.Write(cdUncompressedSize); + bw.Write(fileNameLength); + bw.Write(extraFieldLength); + bw.Write((ushort)0); // file comment length + bw.Write((ushort)0); // disk number start + bw.Write((ushort)0); // internal file attributes + bw.Write((uint)0); // external file attributes + bw.Write(cdRelativeOffsetOfLocalHeader); + + bw.Write(bFileName, 0, fileNameLength); + bw.Write(extraField.ToArray(), 0, extraFieldLength); + // No File Comment + } + + + public ZipReturn LocalFileHeaderRead() + { + try + { + TrrntZip = true; + + BinaryReader br = new BinaryReader(_zipFs); + + _zipFs.Position = (long)RelativeOffsetOfLocalHeader; + uint thisSignature = br.ReadUInt32(); + if (thisSignature != LocalFileHeaderSignature) + return ZipReturn.ZipLocalFileHeaderError; + + br.ReadUInt16(); // version needed to extract + ushort generalPurposeBitFlagLocal = br.ReadUInt16(); + if (generalPurposeBitFlagLocal != _generalPurposeBitFlag) TrrntZip = false; + + ushort tshort = br.ReadUInt16(); + if (tshort != _compressionMethod) return ZipReturn.ZipLocalFileHeaderError; + + tshort = br.ReadUInt16(); + if (tshort != _lastModFileTime) return ZipReturn.ZipLocalFileHeaderError; + + tshort = br.ReadUInt16(); + if (tshort != _lastModFileDate) return ZipReturn.ZipLocalFileHeaderError; + + byte[] tCRC = ReadCRC(br); + if (((_generalPurposeBitFlag & 8) == 0) && !ByteArrCompare(tCRC, CRC)) return ZipReturn.ZipLocalFileHeaderError; + + uint tCompressedSize = br.ReadUInt32(); + if (Zip64 && tCompressedSize != 0xffffffff && tCompressedSize != _compressedSize) // if Zip64 File then the compressedSize should be 0xffffffff + return ZipReturn.ZipLocalFileHeaderError; + if ((_generalPurposeBitFlag & 8) == 8 && tCompressedSize != 0) // if bit 4 set then no compressedSize is set yet + return ZipReturn.ZipLocalFileHeaderError; + if (!Zip64 && (_generalPurposeBitFlag & 8) != 8 && tCompressedSize != _compressedSize) // check the compressedSize + return ZipReturn.ZipLocalFileHeaderError; + + + + uint tUnCompressedSize = br.ReadUInt32(); + if (Zip64 && tUnCompressedSize != 0xffffffff && tUnCompressedSize != UncompressedSize) // if Zip64 File then the unCompressedSize should be 0xffffffff + return ZipReturn.ZipLocalFileHeaderError; + if ((_generalPurposeBitFlag & 8) == 8 && tUnCompressedSize != 0) // if bit 4 set then no unCompressedSize is set yet + return ZipReturn.ZipLocalFileHeaderError; + if (!Zip64 && (_generalPurposeBitFlag & 8) != 8 && tUnCompressedSize != UncompressedSize) // check the unCompressedSize + return ZipReturn.ZipLocalFileHeaderError; + + ushort fileNameLength = br.ReadUInt16(); + ushort extraFieldLength = br.ReadUInt16(); + + + byte[] bFileName = br.ReadBytes(fileNameLength); + string tFileName = (generalPurposeBitFlagLocal & (1 << 11)) == 0 ? + GetString(bFileName) : + Encoding.UTF8.GetString(bFileName, 0, fileNameLength); + + byte[] extraField = br.ReadBytes(extraFieldLength); + + + Zip64 = false; + int pos = 0; + while (extraFieldLength > pos) + { + ushort type = BitConverter.ToUInt16(extraField, pos); + pos += 2; + ushort blockLength = BitConverter.ToUInt16(extraField, pos); + pos += 2; + switch (type) + { + case 0x0001: + Zip64 = true; + if (tUnCompressedSize == 0xffffffff) + { + ulong tLong = BitConverter.ToUInt64(extraField, pos); + if (tLong != UncompressedSize) return ZipReturn.ZipLocalFileHeaderError; + pos += 8; + } + if (tCompressedSize == 0xffffffff) + { + ulong tLong = BitConverter.ToUInt64(extraField, pos); + if (tLong != _compressedSize) return ZipReturn.ZipLocalFileHeaderError; + pos += 8; + } + break; + case 0x7075: + //byte version = extraField[pos]; + pos += 1; + uint nameCRC32 = BitConverter.ToUInt32(extraField, pos); + pos += 4; + + CRC32 crcTest = new CRC32(); + crcTest.SlurpBlock(bFileName, 0, fileNameLength); + uint fCRC = crcTest.Crc32ResultU; + + if (nameCRC32 != fCRC) return ZipReturn.ZipLocalFileHeaderError; + + int charLen = blockLength - 5; + + tFileName = Encoding.UTF8.GetString(extraField, pos, charLen); + pos += charLen; + + break; + default: + pos += blockLength; + break; + } + } + + if (!CompareString(FileName, tFileName)) return ZipReturn.ZipLocalFileHeaderError; + + _dataLocation = (ulong)_zipFs.Position; + + if ((_generalPurposeBitFlag & 8) == 0) return ZipReturn.ZipGood; + + _zipFs.Position += (long)_compressedSize; + + tCRC = ReadCRC(br); + if (!ByteArrCompare(tCRC, new byte[] { 0x50, 0x4b, 0x07, 0x08 })) + tCRC = ReadCRC(br); + + if (!ByteArrCompare(tCRC, CRC)) return ZipReturn.ZipLocalFileHeaderError; + + uint tint = br.ReadUInt32(); + if (tint != _compressedSize) return ZipReturn.ZipLocalFileHeaderError; + + tint = br.ReadUInt32(); + if (tint != UncompressedSize) return ZipReturn.ZipLocalFileHeaderError; + + return ZipReturn.ZipGood; + } + catch + { + return ZipReturn.ZipLocalFileHeaderError; + } + + + } + public ZipReturn LocalFileHeaderReadQuick() + { + try + { + TrrntZip = true; + + BinaryReader br = new BinaryReader(_zipFs); + + _zipFs.Position = (long)RelativeOffsetOfLocalHeader; + uint thisSignature = br.ReadUInt32(); + if (thisSignature != LocalFileHeaderSignature) + return ZipReturn.ZipLocalFileHeaderError; + + br.ReadUInt16(); // version needed to extract + _generalPurposeBitFlag = br.ReadUInt16(); + if ((_generalPurposeBitFlag & 8) == 8) + return ZipReturn.ZipCannotFastOpen; + + _compressionMethod = br.ReadUInt16(); + _lastModFileTime = br.ReadUInt16(); + _lastModFileDate = br.ReadUInt16(); + CRC = ReadCRC(br); + _compressedSize = br.ReadUInt32(); + UncompressedSize = br.ReadUInt32(); + + ushort fileNameLength = br.ReadUInt16(); + ushort extraFieldLength = br.ReadUInt16(); + + byte[] bFileName = br.ReadBytes(fileNameLength); + + FileName = (_generalPurposeBitFlag & (1 << 11)) == 0 ? + GetString(bFileName) : + Encoding.UTF8.GetString(bFileName, 0, fileNameLength); + + byte[] extraField = br.ReadBytes(extraFieldLength); + + Zip64 = false; + int pos = 0; + while (extraFieldLength > pos) + { + ushort type = BitConverter.ToUInt16(extraField, pos); + pos += 2; + ushort blockLength = BitConverter.ToUInt16(extraField, pos); + pos += 2; + switch (type) + { + case 0x0001: + Zip64 = true; + if (UncompressedSize == 0xffffffff) + { + UncompressedSize = BitConverter.ToUInt64(extraField, pos); + pos += 8; + } + if (_compressedSize == 0xffffffff) + { + _compressedSize = BitConverter.ToUInt64(extraField, pos); + pos += 8; + } + break; + case 0x7075: + pos += 1; + uint nameCRC32 = BitConverter.ToUInt32(extraField, pos); + pos += 4; + + CRC32 crcTest = new CRC32(); + crcTest.SlurpBlock(bFileName, 0, fileNameLength); + uint fCRC = crcTest.Crc32ResultU; + + if (nameCRC32 != fCRC) return ZipReturn.ZipLocalFileHeaderError; + + int charLen = blockLength - 5; + + FileName = Encoding.UTF8.GetString(extraField, pos, charLen); + + pos += charLen; + + break; + default: + pos += blockLength; + break; + } + } + + _dataLocation = (ulong)_zipFs.Position; + return ZipReturn.ZipGood; + + } + catch + { + return ZipReturn.ZipLocalFileHeaderError; + } + + + } + + + + private void LocalFileHeaderWrite() + { + BinaryWriter bw = new BinaryWriter(_zipFs); + + List extraField = new List(); + Zip64 = UncompressedSize >= 0xffffffff; + + byte[] bFileName; + if (IsUnicode(FileName)) + { + _generalPurposeBitFlag |= 1 << 11; + bFileName = Encoding.UTF8.GetBytes(FileName); + } + else + bFileName = GetBytes(FileName); + + ushort versionNeededToExtract = (ushort)(Zip64 ? 45 : 20); + + RelativeOffsetOfLocalHeader = (ulong)_zipFs.Position; + const uint header = 0x4034B50; + bw.Write(header); + bw.Write(versionNeededToExtract); + bw.Write(_generalPurposeBitFlag); + bw.Write(_compressionMethod); + bw.Write(_lastModFileTime); + bw.Write(_lastModFileDate); + + _crc32Location = (ulong)_zipFs.Position; + + // these 3 values will be set correctly after the file data has been written + bw.Write(0xffffffff); + bw.Write(0xffffffff); + bw.Write(0xffffffff); + + + + if (Zip64) + { + for (int i = 0; i < 20; i++) + extraField.Add(0); + } + + ushort fileNameLength = (ushort)bFileName.Length; + bw.Write(fileNameLength); + + ushort extraFieldLength = (ushort)extraField.Count; + bw.Write(extraFieldLength); + + bw.Write(bFileName, 0, fileNameLength); + + _extraLocation = (ulong)_zipFs.Position; + bw.Write(extraField.ToArray(), 0, extraFieldLength); + + } + + + private Stream _readStream; + public ZipReturn LocalFileOpenReadStream(bool raw, out Stream stream, out ulong streamSize, out ushort compressionMethod) + { + streamSize = 0; + compressionMethod = _compressionMethod; + + _readStream = null; + _zipFs.Seek((long)_dataLocation, SeekOrigin.Begin); + + switch (_compressionMethod) + { + case 8: + if (raw) + { + _readStream = _zipFs; + streamSize = _compressedSize; + } + else + { + _readStream = new DeflateStream(_zipFs, CompressionMode.Decompress, true); + streamSize = UncompressedSize; + + } + break; + case 0: + _readStream = _zipFs; + streamSize = _compressedSize; // same as UncompressedSize + break; + } + stream = _readStream; + return stream == null ? ZipReturn.ZipErrorGettingDataStream : ZipReturn.ZipGood; + } + public ZipReturn LocalFileCloseReadStream() + { + DeflateStream dfStream = _readStream as DeflateStream; + if (dfStream != null) + { + dfStream.Close(); + dfStream.Dispose(); + } + return ZipReturn.ZipGood; + } + + private Stream _writeStream; + public ZipReturn LocalFileOpenWriteStream(bool raw, bool trrntZip, ulong uncompressedSize, ushort compressionMethod, out Stream stream) + { + UncompressedSize = uncompressedSize; + _compressionMethod = compressionMethod; + + LocalFileHeaderWrite(); + _dataLocation = (ulong)_zipFs.Position; + + if (raw) + { + _writeStream = _zipFs; + TrrntZip = trrntZip; + } + else + { + if (compressionMethod == 0) + { + _writeStream = _zipFs; + TrrntZip = false; + } + else + { + _writeStream = new DeflateStream(_zipFs, CompressionMode.Compress, CompressionLevel.BestCompression, true); + TrrntZip = true; + } + } + + stream = _writeStream; + return stream == null ? ZipReturn.ZipErrorGettingDataStream : ZipReturn.ZipGood; + } + public ZipReturn LocalFileCloseWriteStream(byte[] crc32) + { + DeflateStream dfStream = _writeStream as DeflateStream; + if (dfStream != null) + { + dfStream.Flush(); + dfStream.Close(); + dfStream.Dispose(); + } + + _compressedSize = (ulong)_zipFs.Position - _dataLocation; + + if (_compressedSize == 0 && UncompressedSize == 0) + { + LocalFileAddDirectory(); + _compressedSize = (ulong)_zipFs.Position - _dataLocation; + } + + CRC = crc32; + WriteCompressedSize(); + + return ZipReturn.ZipGood; + } + private void WriteCompressedSize() + { + long posNow = _zipFs.Position; + _zipFs.Seek((long)_crc32Location, SeekOrigin.Begin); + BinaryWriter bw = new BinaryWriter(_zipFs); + + uint tCompressedSize; + uint tUncompressedSize; + if (Zip64) + { + tCompressedSize = 0xffffffff; + tUncompressedSize = 0xffffffff; + } + else + { + tCompressedSize = (uint)_compressedSize; + tUncompressedSize = (uint)UncompressedSize; + } + + bw.Write(CRC[3]); + bw.Write(CRC[2]); + bw.Write(CRC[1]); + bw.Write(CRC[0]); + bw.Write(tCompressedSize); + bw.Write(tUncompressedSize); + + // also need to write extradata + if (Zip64) + { + _zipFs.Seek((long)_extraLocation, SeekOrigin.Begin); + bw.Write((ushort)0x0001); // id + bw.Write((ushort)16); // data length + bw.Write(UncompressedSize); + bw.Write(_compressedSize); + } + + _zipFs.Seek(posNow, SeekOrigin.Begin); + + } + + + public void LocalFileCheck() + { + if (FileStatus != ZipReturn.ZipUntested) return; + + try + { + Stream sInput = null; + _zipFs.Seek((long)_dataLocation, SeekOrigin.Begin); + + switch (_compressionMethod) + { + case 8: + sInput = new DeflateStream(_zipFs, CompressionMode.Decompress, true); + break; + case 0: + sInput = _zipFs; + break; + } + + if (sInput == null) + { + FileStatus = ZipReturn.ZipErrorGettingDataStream; + return; + } + + CRC32Hash crc32 = new CRC32Hash(); + MD5 lmd5 = System.Security.Cryptography.MD5.Create(); + SHA1 lsha1 = System.Security.Cryptography.SHA1.Create(); + + ulong sizetogo = UncompressedSize; + if (_buffer == null) + _buffer = new byte[Buffersize]; + + while (sizetogo > 0) + { + int sizenow = sizetogo > Buffersize ? Buffersize : (int)sizetogo; + sInput.Read(_buffer, 0, sizenow); + + crc32.TransformBlock(_buffer, 0, sizenow, null, 0); + lmd5.TransformBlock(_buffer, 0, sizenow, null, 0); + lsha1.TransformBlock(_buffer, 0, sizenow, null, 0); + + sizetogo = sizetogo - (ulong)sizenow; + } + + crc32.TransformFinalBlock(_buffer, 0, 0); + lmd5.TransformFinalBlock(_buffer, 0, 0); + lsha1.TransformFinalBlock(_buffer, 0, 0); + + byte[] testcrc = crc32.Hash; + md5 = lmd5.Hash; + sha1 = lsha1.Hash; + + if (_compressionMethod == 8) + { + sInput.Close(); + sInput.Dispose(); + } + + FileStatus = ByteArrCompare(CRC, testcrc) ? ZipReturn.ZipGood : ZipReturn.ZipCRCDecodeError; + } + catch + { + FileStatus = ZipReturn.ZipDecodeError; + } + } + + + public void LocalFileAddDirectory() + { + Stream ds = _zipFs; + ds.WriteByte(03); + ds.WriteByte(00); + } + + + + public ulong LocalFilePos + { + get { return RelativeOffsetOfLocalHeader; } + set { RelativeOffsetOfLocalHeader = value; } + } + private static byte[] ReadCRC(BinaryReader br) + { + byte[] tCRC = new byte[4]; + tCRC[3] = br.ReadByte(); + tCRC[2] = br.ReadByte(); + tCRC[1] = br.ReadByte(); + tCRC[0] = br.ReadByte(); + return tCRC; + } + + + } + + + private IO.FileInfo _zipFileInfo; + + public string ZipFilename + { + get { return _zipFileInfo != null ? _zipFileInfo.FullName : ""; } + } + public long TimeStamp + { + get { return _zipFileInfo != null ? _zipFileInfo.LastWriteTime : 0; } + } + + private ulong _centerDirStart; + private ulong _centerDirSize; + private ulong _endOfCenterDir64; + + byte[] _fileComment; + private Stream _zipFs; + + private uint _localFilesCount; + private readonly List _localFiles = new List(); + + private ZipStatus _pZipStatus; + private bool _zip64; + public ZipOpenType ZipOpen; + + public ZipStatus ZipStatus { get { return _pZipStatus; } } + + public int LocalFilesCount() { return _localFiles.Count; } + + public string Filename(int i) { return _localFiles[i].FileName; } + public ulong UncompressedSize(int i) { return _localFiles[i].UncompressedSize; } + public ulong? LocalHeader(int i) + { + return ((_localFiles[i]._generalPurposeBitFlag & 8) == 0) ? (ulong?)_localFiles[i].RelativeOffsetOfLocalHeader : null; + } + public ZipReturn FileStatus(int i) { return _localFiles[i].FileStatus; } + public byte[] CRC32(int i) { return _localFiles[i].CRC; } + public byte[] MD5(int i) { return _localFiles[i].md5; } + public byte[] SHA1(int i) { return _localFiles[i].sha1; } + + + ~ZipFile() + { + if (_zipFs != null) + { + _zipFs.Close(); + _zipFs.Dispose(); + } + } + + + private ZipReturn FindEndOfCentralDirSignature() + { + long fileSize = _zipFs.Length; + long maxBackSearch = 0xffff; + + if (_zipFs.Length < maxBackSearch) + maxBackSearch = fileSize; + + const long buffSize = 0x400; + + byte[] buffer = new byte[buffSize + 4]; + + long backPosition = 4; + while (backPosition < maxBackSearch) + { + backPosition += buffSize; + if (backPosition > maxBackSearch) backPosition = maxBackSearch; + + long readSize = backPosition > (buffSize + 4) ? (buffSize + 4) : backPosition; + + _zipFs.Position = fileSize - backPosition; + + _zipFs.Read(buffer, 0, (int)readSize); + + + for (long i = readSize - 4; i >= 0; i--) + { + if ((buffer[i] != 0x50) || (buffer[i + 1] != 0x4b) || (buffer[i + 2] != 0x05) || (buffer[i + 3] != 0x06)) continue; + + _zipFs.Position = (fileSize - backPosition) + i; + return ZipReturn.ZipGood; + } + } + return ZipReturn.ZipCenteralDirError; + } + + + private ZipReturn EndOfCentralDirRead() + { + BinaryReader zipBr = new BinaryReader(_zipFs); + + uint thisSignature = zipBr.ReadUInt32(); + if (thisSignature != EndOfCentralDirSignature) + return ZipReturn.ZipEndOfCentralDirectoryError; + + ushort tushort = zipBr.ReadUInt16(); // NumberOfThisDisk + if (tushort != 0) return ZipReturn.ZipEndOfCentralDirectoryError; + + tushort = zipBr.ReadUInt16(); // NumberOfThisDiskCenterDir + if (tushort != 0) return ZipReturn.ZipEndOfCentralDirectoryError; + + _localFilesCount = zipBr.ReadUInt16(); // TotalNumberOfEnteriesDisk + + tushort = zipBr.ReadUInt16(); // TotalNumber of enteries in the central directory + if (tushort != _localFilesCount) return ZipReturn.ZipEndOfCentralDirectoryError; + + _centerDirSize = zipBr.ReadUInt32(); // SizeOfCenteralDir + _centerDirStart = zipBr.ReadUInt32(); // Offset + + ushort zipFileCommentLength = zipBr.ReadUInt16(); + + _fileComment = zipBr.ReadBytes(zipFileCommentLength); + + if (_zipFs.Position != _zipFs.Length) _pZipStatus |= ZipStatus.ExtraData; + + return ZipReturn.ZipGood; + } + private void EndOfCentralDirWrite() + { + + BinaryWriter bw = new BinaryWriter(_zipFs); + bw.Write(EndOfCentralDirSignature); + bw.Write((ushort)0); // NumberOfThisDisk + bw.Write((ushort)0); // NumberOfThisDiskCenterDir + bw.Write((ushort)(_localFiles.Count >= 0xffff ? 0xffff : _localFiles.Count)); // TotalNumberOfEnteriesDisk + bw.Write((ushort)(_localFiles.Count >= 0xffff ? 0xffff : _localFiles.Count)); // TotalNumber of enteries in the central directory + bw.Write((uint)(_centerDirSize >= 0xffffffff ? 0xffffffff : _centerDirSize)); + bw.Write((uint)(_centerDirStart >= 0xffffffff ? 0xffffffff : _centerDirStart)); + bw.Write((ushort)_fileComment.Length); + bw.Write(_fileComment, 0, _fileComment.Length); + } + + private ZipReturn Zip64EndOfCentralDirRead() + { + _zip64 = true; + BinaryReader zipBr = new BinaryReader(_zipFs); + + uint thisSignature = zipBr.ReadUInt32(); + if (thisSignature != Zip64EndOfCentralDirSignatue) + return ZipReturn.ZipEndOfCentralDirectoryError; + + ulong tulong = zipBr.ReadUInt64(); // Size of zip64 end of central directory record + if (tulong != 44) return ZipReturn.Zip64EndOfCentralDirError; + + zipBr.ReadUInt16(); // version made by + + ushort tushort = zipBr.ReadUInt16(); // version needed to extract + if (tushort != 45) return ZipReturn.Zip64EndOfCentralDirError; + + uint tuint = zipBr.ReadUInt32(); // number of this disk + if (tuint != 0) return ZipReturn.Zip64EndOfCentralDirError; + + tuint = zipBr.ReadUInt32(); // number of the disk with the start of the central directory + if (tuint != 0) return ZipReturn.Zip64EndOfCentralDirError; + + _localFilesCount = (uint)zipBr.ReadUInt64(); // total number of entries in the central directory on this disk + + tulong = zipBr.ReadUInt64(); // total number of entries in the central directory + if (tulong != _localFilesCount) return ZipReturn.Zip64EndOfCentralDirError; + + _centerDirSize = zipBr.ReadUInt64(); // size of central directory + + _centerDirStart = zipBr.ReadUInt64(); // offset of start of central directory with respect to the starting disk number + + return ZipReturn.ZipGood; + } + + private void Zip64EndOfCentralDirWrite() + { + BinaryWriter bw = new BinaryWriter(_zipFs); + bw.Write(Zip64EndOfCentralDirSignatue); + bw.Write((ulong)44); // Size of zip64 end of central directory record + bw.Write((ushort)45); // version made by + bw.Write((ushort)45); // version needed to extract + bw.Write((uint)0); // number of this disk + bw.Write((uint)0); // number of the disk with the start of the central directroy + bw.Write((ulong)_localFiles.Count); // total number of entries in the central directory on this disk + bw.Write((ulong)_localFiles.Count); // total number of entries in the central directory + bw.Write(_centerDirSize); // size of central directory + bw.Write(_centerDirStart); // offset of start of central directory with respect to the starting disk number + } + + private ZipReturn Zip64EndOfCentralDirectoryLocatorRead() + { + _zip64 = true; + BinaryReader zipBr = new BinaryReader(_zipFs); + + uint thisSignature = zipBr.ReadUInt32(); + if (thisSignature != Zip64EndOfCentralDirectoryLocator) + return ZipReturn.ZipEndOfCentralDirectoryError; + + uint tuint = zipBr.ReadUInt32(); // number of the disk with the start of the zip64 end of centeral directory + if (tuint != 0) return ZipReturn.Zip64EndOfCentralDirectoryLocatorError; + + _endOfCenterDir64 = zipBr.ReadUInt64(); // relative offset of the zip64 end of central directroy record + + tuint = zipBr.ReadUInt32(); // total number of disks + if (tuint != 1) return ZipReturn.Zip64EndOfCentralDirectoryLocatorError; + + return ZipReturn.ZipGood; + } + private void Zip64EndOfCentralDirectoryLocatorWrite() + { + BinaryWriter bw = new BinaryWriter(_zipFs); + bw.Write(Zip64EndOfCentralDirectoryLocator); + bw.Write((uint)0); // number of the disk with the start of the zip64 end of centeral directory + bw.Write(_endOfCenterDir64); // relative offset of the zip64 end of central directroy record + bw.Write((uint)1); // total number of disks + } + + + + public ZipReturn ZipFileOpen(string newFilename, long timestamp, bool readHeaders) + { + ZipFileClose(); + _pZipStatus = ZipStatus.None; + _zip64 = false; + _centerDirStart = 0; + _centerDirSize = 0; + _zipFileInfo = null; + + try + { + if (!IO.File.Exists(newFilename)) + { + ZipFileClose(); + return ZipReturn.ZipErrorFileNotFound; + } + _zipFileInfo = new IO.FileInfo(newFilename); + if (_zipFileInfo.LastWriteTime != timestamp) + { + ZipFileClose(); + return ZipReturn.ZipErrorTimeStamp; + } + int errorCode = IO.FileStream.OpenFileRead(newFilename, out _zipFs); + if (errorCode != 0) + { + ZipFileClose(); + if (errorCode == 32) + return ZipReturn.ZipFileLocked; + return ZipReturn.ZipErrorOpeningFile; + } + } + catch (PathTooLongException) + { + ZipFileClose(); + return ZipReturn.ZipFileNameToLong; + } + catch (IOException) + { + ZipFileClose(); + return ZipReturn.ZipErrorOpeningFile; + } + ZipOpen = ZipOpenType.OpenRead; + + if (!readHeaders) + return ZipReturn.ZipGood; + + + try + { + ZipReturn zRet = FindEndOfCentralDirSignature(); + if (zRet != ZipReturn.ZipGood) + { + ZipFileClose(); + return zRet; + } + + long endOfCentralDir = _zipFs.Position; + zRet = EndOfCentralDirRead(); + if (zRet != ZipReturn.ZipGood) + { + ZipFileClose(); + return zRet; + } + + // check if this is a ZIP64 zip and if it is read the Zip64 End Of Central Dir Info + if (_centerDirStart == 0xffffffff || _centerDirSize == 0xffffffff || _localFilesCount == 0xffff) + { + _zip64 = true; + _zipFs.Position = endOfCentralDir - 20; + zRet = Zip64EndOfCentralDirectoryLocatorRead(); + if (zRet != ZipReturn.ZipGood) + { + ZipFileClose(); + return zRet; + } + _zipFs.Position = (long)_endOfCenterDir64; + zRet = Zip64EndOfCentralDirRead(); + if (zRet != ZipReturn.ZipGood) + { + ZipFileClose(); + return zRet; + } + } + + bool trrntzip = false; + + // check if the ZIP has a valid TorrentZip file comment + if (_fileComment.Length == 22) + { + if (GetString(_fileComment).Substring(0, 14) == "TORRENTZIPPED-") + { + CrcCalculatorStream crcCs = new CrcCalculatorStream(_zipFs, true); + byte[] buffer = new byte[_centerDirSize]; + _zipFs.Position = (long)_centerDirStart; + crcCs.Read(buffer, 0, (int)_centerDirSize); + crcCs.Flush(); + crcCs.Close(); + + uint r = (uint)crcCs.Crc; + crcCs.Dispose(); + + string tcrc = GetString(_fileComment).Substring(14, 8); + string zcrc = r.ToString("X8"); + if (String.Compare(tcrc, zcrc, StringComparison.Ordinal) == 0) + trrntzip = true; + + } + } + + + // now read the central directory + _zipFs.Position = (long)_centerDirStart; + + _localFiles.Clear(); + _localFiles.Capacity = (int)_localFilesCount; + for (int i = 0; i < _localFilesCount; i++) + { + LocalFile lc = new LocalFile(_zipFs); + zRet = lc.CenteralDirectoryRead(); + if (zRet != ZipReturn.ZipGood) + { + ZipFileClose(); + return zRet; + } + _zip64 |= lc.Zip64; + _localFiles.Add(lc); + } + + for (int i = 0; i < _localFilesCount; i++) + { + zRet = _localFiles[i].LocalFileHeaderRead(); + if (zRet != ZipReturn.ZipGood) + { + ZipFileClose(); + return zRet; + } + trrntzip &= _localFiles[i].TrrntZip; + } + + // check trrntzip file order + if (trrntzip) + for (int i = 0; i < _localFilesCount - 1; i++) + { + if (TrrntZipStringCompare(_localFiles[i].FileName, _localFiles[i + 1].FileName) < 0) continue; + trrntzip = false; + break; + } + + // check trrntzip directories + if (trrntzip) + for (int i = 0; i < _localFilesCount - 1; i++) + { + // see if we found a directory + string filename0 = _localFiles[i].FileName; + if (filename0.Substring(filename0.Length - 1, 1) != "/") continue; + + // see if the next file is in that directory + string filename1 = _localFiles[i + 1].FileName; + if (filename1.Length <= filename0.Length) continue; + if (TrrntZipStringCompare(filename0, filename1.Substring(0, filename0.Length)) != 0) continue; + + // if we found a file in the directory then we do not need the directory entry + trrntzip = false; + break; + } + + if (trrntzip) + _pZipStatus |= ZipStatus.TrrntZip; + + return ZipReturn.ZipGood; + } + catch + { + ZipFileClose(); + return ZipReturn.ZipErrorReadingFile; + } + + } + + public ZipReturn ZipFileCreate(string newFilename) + { + if (ZipOpen != ZipOpenType.Closed) + return ZipReturn.ZipFileAlreadyOpen; + + CreateDirForFile(newFilename); + _zipFileInfo = new IO.FileInfo(newFilename); + + int errorCode = IO.FileStream.OpenFileWrite(newFilename, out _zipFs); + if (errorCode != 0) + { + ZipFileClose(); + return ZipReturn.ZipErrorOpeningFile; + } + ZipOpen = ZipOpenType.OpenWrite; + return ZipReturn.ZipGood; + } + + public void ZipFileClose() + { + if (ZipOpen == ZipOpenType.Closed) + { + return; + } + + if (ZipOpen == ZipOpenType.OpenRead) + { + if (_zipFs != null) + { + _zipFs.Close(); + _zipFs.Dispose(); + } + ZipOpen = ZipOpenType.Closed; + return; + } + + _zip64 = false; + bool lTrrntzip = true; + + _centerDirStart = (ulong)_zipFs.Position; + if (_centerDirStart >= 0xffffffff) + _zip64 = true; + + CrcCalculatorStream crcCs = new CrcCalculatorStream(_zipFs, true); + + foreach (LocalFile t in _localFiles) + { + t.CenteralDirectoryWrite(crcCs); + _zip64 |= t.Zip64; + lTrrntzip &= t.TrrntZip; + } + + crcCs.Flush(); + crcCs.Close(); + + _centerDirSize = (ulong)_zipFs.Position - _centerDirStart; + + _fileComment = lTrrntzip ? GetBytes("TORRENTZIPPED-" + crcCs.Crc.ToString("X8")) : new byte[0]; + _pZipStatus = lTrrntzip ? ZipStatus.TrrntZip : ZipStatus.None; + + crcCs.Dispose(); + + if (_zip64) + { + _endOfCenterDir64 = (ulong)_zipFs.Position; + Zip64EndOfCentralDirWrite(); + Zip64EndOfCentralDirectoryLocatorWrite(); + } + EndOfCentralDirWrite(); + + _zipFs.SetLength(_zipFs.Position); + _zipFs.Flush(); + _zipFs.Close(); + _zipFs.Dispose(); + _zipFileInfo = new IO.FileInfo(_zipFileInfo.FullName); + ZipOpen = ZipOpenType.Closed; + + } + + public void ZipFileCloseFailed() + { + if (ZipOpen == ZipOpenType.Closed) + { + return; + } + + if (ZipOpen == ZipOpenType.OpenRead) + { + if (_zipFs != null) + { + _zipFs.Close(); + _zipFs.Dispose(); + } + ZipOpen = ZipOpenType.Closed; + return; + } + + _zipFs.Flush(); + _zipFs.Close(); + _zipFs.Dispose(); + IO.File.Delete(_zipFileInfo.FullName); + _zipFileInfo = null; + ZipOpen = ZipOpenType.Closed; + } + + + private int _readIndex; + public ZipReturn ZipFileOpenReadStream(int index, bool raw, out Stream stream, out ulong streamSize, out ushort compressionMethod) + { + streamSize = 0; + compressionMethod = 0; + _readIndex = index; + stream = null; + if (ZipOpen != ZipOpenType.OpenRead) + return ZipReturn.ZipReadingFromOutputFile; + + ZipReturn zRet = _localFiles[index].LocalFileHeaderRead(); + if (zRet != ZipReturn.ZipGood) + { + ZipFileClose(); + return zRet; + } + + return _localFiles[index].LocalFileOpenReadStream(raw, out stream, out streamSize, out compressionMethod); + } + + public ZipReturn ZipFileOpenReadStreamQuick(ulong pos, bool raw, out Stream stream, out ulong streamSize, out ushort compressionMethod) + { + LocalFile tmpFile = new LocalFile(_zipFs) { LocalFilePos = pos }; + _localFiles.Clear(); + _localFiles.Add(tmpFile); + ZipReturn zr = tmpFile.LocalFileHeaderReadQuick(); + if (zr != ZipReturn.ZipGood) + { + stream = null; + streamSize = 0; + compressionMethod = 0; + return zr; + } + _readIndex = 0; + + return tmpFile.LocalFileOpenReadStream(raw, out stream, out streamSize, out compressionMethod); + } + + public ZipReturn ZipFileCloseReadStream() + { + return _localFiles[_readIndex].LocalFileCloseReadStream(); + } + + public ZipReturn ZipFileOpenWriteStream(bool raw, bool trrntzip, string filename, ulong uncompressedSize, ushort compressionMethod, out Stream stream) + { + stream = null; + if (ZipOpen != ZipOpenType.OpenWrite) + return ZipReturn.ZipWritingToInputFile; + + LocalFile lf = new LocalFile(_zipFs, filename); + + ZipReturn retVal = lf.LocalFileOpenWriteStream(raw, trrntzip, uncompressedSize, compressionMethod, out stream); + + _localFiles.Add(lf); + + return retVal; + } + public ZipReturn ZipFileCloseWriteStream(byte[] crc32) + { + return _localFiles[_localFiles.Count - 1].LocalFileCloseWriteStream(crc32); + } + + public ZipReturn ZipFileRollBack() + { + if (ZipOpen != ZipOpenType.OpenWrite) + return ZipReturn.ZipWritingToInputFile; + + int fileCount = _localFiles.Count; + if (fileCount == 0) + return ZipReturn.ZipErrorRollBackFile; + + LocalFile lf = _localFiles[fileCount - 1]; + + _localFiles.RemoveAt(fileCount - 1); + _zipFs.Position = (long)lf.LocalFilePos; + return ZipReturn.ZipGood; + } + + public void ZipFileAddDirectory() + { + _localFiles[_localFiles.Count - 1].LocalFileAddDirectory(); + } + + + /* + public void BreakTrrntZip(string filename) + { + _zipFs = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite); + BinaryReader zipBr = new BinaryReader(_zipFs); + _zipFs.Position = _zipFs.Length - 22; + byte[] fileComment = zipBr.ReadBytes(22); + if (GetString(fileComment).Substring(0, 14) == "TORRENTZIPPED-") + { + _zipFs.Position = _zipFs.Length - 8; + _zipFs.WriteByte(48); _zipFs.WriteByte(48); _zipFs.WriteByte(48); _zipFs.WriteByte(48); + _zipFs.WriteByte(48); _zipFs.WriteByte(48); _zipFs.WriteByte(48); _zipFs.WriteByte(48); + } + + zipBr.Close(); + _zipFs.Flush(); + _zipFs.Close(); + } + */ + + public void DeepScan() + { + foreach (LocalFile lfile in _localFiles) + lfile.LocalFileCheck(); + } + + private static void CreateDirForFile(string sFilename) + { + string strTemp = IO.Path.GetDirectoryName(sFilename); + + if (String.IsNullOrEmpty(strTemp)) return; + + if (IO.Directory.Exists(strTemp)) return; + + + while (strTemp.Length > 0 && !IO.Directory.Exists(strTemp)) + { + int pos = strTemp.LastIndexOf(IO.Path.DirectorySeparatorChar); + if (pos < 0) pos = 0; + strTemp = strTemp.Substring(0, pos); + } + + while (sFilename.IndexOf(IO.Path.DirectorySeparatorChar, strTemp.Length + 1) > 0) + { + strTemp = sFilename.Substring(0, sFilename.IndexOf(IO.Path.DirectorySeparatorChar, strTemp.Length + 1)); + IO.Directory.CreateDirectory(strTemp); + } + } + + + public static string ZipErrorMessageText(ZipReturn zS) + { + string ret = "Unknown"; + switch (zS) + { + case ZipReturn.ZipGood: + ret = ""; + break; + case ZipReturn.ZipFileCountError: + ret = "The number of file in the Zip does not mach the number of files in the Zips Centeral Directory"; + break; + case ZipReturn.ZipSignatureError: + ret = "An unknown Signature Block was found in the Zip"; + break; + case ZipReturn.ZipExtraDataOnEndOfZip: + ret = "Extra Data was found on the end of the Zip"; + break; + case ZipReturn.ZipUnsupportedCompression: + ret = "An unsupported Compression method was found in the Zip, if you recompress this zip it will be usable"; + break; + case ZipReturn.ZipLocalFileHeaderError: + ret = "Error reading a zipped file header information"; + break; + case ZipReturn.ZipCenteralDirError: + ret = "There is an error in the Zip Centeral Directory"; + break; + case ZipReturn.ZipReadingFromOutputFile: + ret = "Trying to write to a Zip file open for output only"; + break; + case ZipReturn.ZipWritingToInputFile: + ret = "Tring to read from a Zip file open for input only"; + break; + case ZipReturn.ZipErrorGettingDataStream: + ret = "Error creating Data Stream"; + break; + case ZipReturn.ZipCRCDecodeError: + ret = "CRC error"; + break; + case ZipReturn.ZipDecodeError: + ret = "Error unzipping a file"; + break; + } + + return ret; + } + + private static byte[] GetBytes(String s) + { + char[] c = s.ToCharArray(); + byte[] b = new byte[c.Length]; + for (int i = 0; i < c.Length; i++) + { + char t = c[i]; + b[i] = t > 255 ? (byte)'?' : (byte)c[i]; + } + return b; + } + private static bool IsUnicode(string s) + { + char[] c = s.ToCharArray(); + for (int i = 0; i < c.Length; i++) + if (c[i] > 255) return true; + return false; + } + + private static string GetString(byte[] b) + { + string s = ""; + for (int i = 0; i < b.Length; i++) + s += (char)b[i]; + return s; + } + private static bool CompareString(string s1, string s2) + { + char[] c1 = s1.ToCharArray(); + char[] c2 = s2.ToCharArray(); + + if (c1.Length != c2.Length) + return false; + + for (int i = 0; i < c1.Length; i++) + if (c1[i] != c2[i]) return false; + return true; + } + + + private static bool ByteArrCompare(byte[] b0, byte[] b1) + { + if (b0 == null || b1 == null) + return false; + if (b0.Length != b1.Length) + return false; + + for (int i = 0; i < b0.Length; i++) + { + if (b0[i] != b1[i]) + return false; + } + return true; + } + + private static int TrrntZipStringCompare(string string1, string string2) + { + char[] bytes1 = string1.ToCharArray(); + char[] bytes2 = string2.ToCharArray(); + + int pos1 = 0; + int pos2 = 0; + + for (; ; ) + { + if (pos1 == bytes1.Length) + return ((pos2 == bytes2.Length) ? 0 : -1); + if (pos2 == bytes2.Length) + return 1; + + int byte1 = bytes1[pos1++]; + int byte2 = bytes2[pos2++]; + + if (byte1 >= 65 && byte1 <= 90) byte1 += 0x20; + if (byte2 >= 65 && byte2 <= 90) byte2 += 0x20; + + if (byte1 < byte2) + return -1; + if (byte1 > byte2) + return 1; + } + } + } + +} diff --git a/ROMVault2/SupportedFiles/ZipEnums.cs b/ROMVault2/SupportedFiles/ZipEnums.cs new file mode 100644 index 0000000..d80d9fc --- /dev/null +++ b/ROMVault2/SupportedFiles/ZipEnums.cs @@ -0,0 +1,57 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; + +namespace ROMVault2.SupportedFiles +{ + public enum ZipReturn + { + ZipGood, + ZipFileLocked, + ZipFileCountError, + ZipSignatureError, + ZipExtraDataOnEndOfZip, + ZipUnsupportedCompression, + ZipLocalFileHeaderError, + ZipCenteralDirError, + ZipEndOfCentralDirectoryError, + Zip64EndOfCentralDirError, + Zip64EndOfCentralDirectoryLocatorError, + ZipReadingFromOutputFile, + ZipWritingToInputFile, + ZipErrorGettingDataStream, + ZipCRCDecodeError, + ZipDecodeError, + ZipFileNameToLong, + ZipFileAlreadyOpen, + ZipCannotFastOpen, + ZipErrorOpeningFile, + ZipErrorFileNotFound, + ZipErrorReadingFile, + ZipErrorTimeStamp, + ZipErrorRollBackFile, + ZipUntested + + } + + public enum ZipOpenType + { + Closed, + OpenRead, + OpenWrite + } + + [Flags] + public enum ZipStatus + { + None = 0x0, + TrrntZip = 0x1, + ExtraData = 0x2 + } + + +} diff --git a/ROMVault2/Utils/ArrByte.cs b/ROMVault2/Utils/ArrByte.cs new file mode 100644 index 0000000..eb5cebe --- /dev/null +++ b/ROMVault2/Utils/ArrByte.cs @@ -0,0 +1,72 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.IO; + +namespace ROMVault2.Utils +{ + public static class ArrByte + { + public static void Write(BinaryWriter bw, byte[] b) + { + bw.Write((byte)b.Length); + bw.Write(b); + } + + public static byte[] Read(BinaryReader br) + { + byte len = br.ReadByte(); + return br.ReadBytes(len); + } + + public static byte[] Copy(byte[] b) + { + if (b == null) return null; + byte[] retB = new byte[b.Length]; + for (int i = 0; i < b.Length; i++) + retB[i] = b[i]; + return retB; + } + + public static bool bCompare(byte[] b1, byte[] b2) + { + if (b1 == null || b2 == null) return false; + + if (b1.Length != b2.Length) return false; + + for (int i = 0; i < b1.Length; i++) + if (b1[i] != b2[i]) return false; + + return true; + } + + public static int iCompare(byte[] b1, byte[] b2) + { + int b1Len = (b1 == null) ? 0 : b1.Length; + int b2Len = (b2 == null) ? 0 : b2.Length; + + int p = 0; + for (; ; ) + { + if (b1Len == p) + return (b2Len == p) ? 0 : -1; + if (b2Len == p) + return 1; + if (b1[p] < b2[p]) + return -1; + if (b1[p] > b2[p]) + return 1; + p++; + } + } + + public static string ToString(byte[] b) + { + return b == null ? "" : BitConverter.ToString(b).ToLower().Replace("-", ""); + } + } +} diff --git a/ROMVault2/Utils/DBTypeGet.cs b/ROMVault2/Utils/DBTypeGet.cs new file mode 100644 index 0000000..25daa43 --- /dev/null +++ b/ROMVault2/Utils/DBTypeGet.cs @@ -0,0 +1,58 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using ROMVault2.RvDB; + +namespace ROMVault2.Utils +{ + public class DBTypeGet + { + public static FileType DirFromFile(FileType ft) + { + switch (ft) + { + case FileType.File: + return FileType.Dir; + case FileType.ZipFile: + return FileType.Zip; + } + return FileType.Zip; + } + + public static FileType FileFromDir(FileType ft) + { + switch (ft) + { + case FileType.Dir: + return FileType.File; + case FileType.Zip: + return FileType.ZipFile; + } + return FileType.Zip; + } + + public static bool isCompressedDir(FileType fileType) + { + return (fileType == FileType.Zip); + } + + public static RvBase GetRvType(FileType fileType) + { + switch (fileType) + { + case FileType.Dir: + case FileType.Zip: + return new RvDir(fileType); + case FileType.File: + case FileType.ZipFile: + return new RvFile(fileType); + default: + throw new Exception("Unknown file type"); + } + } + } +} diff --git a/ROMVault2/Utils/RelativePath.cs b/ROMVault2/Utils/RelativePath.cs new file mode 100644 index 0000000..c474c5e --- /dev/null +++ b/ROMVault2/Utils/RelativePath.cs @@ -0,0 +1,95 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; + +namespace ROMVault2.Utils +{ + public static class RelativePath + { + /// + /// Creates a relative path from one file + /// or folder to another. + /// + /// + /// Contains the directory that defines the + /// start of the relative path. + /// + /// + /// Contains the path that defines the + /// endpoint of the relative path. + /// + /// + /// The relative path from the start + /// directory to the end path. + /// + /// + public static string MakeRelative(string fromDirectory, string toPath) + { + if (fromDirectory == null) + throw new ArgumentNullException("fromDirectory"); + + if (toPath == null) + throw new ArgumentNullException("toPath"); + + bool isRooted = (Path.IsPathRooted(fromDirectory) && Path.IsPathRooted(toPath)); + + if (isRooted) + { + bool isDifferentRoot = (String.Compare(Path.GetPathRoot(fromDirectory), Path.GetPathRoot(toPath), StringComparison.OrdinalIgnoreCase) != 0); + + if (isDifferentRoot) + return toPath; + } + + List relativePath = new List(); + string[] fromDirectories = fromDirectory.Split(Path.DirectorySeparatorChar); + + string[] toDirectories = toPath.Split(Path.DirectorySeparatorChar); + + int length = Math.Min(fromDirectories.Length, toDirectories.Length); + + int lastCommonRoot = -1; + + // find common root + for (int x = 0; x < length; x++) + { + if (String.Compare(fromDirectories[x], toDirectories[x], StringComparison.OrdinalIgnoreCase) != 0) + break; + + lastCommonRoot = x; + } + + if (lastCommonRoot == -1) + return toPath; + + // add relative folders in from path + for (int x = lastCommonRoot + 1; x < fromDirectories.Length; x++) + { + if (fromDirectories[x].Length > 0) + relativePath.Add(".."); + } + + // add to folders to path + for (int x = lastCommonRoot + 1; x < toDirectories.Length; x++) + { + relativePath.Add(toDirectories[x]); + } + + // create relative path + string[] relativeParts = new string[relativePath.Count]; + relativePath.CopyTo(relativeParts, 0); + + string newPath = string.Join(Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture), relativeParts); + + return newPath; + } + + } +} diff --git a/ROMVault2/Utils/ULong.cs b/ROMVault2/Utils/ULong.cs new file mode 100644 index 0000000..019f24c --- /dev/null +++ b/ROMVault2/Utils/ULong.cs @@ -0,0 +1,23 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; + +namespace ROMVault2.Utils +{ + public static class ULong + { + public static int iCompare(ulong? a, ulong? b) + { + if ((a == null) || (b == null)) + { + ReportError.SendAndShow("comparing null ulong? "); + return -1; + } + return Math.Sign(((ulong) a).CompareTo((ulong) b)); + } + } +} diff --git a/ROMVault2/Utils/VarFix.cs b/ROMVault2/Utils/VarFix.cs new file mode 100644 index 0000000..cd74fae --- /dev/null +++ b/ROMVault2/Utils/VarFix.cs @@ -0,0 +1,183 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Xml; + +namespace ROMVault2.Utils +{ + public static class VarFix + { + public static bool StringYesNo(string b) + { + return b != null && ((b.ToLower() == "yes") || (b.ToLower() == "true")); + } + + public static ulong? ULong(XmlNode n) + { + return ULong(n == null ? "" : n.InnerText); + } + + public static ulong? ULong(string n) + { + if (string.IsNullOrEmpty(n)) + return null; + + if (n == "-") + return null; + + try + { + if (n.Length >= 2 && n.Substring(0, 2).ToLower() == "0x") + { + return Convert.ToUInt64(n.Substring(2), 16); + } + + return Convert.ToUInt64(n); + } + catch + { + return null; + } + } + + public static string String(XmlNode n) + { + return String(n == null ? "" : n.InnerText); + } + public static string String(string n) + { + return n ?? ""; + } + + + private const string ValidHexChar = "0123456789abcdef"; + private static string CleanCheck(string crc, int length) + { + string retcrc = crc ?? ""; + retcrc = retcrc.ToLower().Trim(); + + if (retcrc.Length >= 2 && retcrc.Substring(0, 2).ToLower() == "0x") + retcrc = retcrc.Substring(2); + + if (retcrc == "-") retcrc="00000000"; + + for (int i = 0; i < retcrc.Length; i++) + if (ValidHexChar.IndexOf(retcrc.Substring(i, 1), StringComparison.Ordinal) < 0) + return ""; + + + retcrc = (new String('0', length)) + retcrc; + retcrc = retcrc.Substring(retcrc.Length - length); + + return retcrc; + } + + + //CleanMD5SHA1 with a null or empty string will return null + public static byte[] CleanMD5SHA1(XmlNode n, int length) + { + return CleanMD5SHA1(n == null ? null : n.InnerText, length); + } + public static byte[] CleanMD5SHA1(string checksum, int length) + { + if (string.IsNullOrEmpty(checksum)) return null; + + checksum = checksum.ToLower().Trim(); + + if (checksum.Length >= 2) + if (checksum.Substring(0, 2) == "0x") + checksum = checksum.Substring(2); + + + if (string.IsNullOrEmpty(checksum)) return null; + + if (checksum == "-") return null; + + //if (checksum.Length % 2 == 1) + // checksum = "0" + checksum; + + //if (checksum.Length != length) + // return null; + + while (checksum.Length < length) + checksum = "0" + checksum; + + int retL = checksum.Length / 2; + byte[] retB = new byte[retL]; + + for (int i = 0; i < retL; i++) + retB[i] = Convert.ToByte(checksum.Substring(i * 2, 2), 16); + + return retB; + } + + + public static string CleanFullFileName(XmlNode n) + { + return CleanFullFileName(n == null ? "" : n.InnerText); + } + public static string CleanFullFileName(string name) + { + if (System.String.IsNullOrEmpty(name)) return ""; + + string retName = name; + retName = retName.TrimStart(); + retName = retName.TrimEnd(new []{ '.', ' ' }); + + char[] charName = retName.ToCharArray(); + for (int i = 0; i < charName.Length; i++) + { + int c = charName[i]; + if (c == ':' || c == '*' || c == '?' || c == '<' || c == '>' || c == '|' || c < 32) + charName[i] = '-'; + else if (c == '\\') + charName[i] = '/'; + } + return new string(charName); + } + + public static string CleanFileName(XmlNode n) + { + return CleanFileName(n == null ? "" : n.InnerText); + } + public static string CleanFileName(string name,char crep='-') + { + if (System.String.IsNullOrEmpty(name)) return ""; + string retName = name; + retName = retName.TrimStart(); + retName = retName.TrimEnd(new[] { '.', ' ' }); + + char[] charName = retName.ToCharArray(); + for (int i = 0; i < charName.Length; i++) + { + int c = charName[i]; + if (c == ':' || c == '*' || c == '?' || c == '<' || c == '>' || c == '|' || c == '\\' || c == '/' || c < 32) + charName[i] = crep; + } + return new string(charName); + } + + public static string ToLower(XmlNode n) + { + return ToLower(n == null ? "" : n.InnerText); + } + public static string ToLower(string name) + { + return name == null ? "" : name.ToLower(); + } + + + public static string PCombine(string path1, string path2) + { + if (System.String.IsNullOrEmpty(path1)) return path2; + if (System.String.IsNullOrEmpty(path2)) return path1; + + return path1 + "/" + path2; + } + + } +} diff --git a/ROMVault2/chdman.exe b/ROMVault2/chdman.exe new file mode 100644 index 0000000000000000000000000000000000000000..79181728c4f38dabee4d72b887f4f86905457049 GIT binary patch literal 1110938 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⪻Cb6x9behaJY+# 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 z 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

#({?<|Fp6(fNn`- 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

yImgn+j;C3>r%iW$uu(nu5U!!xsE;WnlXYHV&R0 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

    aE2ug#1R=HKVEXqU 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

    B7L!FcZJY>aH*~Fq0>^GB6|%FnOCR1B1W} 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 literal 0 HcmV?d00001 diff --git a/ROMVault2/chip.ico b/ROMVault2/chip.ico new file mode 100644 index 0000000000000000000000000000000000000000..c001ad97a6ec8f3a3989d9a00d8519fddbab52e7 GIT binary patch literal 99678 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 + /// 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.lblVersion = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblVersion + // + this.lblVersion.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblVersion.Location = new System.Drawing.Point(12, 115); + this.lblVersion.Name = "lblVersion"; + this.lblVersion.Size = new System.Drawing.Size(445, 15); + this.lblVersion.TabIndex = 6; + this.lblVersion.Text = "label1"; + this.lblVersion.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.Blue; + this.label1.Location = new System.Drawing.Point(279, 142); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(178, 16); + this.label1.TabIndex = 7; + this.label1.Text = "http://www.romvault.com/"; + this.label1.Click += new System.EventHandler(this.label1_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.Blue; + this.label2.Location = new System.Drawing.Point(12, 142); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(167, 16); + this.label2.TabIndex = 8; + this.label2.Text = "support@romvault.com"; + this.label2.Click += new System.EventHandler(this.label2_Click); + // + // frmHelpAbout + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = global::ROMVault2.rvImages.romvaultTZ; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.ClientSize = new System.Drawing.Size(471, 172); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.lblVersion); + this.DoubleBuffered = true; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "frmHelpAbout"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "frmHelpAbout"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblVersion; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + } +} \ No newline at end of file diff --git a/ROMVault2/frmHelpAbout.cs b/ROMVault2/frmHelpAbout.cs new file mode 100644 index 0000000..d03e933 --- /dev/null +++ b/ROMVault2/frmHelpAbout.cs @@ -0,0 +1,40 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Windows.Forms; + +namespace ROMVault2 +{ + public partial class frmHelpAbout : Form + { + public frmHelpAbout() + { + + InitializeComponent(); + Text = "Version "+Program.Version+"." + Program.SubVersion + " : " + Application.StartupPath; + lblVersion.Text = "Version "+Program.Version+"." + Program.SubVersion; + } + + private void label1_Click(object sender, EventArgs e) + { + string url = "http://www.romvault.com/"; + System.Diagnostics.Process.Start(url); + } + + private void label2_Click(object sender, EventArgs e) + { + try + { + string url = "mailto:support@romvault.com?subject=Support " + Program.Version + "." + Program.SubVersion; + System.Diagnostics.Process.Start(url); + } + catch + { } + } + + } +} diff --git a/ROMVault2/frmHelpAbout.resx b/ROMVault2/frmHelpAbout.resx new file mode 100644 index 0000000..5ea0895 --- /dev/null +++ b/ROMVault2/frmHelpAbout.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ROMVault2/frmKey.Designer.cs b/ROMVault2/frmKey.Designer.cs new file mode 100644 index 0000000..b2f0c2c --- /dev/null +++ b/ROMVault2/frmKey.Designer.cs @@ -0,0 +1,55 @@ +namespace ROMVault2 +{ + partial class frmKey + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmKey)); + this.SuspendLayout(); + // + // frmKey + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ControlDark; + this.ClientSize = new System.Drawing.Size(600, 532); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "frmKey"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Color Key to ROM Status"; + this.Load += new System.EventHandler(this.frmKey_Load); + this.ResumeLayout(false); + + } + + #endregion + + + + } +} \ No newline at end of file diff --git a/ROMVault2/frmKey.cs b/ROMVault2/frmKey.cs new file mode 100644 index 0000000..55e5b06 --- /dev/null +++ b/ROMVault2/frmKey.cs @@ -0,0 +1,117 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; + +namespace ROMVault2 +{ + public partial class frmKey : Form + { + public frmKey() + { + InitializeComponent(); + } + + private void frmKey_Load(object sender, EventArgs e) + { + List displayList= new List + { + RepStatus.Missing, + RepStatus.Correct, + RepStatus.NotCollected, + RepStatus.UnNeeded, + RepStatus.Unknown, + RepStatus.InToSort, + RepStatus.Corrupt, + RepStatus.UnScanned, + RepStatus.Ignore, + RepStatus.CanBeFixed, + RepStatus.MoveToSort, + RepStatus.Delete, + RepStatus.NeededForFix, + }; + Height = displayList.Count * 44 + 32; + for (int i = 0; i < displayList.Count; i++) + { + PictureBox pictureBox = new PictureBox(); + pictureBox.BorderStyle = BorderStyle.FixedSingle; + pictureBox.Location = new Point(4, 4 + i * 44); + pictureBox.Name = "pictureBox" + i; + pictureBox.Size = new Size(48, 42); + pictureBox.TabIndex = 0; + pictureBox.TabStop = false; + + Controls.Add(pictureBox); + + Bitmap bm = rvImages.GetBitmap("G_" + displayList[i]); + pictureBox.Image = bm; + + Label label = new Label(); + label.BackColor = SystemColors.Control; + label.BorderStyle = BorderStyle.FixedSingle; + label.Location = new Point(54, 4 + i * 44); + label.TextAlign = ContentAlignment.MiddleLeft; + label.Name = "label" + i; + label.Size = new Size(542, 42); + label.TabIndex = 0; + + String text; + switch (displayList[i]) + { + case RepStatus.Missing: + text = "Red - This ROM is missing."; + break; + case RepStatus.Correct: + text = "Green - This ROM is Correct."; + break; + case RepStatus.NotCollected: + text = "Gray - This ROM is not collected. Either it is in the parent set, or it is a 'BadDump ROM'"; + break; + case RepStatus.UnNeeded: + text = "Light Cyan - This ROM is unneeded here, as this ROM is collected in the parent set."; + break; + case RepStatus.Unknown: + text = "Cyan - This ROM is not needed here. (Find Fixes to see what should be done with this ROM)"; + break; + case RepStatus.InToSort: + text = "Magenta - This ROM is in the ToSort directory, after Finding Fixes this ROM is not needed in any sets."; + break; + case RepStatus.Corrupt: + text = "Red - This ROM is Corrupt in the Zip File."; + break; + case RepStatus.UnScanned: + text = "Blue - This file could not be scanned as it is locked by another process."; + break; + case RepStatus.Ignore: + text = "GreyBlue - This file is found in the Ignore file list."; + break; + case RepStatus.CanBeFixed: + text = "Yellow - This ROM is missing here but has been found somewhere else, and so can be fixed."; + break; + case RepStatus.MoveToSort: + text = "Purple - This ROM is not found in any DAT set, and so will be moved out to ToSort."; + break; + case RepStatus.Delete: + text = "Brown - This ROM should be deleted, as a copy of it is correctly located somewhere else."; + break; + case RepStatus.NeededForFix: + text = "Orange - This Rom in not needed here, but is required in another set somewhere else."; + break; + + default: + text = ""; + break; + } + + label.Text = text; + Controls.Add(label); + } + } + } +} diff --git a/ROMVault2/frmKey.resx b/ROMVault2/frmKey.resx new file mode 100644 index 0000000..1e12950 --- /dev/null +++ b/ROMVault2/frmKey.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA7e3tvevr6//m5ub/4ODg/9nZ2f/Q0ND/wsLC/66urv+ampr/nJyc/6Kiov+tra3/ubm5/8XF + xf/R0dH/2trapenp6b3l5eX/3t7e/9bW1v/Kysr/ubm5/5+fn/92dnb/ampq/21tbf97e3v/jIyM/56e + nv+wsLD/wsLC/8/Pz6Xl5eW939/f/9bW1v/Jycn/uLi4/5ycnP9ubm7/YWFh/2pqav8tLS3/RERE/2lp + af+AgID/mJiY/7Kysv/FxcWl39/fvdjY2P/Ly8v/ubm5/56env9ycnL/VlZW/2RkZP92dnb/IyMj/yAg + IP8qKir/VlZW/319ff+ioqL/v7+/pdnZ2b3Nzc3/u7u7/6Kiov94eHj/U1NT/15eXv99fX3/IiIi/yYm + Jv8lJSX/IyMj/yAgIP8+Pj7/hoaG/76+vqXQ0NC9wMDA/6ampv+AgID/U1NT/1tbW/+BgYH/ISEh/yUl + Jf8lJSX/JiYm/yYmJv8lJSX/IiIi/2BgYP/Dw8OlxsbGva6urv+Hh4f/VlZW/1paWv+BgYH/JCQk/yUl + Jf8kJCT/JSUl/yUlJf8mJib/JiYm/yQkJP91dXX/zc3Npby8vL2Wlpb/XV1d/1tbW/+AgID/JiYm/zs7 + O/9ubm7/YWFh/ykpKf8kJCT/JSUl/yUlJf9ZWVn/xcXF/9XV1aW4uLi9dXV1/2JiYv9/f3//Kysr/0BA + QP/FxcX/zMzM/8vLy/+hoaH/JCQk/yQkJP9NTU3/v7+//9LS0v/c3NylvLy8vXJycv9/f3//NjY2/yMj + I/9lZWX/zc3N/83Nzf/MzMz/ycnJ/ykpKf9DQ0P/uLi4/9DQ0P/c3Nz/4+PjpcDAwL1/f3//QkJC/yQi + Iv8jIyP/Li4u/6ioqP/MzMz/ysrK/3h4eP88PDz/s7Oz/8/Pz//b29v/4+Pj/+jo6KXR0dG9bm5u/yQi + Iv9hJRr/SCQd/0QkHv8yJCH/Ozs7/zExMf82Njb/r6+v/9HR0f/b29v/4+Pj/+jo6P/s7Oyl29vbvX9/ + f/8lJSX/PiMe/1okGv9dJBr/VSQc/zokIP8yMjL/rq6u/9XV1f/e3t7/5OTk/+np6f/t7e3/8PDwpeXl + 5b3f39//t7e3/2tra/8lJSX/RyMd/1QlHP8vLi7/ra2t/93d3f/j4+P/6Ojo/+vr6//u7u7/8fHx//Pz + 86Xs7Oy96enp/+bm5v/i4uL/n5+f/zY2Nv9JSUn/q6ur/+bm5v/p6en/7Ozs/+7u7v/w8PD/8vLy//T0 + 9P/19fWl8fHxvfDw8P/u7u7/7Ozs/+rq6v/g4OD/39/f/+zs7P/u7u7/7+/v//Hx8f/y8vL/9PT0//X1 + 9f/29vb/9/f3pQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA7+/vee7u + 7v/t7e3/6+vr/+np6f/n5+f/5OTk/+Hh4f/e3t7/29vb/9fX1//T09P/zc3N/8XFxf++vr7/uLi4/7Cw + sP+rq6v/qKio/6ioqP+rq6v/rq6u/7Kysv+4uLj/vb29/8LCwv/Hx8f/zMzM/9HR0f/X19f/3Nzc/9/f + 303t7e157Ozs/+rq6v/o6Oj/5ubm/+Pj4//g4OD/3Nzc/9jY2P/U1NT/z8/P/8jIyP/AwMD/tra2/6qq + qv+YmJj/goKC/42Njf+NjY3/kZGR/5aWlv+bm5v/oqKi/6qqqv+wsLD/tra2/729vf/Dw8P/ysrK/9HR + 0f/X19f/29vbTevr63nq6ur/6Ojo/+Xl5f/i4uL/3t7e/9vb2//W1tb/0tLS/8zMzP/ExMT/u7u7/7Gx + sf+jo6P/kJCQ/3Z2dv9mZmb/c3Nz/3R0dP96enr/gICA/4iIiP+RkZH/mZmZ/6Ghof+pqan/sbGx/7m5 + uf/CwsL/ysrK/9HR0f/W1tZN6enpeefn5//l5eX/4uLi/97e3v/a2tr/1dXV/9DQ0P/Kysr/wsLC/7m5 + uf+tra3/n5+f/4mJif9ra2v/aWlp/29vb/9hYWH/YWFh/2dnZ/9tbW3/dXV1/35+fv+IiIj/kpKS/5yc + nP+lpaX/r6+v/7m5uf/CwsL/y8vL/9HR0U3n5+d55eXl/+Li4v/f39//29vb/9bW1v/Q0ND/ycnJ/8LC + wv+4uLj/ra2t/52dnf+IiIj/a2tr/0tLS/9oaGj/enp6/1hYWP9ERET/Ly8v/1NTU/9kZGT/bW1t/3d3 + d/+CgoL/jY2N/5iYmP+kpKT/sLCw/7u7u//Gxsb/zMzMTeXl5Xnj4+P/39/f/9vb2//X19f/0dHR/8rK + yv/BwcH/uLi4/62trf+enp7/iYmJ/2tra/9bW1v/WFhY/3h4eP91dXX/X19f/yAgIP8iIiL/Hx8f/zk5 + Of9aWlr/Z2dn/3Jycv9+fn7/i4uL/5mZmf+np6f/tbW1/8HBwf/JyclN4uLieeDg4P/c3Nz/2NjY/9LS + 0v/Kysr/wsLC/7i4uP+tra3/n5+f/4uLi/9tbW3/Q0ND/11dXf9dXV3/aWlp/5WVlf+QkJD/IiIi/yEh + If8eHh7/Hh4e/yQkJP9HR0f/YmJi/29vb/99fX3/jIyM/52dnf+vr6//vr6+/8fHx03g4OB53d3d/9jY + 2P/T09P/zMzM/8PDw/+5ubn/rq6u/6CgoP+MjIz/cnJy/19fX/9NTU3/ampq/3d3d/9TU1P/jo6O/yYm + Jv8jIyP/JiYm/yQkJP8hISH/Hh4e/x4eHv8wMDD/WFhY/21tbf99fX3/kpKS/6mpqf+8vLz/xsbGTd7e + 3nna2tr/1NTU/83Nzf/ExMT/u7u7/6+vr/+hoaH/j4+P/3V1df9HR0f/Wlpa/1ZWVv9paWn/fn5+/5ub + m/8dHR3/IyMj/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x4eHv8hISH/QEBA/2xsbP+IiIj/o6Oj/7u7 + u//Hx8dN2traedXV1f/Ozs7/xsbG/7y8vP+xsbH/pKSk/5KSkv97e3v/ZGRk/0pKSv9gYGD/dXV1/0JC + Qv+qqqr/MjIy/yMjI/8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/ISEh/x8fH/8fHx//LS0t/1JS + Uv+cnJz/u7u7/8fHx03W1tZ50dHR/8nJyf+/v7//s7Oz/6ampv+UlJT/fX19/01NTf9ZWVn/WFhY/2ho + aP9ubm7/mJiY/xsbG/8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yEh + If8gICD/KSkp/5ycnP++vr7/ycnJTdLS0nnMzMz/wsLC/7a2tv+pqan/l5eX/4KCgv9sbGz/SkpK/1tb + W/91dXX/Nzc3/7W1tf9HR0f/IiIi/yQkJP8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8jIyP/mJiY/8XFxf/MzMxNzs7OecfHx/+7u7v/ra2t/5ubm/+Ghob/WVlZ/1lZ + Wf9dXV3/ZWVl/2hoaP+Kior/KSkp/yEhIf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/zIyMv+goKD/ysrK/9DQ0E3Kysp5wcHB/7Kysv+goKD/ioqK/3Jy + cv9PT0//V1dX/3V1df8zMzP/q6ur/2ZmZv8gICD/JCQk/yUlJf8lJSX/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8hISH/Q0ND/76+vv/Nzc3/09PTTcXFxXm7u7v/qKio/5GR + kf9mZmb/Xl5e/2JiYv9eXl7/bGxs/3d3d/82Njb/Hx8f/yQkJP8kJCT/JSUl/ycnJ/8lJSX/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/Kioq/1hYWP+3t7f/ycnJ/9HR0f/X19dNwsLCebW1 + tf+enp7/gYGB/1hYWP9WVlb/dXV1/zg4OP+UlJT/ioqK/x8fH/8kJCT/LCws/3l5ef+tra3/v7+//7S0 + tP+IiIj/OTk5/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yQkJP8xMTH/sbGx/8bGxv/Ozs7/1tbW/9ra + 2k3BwcF5srKy/4iIiP9xcXH/bGxs/1tbW/92dnb/YWFh/05OTv8eHh7/IyMj/zMzM/+wsLD/zMzM/8vL + y//Ly8v/zMzM/8vLy//BwcH/SkpK/yMjI/8kJCT/JCQk/yUlJf8oKCj/QkJC/6qqqv/ExMT/zMzM/9PT + 0//Z2dn/3d3dTcLCwnm0tLT/enp6/2FhYf97e3v/SEhI/319ff+np6f/ISEh/yEhIf8jIyP/iIiI/8zM + zP/MzMz/zc3N/83Nzf/MzMz/y8vL/8rKyv+vr6//JSUl/yQkJP8kJCT/IyMj/yUlJf+lpaX/w8PD/8vL + y//R0dH/19fX/93d3f/g4OBNw8PDebm5uf+JiYn/Y2Nj/4GBgf9WVlb/Y2Nj/ykpKf8hISH/IyMj/yQk + JP+wsLD/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8zMzP8zMzP/JCQk/yUlJf8zMzP/lpaW/8HB + wf/Kysr/0dHR/9fX1//c3Nz/4ODg/+Pj403FxcV5tra2/4aGhv9WVlb/bm5u/7i4uP8rKyv/ISEh/yQk + JP8kJCT/JCQk/52dnf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/Ly8v/wcHB/yoqKv8jIyP/ICAg/5aW + lv/AwMD/ycnJ/9DQ0P/X19f/3Nzc/+Dg4P/k5OT/5ubmTcnJyXm2trb/jY2N/1JSUv9zc3P/PDw8/yEh + If8jIyP/IyMj/yMjI/8kJCT/T09P/8nJyf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vLy/95eXn/JCQk/ygo + KP+Dg4P/wMDA/8jIyP/Q0ND/1tbW/9vb2//g4OD/4+Pj/+bm5v/o6OhNzc3NecDAwP9nZ2f/tLS0/zw8 + PP8eHh7/IiIi/ysiIf8iIiL/IyMj/yMjI/8jIyP/VlZW/7e3t//MzMz/zc3N/8zMzP/ExMT/d3d3/yYm + Jv8dHR3/h4eH/8HBwf/Jycn/0NDQ/9bW1v/b29v/39/f/+Pj4//m5ub/6enp/+vr603S0tJ5zMzM/6mp + qf9VVVX/ICAg/yMjI/84Ix//ayYa/yIiIf8qIiH/NCMg/zQjIP8jIyP/JiYm/0hISP9dXV3/UVFR/y0t + Lf8jIyP/IiIi/2tra//BwcH/ysrK/9HR0f/W1tb/29vb/9/f3//j4+P/5ubm/+np6f/r6+v/7e3tTdfX + 13nS0tL/kpKS/ygoKP8jIyP/KyIg/3omF/9mJRn/cyYY/14lGv9TJRz/UyUc/1ckG/8oIyH/IyMj/yMj + I/8jIyP/IyMj/x0dHf93d3f/xMTE/8vLy//S0tL/19fX/9vb2//f39//4+Pj/+bm5v/o6Oj/6+vr/+3t + 7f/u7u5N29vbedfX1/+FhYX/IyMj/yMjI/8jISH/TyQc/2QkGP9yJhj/WyQa/2slGf86Ix7/XCUb/2Ml + G/8+Ix//JSMi/yMjI/8hISH/VVVV/8bGxv/Ozs7/1NTU/9nZ2f/d3d3/4ODg/+Pj4//m5ub/6Ojo/+vr + 6//t7e3/7+/v//Dw8E3g4OB53d3d/9PT0/9/f3//LCws/yIiIv8hISH/ISEh/0UjHf9XIxr/bCUY/2El + Gv8/Ix7/VSQc/10mG/8nIyL/Hx8f/2VlZf/Kysr/09PT/9fX1//b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/r6+v/7e3t/+/v7//w8PD/8fHxTeTk5Hni4uL/3t7e/9vb2//Dw8P/YGBg/yQkJP8iIiL/ISEh/yEh + If9fJRr/ZSUZ/1IkHP9eJRv/JSMi/yIiIv9AQED/ysrK/9jY2P/b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/q6ur/7Ozs/+7u7v/v7+//8fHx//Ly8v/z8/NN6Ojoeebm5v/k5OT/4eHh/9/f3//c3Nz/v7+//6io + qP8vLy//IiIi/yEhIf81IyD/ZiYa/zskIP8gICD/VFRU/83Nzf/d3d3/4ODg/+Pj4//l5eX/5+fn/+np + 6f/r6+v/7Ozs/+3t7f/v7+//8PDw//Hx8f/y8vL/8/Pz//T09E3s7Ox56+vr/+np6f/n5+f/5OTk/+Li + 4v/h4eH/39/f/5aWlv8wMDD/IiIi/yIiIv8jIyP/IiIi/ywsLP/Gxsb/4uLi/+Tk5P/m5ub/6Ojo/+np + 6f/r6+v/7Ozs/+7u7v/v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9fX1Te7u7nnt7e3/7Ozs/+vr + 6//p6en/6Ojo/+bm5v/k5OT/4+Pj/9PT0/9vb2//JiYm/y0tLf+ysrL/1NTU/+bm5v/n5+f/6enp/+rq + 6v/s7Oz/7e3t/+7u7v/v7+//8PDw//Hx8f/y8vL/8vLy//Pz8//09PT/9fX1//X19f/29vZN8fHxefDw + 8P/v7+//7u7u/+3t7f/s7Oz/6urq/+np6f/o6Oj/6Ojo/+jo6P++vr7/urq6/+np6f/q6ur/6+vr/+vr + 6//t7e3/7u7u/+/v7//v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/29vb/9vb2//f3 + 903z8/N58vLy//Hx8f/w8PD/8PDw/+/v7//u7u7/7e3t/+3t7f/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vL/8/Pz//T09P/09PT/9fX1//X19f/29vb/9vb2//f3 + 9//39/f/9/f3TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAPDw + 8Dfv7+//7u7u/+3t7f/s7Oz/6+vr/+rq6v/p6en/5+fn/+Xl5f/j4+P/4eHh/9/f3//d3d3/29vb/9nZ + 2f/X19f/1NTU/9DQ0P/Ly8v/x8fH/8LCwv++vr7/urq6/7a2tv+xsbH/rq6u/62trf+srKz/rKys/62t + rf+vr6//sbGx/7S0tP+3t7f/u7u7/76+vv/BwcH/xcXF/8jIyP/Ly8v/z8/P/9LS0v/V1dX/2NjY/9zc + 3P/f39/x////Ae7u7jfu7u7/7e3t/+zs7P/r6+v/6enp/+jo6P/m5ub/5eXl/+Pj4//g4OD/3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zc3N/8jIyP/CwsL/vLy8/7e3t/+xsbH/qqqq/6Ojo/+enp7/nJyc/5ub + m/+cnJz/np6e/6CgoP+jo6P/pqam/6qqqv+urq7/srKy/7a2tv+6urr/vr6+/8HBwf/FxcX/ycnJ/83N + zf/R0dH/1dXV/9nZ2f/c3Nzx////Ae3t7Tfs7Oz/6+vr/+rq6v/p6en/6Ojo/+bm5v/k5OT/4uLi/+Dg + 4P/d3d3/29vb/9jY2P/V1dX/0tLS/87Ozv/Kysr/xMTE/7+/v/+5ubn/sbGx/6ioqP+fn5//ioqK/21t + bf+Ghob/iIiI/4iIiP+Li4v/jo6O/5GRkf+VlZX/mZmZ/56env+kpKT/qKio/62trf+xsbH/tbW1/7q6 + uv++vr7/w8PD/8jIyP/MzMz/0dHR/9XV1f/Z2dnx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Pj + 4//h4eH/39/f/9zc3P/Z2dn/19fX/9TU1P/Q0ND/zMzM/8fHx//CwsL/vLy8/7a2tv+urq7/pKSk/5iY + mP+MjIz/cHBw/2JiYv9zc3P/dnZ2/3d3d/96enr/fn5+/4ODg/+Hh4f/jIyM/5KSkv+YmJj/nZ2d/6Oj + o/+oqKj/ra2t/7Kysv+3t7f/vb29/8LCwv/Hx8f/zMzM/9HR0f/W1tbx////Aerq6jfp6en/6Ojo/+fn + 5//l5eX/4+Pj/+Hh4f/e3t7/3Nzc/9nZ2f/W1tb/09PT/8/Pz//Ly8v/xsbG/8DAwP+6urr/s7Oz/6ur + q/+hoaH/lJSU/4WFhf94eHj/ampq/2hoaP9oaGj/ZmZm/2hoaP9tbW3/cXFx/3V1df96enr/f39//4aG + hv+MjIz/kpKS/5iYmP+enp7/pKSk/6qqqv+wsLD/tra2/7y8vP/CwsL/x8fH/83Nzf/S0tLx////Aenp + 6Tfo6Oj/5ubm/+Xl5f/j4+P/4eHh/9/f3//c3Nz/2dnZ/9bW1v/S0tL/zs7O/8rKyv/FxcX/v7+//7i4 + uP+xsbH/qamp/5+fn/+RkZH/f39//2BgYP9nZ2f/aGho/29vb/9vb2//W1tb/11dXf9hYWH/ZWVl/2lp + af9ubm7/c3Nz/3p6ev+AgID/h4eH/42Njf+UlJT/m5ub/6Ghof+oqKj/r6+v/7W1tf+8vLz/wsLC/8nJ + yf/Ozs7x////Aejo6Dfn5+f/5eXl/+Pj4//h4eH/39/f/9zc3P/Z2dn/1tbW/9LS0v/Ozs7/ycnJ/8TE + xP+/v7//uLi4/7Gxsf+oqKj/nZ2d/5CQkP+AgID/ZmZm/0pKSv9XV1f/a2tr/3R0dP9xcXH/UlJS/1NT + U/84ODj/PT09/1tbW/9jY2P/aGho/25ubv91dXX/fHx8/4ODg/+Kior/kZGR/5mZmf+goKD/qKio/6+v + r/+3t7f/vr6+/8XFxf/Ly8vx////Aefn5zfm5ub/4+Pj/+Hh4f/f39//3Nzc/9ra2v/W1tb/09PT/87O + zv/Jycn/xMTE/76+vv+4uLj/sLCw/6ioqP+enp7/kJCQ/4GBgf9vb2//Xl5e/01NTf9VVVX/cXFx/42N + jf9xcXH/S0tL/zExMf8gICD/Hh4e/ygoKP9JSUn/XV1d/2NjY/9paWn/cXFx/3h4eP+AgID/iIiI/5CQ + kP+YmJj/oKCg/6mpqf+ysrL/urq6/8LCwv/Jycnx////AeXl5Tfk5OT/4uLi/9/f3//d3d3/2tra/9fX + 1//T09P/z8/P/8rKyv/FxcX/v7+//7i4uP+xsbH/qKio/5+fn/+RkZH/gYGB/2ZmZv9eXl7/WVlZ/2Nj + Y/9aWlr/i4uL/2tra/93d3f/VFRU/x0dHf8kJCT/Hh4e/x4eHv8eHh7/MjIy/1JSUv9eXl7/ZmZm/25u + bv91dXX/fn5+/4eHh/+QkJD/mZmZ/6Ojo/+tra3/tra2/7+/v//Gxsbx////AePj4zfi4uL/4ODg/93d + 3f/b29v/2NjY/9TU1P/Pz8//ysrK/8XFxf+/v7//uLi4/7Gxsf+pqan/n5+f/5OTk/+CgoL/ampq/0ZG + Rv9ISEj/YWFh/2VlZf9dXV3/cHBw/3Jycv/CwsL/jIyM/yQkJP8fHx//Hx8f/x4eHv8eHh7/HR0d/yEh + If8+Pj7/Wlpa/2NjY/9ra2v/dHR0/319ff+Hh4f/kZGR/5ycnP+np6f/s7Oz/7y8vP/FxcXx////AeLi + 4jfg4OD/3t7e/9vb2//Y2Nj/1dXV/9HR0f/Ly8v/xsbG/8DAwP+5ubn/srKy/6mpqf+fn5//kpKS/4SE + hP9zc3P/YWFh/0RERP9FRUX/ampq/3x8fP9WVlb/Xl5e/7e3t/+zs7P/KCgo/yIiIv8kJCT/JiYm/yIi + Iv8fHx//Hh4e/x4eHv8eHh7/KSkp/0xMTP9hYWH/ampq/3Nzc/99fX3/iIiI/5SUlP+ioqL/r6+v/7u7 + u//ExMTx////AeDg4Dff39//3Nzc/9nZ2f/V1dX/0dHR/8zMzP/Hx8f/wcHB/7q6uv+ysrL/qqqq/6Gh + of+Tk5P/hISE/3BwcP9lZWX/W1tb/15eXv9GRkb/fHx8/39/f/9hYWH/RERE/4iIiP8uLi7/IiIi/yMj + I/8lJSX/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x8fH/83Nzf/Wlpa/2dnZ/9xcXH/fX19/42N + jf+cnJz/q6ur/7m5uf/ExMTx////Ad/f3zfd3d3/2tra/9bW1v/R0dH/zc3N/8fHx//BwcH/u7u7/7Oz + s/+rq6v/oaGh/5aWlv+Hh4f/c3Nz/0pKSv9LS0v/XFxc/2ZmZv9GRkb/hISE/2JiYv+dnZ3/mpqa/xwc + HP8cHBz/IyMj/yYmJv8mJib/JSUl/yYmJv8mJib/JSUl/yMjI/8fHx//Hx8f/x4eHv8eHh7/JSUl/0VF + Rf9jY2P/dHR0/4aGhv+YmJj/qamp/7i4uP/ExMTx////Ad3d3Tfb29v/19fX/9LS0v/Ozs7/yMjI/8LC + wv+8vLz/tLS0/6ysrP+jo6P/l5eX/4mJif94eHj/ZmZm/0hISP9DQ0P/ZWVl/3Jycv89PT3/V1dX/5aW + lv/a2tr/Pj4+/yIiIv8kJCT/JiYm/yYmJv8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8kJCT/ISEh/x8f + H/8fHx//Hx8f/x8fH/8xMTH/YWFh/3BwcP+Li4v/paWl/7e3t//ExMTx////Advb2zfY2Nj/1NTU/8/P + z//Jycn/xMTE/729vf+1tbX/ra2t/6SkpP+ZmZn/jIyM/3t7e/9ra2v/X19f/1ZWVv9CQkL/cHBw/42N + jf9OTk7/ODg4/7S0tP9JSUn/IyMj/yIiIv8mJib/JiYm/yYmJv8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yMjI/8gICD/Hx8f/yAgIP8gICD/IiIi/zk5Of91dXX/paWl/7e3t//FxcXx////AdjY + 2DfV1dX/0NDQ/8vLy//FxcX/v7+//7e3t/+vr6//paWl/5ubm/+NjY3/fX19/1RUVP9OTk7/W1tb/2Rk + ZP8/Pz//i4uL/1xcXP+FhYX/h4eH/xsbG/8eHh7/ISEh/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IiIi/yAgIP8gICD/ICAg/yAgIP9jY2P/pqam/7q6 + uv/Gxsbx////AdXV1TfT09P/zc3N/8fHx//AwMD/ubm5/7CwsP+np6f/nJyc/4+Pj/+AgID/b29v/01N + Tf9AQED/YWFh/2xsbP83Nzf/VlZW/319ff/Y2Nj/aWlp/yEhIf8fHx//JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8lJSX/JiYm/yUlJf8lJSX/JSUl/yUlJf8gICD/ICAg/yAg + IP9YWFj/paWl/7+/v//IyMjx////AdPT0zfQ0ND/ysrK/8PDw/+7u7v/srKy/6mpqf+enp7/kZGR/4SE + hP90dHT/ZWVl/1RUVP8/Pz//aWlp/4qKiv9LS0v/NjY2/7u7u/+BgYH/JCQk/yEhIf8kJCT/JSUl/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JCQk/yAgIP9TU1P/paWl/8PDw//Ly8vx////AdDQ0DfNzc3/xsbG/76+vv+2trb/rKys/6Gh + of+UlJT/hoaG/2VlZf9VVVX/XV1d/2NjY/89PT3/hISE/2tra/9ubm7/YmJi/zY2Nv8jIyP/IiIi/yYm + Jv8lJSX/JCQk/yUlJf8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/yYmJv8lJSX/JiYm/yYmJv9sbGz/qKio/8fHx//Ozs7x////Ac3NzTfJycn/wsLC/7m5 + uf+vr6//pKSk/5eXl/+IiIj/dnZ2/1RUVP9BQUH/Xl5e/2pqav83Nzf/YWFh/2pqav+5ubn/pqam/yAg + IP8bGxv/IyMj/yQkJP8kJCT/JSUl/yUlJf8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JiYm/yUl + Jf8mJib/JiYm/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/xoaGv9iYmL/u7u7/8rKyv/Q0NDx////AcvL + yzfGxsb/vr6+/7Ozs/+np6f/mpqa/4uLi/96enr/bGxs/1hYWP8+Pj7/ZGRk/35+fv9UVFT/NjY2/6en + p/+4uLj/Jycn/yEhIf8iIiL/JCQk/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/HBwc/zU1Nf+vr6//xsbG/83N + zf/S0tLx////AcjIyDfDw8P/ubm5/62trf+goKD/kJCQ/3Z2dv9cXFz/Y2Nj/2NjY/9GRkb/cHBw/4GB + gf9dXV3/R0dH/0FBQf8wMDD/ICAg/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8lJSX/JiYm/yUlJf81NTX/Pz8//6mp + qf/ExMT/ysrK/8/Pz//V1dXx////AcbGxjfAwMD/tbW1/6ampv+Xl5f/g4OD/2JiYv9FRUX/X19f/2pq + av9BQUH/bm5u/1xcXP+VlZX/zc3N/yIiIv8YGBj/IyMj/yQkJP8kJCT/KCgo/0VFRf9jY2P/a2tr/11d + Xf89PT3/JiYm/yMjI/8jIyP/JCQk/yQkJP8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yAg + IP9HR0f/q6ur/8HBwf/Hx8f/zc3N/9LS0v/X19fx////AcTExDe+vr7/sbGx/6Kiov+Pj4//enp6/2Nj + Y/9AQED/Y2Nj/3Z2dv9eXl7/MTEx/4qKiv/Z2dn/Ozs7/yEhIf8kJCT/JCQk/yQkJP9kZGT/srKy/8rK + yv/Ly8v/zMzM/8zMzP/Kysr/qKio/1NTU/8kJCT/JCQk/yQkJP8kJCT/JSUl/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/IyMj/x0dHf+YmJj/wMDA/8bGxv/Ly8v/0NDQ/9XV1f/a2trx////AcTExDe9vb3/rq6u/5ub + m/92dnb/eXl5/2xsbP9VVVX/Y2Nj/5GRkf9XV1f/Nzc3/09PT/9OTk7/ICAg/yIiIv8kJCT/KSkp/4+P + j//MzMz/zMzM/8vLy//Ly8v/zMzM/8zMzP/MzMz/y8vL/8nJyf9/f3//JCQk/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8rKyv/ISEh/5GRkf+/v7//xcXF/8rKyv/Pz8//09PT/9jY2P/c3Nzx////AcTE + xDe9vb3/rq6u/4qKiv9SUlL/cHBw/3Jycv9UVFT/b29v/1paWv9+fn7/y8vL/y4uLv8bGxv/Hx8f/yMj + I/8kJCT/d3d3/8rKyv/Ly8v/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/8rKyv/Jycn/Y2Nj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8/Pz//mpqa/729vf/Dw8P/ycnJ/83Nzf/S0tL/1tbW/9ra + 2v/e3t7x////AcTExDe/v7//sbGx/42Njf9MTEz/cHBw/3p6ev9qamr/OTk5/3V1df/Q0ND/bW1t/yAg + IP8fHx//IyMj/yQkJP8xMTH/wMDA/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8rK + yv/Ly8v/srKy/ygoKP8kJCT/JCQk/yQkJP8kJCT/IiIi/xMTE/95eXn/u7u7/8PDw//IyMj/zc3N/9HR + 0f/W1tb/2dnZ/9zc3P/g4ODx////AcXFxTfAwMD/tbW1/5KSkv9qamr/ZWVl/5KSkv9lZWX/Ojo6/2ho + aP98fHz/ICAg/x8fH/8jIyP/JCQk/yQkJP9NTU3/zc3N/83Nzf/MzMz/zc3N/83Nzf/Nzc3/zc3N/83N + zf/MzMz/y8vL/8vLy//MzMz/y8vL/zg4OP8kJCT/JCQk/yQkJP8mJib/FRUV/29vb/+4uLj/wcHB/8fH + x//Nzc3/0dHR/9XV1f/Z2dn/3Nzc/9/f3//i4uLx////AcbGxjfBwcH/t7e3/4uLi/9vb2//aGho/29v + b/9paWn/srKy/zw8PP8jIyP/ICAg/yQkJP8jIyP/JCQk/yMjI/9MTEz/zMzM/8zMzP/MzMz/zMzM/83N + zf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/y8vL/zs7O/8jIyP/JCQk/yQkJP85OTn/gICA/7m5 + uf/AwMD/xsbG/8zMzP/R0dH/1dXV/9jY2P/b29v/39/f/+Hh4f/k5OTx////AcfHxzfDw8P/r6+v/4WF + hf99fX3/Pj4+/2VlZf+xsbH/qamp/yAgIP8fHx//JCQk/yQkJP8jIyP/JCQk/yQkJP8xMTH/wMDA/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/tra2/ykpKf8jIyP/IyMj/xIS + Ev9dXV3/tbW1/8DAwP/Gxsb/zMzM/9DQ0P/V1dX/2NjY/9zc3P/f39//4eHh/+Tk5P/m5ubx////AcnJ + yTfGxsb/rq6u/5CQkP+AgID/ODg4/3p6ev+tra3/JSUl/yAgIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/fn5+/83Nzf/MzMz/zc3N/83Nzf/MzMz/zc3N/83Nzf/MzMz/zMzM/8vLy//Kysr/bm5u/yQk + JP8kJCT/FhYW/01NTf+ysrL/wMDA/8bGxv/Ly8v/0NDQ/9TU1P/Y2Nj/29vb/9/f3//h4eH/4+Pj/+Xl + 5f/n5+fx////AczMzDfJycn/tLS0/4mJif9ZWVn/kZGR/05OTv8uLi7/Hx8f/yEhIf8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/Kysr/5iYmP/MzMz/zMzM/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8vL + y/+QkJD/Jycn/yMjI/81NTX/ZGRk/7S0tP/BwcH/xsbG/8vLy//Q0ND/1NTU/9jY2P/b29v/3t7e/+Hh + 4f/j4+P/5eXl/+fn5//p6enx////Ac/PzzfMzMz/vb29/11dXf+Ojo7/zs7O/zExMf8cHBz/ISEh/yIi + Iv8iIiL/NSIf/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/ygoKP9xcXH/vb29/8zMzP/Nzc3/zc3N/83N + zf/MzMz/ubm5/2pqav8nJyf/IyMj/xkZGf88PDz/ra2t/8HBwf/Gxsb/y8vL/9DQ0P/U1NT/2NjY/9vb + 2//e3t7/4ODg/+Pj4//l5eX/5+fn/+np6f/q6urx////AdLS0jfPz8//ysrK/62trf/Nzc3/OTk5/x8f + H/8hISH/IyMj/yIiIv9ZJBv/dCcZ/yIiIf8iIiL/IyMj/yMjI/8oIiH/IyIi/yMjI/8jIyP/Kysr/1NT + U/9vb2//fHx8/29vb/9OTk7/Kioq/yMjI/8jIyP/Gxsb/yoqKv+oqKj/wsLC/8fHx//MzMz/0NDQ/9TU + 1P/Y2Nj/29vb/97e3v/g4OD/4uLi/+Xl5f/n5+f/6enp/+rq6v/s7Ozx////AdXV1TfT09P/zs7O/7e3 + t/9CQkL/IiIi/yIiIv8kJCT/IiIi/00jHP+oKhP/SiMc/0MiHP9xJhj/WiQa/1wlG/9+KBj/LSMh/zEj + IP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yMjI/8vLy//TExM/6mpqf/Dw8P/yMjI/83N + zf/R0dH/1dXV/9jY2P/b29v/3t7e/+Dg4P/j4+P/5eXl/+fn5//o6Oj/6urq/+zs7P/t7e3x////AdnZ + 2TfW1tb/0tLS/7y8vP8zMzP/IyMj/yMjI/8iIiL/NyIe/50pFP8tIR//bSYZ/4knFv85Ix//TyQc/y4i + If9gJhv/XiUb/3ImGP9BIx7/KCMh/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/x4eHv8lJSX/o6Oj/8XF + xf/Kysr/zs7O/9LS0v/W1tb/2dnZ/9zc3P/e3t7/4ODg/+Pj4//l5eX/5+fn/+jo6P/q6ur/6+vr/+3t + 7f/u7u7x////Adzc3DfZ2dn/1dXV/7Gxsf8lJSX/IyMj/yMjI/8iIiL/JCEh/1gkG/97Jhb/aCQX/34n + F/95Jhf/aiUZ/3wmF/88Ix7/UCQc/20mGf9oJhr/bSYZ/zIjIP8iIiL/IyMj/yMjI/8jIyP/ISEh/xkZ + Gf+YmJj/yMjI/8zMzP/Q0ND/1NTU/9fX1//a2tr/3d3d/9/f3//h4eH/4+Pj/+Xl5f/n5+f/6Ojo/+rq + 6v/r6+v/7e3t/+7u7v/v7+/x////Ad/f3zfd3d3/2dnZ/8fHx/9OTk7/JCQk/yMjI/8iIiL/IiIi/yEh + If8pISD/QSMd/0QjHf9pJRn/ISAg/3QlF/9DIx3/WCQb/ywiIP84Ix//aiYa/2UmGv9TJRz/IiIi/yIi + Iv8rKyv/Pj4+/5WVlf/Ly8v/z8/P/9LS0v/V1dX/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXl/+fn + 5//p6en/6urq/+vr6//t7e3/7u7u/+/v7//w8PDx////AeHh4Tfg4OD/3d3d/9ra2v/V1dX/k5OT/zc3 + N/8iIiL/IiIi/yIiIv8hISH/ISEh/yQhIP9oJRn/cSQX/2glGf+EJxb/PiMe/0kjHP9BIx7/YiUa/28m + Gf8kIyL/IyMj/yIiIv8cHBz/kJCQ/87Ozv/S0tL/1dXV/9jY2P/b29v/3d3d/+Dg4P/i4uL/5OTk/+Xl + 5f/n5+f/6Ojo/+np6f/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fHx////AeTk5Dfj4+P/4ODg/97e + 3v/b29v/2dnZ/8vLy/91dXX/Kioq/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/1wkGv90Jhj/QyIc/4An + F/8mIiH/ZyYa/ygjIv8jIyP/JCQk/xQUFP99fX3/0dHR/9bW1v/Y2Nj/2tra/93d3f/f39//4uLi/+Tk + 5P/l5eX/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7u7u/+/v7//w8PD/8PDw//Hx8f/y8vLx////Aefn + 5zfm5ub/4+Pj/+Hh4f/g4OD/3t7e/9zc3P/Z2dn/t7e3/1paWv9PT0//NTU1/yIiIv8hISH/ISEh/yEh + If9UJBz/iSgW/0QjHf9yJhj/VCYd/yMjIv8nJyf/Nzc3/3Z2dv/S0tL/2dnZ/9vb2//e3t7/4ODg/+Li + 4v/k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fH/8vLy//Ly + 8v/z8/Px////Aenp6Tfp6en/5+fn/+Xl5f/j4+P/4uLi/+Dg4P/e3t7/3d3d/9vb2//a2tr/ysrK/0BA + QP8iIiL/IiIi/yIiIv8iIiL/KCIh/2snGv9RJR7/IyMi/yIiIv8bGxv/eXl5/9bW1v/d3d3/39/f/+Dg + 4P/i4uL/5OTk/+bm5v/n5+f/6Ojo/+np6f/q6ur/6+vr/+zs7P/t7e3/7u7u/+/v7//w8PD/8PDw//Hx + 8f/y8vL/8/Pz//Pz8//09PTx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Tk5P/j4+P/4eHh/+Dg + 4P/f39//3t7e/5SUlP8rKyv/IiIi/yIiIv8iIiL/IiIi/yMjI/8iIiL/IyMj/xYWFv9SUlL/1dXV/+Hh + 4f/i4uL/4+Pj/+Xl5f/m5ub/5+fn/+np6f/q6ur/6+vr/+zs7P/t7e3/7e3t/+7u7v/v7+//7+/v//Dw + 8P/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/19fXx////Ae3t7Tft7e3/7Ozs/+vr6//q6ur/6enp/+fn + 5//m5ub/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/IyMj/YmJi/yQkJP8jIyP/IyMj/yMjI/8kJCT/WFhY/11d + Xf/U1NT/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw + 8P/w8PD/8fHx//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/19fXx////Ae/v7zfu7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/7CwsP9HR0f/IyMj/yMj + I/+Dg4P/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//T09P/09PT/9fX1//X19f/29vbx////AfHx + 8Tfw8PD/7+/v/+/v7//u7u7/7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/6Ojo/+jo6P/n5+f/6Ojo/+jo + 6P/f39//kZGR/4GBgf/m5ub/6enp/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Hx8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//X19f/19fX/9vb2//b2 + 9v/29vbx////AfLy8jfy8vL/8fHx//Dw8P/w8PD/7+/v/+7u7v/u7u7/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//09PT/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//f39//39/fx////AfPz8zfz8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+/v + 7//u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//b29v/29vb/9/f3//f39//39/fx////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B7+/v8e/v7//u7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5OTk/+Pj4//h4eH/4ODg/97e3v/d3d3/29vb/9ra + 2v/Y2Nj/19fX/9XV1f/R0dH/zs7O/8vLy//Hx8f/xMTE/8HBwf++vr7/u7u7/7i4uP+1tbX/srKy/7Cw + sP+vr6//rq6u/62trf+urq7/r6+v/7CwsP+xsbH/s7Oz/7W1tf+3t7f/urq6/7y8vP+/v7//wcHB/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/0NDQ/9LS0v/V1dX/19fX/9nZ2f/c3Nz/3t7e/+Dg4Jf///8B////Ae/v + 7/Hu7u7/7e3t/+3t7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//l5eX/5OTk/+Li4v/h4eH/39/f/93d + 3f/c3Nz/2tra/9jY2P/W1tb/1dXV/9LS0v/Q0ND/zMzM/8jIyP/ExMT/wMDA/7y8vP+4uLj/tLS0/7Cw + sP+srKz/qKio/6Wlpf+kpKT/o6Oj/6Kiov+ioqL/o6Oj/6Wlpf+np6f/qKio/6qqqv+tra3/sLCw/7Oz + s/+2trb/uLi4/7u7u/++vr7/wcHB/8PDw//Gxsb/ycnJ/8vLy//Ozs7/0dHR/9TU1P/W1tb/2dnZ/9zc + 3P/e3t6X////Af///wHu7u7x7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/5+fn/+bm5v/l5eX/5OTk/+Li + 4v/g4OD/3t7e/93d3f/b29v/2dnZ/9fX1//U1NT/0tLS/9DQ0P/Nzc3/ycnJ/8bGxv/BwcH/vLy8/7e3 + t/+ysrL/rq6u/6ioqP+hoaH/k5OT/5iYmP+VlZX/lJSU/5SUlP+VlZX/lpaW/5iYmP+ampr/nJyc/5+f + n/+hoaH/paWl/6mpqf+srKz/r6+v/7Kysv+1tbX/uLi4/7u7u/++vr7/wcHB/8TExP/Hx8f/ysrK/87O + zv/R0dH/1NTU/9fX1//a2tr/3Nzcl////wH///8B7e3t8ezs7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm + 5v/k5OT/4+Pj/+Hh4f/f39//3t7e/9zc3P/a2tr/2NjY/9XV1f/T09P/0NDQ/87Ozv/Kysr/x8fH/8PD + w/+/v7//urq6/7W1tf+urq7/qKio/6Ghof+ZmZn/fX19/2RkZP94eHj/hoaG/4WFhf+Ghob/h4eH/4qK + iv+MjIz/jo6O/5GRkf+VlZX/mJiY/5ycnP+goKD/pKSk/6enp/+rq6v/rq6u/7Kysv+1tbX/uLi4/7u7 + u/+/v7//w8PD/8bGxv/Kysr/zs7O/9HR0f/U1NT/19fX/9ra2pf///8B////Aezs7PHr6+v/6urq/+np + 6f/o6Oj/5+fn/+Xl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9XV1f/S0tL/z8/P/8zM + zP/IyMj/xcXF/8HBwf+8vLz/uLi4/7Ozs/+tra3/pKSk/5ycnP+Tk5P/ioqK/2pqav9jY2P/ampq/3l5 + ef94eHj/eHh4/3p6ev99fX3/gYGB/4SEhP+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//o6Oj/6en + p/+rq6v/r6+v/7Kysv+2trb/urq6/76+vv/CwsL/xsbG/8rKyv/Nzc3/0dHR/9XV1f/X19eX////Af// + /wHq6urx6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra2v/Y2Nj/1tbW/9TU + 1P/R0dH/zs7O/8vLy//Hx8f/w8PD/7+/v/+6urr/tbW1/7CwsP+qqqr/oqKi/5iYmP+Ojo7/g4OD/3p6 + ev9oaGj/ZWVl/2dnZ/9tbW3/bGxs/21tbf9wcHD/c3Nz/3Z2dv96enr/fX19/4GBgf+FhYX/ioqK/46O + jv+Tk5P/l5eX/5ubm/+goKD/pKSk/6ioqP+srKz/sLCw/7W1tf+5ubn/vr6+/8LCwv/Gxsb/ysrK/87O + zv/S0tL/1dXVl////wH///8B6enp8ejo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra + 2v/Y2Nj/1tbW/9PT0//R0dH/zs7O/8rKyv/Hx8f/w8PD/76+vv+5ubn/s7Oz/66urv+oqKj/oKCg/5aW + lv+MjIz/gICA/3Z2dv9ubm7/Z2dn/2tra/9tbW3/Y2Nj/2JiYv9jY2P/Z2dn/2pqav9tbW3/cHBw/3Nz + c/93d3f/fHx8/4CAgP+FhYX/ioqK/46Ojv+Tk5P/mJiY/52dnf+hoaH/pqam/6urq/+vr6//tLS0/7m5 + uf+9vb3/wsLC/8bGxv/Ly8v/z8/P/9LS0pf///8B////Aejo6PHn5+f/5ubm/+Xl5f/j4+P/4uLi/+Dg + 4P/f39//3d3d/9ra2v/Y2Nj/1tbW/9PT0//Q0ND/zc3N/8rKyv/Hx8f/w8PD/76+vv+4uLj/s7Oz/62t + rf+mpqb/n5+f/5SUlP+Kior/eHh4/1dXV/9fX1//Z2dn/2lpaf9vb2//dHR0/2VlZf9aWlr/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9qamr/bm5u/3Nzc/93d3f/fHx8/4GBgf+Ghob/i4uL/5CQkP+VlZX/mpqa/5+f + n/+kpKT/qqqq/6+vr/+0tLT/ubm5/76+vv/Dw8P/yMjI/8zMzP/Pz8+X////Af///wHo6Ojx5ubm/+Xl + 5f/k5OT/4uLi/+Dg4P/f39//3d3d/9vb2//Y2Nj/1tbW/9PT0//Q0ND/zc3N/8nJyf/Gxsb/wsLC/729 + vf+4uLj/s7Oz/62trf+mpqb/nZ2d/5SUlP+IiIj/fHx8/2JiYv9MTEz/TExM/2JiYv9sbGz/cXFx/3Z2 + dv9jY2P/UlJS/1RUVP9PT0//NDQ0/0xMTP9eXl7/YmJi/2ZmZv9qamr/b29v/3Nzc/95eXn/fn5+/4OD + g/+JiYn/jo6O/5SUlP+ZmZn/np6e/6SkpP+qqqr/r6+v/7W1tf+6urr/v7+//8XFxf/Jycn/zc3Nl/// + /wH///8B5+fn8eXl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/1tbW/9PT0//Q0ND/zc3N/8nJ + yf/FxcX/wcHB/729vf+4uLj/s7Oz/62trf+mpqb/np6e/5SUlP+IiIj/fHx8/3BwcP9dXV3/TExM/0dH + R/9kZGT/b29v/319ff+CgoL/YWFh/0xMTP9JSUn/JCQk/xwcHP8gICD/NjY2/1RUVP9eXl7/YmJi/2Zm + Zv9ra2v/cHBw/3Z2dv97e3v/gYGB/4eHh/+MjIz/kpKS/5iYmP+enp7/pKSk/6urq/+xsbH/t7e3/7y8 + vP/CwsL/x8fH/8vLy5f///8B////Aebm5vHk5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9TU + 1P/R0dH/zc3N/8rKyv/Gxsb/wcHB/729vf+4uLj/s7Oz/6ysrP+mpqb/np6e/5WVlf+JiYn/fn5+/3Bw + cP9iYmL/W1tb/1dXV/9NTU3/ZWVl/3l5ef+Xl5f/ampq/2xsbP9GRkb/JSUl/xsbG/8vLy//Hh4e/x4e + Hv8kJCT/QkJC/1hYWP9eXl7/Y2Nj/2hoaP9ubm7/c3Nz/3l5ef9/f3//hYWF/4yMjP+SkpL/mJiY/5+f + n/+mpqb/ra2t/7Ozs/+6urr/v7+//8XFxf/JycmX////Af///wHk5OTx4+Pj/+Hh4f/f39//3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zs7O/8rKyv/Gxsb/wsLC/729vf+4uLj/s7Oz/62trf+mpqb/n5+f/5WV + lf+Kior/fX19/2FhYf9eXl7/VlZW/1paWv9mZmb/VlZW/21tbf+Wlpb/Z2dn/2xsbP+Ghob/RERE/xsb + G/8mJib/HBwc/x4eHv8eHh7/Hh4e/x4eHv8sLCz/TExM/1paWv9gYGD/ZmZm/2xsbP9xcXH/d3d3/35+ + fv+EhIT/i4uL/5KSkv+ampr/oaGh/6ioqP+wsLD/t7e3/729vf/Dw8P/yMjIl////wH///8B4+Pj8eHh + 4f/g4OD/3t7e/9zc3P/a2tr/2NjY/9XV1f/S0tL/zs7O/8rKyv/Hx8f/wsLC/729vf+4uLj/s7Oz/66u + rv+np6f/n5+f/5eXl/+Kior/fn5+/2dnZ/9ISEj/QUFB/1FRUf9jY2P/ampq/01NTf+EhIT/bm5u/2Vl + Zf+IiIj/5eXl/39/f/8jIyP/Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/HR0d/x8fH/83Nzf/VFRU/15e + Xv9kZGT/aWlp/3BwcP92dnb/fX19/4SEhP+MjIz/k5OT/5ycnP+kpKT/rKys/7S0tP+8vLz/wsLC/8fH + x5f///8B////AeLi4vHg4OD/3t7e/9zc3P/a2tr/2NjY/9bW1v/T09P/z8/P/8vLy//Hx8f/w8PD/76+ + vv+5ubn/s7Oz/62trf+np6f/n5+f/5aWlv+MjIz/f39//3Jycv9fX1//SUlJ/zo6Ov9XV1f/aWlp/3Bw + cP9PT0//V1dX/11dXf+IiIj/39/f/7S0tP8nJyf/Jycn/yEhIf8lJSX/JCQk/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/yUlJf9ERET/W1tb/2JiYv9oaGj/b29v/3Z2dv99fX3/hYWF/42Njf+Wlpb/n5+f/6mp + qf+ysrL/urq6/8HBwf/GxsaX////Af///wHh4eHx39/f/93d3f/b29v/2NjY/9bW1v/T09P/0NDQ/8zM + zP/IyMj/w8PD/76+vv+5ubn/tLS0/66urv+np6f/oKCg/5aWlv+Li4v/gICA/3R0dP9nZ2f/XV1d/01N + Tf86Ojr/WVlZ/25ubv+Li4v/c3Nz/05OTv9dXV3/0dHR/8bGxv8uLi7/JiYm/yAgIP8kJCT/JSUl/yYm + Jv8lJSX/IiIi/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/zAwMP9RUVH/YWFh/2dnZ/9ubm7/dXV1/319 + ff+Ghob/kJCQ/5qamv+lpaX/r6+v/7m5uf/BwcH/xsbGl////wH///8B4ODg8d7e3v/b29v/2dnZ/9bW + 1v/T09P/0NDQ/8zMzP/IyMj/xMTE/7+/v/+6urr/tLS0/66urv+oqKj/oaGh/5iYmP+MjIz/gYGB/25u + bv9mZmb/Xl5e/1paWv9iYmL/SkpK/1lZWf+Ghob/hYWF/1hYWP9paWn/Ozs7/2xsbP81NTX/JiYm/yAg + IP8kJCT/JSUl/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x4eHv8eHh7/IiIi/z4+ + Pv9bW1v/ZGRk/2tra/90dHT/fn5+/4qKiv+Wlpb/oaGh/62trf+3t7f/wcHB/8bGxpf///8B////Ad7e + 3vHc3Nz/2tra/9fX1//U1NT/0NDQ/8zMzP/IyMj/xMTE/8DAwP+7u7v/tbW1/6+vr/+oqKj/oaGh/5mZ + mf+Ojo7/goKC/3Jycv9OTk7/RUVF/1RUVP9dXV3/ZmZm/0ZGRv9qamr/ioqK/1RUVP99fX3/tLS0/4CA + gP8bGxv/HR0d/x4eHv8jIyP/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/KSkp/0pKSv9fX1//ampq/3d3d/+EhIT/kpKS/5+fn/+rq6v/tra2/8DA + wP/Hx8eX////Af///wHd3d3x2tra/9fX1//U1NT/0dHR/83Nzf/Jycn/xcXF/8DAwP+7u7v/tra2/7Cw + sP+qqqr/oqKi/5qamv+QkJD/hISE/3d3d/9nZ2f/TExM/zw8PP9SUlL/ZGRk/2pqav9BQUH/Wlpa/1RU + VP97e3v/ra2t/+rq6v9OTk7/IiIi/xsbG/8kJCT/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/NjY2/11dXf9ycnL/f39//4yM + jP+cnJz/qamp/7W1tf/AwMD/x8fHl////wH///8B29vb8djY2P/V1dX/0tLS/87Ozv/Kysr/xsbG/8HB + wf+8vLz/t7e3/7Gxsf+qqqr/pKSk/5ycnP+SkpL/h4eH/3p6ev9tbW3/YWFh/05OTv82Njb/VFRU/2lp + af94eHj/bGxs/zMzM/9fX1//pKSk/+/v7/9gYGD/JCQk/yAgIP8kJCT/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8mJib/Tk5O/1xcXP9oaGj/k5OT/6enp/+0tLT/wMDA/8fHx5f///8B////AdnZ2fHW1tb/09PT/8/P + z//Ly8v/x8fH/8LCwv+9vb3/t7e3/7Kysv+rq6v/pKSk/52dnf+Tk5P/iIiI/3t7e/9vb2//ZWVl/1xc + XP9cXFz/SkpK/09PT/92dnb/l5eX/1lZWf9GRkb/MTEx/6enp/9tbW3/IiIi/yAgIP8iIiL/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JCQk/yIi + Iv8fHx//Hx8f/yAgIP8gICD/ICAg/yAgIP8pKSn/Wlpa/46Ojv+np6f/tbW1/8HBwf/Hx8eX////Af// + /wHX19fx1NTU/9DQ0P/MzMz/yMjI/8PDw/++vr7/ubm5/7Ozs/+srKz/paWl/52dnf+UlJT/iYmJ/319 + ff9cXFz/SkpK/1lZWf9aWlr/Y2Nj/0xMTP9TU1P/k5OT/2BgYP9sbGz/i4uL/2BgYP8YGBj/Hh4e/yEh + If8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8lJSX/JCQk/yEhIf8gICD/ICAg/yAgIP8gICD/ICAg/zQ0NP+QkJD/qKio/7e3 + t//Dw8P/yMjIl////wH///8B1dXV8dLS0v/Ozs7/ycnJ/8XFxf/AwMD/urq6/7S0tP+urq7/p6en/5+f + n/+VlZX/i4uL/39/f/9xcXH/UVFR/zw8PP9OTk7/YWFh/2dnZ/9ISEj/UVFR/2lpaf9kZGT/ioqK/+fn + 5/+NjY3/Hh4e/xgYGP8fHx//JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/IyMj/yAgIP8gICD/ICAg/yEh + If8uLi7/jo6O/6urq/+7u7v/xcXF/8nJyZf///8B////AdPT0/HPz8//y8vL/8bGxv/BwcH/u7u7/7W1 + tf+vr6//qKio/6CgoP+Wlpb/jY2N/4GBgf91dXX/aWlp/1NTU/82Njb/TU1N/2dnZ/9vb2//Y2Nj/yoq + Kv9SUlL/hoaG/9/f3/+pqan/JSUl/yQkJP8gICD/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/ISEh/yAgIP8gICD/Jycn/4ODg/+qqqr/wMDA/8fHx//Ly8uX////Af///wHR0dHxzc3N/8jI + yP/Dw8P/vb29/7e3t/+wsLD/qqqq/6Kiov+YmJj/jo6O/4SEhP93d3f/bW1t/2NjY/9aWlr/R0dH/0hI + SP9tbW3/jIyM/3R0dP8vLy//MjIy/6+vr//AwMD/Jycn/yYmJv8gICD/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8kJCT/ICAg/yUlJf+EhIT/ra2t/8PDw//Jycn/zc3Nl/// + /wH///8Bz8/P8cvLy//Gxsb/wMDA/7q6uv+zs7P/rKys/6SkpP+bm5v/kZGR/4aGhv9xcXH/VVVV/19f + X/9dXV3/YmJi/1ZWVv8/Pz//h4eH/4GBgf9TU1P/cHBw/zc3N/8nJyf/R0dH/yQkJP8hISH/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf81NTX/i4uL/6+v + r//Gxsb/y8vL/8/Pz5f///8B////Ac3NzfHIyMj/w8PD/7y8vP+1tbX/rq6u/6ampv+dnZ3/kpKS/4eH + h/96enr/WVlZ/0RERP9NTU3/Xl5e/2dnZ/9UVFT/QUFB/4uLi/9PT0//fHx8/7y8vP/Gxsb/Hh4e/xgY + GP8dHR3/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/SUlJ/4+Pj/+4uLj/ycnJ/83Nzf/R0dGX////Af///wHLy8vxxcXF/7+/v/+4uLj/sLCw/6io + qP+fn5//lZWV/4mJif98fHz/b29v/1paWv8/Pz//SEhI/2VlZf9ra2v/YmJi/yQkJP9JSUn/enp6/7Gx + sf/k5OT/QEBA/yMjI/8dHR3/ISEh/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8kJCT/ERER/y8vL/+rq6v/xcXF/8rKyv/Pz8//0tLSl////wH///8BycnJ8cPD + w/+8vLz/tLS0/6urq/+ioqL/l5eX/4yMjP9/f3//c3Nz/2lpaf9eXl7/RERE/0VFRf9paWn/fHx8/4uL + i/8nJyf/Ojo6/5ycnP/o6Oj/UlJS/yIiIv8gICD/IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/FhYW/ywsLP+fn5//wsLC/8jIyP/MzMz/0NDQ/9TU + 1Jf///8B////AcbGxvHAwMD/ubm5/7CwsP+mpqb/m5ub/4+Pj/+AgID/YmJi/2ZmZv9kZGT/YWFh/2Bg + YP84ODj/d3d3/5SUlP9WVlb/W1tb/ygoKP87Ozv/XV1d/yEhIf8fHx//IiIi/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8nJyf/Kysr/ygoKP+ZmZn/wMDA/8bG + xv/Kysr/zs7O/9LS0v/W1taX////Af///wHFxcXxvr6+/7W1tf+rq6v/oKCg/5OTk/+Ghob/a2tr/0tL + S/9MTEz/YWFh/2ZmZv9hYWH/NjY2/5KSkv9dXV3/aWlp/5KSkv/FxcX/ISEh/yEhIf8bGxv/IiIi/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JiYm/ysrK/8rKyv/KCgo/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/NTU1/2tr + a/+jo6P/v7+//8TExP/IyMj/zMzM/9HR0f/V1dX/2NjYl////wH///8Bw8PD8bu7u/+xsbH/pqam/5qa + mv+MjIz/fHx8/2ZmZv9JSUn/RkZG/2RkZP9sbGz/Z2dn/ycnJ/9UVFT/YmJi/4uLi//p6en/hoaG/x8f + H/8bGxv/ICAg/yUlJf8kJCT/IyMj/ygoKP9OTk7/f39//6Ghof+ysrL/s7Oz/6ioqP+Pj4//YmJi/zMz + M/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yUl + Jf8lJSX/HBwc/xkZGf+Li4v/vLy8/8LCwv/Gxsb/y8vL/8/Pz//T09P/19fX/9nZ2Zf///8B////AcLC + wvG5ubn/r6+v/6Ojo/+Wlpb/hoaG/3d3d/9nZ2f/SkpK/0VFRf9qamr/dHR0/5CQkP8uLi7/Nzc3/4CA + gP/j4+P/m5ub/x0dHf8hISH/IiIi/yYmJv8kJCT/IyMj/0hISP+lpaX/ycnJ/8vLy//Ly8v/y8vL/8zM + zP/MzMz/zc3N/83Nzf++vr7/cnJy/yoqKv8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/IiIi/xEREf9/f3//u7u7/8LCwv/Gxsb/ycnJ/83Nzf/R0dH/1dXV/9jY + 2P/b29uX////Af///wHBwcHxuLi4/62trf+hoaH/h4eH/35+fv94eHj/bGxs/2hoaP9BQUH/bGxs/5OT + k/92dnb/RkZG/yQkJP9LS0v/lZWV/yAgIP8iIiL/ICAg/yUlJf8kJCT/JCQk/2lpaf/Gxsb/zc3N/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/y8vL/8rKyv+np6f/Nzc3/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/IyMj/wwMDP93d3f/uLi4/8HBwf/FxcX/ycnJ/8zM + zP/Q0ND/1NTU/9fX1//a2tr/3Nzcl////wH///8BwcHB8be3t/+srKz/mJiY/2FhYf9VVVX/eXl5/3Bw + cP9ubm7/Ojo6/4WFhf9+fn7/UFBQ/35+fv+bm5v/Jycn/zAwMP8bGxv/HR0d/yMjI/8kJCT/IyMj/19f + X//Gxsb/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8rKyv/Kysr/ycnJ/6Oj + o/8rKyv/IyMj/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/MjIy/1lZWf+AgID/t7e3/8DA + wP/ExMT/yMjI/8vLy//Pz8//0tLS/9bW1v/Z2dn/29vb/97e3pf///8B////AcLCwvG5ubn/ra2t/5WV + lf9fX1//SkpK/3l5ef90dHT/c3Nz/zIyMv9qamr/TU1N/3x8fP/CwsL/ycnJ/ywsLP8aGhr/Gxsb/yIi + Iv8jIyP/JCQk/zU1Nf+2trb/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vL + y//Kysr/ysrK/8rKyv/Kysr/c3Nz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8kJCT/ISEh/xUV + Ff9zc3P/s7Oz/7+/v//Dw8P/x8fH/8vLy//Ozs7/0tLS/9XV1f/Y2Nj/2tra/93d3f/f39+X////Af// + /wHDw8Pxu7u7/6+vr/+Wlpb/X19f/0dHR/96enr/enp6/4mJif9DQ0P/Pj4+/3Z2dv+0tLT/2dnZ/zk5 + Of8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP9paWn/zMzM/83Nzf/MzMz/zMzM/83Nzf/Nzc3/zs7O/83N + zf/Nzc3/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/zMzM/7Ozs/8rKyv/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8kJCT/ISEh/w0NDf9RUVH/r6+v/76+vv/CwsL/x8fH/8rKyv/Ozs7/0dHR/9TU1P/X19f/2tra/9zc + 3P/f39//4eHhl////wH///8Bw8PD8b29vf+zs7P/mZmZ/3V1df9VVVX/c3Nz/4qKiv+Tk5P/RERE/zAw + MP9qamr/09PT/0NDQ/8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/kJCQ/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/83Nzf/MzMz/zMzM/8vLy//Ly8v/zMzM/83Nzf/Jycn/PDw8/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IyMj/w4ODv9KSkr/qamp/729vf/BwcH/xsbG/8rKyv/Ozs7/0dHR/9TU + 1P/X19f/2tra/9zc3P/e3t7/4eHh/+Li4pf///8B////AcPDw/G9vb3/tra2/5aWlv9/f3//UFBQ/3R0 + dP+Xl5f/UlJS/29vb/92dnb/ISEh/y8vL/8fHx//Hx8f/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/5iY + mP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/0dHR/8kJCT/JCQk/yQkJP8kJCT/KSkp/0RERP9WVlb/q6ur/7y8vP/AwMD/xcXF/8rK + yv/Nzc3/0dHR/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OSX////Af///wHFxcXxvr6+/7Oz + s/+Hh4f/goKC/0xMTP9wcHD/V1dX/2pqav+Tk5P/7u7u/1NTU/8eHh7/GRkZ/yQkJP8lJSX/JCQk/yQk + JP8kJCT/JCQk/yQkJP+Ghob/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8bGxv87Ozv/JCQk/yQkJP8kJCT/IyMj/xoaGv9ZWVn/pKSk/7y8 + vP/AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXll/// + /wH///8BxsbG8cDAwP+oqKj/hYWF/4qKiv9fX1//Pj4+/2hoaP+Ojo7/6enp/3V1df8dHR3/ICAg/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/VlZW/8vLy//Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy/+pqan/KCgo/yQkJP8kJCT/IiIi/xIS + Ev8vLy//oqKi/7u7u//AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li + 4v/k5OT/5eXl/+bm5pf///8B////AcjIyPHDw8P/qKio/4qKiv+cnJz/X19f/zMzM/+CgoL/1tbW/4eH + h/8eHh7/ICAg/yEhIf8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/ysrK/+np6f/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Jycn/YWFh/yQk + JP8kJCT/IyMj/xUVFf8mJib/lZWV/7u7u//AwMD/xMTE/8nJyf/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb + 2//e3t7/4ODg/+Li4v/j4+P/5eXl/+fn5//o6OiX////Af///wHKysrxxcXF/6qqqv+bm5v/cnJy/1ZW + Vv9iYmL/MzMz/0NDQ/8qKir/ISEh/yAgIP8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/R0dH/729vf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vL + y//Kysr/kZGR/ycnJ/8kJCT/JSUl/zY2Nv8zMzP/lpaW/7u7u//AwMD/xMTE/8jIyP/MzMz/0NDQ/9PT + 0//W1tb/2dnZ/9vb2//d3d3/4ODg/+Li4v/j4+P/5eXl/+bm5v/o6Oj/6enpl////wH///8By8vL8cfH + x/+1tbX/e3t7/1BQUP9/f3//0dHR/4WFhf8mJib/GRkZ/x8fH/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP9LS0v/tbW1/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/8zMzP/IyMj/j4+P/y4uLv8kJCT/IyMj/yIiIv9LS0v/lJSU/729vf/BwcH/xcXF/8jI + yP/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5eXl/+bm5v/o6Oj/6enp/+rq + 6pf///8B////Ac7OzvHKysr/urq6/1lZWf96enr/xcXF/7y8vP8kJCT/Hx8f/x0dHf8iIiL/IiIi/yIi + Iv8oIiH/PiId/yMiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/zMzM/+Dg4P/v7+//8vL + y//Nzc3/zc3N/83Nzf/Nzc3/zMzM/8rKyv+srKz/XV1d/yYmJv8kJCT/IyMj/xsbG/8UFBT/goKC/7u7 + u//CwsL/xcXF/8nJyf/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm + 5v/o6Oj/6enp/+rq6v/r6+uX////Af///wHQ0NDxzc3N/8nJyf+wsLD/t7e3/9LS0v8oKCj/ICAg/x0d + Hf8jIyP/IyMj/yIiIv8jISH/gicW/3UnGf8jIiH/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/zAwMP9dXV3/fX19/5OTk/+ZmZn/jo6O/29vb/9HR0f/Jycn/yQkJP8kJCT/IyMj/x0d + Hf8NDQ3/dXV1/7q6uv/CwsL/xsbG/8rKyv/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh + 4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozsl////wH///8B09PT8dDQ0P/MzMz/xcXF/3Z2 + dv88PDz/Hx8f/x8fH/8lJSX/IyMj/yIiIv8iISH/dyYX/44oFv8lIiH/IiIi/yQhIf88Ih7/KCIh/y0i + IP9gJRr/aCYa/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/IyMj/y0tLf8bGxv/cnJy/7i4uP/Dw8P/xsbG/8rKyv/Ozs7/0dHR/9TU1P/W1tb/2dnZ/9vb + 2//d3d3/39/f/+Hh4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozs/+3t7Zf///8B////AdXV + 1fHS0tL/z8/P/8jIyP9kZGT/NDQ0/yMjI/8kJCT/IyMj/yIiIv8iISH/aCQY/5cpFf+RKBX/fSYW/3kl + Fv+WKBT/jykW/3slFv9uJhn/UyUd/1omHf9GJB3/WSQa/ygiIf8jIyL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/IyMj/yIiIv9FRUX/gICA/729vf/ExMT/x8fH/8vLy//Ozs7/0dHR/9TU + 1P/X19f/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t + 7f/u7u6X////Af///wHY2Njx1dXV/9LS0v/Ly8v/UlJS/ycnJ/8iIiL/IyMj/yIiIv8iIiL/RiMd/7Yr + Ev8zIR7/JiAg/2QlGv+SKBX/LSIg/ykhIP9GIx3/KCIh/2ImG/9EJB7/aSYZ/2IkGf94Jhj/NiMf/yci + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yAgIP8MDAz/Xl5e/7e3t//FxcX/ycnJ/8zM + zP/Pz8//0tLS/9XV1f/X19f/2tra/9zc3P/e3t7/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+np + 6f/r6+v/7Ozs/+3t7f/u7u7/7+/vl////wH///8B2tra8dfX1//U1NT/ysrK/z4+Pv8iIiL/IyMj/yMj + I/8iIiL/IiIi/yUhIP9dJRv/kicU/1QiGf9QIhn/oyoU/0QiHP+TKBT/fScX/4YmFf9eJRr/LiIg/2ol + Gf+DJxf/bCYZ/2UmG/9yJhj/LCIh/yMiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8NDQ3/TExM/7i4 + uP/IyMj/y8vL/83Nzf/Q0ND/09PT/9bW1v/Z2dn/29vb/93d3f/e3t7/4ODg/+Hh4f/j4+P/5OTk/+bm + 5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v75f///8B////Ad3d3fHa2tr/19fX/83N + zf8/Pz//IyMj/yQkJP8jIyP/IyMj/yIiIv8hISH/ISEh/y4hH/9tJhn/gScX/0cjHf+aKRT/OiIe/yEh + If9LIxz/fScX/yUhIf8tIiD/KiIg/1clHP9HIx3/bSca/2smGv88Ix7/LCMh/yMjI/8jIyP/IyMj/ycn + J/8WFhb/RkZG/7S0tP/Kysr/zc3N/8/Pz//S0tL/1NTU/9fX1//a2tr/3Nzc/97e3v/f39//4eHh/+Li + 4v/j4+P/5eXl/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v7//w8PCX////Af// + /wHf39/x3d3d/9ra2v/Y2Nj/vr6+/1xcXP8lJSX/IyMj/yMjI/8iIiL/IiIi/yIiIv8hISH/ISEh/yEh + If8nISD/likV/zAhHv8nIB//iSYU/1skG/92JRf/aCUZ/yIiIf8iIiH/RyMd/3QmGP9dJRv/ayca/zUk + IP8jIyP/IiIi/yMjI/9GRkb/a2tr/7m5uf/Nzc3/z8/P/9HR0f/U1NT/1tbW/9jY2P/b29v/3d3d/9/f + 3//g4OD/4uLi/+Pj4//k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHxl////wH///8B4eHh8d/f3//d3d3/29vb/9nZ2f/W1tb/paWl/0dHR/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8hISH/ISEh/zkiHv99Jhb/hyYV/14kGv9tJBf/gicX/yQhIP8+Ih3/fCYX/0Ij + Hv9YJRz/hSgX/ykjIv8jIyP/IyMj/yMjI/8TExP/NjY2/62trf/Q0ND/0tLS/9TU1P/W1tb/2NjY/9ra + 2v/c3Nz/3t7e/+Dg4P/i4uL/4+Pj/+Tk5P/l5eX/5+fn/+jo6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8pf///8B////AePj4/Hh4eH/39/f/93d3f/c3Nz/2tra/9jY + 2P/Pz8//ioqK/zU1Nf8iIiL/IyMj/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/yIhIP9QIxv/qioT/y0h + H/82IR3/nCkU/zojH/8mIiH/YiUa/ysjIf8jIyL/IyMj/yQkJP8YGBj/KCgo/6urq//S0tL/1dXV/9fX + 1//Y2Nj/2tra/9zc3P/e3t7/4ODg/+Li4v/j4+P/5OTk/+Xl5f/n5+f/6Ojo/+jo6P/p6en/6urq/+vr + 6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vKX////Af///wHl5eXx5OTk/+Li + 4v/g4OD/39/f/93d3f/c3Nz/2tra/9jY2P/BwcH/aWlp/ygoKP8iIiL/IiIi/yIiIv8iIiL/ISEh/yEh + If8hISH/KSEg/1kkG/+LJxT/pykT/00kHf8kIiH/fCcX/3QoGv8kIyL/IyMj/yQkJP8cHBz/ICAg/6Cg + oP/U1NT/19fX/9nZ2f/b29v/3Nzc/97e3v/g4OD/4eHh/+Pj4//k5OT/5ubm/+fn5//o6Oj/6Ojo/+np + 6f/q6ur/6+vr/+zs7P/s7Oz/7e3t/+7u7v/v7+//7+/v//Dw8P/x8fH/8fHx//Ly8v/z8/P/8/Pzl/// + /wH///8B5+fn8ebm5v/l5eX/4+Pj/+Li4v/g4OD/39/f/97e3v/c3Nz/29vb/9jY2P+tra3/lpaW/5eX + l/9aWlr/JCQk/yIiIv8iIiL/ISEh/yEhIf8iISH/MiIg/10mG/91Jhj/fSYX/30oGf8mIyL/IyMj/yMj + I/9BQUH/WVlZ/6ampv/X19f/2tra/9zc3P/d3d3/39/f/+Dg4P/i4uL/4+Pj/+Tk5P/m5ub/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7u7u/+7u7v/v7+//8PDw//Dw8P/x8fH/8fHx//Ly + 8v/z8/P/8/Pz//T09Jf///8B////Aenp6fHo6Oj/5+fn/+bm5v/k5OT/4+Pj/+Li4v/h4eH/39/f/97e + 3v/d3d3/3Nzc/9vb2//b29v/1NTU/1VVVf8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8kIiL/UCUd/1cm + Hf8mIyL/IyMj/yIiIv8aGhr/ICAg/5WVlf/Z2dn/3d3d/97e3v/f39//4eHh/+Li4v/j4+P/5eXl/+bm + 5v/n5+f/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Hx + 8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/09PSX////Af///wHr6+vx6urq/+np6f/o6Oj/5+fn/+bm + 5v/l5eX/5OTk/+Pj4//i4uL/4eHh/9/f3//f39//3t7e/93d3f+Xl5f/KSkp/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/IyMj/yIiIv8eHh7/DQ0N/4ODg//Z2dn/4ODg/+Hh4f/i4uL/4+Pj/+Tk + 5P/l5eX/5ubm/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Hx8f/x8fH/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9fX1l////wH///8B7e3t8ezs + 7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm5v/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/39/f/7m5 + uf9YWFj/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8gICD/DQ0N/3p6ev/Z2dn/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/6Ojo/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+/v + 7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Pz8//z8/P/9PT0//T09P/19fX/9fX1//b2 + 9pf///8B////Ae7u7vHt7e3/7Ozs/+zs7P/r6+v/6urq/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/i4uL/39/f/6Kiov8+Pj7/IyMj/yMjI/8jIyP/IyMj/yIiIv9ZWVn/tLS0/6en + p//c3Nz/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9fX1//X19f/29vaX////Af///wHv7+/x7u7u/+7u7v/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq + 6v/p6en/6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/l5eX/2NjY/4ODg/8xMTH/IiIi/yIi + Iv9NTU3/19fX/+bm5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2l////wH///8B8PDw8fDw8P/v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/6+vr/+rq6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+fn5//n5+f/5+fn/+fn + 5//m5ub/xMTE/2VlZf9LS0v/0tLS/+jo6P/p6en/6enp/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8vLy//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//X19f/19fX/9fX1//b29v/29vb/9vb2//f395f///8B////AfHx + 8fHx8fH/8PDw//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+3t7f/s7Oz/7Ozs/+vr6//q6ur/6urq/+rq + 6v/p6en/6enp/+np6f/p6en/6enp/+rq6v/n5+f/4eHh/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//f3 + 9//39/eX////Af///wHy8vLx8vLy//Hx8f/x8fH/8PDw//Dw8P/w8PD/7+/v/+/v7//u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3l////wH///8B8/Pz8fPz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Dw + 8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+7u7v/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/+Pj4//j4+Jf///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wHw8PDj8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW + 1v/V1dX/09PT/9LS0v/Q0ND/zs7O/83Nzf/Ly8v/ysrK/8jIyP/Hx8f/xcXF/8TExP/CwsL/wcHB/8DA + wP++vr7/vb29/7u7u/+6urr/uLi4/7e3t/+1tbX/tLS0/7Ozs/+ysrL/sbGx/7Gxsf+wsLD/sLCw/7Cw + sP+wsLD/sLCw/7Gxsf+xsbH/sbGx/7Kysv+ysrL/srKy/7S0tP+0tLT/tbW1/7a2tv+3t7f/uLi4/7m5 + uf+7u7v/u7u7/729vf++vr7/wMDA/8HBwf/BwcH/w8PD/8TExP/FxcX/xsbG/8jIyP/Jycn/ysrK/8vL + y//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e + 3v/e3t7/39/f/+Hh4f/h4eEx////Af///wH///8B////AfDw8OPv7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/3Nzc/9vb + 2//a2tr/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/z8/P/83Nzf/MzMz/ysrK/8jI + yP/Hx8f/xcXF/8PDw//BwcH/wMDA/7+/v/+9vb3/vLy8/7q6uv+4uLj/t7e3/7W1tf+zs7P/srKy/7Cw + sP+vr6//rq6u/62trf+tra3/rKys/6urq/+rq6v/q6ur/6urq/+rq6v/rKys/62trf+tra3/ra2t/66u + rv+urq7/sLCw/7CwsP+ysrL/srKy/7Ozs/+1tbX/tra2/7e3t/+5ubn/urq6/7y8vP+9vb3/vr6+/7+/ + v//AwMD/wsLC/8PDw//ExMT/xcXF/8bGxv/IyMj/ycnJ/8vLy//MzMz/zc3N/87Ozv/Pz8//0dHR/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e3v/f39//39/f/+Dg4DH///8B////Af// + /wH///8B7+/v4+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/93d3f/d3d3/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT + 0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Gxsb/xcXF/8LCwv/BwcH/v7+//729vf+8vLz/urq6/7i4 + uP+2trb/tLS0/7Kysv+wsLD/rq6u/6ysrP+rq6v/qamp/6ioqP+np6f/p6en/6ampv+lpaX/paWl/6Wl + pf+lpaX/paWl/6ampv+mpqb/p6en/6ioqP+oqKj/qamp/6qqqv+rq6v/rKys/62trf+vr6//sLCw/7Gx + sf+ysrL/tLS0/7a2tv+2trb/uLi4/7m5uf+7u7v/vLy8/729vf+/v7//wMDA/8LCwv/CwsL/w8PD/8XF + xf/Gxsb/yMjI/8nJyf/Ly8v/zMzM/83Nzf/Pz8//0NDQ/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ + 2f/b29v/3Nzc/97e3v/e3t7/39/fMf///wH///8B////Af///wHv7+/j7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/Pz//Nzc3/y8vL/8rKyv/Hx8f/xsbG/8PD + w//BwcH/v7+//729vf+7u7v/ubm5/7e3t/+1tbX/s7Oz/7Gxsf+urq7/rKys/6mpqf+np6f/paWl/6Oj + o/+ioqL/oaGh/6CgoP+goKD/n5+f/5+fn/+fn5//n5+f/5+fn/+goKD/oaGh/6Ghof+ioqL/o6Oj/6Sk + pP+lpaX/pqam/6enp/+oqKj/qamp/6qqqv+srKz/ra2t/6+vr/+xsbH/srKy/7Ozs/+1tbX/tra2/7i4 + uP+5ubn/u7u7/7y8vP+9vb3/v7+//8DAwP/BwcH/w8PD/8TExP/FxcX/x8fH/8jIyP/Kysr/y8vL/8zM + zP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/97e3v/e3t4x////Af// + /wH///8B////Ae7u7uPu7u7/7u7u/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/h4eH/4ODg/9/f + 3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/P + z//Ozs7/zMzM/8rKyv/IyMj/x8fH/8TExP/CwsL/v7+//729vf+7u7v/uLi4/7e3t/+0tLT/srKy/7Cw + sP+tra3/qqqq/6enp/+lpaX/oaGh/6CgoP+dnZ3/m5ub/5qamv+ZmZn/mJiY/5iYmP+YmJj/mJiY/5iY + mP+YmJj/mZmZ/5qamv+bm5v/nJyc/52dnf+dnZ3/n5+f/6CgoP+hoaH/oqKi/6Ojo/+lpaX/pqam/6io + qP+qqqr/q6ur/62trf+urq7/sLCw/7Kysv+zs7P/tbW1/7a2tv+4uLj/ubm5/7u7u/+8vLz/vb29/7+/ + v//AwMD/wsLC/8PDw//ExMT/xsbG/8fHx//Jycn/y8vL/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV + 1f/X19f/2dnZ/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8B7u7u4+3t7f/t7e3/7e3t/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/c3Nz/2tra/9nZ2f/Z2dn/19fX/9bW + 1v/V1dX/1NTU/9PT0//S0tL/0dHR/8/Pz//Nzc3/zMzM/8rKyv/IyMj/x8fH/8XFxf/Dw8P/wcHB/76+ + vv+7u7v/ubm5/7a2tv+0tLT/sbGx/66urv+srKz/qamp/6ampv+jo6P/n5+f/5mZmf+BgYH/ioqK/5SU + lP+Tk5P/kZGR/5CQkP+QkJD/kJCQ/5CQkP+QkJD/kZGR/5GRkf+SkpL/k5OT/5WVlf+Wlpb/lpaW/5eX + l/+ZmZn/mpqa/5ycnP+dnZ3/np6e/6CgoP+ioqL/o6Oj/6ampv+np6f/qamp/6urq/+srKz/rq6u/6+v + r/+xsbH/s7Oz/7S0tP+2trb/t7e3/7m5uf+6urr/vLy8/729vf+/v7//wMDA/8HBwf/ExMT/xcXF/8fH + x//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29v/3NzcMf// + /wH///8B////Af///wHt7e3j7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/q6ur/6enp/+np + 6f/o6Oj/5+fn/+bm5v/m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Li4v/i4uL/4ODg/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//S0tL/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Jycn/yMjI/8bGxv/Dw8P/wsLC/8DAwP++vr7/u7u7/7m5uf+2trb/s7Oz/6+vr/+srKz/qamp/6en + p/+jo6P/n5+f/5ycnP+VlZX/fX19/2RkZP9paWn/enp6/4qKiv+Li4v/iYmJ/4mJif+JiYn/iYmJ/4qK + iv+Kior/i4uL/4yMjP+Ojo7/j4+P/5CQkP+RkZH/kpKS/5SUlP+VlZX/l5eX/5mZmf+ampr/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/p6en/6ioqP+rq6v/rKys/66urv+wsLD/sbGx/7Ozs/+0tLT/tra2/7i4 + uP+5ubn/u7u7/7y8vP++vr7/wMDA/8HBwf/Dw8P/xcXF/8fHx//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR + 0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29sx////Af///wH///8B////Ae3t7ePs7Oz/7Ozs/+vr + 6//r6+v/6urq/+rq6v/q6ur/6enp/+np6f/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/k5OT/4+Pj/+Pj + 4//i4uL/4eHh/+Dg4P/f39//3t7e/93d3f/d3d3/29vb/9vb2//Z2dn/2NjY/9jY2P/W1tb/1dXV/9PT + 0//T09P/0tLS/9DQ0P/Pz8//zc3N/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP++vr7/vLy8/7m5 + uf+3t7f/tLS0/7Kysv+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4CAgP9jY2P/YmJi/2Fh + Yf9iYmL/enp6/4ODg/+CgoL/gYGB/4GBgf+CgoL/goKC/4ODg/+EhIT/hoaG/4eHh/+IiIj/iYmJ/4uL + i/+MjIz/jo6O/4+Pj/+RkZH/k5OT/5WVlf+Xl5f/mZmZ/5qamv+dnZ3/n5+f/6Ghof+ioqL/pKSk/6am + pv+oqKj/qqqq/6urq/+tra3/r6+v/7Gxsf+ysrL/tLS0/7a2tv+4uLj/ubm5/7u7u/+9vb3/v7+//8HB + wf/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9nZ + 2TH///8B////Af///wH///8B7Ozs4+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo/+fn + 5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Pj4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/X19f/1tbW/9XV1f/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fH + x//FxcX/xMTE/8HBwf+/v7//vb29/7u7u/+5ubn/tra2/7S0tP+wsLD/ra2t/6qqqv+lpaX/oqKi/52d + nf+ZmZn/lJSU/5CQkP+MjIz/dnZ2/2FhYf9jY2P/YmJi/2FhYf92dnb/fX19/3x8fP98fHz/e3t7/3x8 + fP98fHz/fX19/35+fv+AgID/gYGB/4ODg/+EhIT/hYWF/4eHh/+JiYn/i4uL/4yMjP+Ojo7/kJCQ/5KS + kv+UlJT/lpaW/5mZmf+bm5v/nZ2d/56env+goKD/oqKi/6SkpP+mpqb/qKio/6qqqv+srKz/ra2t/7Cw + sP+xsbH/s7Oz/7W1tf+2trb/ubm5/7q6uv+9vb3/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW1v/X19f/2NjYMf///wH///8B////Af///wHr6+vj6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/39/f/9/f3//e3t7/3Nzc/9zc3P/b29v/2tra/9jY2P/X19f/19fX/9XV1f/V1dX/09PT/9LS + 0v/R0dH/z8/P/87Ozv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7y8vP+5ubn/t7e3/7W1 + tf+ysrL/r6+v/6ysrP+pqan/pKSk/5+fn/+bm5v/lpaW/5GRkf+MjIz/iIiI/4SEhP9ycnL/YWFh/2Rk + ZP9iYmL/YWFh/3Fxcf92dnb/dnZ2/3V1df91dXX/dXV1/3V1df92dnb/eHh4/3p6ev97e3v/fX19/39/ + f/+AgID/goKC/4ODg/+Ghob/h4eH/4mJif+Li4v/jY2N/5CQkP+SkpL/lJSU/5aWlv+YmJj/mpqa/5yc + nP+enp7/oKCg/6Kiov+kpKT/pqam/6ioqP+qqqr/rKys/66urv+wsLD/srKy/7Ozs/+2trb/uLi4/7q6 + uv+8vLz/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW + 1v/X19cx////Af///wH///8B////Aevr6+Pr6+v/6urq/+np6f/p6en/6Ojo/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3t7e/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/v7+//729vf+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+rq6v/p6en/6Ojo/+enp7/mZmZ/5SU + lP+Ojo7/iYmJ/4SEhP9/f3//fHx8/21tbf9iYmL/ZWVl/2NjY/9iYmL/bW1t/3BwcP9wcHD/b29v/29v + b/9vb2//b29v/3Fxcf9zc3P/dHR0/3Z2dv94eHj/enp6/3t7e/99fX3/fn5+/4CAgP+CgoL/hISE/4aG + hv+JiYn/i4uL/42Njf+Pj4//kZGR/5SUlP+Wlpb/mJiY/5qamv+cnJz/np6e/6CgoP+jo6P/paWl/6am + pv+pqan/qqqq/62trf+vr6//sbGx/7Ozs/+1tbX/t7e3/7m5uf+8vLz/vr6+/7+/v//CwsL/xMTE/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/T09P/1dXV/9bW1jH///8B////Af///wH///8B6urq4+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh + 4f/f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1dXV/9TU1P/S0tL/0dHR/9DQ + 0P/Ozs7/zc3N/8vLy//Jycn/x8fH/8XFxf/Dw8P/wcHB/7+/v/+9vb3/urq6/7e3t/+1tbX/s7Oz/7Cw + sP+tra3/qamp/6ampv+ioqL/nZ2d/5iYmP+Tk5P/jY2N/4eHh/+CgoL/fX19/3h4eP91dXX/a2tr/2Rk + ZP9mZmb/ZWVl/2NjY/9paWn/ampq/2lpaf9paWn/aWlp/2pqav9ra2v/bW1t/25ubv9wcHD/cnJy/3Nz + c/91dXX/d3d3/3l5ef96enr/fHx8/319ff9/f3//gYGB/4SEhP+Hh4f/iYmJ/4uLi/+NjY3/kJCQ/5KS + kv+UlJT/lpaW/5iYmP+bm5v/nZ2d/5+fn/+hoaH/o6Oj/6ampv+oqKj/qqqq/6ysrP+urq7/sLCw/7Ky + sv+1tbX/t7e3/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS + 0v/U1NT/1dXVMf///wH///8B////Af///wHq6urj6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+Xl + 5f/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9fX + 1//X19f/1tbW/9TU1P/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/s7Oz/7Gxsf+urq7/rKys/6mpqf+lpaX/oaGh/5ubm/+Xl5f/kZGR/4uL + i/+Ghob/gYGB/3x8fP92dnb/cnJy/29vb/9oaGj/ZWVl/2lpaf9qamr/ampq/2hoaP9kZGT/Y2Nj/2Nj + Y/9kZGT/ZWVl/2ZmZv9oaGj/aWlp/2tra/9tbW3/bm5u/3BwcP9xcXH/c3Nz/3V1df92dnb/eHh4/3p6 + ev98fHz/fn5+/4GBgf+EhIT/hoaG/4mJif+Li4v/jY2N/4+Pj/+RkZH/lJSU/5aWlv+ZmZn/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/qKio/6urq/+tra3/r6+v/7Kysv+0tLT/tra2/7m5uf+7u7v/vb29/7+/ + v//CwsL/xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT0//T09Mx////Af///wH///8B////Aenp + 6ePp6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f + 3//f39//3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/09PT/9LS0v/R0dH/z8/P/87O + zv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7Ozs/+wsLD/rq6u/6ur + q/+oqKj/pKSk/6CgoP+cnJz/lZWV/5CQkP+Li4v/hoaG/39/f/96enr/dnZ2/3Fxcf9ubm7/a2tr/2dn + Z/9nZ2f/a2tr/25ubv9ycnL/cHBw/2dnZ/9fX1//X19f/2BgYP9hYWH/YmJi/2RkZP9lZWX/Z2dn/2ho + aP9qamr/a2tr/21tbf9vb2//cHBw/3Jycv90dHT/dnZ2/3l5ef97e3v/fX19/4CAgP+CgoL/hYWF/4eH + h/+JiYn/i4uL/46Ojv+QkJD/k5OT/5WVlf+YmJj/mpqa/5ycnP+fn5//oaGh/6Ojo/+lpaX/qKio/6qq + qv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8fHx//Jycn/y8vL/83N + zf/Pz8//0dHR/9LS0jH///8B////Af///wH///8B6enp4+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl + 5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg4P/g4OD/3t7e/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX + 1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+ + vv+7u7v/uLi4/7W1tf+zs7P/sLCw/62trf+qqqr/p6en/6Ojo/+fn5//mpqa/5WVlf+Pj4//ioqK/4WF + hf97e3v/Y2Nj/11dXf9nZ2f/ampq/2pqav9nZ2f/Z2dn/2lpaf9sbGz/b29v/3Nzc/90dHT/b29v/1xc + XP9bW1v/XFxc/11dXf9eXl7/X19f/2FhYf9iYmL/ZGRk/2VlZf9nZ2f/aWlp/2pqav9sbGz/bW1t/29v + b/9xcXH/dHR0/3Z2dv94eHj/enp6/35+fv+AgID/goKC/4SEhP+Hh4f/ioqK/4yMjP+Ojo7/kZGR/5SU + lP+Wlpb/mJiY/5ubm/+dnZ3/oKCg/6Kiov+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5 + uf+7u7v/vr6+/8DAwP/CwsL/xcXF/8fHx//Kysr/zMzM/87Ozv/Q0ND/0NDQMf///wH///8B////Af// + /wHp6enj6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Kysr/yMjI/8fHx//FxcX/w8PD/8DAwP++vr7/u7u7/7i4uP+1tbX/s7Oz/7CwsP+tra3/qamp/6am + pv+ioqL/np6e/5qamv+UlJT/j4+P/4mJif+EhIT/fX19/2NjY/9QUFD/S0tL/01NTf9dXV3/ZWVl/2Vl + Zf9oaGj/a2tr/25ubv9wcHD/c3Nz/3R0dP9wcHD/Wlpa/1dXV/9YWFj/WVlZ/1paWv9bW1v/XV1d/15e + Xv9gYGD/YWFh/2JiYv9kZGT/ZmZm/2dnZ/9paWn/a2tr/21tbf9vb2//cnJy/3R0dP92dnb/eXl5/3t7 + e/9+fn7/gICA/4ODg/+Ghob/iIiI/4uLi/+NjY3/kJCQ/5OTk/+VlZX/mJiY/5qamv+dnZ3/n5+f/6Gh + of+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/t7e3/7m5uf+7u7v/vr6+/8HBwf/Dw8P/xsbG/8jI + yP/Kysr/zMzM/8/Pz//Q0NAx////Af///wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/+Dg4P/f39//3t7e/93d3f/c3Nz/2tra/9nZ2f/Y2Nj/19fX/9bW + 1v/U1NT/09PT/9HR0f/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7u7 + u/+4uLj/tbW1/7Ozs/+wsLD/ra2t/6qqqv+mpqb/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/goKC/319 + ff9ycnL/VFRU/09PT/9JSUn/RUVF/1VVVf9hYWH/ZGRk/2pqav9tbW3/cHBw/3Jycv90dHT/dXV1/3Bw + cP9XV1f/VFRU/1VVVf9WVlb/V1dX/1hYWP9XV1f/S0tL/0lJSf9YWFj/Xl5e/2BgYP9hYWH/Y2Nj/2Vl + Zf9nZ2f/aWlp/2tra/9tbW3/cHBw/3Jycv91dXX/d3d3/3p6ev98fHz/fn5+/4GBgf+EhIT/h4eH/4qK + iv+MjIz/j4+P/5GRkf+UlJT/l5eX/5mZmf+cnJz/np6e/6Ghof+kpKT/p6en/6qqqv+srKz/r6+v/7Ky + sv+0tLT/t7e3/7q6uv+9vb3/v7+//8HBwf/ExMT/xsbG/8nJyf/Ly8v/zs7O/8/PzzH///8B////Af// + /wH///8B6Ojo4+fn5//m5ub/5ubm/+Xl5f/k5OT/5OTk/+Pj4//i4uL/4eHh/+Dg4P/g4OD/39/f/97e + 3v/d3d3/3Nzc/9vb2//Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/y8vL/8nJ + yf/IyMj/xsbG/8TExP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+ysrL/sLCw/62trf+qqqr/pqam/6Gh + of+enp7/mZmZ/5OTk/+Ojo7/h4eH/4KCgv98fHz/dnZ2/2xsbP9VVVX/UVFR/0dHR/9DQ0P/UlJS/15e + Xv9nZ2f/bGxs/25ubv9xcXH/dHR0/3d3d/93d3f/cXFx/1NTU/9QUFD/UVFR/1JSUv9TU1P/UlJS/z4+ + Pv8fHx//Hh4e/zExMf9KSkr/Wlpa/15eXv9fX1//YmJi/2NjY/9lZWX/Z2dn/2lpaf9ra2v/bm5u/3Bw + cP9ycnL/dXV1/3h4eP96enr/fX19/4CAgP+Dg4P/hYWF/4iIiP+Li4v/jo6O/5CQkP+Tk5P/lpaW/5mZ + mf+bm5v/np6e/6Ghof+kpKT/p6en/6qqqv+tra3/r6+v/7Kysv+1tbX/uLi4/7q6uv+9vb3/wMDA/8PD + w//FxcX/x8fH/8rKyv/MzMz/zc3NMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4uLi/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9jY2P/X19f/1tbW/9TU + 1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vLy//Jycn/x8fH/8bGxv/ExMT/wcHB/8DAwP+9vb3/u7u7/7m5 + uf+1tbX/s7Oz/7CwsP+tra3/qqqq/6ampv+jo6P/np6e/5mZmf+UlJT/j4+P/4iIiP+CgoL/fHx8/3Z2 + dv9wcHD/ZmZm/1ZWVv9TU1P/RkZG/0JCQv9PT0//X19f/2lpaf9tbW3/b29v/3Jycv96enr/fn5+/3h4 + eP9xcXH/UVFR/01NTf9OTk7/T09P/09PT/9AQED/ISEh/xoaGv8bGxv/Hh4e/yYmJv88PDz/VFRU/1xc + XP9eXl7/YGBg/2FhYf9jY2P/ZWVl/2dnZ/9qamr/bGxs/25ubv9xcXH/dHR0/3d3d/96enr/fHx8/39/ + f/+BgYH/hISE/4eHh/+Kior/jY2N/5CQkP+Tk5P/lZWV/5mZmf+cnJz/np6e/6Kiov+kpKT/p6en/6qq + qv+tra3/sLCw/7Ozs/+2trb/ubm5/7y8vP+/v7//wcHB/8TExP/Gxsb/ycnJ/8zMzP/MzMwx////Af// + /wH///8B////Aefn5+Pm5ub/5ubm/+Tk5P/k5OT/4+Pj/+Li4v/i4uL/4eHh/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/19fX/9fX1//V1dX/1NTU/9LS0v/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//Gxsb/w8PD/8HBwf+/v7//vb29/7u7u/+4uLj/tbW1/7Kysv+wsLD/ra2t/6mpqf+mpqb/oqKi/5+f + n/+ZmZn/lJSU/46Ojv+IiIj/goKC/3t7e/92dnb/b29v/2lpaf9gYGD/WFhY/1VVVf9ERET/QUFB/0tL + S/9eXl7/a2tr/25ubv9xcXH/enp6/46Ojv+VlZX/fHx8/3Nzc/9PT0//SUlJ/0pKSv9LS0v/PDw8/xsb + G/8TExP/HBwc/x4eHv8dHR3/Hh4e/x4eHv8oKCj/QEBA/1VVVf9bW1v/XV1d/19fX/9hYWH/Y2Nj/2Vl + Zf9oaGj/ampq/21tbf9wcHD/cnJy/3V1df94eHj/e3t7/319ff+AgID/g4OD/4aGhv+JiYn/jIyM/4+P + j/+SkpL/lZWV/5iYmP+bm5v/np6e/6Ghof+kpKT/qKio/6urq/+urq7/sbGx/7W1tf+3t7f/urq6/729 + vf/AwMD/w8PD/8XFxf/IyMj/y8vL/8vLyzH///8B////Af///wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj + 4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9jY2P/X19f/1dXV/9TU + 1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJyf/IyMj/xcXF/8TExP/BwcH/v7+//729vf+7u7v/uLi4/7W1 + tf+zs7P/r6+v/6ysrP+pqan/pqam/6Ojo/+fn5//mpqa/5SUlP+Pj4//iYmJ/4SEhP99fX3/dnZ2/3Bw + cP9paWn/YmJi/1xcXP9bW1v/V1dX/0ZGRv9FRUX/SkpK/11dXf9sbGz/cHBw/3Z2dv+MjIz/oKCg/4+P + j/9vb2//dnZ2/1dXV/9GRkb/R0dH/z4+Pv8dHR3/EhIS/xgYGP8uLi7/LCws/x4eHv8eHh7/Hh4e/x4e + Hv8hISH/NDQ0/0xMTP9ZWVn/W1tb/11dXf9fX1//YWFh/2RkZP9mZmb/aWlp/2xsbP9ubm7/cXFx/3R0 + dP93d3f/enp6/319ff+AgID/goKC/4aGhv+JiYn/jIyM/4+Pj/+SkpL/lZWV/5iYmP+cnJz/np6e/6Ki + ov+mpqb/qamp/6ysrP+vr6//s7Oz/7a2tv+5ubn/vLy8/76+vv/CwsL/xMTE/8fHx//Kysr/y8vLMf// + /wH///8B////Af///wHm5ubj5eXl/+Tk5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/U1NT/0tLS/9HR0f/Pz8//zc3N/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/7+/v/+9vb3/u7u7/7i4uP+2trb/s7Oz/7CwsP+srKz/qamp/6ampv+jo6P/np6e/5mZ + mf+VlZX/j4+P/4qKiv+EhIT/fn5+/3h4eP9wcHD/ampq/2JiYv9bW1v/WFhY/11dXf9fX1//X19f/1lZ + Wf9MTEz/Xl5e/25ubv92dnb/h4eH/5+fn/+SkpL/VVVV/1ZWVv93d3f/bGxs/05OTv89PT3/JCQk/xMT + E/8YGBj/KCgo/zY2Nv8rKyv/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/JSUl/z09Pf9QUFD/WFhY/1tb + W/9dXV3/X19f/2FhYf9kZGT/Z2dn/2pqav9tbW3/cHBw/3Nzc/91dXX/eHh4/3t7e/9+fn7/goKC/4WF + hf+IiIj/i4uL/46Ojv+SkpL/lZWV/5mZmf+cnJz/n5+f/6Ojo/+mpqb/qqqq/62trf+xsbH/tLS0/7e3 + t/+6urr/vb29/8DAwP/Dw8P/xsbG/8nJyf/Kysox////Af///wH///8B////AeXl5ePk5OT/5OTk/+Pj + 4//i4uL/4eHh/+Dg4P/f39//39/f/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9LS + 0v/R0dH/0NDQ/83Nzf/MzMz/ysrK/8jIyP/Gxsb/xMTE/8HBwf+/v7//vb29/7u7u/+4uLj/tra2/7S0 + tP+wsLD/ra2t/6qqqv+mpqb/o6Oj/6CgoP+ampr/lZWV/5CQkP+JiYn/hISE/35+fv9zc3P/aWlp/2lp + af9kZGT/XFxc/1VVVf9UVFT/YGBg/2NjY/9mZmb/XFxc/09PT/9dXV3/c3Nz/4WFhf+bm5v/lpaW/11d + Xf9MTEz/cHBw/4aGhv92dnb/Y2Nj/ykpKf8WFhb/GBgY/ycnJ/8rKyv/Hx8f/xwcHP8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/ywsLP9DQ0P/VVVV/1lZWf9bW1v/XV1d/2BgYP9jY2P/ZmZm/2lp + af9sbGz/b29v/3Jycv91dXX/eHh4/3t7e/9+fn7/gYGB/4SEhP+IiIj/i4uL/4+Pj/+SkpL/lpaW/5mZ + mf+dnZ3/oaGh/6SkpP+oqKj/q6ur/6+vr/+ysrL/tra2/7m5uf+8vLz/v7+//8LCwv/FxcX/yMjI/8rK + yjH///8B////Af///wH///8B5OTk4+Tk5P/j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2dnZ/9jY2P/X19f/1tbW/9XV1f/S0tL/0dHR/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+zs7P/sbGx/62trf+qqqr/pqam/6Ojo/+fn5//m5ub/5aW + lv+Pj4//ioqK/4ODg/9+fn7/dHR0/1paWv9NTU3/U1NT/1lZWf9XV1f/UVFR/1RUVP9iYmL/ZWVl/2ho + aP9dXV3/UFBQ/2FhYf+BgYH/mpqa/56env9hYWH/SEhI/2pqav+MjIz/fHx8/5+fn/9nZ2f/HBwc/xcX + F/8lJSX/Kysr/xwcHP8aGhr/HBwc/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/yMj + I/81NTX/S0tL/1ZWVv9aWlr/XFxc/19fX/9iYmL/ZmZm/2hoaP9ra2v/bm5u/3Fxcf90dHT/d3d3/3t7 + e/9+fn7/gYGB/4WFhf+IiIj/jIyM/4+Pj/+Tk5P/lpaW/5qamv+enp7/oaGh/6ampv+pqan/ra2t/7Gx + sf+0tLT/uLi4/7u7u/++vr7/wcHB/8XFxf/IyMj/ycnJMf///wH///8B////Af///wHj4+Pj4+Pj/+Li + 4v/h4eH/4ODg/9/f3//f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Y2Nj/2NjY/9bW1v/V1dX/09PT/9LS + 0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/s7Oz/7Cw + sP+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kJCQ/4qKiv+EhIT/fX19/3d3d/9eXl7/SkpK/0VF + Rf9BQUH/RUVF/1JSUv9PT0//XFxc/2VlZf9oaGj/ampq/1JSUv9OTk7/bW1t/5eXl/+cnJz/ampq/0dH + R/9mZmb/iYmJ/35+fv+vr6//+vr6/9HR0f84ODj/HR0d/ykpKf8hISH/GRkZ/xsbG/8dHR3/Hh4e/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/HR0d/x0dHf8lJSX/PT09/09PT/9YWFj/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9paWn/bGxs/3BwcP9zc3P/dnZ2/3p6ev9+fn7/gYGB/4SEhP+IiIj/i4uL/4+P + j/+Tk5P/l5eX/5ubm/+enp7/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/urq6/76+vv/BwcH/xMTE/8fH + x//IyMgx////Af///wH///8B////AePj4+Pi4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/W1tb/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8LC + wv/AwMD/vr6+/7u7u/+5ubn/tbW1/7Ozs/+wsLD/rq6u/6urq/+np6f/pKSk/6CgoP+cnJz/l5eX/5KS + kv+Li4v/hISE/39/f/93d3f/cHBw/1VVVf9MTEz/Q0ND/z4+Pv9BQUH/T09P/1NTU/9jY2P/Z2dn/2pq + av9ra2v/S0tL/0hISP9xcXH/m5ub/2tra/9GRkb/YWFh/4eHh/98fHz/nZ2d//Hx8f/8/Pz/wsLC/zAw + MP8gICD/JSUl/yIiIv8hISH/IiIi/yEhIf8fHx//Hh4e/x4eHv8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x0dHf8hISH/Ly8v/0hISP9XV1f/Wlpa/11dXf9gYGD/ZGRk/2ZmZv9paWn/bGxs/29v + b/9zc3P/dnZ2/3p6ev99fX3/gICA/4WFhf+IiIj/jY2N/5CQkP+UlJT/mZmZ/5ycnP+hoaH/paWl/6mp + qf+tra3/srKy/7a2tv+5ubn/vb29/8DAwP/ExMT/x8fH/8jIyDH///8B////Af///wH///8B4uLi4+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/0tLS/9HR + 0f/Ozs7/zc3N/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62t + rf+qqqr/p6en/6Ojo/+fn5//m5ub/5eXl/+RkZH/i4uL/4aGhv9+fn7/eHh4/3BwcP9qamr/VlZW/1BQ + UP9BQUH/Ojo6/z09Pf9NTU3/XFxc/2dnZ/9qamr/bGxs/25ubv9LS0v/R0dH/19fX/9mZmb/RERE/1tb + W/+IiIj/goKC/6CgoP/09PT//Pz8/7y8vP8+Pj7/HBwc/ygoKP8oKCj/ICAg/yIiIv8kJCT/JSUl/yQk + JP8gICD/Hh4e/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/IiIi/zY2 + Nv9MTEz/WFhY/1xcXP9fX1//YmJi/2VlZf9oaGj/a2tr/29vb/9ycnL/dnZ2/3l5ef98fHz/gYGB/4SE + hP+JiYn/jY2N/5GRkf+VlZX/mpqa/56env+ioqL/p6en/6ysrP+wsLD/tbW1/7m5uf+9vb3/wMDA/8PD + w//Gxsb/yMjIMf///wH///8B////Af///wHi4uLj4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/tLS0/7Gxsf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kZGR/4yM + jP+Ghob/gICA/3l5ef9zc3P/bGxs/2ZmZv9YWFj/UlJS/z8/P/83Nzf/Ozs7/09PT/9kZGT/aWlp/2tr + a/9tbW3/eHh4/2FhYf9LS0v/U1NT/0RERP9XV1f/f39//4aGhv+QkJD/6Ojo///////S0tL/R0dH/xwc + HP8nJyf/KSkp/yIiIv8fHx//IyMj/yQkJP8lJSX/JiYm/yUlJf8iIiL/Hx8f/x8fH/8fHx//Hx8f/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/yoqKv9CQkL/VFRU/1xcXP9fX1//YmJi/2Vl + Zf9oaGj/bGxs/29vb/9ycnL/dnZ2/3l5ef9+fn7/gYGB/4aGhv+Kior/jo6O/5KSkv+Xl5f/nJyc/6Cg + oP+mpqb/qqqq/6+vr/+zs7P/t7e3/7y8vP/AwMD/w8PD/8bGxv/IyMgx////Af///wH///8B////AeHh + 4ePg4OD/4ODg/9/f3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0tLS/9DQ + 0P/Ozs7/y8vL/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/rq6u/6ur + q/+np6f/pKSk/6CgoP+bm5v/lpaW/5CQkP+MjIz/hoaG/4CAgP96enr/c3Nz/25ubv9nZ2f/YWFh/1lZ + Wf9VVVX/PT09/zQ0NP85OTn/TU1N/2ZmZv9ra2v/bW1t/3Z2dv+NjY3/kZGR/15eXv9VVVX/QEBA/15e + Xv+Dg4P/jo6O/+Hh4f/8/Pz/1dXV/1dXV/8cHBz/JiYm/ykpKf8hISH/Hx8f/yIiIv8kJCT/JSUl/yYm + Jv8mJib/Jycn/yYmJv8jIyP/ISEh/x8fH/8fHx//Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/yEhIf8wMDD/TExM/1hYWP9eXl7/YWFh/2RkZP9oaGj/a2tr/25ubv9xcXH/dXV1/3p6 + ev99fX3/goKC/4WFhf+Kior/j4+P/5SUlP+ZmZn/np6e/6Ojo/+oqKj/ra2t/7Kysv+3t7f/u7u7/7+/ + v//Dw8P/xsbG/8jIyDH///8B////Af///wH///8B4eHh4+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/19fX/9bW1v/U1NT/09PT/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/Dw8P/wcHB/76+ + vv+8vLz/ubm5/7e3t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/m5ub/5aWlv+RkZH/i4uL/4aG + hv+AgID/enp6/3R0dP9ubm7/aGho/2JiYv9dXV3/W1tb/1paWv9ISEj/QkJC/zo6Ov9KSkr/Z2dn/2xs + bP91dXX/iYmJ/6CgoP+Kior/U1NT/1hYWP9JSUn/PT09/1dXV//X19f//////93d3f9oaGj/Hh4e/yYm + Jv8qKir/Hx8f/x4eHv8hISH/JCQk/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8mJib/Ozs7/1JS + Uv9dXV3/YGBg/2RkZP9nZ2f/ampq/21tbf9xcXH/dXV1/3h4eP99fX3/gYGB/4aGhv+Li4v/kZGR/5eX + l/+bm5v/oaGh/6ampv+srKz/sbGx/7a2tv+7u7v/v7+//8PDw//Gxsb/yMjIMf///wH///8B////Af// + /wHg4ODj4ODg/9/f3//d3d3/3d3d/9vb2//a2tr/2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/0NDQ/87O + zv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv+/v7//vb29/7q6uv+2trb/tLS0/7Kysv+urq7/q6ur/6io + qP+lpaX/oaGh/5ycnP+Xl5f/kZGR/4yMjP+Ghob/gYGB/3t7e/90dHT/b29v/2lpaf9jY2P/Xl5e/1lZ + Wf9cXFz/YGBg/2BgYP9YWFj/PT09/0dHR/9oaGj/cnJy/4aGhv+cnJz/kZGR/1dXV/9NTU3/YWFh/1hY + WP9AQED/NTU1/4uLi//W1tb/cHBw/yEhIf8iIiL/Kioq/yEhIf8eHh7/ISEh/yQkJP8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8mJib/JCQk/yIiIv8gICD/Hx8f/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8gICD/Li4u/0pKSv9aWlr/YGBg/2JiYv9lZWX/aGho/2xs + bP9wcHD/dHR0/3l5ef99fX3/goKC/4iIiP+Ojo7/lJSU/5mZmf+fn5//paWl/6urq/+wsLD/tbW1/7q6 + uv++vr7/w8PD/8bGxv/IyMgx////Af///wH///8B////AeDg4OPf39//3t7e/93d3f/b29v/2tra/9nZ + 2f/X19f/1tbW/9TU1P/T09P/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TExP/CwsL/v7+//729 + vf+6urr/t7e3/7S0tP+ysrL/rq6u/6urq/+oqKj/pKSk/6Ghof+dnZ3/mJiY/5KSkv+MjIz/h4eH/4GB + gf97e3v/b29v/1tbW/9dXV3/YmJi/19fX/9ZWVn/VlZW/15eXv9jY2P/ZWVl/1lZWf87Ozv/R0dH/29v + b/+EhIT/nJyc/5WVlf9QUFD/SkpK/3Jycv+CgoL/aWlp/1FRUf8jIyP/GRkZ/zY2Nv8jIyP/ISEh/yoq + Kv8hISH/HR0d/yIiIv8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/ISEh/zMzM/9PT0//W1tb/19fX/9jY2P/ZmZm/2pqav9ubm7/dHR0/3l5ef9/f3//hYWF/4uL + i/+SkpL/l5eX/52dnf+jo6P/qamp/7CwsP+0tLT/urq6/76+vv/Dw8P/xsbG/8jIyDH///8B////Af// + /wH///8B39/f497e3v/d3d3/3Nzc/9vb2//a2tr/2NjY/9fX1//V1dX/09PT/9LS0v/Q0ND/zs7O/8zM + zP/Kysr/yMjI/8fHx//ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/srKy/6+vr/+rq6v/qKio/6Wl + pf+hoaH/nZ2d/5mZmf+UlJT/jo6O/4iIiP+Dg4P/fHx8/3Nzc/9ZWVn/SkpK/0dHR/9OTk7/WFhY/1ZW + Vv9VVVX/YGBg/2RkZP9nZ2f/Wlpa/zo6Ov9KSkr/fX19/5mZmf+YmJj/YGBg/0ZGRv9oaGj/iYmJ/3t7 + e/+wsLD/hISE/x4eHv8RERH/IiIi/yYmJv8eHh7/IiIi/xwcHP8fHx//IyMj/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8iIiL/ISEh/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/ykpKf8/Pz//VVVV/11d + Xf9hYWH/ZWVl/2pqav9wcHD/dXV1/3x8fP+CgoL/iYmJ/5CQkP+VlZX/nJyc/6Kiov+pqan/r6+v/7Oz + s/+5ubn/vr6+/8PDw//Hx8f/yMjIMf///wH///8B////Af///wHe3t7j3t7e/9zc3P/b29v/2tra/9jY + 2P/X19f/1dXV/9TU1P/S0tL/0NDQ/8/Pz//MzMz/y8vL/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vb29/7u7 + u/+4uLj/tbW1/7Ozs/+vr6//rKys/6ioqP+lpaX/oaGh/52dnf+ZmZn/lJSU/4+Pj/+JiYn/goKC/319 + ff92dnb/ZWVl/05OTv9ISEj/QEBA/0BAQP9QUFD/U1NT/1paWv9jY2P/Z2dn/2hoaP9VVVX/MDAw/09P + T/+Tk5P/mZmZ/2BgYP9FRUX/aGho/4mJif97e3v/r6+v//f39//q6ur/dHR0/xgYGP8fHx//GBgY/xYW + Fv8ZGRn/Hx8f/yQkJP8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x4eHv8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x8fH/8tLS3/RkZG/1hYWP9gYGD/ZWVl/2xsbP9ycnL/eXl5/4CA + gP+Hh4f/jo6O/5SUlP+bm5v/oaGh/6enp/+tra3/s7Oz/7m5uf++vr7/w8PD/8fHx//IyMgx////Af// + /wH///8B////Ad7e3uPd3d3/3Nzc/9ra2v/Z2dn/19fX/9XV1f/U1NT/09PT/9HR0f/Pz8//zc3N/8vL + y//Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+pqan/pqam/6Ki + ov+enp7/mZmZ/5WVlf+QkJD/ioqK/4SEhP99fX3/d3d3/3BwcP9hYWH/UFBQ/0dHR/89PT3/PT09/01N + Tf9UVFT/YGBg/2VlZf9oaGj/ampq/1FRUf8rKyv/SkpK/5CQkP9paWn/RUVF/15eXv+IiIj/f39//6mp + qf/z8/P/+vr6/62trf83Nzf/HR0d/yAgIP8YGBj/Ghoa/x8fH/8lJSX/Jycn/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUl + Jf8kJCT/IiIi/yEhIf8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8kJCT/Nzc3/1RUVP9iYmL/ampq/3BwcP93d3f/fn5+/4WFhf+MjIz/kpKS/5mZmf+goKD/pqam/62t + rf+ysrL/uLi4/76+vv/Dw8P/x8fH/8jIyDH///8B////Af///wH///8B3d3d49zc3P/b29v/2dnZ/9jY + 2P/W1tb/1NTU/9PT0//R0dH/0NDQ/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HBwf++vr7/u7u7/7m5 + uf+2trb/s7Oz/7CwsP+tra3/qqqq/6ampv+ioqL/np6e/5qamv+VlZX/kZGR/4uLi/+FhYX/f39//3d3 + d/9xcXH/a2tr/19fX/9TU1P/RkZG/zo6Ov86Ojr/SkpK/1xcXP9lZWX/Z2dn/2lpaf9sbGz/WVlZ/y8v + L/87Ozv/UlJS/0ZGRv9dXV3/g4OD/4KCgv+ZmZn/8fHx//z8/P+/v7//ODg4/xwcHP8oKCj/JCQk/xwc + HP8fHx//JSUl/ycnJ/8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IyMj/yEhIf8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/LCws/0RERP9iYmL/bW1t/3V1 + df97e3v/fHx8/4ODg/+Pj4//mJiY/56env+lpaX/q6ur/7Gxsf+4uLj/vr6+/8PDw//Hx8f/yMjIMf// + /wH///8B////Af///wHc3Nzj29vb/9ra2v/Y2Nj/1tbW/9XV1f/U1NT/0dHR/9DQ0P/Ozs7/zMzM/8rK + yv/IyMj/xcXF/8PDw//AwMD/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/ra2t/6qqqv+np6f/o6Oj/5+f + n/+bm5v/lpaW/5GRkf+MjIz/hoaG/4CAgP95eXn/cnJy/2xsbP9mZmb/Xl5e/1VVVf9FRUX/Nzc3/zg4 + OP9ISEj/YWFh/2dnZ/9paWn/bGxs/3Z2dv97e3v/QUFB/zY2Nv8wMDD/SkpK/4KCgv+Ghob/mJiY/+rq + 6v/8/Pz/xsbG/0tLS/8aGhr/JiYm/yYmJv8dHR3/ISEh/yYmJv8nJyf/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yUlJf8kJCT/JCQk/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//ICAg/zg4OP9XV1f/b29v/3Fxcf9dXV3/Y2Nj/3l5ef+RkZH/nZ2d/6Oj + o/+qqqr/sbGx/7i4uP+9vb3/w8PD/8fHx//IyMgx////Af///wH///8B////Adzc3OPa2tr/2dnZ/9fX + 1//V1dX/1NTU/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wcHB/7+/v/+8vLz/ubm5/7e3 + t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/nJyc/5iYmP+Tk5P/jY2N/4iIiP+BgYH/e3t7/3R0 + dP9ubm7/aGho/2NjY/9dXV3/WFhY/0RERP81NTX/NTU1/0VFRf9iYmL/aWlp/2tra/90dHT/i4uL/5mZ + mf9cXFz/ODg4/y8vL/88PDz/dHR0/4eHh//q6ur//v7+/9jY2P9WVlb/Gxsb/yUlJf8pKSn/Hh4e/x8f + H/8kJCT/Jycn/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8lJSX/JSUl/yMj + I/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//ISEh/ykp + Kf9ISEj/VVVV/01NTf9fX1//ZWVl/4ODg/+cnJz/o6Oj/6qqqv+wsLD/uLi4/76+vv/Dw8P/x8fH/8jI + yDH///8B////Af///wH///8B2tra49nZ2f/X19f/1tbW/9TU1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJ + yf/Hx8f/xMTE/8LCwv+/v7//vLy8/7q6uv+3t7f/tbW1/7Gxsf+urq7/q6ur/6enp/+lpaX/oKCg/5yc + nP+Xl5f/kpKS/42Njf+IiIj/goKC/3x8fP92dnb/b29v/2lpaf9kZGT/X19f/1xcXP9bW1v/VFRU/09P + T/88PDz/QEBA/2RkZP9ra2v/dHR0/4yMjP+fn5//g4OD/0xMTP8+Pj7/NjY2/ysrK/89PT3/tra2//z8 + /P/c3Nz/UVFR/xkZGf8lJSX/KCgo/x4eHv8fHx//IyMj/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yQkJP8iIiL/ISEh/yAgIP8fHx//Hh4e/x8f + H/8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8oKCj/Ojo6/2BgYP9oaGj/f39//5ub + m/+jo6P/q6ur/7Gxsf+5ubn/vr6+/8TExP/Hx8f/yMjIMf///wH///8B////Af///wHa2trj2NjY/9bW + 1v/V1dX/09PT/9HR0f/Pz8//zs7O/8vLy//Jycn/x8fH/8XFxf/Dw8P/wMDA/729vf+6urr/uLi4/7W1 + tf+ysrL/r6+v/6urq/+oqKj/paWl/6Ghof+dnZ3/mZmZ/5OTk/+Ojo7/iYmJ/4ODg/99fX3/c3Nz/2tr + a/9qamr/ZWVl/2BgYP9cXFz/W1tb/15eXv9hYWH/YWFh/zs7O/8zMzP/ZGRk/3Fxcf+Ghob/n5+f/5GR + kf9NTU3/SkpK/2BgYP9DQ0P/NDQ0/ykpKf9LS0v/n5+f/2pqav8cHBz/IiIi/ykpKf8fHx//Gxsb/yEh + If8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/IyMj/yAgIP8eHh7/Hh4e/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8kJCT/Pj4+/2JiYv+BgYH/nJyc/6Ojo/+rq6v/srKy/7m5uf+/v7//xMTE/8fH + x//IyMgx////Af///wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8jI + yP/Gxsb/w8PD/8HBwf++vr7/u7u7/7i4uP+2trb/srKy/6+vr/+srKz/qKio/6Wlpf+hoaH/np6e/5mZ + mf+UlJT/jo6O/4mJif+EhIT/fX19/3Nzc/9WVlb/TU1N/1ZWVv9fX1//XFxc/1hYWP9bW1v/YWFh/2Rk + ZP9iYmL/OTk5/zIyMv9sbGz/hISE/5ycnP+QkJD/U1NT/0pKSv9ubm7/hoaG/21tbf9SUlL/GRkZ/xIS + Ev8gICD/IyMj/yEhIf8pKSn/IiIi/x8fH/8gICD/IyMj/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/yEh + If8fHx//ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8iIiL/R0dH/4KC + gv+cnJz/pKSk/6ysrP+ysrL/urq6/8DAwP/FxcX/yMjI/8jIyDH///8B////Af///wH///8B19fX49bW + 1v/U1NT/0tLS/9DQ0P/Pz8//zc3N/8vLy//IyMj/xsbG/8PDw//CwsL/v7+//7y8vP+5ubn/tra2/7Oz + s/+wsLD/ra2t/6mpqf+mpqb/oqKi/56env+ZmZn/lJSU/5CQkP+Kior/hISE/35+fv91dXX/XFxc/0tL + S/9ERET/QEBA/09PT/9ZWVn/WFhY/15eXv9jY2P/ZWVl/2JiYv8zMzP/MDAw/319ff+ampr/kpKS/1dX + V/9GRkb/a2tr/4uLi/9+fn7/vb29/8rKyv9NTU3/FRUV/xwcHP8dHR3/GBgY/x0dHf8dHR3/ISEh/yMj + I/8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yMjI/8iIiL/ISEh/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8gICD/ICAg/yEhIf9ERET/hYWF/52dnf+lpaX/rKys/7Ozs/+7u7v/wcHB/8XF + xf/IyMj/ycnJMf///wH///8B////Af///wHW1tbj1dXV/9TU1P/R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//FxcX/wsLC/7+/v/+8vLz/urq6/7e3t/+0tLT/sbGx/62trf+qqqr/pqam/6Kiov+enp7/mpqa/5aW + lv+QkJD/i4uL/4WFhf9+fn7/eXl5/25ubv9UVFT/TExM/0BAQP88PDz/SUlJ/1ZWVv9bW1v/YmJi/2Vl + Zf9nZ2f/YmJi/ywsLP8sLCz/ioqK/5ycnP9eXl7/RERE/2NjY/+IiIj/enp6/7S0tP/4+Pj/8fHx/39/ + f/8gICD/GRkZ/xUVFf8VFRX/Ghoa/yAgIP8jIyP/JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yQkJP8jIyP/ISEh/yAgIP8gICD/ICAg/yAgIP8hISH/ISEh/yEhIf8hISH/ISEh/0BA + QP+FhYX/np6e/6enp/+vr6//tra2/76+vv/CwsL/xsbG/8nJyf/Kysox////Af///wH///8B////AdbW + 1uPU1NT/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/Hx8f/xcXF/8PDw//AwMD/vb29/7q6uv+3t7f/tLS0/7Gx + sf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+VlZX/kZGR/4uLi/+FhYX/f39//3l5ef90dHT/aWlp/1VV + Vf9NTU3/PT09/zg4OP9GRkb/VVVV/2FhYf9lZWX/aGho/2lpaf9mZmb/LS0t/yUlJf9oaGj/ZmZm/0RE + RP9iYmL/hoaG/319ff+pqan/+vr6//f39/+cnJz/Jycn/xwcHP8kJCT/Ghoa/xsbG/8gICD/IyMj/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/yAgIP8hISH/ISEh/yEhIf8hISH/Nzc3/319ff+Xl5f/pqam/7Ozs/+6urr/wMDA/8TE + xP/Hx8f/ysrK/8vLyzH///8B////Af///wH///8B1dXV49PT0//R0dH/z8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/76+vv+8vLz/uLi4/7W1tf+ysrL/r6+v/6ysrP+oqKj/pKSk/6CgoP+bm5v/l5eX/5KS + kv+NjY3/hoaG/4GBgf96enr/dXV1/3BwcP9nZ2f/V1dX/05OTv85OTn/NTU1/0NDQ/9XV1f/ZWVl/2dn + Z/9paWn/bGxs/29vb/8zMzP/JSUl/zQ0NP9AQED/Wlpa/4ODg/98fHz/nZ2d/+/v7//7+/v/t7e3/zc3 + N/8cHBz/KCgo/yUlJf8eHh7/ICAg/yMjI/8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/IiIi/yAgIP8fHx//ICAg/yEhIf8hISH/ISEh/yEh + If8vLy//enp6/42Njf+cnJz/tra2/729vf/BwcH/xMTE/8fHx//Kysr/y8vLMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Nzc3/y8vL/8nJyf/Gxsb/xMTE/8HBwf+/v7//vLy8/7m5uf+1tbX/srKy/6+v + r/+srKz/qKio/6Wlpf+goKD/m5ub/5aWlv+SkpL/jY2N/4iIiP+BgYH/e3t7/3Z2dv9wcHD/a2tr/2Rk + ZP9ZWVn/UFBQ/zc3N/8yMjL/QUFB/1paWv9oaGj/aWlp/21tbf94eHj/jo6O/11dXf8oKCj/Jycn/zg4 + OP93d3f/gICA/5qamv/19fX//v7+/7m5uf86Ojr/Ghoa/ygoKP8mJib/HR0d/yAgIP8jIyP/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8hISH/ICAg/x8fH/8gICD/ISEh/ysrK/95eXn/jY2N/5ubm/+6urr/v7+//8PD + w//Gxsb/ycnJ/8zMzP/MzMwx////Af///wH///8B////AdPT0+PR0dH/z8/P/8zMzP/Kysr/x8fH/8XF + xf/Dw8P/wMDA/729vf+6urr/tra2/7Ozs/+wsLD/ra2t/6mpqf+mpqb/oaGh/52dnf+Xl5f/k5OT/46O + jv+JiYn/hISE/319ff93d3f/cnJy/2xsbP9nZ2f/YWFh/1tbW/9RUVH/Pj4+/zc3N/89PT3/W1tb/2lp + af9ra2v/d3d3/42Njf+goKD/bGxs/y4uLv8mJib/KSkp/01NTf+Li4v/5ubm//7+/v/a2tr/RUVF/xoa + Gv8lJSX/KCgo/x8fH/8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JiYm/yUlJf8hISH/Hh4e/x8f + H/8hISH/LCws/3p6ev+Ojo7/nZ2d/729vf/BwcH/xMTE/8bGxv/Jycn/zMzM/83NzTH///8B////Af// + /wH///8B0tLS49DQ0P/Ozs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/u7u7/7i4uP+0tLT/sbGx/62t + rf+qqqr/pqam/6Kiov+dnZ3/mZmZ/5SUlP+Pj4//ioqK/4WFhf9/f3//dnZ2/3Jycv9tbW3/aGho/2Rk + ZP9eXl7/XV1d/15eXv9eXl7/R0dH/zQ0NP9WVlb/bGxs/3R0dP+NjY3/oKCg/4CAgP9GRkb/Pj4+/ysr + K/8mJib/LCws/3Fxcf/b29v/0dHR/1hYWP8bGxv/JCQk/ykpKf8hISH/Hx8f/yMjI/8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yQkJP8iIiL/Hx8f/x8fH/8pKSn/d3d3/5CQkP+dnZ3/vr6+/8LC + wv/FxcX/yMjI/8vLy//Nzc3/zs7OMf///wH///8B////Af///wHR0dHjz8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/v7+//7y8vP+5ubn/tra2/7Kysv+vr6//q6ur/6enp/+jo6P/n5+f/5mZmf+VlZX/kJCQ/4qK + iv+FhYX/gICA/3Nzc/9cXFz/YmJi/2dnZ/9kZGT/YGBg/1xcXP9fX1//YmJi/2VlZf9ISEj/Kysr/1JS + Uv9zc3P/h4eH/56env+FhYX/S0tL/0xMTP9wcHD/VVVV/yoqKv8gICD/Ghoa/09PT/9nZ2f/ISEh/yMj + I/8oKCj/ICAg/yEhIf8kJCT/Jycn/yYmJv8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/IiIi/y0tLf97e3v/kZGR/56env+/v7//xMTE/8fHx//Jycn/zMzM/87Ozv/Pz88x////Af// + /wH///8B////Ac/Pz+POzs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/urq6/7e3t/+0tLT/sLCw/6ys + rP+oqKj/pKSk/6CgoP+cnJz/lpaW/5GRkf+MjIz/hoaG/4GBgf91dXX/W1tb/0tLS/9KSkr/UlJS/15e + Xv9cXFz/XFxc/2FhYf9lZWX/Z2dn/0VFRf8pKSn/VlZW/4aGhv+dnZ3/kJCQ/1BQUP9GRkb/bm5u/4iI + iP91dXX/dHR0/yAgIP8LCwv/KSkp/2tra/8pKSn/JSUl/yAgIP8fHx//JCQk/ycnJ/8mJib/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8rKyv/WVlZ/42Njf+SkpL/np6e/8DA + wP/FxcX/yMjI/8vLy//Nzc3/z8/P/9DQ0DH///8B////Af///wH///8Bzs7O48zMzP/Kysr/x8fH/8XF + xf/CwsL/v7+//7u7u/+4uLj/tbW1/7Gxsf+urq7/qamp/6Wlpf+hoaH/nJyc/5iYmP+RkZH/jY2N/4aG + hv+AgID/enp6/2RkZP9PT0//SEhI/0NDQ/9ERET/V1dX/1lZWf9gYGD/ZWVl/2dnZ/9paWn/QUFB/yYm + Jv9jY2P/np6e/5OTk/9TU1P/RUVF/2tra/+IiIj/dnZ2/87Ozv/4+Pj/nJyc/x8fH/8eHh7/IiIi/xMT + E/8YGBj/Hh4e/yMjI/8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/0lJSf+EhIT/k5OT/5OTk/+kpKT/w8PD/8bGxv/Kysr/y8vL/87Ozv/Q0ND/0dHRMf// + /wH///8B////Af///wHNzc3jy8vL/8nJyf/Gxsb/xMTE/8DAwP+9vb3/urq6/7a2tv+zs7P/rq6u/6ur + q/+np6f/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/gICA/3p6ev90dHT/YGBg/1FRUf9GRkb/Pz8//0JC + Qv9VVVX/Wlpa/2RkZP9mZmb/aWlp/2tra/89PT3/Hx8f/1tbW/+ampr/Xl5e/0JCQv9jY2P/hoaG/3p6 + ev+zs7P//Pz8//b29v+NjY3/Hx8f/x0dHf8VFRX/FBQU/x0dHf8gICD/IyMj/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQkJP8kJCT/Hx8f/zg4OP9+fn7/mZmZ/7W1 + tf/Gxsb/yMjI/8vLy//Nzc3/z8/P/9HR0f/S0tIx////Af///wH///8B////AczMzOPKysr/yMjI/8XF + xf/CwsL/vr6+/7u7u/+3t7f/s7Oz/7CwsP+srKz/qKio/6Ojo/+enp7/mZmZ/5SUlP+Pj4//iIiI/4KC + gv96enr/dHR0/25ubv9dXV3/VVVV/0RERP88PDz/Pj4+/1RUVP9gYGD/Z2dn/2lpaf9ra2v/bm5u/0FB + Qf8eHh7/MzMz/1VVVf9BQUH/Y2Nj/4WFhf95eXn/s7Oz//f39//z8/P/lJSU/yIiIv8cHBz/Jycn/x4e + Hv8bGxv/ICAg/yEhIf8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8jIyP/ISEh/w8PD/8CAgL/JSUl/4mJif+xsbH/w8PD/8fHx//Jycn/y8vL/83Nzf/Q0ND/0tLS/9LS + 0jH///8B////Af///wH///8BzMzM48nJyf/Gxsb/w8PD/8DAwP+8vLz/ubm5/7W1tf+xsbH/ra2t/6mp + qf+lpaX/oKCg/5ubm/+VlZX/kJCQ/4qKiv+Dg4P/fX19/3Z2dv9wcHD/a2tr/15eXv9YWFj/Q0ND/zg4 + OP88PDz/VFRU/2RkZP9paWn/a2tr/25ubv97e3v/Xl5e/x8fH/8hISH/NjY2/1hYWP+Dg4P/fHx8/6Gh + of/19fX//v7+/6enp/8wMDD/Ghoa/yYmJv8jIyP/Gxsb/x0dHf8hISH/IyMj/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8RERH/AwMD/yUlJf9vb2//r6+v/8HB + wf/FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PTMf///wH///8B////Af///wHLy8vjyMjI/8bG + xv/CwsL/v7+//7u7u/+3t7f/s7Oz/66urv+qqqr/pqam/6Kiov+cnJz/lpaW/5GRkf+Li4v/hYWF/35+ + fv94eHj/cnJy/21tbf9paWn/X19f/1tbW/9CQkL/Nzc3/zk5Of9TU1P/ZmZm/2tra/9ubm7/e3t7/5OT + k/+Hh4f/LCws/x8fH/8wMDD/YWFh/4GBgf+cnJz/7e3t//r6+v++vr7/MTEx/xoaGv8mJib/JSUl/x4e + Hv8fHx//ISEh/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQk + JP8nJyf/FxcX/wMDA/8eHh7/e3t7/6Ghof+/v7//xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT + 0//U1NQx////Af///wH///8B////AcrKyuPHx8f/xMTE/8DAwP+9vb3/ubm5/7W1tf+xsbH/rKys/6io + qP+ioqL/np6e/5iYmP+SkpL/jIyM/4aGhv+AgID/eHh4/3Nzc/9ubm7/ampq/2VlZf9fX1//Xl5e/1BQ + UP9JSUn/Nzc3/1BQUP9oaGj/bW1t/3h4eP+SkpL/oKCg/3R0dP8xMTH/Hx8f/yIiIv8zMzP/bGxs/+Xl + 5f/8/Pz/vLy8/0FBQf8ZGRn/JSUl/yQkJP8fHx//ICAg/yIiIv8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/xcXF/8DAwP/Hh4e/29vb/+kpKT/vb29/8LC + wv/ExMT/x8fH/8nJyf/Ly8v/zs7O/9DQ0P/S0tL/1NTU/9XV1TH///8B////Af///wH///8ByMjI48bG + xv/Dw8P/v7+//7y8vP+3t7f/s7Oz/6+vr/+qqqr/pqam/6CgoP+bm5v/lJSU/46Ojv+IiIj/goKC/3V1 + df9ubm7/b29v/2xsbP9nZ2f/YmJi/19fX/9hYWH/Y2Nj/1lZWf8yMjL/Q0ND/2hoaP92dnb/jIyM/5+f + n/+AgID/RkZG/0RERP84ODj/HR0d/yEhIf83Nzf/kJCQ/8XFxf9MTEz/GRkZ/yQkJP8lJSX/HR0d/x8f + H/8iIiL/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JSUl/ycn + J/8XFxf/BAQE/xEREf9mZmb/np6e/7u7u//CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/1tbWMf///wH///8B////Af///wHIyMjjxMTE/8HBwf+9vb3/urq6/7W1tf+xsbH/rKys/6en + p/+ioqL/m5ub/5aWlv+QkJD/ioqK/4ODg/90dHT/WFhY/09PT/9ZWVn/ZGRk/2RkZP9hYWH/YWFh/2Rk + ZP9nZ2f/W1tb/y4uLv88PDz/b29v/42Njf+hoaH/g4OD/0ZGRv9MTEz/dnZ2/3t7e/9BQUH/ISEh/w8P + D/8UFBT/QEBA/yEhIf8gICD/JiYm/x0dHf8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8uLi7/QUFB/y0tLf8hISH/aWlp/6SkpP+7u7v/wcHB/8PD + w//FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/X19cx////Af///wH///8B////AcbG + xuPExMT/wMDA/729vf+4uLj/s7Oz/6+vr/+pqan/pKSk/5+fn/+ZmZn/kpKS/4uLi/+FhYX/fHx8/2Fh + Yf9PT0//SEhI/0ZGRv9WVlb/YmJi/2BgYP9kZGT/ZmZm/2lpaf9aWlr/Kioq/0NDQ/+CgoL/oKCg/5GR + kf9KSkr/RkZG/29vb/+Ghob/e3t7/8DAwP95eXn/ExMT/xQUFP84ODj/ISEh/xwcHP8eHh7/Hh4e/yIi + Iv8kJCT/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/Kioq/0RE + RP9WVlb/e3t7/4KCgv+vr6//u7u7/8DAwP/CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9jY2DH///8B////Af///wH///8BxsbG48PDw/+/v7//u7u7/7e3t/+xsbH/rKys/6am + pv+hoaH/nJyc/5WVlf+Ojo7/hoaG/4CAgP92dnb/WVlZ/1FRUf9FRUX/QkJC/1JSUv9gYGD/YmJi/2dn + Z/9paWn/a2tr/1ZWVv8lJSX/RkZG/5WVlf+RkZH/UlJS/0ZGRv9qamr/hYWF/319ff/Kysr//f39/9/f + 3/9CQkL/HBwc/xsbG/8SEhL/FhYW/xwcHP8iIiL/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IyMj/yQkJP8nJyf/Kysr/zAwMP80NDT/NDQ0/zIyMv8uLi7/KSkp/yYmJv8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8qKir/PT09/1JSUv+IiIj/np6e/7u7u/+/v7//wcHB/8PD + w//FxcX/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/Y2Nj/2dnZMf///wH///8B////Af// + /wHFxcXjwsLC/729vf+5ubn/tbW1/6+vr/+qqqr/pKSk/5+fn/+ZmZn/kZGR/4qKiv+CgoL/e3t7/3Nz + c/9bW1v/U1NT/0FBQf8/Pz//UVFR/2BgYP9mZmb/aWlp/2tra/9tbW3/WFhY/yMjI/81NTX/f39//1ZW + Vv9BQUH/ZmZm/4aGhv96enr/u7u7//n5+f/s7Oz/gICA/xwcHP8fHx//Gxsb/xQUFP8aGhr/ISEh/yYm + Jv8lJSX/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/ygoKP85OTn/WVlZ/3Fxcf+EhIT/lZWV/52d + nf+dnZ3/mJiY/46Ojv9+fn7/ampq/09PT/85OTn/JiYm/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hh4e/wsL + C/8UFBT/WVlZ/5aWlv+zs7P/vr6+/8DAwP/Dw8P/xcXF/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9nZ2f/a2tox////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+0tLT/rq6u/6io + qP+ioqL/nJyc/5aWlv+Ojo7/hoaG/319ff93d3f/b29v/1xcXP9UVFT/PT09/zs7O/9PT0//Y2Nj/2lp + af9sbGz/bm5u/3Jycv9kZGT/JCQk/yEhIf86Ojr/QEBA/11dXf+FhYX/fn5+/7CwsP/5+fn/9vb2/4eH + h/8kJCT/HBwc/yYmJv8hISH/HR0d/yEhIf8mJib/JiYm/yUlJf8kJCT/IyMj/yMjI/8jIyP/JiYm/zIy + Mv9fX1//jY2N/6ysrP++vr7/xcXF/8nJyf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8nJyf/FxcX/vb29/6ur + q/99fX3/VFRU/zExMf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8lJSX/IyMj/yMjI/8LCwv/BgYG/0FBQf+Li4v/srKy/729vf/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1dXV/9bW1v/Y2Nj/2tra/9ra2jH///8B////Af// + /wH///8BxMTE48DAwP+8vLz/t7e3/7Kysv+srKz/p6en/6Ghof+ampr/k5OT/4uLi/+Dg4P/enp6/3R0 + dP9tbW3/X19f/1VVVf86Ojr/ODg4/09PT/9lZWX/bGxs/25ubv9ycnL/goKC/4eHh/8yMjL/Hh4e/ysr + K/9OTk7/gICA/39/f/+qqqr/9vb2//Pz8/+ampr/Hh4e/xoaGv8lJSX/IiIi/x4eHv8iIiL/JiYm/yYm + Jv8lJSX/JCQk/yMjI/8jIyP/IyMj/zAwMP9nZ2f/o6Oj/8XFxf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8vL + y//Ly8v/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/FxcX/m5ub/11dXf8uLi7/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8jIyP/CwsL/wYG + Bv85OTn/kJCQ/7Kysv+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9TU + 1P/V1dX/19fX/9nZ2f/a2tr/29vbMf///wH///8B////Af///wHExMTjwMDA/7u7u/+2trb/sbGx/6ur + q/+mpqb/oKCg/5mZmf+SkpL/iYmJ/4GBgf95eXn/dHR0/25ubv9iYmL/VlZW/0JCQv88PDz/T09P/2dn + Z/9vb2//cXFx/319ff+Xl5f/oaGh/0tLS/8dHR3/IyMj/0BAQP9lZWX/nJyc//Dw8P/6+vr/rKys/zMz + M/8YGBj/JSUl/yEhIf8cHBz/ISEh/yYmJv8mJib/JSUl/yQkJP8jIyP/IyMj/yMjI/9AQED/jY2N/8DA + wP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ly8v/vLy8/4GBgf89PT3/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yUlJf8kJCT/Kysr/xISEv8CAgL/Ly8v/4WFhf+tra3/vLy8/7+/v//BwcH/w8PD/8bG + xv/Hx8f/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//c3Nwx////Af// + /wH///8B////AcPDw+O/v7//u7u7/7W1tf+wsLD/qqqq/6Wlpf+enp7/l5eX/4yMjP+Hh4f/gYGB/3l5 + ef91dXX/b29v/2ZmZv9nZ2f/Z2dn/0lJSf9BQUH/ZWVl/3Jycv9/f3//lZWV/6Kiov91dXX/Ozs7/yws + LP8dHR3/JSUl/zg4OP+rq6v/7+/v/66urv8uLi7/GBgY/yUlJf8jIyP/HBwc/yAgIP8lJSX/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8qKir/XV1d/7W1tf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/7Cw + sP9nZ2f/KSkp/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/ycnJ/8PDw//AQEB/zIy + Mv+Hh4f/rKys/729vf+/v7//wcHB/8PDw//FxcX/x8fH/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9TU + 1P/W1tb/19fX/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8Bw8PD48DAwP+7u7v/tbW1/7Cw + sP+pqan/pKSk/52dnf+Li4v/bW1t/3Nzc/99fX3/e3t7/3h4eP9xcXH/aGho/2pqav9paWn/RUVF/zU1 + Nf9gYGD/e3t7/5OTk/+jo6P/fn5+/0VFRf9MTEz/ZGRk/zY2Nv8aGhr/HBwc/y4uLv9ycnL/Q0ND/xYW + Fv8iIiL/IyMj/xwcHP8fHx//IyMj/yUlJf8lJSX/JCQk/yQkJP8jIyP/KCgo/2lpaf+1tbX/zMzM/8zM + zP/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/7u7u/9mZmb/Kioq/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yQkJP8pKSn/FxcX/wEBAf8dHR3/fX19/6ioqP+6urr/vr6+/8DAwP/Dw8P/xcXF/8bG + xv/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3d3dMf// + /wH///8B////Af///wHDw8Pjv7+//7q6uv+0tLT/r6+v/6mpqf+jo6P/lJSU/21tbf9aWlr/VVVV/19f + X/94eHj/eXl5/3Jycv9sbGz/bm5u/2xsbP9ERET/MzMz/2pqav+Pj4//oqKi/4aGhv9BQUH/SUlJ/3R0 + dP+BgYH/b29v/1BQUP8VFRX/DQ0N/zs7O/9DQ0P/HR0d/yQkJP8bGxv/HR0d/yIiIv8kJCT/JCQk/yQk + JP8kJCT/IyMj/yUlJf9kZGT/u7u7/8rKyv/Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/8rK + yv/Kysr/ycnJ/7W1tf9dXV3/JSUl/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8lJSX/MzMz/0tLS/9TU1P/SUlJ/4GB + gf+rq6v/urq6/76+vv/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zs7O/8/Pz//R0dH/09PT/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/e3t4x////Af///wH///8B////AcPDw+O/v7//urq6/7W1 + tf+vr6//qamp/6Ojo/+Hh4f/Y2Nj/1dXV/9NTU3/UlJS/3h4eP96enr/cXFx/3BwcP9xcXH/bm5u/z8/ + P/8xMTH/eXl5/6Ghof+Hh4f/SkpK/0ZGRv9ubm7/g4OD/4KCgv/R0dH/3d3d/2hoaP8SEhL/IyMj/x0d + Hf8UFBT/GBgY/xwcHP8gICD/IiIi/yQkJP8kJCT/JCQk/yQkJP8jIyP/Q0ND/6+vr//Kysr/ysrK/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/y8vL/8vLy//Ly8v/y8vL/8rKyv/Kysr/ysrK/8rKyv/Kysr/ycnJ/7Gxsf9DQ0P/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/y0tLf9ERET/U1NT/3Nzc/+Kior/rq6u/7u7u/+9vb3/v7+//8LCwv/ExMT/xsbG/8jI + yP/Kysr/y8vL/83Nzf/Pz8//0dHR/9LS0v/U1NT/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3t7e/9/f + 3zH///8B////Af///wH///8BxMTE48DAwP+7u7v/tra2/7CwsP+pqan/o6Oj/4WFhf9nZ2f/VVVV/0hI + SP9PT0//enp6/3l5ef9zc3P/c3Nz/3R0dP9ubm7/Ozs7/ywsLP95eXn/k5OT/01NTf9CQkL/bGxs/4eH + h/97e3v/ycnJ//v7+//d3d3/X19f/xcXF/8YGBj/EhIS/xYWFv8bGxv/ICAg/yIiIv8jIyP/JCQk/yQk + JP8kJCT/JCQk/zAwMP+Hh4f/yMjI/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/ysrK/8rK + yv/Kysr/ysrK/8rKyv/Kysr/ycnJ/4qKiv8uLi7/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8mJib/HR0d/x8fH/9FRUX/enp6/56e + nv+3t7f/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1NTU/9XV + 1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/93d3f/f39//39/fMf///wH///8B////Af///wHExMTjwcHB/7y8 + vP+2trb/sbGx/6mpqf+jo6P/iIiI/2tra/9TU1P/RERE/0xMTP95eXn/d3d3/3V1df92dnb/d3d3/3Nz + c/8+Pj7/JCQk/0xMTP9RUVH/QUFB/2VlZf+Hh4f/eXl5/8fHx//+/v7/6Ojo/2RkZP8aGhr/Hh4e/yQk + JP8bGxv/HBwc/yEhIf8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/XFxc/76+vv/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Kysr/ysrK/8rKyv/Kysr/ysrK/8vLy//Ly8v/vLy8/1dX + V/8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8jIyP/IiIi/xkZGf8EBAT/ExMT/21tbf+goKD/uLi4/7y8vP++vr7/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Kysr/zc3N/87Ozv/Q0ND/0dHR/9PT0//V1dX/1tbW/9jY2P/Z2dn/2tra/9vb2//d3d3/3t7e/9/f + 3//g4OAx////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+ysrL/q6ur/6SkpP+Hh4f/bm5u/1BQ + UP9CQkL/TU1N/3t7e/93d3f/eHh4/3h4eP97e3v/g4OD/01NTf8iIiL/MDAw/0RERP9gYGD/hYWF/3V1 + df+vr6//+Pj4//Hx8f+IiIj/Hh4e/xwcHP8lJSX/Hx8f/x0dHf8gICD/IiIi/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf+SkpL/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zs7O/87Ozv/Ozs7/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/Jycn/hoaG/ywsLP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8bGxv/BAQE/wcHB/9RUVH/mZmZ/7S0 + tP+8vLz/vr6+/8DAwP/Dw8P/xcXF/8fHx//IyMj/ysrK/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9bW + 1v/X19f/2NjY/9ra2v/b29v/3d3d/97e3v/f39//4ODg/+Hh4TH///8B////Af///wH///8BxMTE48LC + wv++vr7/uLi4/7Ozs/+tra3/pqam/4iIiP9xcXH/T09P/0JCQv9LS0v/e3t7/3p6ev96enr/fX19/4iI + iP+enp7/eXl5/yUlJf8sLCz/Wlpa/3x8fP92dnb/srKy//j4+P/w8PD/ioqK/yIiIv8bGxv/JSUl/x8f + H/8cHBz/ICAg/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MjIy/7q6uv/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zc3N/83N + zf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/MzMz/zMzM/83N + zf+urq7/OTk5/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8iIiL/Gxsb/wYGBv8ODg7/UVFR/5mZmf+1tbX/u7u7/76+vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8rK + yv/MzMz/zs7O/9DQ0P/R0dH/09PT/9TU1P/V1dX/2NjY/9nZ2f/a2tr/29vb/9zc3P/e3t7/39/f/+Dg + 4P/h4eH/4eHhMf///wH///8B////Af///wHExMTjwsLC/76+vv+6urr/tbW1/66urv+oqKj/ioqK/3d3 + d/9oaGj/Xl5e/05OTv94eHj/fX19/35+fv+IiIj/mpqa/5+fn/9kZGT/KCgo/yAgIP9KSkr/aWlp/5WV + lf/29vb/+vr6/56env8oKCj/GRkZ/yUlJf8hISH/HBwc/yAgIP8iIiL/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP9LS0v/ysrK/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8HBwf9OTk7/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8kJCT/JSUl/x8fH/8HBwf/BgYG/05OTv+Pj4//r6+v/7u7 + u/+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Pz8//0dHR/9PT0//U1NT/1dXV/9fX + 1//Y2Nj/2tra/9vb2//d3d3/3d3d/97e3v/g4OD/4eHh/+Li4v/i4uIx////Af///wH///8B////AcTE + xOPCwsL/v7+//7u7u/+3t7f/sbGx/6qqqv+Kior/e3t7/3x8fP9sbGz/Pj4+/1lZWf9+fn7/iIiI/5ub + m/+jo6P/bm5u/z8/P/9GRkb/MTEx/yYmJv9JSUn/YGBg/7Gxsf+qqqr/Ly8v/xgYGP8kJCT/IiIi/x0d + Hf8fHx//IiIi/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/2BgYP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87O + zv/Ozs7/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/ysrK/11dXf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JCQk/yQk + JP8fHx//CQkJ/wcHB/9FRUX/kJCQ/62trf+6urr/vLy8/7+/v//BwcH/xMTE/8bGxv/IyMj/ysrK/8zM + zP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9ra2v/b29v/3Nzc/93d3f/e3t7/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4zH///8B////Af///wH///8BxcXF48LCwv+/v7//vLy8/7i4uP+zs7P/qqqq/4iI + iP9+fn7/fn5+/2lpaf83Nzf/VlZW/4aGhv+YmJj/oaGh/3x8fP8+Pj7/TU1N/3h4eP9oaGj/NjY2/xkZ + Gf8TExP/IyMj/z4+Pv8eHh7/IiIi/yQkJP8cHBz/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/aGho/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/a2tr/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yQkJP8mJib/NjY2/y0tLf8aGhr/Q0ND/5GRkf+urq7/ubm5/7y8 + vP+/v7//wcHB/8PDw//FxcX/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/09PT/9TU1P/V1dX/19fX/9jY + 2P/Z2dn/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTkMf///wH///8B////Af// + /wHFxcXjwsLC/7+/v/+8vLz/uLi4/7S0tP+jo6P/hISE/4CAgP+AgID/aWlp/zY2Nv9cXFz/l5eX/6Oj + o/+AgID/RUVF/0lJSf9ycnL/g4OD/4ODg/+1tbX/S0tL/w4ODv8iIiL/Ozs7/x8fH/8eHh7/Hh4e/x4e + Hv8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP9hYWH/zMzM/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zc3N/8vLy/9qamr/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8kJCT/JCQk/zQ0 + NP9MTEz/X19f/2pqav+SkpL/s7Oz/7m5uf+7u7v/vr6+/8DAwP/Dw8P/xcXF/8fHx//Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Tk5P/k5OQx////Af///wH///8B////AcbGxuPDw8P/wMDA/7y8vP+5ubn/sbGx/5KS + kv+CgoL/goKC/4GBgf9lZWX/NDQ0/1xcXP+ioqL/iIiI/0VFRf9ERET/dHR0/4SEhP+BgYH/3t7e//z8 + /P+wsLD/Li4u/ycnJ/8bGxv/FBQU/xoaGv8gICD/JSUl/yYmJv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/1FRUf/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/x8fH/1xcXP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/LS0t/0RERP9oaGj/hoaG/6+vr/+5ubn/vLy8/76+ + vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8vLy//Nzc3/z8/P/9DQ0P/S0tL/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+Xl5TH///8B////Af// + /wH///8BxsbG48TExP/BwcH/vb29/7q6uv+np6f/h4eH/4ODg/+Dg4P/g4OD/2VlZf8zMzP/Q0ND/4CA + gP9MTEz/QkJC/2hoaP+Hh4f/enp6/9DQ0P/9/f3/4ODg/1VVVf8ZGRn/Hx8f/xkZGf8WFhb/Hh4e/yUl + Jf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Ojo6/8HB + wf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP+8vLz/R0dH/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8iIiL/IiIi/xAQ + EP8GBgb/NjY2/4GBgf+hoaH/ubm5/7u7u/++vr7/wMDA/8LCwv/ExMT/xsbG/8nJyf/Ly8v/zc3N/8/P + z//Q0ND/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Xl5f/l5eX/5ubmMf///wH///8B////Af///wHHx8fjxMTE/8HBwf++vr7/u7u7/5iY + mP+EhIT/hYWF/4WFhf+IiIj/dnZ2/zc3N/8sLCz/RUVF/0NDQ/9paWn/hYWF/319ff/IyMj/+/v7/+Dg + 4P9lZWX/FhYW/x0dHf8kJCT/Hh4e/x8fH/8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8mJib/n5+f/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/ysrK/5ycnP8yMjL/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IiIi/yEhIf8TExP/AwMD/yoqKv+BgYH/qamp/7i4uP+8vLz/vr6+/8DA + wP/CwsL/xMTE/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9vb + 2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5uYx////Af// + /wH///8B////AcjIyOPFxcX/wsLC/7+/v/+8vLz/k5OT/4WFhf+Ghob/iIiI/5KSkv+Ojo7/QkJC/yoq + Kv9eXl7/cHBw/4ODg/93d3f/vr6+//n5+f/n5+f/dHR0/xwcHP8cHBz/JSUl/x4eHv8fHx//JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP9wcHD/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//FxcX/eHh4/ykpKf8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8hISH/ExMT/wMD + A/8bGxv/dHR0/6Wlpf+4uLj/vLy8/76+vv/AwMD/wsLC/8TExP/Gxsb/ycnJ/8vLy//Nzc3/z8/P/9DQ + 0P/S0tL/09PT/9XV1f/X19f/2NjY/9nZ2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj + 4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5zH///8B////Af///wH///8ByMjI48bGxv/ExMT/wcHB/729 + vf+SkpL/hoaG/4iIiP+RkZH/oKCg/5eXl/9HR0f/JSUl/1JSUv+Li4v/gICA/66urv/6+vr/8fHx/3x8 + fP8eHh7/Gxsb/yUlJf8fHx//Hh4e/yIiIv8kJCT/JCQk/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/z4+Pv+np6f/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/7CwsP9JSUn/JCQk/yQk + JP8kJCT/JCQk/yQkJP8jIyP/IyMj/xgYGP8EBAT/ExMT/2dnZ/+ampr/tra2/7y8vP++vr7/wMDA/8LC + wv/ExMT/xsbG/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/5+fnMf// + /wH///8B////Af///wHJycnjx8fH/8XFxf/CwsL/vr6+/5KSkv+JiYn/kZGR/6CgoP+fn5//Y2Nj/zo6 + Ov8sLCz/Kioq/21tbf+QkJD/w8PD/+zs7P+RkZH/Hh4e/xoaGv8kJCT/ICAg/x0dHf8gICD/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/KCgo/2dnZ//CwsL/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vL + y//Ly8v/y8vL/8vLy//Gxsb/ZmZm/ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8XFxf/BAQE/xkZ + Gf9oaGj/np6e/7S0tP+8vLz/vr6+/8DAwP/CwsL/xMTE/8fHx//IyMj/y8vL/8zMzP/Ozs7/0NDQ/9LS + 0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Ogx////Af///wH///8B////AcrKyuPIyMj/xsbG/8PD + w/+/v7//kpKS/5CQkP+dnZ3/o6Oj/3R0dP88PDz/Tk5O/2FhYf8vLy//LCws/z4+Pv8+Pj7/cHBw/zAw + MP8ZGRn/IyMj/yEhIf8dHR3/ICAg/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Li4u/5OTk//MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/y8vL/8vLy//Ly8v/ycnJ/56env8xMTH/JCQk/yQk + JP8kJCT/IyMj/yMjI/8mJib/ISEh/wcHB/8KCgr/YWFh/5mZmf+2trb/vLy8/76+vv/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/29vb/9zc + 3P/e3t7/39/f/+Dg4P/h4eH/4eHh/+Pj4//j4+P/5OTk/+Xl5f/l5eX/5ubm/+fn5//o6Oj/6Ojo/+np + 6TH///8B////Af///wH///8By8vL48nJyf/Hx8f/xcXF/7+/v/+YmJj/np6e/6Ojo/9ycnL/PT09/1JS + Uv96enr/fX19/3p6ev9RUVH/ERER/xISEv9MTEz/Pz8//yEhIf8iIiL/Hx8f/x8fH/8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/Nzc3/5WVlf/IyMj/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/y8vL/8rKyv+dnZ3/QEBA/yQkJP8kJCT/JCQk/yQkJP8jIyP/KSkp/0FBQf9RUVH/U1NT/2lp + af+qqqr/tra2/729vf+/v7//wcHB/8PDw//ExMT/x8fH/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9PT + 0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Li4v/i4uL/5OTk/+Tk + 5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+np6f/p6en/6enpMf///wH///8B////Af///wHMzMzjysrK/8jI + yP/Gxsb/wcHB/6Ojo/+mpqb/fX19/0FBQf9HR0f/dnZ2/4GBgf+Ghob/4eHh/9PT0/9MTEz/KSkp/zMz + M/8gICD/Ghoa/xwcHP8gICD/ISEh/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/QEBA/5aW + lv/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Kysr/qamp/0lJSf8mJib/JCQk/yQk + JP8kJCT/IyMj/yQkJP8zMzP/SkpK/1tbW/94eHj/mJiY/7q6uv+8vLz/v7+//8HBwf/Dw8P/xcXF/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3Nzc/93d + 3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq + 6v/q6uox////Af///wH///8B////Ac3NzePLy8v/ycnJ/8fHx//ExMT/rKys/4SEhP9ERET/R0dH/29v + b/+CgoL/hYWF/+Li4v/7+/v/wMDA/zY2Nv8eHh7/HR0d/xISEv8ZGRn/Hh4e/yEhIf8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MzMz/4KCgv+6urr/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/v7+//4qKiv9AQED/JSUl/yQkJP8kJCT/JCQk/yMjI/8iIiL/ICAg/xISEv8nJyf/YWFh/42N + jf+ysrL/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU + 1P/W1tb/19fX/9nZ2f/a2tr/29vb/93d3f/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6zH///8B////Af///wH///8Bz8/P483N + zf/Kysr/yMjI/8bGxv+jo6P/SkpK/0NDQ/9sbGz/goKC/35+fv/R0dH/+/v7/8zMzP9KSkr/ExMT/x0d + Hf8hISH/GRkZ/x4eHv8hISH/IiIi/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yQiIf8iIiL/IiIi/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/LCws/1dXV/+jo6P/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/x8fH/6mpqf9kZGT/Ly8v/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IiIi/x4eHv8LCwv/BwcH/0BAQP+QkJD/sbGx/729vf/AwMD/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Ly8v/zMzM/87Ozv/Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq + 6v/r6+v/6+vrMf///wH///8B////Af///wHPz8/jzs7O/8zMzP/Kysr/yMjI/7e3t/9vb2//aGho/4OD + g/94eHj/y8vL//v7+//T09P/VFRU/xcXF/8dHR3/IyMj/xwcHP8dHR3/ISEh/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv86Ih7/ciQW/0AhHP8jISH/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JiYm/zo6Ov9oaGj/o6Oj/8HB + wf/Jycn/zMzM/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Jycn/xMTE/62t + rf9wcHD/Pz8//ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8gICD/DAwM/wMDA/89PT3/h4eH/7Cw + sP+9vb3/v7+//8LCwv/ExMT/xsbG/8fHx//Jycn/y8vL/83Nzf/Pz8//0NDQ/9LS0v/T09P/1NTU/9bW + 1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Owx////Af///wH///8B////AdHR + 0ePPz8//zc3N/8vLy//Jycn/x8fH/7W1tf+SkpL/e3t7/76+vv/+/v7/5OTk/1paWv8UFBT/HBwc/yQk + JP8bGxv/HBwc/yEhIf8kJCT/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/NSIe/5EnFP/CLBH/ZCUa/yYi + If8iIiL/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8tLS3/TU1N/3Z2dv+goKD/rq6u/7q6uv/BwcH/yMjI/8nJ + yf/Hx8f/xcXF/729vf+urq7/m5ub/3p6ev9VVVX/MzMz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMj + I/8iIiL/ICAg/w4ODv8CAgL/Kioq/42Njf+tra3/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/d3d3/3t7e/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+np6f/p6en/6urq/+vr + 6//r6+v/7Ozs/+zs7DH///8B////Af///wH///8B0tLS49DQ0P/Ozs7/zMzM/8vLy//Jycn/xsbG/7Ky + sv+xsbH/9PT0/+np6f98fHz/GRkZ/xkZGf8jIyP/Hx8f/xwcHP8hISH/JSUl/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/ykhIP9/JRX/xCwR/4UoGP8qIiH/IiIi/yIiIv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/KCgo/zY2Nv9AQED/TExM/1lZWf9qamr/bW1t/2hoaP9iYmL/UVFR/0FBQf8zMzP/KCgo/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yEhIf8QEBD/AgIC/yAgIP90dHT/qqqq/7y8 + vP/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/0tLS/9PT0//U1NT/1tbW/9fX + 1//Z2dn/2tra/9zc3P/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4uLi/+Pj4//k5OT/5eXl/+bm + 5v/m5ub/5+fn/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7OzsMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/wsLC/5GRkf+kpKT/cHBw/xsbG/8ZGRn/IiIi/x8f + H/8eHh7/IyMj/yYmJv8lJSX/IyMj/yIiIv8iIiL/IiIi/yIiIv8sIR//eSYX/8UtEf+CKBj/LiIg/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yQiIv8jIyP/IyMj/yMjI/8jIiL/LCIh/0sjHP9vJRj/NSIf/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yQk + JP8nJyf/ERER/wICAv8lJSX/fX19/6ampv++vr7/wcHB/8PDw//ExMT/xsbG/8jIyP/Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3d3d/93d3f/e3t7/39/f/+Dg + 4P/h4eH/4uLi/+Pj4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+3t7f/t7e0x////Af///wH///8B////AdXV1ePT09P/0dHR/8/Pz//Nzc3/zMzM/8rK + yv/BwcH/aGho/zs7O/9DQ0P/ISEh/yIiIv8eHh7/HR0d/yIiIv8mJib/JSUl/yMjI/8iIiL/IiIi/yIi + Iv8hISH/JCEh/3QlF//DLBD/tSsS/z4iHf8iISH/IiIi/yIiIv8iIiL/IiEh/yohH/9JIhz/YiIX/zch + Hf8kIiL/JiIh/0ciG/9+Jhb/jCgW/7csE/9GJB7/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/Li4u/z4+Pv8sLCz/Kysr/35+fv+qqqr/vLy8/8HB + wf/Dw8P/xcXF/8bGxv/IyMj/ysrK/8zMzP/Nzc3/z8/P/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+bm + 5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7jH///8B////Af// + /wH///8B1dXV49TU1P/T09P/0dHR/8/Pz//Nzc3/y8vL/8LCwv9vb2//U1NT/0dHR/8tLS3/JiYm/x4e + Hv8iIiL/JSUl/yUlJf8jIyP/IyMj/yIiIv8hISH/ISEh/yYgIP9fIxj/xSwR/7QsE/+7KxL/lycT/1Ui + GP80IR7/OSEc/0ohGv9tIxb/nygT/7wrEv+6LBL/hiYV/1MiGf98Jhb/kSgV/2QmG/9YJhz/nisW/ywj + If8jIiL/MyIf/z8iHf8vIiD/IyIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/IyMj/yYm + Jv9DQ0P/UVFR/2xsbP9/f3//s7Oz/7+/v//BwcH/xMTE/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ + 0P/R0dH/09PT/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr + 6//s7Oz/7Ozs/+3t7f/u7u7/7u7uMf///wH///8B////Af///wHX19fj1dXV/9TU1P/S0tL/0NDQ/8/P + z//Nzc3/xcXF/35+fv9PT0//MDAw/ywsLP8mJib/ISEh/yQkJP8lJSX/IyMj/yMjI/8iIiL/IiIi/yEh + If8jICD/YiMZ/7srEf+fKhX/QSMd/1QkHP+eKhX/vCoQ/64pEf+sKBH/tioR/7ErE/+ZKhb/dCca/1Ml + HP98JRb/mCgU/3EnGv85JCD/JiMi/2smGv95KBn/IyMi/zQjIP+PJxT/hicW/3AkFv84Ix//IyIi/yMj + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/Hh4e/zIyMv9PT0//e3t7/5ycnP+9vb3/w8PD/8TE + xP/Gxsb/yMjI/8nJyf/Ly8v/zc3N/87Ozv/Q0ND/0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra + 2v/c3Nz/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//r6+v/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u4x////Af// + /wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/8/Pz//IyMj/gYGB/zc3N/8sLCz/KCgo/yEh + If8hISH/IyMj/yQkJP8jIyP/IiIi/yIiIv8hISH/ISEh/1EjG/+7KxH/tisS/0QjHf8iISD/IiEg/zUi + Hv9rJhn/tysS/7YqEf9eJBr/PiMe/y8iIP8lIiH/JCIh/0wkHf9DJB7/KCMi/yIiIv8qIiH/hSgX/1Ym + Hf8nIiH/QyQe/5YpFf9IIxz/TyUd/4gnFv9aJBn/JSIi/yMiIv8jIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/xoa + Gv8GBgb/FxcX/2RkZP+enp7/u7u7/8PDw//FxcX/x8fH/8jIyP/Kysr/zMzM/87Ozv/Pz8//0NDQ/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9ra2v/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7jH///8B////Af///wH///8B2tra49jY2P/W1tb/1NTU/9PT + 0//S0tL/0NDQ/8XFxf9kZGT/LS0t/ygoKP8iIiL/IiIi/yMjI/8kJCT/IyMj/yMjI/8iIiL/IiIi/yEh + If8oISD/gCcX/8ctEf+gKBP/QSEb/yYgH/8gICD/ICAg/yAgH/9MIxz/tisS/34mFv8mISD/ISEh/yYh + IP83IR3/RSIb/0MiHP8zIR7/IyEh/0IkHv+ZKRX/OyMf/1ckG/9zJRf/WSUc/4MmFf9uJBf/pSoU/1Yl + HP9EIx3/SyMc/zMiH/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8ZGRn/BQUF/wwMDP9bW1v/oaGh/7+/v//FxcX/xsbG/8jI + yP/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/n5+f/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7v/v7+//7+/vMf// + /wH///8B////Af///wHa2trj2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/w8PD/1dXV/8sLCz/IyMj/yEh + If8jIyP/JCQk/yQkJP8jIyP/IyMj/yIiIv8iIiL/IiIi/yEhIf8zIh//aiYa/64qE/+uKRH/bSMW/y0f + Hf8gICD/ICAg/zshHf+tKhL/oioU/y0hH/8rIB7/bCMW/6QpEv+0KhH/rykR/5onEv9aIhj/WiQa/3cn + Gf8pIiH/SSQd/40nFP9YIhn/fiYW/6YqFP9dJRv/WSQa/5goFf+JKBb/gCYW/zUiHv8kIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yMjI/8iIiL/HBwc/wcH + B/8GBgb/SkpK/5ycnP+9vb3/xcXF/8fHx//Jycn/ysrK/8zMzP/Nzc3/zs7O/9DQ0P/S0tL/09PT/9XV + 1f/W1tb/19fX/9nZ2f/Z2dn/2tra/9vb2//d3d3/3d3d/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+vr6//r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//w8PAx////Af///wH///8B////Advb2+Pa2tr/2dnZ/9fX + 1//W1tb/1NTU/9PT0//CwsL/UFBQ/yQkJP8hISH/IyMj/yQkJP8kJCT/JCQk/yMjI/8jIyP/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8iISD/OSIe/3wnGP+zKhL/nycR/2YiFv9WIRf/kCUS/8UsEf93Jxn/MSEe/4Ul + FP+5KxL/gygX/0wkHf9FIx3/dicY/68qEv98JRb/KiIg/yIiIf8kIiH/QyMe/38nGP+NKRb/XCYb/1wk + Gv+dKRT/SyUe/ykjIv98KBn/licU/z0iHv8tIiD/JSIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yMjI/8jIyP/JCQk/yEhIf8JCQn/CQkJ/0hISP+YmJj/wMDA/8fHx//IyMj/ycnJ/8vL + y//MzMz/zs7O/8/Pz//R0dH/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8DH///8B////Af///wH///8B3d3d49zc3P/a2tr/2dnZ/9fX1//W1tb/1NTU/8DAwP9GRkb/IiIi/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/JyEg/04j + HP+QKBX/tioR/70rEP+3KxL/gygX/zsiHv9tJRj/viwR/3AmGf8rISD/ISEh/yEhIf8nISD/dicY/7Eq + Ev88Ih7/IiIi/yIiIv8iIiL/JiIh/ykiIf82Ih7/likV/10mHP8kIiL/OCIe/5UpFv9pJxv/RCMe/3Ym + F/8xIyD/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yMjI/8jIyP/CgoK/wQE + BP9AQED/kpKS/7u7u//IyMj/ycnJ/8vLy//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//U1NT/1tbW/9fX + 1//Y2Nj/2tra/9vb2//c3Nz/3Nzc/97e3v/e3t7/39/f/+Dg4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDwMf///wH///8B////Af///wHe3t7j3d3d/9zc + 3P/a2tr/2dnZ/9fX1//W1tb/y8vL/2hoaP8sLCz/IyMj/yMjI/8kJCT/JCQk/yMjI/8jIyP/IyMj/yMj + I/8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEg/ywhH/9BIx3/TyQc/0AjHv8pISD/NCIe/6Iq + FP+cKRX/KyEf/yEhIf8hISH/ISEh/yQhIP9sJRj/vSsR/0sjHf8hISH/MCEf/0QiHP8oISD/IiIi/yci + If9CJB7/JyIh/zciH/+IJxX/cica/0YkHf+RKBX/YiYc/zoiHv9kJBn/RyMd/yUiIv8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/MTEx/x8fH/8NDQ3/Pz8//5WVlf+5ubn/ycnJ/8vLy//MzMz/zc3N/8/P + z//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg + 4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6enp/+np + 6f/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8P/x8fEx////Af///wH///8B////Ad/f3+Pe3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/xMTE/4yM + jP89PT3/JiYm/yMjI/8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yEhIf8hISH/ISEh/yEhIf8zIh//oioU/5AoFf8jICD/ISEh/yEhIf8gICD/OiEc/6Ao + Ev+rKhP/MiIf/ysgHv+EJhX/rikR/0QjHf8iIiL/IiIi/yIiIv8iIiL/TiMc/24nGv9CIx7/kikW/3co + Gf89Ix7/hicX/4EpGf9iJhv/KiMi/yMjI/8jIyP/IyMj/yMjI/8iIiL/JCQk/zg4OP9SUlL/XV1d/2Ji + Yv+ZmZn/xMTE/8zMzP/MzMz/zs7O/8/Pz//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/b29v/3Nzc/93d3f/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8TH///8B////Af///wH///8B4ODg49/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/0tLS/6qqqv9kZGT/Kysr/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/yYh + IP9zJxn/sCoS/1QhGP8oIB7/IyAf/zcgG/+MJRP/visR/2YlGf8oIB//aSMX/78rEf+CKBj/LCIg/yIi + Iv8iIiH/IyIh/yIhIf8oIiH/NyIe/4AmFv99KBj/PSId/4EnFv95KBn/LSMi/yYjIv8jIyL/IyMj/yMj + I/8jIyP/IiIi/yIiIv8lJSX/OTk5/1NTU/9nZ2f/hYWF/7m5uf/Nzc3/zs7O/8/Pz//Q0ND/0dHR/9LS + 0v/T09P/1NTU/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx + 8f/x8fH/8fHxMf///wH///8B////Af///wHh4eHj4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9TU1P+goKD/XFxc/y8vL/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/ykhIP9yJhj/qikS/54mEf+WJRH/rSgR/6sq + E/9kJRr/LyEe/3EkFv+/KxD/gygX/zAiH/8hISH/IiEh/zIiH/97JRX/VCMa/ysiIP9zJRf/eygZ/1Ek + HP+fKBP/likV/zMjIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JCQk/xEREf8HBwf/PT09/4GB + gf+0tLT/zs7O/8/Pz//R0dH/0tLS/9LS0v/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/x8fEx////Af///wH///8B////AeLi + 4uPh4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/ExMT/ioqK/0FB + Qf8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yghIP9FIx3/aCUZ/3UmGP9lJRn/QiMd/ychH/9YIhj/vSsR/5YpFf8wIh//ISEh/yEh + If8tIR//eSUW/7wsEf9lJhv/JyIh/0QkHv81IyD/YCUa/4spF/9UJR3/KyMh/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IiIi/yQkJP8XFxf/AgIC/xwcHP95eXn/sbGx/87Ozv/Q0ND/0tLS/9PT0//U1NT/1NTU/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/29vb/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx + 8f/y8vL/8vLy//Ly8jH///8B////Af///wH///8B4+Pj4+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/29vb/9ra2v/Z2dn/2NjY/9fX1//T09P/urq6/3t7e/81NTX/JSUl/yIiIv8jIyP/IyMj/yMj + I/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIP8iISD/JCEg/yIh + IP8lICD/WCIZ/7QqEf+sKxP/PiMe/yEhIP8hISH/KyAf/3klFv+7KxH/byca/yoiIf8iIiL/IyIi/y8i + IP9CIx3/MSMh/yQjIv8jIyL/IyMj/yMjI/8jIyP/IiIi/yMjI/8mJib/GBgY/wUFBf8eHh7/d3d3/7W1 + tf/Ozs7/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/19fX/9nZ2f/Z2dn/29vb/9zc3P/c3Nz/3t7e/97e + 3v/g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/PzMf///wH///8B////Af// + /wHk5OTj5OTk/+Li4v/i4uL/4ODg/+Dg4P/e3t7/3t7e/93d3f/c3Nz/29vb/9ra2v/a2tr/2dnZ/9jY + 2P/X19f/09PT/6SkpP9gYGD/Kioq/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/zIhHv+TKBT/qCoT/6EpFP82IR3/ISAg/yYg + H/9nIxf/uysR/4MoF/8uIiD/IiIi/yIiIv8xIiD/iSgW/48oFf81IyD/IyMj/yMjI/8jIyP/IyMj/yMj + I/8iIiL/KSkp/x8fH/8FBQX/FRUV/2lpaf+urq7/0NDQ/9TU1P/V1dX/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/Z2dn/29vb/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Pz8//z8/Mx////Af///wH///8B////AeXl5ePl5eX/5OTk/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/97e3v/c3Nz/3Nzc/9vb2//a2tr/2tra/9nZ2f/Y2Nj/1tbW/8nJyf+MjIz/RUVF/yYm + Jv8iIiL/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEh + If8hISH/JCEg/z0iHv9HIx3/pyoT/4gmE/9QIRj/dCQW/7orEf+OKRf/NCMf/yIiIv8iIiL/MCIf/4Em + Fv/ALRL/cCga/yojIv8jIyP/IyMj/yMjI/8jIyP/IiIi/yQkJP8eHh7/BQUF/wwMDP9hYWH/qamp/83N + zf/V1dX/1tbW/9fX1//X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8zH///8B////Af// + /wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/9/f3//e3t7/3d3d/9zc + 3P/c3Nz/29vb/9ra2v/Z2dn/2dnZ/9fX1/+8vLz/fHx8/zg4OP8kJCT/IiIi/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEh/yMhIP9TJBz/nSkV/7gr + Ef+2KxL/uiwS/08kHP8iIiL/IiIi/yoiIP+AJhX/vywS/3YoGv8pIyL/IyMj/yMjI/8jIyP/IyMj/yIi + Iv8qKir/JSUl/wkJCf8RERH/Xl5e/6enp//Pz8//19fX/9jY2P/Y2Nj/2dnZ/9ra2v/a2tr/3Nzc/9zc + 3P/d3d3/3t7e/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5+fn/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/PzMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5OTk/+Pj + 4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/29vb/9vb2//a2tr/2dnZ/9nZ + 2f/R0dH/pKSk/19fX/9LS0v/YmJi/2FhYf9PT0//LS0t/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8hISH/ISEh/yMhIP82Ix//TiQd/0okHf+iKhT/YCQZ/yQhIf8oISD/aCQY/8As + Ef+BKRn/MCMh/yMjI/8jIyP/IyMj/yMjI/8iIiL/Kysr/0xMTP9MTEz/QkJC/2RkZP+ysrL/zs7O/9jY + 2P/Z2dn/2dnZ/9ra2v/b29v/3Nzc/9zc3P/e3t7/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/z8/Mx////Af// + /wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg + 4P/g4OD/39/f/97e3v/e3t7/3d3d/9zc3P/c3Nz/29vb/9ra2v/a2tr/1tbW/9TU1P/Y2Nj/19fX/9TU + 1P+1tbX/ZWVl/ysrK/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEh + If8iIiH/IiIh/2YnG/+zKxL/nCgT/6MoEv/BLBH/gSkZ/zAkIf8jIyL/IyMj/yMjI/8jIyP/IiIi/ycn + J/84ODj/VFRU/2JiYv92dnb/q6ur/9fX1//a2tr/2tra/9vb2//c3Nz/3d3d/93d3f/e3t7/39/f/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Pz + 8//z8/P/8/Pz//Pz8//09PT/9PT0//Pz8zH///8B////Af///wH///8B6enp4+np6f/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d + 3f/d3d3/3Nzc/9vb2//b29v/29vb/9ra2v/a2tr/2dnZ/9nZ2f/Dw8P/YmJi/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/KiIh/10mHP+UKhb/nSsW/28o + G/8uIyH/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/ISEh/xQUFP8uLi7/Z2dn/4+Pj//Ozs7/29vb/9zc + 3P/c3Nz/3d3d/97e3v/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm + 5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx + 8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0Mf// + /wH///8B////Af///wHq6urj6urq/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/97e3v/e3t7/3d3d/93d3f/d3d3/3Nzc/9zc + 3P/b29v/29vb/9ra2v+mpqb/Kioq/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/JCMi/ysjIv8sIyH/JiMi/yMjIv8jIyP/IyMj/yMjI/8iIiL/IiIi/x0d + Hf8ICAj/BQUF/zs7O/+Wlpb/x8fH/9zc3P/d3d3/3t7e/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6urq/+rq + 6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//X19f/19fUx////Af///wH///8B////Aevr6+Pr6+v/6urq/+rq + 6v/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh + 4f/h4eH/4ODg/+Dg4P/f39//3t7e/97e3v/e3t7/3d3d/93d3f/c3Nz/3Nzc/8HBwf83Nzf/IiIi/yIi + Iv8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yIiIv8hISH/DQ0N/wMDA/80NDT/kJCQ/8nJyf/d3d3/39/f/9/f + 3//g4OD/4ODg/+Hh4f/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5eXl/+bm5v/n5+f/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X1 + 9TH///8B////Af///wH///8B7Ozs4+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Xl5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/9/f + 3//f39//3t7e/97e3v/d3d3/19fX/4uLi/89PT3/JCQk/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JSUl/w4O + Dv8CAgL/IyMj/4KCgv/FxcX/39/f/+Dg4P/g4OD/4eHh/+Hh4f/i4uL/4uLi/+Pj4//j4+P/5OTk/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr + 6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1Mf///wH///8B////Af///wHt7e3j7Ozs/+zs + 7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Xl + 5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Hh4f/g4OD/4ODg/9/f3//f39//3d3d/76+ + vv9ycnL/ODg4/yQkJP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yMjI/8RERH/AgIC/yYmJv+IiIj/xcXF/9/f3//i4uL/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+np + 6f/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vYx////Af///wH///8B////Ae3t7ePt7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Li + 4v/i4uL/4uLi/+Hh4f/h4eH/4eHh/+Dg4P/g4OD/4ODg/9TU1P+np6f/XFxc/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8nJyf/FBQU/wIC + Av8cHBz/dnZ2/8TExP/f39//4uLi/+Pj4//j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6enp/+np6f/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b29jH///8B////Af///wH///8B7u7u4+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo + 6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//i4uL/4uLi/+Li + 4v/i4uL/4eHh/+Hh4f/X19f/l5eX/05OTv8oKCj/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/Tk5O/5iYmP9zc3P/UVFR/5OTk//Gxsb/4uLi/+Tk5P/k5OT/5eXl/+Xl + 5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2Mf///wH///8B////Af///wHu7u7j7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/r6+v/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5eXl/+Tk5P/k5OT/5OTk/+Pj4//j4+P/4+Pj/+Pj4//i4uL/4uLi/+Pj4//g4OD/xMTE/3d3 + d/82Njb/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IiIi/0RERP+urq7/4uLi/+Li + 4v/a2tr/4ODg/+Tk5P/l5eX/5eXl/+Xl5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u + 7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 + 9P/09PT/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vYx////Af///wH///8B////Ae/v + 7+Pu7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq + 6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk + 5P/k5OT/5OTk/+Pj4//j4+P/5OTk/+Tk5P/k5OT/29vb/7i4uP9ra2v/LS0t/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IiIi/yMjI/84ODj/ra2t/+Li4v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm5v/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b2 + 9v/29vb/9vb2//b29jH///8B////Af///wH///8B8PDw4+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6enp/+jo + 6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm + 5v/m5ub/5ubm/9jY2P+dnZ3/V1dX/yYmJv8iIiL/IyMj/yMjI/8iIiL/PDw8/6CgoP/l5eX/5+fn/+fn + 5//n5+f/5+fn/+fn5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2Mf///wH///8B////Af// + /wHw8PDj8PDw//Dw8P/v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+np6f/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn + 5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+fn5//n5+f/5+fn/+Tk5P/MzMz/eHh4/zY2 + Nv8kJCT/IiIi/y0tLf+ampr/4ODg/+fn5//o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6enp/+np + 6f/p6en/6enp/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b2 + 9v/29vb/9vb2//f39//29vYx////Af///wH///8B////AfHx8ePx8fH/8PDw//Dw8P/w8PD/7+/v/+/v + 7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr + 6//q6ur/6urq/+rq6v/p6en/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo + 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/k5OT/xcXF/3R0dP9MTEz/kZGR/+bm5v/p6en/6enp/+np + 6f/p6en/6enp/+np6f/q6ur/6urq/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X1 + 9f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//b29jH///8B////Af// + /wH///8B8fHx4/Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u + 7v/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+np + 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np + 6f/p6en/3d3d/83Nzf/h4eH/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/39/f/9/f3//f39//39/f/9vb2Mf///wH///8B////Af///wHy8vLj8fHx//Hx8f/x8fH/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+rq + 6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//f39//39/cx////Af// + /wH///8B////AfLy8uPy8vL/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw/+/v + 7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX1//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f3 + 9//39/f/9/f3//f39//39/f/9/f3//j4+DH///8B////Af///wH///8B8/Pz4/Pz8//y8vL/8vLy//Ly + 8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7+/v/+/v + 7//u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T0 + 9P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//f39//39/f/9/f3//f39//4+Pj/+Pj4Mf// + /wH///8B////Af///wHz8/Pj8/Pz//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/9/f3//f3 + 9//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pgx////Af///wH///8B////AfT09OP09PT/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4 + +DH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ROMVault2/frmMain.Designer.cs b/ROMVault2/frmMain.Designer.cs new file mode 100644 index 0000000..2bbf160 --- /dev/null +++ b/ROMVault2/frmMain.Designer.cs @@ -0,0 +1,1104 @@ +namespace ROMVault2 +{ + partial class FrmMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain)); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.btnReport = new System.Windows.Forms.Button(); + this.btnFixFiles = new System.Windows.Forms.Button(); + this.btnFindFixes = new System.Windows.Forms.Button(); + this.btnScanRoms = new System.Windows.Forms.Button(); + this.btnUpdateDats = new System.Windows.Forms.Button(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.splitContainer3 = new System.Windows.Forms.SplitContainer(); + this.gbDatInfo = new System.Windows.Forms.GroupBox(); + this.lblDIRomsUnknown = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.lblDITRomsUnknown = new System.Windows.Forms.Label(); + this.lblDITRomsFixable = new System.Windows.Forms.Label(); + this.lblDITRomsMissing = new System.Windows.Forms.Label(); + this.lblDITRomsGot = new System.Windows.Forms.Label(); + this.lblDITRomPath = new System.Windows.Forms.Label(); + this.lblDITPath = new System.Windows.Forms.Label(); + this.lblDIDate = new System.Windows.Forms.Label(); + this.lblDIAuthor = new System.Windows.Forms.Label(); + this.lblDITDate = new System.Windows.Forms.Label(); + this.lblDITAuthor = new System.Windows.Forms.Label(); + this.lblDIVersion = new System.Windows.Forms.Label(); + this.lblDICategory = new System.Windows.Forms.Label(); + this.lblDITVersion = new System.Windows.Forms.Label(); + this.lblDITCategory = new System.Windows.Forms.Label(); + this.lblDIDescription = new System.Windows.Forms.Label(); + this.lblDIName = new System.Windows.Forms.Label(); + this.lblDITDescription = new System.Windows.Forms.Label(); + this.lblDITName = new System.Windows.Forms.Label(); + this.lblDIRomsFixable = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.DirTree = new ROMVault2.RvTree(); + this.splitContainer4 = new System.Windows.Forms.SplitContainer(); + this.btnColorKey = new System.Windows.Forms.Button(); + this.chkBoxShowMerged = new System.Windows.Forms.CheckBox(); + this.chkBoxShowFixed = new System.Windows.Forms.CheckBox(); + this.chkBoxShowMissing = new System.Windows.Forms.CheckBox(); + this.chkBoxShowCorrect = new System.Windows.Forms.CheckBox(); + this.gbSetInfo = new System.Windows.Forms.GroupBox(); + this.splitContainer5 = new System.Windows.Forms.SplitContainer(); + this.GameGrid = new System.Windows.Forms.DataGridView(); + this.Type = new System.Windows.Forms.DataGridViewImageColumn(); + this.CGame = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CDescription = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CCorrect = new System.Windows.Forms.DataGridViewImageColumn(); + this.RomGrid = new System.Windows.Forms.DataGridView(); + this.CGot = new System.Windows.Forms.DataGridViewImageColumn(); + this.CRom = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CSize = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CMerge = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CCRC32 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CSHA1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CMD5 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CStatus = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ZipIndex = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ZipHeader = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.tsmUpdateDATs = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmScanROMs = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmScanLevel1 = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmScanLevel2 = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmScanLevel3 = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmFindFixes = new System.Windows.Forms.ToolStripMenuItem(); + this.FixROMsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reportsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fixDatReportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fullReportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fixReportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutRomVaultToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.checkForUpdateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.registratioToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dataGridViewImageColumn1 = new System.Windows.Forms.DataGridViewImageColumn(); + this.dataGridViewImageColumn2 = new System.Windows.Forms.DataGridViewImageColumn(); + this.dataGridViewImageColumn3 = new System.Windows.Forms.DataGridViewImageColumn(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + this.splitContainer3.Panel1.SuspendLayout(); + this.splitContainer3.Panel2.SuspendLayout(); + this.splitContainer3.SuspendLayout(); + this.gbDatInfo.SuspendLayout(); + this.splitContainer4.Panel1.SuspendLayout(); + this.splitContainer4.Panel2.SuspendLayout(); + this.splitContainer4.SuspendLayout(); + this.splitContainer5.Panel1.SuspendLayout(); + this.splitContainer5.Panel2.SuspendLayout(); + this.splitContainer5.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.GameGrid)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.RomGrid)).BeginInit(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.IsSplitterFixed = true; + this.splitContainer1.Location = new System.Drawing.Point(0, 24); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.BackColor = System.Drawing.Color.White; + this.splitContainer1.Panel1.Controls.Add(this.btnReport); + this.splitContainer1.Panel1.Controls.Add(this.btnFixFiles); + this.splitContainer1.Panel1.Controls.Add(this.btnFindFixes); + this.splitContainer1.Panel1.Controls.Add(this.btnScanRoms); + this.splitContainer1.Panel1.Controls.Add(this.btnUpdateDats); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); + this.splitContainer1.Size = new System.Drawing.Size(1264, 738); + this.splitContainer1.SplitterDistance = 80; + this.splitContainer1.TabIndex = 5; + // + // btnReport + // + this.btnReport.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnReport.BackgroundImage"))); + this.btnReport.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btnReport.Location = new System.Drawing.Point(0, 320); + this.btnReport.Name = "btnReport"; + this.btnReport.Size = new System.Drawing.Size(80, 80); + this.btnReport.TabIndex = 13; + this.btnReport.Text = "Generate Reports"; + this.btnReport.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + this.btnReport.UseVisualStyleBackColor = true; + this.btnReport.Click += new System.EventHandler(this.BtnReportClick); + // + // btnFixFiles + // + this.btnFixFiles.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnFixFiles.BackgroundImage"))); + this.btnFixFiles.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btnFixFiles.Location = new System.Drawing.Point(0, 240); + this.btnFixFiles.Name = "btnFixFiles"; + this.btnFixFiles.Size = new System.Drawing.Size(80, 80); + this.btnFixFiles.TabIndex = 10; + this.btnFixFiles.Text = "Fix ROMs"; + this.btnFixFiles.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + this.btnFixFiles.UseVisualStyleBackColor = true; + this.btnFixFiles.Click += new System.EventHandler(this.BtnFixFilesClick); + // + // btnFindFixes + // + this.btnFindFixes.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnFindFixes.BackgroundImage"))); + this.btnFindFixes.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btnFindFixes.Location = new System.Drawing.Point(0, 160); + this.btnFindFixes.Name = "btnFindFixes"; + this.btnFindFixes.Size = new System.Drawing.Size(80, 80); + this.btnFindFixes.TabIndex = 9; + this.btnFindFixes.Text = "Find Fixes"; + this.btnFindFixes.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + this.btnFindFixes.UseVisualStyleBackColor = true; + this.btnFindFixes.Click += new System.EventHandler(this.BtnFindFixesClick); + // + // btnScanRoms + // + this.btnScanRoms.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnScanRoms.BackgroundImage"))); + this.btnScanRoms.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btnScanRoms.Location = new System.Drawing.Point(0, 80); + this.btnScanRoms.Name = "btnScanRoms"; + this.btnScanRoms.Size = new System.Drawing.Size(80, 80); + this.btnScanRoms.TabIndex = 8; + this.btnScanRoms.Text = "Scan ROMs"; + this.btnScanRoms.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + this.btnScanRoms.UseVisualStyleBackColor = true; + this.btnScanRoms.Click += new System.EventHandler(this.BtnScanRomsClick); + // + // btnUpdateDats + // + this.btnUpdateDats.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btnUpdateDats.BackgroundImage"))); + this.btnUpdateDats.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btnUpdateDats.Location = new System.Drawing.Point(0, 0); + this.btnUpdateDats.Name = "btnUpdateDats"; + this.btnUpdateDats.Size = new System.Drawing.Size(80, 80); + this.btnUpdateDats.TabIndex = 0; + this.btnUpdateDats.Text = "Update DATs"; + this.btnUpdateDats.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + this.btnUpdateDats.UseVisualStyleBackColor = true; + this.btnUpdateDats.Click += new System.EventHandler(this.BtnUpdateDatsClick); + // + // splitContainer2 + // + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.splitContainer3); + this.splitContainer2.Panel1MinSize = 450; + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.splitContainer4); + this.splitContainer2.Size = new System.Drawing.Size(1180, 738); + this.splitContainer2.SplitterDistance = 479; + this.splitContainer2.TabIndex = 0; + // + // splitContainer3 + // + this.splitContainer3.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer3.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer3.IsSplitterFixed = true; + this.splitContainer3.Location = new System.Drawing.Point(0, 0); + this.splitContainer3.Name = "splitContainer3"; + this.splitContainer3.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer3.Panel1 + // + this.splitContainer3.Panel1.Controls.Add(this.gbDatInfo); + this.splitContainer3.Panel1.Resize += new System.EventHandler(this.splitContainer3_Panel1_Resize); + // + // splitContainer3.Panel2 + // + this.splitContainer3.Panel2.Controls.Add(this.DirTree); + this.splitContainer3.Size = new System.Drawing.Size(479, 738); + this.splitContainer3.SplitterDistance = 148; + this.splitContainer3.TabIndex = 0; + // + // gbDatInfo + // + this.gbDatInfo.Controls.Add(this.lblDIRomsUnknown); + this.gbDatInfo.Controls.Add(this.label9); + this.gbDatInfo.Controls.Add(this.lblDITRomsUnknown); + this.gbDatInfo.Controls.Add(this.lblDITRomsFixable); + this.gbDatInfo.Controls.Add(this.lblDITRomsMissing); + this.gbDatInfo.Controls.Add(this.lblDITRomsGot); + this.gbDatInfo.Controls.Add(this.lblDITRomPath); + this.gbDatInfo.Controls.Add(this.lblDITPath); + this.gbDatInfo.Controls.Add(this.lblDIDate); + this.gbDatInfo.Controls.Add(this.lblDIAuthor); + this.gbDatInfo.Controls.Add(this.lblDITDate); + this.gbDatInfo.Controls.Add(this.lblDITAuthor); + this.gbDatInfo.Controls.Add(this.lblDIVersion); + this.gbDatInfo.Controls.Add(this.lblDICategory); + this.gbDatInfo.Controls.Add(this.lblDITVersion); + this.gbDatInfo.Controls.Add(this.lblDITCategory); + this.gbDatInfo.Controls.Add(this.lblDIDescription); + this.gbDatInfo.Controls.Add(this.lblDIName); + this.gbDatInfo.Controls.Add(this.lblDITDescription); + this.gbDatInfo.Controls.Add(this.lblDITName); + this.gbDatInfo.Controls.Add(this.lblDIRomsFixable); + this.gbDatInfo.Controls.Add(this.label8); + this.gbDatInfo.Location = new System.Drawing.Point(5, 0); + this.gbDatInfo.Name = "gbDatInfo"; + this.gbDatInfo.Size = new System.Drawing.Size(440, 147); + this.gbDatInfo.TabIndex = 3; + this.gbDatInfo.TabStop = false; + this.gbDatInfo.Text = "Dat Info :"; + this.gbDatInfo.Resize += new System.EventHandler(this.gbDatInfo_Resize); + // + // lblDIRomsUnknown + // + this.lblDIRomsUnknown.Location = new System.Drawing.Point(214, 121); + this.lblDIRomsUnknown.Name = "lblDIRomsUnknown"; + this.lblDIRomsUnknown.Size = new System.Drawing.Size(92, 13); + this.lblDIRomsUnknown.TabIndex = 26; + this.lblDIRomsUnknown.Text = "ROMs Unknown :"; + this.lblDIRomsUnknown.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // label9 + // + this.label9.Location = new System.Drawing.Point(10, 105); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(75, 13); + this.label9.TabIndex = 23; + this.label9.Text = "ROMs Got :"; + this.label9.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lblDITRomsUnknown + // + this.lblDITRomsUnknown.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITRomsUnknown.Location = new System.Drawing.Point(311, 120); + this.lblDITRomsUnknown.Name = "lblDITRomsUnknown"; + this.lblDITRomsUnknown.Size = new System.Drawing.Size(120, 17); + this.lblDITRomsUnknown.TabIndex = 21; + // + // lblDITRomsFixable + // + this.lblDITRomsFixable.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITRomsFixable.Location = new System.Drawing.Point(311, 104); + this.lblDITRomsFixable.Name = "lblDITRomsFixable"; + this.lblDITRomsFixable.Size = new System.Drawing.Size(120, 17); + this.lblDITRomsFixable.TabIndex = 20; + // + // lblDITRomsMissing + // + this.lblDITRomsMissing.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITRomsMissing.Location = new System.Drawing.Point(89, 120); + this.lblDITRomsMissing.Name = "lblDITRomsMissing"; + this.lblDITRomsMissing.Size = new System.Drawing.Size(120, 17); + this.lblDITRomsMissing.TabIndex = 19; + // + // lblDITRomsGot + // + this.lblDITRomsGot.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITRomsGot.Location = new System.Drawing.Point(89, 104); + this.lblDITRomsGot.Name = "lblDITRomsGot"; + this.lblDITRomsGot.Size = new System.Drawing.Size(120, 17); + this.lblDITRomsGot.TabIndex = 18; + // + // lblDITRomPath + // + this.lblDITRomPath.Location = new System.Drawing.Point(10, 79); + this.lblDITRomPath.Name = "lblDITRomPath"; + this.lblDITRomPath.Size = new System.Drawing.Size(75, 13); + this.lblDITRomPath.TabIndex = 15; + this.lblDITRomPath.Text = "ROM Path:"; + this.lblDITRomPath.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lblDITPath + // + this.lblDITPath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITPath.Location = new System.Drawing.Point(89, 78); + this.lblDITPath.Name = "lblDITPath"; + this.lblDITPath.Size = new System.Drawing.Size(342, 17); + this.lblDITPath.TabIndex = 13; + // + // lblDIDate + // + this.lblDIDate.Location = new System.Drawing.Point(214, 63); + this.lblDIDate.Name = "lblDIDate"; + this.lblDIDate.Size = new System.Drawing.Size(92, 13); + this.lblDIDate.TabIndex = 12; + this.lblDIDate.Text = "Date :"; + this.lblDIDate.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lblDIAuthor + // + this.lblDIAuthor.Location = new System.Drawing.Point(10, 63); + this.lblDIAuthor.Name = "lblDIAuthor"; + this.lblDIAuthor.Size = new System.Drawing.Size(75, 13); + this.lblDIAuthor.TabIndex = 11; + this.lblDIAuthor.Text = "Author :"; + this.lblDIAuthor.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lblDITDate + // + this.lblDITDate.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITDate.Location = new System.Drawing.Point(311, 62); + this.lblDITDate.Name = "lblDITDate"; + this.lblDITDate.Size = new System.Drawing.Size(120, 17); + this.lblDITDate.TabIndex = 10; + // + // lblDITAuthor + // + this.lblDITAuthor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITAuthor.Location = new System.Drawing.Point(89, 62); + this.lblDITAuthor.Name = "lblDITAuthor"; + this.lblDITAuthor.Size = new System.Drawing.Size(120, 17); + this.lblDITAuthor.TabIndex = 9; + // + // lblDIVersion + // + this.lblDIVersion.Location = new System.Drawing.Point(214, 47); + this.lblDIVersion.Name = "lblDIVersion"; + this.lblDIVersion.Size = new System.Drawing.Size(92, 13); + this.lblDIVersion.TabIndex = 8; + this.lblDIVersion.Text = "Version :"; + this.lblDIVersion.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lblDICategory + // + this.lblDICategory.Location = new System.Drawing.Point(10, 47); + this.lblDICategory.Name = "lblDICategory"; + this.lblDICategory.Size = new System.Drawing.Size(75, 13); + this.lblDICategory.TabIndex = 7; + this.lblDICategory.Text = "Category :"; + this.lblDICategory.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lblDITVersion + // + this.lblDITVersion.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITVersion.Location = new System.Drawing.Point(311, 46); + this.lblDITVersion.Name = "lblDITVersion"; + this.lblDITVersion.Size = new System.Drawing.Size(120, 17); + this.lblDITVersion.TabIndex = 6; + // + // lblDITCategory + // + this.lblDITCategory.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITCategory.Location = new System.Drawing.Point(89, 46); + this.lblDITCategory.Name = "lblDITCategory"; + this.lblDITCategory.Size = new System.Drawing.Size(120, 17); + this.lblDITCategory.TabIndex = 5; + // + // lblDIDescription + // + this.lblDIDescription.Location = new System.Drawing.Point(10, 31); + this.lblDIDescription.Name = "lblDIDescription"; + this.lblDIDescription.Size = new System.Drawing.Size(75, 13); + this.lblDIDescription.TabIndex = 4; + this.lblDIDescription.Text = "Description :"; + this.lblDIDescription.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lblDIName + // + this.lblDIName.Location = new System.Drawing.Point(10, 15); + this.lblDIName.Name = "lblDIName"; + this.lblDIName.Size = new System.Drawing.Size(75, 13); + this.lblDIName.TabIndex = 3; + this.lblDIName.Text = "Name :"; + this.lblDIName.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lblDITDescription + // + this.lblDITDescription.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITDescription.Location = new System.Drawing.Point(89, 30); + this.lblDITDescription.Name = "lblDITDescription"; + this.lblDITDescription.Size = new System.Drawing.Size(342, 17); + this.lblDITDescription.TabIndex = 2; + // + // lblDITName + // + this.lblDITName.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDITName.Location = new System.Drawing.Point(89, 14); + this.lblDITName.Name = "lblDITName"; + this.lblDITName.Size = new System.Drawing.Size(342, 17); + this.lblDITName.TabIndex = 1; + // + // lblDIRomsFixable + // + this.lblDIRomsFixable.Location = new System.Drawing.Point(214, 105); + this.lblDIRomsFixable.Name = "lblDIRomsFixable"; + this.lblDIRomsFixable.Size = new System.Drawing.Size(92, 13); + this.lblDIRomsFixable.TabIndex = 25; + this.lblDIRomsFixable.Text = "ROMs Fixable :"; + this.lblDIRomsFixable.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // label8 + // + this.label8.Location = new System.Drawing.Point(2, 121); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(83, 13); + this.label8.TabIndex = 24; + this.label8.Text = "ROMs Missing :"; + this.label8.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // DirTree + // + this.DirTree.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.DirTree.Dock = System.Windows.Forms.DockStyle.Fill; + this.DirTree.Location = new System.Drawing.Point(0, 0); + this.DirTree.Name = "DirTree"; + this.DirTree.Size = new System.Drawing.Size(479, 586); + this.DirTree.TabIndex = 2; + this.DirTree.RvSelected += new System.Windows.Forms.MouseEventHandler(this.DirTreeRvSelected); + // + // splitContainer4 + // + this.splitContainer4.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer4.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer4.IsSplitterFixed = true; + this.splitContainer4.Location = new System.Drawing.Point(0, 0); + this.splitContainer4.Name = "splitContainer4"; + this.splitContainer4.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer4.Panel1 + // + this.splitContainer4.Panel1.Controls.Add(this.btnColorKey); + this.splitContainer4.Panel1.Controls.Add(this.chkBoxShowMerged); + this.splitContainer4.Panel1.Controls.Add(this.chkBoxShowFixed); + this.splitContainer4.Panel1.Controls.Add(this.chkBoxShowMissing); + this.splitContainer4.Panel1.Controls.Add(this.chkBoxShowCorrect); + this.splitContainer4.Panel1.Controls.Add(this.gbSetInfo); + this.splitContainer4.Panel1.Resize += new System.EventHandler(this.splitContainer4_Panel1_Resize); + // + // splitContainer4.Panel2 + // + this.splitContainer4.Panel2.Controls.Add(this.splitContainer5); + this.splitContainer4.Size = new System.Drawing.Size(697, 738); + this.splitContainer4.SplitterDistance = 148; + this.splitContainer4.TabIndex = 0; + // + // btnColorKey + // + this.btnColorKey.Location = new System.Drawing.Point(568, 85); + this.btnColorKey.Name = "btnColorKey"; + this.btnColorKey.Size = new System.Drawing.Size(89, 23); + this.btnColorKey.TabIndex = 9; + this.btnColorKey.Text = "Color Key"; + this.btnColorKey.UseVisualStyleBackColor = true; + this.btnColorKey.Click += new System.EventHandler(this.BtnColorKeyClick); + // + // chkBoxShowMerged + // + this.chkBoxShowMerged.AutoSize = true; + this.chkBoxShowMerged.Location = new System.Drawing.Point(568, 68); + this.chkBoxShowMerged.Name = "chkBoxShowMerged"; + this.chkBoxShowMerged.Size = new System.Drawing.Size(125, 17); + this.chkBoxShowMerged.TabIndex = 8; + this.chkBoxShowMerged.Text = "Show Merged ROMs"; + this.chkBoxShowMerged.UseVisualStyleBackColor = true; + this.chkBoxShowMerged.CheckedChanged += new System.EventHandler(this.ChkBoxShowMergedCheckedChanged); + // + // chkBoxShowFixed + // + this.chkBoxShowFixed.AutoSize = true; + this.chkBoxShowFixed.Checked = true; + this.chkBoxShowFixed.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkBoxShowFixed.Location = new System.Drawing.Point(568, 52); + this.chkBoxShowFixed.Name = "chkBoxShowFixed"; + this.chkBoxShowFixed.Size = new System.Drawing.Size(102, 17); + this.chkBoxShowFixed.TabIndex = 7; + this.chkBoxShowFixed.Text = "Show Fix ROMs"; + this.chkBoxShowFixed.UseVisualStyleBackColor = true; + this.chkBoxShowFixed.CheckedChanged += new System.EventHandler(this.ChkBoxShowFixedCheckedChanged); + // + // chkBoxShowMissing + // + this.chkBoxShowMissing.AutoSize = true; + this.chkBoxShowMissing.Checked = true; + this.chkBoxShowMissing.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkBoxShowMissing.Location = new System.Drawing.Point(568, 36); + this.chkBoxShowMissing.Name = "chkBoxShowMissing"; + this.chkBoxShowMissing.Size = new System.Drawing.Size(124, 17); + this.chkBoxShowMissing.TabIndex = 6; + this.chkBoxShowMissing.Text = "Show Missing ROMs"; + this.chkBoxShowMissing.UseVisualStyleBackColor = true; + this.chkBoxShowMissing.CheckedChanged += new System.EventHandler(this.ChkBoxShowMissingCheckedChanged); + // + // chkBoxShowCorrect + // + this.chkBoxShowCorrect.AutoSize = true; + this.chkBoxShowCorrect.Checked = true; + this.chkBoxShowCorrect.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkBoxShowCorrect.Location = new System.Drawing.Point(568, 20); + this.chkBoxShowCorrect.Name = "chkBoxShowCorrect"; + this.chkBoxShowCorrect.Size = new System.Drawing.Size(123, 17); + this.chkBoxShowCorrect.TabIndex = 5; + this.chkBoxShowCorrect.Text = "Show Correct ROMs"; + this.chkBoxShowCorrect.UseVisualStyleBackColor = true; + this.chkBoxShowCorrect.CheckedChanged += new System.EventHandler(this.ChkBoxShowCorrectCheckedChanged); + // + // gbSetInfo + // + this.gbSetInfo.Location = new System.Drawing.Point(5, 0); + this.gbSetInfo.Name = "gbSetInfo"; + this.gbSetInfo.Size = new System.Drawing.Size(416, 147); + this.gbSetInfo.TabIndex = 4; + this.gbSetInfo.TabStop = false; + this.gbSetInfo.Text = "Game Info :"; + this.gbSetInfo.Resize += new System.EventHandler(this.gbSetInfo_Resize); + // + // splitContainer5 + // + this.splitContainer5.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer5.Location = new System.Drawing.Point(0, 0); + this.splitContainer5.Name = "splitContainer5"; + this.splitContainer5.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer5.Panel1 + // + this.splitContainer5.Panel1.Controls.Add(this.GameGrid); + // + // splitContainer5.Panel2 + // + this.splitContainer5.Panel2.Controls.Add(this.RomGrid); + this.splitContainer5.Size = new System.Drawing.Size(697, 586); + this.splitContainer5.SplitterDistance = 267; + this.splitContainer5.TabIndex = 0; + // + // GameGrid + // + this.GameGrid.AllowUserToAddRows = false; + this.GameGrid.AllowUserToDeleteRows = false; + this.GameGrid.AllowUserToResizeRows = false; + this.GameGrid.BackgroundColor = System.Drawing.Color.White; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.GameGrid.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + this.GameGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.GameGrid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.Type, + this.CGame, + this.CDescription, + this.CCorrect}); + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.GameGrid.DefaultCellStyle = dataGridViewCellStyle2; + this.GameGrid.Dock = System.Windows.Forms.DockStyle.Fill; + this.GameGrid.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.GameGrid.Location = new System.Drawing.Point(0, 0); + this.GameGrid.MultiSelect = false; + this.GameGrid.Name = "GameGrid"; + this.GameGrid.ReadOnly = true; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.GameGrid.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.GameGrid.RowHeadersVisible = false; + this.GameGrid.RowTemplate.Height = 17; + this.GameGrid.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.GameGrid.ShowCellErrors = false; + this.GameGrid.ShowCellToolTips = false; + this.GameGrid.ShowEditingIcon = false; + this.GameGrid.ShowRowErrors = false; + this.GameGrid.Size = new System.Drawing.Size(697, 267); + this.GameGrid.TabIndex = 4; + this.GameGrid.SelectionChanged += new System.EventHandler(this.GameGridSelectionChanged); + this.GameGrid.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.GameGridMouseDoubleClick); + this.GameGrid.MouseUp += new System.Windows.Forms.MouseEventHandler(this.GameGrid_MouseUp); + // + // Type + // + this.Type.FillWeight = 40F; + this.Type.HeaderText = "Type"; + this.Type.Name = "Type"; + this.Type.ReadOnly = true; + this.Type.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.Type.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.Type.Width = 40; + // + // CGame + // + this.CGame.HeaderText = "Game (Directory / Zip)"; + this.CGame.Name = "CGame"; + this.CGame.ReadOnly = true; + this.CGame.Width = 220; + // + // CDescription + // + this.CDescription.HeaderText = "Description"; + this.CDescription.Name = "CDescription"; + this.CDescription.ReadOnly = true; + this.CDescription.Width = 220; + // + // CCorrect + // + this.CCorrect.HeaderText = "ROM Status"; + this.CCorrect.Name = "CCorrect"; + this.CCorrect.ReadOnly = true; + this.CCorrect.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.CCorrect.Width = 500; + // + // RomGrid + // + this.RomGrid.AllowUserToAddRows = false; + this.RomGrid.AllowUserToDeleteRows = false; + this.RomGrid.AllowUserToResizeRows = false; + this.RomGrid.BackgroundColor = System.Drawing.Color.White; + dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle4.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.RomGrid.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle4; + this.RomGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.RomGrid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.CGot, + this.CRom, + this.CSize, + this.CMerge, + this.CCRC32, + this.CSHA1, + this.CMD5, + this.CStatus, + this.ZipIndex, + this.ZipHeader}); + dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle5.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle5.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle5.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle5.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle5.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.RomGrid.DefaultCellStyle = dataGridViewCellStyle5; + this.RomGrid.Dock = System.Windows.Forms.DockStyle.Fill; + this.RomGrid.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.RomGrid.Location = new System.Drawing.Point(0, 0); + this.RomGrid.MultiSelect = false; + this.RomGrid.Name = "RomGrid"; + this.RomGrid.ReadOnly = true; + dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle6.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle6.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle6.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle6.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle6.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.RomGrid.RowHeadersDefaultCellStyle = dataGridViewCellStyle6; + this.RomGrid.RowHeadersVisible = false; + this.RomGrid.RowTemplate.Height = 19; + this.RomGrid.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.RomGrid.ShowCellErrors = false; + this.RomGrid.ShowEditingIcon = false; + this.RomGrid.ShowRowErrors = false; + this.RomGrid.Size = new System.Drawing.Size(697, 315); + this.RomGrid.TabIndex = 21; + this.RomGrid.SelectionChanged += new System.EventHandler(this.RomGridSelectionChanged); + this.RomGrid.MouseUp += new System.Windows.Forms.MouseEventHandler(this.RomGridMouseUp); + // + // CGot + // + this.CGot.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; + this.CGot.HeaderText = "Got"; + this.CGot.Name = "CGot"; + this.CGot.ReadOnly = true; + this.CGot.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.CGot.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.CGot.Width = 65; + // + // CRom + // + this.CRom.HeaderText = "ROM (File)"; + this.CRom.Name = "CRom"; + this.CRom.ReadOnly = true; + this.CRom.Width = 150; + // + // CSize + // + this.CSize.HeaderText = "Size"; + this.CSize.Name = "CSize"; + this.CSize.ReadOnly = true; + this.CSize.Width = 60; + // + // CMerge + // + this.CMerge.HeaderText = "Merge"; + this.CMerge.Name = "CMerge"; + this.CMerge.ReadOnly = true; + this.CMerge.Width = 60; + // + // CCRC32 + // + this.CCRC32.HeaderText = "CRC32"; + this.CCRC32.Name = "CCRC32"; + this.CCRC32.ReadOnly = true; + // + // CSHA1 + // + this.CSHA1.HeaderText = "SHA1"; + this.CSHA1.Name = "CSHA1"; + this.CSHA1.ReadOnly = true; + this.CSHA1.Width = 150; + // + // CMD5 + // + this.CMD5.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; + this.CMD5.HeaderText = "MD5"; + this.CMD5.Name = "CMD5"; + this.CMD5.ReadOnly = true; + this.CMD5.Width = 150; + // + // CStatus + // + this.CStatus.HeaderText = "Status"; + this.CStatus.Name = "CStatus"; + this.CStatus.ReadOnly = true; + // + // ZipIndex + // + this.ZipIndex.HeaderText = "ZipIndex"; + this.ZipIndex.Name = "ZipIndex"; + this.ZipIndex.ReadOnly = true; + // + // ZipHeader + // + this.ZipHeader.HeaderText = "ZipHeader"; + this.ZipHeader.Name = "ZipHeader"; + this.ZipHeader.ReadOnly = true; + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmUpdateDATs, + this.tsmScanROMs, + this.tsmFindFixes, + this.FixROMsToolStripMenuItem, + this.settingsToolStripMenuItem, + this.reportsToolStripMenuItem, + this.helpToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(1264, 24); + this.menuStrip1.TabIndex = 6; + this.menuStrip1.Text = "menuStrip1"; + // + // tsmUpdateDATs + // + this.tsmUpdateDATs.Name = "tsmUpdateDATs"; + this.tsmUpdateDATs.Size = new System.Drawing.Size(88, 20); + this.tsmUpdateDATs.Text = "Update DATs"; + this.tsmUpdateDATs.Click += new System.EventHandler(this.TsmUpdateDaTsClick); + // + // tsmScanROMs + // + this.tsmScanROMs.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmScanLevel1, + this.tsmScanLevel2, + this.tsmScanLevel3}); + this.tsmScanROMs.Name = "tsmScanROMs"; + this.tsmScanROMs.Size = new System.Drawing.Size(79, 20); + this.tsmScanROMs.Text = "Scan ROMs"; + // + // tsmScanLevel1 + // + this.tsmScanLevel1.Name = "tsmScanLevel1"; + this.tsmScanLevel1.Size = new System.Drawing.Size(300, 22); + this.tsmScanLevel1.Text = "Level 1: Scan ROMs"; + this.tsmScanLevel1.Click += new System.EventHandler(this.TsmScanLevel1Click); + // + // tsmScanLevel2 + // + this.tsmScanLevel2.Name = "tsmScanLevel2"; + this.tsmScanLevel2.Size = new System.Drawing.Size(300, 22); + this.tsmScanLevel2.Text = "Level 2: ReScan New ROMs"; + this.tsmScanLevel2.Click += new System.EventHandler(this.TsmScanLevel2Click); + // + // tsmScanLevel3 + // + this.tsmScanLevel3.Name = "tsmScanLevel3"; + this.tsmScanLevel3.Size = new System.Drawing.Size(300, 22); + this.tsmScanLevel3.Text = "Level 3: ReScan All ROMs (CRC,MD5,SHA1)"; + this.tsmScanLevel3.Click += new System.EventHandler(this.TsmScanLevel3Click); + // + // tsmFindFixes + // + this.tsmFindFixes.Name = "tsmFindFixes"; + this.tsmFindFixes.Size = new System.Drawing.Size(70, 20); + this.tsmFindFixes.Text = "Find Fixes"; + this.tsmFindFixes.Click += new System.EventHandler(this.TsmFindFixesClick); + // + // FixROMsToolStripMenuItem + // + this.FixROMsToolStripMenuItem.Name = "FixROMsToolStripMenuItem"; + this.FixROMsToolStripMenuItem.Size = new System.Drawing.Size(68, 20); + this.FixROMsToolStripMenuItem.Text = "Fix ROMs"; + this.FixROMsToolStripMenuItem.Click += new System.EventHandler(this.FixFilesToolStripMenuItemClick); + // + // settingsToolStripMenuItem + // + this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; + this.settingsToolStripMenuItem.Size = new System.Drawing.Size(61, 20); + this.settingsToolStripMenuItem.Text = "Settings"; + this.settingsToolStripMenuItem.Click += new System.EventHandler(this.SettingsToolStripMenuItemClick); + // + // reportsToolStripMenuItem + // + this.reportsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fixDatReportToolStripMenuItem, + this.fullReportToolStripMenuItem, + this.fixReportToolStripMenuItem}); + this.reportsToolStripMenuItem.Name = "reportsToolStripMenuItem"; + this.reportsToolStripMenuItem.Size = new System.Drawing.Size(59, 20); + this.reportsToolStripMenuItem.Text = "Reports"; + // + // fixDatReportToolStripMenuItem + // + this.fixDatReportToolStripMenuItem.Name = "fixDatReportToolStripMenuItem"; + this.fixDatReportToolStripMenuItem.Size = new System.Drawing.Size(147, 22); + this.fixDatReportToolStripMenuItem.Text = "Fix Dat Report"; + this.fixDatReportToolStripMenuItem.Click += new System.EventHandler(this.fixDatReportToolStripMenuItem_Click); + // + // fullReportToolStripMenuItem + // + this.fullReportToolStripMenuItem.Name = "fullReportToolStripMenuItem"; + this.fullReportToolStripMenuItem.Size = new System.Drawing.Size(147, 22); + this.fullReportToolStripMenuItem.Text = "Full Report"; + this.fullReportToolStripMenuItem.Click += new System.EventHandler(this.fullReportToolStripMenuItem_Click); + // + // fixReportToolStripMenuItem + // + this.fixReportToolStripMenuItem.Name = "fixReportToolStripMenuItem"; + this.fixReportToolStripMenuItem.Size = new System.Drawing.Size(147, 22); + this.fixReportToolStripMenuItem.Text = "Fix Report"; + this.fixReportToolStripMenuItem.Click += new System.EventHandler(this.fixReportToolStripMenuItem_Click); + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.aboutRomVaultToolStripMenuItem, + this.checkForUpdateToolStripMenuItem, + this.registratioToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.helpToolStripMenuItem.Text = "Help"; + // + // aboutRomVaultToolStripMenuItem + // + this.aboutRomVaultToolStripMenuItem.Name = "aboutRomVaultToolStripMenuItem"; + this.aboutRomVaultToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.aboutRomVaultToolStripMenuItem.Text = "About RomVault"; + this.aboutRomVaultToolStripMenuItem.Click += new System.EventHandler(this.AboutRomVaultToolStripMenuItemClick); + // + // checkForUpdateToolStripMenuItem + // + this.checkForUpdateToolStripMenuItem.Name = "checkForUpdateToolStripMenuItem"; + this.checkForUpdateToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.checkForUpdateToolStripMenuItem.Text = "Check For Update"; + this.checkForUpdateToolStripMenuItem.Click += new System.EventHandler(this.checkForUpdateToolStripMenuItem_Click); + // + // registratioToolStripMenuItem + // + this.registratioToolStripMenuItem.Name = "registratioToolStripMenuItem"; + this.registratioToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.registratioToolStripMenuItem.Text = "Registration"; + this.registratioToolStripMenuItem.Click += new System.EventHandler(this.RegistratioToolStripMenuItemClick); + // + // dataGridViewImageColumn1 + // + this.dataGridViewImageColumn1.FillWeight = 40F; + this.dataGridViewImageColumn1.HeaderText = "Type"; + this.dataGridViewImageColumn1.Name = "dataGridViewImageColumn1"; + this.dataGridViewImageColumn1.ReadOnly = true; + this.dataGridViewImageColumn1.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridViewImageColumn1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.dataGridViewImageColumn1.Width = 40; + // + // dataGridViewImageColumn2 + // + this.dataGridViewImageColumn2.HeaderText = "ROM Status"; + this.dataGridViewImageColumn2.Name = "dataGridViewImageColumn2"; + this.dataGridViewImageColumn2.ReadOnly = true; + this.dataGridViewImageColumn2.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridViewImageColumn2.Width = 300; + // + // dataGridViewImageColumn3 + // + this.dataGridViewImageColumn3.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None; + this.dataGridViewImageColumn3.HeaderText = "Got"; + this.dataGridViewImageColumn3.Name = "dataGridViewImageColumn3"; + this.dataGridViewImageColumn3.ReadOnly = true; + this.dataGridViewImageColumn3.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridViewImageColumn3.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.dataGridViewImageColumn3.Width = 65; + // + // FrmMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1264, 762); + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.menuStrip1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmMain"; + this.Text = "RomVault (V2.0)"; + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + this.splitContainer2.ResumeLayout(false); + this.splitContainer3.Panel1.ResumeLayout(false); + this.splitContainer3.Panel2.ResumeLayout(false); + this.splitContainer3.ResumeLayout(false); + this.gbDatInfo.ResumeLayout(false); + this.splitContainer4.Panel1.ResumeLayout(false); + this.splitContainer4.Panel1.PerformLayout(); + this.splitContainer4.Panel2.ResumeLayout(false); + this.splitContainer4.ResumeLayout(false); + this.splitContainer5.Panel1.ResumeLayout(false); + this.splitContainer5.Panel2.ResumeLayout(false); + this.splitContainer5.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.GameGrid)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.RomGrid)).EndInit(); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Button btnReport; + private System.Windows.Forms.Button btnFixFiles; + private System.Windows.Forms.Button btnFindFixes; + private System.Windows.Forms.Button btnScanRoms; + private System.Windows.Forms.Button btnUpdateDats; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.SplitContainer splitContainer3; + private System.Windows.Forms.GroupBox gbDatInfo; + private System.Windows.Forms.Label lblDIRomsUnknown; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label lblDITRomsUnknown; + private System.Windows.Forms.Label lblDITRomsMissing; + private System.Windows.Forms.Label lblDITRomsGot; + private System.Windows.Forms.Label lblDITRomPath; + private System.Windows.Forms.Label lblDITPath; + private System.Windows.Forms.Label lblDIDate; + private System.Windows.Forms.Label lblDIAuthor; + private System.Windows.Forms.Label lblDITDate; + private System.Windows.Forms.Label lblDITAuthor; + private System.Windows.Forms.Label lblDIVersion; + private System.Windows.Forms.Label lblDICategory; + private System.Windows.Forms.Label lblDITVersion; + private System.Windows.Forms.Label lblDITCategory; + private System.Windows.Forms.Label lblDIDescription; + private System.Windows.Forms.Label lblDIName; + private System.Windows.Forms.Label lblDITDescription; + private System.Windows.Forms.Label lblDITName; + private System.Windows.Forms.SplitContainer splitContainer4; + private System.Windows.Forms.Button btnColorKey; + private System.Windows.Forms.CheckBox chkBoxShowMerged; + private System.Windows.Forms.CheckBox chkBoxShowFixed; + private System.Windows.Forms.CheckBox chkBoxShowMissing; + private System.Windows.Forms.CheckBox chkBoxShowCorrect; + private System.Windows.Forms.GroupBox gbSetInfo; + + private System.Windows.Forms.SplitContainer splitContainer5; + private System.Windows.Forms.DataGridView GameGrid; + private System.Windows.Forms.DataGridView RomGrid; + private RvTree DirTree; + private System.Windows.Forms.DataGridViewImageColumn dataGridViewImageColumn1; + private System.Windows.Forms.DataGridViewImageColumn dataGridViewImageColumn2; + private System.Windows.Forms.DataGridViewImageColumn dataGridViewImageColumn3; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem tsmUpdateDATs; + private System.Windows.Forms.ToolStripMenuItem tsmScanROMs; + private System.Windows.Forms.ToolStripMenuItem tsmScanLevel1; + private System.Windows.Forms.ToolStripMenuItem tsmScanLevel3; + private System.Windows.Forms.ToolStripMenuItem tsmFindFixes; + private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem aboutRomVaultToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem checkForUpdateToolStripMenuItem; + private System.Windows.Forms.DataGridViewImageColumn Type; + private System.Windows.Forms.DataGridViewTextBoxColumn CGame; + private System.Windows.Forms.DataGridViewTextBoxColumn CDescription; + private System.Windows.Forms.DataGridViewImageColumn CCorrect; + private System.Windows.Forms.ToolStripMenuItem FixROMsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem tsmScanLevel2; + private System.Windows.Forms.DataGridViewImageColumn CGot; + private System.Windows.Forms.DataGridViewTextBoxColumn CRom; + private System.Windows.Forms.DataGridViewTextBoxColumn CSize; + private System.Windows.Forms.DataGridViewTextBoxColumn CMerge; + private System.Windows.Forms.DataGridViewTextBoxColumn CCRC32; + private System.Windows.Forms.DataGridViewTextBoxColumn CSHA1; + private System.Windows.Forms.DataGridViewTextBoxColumn CMD5; + private System.Windows.Forms.DataGridViewTextBoxColumn CStatus; + private System.Windows.Forms.DataGridViewTextBoxColumn ZipIndex; + private System.Windows.Forms.DataGridViewTextBoxColumn ZipHeader; + private System.Windows.Forms.ToolStripMenuItem registratioToolStripMenuItem; + private System.Windows.Forms.Label lblDITRomsFixable; + private System.Windows.Forms.Label lblDIRomsFixable; + private System.Windows.Forms.ToolStripMenuItem reportsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fixDatReportToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fullReportToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fixReportToolStripMenuItem; + } +} + diff --git a/ROMVault2/frmMain.cs b/ROMVault2/frmMain.cs new file mode 100644 index 0000000..c55d983 --- /dev/null +++ b/ROMVault2/frmMain.cs @@ -0,0 +1,1339 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2010 * + ******************************************************/ +using System; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.ServiceModel; +using System.Windows.Forms; +using ROMVault2.Properties; +using ROMVault2.RVRef; +using ROMVault2.RvDB; +using ROMVault2.Utils; + +namespace ROMVault2 +{ + public partial class FrmMain : Form + { + + private static readonly Color CBlue = Color.FromArgb(214, 214, 255); + private static readonly Color CGreyBlue = Color.FromArgb(214, 224, 255); + private static readonly Color CRed = Color.FromArgb(255, 214, 214); + private static readonly Color CBrightRed = Color.FromArgb(255, 0, 0); + private static readonly Color CGreen = Color.FromArgb(214, 255, 214); + private static readonly Color CGrey = Color.FromArgb(214, 214, 214); + private static readonly Color CCyan = Color.FromArgb(214, 255, 255); + private static readonly Color CCyanGrey = Color.FromArgb(214, 225, 225); + private static readonly Color CMagenta = Color.FromArgb(255, 214, 255); + private static readonly Color CBrown = Color.FromArgb(140, 80, 80); + private static readonly Color CPurple = Color.FromArgb(214, 140, 214); + private static readonly Color CYellow = Color.FromArgb(255, 255, 214); + private static readonly Color COrange = Color.FromArgb(255, 214, 140); + private static readonly Color CWhite = Color.FromArgb(255, 255, 255); + + private readonly Color[] _displayColor; + + private bool _updatingGameGrid; + + public static int[] GameGridColumnXPositions; + + private frmKey _fk; + + private Single _scaleFactorX = 1; + private Single _scaleFactorY = 1; + + protected override void ScaleControl(SizeF factor, BoundsSpecified specified) + { + base.ScaleControl(factor, specified); + splitContainer1.SplitterDistance = (int)(splitContainer1.SplitterDistance * factor.Width); + splitContainer2.SplitterDistance = (int)(splitContainer2.SplitterDistance * factor.Width); + splitContainer2.Panel1MinSize = (int)(splitContainer2.Panel1MinSize * factor.Width); + + splitContainer3.SplitterDistance = (int)(splitContainer3.SplitterDistance * factor.Height); + splitContainer4.SplitterDistance = (int)(splitContainer4.SplitterDistance * factor.Height); + + _scaleFactorX *= factor.Width; + _scaleFactorY *= factor.Height; + } + + public FrmMain() + { + + InitializeComponent(); + addGameGrid(); + Text = string.Format("RomVault ({0}.{1}) {2}", Program.Version, Program.SubVersion, Application.StartupPath); + + + + + _displayColor = new Color[(int)RepStatus.EndValue]; + + // RepStatus.UnSet + + _displayColor[(int)RepStatus.UnScanned] = CBlue; + + _displayColor[(int)RepStatus.DirCorrect] = CGreen; + _displayColor[(int)RepStatus.DirMissing] = CRed; + _displayColor[(int)RepStatus.DirCorrupt] = CBrightRed; //BrightRed + + _displayColor[(int)RepStatus.Missing] = CRed; + _displayColor[(int)RepStatus.Correct] = CGreen; + _displayColor[(int)RepStatus.NotCollected] = CGrey; + _displayColor[(int)RepStatus.UnNeeded] = CCyanGrey; + _displayColor[(int)RepStatus.Unknown] = CCyan; + _displayColor[(int)RepStatus.InToSort] = CMagenta; + + _displayColor[(int)RepStatus.Corrupt] = CBrightRed; //BrightRed + _displayColor[(int)RepStatus.Ignore] = CGreyBlue; + + _displayColor[(int)RepStatus.CanBeFixed] = CYellow; + _displayColor[(int)RepStatus.MoveToSort] = CPurple; + _displayColor[(int)RepStatus.Delete] = CBrown; + _displayColor[(int)RepStatus.NeededForFix] = COrange; + _displayColor[(int)RepStatus.Rename] = COrange; + + _displayColor[(int)RepStatus.CorruptCanBeFixed] = CYellow; + _displayColor[(int)RepStatus.MoveToCorrupt] = CPurple; //Missing + + + _displayColor[(int)RepStatus.Deleted] = CWhite; + + GameGridColumnXPositions = new int[(int)RepStatus.EndValue]; + + DirTree.Setup(ref DB.DirTree); + + splitContainer3_Panel1_Resize(new object(), new EventArgs()); + splitContainer4_Panel1_Resize(new object(), new EventArgs()); + } + + private Label lblSIName; + private Label lblSITName; + + private Label lblSIDescription; + private Label lblSITDescription; + + private Label lblSIManufacturer; + private Label lblSITManufacturer; + + private Label lblSICloneOf; + private Label lblSITCloneOf; + + private Label lblSIRomOf; + private Label lblSITRomOf; + + private Label lblSIYear; + private Label lblSITYear; + + private Label lblSITotalRoms; + private Label lblSITTotalRoms; + + //Trurip Extra Data + private Label lblSIPublisher; + private Label lblSITPublisher; + + private Label lblSIDeveloper; + private Label lblSITDeveloper; + + private Label lblSIEdition; + private Label lblSITEdition; + + private Label lblSIVersion; + private Label lblSITVersion; + + private Label lblSIType; + private Label lblSITType; + + private Label lblSIMedia; + private Label lblSITMedia; + + private Label lblSILanguage; + private Label lblSITLanguage; + + private Label lblSIPlayers; + private Label lblSITPlayers; + + private Label lblSIRatings; + private Label lblSITRatings; + + private Label lblSIGenre; + private Label lblSITGenre; + + private Label lblSIPeripheral; + private Label lblSITPeripheral; + + private Label lblSIBarCode; + private Label lblSITBarCode; + + private Label lblSIMediaCatalogNumber; + private Label lblSITMediaCatalogNumber; + + private void addGameGrid() + { + lblSIName = new Label { Location = SPoint(6, 15), Size = SSize(76, 13), Text = "Name :", TextAlign = ContentAlignment.TopRight }; + lblSITName = new Label { Location = SPoint(84, 14), Size = SSize(320, 17), BorderStyle = BorderStyle.FixedSingle }; + gbSetInfo.Controls.Add(lblSIName); + gbSetInfo.Controls.Add(lblSITName); + + lblSIDescription = new Label { Location = SPoint(6, 31), Size = SSize(76, 13), Text = "Description :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITDescription = new Label { Location = SPoint(84, 30), Size = SSize(320, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIDescription); + gbSetInfo.Controls.Add(lblSITDescription); + + lblSIManufacturer = new Label { Location = SPoint(6, 47), Size = SSize(76, 13), Text = "Manufacturer :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITManufacturer = new Label { Location = SPoint(84, 46), Size = SSize(320, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIManufacturer); + gbSetInfo.Controls.Add(lblSITManufacturer); + + lblSICloneOf = new Label { Location = SPoint(6, 63), Size = SSize(76, 13), Text = "Clone of :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITCloneOf = new Label { Location = SPoint(84, 62), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSICloneOf); + gbSetInfo.Controls.Add(lblSITCloneOf); + + lblSIYear = new Label { Location = SPoint(206, 63), Size = SSize(76, 13), Text = "Year :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITYear = new Label { Location = SPoint(284, 62), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIYear); + gbSetInfo.Controls.Add(lblSITYear); + + + lblSIRomOf = new Label { Location = SPoint(6, 79), Size = SSize(76, 13), Text = "ROM of :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITRomOf = new Label { Location = SPoint(84, 78), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIRomOf); + gbSetInfo.Controls.Add(lblSITRomOf); + + lblSITotalRoms = new Label { Location = SPoint(206, 79), Size = SSize(76, 13), Text = "Total ROMs :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITTotalRoms = new Label { Location = SPoint(284, 78), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSITotalRoms); + gbSetInfo.Controls.Add(lblSITTotalRoms); + + //Trurip + + lblSIPublisher = new Label { Location = SPoint(6, 47), Size = SSize(76, 13), Text = "Publisher :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITPublisher = new Label { Location = SPoint(84, 46), Size = SSize(320, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIPublisher); + gbSetInfo.Controls.Add(lblSITPublisher); + + lblSIDeveloper = new Label { Location = SPoint(6, 63), Size = SSize(76, 13), Text = "Developer :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITDeveloper = new Label { Location = SPoint(84, 62), Size = SSize(320, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIDeveloper); + gbSetInfo.Controls.Add(lblSITDeveloper); + + + + lblSIEdition = new Label { Location = SPoint(6, 79), Size = SSize(76, 13), Text = "Edition :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITEdition = new Label { Location = SPoint(84, 78), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIEdition); + gbSetInfo.Controls.Add(lblSITEdition); + + lblSIVersion = new Label { Location = SPoint(206, 79), Size = SSize(76, 13), Text = "Version :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITVersion = new Label { Location = SPoint(284, 78), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIVersion); + gbSetInfo.Controls.Add(lblSITVersion); + + lblSIType = new Label { Location = SPoint(406, 79), Size = SSize(76, 13), Text = "Type :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITType = new Label { Location = SPoint(484, 78), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIType); + gbSetInfo.Controls.Add(lblSITType); + + + lblSIMedia = new Label { Location = SPoint(6, 95), Size = SSize(76, 13), Text = "Media :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITMedia = new Label { Location = SPoint(84, 94), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIMedia); + gbSetInfo.Controls.Add(lblSITMedia); + + lblSILanguage = new Label { Location = SPoint(206, 95), Size = SSize(76, 13), Text = "Language :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITLanguage = new Label { Location = SPoint(284, 94), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSILanguage); + gbSetInfo.Controls.Add(lblSITLanguage); + + lblSIPlayers = new Label { Location = SPoint(406, 95), Size = SSize(76, 13), Text = "Players :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITPlayers = new Label { Location = SPoint(484, 94), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIPlayers); + gbSetInfo.Controls.Add(lblSITPlayers); + + + + lblSIRatings = new Label { Location = SPoint(6, 111), Size = SSize(76, 13), Text = "Ratings :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITRatings = new Label { Location = SPoint(84, 110), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIRatings); + gbSetInfo.Controls.Add(lblSITRatings); + + lblSIGenre = new Label { Location = SPoint(206, 111), Size = SSize(76, 13), Text = "Genre :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITGenre = new Label { Location = SPoint(284, 110), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIGenre); + gbSetInfo.Controls.Add(lblSITGenre); + + lblSIPeripheral = new Label { Location = SPoint(406, 111), Size = SSize(76, 13), Text = "Peripheral :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITPeripheral = new Label { Location = SPoint(484, 110), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIPeripheral); + gbSetInfo.Controls.Add(lblSITPeripheral); + + + lblSIBarCode = new Label { Location = SPoint(6, 127), Size = SSize(76, 13), Text = "Barcode :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITBarCode = new Label { Location = SPoint(84, 126), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIBarCode); + gbSetInfo.Controls.Add(lblSITBarCode); + + lblSIMediaCatalogNumber = new Label { Location = SPoint(406, 127), Size = SSize(76, 13), Text = "Cat. No. :", TextAlign = ContentAlignment.TopRight, Visible = false }; + lblSITMediaCatalogNumber = new Label { Location = SPoint(484, 126), Size = SSize(120, 17), BorderStyle = BorderStyle.FixedSingle, Visible = false }; + gbSetInfo.Controls.Add(lblSIMediaCatalogNumber); + gbSetInfo.Controls.Add(lblSITMediaCatalogNumber); + + } + + private Point SPoint(int x, int y) + { + return new Point((int)(x*_scaleFactorX),(int)(y*_scaleFactorY)); + } + private Size SSize(int x, int y) + { + return new Size((int)(x * _scaleFactorX), (int)(y * _scaleFactorY)); + } + + + public override sealed string Text + { + get { return base.Text; } + set { base.Text = value; } + } + + #region "Main Buttons" + + private void TsmUpdateDaTsClick(object sender, EventArgs e) + { + UpdateDats(); + } + private void BtnUpdateDatsClick(object sender, EventArgs e) + { + UpdateDats(); + } + + private void UpdateDats() + { + + FrmProgressWindow progress = new FrmProgressWindow(this, "Scanning Dats", DatUpdate.UpdateDat); + progress.ShowDialog(this); + progress.Dispose(); + + DirTree.Setup(ref DB.DirTree); + DatSetSelected(DirTree.Selected); + } + + + + + private void TsmScanLevel1Click(object sender, EventArgs e) + { + ScanRoms(eScanLevel.Level1); + } + private void TsmScanLevel2Click(object sender, EventArgs e) + { + ScanRoms(eScanLevel.Level2); + } + private void TsmScanLevel3Click(object sender, EventArgs e) + { + ScanRoms(eScanLevel.Level3); + } + private void BtnScanRomsClick(object sender, EventArgs e) + { + ScanRoms(Settings.ScanLevel); + } + + private void ScanRoms(eScanLevel sd) + { + FileScanning.EScanLevel = sd; + FrmProgressWindow progress = new FrmProgressWindow(this, "Scanning Dirs", FileScanning.ScanFiles); + progress.ShowDialog(this); + progress.Dispose(); + + DatSetSelected(DirTree.Selected); + } + + + private void TsmFindFixesClick(object sender, EventArgs e) + { + FindFix(); + } + private void BtnFindFixesClick(object sender, EventArgs e) + { + FindFix(); + } + + private void FindFix() + { +#if NEWFINDFIX + FrmProgressWindow progress = new FrmProgressWindow(this, "Finding Fixes", FindFixesNew.ScanFiles); + progress.ShowDialog(this); + progress.Dispose(); + + DatSetSelected(DirTree.Selected); +#else + FrmProgressWindow progress = new FrmProgressWindow(this, "Finding Fixes", FindFixes.ScanFiles); + progress.ShowDialog(this); + progress.Dispose(); + + DatSetSelected(DirTree.Selected); +#endif + } + + + + + private void BtnFixFilesClick(object sender, EventArgs e) + { + FixFiles(); + } + private void FixFilesToolStripMenuItemClick(object sender, EventArgs e) + { + FixFiles(); + } + + + private void FixFiles() + { + FrmProgressWindowFix progress = new FrmProgressWindowFix(this); + progress.ShowDialog(this); + progress.Dispose(); + + DatSetSelected(DirTree.Selected); + } + + + + #endregion + + private void DirTreeRvSelected(object sender, MouseEventArgs e) + { + RvDir cf = (RvDir)sender; + if (cf != DirTree.GetSelected()) + DatSetSelected(cf); + + if (e.Button == MouseButtons.Right) + { + RvDir tn = (RvDir)sender; + + ContextMenu mnuContext = new ContextMenu(); + + MenuItem mnuFile = new MenuItem + { + Index = 0, + Text = Resources.FrmMain_DirTreeRvSelected_Set_ROM_DIR, + Tag = tn.TreeFullName + }; + mnuFile.Click += MnuFileClick; + mnuContext.MenuItems.Add(mnuFile); + + MenuItem mnuMakeDat = new MenuItem + { + Index = 1, + Text = @"Make Dat", + Tag = tn + }; + mnuMakeDat.Click += MnuMakeDatClick; + mnuContext.MenuItems.Add(mnuMakeDat); + + + mnuContext.Show(DirTree, e.Location); + } + } + + #region "DAT display code" + + private void DatSetSelected(RvBase cf) + { + DirTree.Refresh(); + GameGrid.Rows.Clear(); + RomGrid.Rows.Clear(); + + if (cf == null) + return; + + UpdateGameGrid((RvDir)cf); + + + } + + + private static void MnuFileClick(object sender, EventArgs e) + { + FrmSetDir sd = new FrmSetDir(); + + MenuItem mi = (MenuItem)sender; + string tDir = (string)mi.Tag; + Debug.WriteLine("Opening Dir Options for " + tDir); + + sd.SetLocation(tDir); + sd.ShowDialog(); + + sd.Dispose(); + } + + private static void MnuMakeDatClick(object sender, EventArgs e) + { + MenuItem mi = (MenuItem)sender; + RvDir thisDir = (RvDir) mi.Tag; + DatMaker.MakeDatFromDir(thisDir); + } + + private void splitContainer3_Panel1_Resize(object sender, EventArgs e) + { + gbDatInfo.Width = splitContainer3.Panel1.Width - (gbDatInfo.Left * 2); + } + + private void gbDatInfo_Resize(object sender, EventArgs e) + { + const int leftPos = 89; + int rightPos = (int)(gbDatInfo.Width / _scaleFactorX) - 15; + if (rightPos > 600) rightPos = 600; + int width = rightPos - leftPos; + int widthB1 = (int)((double)width * 120 / 340); + int leftB2 = rightPos - widthB1; + + + int backD = 97; + + width = (int)(width * _scaleFactorX); + widthB1 = (int)(widthB1 * _scaleFactorX); + leftB2 = (int)(leftB2 * _scaleFactorX); + backD = (int)(backD * _scaleFactorX); + + + lblDITName.Width = width; + lblDITDescription.Width = width; + + lblDITCategory.Width = widthB1; + lblDITAuthor.Width = widthB1; + + lblDIVersion.Left = leftB2 - backD; + lblDIDate.Left = leftB2 - backD; + + lblDITVersion.Left = leftB2; + lblDITVersion.Width = widthB1; + lblDITDate.Left = leftB2; + lblDITDate.Width = widthB1; + + lblDITPath.Width = width; + + lblDITRomsGot.Width = widthB1; + lblDITRomsMissing.Width = widthB1; + + lblDIRomsFixable.Left = leftB2 - backD; + lblDIRomsUnknown.Left = leftB2 - backD; + + lblDITRomsFixable.Left = leftB2; + lblDITRomsFixable.Width = widthB1; + lblDITRomsUnknown.Left = leftB2; + lblDITRomsUnknown.Width = widthB1; + } + + + #endregion + + #region "Game Grid Code" + + private void UpdateGameGrid(RvDir tDir) + { + + + lblDITName.Text = tDir.Name; + if (tDir.Dat != null) + { + RvDat tDat = tDir.Dat; + lblDITDescription.Text = tDat.GetData(RvDat.DatData.Description); + lblDITCategory.Text = tDat.GetData(RvDat.DatData.Category); + lblDITVersion.Text = tDat.GetData(RvDat.DatData.Version); + lblDITAuthor.Text = tDat.GetData(RvDat.DatData.Author); + lblDITDate.Text = tDat.GetData(RvDat.DatData.Date); + } + else if (tDir.DirDatCount == 1) + { + RvDat tDat = tDir.DirDat(0); + lblDITDescription.Text = tDat.GetData(RvDat.DatData.Description); + lblDITCategory.Text = tDat.GetData(RvDat.DatData.Category); + lblDITVersion.Text = tDat.GetData(RvDat.DatData.Version); + lblDITAuthor.Text = tDat.GetData(RvDat.DatData.Author); + lblDITDate.Text = tDat.GetData(RvDat.DatData.Date); + } + else + { + lblDITDescription.Text = ""; + lblDITCategory.Text = ""; + lblDITVersion.Text = ""; + lblDITAuthor.Text = ""; + lblDITDate.Text = ""; + } + + + + lblDITPath.Text = tDir.FullName; + + + lblDITRomsGot.Text = tDir.DirStatus.CountCorrect().ToString(CultureInfo.InvariantCulture); + lblDITRomsMissing.Text = tDir.DirStatus.CountMissing().ToString(CultureInfo.InvariantCulture); + lblDITRomsFixable.Text = tDir.DirStatus.CountFixesNeeded().ToString(CultureInfo.InvariantCulture); + lblDITRomsUnknown.Text = (tDir.DirStatus.CountUnknown() + tDir.DirStatus.CountInToSort()).ToString(CultureInfo.InvariantCulture); + + _updatingGameGrid = true; + GameGrid.Rows.Clear(); + RomGrid.Rows.Clear(); + + ReportStatus tDirStat; + + GameGridColumnXPositions = new int[(int)RepStatus.EndValue]; + + for (int j = 0; j < tDir.ChildCount; j++) + { + + RvDir tChildDir = tDir.Child(j) as RvDir; + if (tChildDir == null) continue; + + tDirStat = tChildDir.DirStatus; + + bool gCorrect = tDirStat.HasCorrect(); + bool gMissing = tDirStat.HasMissing(); + bool gUnknown = tDirStat.HasUnknown(); + bool gInToSort = tDirStat.HasInToSort(); + bool gFixes = tDirStat.HasFixesNeeded(); + + bool show = (chkBoxShowCorrect.Checked && gCorrect && !gMissing && !gFixes); + show = show || (chkBoxShowMissing.Checked && gMissing); + show = show || (chkBoxShowFixed.Checked && gFixes); + show = show || (gUnknown); + show = show || (gInToSort); + show = show || (tChildDir.GotStatus == GotStatus.Corrupt); + show = show || !(gCorrect || gMissing || gUnknown || gInToSort || gFixes); + + if (!show) continue; + + int columnIndex = 0; + for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) + { + if (l >= 13) columnIndex = l; + + if (tDirStat.Get(RepairStatus.DisplayOrder[l]) <= 0) continue; + + int len = DigitLength(tDirStat.Get(RepairStatus.DisplayOrder[l])) * 7 + 26; + if (len > GameGridColumnXPositions[columnIndex]) + GameGridColumnXPositions[columnIndex] = len; + columnIndex++; + } + } + + int t = 0; + for (int l = 0; l < (int)RepStatus.EndValue; l++) + { + int colWidth = GameGridColumnXPositions[l]; + GameGridColumnXPositions[l] = t; + t += colWidth; + } + + for (int j = 0; j < tDir.ChildCount; j++) + { + RvDir tChildDir = tDir.Child(j) as RvDir; + if (tChildDir == null) continue; + + tDirStat = tChildDir.DirStatus; + + bool gCorrect = tDirStat.HasCorrect(); + bool gMissing = tDirStat.HasMissing(); + bool gUnknown = tDirStat.HasUnknown(); + bool gFixes = tDirStat.HasFixesNeeded(); + bool gInToSort = tDirStat.HasInToSort(); + + bool show = (chkBoxShowCorrect.Checked && gCorrect && !gMissing && !gFixes); + show = show || (chkBoxShowMissing.Checked && gMissing); + show = show || (chkBoxShowFixed.Checked && gFixes); + show = show || (gUnknown); + show = show || (gInToSort); + show = show || (tChildDir.GotStatus == GotStatus.Corrupt); + show = show || !(gCorrect || gMissing || gUnknown || gInToSort || gFixes); + + if (!show) continue; + + Color bgCol = Color.FromArgb(255, 255, 255); + + + foreach (RepStatus t1 in RepairStatus.DisplayOrder) + { + if (tDirStat.Get(t1) <= 0) continue; + + bgCol = _displayColor[(int)t1]; + break; + } + + + GameGrid.Rows.Add(); + int iRow = GameGrid.Rows.Count - 1; + + GameGrid.Rows[iRow].Selected = false; + GameGrid.Rows[iRow].Tag = tChildDir; + + GameGrid.Rows[iRow].Cells[0].Style.BackColor = bgCol; + GameGrid.Rows[iRow].Cells[1].Style.BackColor = bgCol; + GameGrid.Rows[iRow].Cells[2].Style.BackColor = bgCol; + + if (String.IsNullOrEmpty(tChildDir.FileName)) + GameGrid.Rows[iRow].Cells[1].Value = tChildDir.Name; + else + GameGrid.Rows[iRow].Cells[1].Value = tChildDir.Name + " (Found: " + tChildDir.FileName + ")"; + + if (tChildDir.Game != null) + GameGrid.Rows[iRow].Cells[2].Value = tChildDir.Game.GetData(RvGame.GameData.Description); + + DirCellDraw tDirCellDraw = new DirCellDraw(tChildDir, bgCol); + GameGrid.Rows[iRow].Cells[0] = tDirCellDraw; + + DirCellStatusDraw tCellStatusDraw = new DirCellStatusDraw(tChildDir); + GameGrid.Rows[iRow].Cells[3] = tCellStatusDraw; + } + + _updatingGameGrid = false; + + UpdateRomGrid(tDir); + } + + private static int DigitLength(int number) + { + + int textNumber = number; + int len = 0; + + while (textNumber > 0) + { + textNumber = textNumber / 10; + len++; + } + + return len; + } + + private void GameGridSelectionChanged(object sender, EventArgs e) + { + UpdateSelectedGame(); + } + + private void GameGridMouseDoubleClick(object sender, MouseEventArgs e) + { + if (_updatingGameGrid) + return; + + if (GameGrid.SelectedRows.Count != 1) + return; + + RvDir tGame = (RvDir)GameGrid.SelectedRows[0].Tag; + if (tGame.Game == null) + { + UpdateGameGrid(tGame); + DirTree.SetSelected(tGame); + } + } + + + #endregion + + #region "Rom Grid Code" + + private void splitContainer4_Panel1_Resize(object sender, EventArgs e) + { + int chkLeft = splitContainer4.Panel1.Width - 150; + if (chkLeft < 430) chkLeft = 430; + + chkBoxShowCorrect.Left = chkLeft; + chkBoxShowMissing.Left = chkLeft; + chkBoxShowFixed.Left = chkLeft; + chkBoxShowMerged.Left = chkLeft; + btnColorKey.Left = chkLeft; + + gbSetInfo.Width = chkLeft - gbSetInfo.Left - 10; + } + + + private void gbSetInfo_Resize(object sender, EventArgs e) + { + int leftPos = 84; + int rightPos = gbSetInfo.Width - 15; + if (rightPos > 750) rightPos = 750; + int width = rightPos - leftPos; + + int widthB1 = (int)((double)width * 120 / 340); + int leftB2 = leftPos + width - widthB1; + + if (lblSITName == null) return; + + lblSITName.Width = width; + lblSITDescription.Width = width; + lblSITManufacturer.Width = width; + + lblSITCloneOf.Width = widthB1; + + lblSIYear.Left = leftB2 - 78; + lblSITYear.Left = leftB2; + lblSITYear.Width = widthB1; + + lblSITRomOf.Width = widthB1; + + lblSITotalRoms.Left = leftB2 - 78; + lblSITTotalRoms.Left = leftB2; + lblSITTotalRoms.Width = widthB1; + + lblSITPublisher.Width = width; + lblSITDeveloper.Width = width; + + int width3 = (int)((double)width * 0.24); + int P2 = (int)((double)width * 0.38); + + int width4 = (int) ((double) width*0.24); + + lblSITEdition.Width = width3; + + lblSIVersion.Left = leftPos + P2 - 78; + lblSITVersion.Left = leftPos + P2; + lblSITVersion.Width = width3; + + lblSIType.Left = leftPos + width - width3 - 78; + lblSITType.Left = leftPos + width - width3; + lblSITType.Width = width3; + + + lblSITMedia.Width = width3; + + lblSILanguage.Left = leftPos + P2 - 78; + lblSITLanguage.Left = leftPos + P2; + lblSITLanguage.Width = width3; + + lblSIPlayers.Left = leftPos + width - width3 - 78; + lblSITPlayers.Left = leftPos + width - width3; + lblSITPlayers.Width = width3; + + lblSITRatings.Width = width3; + + lblSIGenre.Left = leftPos + P2 - 78; + lblSITGenre.Left = leftPos + P2; + lblSITGenre.Width = width3; + + lblSIPeripheral.Left = leftPos + width - width3 - 78; + lblSITPeripheral.Left = leftPos + width - width3; + lblSITPeripheral.Width = width3; + + + lblSITBarCode.Width = width4; + + lblSIMediaCatalogNumber.Left = leftPos + width - width4 - 78; + lblSITMediaCatalogNumber.Left = leftPos + width - width4; + lblSITMediaCatalogNumber.Width = width4; + + + } + + + private void UpdateSelectedGame() + { + if (_updatingGameGrid) + return; + + if (GameGrid.SelectedRows.Count != 1) + return; + + RvDir tGame = (RvDir)GameGrid.SelectedRows[0].Tag; + UpdateRomGrid(tGame); + } + + private void UpdateRomGrid(RvDir tGame) + { + lblSITName.Text = tGame.Name; + if (tGame.Game == null) + { + lblSIDescription.Visible = false; + lblSITDescription.Visible = false; + + lblSIManufacturer.Visible = false; + lblSITManufacturer.Visible = false; + + lblSICloneOf.Visible = false; + lblSITCloneOf.Visible = false; + + lblSIRomOf.Visible = false; + lblSITRomOf.Visible = false; + + lblSIYear.Visible = false; + lblSITYear.Visible = false; + + lblSITotalRoms.Visible = false; + lblSITTotalRoms.Visible = false; + + // Trurip + + lblSIPublisher.Visible = false; + lblSITPublisher.Visible = false; + + lblSIDeveloper.Visible = false; + lblSITDeveloper.Visible = false; + + lblSIEdition.Visible = false; + lblSITEdition.Visible = false; + + lblSIVersion.Visible = false; + lblSITVersion.Visible = false; + + lblSIType.Visible = false; + lblSITType.Visible = false; + + lblSIMedia.Visible = false; + lblSITMedia.Visible = false; + + lblSILanguage.Visible = false; + lblSITLanguage.Visible = false; + + lblSIPlayers.Visible = false; + lblSITPlayers.Visible = false; + + lblSIRatings.Visible = false; + lblSITRatings.Visible = false; + + lblSIGenre.Visible = false; + lblSITGenre.Visible = false; + + lblSIPeripheral.Visible = false; + lblSITPeripheral.Visible = false; + + lblSIBarCode.Visible = false; + lblSITBarCode.Visible = false; + + lblSIMediaCatalogNumber.Visible = false; + lblSITMediaCatalogNumber.Visible = false; + } + else + { + + if (tGame.Game.GetData(RvGame.GameData.Trurip) == "yes") + { + lblSIDescription.Visible = true; + lblSITDescription.Visible = true; + lblSITDescription.Text = tGame.Game.GetData(RvGame.GameData.Description); + + lblSIManufacturer.Visible = false; + lblSITManufacturer.Visible = false; + + lblSICloneOf.Visible = false; + lblSITCloneOf.Visible = false; + + lblSIRomOf.Visible = false; + lblSITRomOf.Visible = false; + + lblSIYear.Visible = false; + lblSITYear.Visible = false; + + lblSITotalRoms.Visible = false; + lblSITTotalRoms.Visible = false; + + + lblSIPublisher.Visible = true; + lblSITPublisher.Visible = true; + lblSITPublisher.Text = tGame.Game.GetData(RvGame.GameData.Publisher); + + lblSIDeveloper.Visible = true; + lblSITDeveloper.Visible = true; + lblSITDeveloper.Text = tGame.Game.GetData(RvGame.GameData.Developer); + + lblSIEdition.Visible = true; + lblSITEdition.Visible = true; + lblSITEdition.Text = tGame.Game.GetData(RvGame.GameData.Edition); + + lblSIVersion.Visible = true; + lblSITVersion.Visible = true; + lblSITVersion.Text = tGame.Game.GetData(RvGame.GameData.Version); + + lblSIType.Visible = true; + lblSITType.Visible = true; + lblSITType.Text = tGame.Game.GetData(RvGame.GameData.Type); + + lblSIMedia.Visible = true; + lblSITMedia.Visible = true; + lblSITMedia.Text = tGame.Game.GetData(RvGame.GameData.Media); + + lblSILanguage.Visible = true; + lblSITLanguage.Visible = true; + lblSITLanguage.Text = tGame.Game.GetData(RvGame.GameData.Language); + + lblSIPlayers.Visible = true; + lblSITPlayers.Visible = true; + lblSITPlayers.Text = tGame.Game.GetData(RvGame.GameData.Players); + + lblSIRatings.Visible = true; + lblSITRatings.Visible = true; + lblSITRatings.Text = tGame.Game.GetData(RvGame.GameData.Ratings); + + lblSIGenre.Visible = true; + lblSITGenre.Visible = true; + lblSITGenre.Text = tGame.Game.GetData(RvGame.GameData.Genre); + + lblSIPeripheral.Visible = true; + lblSITPeripheral.Visible = true; + lblSITPeripheral.Text = tGame.Game.GetData(RvGame.GameData.Peripheral); + + lblSIBarCode.Visible = true; + lblSITBarCode.Visible = true; + lblSITBarCode.Text = tGame.Game.GetData(RvGame.GameData.BarCode); + + lblSIMediaCatalogNumber.Visible = true; + lblSITMediaCatalogNumber.Visible = true; + lblSITMediaCatalogNumber.Text = tGame.Game.GetData(RvGame.GameData.MediaCatalogNumber); + + } + else + { + lblSIDescription.Visible = true; + lblSITDescription.Visible = true; + lblSITDescription.Text = tGame.Game.GetData(RvGame.GameData.Description); + + lblSIManufacturer.Visible = true; + lblSITManufacturer.Visible = true; + lblSITManufacturer.Text = tGame.Game.GetData(RvGame.GameData.Manufacturer); + + lblSICloneOf.Visible = true; + lblSITCloneOf.Visible = true; + lblSITCloneOf.Text = tGame.Game.GetData(RvGame.GameData.CloneOf); + + lblSIRomOf.Visible = true; + lblSITRomOf.Visible = true; + lblSITRomOf.Text = tGame.Game.GetData(RvGame.GameData.RomOf); + + lblSIYear.Visible = true; + lblSITYear.Visible = true; + lblSITYear.Text = tGame.Game.GetData(RvGame.GameData.Year); + + lblSITotalRoms.Visible = true; + lblSITTotalRoms.Visible = true; + + + + + lblSIPublisher.Visible = false; + lblSITPublisher.Visible = false; + + lblSIDeveloper.Visible = false; + lblSITDeveloper.Visible = false; + + lblSIEdition.Visible = false; + lblSITEdition.Visible = false; + + lblSIVersion.Visible = false; + lblSITVersion.Visible = false; + + lblSIType.Visible = false; + lblSITType.Visible = false; + + lblSIMedia.Visible = false; + lblSITMedia.Visible = false; + + lblSILanguage.Visible = false; + lblSITLanguage.Visible = false; + + lblSIPlayers.Visible = false; + lblSITPlayers.Visible = false; + + lblSIRatings.Visible = false; + lblSITRatings.Visible = false; + + lblSIGenre.Visible = false; + lblSITGenre.Visible = false; + + lblSIPeripheral.Visible = false; + lblSITPeripheral.Visible = false; + + lblSIBarCode.Visible = false; + lblSITBarCode.Visible = false; + + lblSIMediaCatalogNumber.Visible = false; + lblSITMediaCatalogNumber.Visible = false; + + } + } + + RomGrid.Rows.Clear(); + AddDir(tGame, ""); + GC.Collect(); + } + + + private void AddDir(RvDir tGame, string pathAdd) + { + for (int l = 0; l < tGame.ChildCount; l++) + { + RvBase tBase = tGame.Child(l); + + RvFile tFile = tBase as RvFile; + if (tFile != null) + AddRom((RvFile)tBase, pathAdd); + + if (tGame.Dat == null) + continue; + + RvDir tDir = tBase as RvDir; + if (tDir == null) continue; + if (tDir.Game == null) + AddDir(tDir, pathAdd + tGame.Name + "/"); + } + } + + private void AddRom(RvFile tRomTable, string pathAdd) + { + + if (tRomTable.DatStatus != DatStatus.InDatMerged || tRomTable.RepStatus != RepStatus.NotCollected || chkBoxShowMerged.Checked) + { + RomGrid.Rows.Add(); + int row = RomGrid.Rows.Count - 1; + + string imageName = "R_" + tRomTable.DatStatus + "_" + tRomTable.RepStatus; + + RomCellDraw tDirCellDraw = new RomCellDraw(imageName, _displayColor[(int)tRomTable.RepStatus]); + RomGrid.Rows[row].Cells[0] = tDirCellDraw; + + for (int i = 0; i < RomGrid.Rows[row].Cells.Count; i++) + RomGrid.Rows[row].Cells[i].Style.BackColor = _displayColor[(int)tRomTable.RepStatus]; + + string fname = pathAdd + tRomTable.Name; + if (!string.IsNullOrEmpty(tRomTable.FileName)) + fname += " (Found: " + tRomTable.FileName + ")"; + if (tRomTable.CHDVersion != null) + fname += " (V" + tRomTable.CHDVersion + ")"; + + RomGrid.Rows[row].Cells["CRom"].Value = fname; + + RomGrid.Rows[row].Cells["CMerge"].Value = tRomTable.Merge; + RomGrid.Rows[row].Cells["CStatus"].Value = tRomTable.Status; + + string strSize = tRomTable.Size.ToString(); + string flags = ""; + if (tRomTable.FileStatusIs(FileStatus.SizeFromDAT)) flags += "D"; + if (tRomTable.FileStatusIs(FileStatus.SizeFromHeader)) flags += "H"; + if (tRomTable.FileStatusIs(FileStatus.SizeVerified)) flags += "V"; + if (!String.IsNullOrEmpty(flags)) strSize += " (" + flags + ")"; + RomGrid.Rows[row].Cells["CSize"].Value = strSize; + + string strCRC = ArrByte.ToString(tRomTable.CRC); + flags = ""; + if (tRomTable.FileStatusIs(FileStatus.CRCFromDAT)) flags += "D"; + if (tRomTable.FileStatusIs(FileStatus.CRCFromHeader)) flags += "H"; + if (tRomTable.FileStatusIs(FileStatus.CRCVerified)) flags += "V"; + if (!String.IsNullOrEmpty(flags)) strCRC += " (" + flags + ")"; + RomGrid.Rows[row].Cells["CCRC32"].Value = strCRC; + + if (tRomTable.SHA1CHD == null) + { + string strSHA1 = ArrByte.ToString(tRomTable.SHA1); + flags = ""; + if (tRomTable.FileStatusIs(FileStatus.SHA1FromDAT)) flags += "D"; + if (tRomTable.FileStatusIs(FileStatus.SHA1FromHeader)) flags += "H"; + if (tRomTable.FileStatusIs(FileStatus.SHA1Verified)) flags += "V"; + if (!String.IsNullOrEmpty(flags)) strSHA1 += " (" + flags + ")"; + RomGrid.Rows[row].Cells["CSHA1"].Value = strSHA1; + } + else + { + string strSHA1CHD = "CHD: " + ArrByte.ToString(tRomTable.SHA1CHD); + flags = ""; + if (tRomTable.FileStatusIs(FileStatus.SHA1CHDFromDAT)) flags += "D"; + if (tRomTable.FileStatusIs(FileStatus.SHA1CHDFromHeader)) flags += "H"; + if (tRomTable.FileStatusIs(FileStatus.SHA1CHDVerified)) flags += "V"; + if (!String.IsNullOrEmpty(flags)) strSHA1CHD += " (" + flags + ")"; + RomGrid.Rows[row].Cells["CSHA1"].Value = strSHA1CHD; + } + + if (tRomTable.MD5CHD == null) + { + string strMD5 = ArrByte.ToString(tRomTable.MD5); + flags = ""; + if (tRomTable.FileStatusIs(FileStatus.MD5FromDAT)) flags += "D"; + if (tRomTable.FileStatusIs(FileStatus.MD5FromHeader)) flags += "H"; + if (tRomTable.FileStatusIs(FileStatus.MD5Verified)) flags += "V"; + if (!String.IsNullOrEmpty(flags)) strMD5 += " (" + flags + ")"; + RomGrid.Rows[row].Cells["CMD5"].Value = strMD5; + } + else + { + string strMD5CHD = "CHD: " + ArrByte.ToString(tRomTable.MD5CHD); + flags = ""; + if (tRomTable.FileStatusIs(FileStatus.MD5CHDFromDAT)) flags += "D"; + if (tRomTable.FileStatusIs(FileStatus.MD5CHDFromHeader)) flags += "H"; + if (tRomTable.FileStatusIs(FileStatus.MD5CHDVerified)) flags += "V"; + if (!String.IsNullOrEmpty(flags)) strMD5CHD += " (" + flags + ")"; + RomGrid.Rows[row].Cells["CMD5"].Value = strMD5CHD; + } + + if (tRomTable.FileType == FileType.ZipFile) + { + RomGrid.Rows[row].Cells["ZipIndex"].Value = tRomTable.ZipFileIndex == -1 ? "" : tRomTable.ZipFileIndex.ToString(CultureInfo.InvariantCulture); + RomGrid.Rows[row].Cells["ZipHeader"].Value = tRomTable.ZipFileHeaderPosition == null ? "" : tRomTable.ZipFileHeaderPosition.ToString(); + } + } + } + #endregion + + private void RomGridSelectionChanged(object sender, EventArgs e) + { + RomGrid.ClearSelection(); + } + + private void ChkBoxShowCorrectCheckedChanged(object sender, EventArgs e) + { + DatSetSelected(DirTree.Selected); + } + + private void ChkBoxShowMissingCheckedChanged(object sender, EventArgs e) + { + DatSetSelected(DirTree.Selected); + } + + private void ChkBoxShowFixedCheckedChanged(object sender, EventArgs e) + { + DatSetSelected(DirTree.Selected); + } + + private void ChkBoxShowMergedCheckedChanged(object sender, EventArgs e) + { + UpdateSelectedGame(); + } + + private void BtnColorKeyClick(object sender, EventArgs e) + { + + if (_fk == null || _fk.IsDisposed) + _fk = new frmKey(); + _fk.Show(); + } + + private void SettingsToolStripMenuItemClick(object sender, EventArgs e) + { + FrmSettings fcfg = new FrmSettings(); + fcfg.ShowDialog(this); + fcfg.Dispose(); + } + + private void BtnReportClick(object sender, EventArgs e) + { + Report.MakeFixFiles(); + //frmReport newreporter = new frmReport(); + //newreporter.ShowDialog(); + //newreporter.Dispose(); + } + private void fixDatReportToolStripMenuItem_Click(object sender, EventArgs e) + { + Report.MakeFixFiles(); + } + + private void fullReportToolStripMenuItem_Click(object sender, EventArgs e) + { + Report.GenerateReport(); + } + private void fixReportToolStripMenuItem_Click(object sender, EventArgs e) + { + Report.GenerateFixReport(); + } + + + private void AboutRomVaultToolStripMenuItemClick(object sender, EventArgs e) + { + frmHelpAbout fha = new frmHelpAbout(); + fha.ShowDialog(this); + fha.Dispose(); + } + + private void RomGridMouseUp(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + int currentMouseOverRow = RomGrid.HitTest(e.X, e.Y).RowIndex; + if (currentMouseOverRow >= 0) + { + string name = RomGrid.Rows[currentMouseOverRow].Cells[1].Value.ToString(); + string size = RomGrid.Rows[currentMouseOverRow].Cells[2].Value.ToString(); + string crc = RomGrid.Rows[currentMouseOverRow].Cells[4].Value.ToString(); + if (crc.Length > 8) crc = crc.Substring(0, 8); + string sha1 = RomGrid.Rows[currentMouseOverRow].Cells[5].Value.ToString(); + if (sha1.Length > 40) sha1 = sha1.Substring(0, 40); + string md5 = RomGrid.Rows[currentMouseOverRow].Cells[6].Value.ToString(); + if (md5.Length > 32) md5 = md5.Substring(0, 32); + + string clipText = "Name : " + name + Environment.NewLine; + clipText += "Size : " + size + Environment.NewLine; + clipText += "CRC32: " + crc + Environment.NewLine; + if (sha1.Length > 0) clipText += "SHA1 : " + sha1 + Environment.NewLine; + if (md5.Length > 0) clipText += "MD5 : " + md5 + Environment.NewLine; + + try + { + Clipboard.Clear(); + Clipboard.SetText(clipText); + } + catch + { + } + } + } + } + + private void GameGrid_MouseUp(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + int currentMouseOverRow = GameGrid.HitTest(e.X, e.Y).RowIndex; + if (currentMouseOverRow >= 0) + { + object r1 = GameGrid.Rows[currentMouseOverRow].Cells[1].Value; + string filename = r1 != null ? r1.ToString() : ""; + object r2 = GameGrid.Rows[currentMouseOverRow].Cells[2].Value; + string description = r2 != null ? r2.ToString() : ""; + + try + { + Clipboard.Clear(); + Clipboard.SetText("Name : " + filename + Environment.NewLine + "Desc : " + description + Environment.NewLine); + } + catch + { + } + } + } + + } + + private void RegistratioToolStripMenuItemClick(object sender, EventArgs e) + { + FrmRegistration freg = new FrmRegistration(); + freg.ShowDialog(this); + freg.Dispose(); + } + + private void checkForUpdateToolStripMenuItem_Click(object sender, EventArgs e) + { + BasicHttpBinding b = new BasicHttpBinding(); + EndpointAddress ep = new EndpointAddress(@"http://services.romvault.com/Service1.svc"); + + Service1Client s = new Service1Client(b, ep); + + string v = s.GetLatestVersion1(Program.Version, Program.SubVersion); + + string thisV = Program.Version + "." + Program.SubVersion.ToString("0000"); + + int res = String.Compare(v, thisV, StringComparison.Ordinal); + + if (res > 0) + { + string url = s.GetUpdateLink1(Program.Version, Program.SubVersion); + MessageBox.Show(Resources.Program_Main_There_is_a_new_release_download_now_from + url); + Process.Start(url); + } + else + { + MessageBox.Show(@"You are running the latest version " + Program.Version + "." + Program.SubVersion); + } + + + } + + + } +} diff --git a/ROMVault2/frmMain.resx b/ROMVault2/frmMain.resx new file mode 100644 index 0000000..b1dc996 --- /dev/null +++ b/ROMVault2/frmMain.resx @@ -0,0 +1,2236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + YII= + + + + + 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 + RU5ErkJggg== + + + + + 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 + + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + 17, 17 + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA7e3tvevr6//m5ub/4ODg/9nZ2f/Q0ND/wsLC/66urv+ampr/nJyc/6Kiov+tra3/ubm5/8XF + xf/R0dH/2trapenp6b3l5eX/3t7e/9bW1v/Kysr/ubm5/5+fn/92dnb/ampq/21tbf97e3v/jIyM/56e + nv+wsLD/wsLC/8/Pz6Xl5eW939/f/9bW1v/Jycn/uLi4/5ycnP9ubm7/YWFh/2pqav8tLS3/RERE/2lp + af+AgID/mJiY/7Kysv/FxcWl39/fvdjY2P/Ly8v/ubm5/56env9ycnL/VlZW/2RkZP92dnb/IyMj/yAg + IP8qKir/VlZW/319ff+ioqL/v7+/pdnZ2b3Nzc3/u7u7/6Kiov94eHj/U1NT/15eXv99fX3/IiIi/yYm + Jv8lJSX/IyMj/yAgIP8+Pj7/hoaG/76+vqXQ0NC9wMDA/6ampv+AgID/U1NT/1tbW/+BgYH/ISEh/yUl + Jf8lJSX/JiYm/yYmJv8lJSX/IiIi/2BgYP/Dw8OlxsbGva6urv+Hh4f/VlZW/1paWv+BgYH/JCQk/yUl + Jf8kJCT/JSUl/yUlJf8mJib/JiYm/yQkJP91dXX/zc3Npby8vL2Wlpb/XV1d/1tbW/+AgID/JiYm/zs7 + O/9ubm7/YWFh/ykpKf8kJCT/JSUl/yUlJf9ZWVn/xcXF/9XV1aW4uLi9dXV1/2JiYv9/f3//Kysr/0BA + QP/FxcX/zMzM/8vLy/+hoaH/JCQk/yQkJP9NTU3/v7+//9LS0v/c3NylvLy8vXJycv9/f3//NjY2/yMj + I/9lZWX/zc3N/83Nzf/MzMz/ycnJ/ykpKf9DQ0P/uLi4/9DQ0P/c3Nz/4+PjpcDAwL1/f3//QkJC/yQi + Iv8jIyP/Li4u/6ioqP/MzMz/ysrK/3h4eP88PDz/s7Oz/8/Pz//b29v/4+Pj/+jo6KXR0dG9bm5u/yQi + Iv9hJRr/SCQd/0QkHv8yJCH/Ozs7/zExMf82Njb/r6+v/9HR0f/b29v/4+Pj/+jo6P/s7Oyl29vbvX9/ + f/8lJSX/PiMe/1okGv9dJBr/VSQc/zokIP8yMjL/rq6u/9XV1f/e3t7/5OTk/+np6f/t7e3/8PDwpeXl + 5b3f39//t7e3/2tra/8lJSX/RyMd/1QlHP8vLi7/ra2t/93d3f/j4+P/6Ojo/+vr6//u7u7/8fHx//Pz + 86Xs7Oy96enp/+bm5v/i4uL/n5+f/zY2Nv9JSUn/q6ur/+bm5v/p6en/7Ozs/+7u7v/w8PD/8vLy//T0 + 9P/19fWl8fHxvfDw8P/u7u7/7Ozs/+rq6v/g4OD/39/f/+zs7P/u7u7/7+/v//Hx8f/y8vL/9PT0//X1 + 9f/29vb/9/f3pQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA7+/vee7u + 7v/t7e3/6+vr/+np6f/n5+f/5OTk/+Hh4f/e3t7/29vb/9fX1//T09P/zc3N/8XFxf++vr7/uLi4/7Cw + sP+rq6v/qKio/6ioqP+rq6v/rq6u/7Kysv+4uLj/vb29/8LCwv/Hx8f/zMzM/9HR0f/X19f/3Nzc/9/f + 303t7e157Ozs/+rq6v/o6Oj/5ubm/+Pj4//g4OD/3Nzc/9jY2P/U1NT/z8/P/8jIyP/AwMD/tra2/6qq + qv+YmJj/goKC/42Njf+NjY3/kZGR/5aWlv+bm5v/oqKi/6qqqv+wsLD/tra2/729vf/Dw8P/ysrK/9HR + 0f/X19f/29vbTevr63nq6ur/6Ojo/+Xl5f/i4uL/3t7e/9vb2//W1tb/0tLS/8zMzP/ExMT/u7u7/7Gx + sf+jo6P/kJCQ/3Z2dv9mZmb/c3Nz/3R0dP96enr/gICA/4iIiP+RkZH/mZmZ/6Ghof+pqan/sbGx/7m5 + uf/CwsL/ysrK/9HR0f/W1tZN6enpeefn5//l5eX/4uLi/97e3v/a2tr/1dXV/9DQ0P/Kysr/wsLC/7m5 + uf+tra3/n5+f/4mJif9ra2v/aWlp/29vb/9hYWH/YWFh/2dnZ/9tbW3/dXV1/35+fv+IiIj/kpKS/5yc + nP+lpaX/r6+v/7m5uf/CwsL/y8vL/9HR0U3n5+d55eXl/+Li4v/f39//29vb/9bW1v/Q0ND/ycnJ/8LC + wv+4uLj/ra2t/52dnf+IiIj/a2tr/0tLS/9oaGj/enp6/1hYWP9ERET/Ly8v/1NTU/9kZGT/bW1t/3d3 + d/+CgoL/jY2N/5iYmP+kpKT/sLCw/7u7u//Gxsb/zMzMTeXl5Xnj4+P/39/f/9vb2//X19f/0dHR/8rK + yv/BwcH/uLi4/62trf+enp7/iYmJ/2tra/9bW1v/WFhY/3h4eP91dXX/X19f/yAgIP8iIiL/Hx8f/zk5 + Of9aWlr/Z2dn/3Jycv9+fn7/i4uL/5mZmf+np6f/tbW1/8HBwf/JyclN4uLieeDg4P/c3Nz/2NjY/9LS + 0v/Kysr/wsLC/7i4uP+tra3/n5+f/4uLi/9tbW3/Q0ND/11dXf9dXV3/aWlp/5WVlf+QkJD/IiIi/yEh + If8eHh7/Hh4e/yQkJP9HR0f/YmJi/29vb/99fX3/jIyM/52dnf+vr6//vr6+/8fHx03g4OB53d3d/9jY + 2P/T09P/zMzM/8PDw/+5ubn/rq6u/6CgoP+MjIz/cnJy/19fX/9NTU3/ampq/3d3d/9TU1P/jo6O/yYm + Jv8jIyP/JiYm/yQkJP8hISH/Hh4e/x4eHv8wMDD/WFhY/21tbf99fX3/kpKS/6mpqf+8vLz/xsbGTd7e + 3nna2tr/1NTU/83Nzf/ExMT/u7u7/6+vr/+hoaH/j4+P/3V1df9HR0f/Wlpa/1ZWVv9paWn/fn5+/5ub + m/8dHR3/IyMj/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x4eHv8hISH/QEBA/2xsbP+IiIj/o6Oj/7u7 + u//Hx8dN2traedXV1f/Ozs7/xsbG/7y8vP+xsbH/pKSk/5KSkv97e3v/ZGRk/0pKSv9gYGD/dXV1/0JC + Qv+qqqr/MjIy/yMjI/8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/ISEh/x8fH/8fHx//LS0t/1JS + Uv+cnJz/u7u7/8fHx03W1tZ50dHR/8nJyf+/v7//s7Oz/6ampv+UlJT/fX19/01NTf9ZWVn/WFhY/2ho + aP9ubm7/mJiY/xsbG/8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yEh + If8gICD/KSkp/5ycnP++vr7/ycnJTdLS0nnMzMz/wsLC/7a2tv+pqan/l5eX/4KCgv9sbGz/SkpK/1tb + W/91dXX/Nzc3/7W1tf9HR0f/IiIi/yQkJP8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8jIyP/mJiY/8XFxf/MzMxNzs7OecfHx/+7u7v/ra2t/5ubm/+Ghob/WVlZ/1lZ + Wf9dXV3/ZWVl/2hoaP+Kior/KSkp/yEhIf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/zIyMv+goKD/ysrK/9DQ0E3Kysp5wcHB/7Kysv+goKD/ioqK/3Jy + cv9PT0//V1dX/3V1df8zMzP/q6ur/2ZmZv8gICD/JCQk/yUlJf8lJSX/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8hISH/Q0ND/76+vv/Nzc3/09PTTcXFxXm7u7v/qKio/5GR + kf9mZmb/Xl5e/2JiYv9eXl7/bGxs/3d3d/82Njb/Hx8f/yQkJP8kJCT/JSUl/ycnJ/8lJSX/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/Kioq/1hYWP+3t7f/ycnJ/9HR0f/X19dNwsLCebW1 + tf+enp7/gYGB/1hYWP9WVlb/dXV1/zg4OP+UlJT/ioqK/x8fH/8kJCT/LCws/3l5ef+tra3/v7+//7S0 + tP+IiIj/OTk5/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yQkJP8xMTH/sbGx/8bGxv/Ozs7/1tbW/9ra + 2k3BwcF5srKy/4iIiP9xcXH/bGxs/1tbW/92dnb/YWFh/05OTv8eHh7/IyMj/zMzM/+wsLD/zMzM/8vL + y//Ly8v/zMzM/8vLy//BwcH/SkpK/yMjI/8kJCT/JCQk/yUlJf8oKCj/QkJC/6qqqv/ExMT/zMzM/9PT + 0//Z2dn/3d3dTcLCwnm0tLT/enp6/2FhYf97e3v/SEhI/319ff+np6f/ISEh/yEhIf8jIyP/iIiI/8zM + zP/MzMz/zc3N/83Nzf/MzMz/y8vL/8rKyv+vr6//JSUl/yQkJP8kJCT/IyMj/yUlJf+lpaX/w8PD/8vL + y//R0dH/19fX/93d3f/g4OBNw8PDebm5uf+JiYn/Y2Nj/4GBgf9WVlb/Y2Nj/ykpKf8hISH/IyMj/yQk + JP+wsLD/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8zMzP8zMzP/JCQk/yUlJf8zMzP/lpaW/8HB + wf/Kysr/0dHR/9fX1//c3Nz/4ODg/+Pj403FxcV5tra2/4aGhv9WVlb/bm5u/7i4uP8rKyv/ISEh/yQk + JP8kJCT/JCQk/52dnf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/Ly8v/wcHB/yoqKv8jIyP/ICAg/5aW + lv/AwMD/ycnJ/9DQ0P/X19f/3Nzc/+Dg4P/k5OT/5ubmTcnJyXm2trb/jY2N/1JSUv9zc3P/PDw8/yEh + If8jIyP/IyMj/yMjI/8kJCT/T09P/8nJyf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vLy/95eXn/JCQk/ygo + KP+Dg4P/wMDA/8jIyP/Q0ND/1tbW/9vb2//g4OD/4+Pj/+bm5v/o6OhNzc3NecDAwP9nZ2f/tLS0/zw8 + PP8eHh7/IiIi/ysiIf8iIiL/IyMj/yMjI/8jIyP/VlZW/7e3t//MzMz/zc3N/8zMzP/ExMT/d3d3/yYm + Jv8dHR3/h4eH/8HBwf/Jycn/0NDQ/9bW1v/b29v/39/f/+Pj4//m5ub/6enp/+vr603S0tJ5zMzM/6mp + qf9VVVX/ICAg/yMjI/84Ix//ayYa/yIiIf8qIiH/NCMg/zQjIP8jIyP/JiYm/0hISP9dXV3/UVFR/y0t + Lf8jIyP/IiIi/2tra//BwcH/ysrK/9HR0f/W1tb/29vb/9/f3//j4+P/5ubm/+np6f/r6+v/7e3tTdfX + 13nS0tL/kpKS/ygoKP8jIyP/KyIg/3omF/9mJRn/cyYY/14lGv9TJRz/UyUc/1ckG/8oIyH/IyMj/yMj + I/8jIyP/IyMj/x0dHf93d3f/xMTE/8vLy//S0tL/19fX/9vb2//f39//4+Pj/+bm5v/o6Oj/6+vr/+3t + 7f/u7u5N29vbedfX1/+FhYX/IyMj/yMjI/8jISH/TyQc/2QkGP9yJhj/WyQa/2slGf86Ix7/XCUb/2Ml + G/8+Ix//JSMi/yMjI/8hISH/VVVV/8bGxv/Ozs7/1NTU/9nZ2f/d3d3/4ODg/+Pj4//m5ub/6Ojo/+vr + 6//t7e3/7+/v//Dw8E3g4OB53d3d/9PT0/9/f3//LCws/yIiIv8hISH/ISEh/0UjHf9XIxr/bCUY/2El + Gv8/Ix7/VSQc/10mG/8nIyL/Hx8f/2VlZf/Kysr/09PT/9fX1//b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/r6+v/7e3t/+/v7//w8PD/8fHxTeTk5Hni4uL/3t7e/9vb2//Dw8P/YGBg/yQkJP8iIiL/ISEh/yEh + If9fJRr/ZSUZ/1IkHP9eJRv/JSMi/yIiIv9AQED/ysrK/9jY2P/b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/q6ur/7Ozs/+7u7v/v7+//8fHx//Ly8v/z8/NN6Ojoeebm5v/k5OT/4eHh/9/f3//c3Nz/v7+//6io + qP8vLy//IiIi/yEhIf81IyD/ZiYa/zskIP8gICD/VFRU/83Nzf/d3d3/4ODg/+Pj4//l5eX/5+fn/+np + 6f/r6+v/7Ozs/+3t7f/v7+//8PDw//Hx8f/y8vL/8/Pz//T09E3s7Ox56+vr/+np6f/n5+f/5OTk/+Li + 4v/h4eH/39/f/5aWlv8wMDD/IiIi/yIiIv8jIyP/IiIi/ywsLP/Gxsb/4uLi/+Tk5P/m5ub/6Ojo/+np + 6f/r6+v/7Ozs/+7u7v/v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9fX1Te7u7nnt7e3/7Ozs/+vr + 6//p6en/6Ojo/+bm5v/k5OT/4+Pj/9PT0/9vb2//JiYm/y0tLf+ysrL/1NTU/+bm5v/n5+f/6enp/+rq + 6v/s7Oz/7e3t/+7u7v/v7+//8PDw//Hx8f/y8vL/8vLy//Pz8//09PT/9fX1//X19f/29vZN8fHxefDw + 8P/v7+//7u7u/+3t7f/s7Oz/6urq/+np6f/o6Oj/6Ojo/+jo6P++vr7/urq6/+np6f/q6ur/6+vr/+vr + 6//t7e3/7u7u/+/v7//v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/29vb/9vb2//f3 + 903z8/N58vLy//Hx8f/w8PD/8PDw/+/v7//u7u7/7e3t/+3t7f/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vL/8/Pz//T09P/09PT/9fX1//X19f/29vb/9vb2//f3 + 9//39/f/9/f3TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAPDw + 8Dfv7+//7u7u/+3t7f/s7Oz/6+vr/+rq6v/p6en/5+fn/+Xl5f/j4+P/4eHh/9/f3//d3d3/29vb/9nZ + 2f/X19f/1NTU/9DQ0P/Ly8v/x8fH/8LCwv++vr7/urq6/7a2tv+xsbH/rq6u/62trf+srKz/rKys/62t + rf+vr6//sbGx/7S0tP+3t7f/u7u7/76+vv/BwcH/xcXF/8jIyP/Ly8v/z8/P/9LS0v/V1dX/2NjY/9zc + 3P/f39/x////Ae7u7jfu7u7/7e3t/+zs7P/r6+v/6enp/+jo6P/m5ub/5eXl/+Pj4//g4OD/3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zc3N/8jIyP/CwsL/vLy8/7e3t/+xsbH/qqqq/6Ojo/+enp7/nJyc/5ub + m/+cnJz/np6e/6CgoP+jo6P/pqam/6qqqv+urq7/srKy/7a2tv+6urr/vr6+/8HBwf/FxcX/ycnJ/83N + zf/R0dH/1dXV/9nZ2f/c3Nzx////Ae3t7Tfs7Oz/6+vr/+rq6v/p6en/6Ojo/+bm5v/k5OT/4uLi/+Dg + 4P/d3d3/29vb/9jY2P/V1dX/0tLS/87Ozv/Kysr/xMTE/7+/v/+5ubn/sbGx/6ioqP+fn5//ioqK/21t + bf+Ghob/iIiI/4iIiP+Li4v/jo6O/5GRkf+VlZX/mZmZ/56env+kpKT/qKio/62trf+xsbH/tbW1/7q6 + uv++vr7/w8PD/8jIyP/MzMz/0dHR/9XV1f/Z2dnx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Pj + 4//h4eH/39/f/9zc3P/Z2dn/19fX/9TU1P/Q0ND/zMzM/8fHx//CwsL/vLy8/7a2tv+urq7/pKSk/5iY + mP+MjIz/cHBw/2JiYv9zc3P/dnZ2/3d3d/96enr/fn5+/4ODg/+Hh4f/jIyM/5KSkv+YmJj/nZ2d/6Oj + o/+oqKj/ra2t/7Kysv+3t7f/vb29/8LCwv/Hx8f/zMzM/9HR0f/W1tbx////Aerq6jfp6en/6Ojo/+fn + 5//l5eX/4+Pj/+Hh4f/e3t7/3Nzc/9nZ2f/W1tb/09PT/8/Pz//Ly8v/xsbG/8DAwP+6urr/s7Oz/6ur + q/+hoaH/lJSU/4WFhf94eHj/ampq/2hoaP9oaGj/ZmZm/2hoaP9tbW3/cXFx/3V1df96enr/f39//4aG + hv+MjIz/kpKS/5iYmP+enp7/pKSk/6qqqv+wsLD/tra2/7y8vP/CwsL/x8fH/83Nzf/S0tLx////Aenp + 6Tfo6Oj/5ubm/+Xl5f/j4+P/4eHh/9/f3//c3Nz/2dnZ/9bW1v/S0tL/zs7O/8rKyv/FxcX/v7+//7i4 + uP+xsbH/qamp/5+fn/+RkZH/f39//2BgYP9nZ2f/aGho/29vb/9vb2//W1tb/11dXf9hYWH/ZWVl/2lp + af9ubm7/c3Nz/3p6ev+AgID/h4eH/42Njf+UlJT/m5ub/6Ghof+oqKj/r6+v/7W1tf+8vLz/wsLC/8nJ + yf/Ozs7x////Aejo6Dfn5+f/5eXl/+Pj4//h4eH/39/f/9zc3P/Z2dn/1tbW/9LS0v/Ozs7/ycnJ/8TE + xP+/v7//uLi4/7Gxsf+oqKj/nZ2d/5CQkP+AgID/ZmZm/0pKSv9XV1f/a2tr/3R0dP9xcXH/UlJS/1NT + U/84ODj/PT09/1tbW/9jY2P/aGho/25ubv91dXX/fHx8/4ODg/+Kior/kZGR/5mZmf+goKD/qKio/6+v + r/+3t7f/vr6+/8XFxf/Ly8vx////Aefn5zfm5ub/4+Pj/+Hh4f/f39//3Nzc/9ra2v/W1tb/09PT/87O + zv/Jycn/xMTE/76+vv+4uLj/sLCw/6ioqP+enp7/kJCQ/4GBgf9vb2//Xl5e/01NTf9VVVX/cXFx/42N + jf9xcXH/S0tL/zExMf8gICD/Hh4e/ygoKP9JSUn/XV1d/2NjY/9paWn/cXFx/3h4eP+AgID/iIiI/5CQ + kP+YmJj/oKCg/6mpqf+ysrL/urq6/8LCwv/Jycnx////AeXl5Tfk5OT/4uLi/9/f3//d3d3/2tra/9fX + 1//T09P/z8/P/8rKyv/FxcX/v7+//7i4uP+xsbH/qKio/5+fn/+RkZH/gYGB/2ZmZv9eXl7/WVlZ/2Nj + Y/9aWlr/i4uL/2tra/93d3f/VFRU/x0dHf8kJCT/Hh4e/x4eHv8eHh7/MjIy/1JSUv9eXl7/ZmZm/25u + bv91dXX/fn5+/4eHh/+QkJD/mZmZ/6Ojo/+tra3/tra2/7+/v//Gxsbx////AePj4zfi4uL/4ODg/93d + 3f/b29v/2NjY/9TU1P/Pz8//ysrK/8XFxf+/v7//uLi4/7Gxsf+pqan/n5+f/5OTk/+CgoL/ampq/0ZG + Rv9ISEj/YWFh/2VlZf9dXV3/cHBw/3Jycv/CwsL/jIyM/yQkJP8fHx//Hx8f/x4eHv8eHh7/HR0d/yEh + If8+Pj7/Wlpa/2NjY/9ra2v/dHR0/319ff+Hh4f/kZGR/5ycnP+np6f/s7Oz/7y8vP/FxcXx////AeLi + 4jfg4OD/3t7e/9vb2//Y2Nj/1dXV/9HR0f/Ly8v/xsbG/8DAwP+5ubn/srKy/6mpqf+fn5//kpKS/4SE + hP9zc3P/YWFh/0RERP9FRUX/ampq/3x8fP9WVlb/Xl5e/7e3t/+zs7P/KCgo/yIiIv8kJCT/JiYm/yIi + Iv8fHx//Hh4e/x4eHv8eHh7/KSkp/0xMTP9hYWH/ampq/3Nzc/99fX3/iIiI/5SUlP+ioqL/r6+v/7u7 + u//ExMTx////AeDg4Dff39//3Nzc/9nZ2f/V1dX/0dHR/8zMzP/Hx8f/wcHB/7q6uv+ysrL/qqqq/6Gh + of+Tk5P/hISE/3BwcP9lZWX/W1tb/15eXv9GRkb/fHx8/39/f/9hYWH/RERE/4iIiP8uLi7/IiIi/yMj + I/8lJSX/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x8fH/83Nzf/Wlpa/2dnZ/9xcXH/fX19/42N + jf+cnJz/q6ur/7m5uf/ExMTx////Ad/f3zfd3d3/2tra/9bW1v/R0dH/zc3N/8fHx//BwcH/u7u7/7Oz + s/+rq6v/oaGh/5aWlv+Hh4f/c3Nz/0pKSv9LS0v/XFxc/2ZmZv9GRkb/hISE/2JiYv+dnZ3/mpqa/xwc + HP8cHBz/IyMj/yYmJv8mJib/JSUl/yYmJv8mJib/JSUl/yMjI/8fHx//Hx8f/x4eHv8eHh7/JSUl/0VF + Rf9jY2P/dHR0/4aGhv+YmJj/qamp/7i4uP/ExMTx////Ad3d3Tfb29v/19fX/9LS0v/Ozs7/yMjI/8LC + wv+8vLz/tLS0/6ysrP+jo6P/l5eX/4mJif94eHj/ZmZm/0hISP9DQ0P/ZWVl/3Jycv89PT3/V1dX/5aW + lv/a2tr/Pj4+/yIiIv8kJCT/JiYm/yYmJv8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8kJCT/ISEh/x8f + H/8fHx//Hx8f/x8fH/8xMTH/YWFh/3BwcP+Li4v/paWl/7e3t//ExMTx////Advb2zfY2Nj/1NTU/8/P + z//Jycn/xMTE/729vf+1tbX/ra2t/6SkpP+ZmZn/jIyM/3t7e/9ra2v/X19f/1ZWVv9CQkL/cHBw/42N + jf9OTk7/ODg4/7S0tP9JSUn/IyMj/yIiIv8mJib/JiYm/yYmJv8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yMjI/8gICD/Hx8f/yAgIP8gICD/IiIi/zk5Of91dXX/paWl/7e3t//FxcXx////AdjY + 2DfV1dX/0NDQ/8vLy//FxcX/v7+//7e3t/+vr6//paWl/5ubm/+NjY3/fX19/1RUVP9OTk7/W1tb/2Rk + ZP8/Pz//i4uL/1xcXP+FhYX/h4eH/xsbG/8eHh7/ISEh/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IiIi/yAgIP8gICD/ICAg/yAgIP9jY2P/pqam/7q6 + uv/Gxsbx////AdXV1TfT09P/zc3N/8fHx//AwMD/ubm5/7CwsP+np6f/nJyc/4+Pj/+AgID/b29v/01N + Tf9AQED/YWFh/2xsbP83Nzf/VlZW/319ff/Y2Nj/aWlp/yEhIf8fHx//JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8lJSX/JiYm/yUlJf8lJSX/JSUl/yUlJf8gICD/ICAg/yAg + IP9YWFj/paWl/7+/v//IyMjx////AdPT0zfQ0ND/ysrK/8PDw/+7u7v/srKy/6mpqf+enp7/kZGR/4SE + hP90dHT/ZWVl/1RUVP8/Pz//aWlp/4qKiv9LS0v/NjY2/7u7u/+BgYH/JCQk/yEhIf8kJCT/JSUl/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JCQk/yAgIP9TU1P/paWl/8PDw//Ly8vx////AdDQ0DfNzc3/xsbG/76+vv+2trb/rKys/6Gh + of+UlJT/hoaG/2VlZf9VVVX/XV1d/2NjY/89PT3/hISE/2tra/9ubm7/YmJi/zY2Nv8jIyP/IiIi/yYm + Jv8lJSX/JCQk/yUlJf8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/yYmJv8lJSX/JiYm/yYmJv9sbGz/qKio/8fHx//Ozs7x////Ac3NzTfJycn/wsLC/7m5 + uf+vr6//pKSk/5eXl/+IiIj/dnZ2/1RUVP9BQUH/Xl5e/2pqav83Nzf/YWFh/2pqav+5ubn/pqam/yAg + IP8bGxv/IyMj/yQkJP8kJCT/JSUl/yUlJf8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JiYm/yUl + Jf8mJib/JiYm/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/xoaGv9iYmL/u7u7/8rKyv/Q0NDx////AcvL + yzfGxsb/vr6+/7Ozs/+np6f/mpqa/4uLi/96enr/bGxs/1hYWP8+Pj7/ZGRk/35+fv9UVFT/NjY2/6en + p/+4uLj/Jycn/yEhIf8iIiL/JCQk/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/HBwc/zU1Nf+vr6//xsbG/83N + zf/S0tLx////AcjIyDfDw8P/ubm5/62trf+goKD/kJCQ/3Z2dv9cXFz/Y2Nj/2NjY/9GRkb/cHBw/4GB + gf9dXV3/R0dH/0FBQf8wMDD/ICAg/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8lJSX/JiYm/yUlJf81NTX/Pz8//6mp + qf/ExMT/ysrK/8/Pz//V1dXx////AcbGxjfAwMD/tbW1/6ampv+Xl5f/g4OD/2JiYv9FRUX/X19f/2pq + av9BQUH/bm5u/1xcXP+VlZX/zc3N/yIiIv8YGBj/IyMj/yQkJP8kJCT/KCgo/0VFRf9jY2P/a2tr/11d + Xf89PT3/JiYm/yMjI/8jIyP/JCQk/yQkJP8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yAg + IP9HR0f/q6ur/8HBwf/Hx8f/zc3N/9LS0v/X19fx////AcTExDe+vr7/sbGx/6Kiov+Pj4//enp6/2Nj + Y/9AQED/Y2Nj/3Z2dv9eXl7/MTEx/4qKiv/Z2dn/Ozs7/yEhIf8kJCT/JCQk/yQkJP9kZGT/srKy/8rK + yv/Ly8v/zMzM/8zMzP/Kysr/qKio/1NTU/8kJCT/JCQk/yQkJP8kJCT/JSUl/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/IyMj/x0dHf+YmJj/wMDA/8bGxv/Ly8v/0NDQ/9XV1f/a2trx////AcTExDe9vb3/rq6u/5ub + m/92dnb/eXl5/2xsbP9VVVX/Y2Nj/5GRkf9XV1f/Nzc3/09PT/9OTk7/ICAg/yIiIv8kJCT/KSkp/4+P + j//MzMz/zMzM/8vLy//Ly8v/zMzM/8zMzP/MzMz/y8vL/8nJyf9/f3//JCQk/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8rKyv/ISEh/5GRkf+/v7//xcXF/8rKyv/Pz8//09PT/9jY2P/c3Nzx////AcTE + xDe9vb3/rq6u/4qKiv9SUlL/cHBw/3Jycv9UVFT/b29v/1paWv9+fn7/y8vL/y4uLv8bGxv/Hx8f/yMj + I/8kJCT/d3d3/8rKyv/Ly8v/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/8rKyv/Jycn/Y2Nj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8/Pz//mpqa/729vf/Dw8P/ycnJ/83Nzf/S0tL/1tbW/9ra + 2v/e3t7x////AcTExDe/v7//sbGx/42Njf9MTEz/cHBw/3p6ev9qamr/OTk5/3V1df/Q0ND/bW1t/yAg + IP8fHx//IyMj/yQkJP8xMTH/wMDA/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8rK + yv/Ly8v/srKy/ygoKP8kJCT/JCQk/yQkJP8kJCT/IiIi/xMTE/95eXn/u7u7/8PDw//IyMj/zc3N/9HR + 0f/W1tb/2dnZ/9zc3P/g4ODx////AcXFxTfAwMD/tbW1/5KSkv9qamr/ZWVl/5KSkv9lZWX/Ojo6/2ho + aP98fHz/ICAg/x8fH/8jIyP/JCQk/yQkJP9NTU3/zc3N/83Nzf/MzMz/zc3N/83Nzf/Nzc3/zc3N/83N + zf/MzMz/y8vL/8vLy//MzMz/y8vL/zg4OP8kJCT/JCQk/yQkJP8mJib/FRUV/29vb/+4uLj/wcHB/8fH + x//Nzc3/0dHR/9XV1f/Z2dn/3Nzc/9/f3//i4uLx////AcbGxjfBwcH/t7e3/4uLi/9vb2//aGho/29v + b/9paWn/srKy/zw8PP8jIyP/ICAg/yQkJP8jIyP/JCQk/yMjI/9MTEz/zMzM/8zMzP/MzMz/zMzM/83N + zf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/y8vL/zs7O/8jIyP/JCQk/yQkJP85OTn/gICA/7m5 + uf/AwMD/xsbG/8zMzP/R0dH/1dXV/9jY2P/b29v/39/f/+Hh4f/k5OTx////AcfHxzfDw8P/r6+v/4WF + hf99fX3/Pj4+/2VlZf+xsbH/qamp/yAgIP8fHx//JCQk/yQkJP8jIyP/JCQk/yQkJP8xMTH/wMDA/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/tra2/ykpKf8jIyP/IyMj/xIS + Ev9dXV3/tbW1/8DAwP/Gxsb/zMzM/9DQ0P/V1dX/2NjY/9zc3P/f39//4eHh/+Tk5P/m5ubx////AcnJ + yTfGxsb/rq6u/5CQkP+AgID/ODg4/3p6ev+tra3/JSUl/yAgIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/fn5+/83Nzf/MzMz/zc3N/83Nzf/MzMz/zc3N/83Nzf/MzMz/zMzM/8vLy//Kysr/bm5u/yQk + JP8kJCT/FhYW/01NTf+ysrL/wMDA/8bGxv/Ly8v/0NDQ/9TU1P/Y2Nj/29vb/9/f3//h4eH/4+Pj/+Xl + 5f/n5+fx////AczMzDfJycn/tLS0/4mJif9ZWVn/kZGR/05OTv8uLi7/Hx8f/yEhIf8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/Kysr/5iYmP/MzMz/zMzM/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8vL + y/+QkJD/Jycn/yMjI/81NTX/ZGRk/7S0tP/BwcH/xsbG/8vLy//Q0ND/1NTU/9jY2P/b29v/3t7e/+Hh + 4f/j4+P/5eXl/+fn5//p6enx////Ac/PzzfMzMz/vb29/11dXf+Ojo7/zs7O/zExMf8cHBz/ISEh/yIi + Iv8iIiL/NSIf/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/ygoKP9xcXH/vb29/8zMzP/Nzc3/zc3N/83N + zf/MzMz/ubm5/2pqav8nJyf/IyMj/xkZGf88PDz/ra2t/8HBwf/Gxsb/y8vL/9DQ0P/U1NT/2NjY/9vb + 2//e3t7/4ODg/+Pj4//l5eX/5+fn/+np6f/q6urx////AdLS0jfPz8//ysrK/62trf/Nzc3/OTk5/x8f + H/8hISH/IyMj/yIiIv9ZJBv/dCcZ/yIiIf8iIiL/IyMj/yMjI/8oIiH/IyIi/yMjI/8jIyP/Kysr/1NT + U/9vb2//fHx8/29vb/9OTk7/Kioq/yMjI/8jIyP/Gxsb/yoqKv+oqKj/wsLC/8fHx//MzMz/0NDQ/9TU + 1P/Y2Nj/29vb/97e3v/g4OD/4uLi/+Xl5f/n5+f/6enp/+rq6v/s7Ozx////AdXV1TfT09P/zs7O/7e3 + t/9CQkL/IiIi/yIiIv8kJCT/IiIi/00jHP+oKhP/SiMc/0MiHP9xJhj/WiQa/1wlG/9+KBj/LSMh/zEj + IP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yMjI/8vLy//TExM/6mpqf/Dw8P/yMjI/83N + zf/R0dH/1dXV/9jY2P/b29v/3t7e/+Dg4P/j4+P/5eXl/+fn5//o6Oj/6urq/+zs7P/t7e3x////AdnZ + 2TfW1tb/0tLS/7y8vP8zMzP/IyMj/yMjI/8iIiL/NyIe/50pFP8tIR//bSYZ/4knFv85Ix//TyQc/y4i + If9gJhv/XiUb/3ImGP9BIx7/KCMh/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/x4eHv8lJSX/o6Oj/8XF + xf/Kysr/zs7O/9LS0v/W1tb/2dnZ/9zc3P/e3t7/4ODg/+Pj4//l5eX/5+fn/+jo6P/q6ur/6+vr/+3t + 7f/u7u7x////Adzc3DfZ2dn/1dXV/7Gxsf8lJSX/IyMj/yMjI/8iIiL/JCEh/1gkG/97Jhb/aCQX/34n + F/95Jhf/aiUZ/3wmF/88Ix7/UCQc/20mGf9oJhr/bSYZ/zIjIP8iIiL/IyMj/yMjI/8jIyP/ISEh/xkZ + Gf+YmJj/yMjI/8zMzP/Q0ND/1NTU/9fX1//a2tr/3d3d/9/f3//h4eH/4+Pj/+Xl5f/n5+f/6Ojo/+rq + 6v/r6+v/7e3t/+7u7v/v7+/x////Ad/f3zfd3d3/2dnZ/8fHx/9OTk7/JCQk/yMjI/8iIiL/IiIi/yEh + If8pISD/QSMd/0QjHf9pJRn/ISAg/3QlF/9DIx3/WCQb/ywiIP84Ix//aiYa/2UmGv9TJRz/IiIi/yIi + Iv8rKyv/Pj4+/5WVlf/Ly8v/z8/P/9LS0v/V1dX/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXl/+fn + 5//p6en/6urq/+vr6//t7e3/7u7u/+/v7//w8PDx////AeHh4Tfg4OD/3d3d/9ra2v/V1dX/k5OT/zc3 + N/8iIiL/IiIi/yIiIv8hISH/ISEh/yQhIP9oJRn/cSQX/2glGf+EJxb/PiMe/0kjHP9BIx7/YiUa/28m + Gf8kIyL/IyMj/yIiIv8cHBz/kJCQ/87Ozv/S0tL/1dXV/9jY2P/b29v/3d3d/+Dg4P/i4uL/5OTk/+Xl + 5f/n5+f/6Ojo/+np6f/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fHx////AeTk5Dfj4+P/4ODg/97e + 3v/b29v/2dnZ/8vLy/91dXX/Kioq/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/1wkGv90Jhj/QyIc/4An + F/8mIiH/ZyYa/ygjIv8jIyP/JCQk/xQUFP99fX3/0dHR/9bW1v/Y2Nj/2tra/93d3f/f39//4uLi/+Tk + 5P/l5eX/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7u7u/+/v7//w8PD/8PDw//Hx8f/y8vLx////Aefn + 5zfm5ub/4+Pj/+Hh4f/g4OD/3t7e/9zc3P/Z2dn/t7e3/1paWv9PT0//NTU1/yIiIv8hISH/ISEh/yEh + If9UJBz/iSgW/0QjHf9yJhj/VCYd/yMjIv8nJyf/Nzc3/3Z2dv/S0tL/2dnZ/9vb2//e3t7/4ODg/+Li + 4v/k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fH/8vLy//Ly + 8v/z8/Px////Aenp6Tfp6en/5+fn/+Xl5f/j4+P/4uLi/+Dg4P/e3t7/3d3d/9vb2//a2tr/ysrK/0BA + QP8iIiL/IiIi/yIiIv8iIiL/KCIh/2snGv9RJR7/IyMi/yIiIv8bGxv/eXl5/9bW1v/d3d3/39/f/+Dg + 4P/i4uL/5OTk/+bm5v/n5+f/6Ojo/+np6f/q6ur/6+vr/+zs7P/t7e3/7u7u/+/v7//w8PD/8PDw//Hx + 8f/y8vL/8/Pz//Pz8//09PTx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Tk5P/j4+P/4eHh/+Dg + 4P/f39//3t7e/5SUlP8rKyv/IiIi/yIiIv8iIiL/IiIi/yMjI/8iIiL/IyMj/xYWFv9SUlL/1dXV/+Hh + 4f/i4uL/4+Pj/+Xl5f/m5ub/5+fn/+np6f/q6ur/6+vr/+zs7P/t7e3/7e3t/+7u7v/v7+//7+/v//Dw + 8P/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/19fXx////Ae3t7Tft7e3/7Ozs/+vr6//q6ur/6enp/+fn + 5//m5ub/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/IyMj/YmJi/yQkJP8jIyP/IyMj/yMjI/8kJCT/WFhY/11d + Xf/U1NT/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw + 8P/w8PD/8fHx//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/19fXx////Ae/v7zfu7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/7CwsP9HR0f/IyMj/yMj + I/+Dg4P/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//T09P/09PT/9fX1//X19f/29vbx////AfHx + 8Tfw8PD/7+/v/+/v7//u7u7/7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/6Ojo/+jo6P/n5+f/6Ojo/+jo + 6P/f39//kZGR/4GBgf/m5ub/6enp/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Hx8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//X19f/19fX/9vb2//b2 + 9v/29vbx////AfLy8jfy8vL/8fHx//Dw8P/w8PD/7+/v/+7u7v/u7u7/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//09PT/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//f39//39/fx////AfPz8zfz8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+/v + 7//u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//b29v/29vb/9/f3//f39//39/fx////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B7+/v8e/v7//u7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5OTk/+Pj4//h4eH/4ODg/97e3v/d3d3/29vb/9ra + 2v/Y2Nj/19fX/9XV1f/R0dH/zs7O/8vLy//Hx8f/xMTE/8HBwf++vr7/u7u7/7i4uP+1tbX/srKy/7Cw + sP+vr6//rq6u/62trf+urq7/r6+v/7CwsP+xsbH/s7Oz/7W1tf+3t7f/urq6/7y8vP+/v7//wcHB/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/0NDQ/9LS0v/V1dX/19fX/9nZ2f/c3Nz/3t7e/+Dg4Jf///8B////Ae/v + 7/Hu7u7/7e3t/+3t7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//l5eX/5OTk/+Li4v/h4eH/39/f/93d + 3f/c3Nz/2tra/9jY2P/W1tb/1dXV/9LS0v/Q0ND/zMzM/8jIyP/ExMT/wMDA/7y8vP+4uLj/tLS0/7Cw + sP+srKz/qKio/6Wlpf+kpKT/o6Oj/6Kiov+ioqL/o6Oj/6Wlpf+np6f/qKio/6qqqv+tra3/sLCw/7Oz + s/+2trb/uLi4/7u7u/++vr7/wcHB/8PDw//Gxsb/ycnJ/8vLy//Ozs7/0dHR/9TU1P/W1tb/2dnZ/9zc + 3P/e3t6X////Af///wHu7u7x7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/5+fn/+bm5v/l5eX/5OTk/+Li + 4v/g4OD/3t7e/93d3f/b29v/2dnZ/9fX1//U1NT/0tLS/9DQ0P/Nzc3/ycnJ/8bGxv/BwcH/vLy8/7e3 + t/+ysrL/rq6u/6ioqP+hoaH/k5OT/5iYmP+VlZX/lJSU/5SUlP+VlZX/lpaW/5iYmP+ampr/nJyc/5+f + n/+hoaH/paWl/6mpqf+srKz/r6+v/7Kysv+1tbX/uLi4/7u7u/++vr7/wcHB/8TExP/Hx8f/ysrK/87O + zv/R0dH/1NTU/9fX1//a2tr/3Nzcl////wH///8B7e3t8ezs7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm + 5v/k5OT/4+Pj/+Hh4f/f39//3t7e/9zc3P/a2tr/2NjY/9XV1f/T09P/0NDQ/87Ozv/Kysr/x8fH/8PD + w/+/v7//urq6/7W1tf+urq7/qKio/6Ghof+ZmZn/fX19/2RkZP94eHj/hoaG/4WFhf+Ghob/h4eH/4qK + iv+MjIz/jo6O/5GRkf+VlZX/mJiY/5ycnP+goKD/pKSk/6enp/+rq6v/rq6u/7Kysv+1tbX/uLi4/7u7 + u/+/v7//w8PD/8bGxv/Kysr/zs7O/9HR0f/U1NT/19fX/9ra2pf///8B////Aezs7PHr6+v/6urq/+np + 6f/o6Oj/5+fn/+Xl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9XV1f/S0tL/z8/P/8zM + zP/IyMj/xcXF/8HBwf+8vLz/uLi4/7Ozs/+tra3/pKSk/5ycnP+Tk5P/ioqK/2pqav9jY2P/ampq/3l5 + ef94eHj/eHh4/3p6ev99fX3/gYGB/4SEhP+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//o6Oj/6en + p/+rq6v/r6+v/7Kysv+2trb/urq6/76+vv/CwsL/xsbG/8rKyv/Nzc3/0dHR/9XV1f/X19eX////Af// + /wHq6urx6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra2v/Y2Nj/1tbW/9TU + 1P/R0dH/zs7O/8vLy//Hx8f/w8PD/7+/v/+6urr/tbW1/7CwsP+qqqr/oqKi/5iYmP+Ojo7/g4OD/3p6 + ev9oaGj/ZWVl/2dnZ/9tbW3/bGxs/21tbf9wcHD/c3Nz/3Z2dv96enr/fX19/4GBgf+FhYX/ioqK/46O + jv+Tk5P/l5eX/5ubm/+goKD/pKSk/6ioqP+srKz/sLCw/7W1tf+5ubn/vr6+/8LCwv/Gxsb/ysrK/87O + zv/S0tL/1dXVl////wH///8B6enp8ejo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra + 2v/Y2Nj/1tbW/9PT0//R0dH/zs7O/8rKyv/Hx8f/w8PD/76+vv+5ubn/s7Oz/66urv+oqKj/oKCg/5aW + lv+MjIz/gICA/3Z2dv9ubm7/Z2dn/2tra/9tbW3/Y2Nj/2JiYv9jY2P/Z2dn/2pqav9tbW3/cHBw/3Nz + c/93d3f/fHx8/4CAgP+FhYX/ioqK/46Ojv+Tk5P/mJiY/52dnf+hoaH/pqam/6urq/+vr6//tLS0/7m5 + uf+9vb3/wsLC/8bGxv/Ly8v/z8/P/9LS0pf///8B////Aejo6PHn5+f/5ubm/+Xl5f/j4+P/4uLi/+Dg + 4P/f39//3d3d/9ra2v/Y2Nj/1tbW/9PT0//Q0ND/zc3N/8rKyv/Hx8f/w8PD/76+vv+4uLj/s7Oz/62t + rf+mpqb/n5+f/5SUlP+Kior/eHh4/1dXV/9fX1//Z2dn/2lpaf9vb2//dHR0/2VlZf9aWlr/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9qamr/bm5u/3Nzc/93d3f/fHx8/4GBgf+Ghob/i4uL/5CQkP+VlZX/mpqa/5+f + n/+kpKT/qqqq/6+vr/+0tLT/ubm5/76+vv/Dw8P/yMjI/8zMzP/Pz8+X////Af///wHo6Ojx5ubm/+Xl + 5f/k5OT/4uLi/+Dg4P/f39//3d3d/9vb2//Y2Nj/1tbW/9PT0//Q0ND/zc3N/8nJyf/Gxsb/wsLC/729 + vf+4uLj/s7Oz/62trf+mpqb/nZ2d/5SUlP+IiIj/fHx8/2JiYv9MTEz/TExM/2JiYv9sbGz/cXFx/3Z2 + dv9jY2P/UlJS/1RUVP9PT0//NDQ0/0xMTP9eXl7/YmJi/2ZmZv9qamr/b29v/3Nzc/95eXn/fn5+/4OD + g/+JiYn/jo6O/5SUlP+ZmZn/np6e/6SkpP+qqqr/r6+v/7W1tf+6urr/v7+//8XFxf/Jycn/zc3Nl/// + /wH///8B5+fn8eXl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/1tbW/9PT0//Q0ND/zc3N/8nJ + yf/FxcX/wcHB/729vf+4uLj/s7Oz/62trf+mpqb/np6e/5SUlP+IiIj/fHx8/3BwcP9dXV3/TExM/0dH + R/9kZGT/b29v/319ff+CgoL/YWFh/0xMTP9JSUn/JCQk/xwcHP8gICD/NjY2/1RUVP9eXl7/YmJi/2Zm + Zv9ra2v/cHBw/3Z2dv97e3v/gYGB/4eHh/+MjIz/kpKS/5iYmP+enp7/pKSk/6urq/+xsbH/t7e3/7y8 + vP/CwsL/x8fH/8vLy5f///8B////Aebm5vHk5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9TU + 1P/R0dH/zc3N/8rKyv/Gxsb/wcHB/729vf+4uLj/s7Oz/6ysrP+mpqb/np6e/5WVlf+JiYn/fn5+/3Bw + cP9iYmL/W1tb/1dXV/9NTU3/ZWVl/3l5ef+Xl5f/ampq/2xsbP9GRkb/JSUl/xsbG/8vLy//Hh4e/x4e + Hv8kJCT/QkJC/1hYWP9eXl7/Y2Nj/2hoaP9ubm7/c3Nz/3l5ef9/f3//hYWF/4yMjP+SkpL/mJiY/5+f + n/+mpqb/ra2t/7Ozs/+6urr/v7+//8XFxf/JycmX////Af///wHk5OTx4+Pj/+Hh4f/f39//3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zs7O/8rKyv/Gxsb/wsLC/729vf+4uLj/s7Oz/62trf+mpqb/n5+f/5WV + lf+Kior/fX19/2FhYf9eXl7/VlZW/1paWv9mZmb/VlZW/21tbf+Wlpb/Z2dn/2xsbP+Ghob/RERE/xsb + G/8mJib/HBwc/x4eHv8eHh7/Hh4e/x4eHv8sLCz/TExM/1paWv9gYGD/ZmZm/2xsbP9xcXH/d3d3/35+ + fv+EhIT/i4uL/5KSkv+ampr/oaGh/6ioqP+wsLD/t7e3/729vf/Dw8P/yMjIl////wH///8B4+Pj8eHh + 4f/g4OD/3t7e/9zc3P/a2tr/2NjY/9XV1f/S0tL/zs7O/8rKyv/Hx8f/wsLC/729vf+4uLj/s7Oz/66u + rv+np6f/n5+f/5eXl/+Kior/fn5+/2dnZ/9ISEj/QUFB/1FRUf9jY2P/ampq/01NTf+EhIT/bm5u/2Vl + Zf+IiIj/5eXl/39/f/8jIyP/Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/HR0d/x8fH/83Nzf/VFRU/15e + Xv9kZGT/aWlp/3BwcP92dnb/fX19/4SEhP+MjIz/k5OT/5ycnP+kpKT/rKys/7S0tP+8vLz/wsLC/8fH + x5f///8B////AeLi4vHg4OD/3t7e/9zc3P/a2tr/2NjY/9bW1v/T09P/z8/P/8vLy//Hx8f/w8PD/76+ + vv+5ubn/s7Oz/62trf+np6f/n5+f/5aWlv+MjIz/f39//3Jycv9fX1//SUlJ/zo6Ov9XV1f/aWlp/3Bw + cP9PT0//V1dX/11dXf+IiIj/39/f/7S0tP8nJyf/Jycn/yEhIf8lJSX/JCQk/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/yUlJf9ERET/W1tb/2JiYv9oaGj/b29v/3Z2dv99fX3/hYWF/42Njf+Wlpb/n5+f/6mp + qf+ysrL/urq6/8HBwf/GxsaX////Af///wHh4eHx39/f/93d3f/b29v/2NjY/9bW1v/T09P/0NDQ/8zM + zP/IyMj/w8PD/76+vv+5ubn/tLS0/66urv+np6f/oKCg/5aWlv+Li4v/gICA/3R0dP9nZ2f/XV1d/01N + Tf86Ojr/WVlZ/25ubv+Li4v/c3Nz/05OTv9dXV3/0dHR/8bGxv8uLi7/JiYm/yAgIP8kJCT/JSUl/yYm + Jv8lJSX/IiIi/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/zAwMP9RUVH/YWFh/2dnZ/9ubm7/dXV1/319 + ff+Ghob/kJCQ/5qamv+lpaX/r6+v/7m5uf/BwcH/xsbGl////wH///8B4ODg8d7e3v/b29v/2dnZ/9bW + 1v/T09P/0NDQ/8zMzP/IyMj/xMTE/7+/v/+6urr/tLS0/66urv+oqKj/oaGh/5iYmP+MjIz/gYGB/25u + bv9mZmb/Xl5e/1paWv9iYmL/SkpK/1lZWf+Ghob/hYWF/1hYWP9paWn/Ozs7/2xsbP81NTX/JiYm/yAg + IP8kJCT/JSUl/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x4eHv8eHh7/IiIi/z4+ + Pv9bW1v/ZGRk/2tra/90dHT/fn5+/4qKiv+Wlpb/oaGh/62trf+3t7f/wcHB/8bGxpf///8B////Ad7e + 3vHc3Nz/2tra/9fX1//U1NT/0NDQ/8zMzP/IyMj/xMTE/8DAwP+7u7v/tbW1/6+vr/+oqKj/oaGh/5mZ + mf+Ojo7/goKC/3Jycv9OTk7/RUVF/1RUVP9dXV3/ZmZm/0ZGRv9qamr/ioqK/1RUVP99fX3/tLS0/4CA + gP8bGxv/HR0d/x4eHv8jIyP/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/KSkp/0pKSv9fX1//ampq/3d3d/+EhIT/kpKS/5+fn/+rq6v/tra2/8DA + wP/Hx8eX////Af///wHd3d3x2tra/9fX1//U1NT/0dHR/83Nzf/Jycn/xcXF/8DAwP+7u7v/tra2/7Cw + sP+qqqr/oqKi/5qamv+QkJD/hISE/3d3d/9nZ2f/TExM/zw8PP9SUlL/ZGRk/2pqav9BQUH/Wlpa/1RU + VP97e3v/ra2t/+rq6v9OTk7/IiIi/xsbG/8kJCT/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/NjY2/11dXf9ycnL/f39//4yM + jP+cnJz/qamp/7W1tf/AwMD/x8fHl////wH///8B29vb8djY2P/V1dX/0tLS/87Ozv/Kysr/xsbG/8HB + wf+8vLz/t7e3/7Gxsf+qqqr/pKSk/5ycnP+SkpL/h4eH/3p6ev9tbW3/YWFh/05OTv82Njb/VFRU/2lp + af94eHj/bGxs/zMzM/9fX1//pKSk/+/v7/9gYGD/JCQk/yAgIP8kJCT/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8mJib/Tk5O/1xcXP9oaGj/k5OT/6enp/+0tLT/wMDA/8fHx5f///8B////AdnZ2fHW1tb/09PT/8/P + z//Ly8v/x8fH/8LCwv+9vb3/t7e3/7Kysv+rq6v/pKSk/52dnf+Tk5P/iIiI/3t7e/9vb2//ZWVl/1xc + XP9cXFz/SkpK/09PT/92dnb/l5eX/1lZWf9GRkb/MTEx/6enp/9tbW3/IiIi/yAgIP8iIiL/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JCQk/yIi + Iv8fHx//Hx8f/yAgIP8gICD/ICAg/yAgIP8pKSn/Wlpa/46Ojv+np6f/tbW1/8HBwf/Hx8eX////Af// + /wHX19fx1NTU/9DQ0P/MzMz/yMjI/8PDw/++vr7/ubm5/7Ozs/+srKz/paWl/52dnf+UlJT/iYmJ/319 + ff9cXFz/SkpK/1lZWf9aWlr/Y2Nj/0xMTP9TU1P/k5OT/2BgYP9sbGz/i4uL/2BgYP8YGBj/Hh4e/yEh + If8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8lJSX/JCQk/yEhIf8gICD/ICAg/yAgIP8gICD/ICAg/zQ0NP+QkJD/qKio/7e3 + t//Dw8P/yMjIl////wH///8B1dXV8dLS0v/Ozs7/ycnJ/8XFxf/AwMD/urq6/7S0tP+urq7/p6en/5+f + n/+VlZX/i4uL/39/f/9xcXH/UVFR/zw8PP9OTk7/YWFh/2dnZ/9ISEj/UVFR/2lpaf9kZGT/ioqK/+fn + 5/+NjY3/Hh4e/xgYGP8fHx//JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/IyMj/yAgIP8gICD/ICAg/yEh + If8uLi7/jo6O/6urq/+7u7v/xcXF/8nJyZf///8B////AdPT0/HPz8//y8vL/8bGxv/BwcH/u7u7/7W1 + tf+vr6//qKio/6CgoP+Wlpb/jY2N/4GBgf91dXX/aWlp/1NTU/82Njb/TU1N/2dnZ/9vb2//Y2Nj/yoq + Kv9SUlL/hoaG/9/f3/+pqan/JSUl/yQkJP8gICD/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/ISEh/yAgIP8gICD/Jycn/4ODg/+qqqr/wMDA/8fHx//Ly8uX////Af///wHR0dHxzc3N/8jI + yP/Dw8P/vb29/7e3t/+wsLD/qqqq/6Kiov+YmJj/jo6O/4SEhP93d3f/bW1t/2NjY/9aWlr/R0dH/0hI + SP9tbW3/jIyM/3R0dP8vLy//MjIy/6+vr//AwMD/Jycn/yYmJv8gICD/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8kJCT/ICAg/yUlJf+EhIT/ra2t/8PDw//Jycn/zc3Nl/// + /wH///8Bz8/P8cvLy//Gxsb/wMDA/7q6uv+zs7P/rKys/6SkpP+bm5v/kZGR/4aGhv9xcXH/VVVV/19f + X/9dXV3/YmJi/1ZWVv8/Pz//h4eH/4GBgf9TU1P/cHBw/zc3N/8nJyf/R0dH/yQkJP8hISH/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf81NTX/i4uL/6+v + r//Gxsb/y8vL/8/Pz5f///8B////Ac3NzfHIyMj/w8PD/7y8vP+1tbX/rq6u/6ampv+dnZ3/kpKS/4eH + h/96enr/WVlZ/0RERP9NTU3/Xl5e/2dnZ/9UVFT/QUFB/4uLi/9PT0//fHx8/7y8vP/Gxsb/Hh4e/xgY + GP8dHR3/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/SUlJ/4+Pj/+4uLj/ycnJ/83Nzf/R0dGX////Af///wHLy8vxxcXF/7+/v/+4uLj/sLCw/6io + qP+fn5//lZWV/4mJif98fHz/b29v/1paWv8/Pz//SEhI/2VlZf9ra2v/YmJi/yQkJP9JSUn/enp6/7Gx + sf/k5OT/QEBA/yMjI/8dHR3/ISEh/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8kJCT/ERER/y8vL/+rq6v/xcXF/8rKyv/Pz8//0tLSl////wH///8BycnJ8cPD + w/+8vLz/tLS0/6urq/+ioqL/l5eX/4yMjP9/f3//c3Nz/2lpaf9eXl7/RERE/0VFRf9paWn/fHx8/4uL + i/8nJyf/Ojo6/5ycnP/o6Oj/UlJS/yIiIv8gICD/IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/FhYW/ywsLP+fn5//wsLC/8jIyP/MzMz/0NDQ/9TU + 1Jf///8B////AcbGxvHAwMD/ubm5/7CwsP+mpqb/m5ub/4+Pj/+AgID/YmJi/2ZmZv9kZGT/YWFh/2Bg + YP84ODj/d3d3/5SUlP9WVlb/W1tb/ygoKP87Ozv/XV1d/yEhIf8fHx//IiIi/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8nJyf/Kysr/ygoKP+ZmZn/wMDA/8bG + xv/Kysr/zs7O/9LS0v/W1taX////Af///wHFxcXxvr6+/7W1tf+rq6v/oKCg/5OTk/+Ghob/a2tr/0tL + S/9MTEz/YWFh/2ZmZv9hYWH/NjY2/5KSkv9dXV3/aWlp/5KSkv/FxcX/ISEh/yEhIf8bGxv/IiIi/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JiYm/ysrK/8rKyv/KCgo/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/NTU1/2tr + a/+jo6P/v7+//8TExP/IyMj/zMzM/9HR0f/V1dX/2NjYl////wH///8Bw8PD8bu7u/+xsbH/pqam/5qa + mv+MjIz/fHx8/2ZmZv9JSUn/RkZG/2RkZP9sbGz/Z2dn/ycnJ/9UVFT/YmJi/4uLi//p6en/hoaG/x8f + H/8bGxv/ICAg/yUlJf8kJCT/IyMj/ygoKP9OTk7/f39//6Ghof+ysrL/s7Oz/6ioqP+Pj4//YmJi/zMz + M/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yUl + Jf8lJSX/HBwc/xkZGf+Li4v/vLy8/8LCwv/Gxsb/y8vL/8/Pz//T09P/19fX/9nZ2Zf///8B////AcLC + wvG5ubn/r6+v/6Ojo/+Wlpb/hoaG/3d3d/9nZ2f/SkpK/0VFRf9qamr/dHR0/5CQkP8uLi7/Nzc3/4CA + gP/j4+P/m5ub/x0dHf8hISH/IiIi/yYmJv8kJCT/IyMj/0hISP+lpaX/ycnJ/8vLy//Ly8v/y8vL/8zM + zP/MzMz/zc3N/83Nzf++vr7/cnJy/yoqKv8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/IiIi/xEREf9/f3//u7u7/8LCwv/Gxsb/ycnJ/83Nzf/R0dH/1dXV/9jY + 2P/b29uX////Af///wHBwcHxuLi4/62trf+hoaH/h4eH/35+fv94eHj/bGxs/2hoaP9BQUH/bGxs/5OT + k/92dnb/RkZG/yQkJP9LS0v/lZWV/yAgIP8iIiL/ICAg/yUlJf8kJCT/JCQk/2lpaf/Gxsb/zc3N/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/y8vL/8rKyv+np6f/Nzc3/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/IyMj/wwMDP93d3f/uLi4/8HBwf/FxcX/ycnJ/8zM + zP/Q0ND/1NTU/9fX1//a2tr/3Nzcl////wH///8BwcHB8be3t/+srKz/mJiY/2FhYf9VVVX/eXl5/3Bw + cP9ubm7/Ojo6/4WFhf9+fn7/UFBQ/35+fv+bm5v/Jycn/zAwMP8bGxv/HR0d/yMjI/8kJCT/IyMj/19f + X//Gxsb/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8rKyv/Kysr/ycnJ/6Oj + o/8rKyv/IyMj/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/MjIy/1lZWf+AgID/t7e3/8DA + wP/ExMT/yMjI/8vLy//Pz8//0tLS/9bW1v/Z2dn/29vb/97e3pf///8B////AcLCwvG5ubn/ra2t/5WV + lf9fX1//SkpK/3l5ef90dHT/c3Nz/zIyMv9qamr/TU1N/3x8fP/CwsL/ycnJ/ywsLP8aGhr/Gxsb/yIi + Iv8jIyP/JCQk/zU1Nf+2trb/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vL + y//Kysr/ysrK/8rKyv/Kysr/c3Nz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8kJCT/ISEh/xUV + Ff9zc3P/s7Oz/7+/v//Dw8P/x8fH/8vLy//Ozs7/0tLS/9XV1f/Y2Nj/2tra/93d3f/f39+X////Af// + /wHDw8Pxu7u7/6+vr/+Wlpb/X19f/0dHR/96enr/enp6/4mJif9DQ0P/Pj4+/3Z2dv+0tLT/2dnZ/zk5 + Of8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP9paWn/zMzM/83Nzf/MzMz/zMzM/83Nzf/Nzc3/zs7O/83N + zf/Nzc3/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/zMzM/7Ozs/8rKyv/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8kJCT/ISEh/w0NDf9RUVH/r6+v/76+vv/CwsL/x8fH/8rKyv/Ozs7/0dHR/9TU1P/X19f/2tra/9zc + 3P/f39//4eHhl////wH///8Bw8PD8b29vf+zs7P/mZmZ/3V1df9VVVX/c3Nz/4qKiv+Tk5P/RERE/zAw + MP9qamr/09PT/0NDQ/8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/kJCQ/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/83Nzf/MzMz/zMzM/8vLy//Ly8v/zMzM/83Nzf/Jycn/PDw8/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IyMj/w4ODv9KSkr/qamp/729vf/BwcH/xsbG/8rKyv/Ozs7/0dHR/9TU + 1P/X19f/2tra/9zc3P/e3t7/4eHh/+Li4pf///8B////AcPDw/G9vb3/tra2/5aWlv9/f3//UFBQ/3R0 + dP+Xl5f/UlJS/29vb/92dnb/ISEh/y8vL/8fHx//Hx8f/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/5iY + mP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/0dHR/8kJCT/JCQk/yQkJP8kJCT/KSkp/0RERP9WVlb/q6ur/7y8vP/AwMD/xcXF/8rK + yv/Nzc3/0dHR/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OSX////Af///wHFxcXxvr6+/7Oz + s/+Hh4f/goKC/0xMTP9wcHD/V1dX/2pqav+Tk5P/7u7u/1NTU/8eHh7/GRkZ/yQkJP8lJSX/JCQk/yQk + JP8kJCT/JCQk/yQkJP+Ghob/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8bGxv87Ozv/JCQk/yQkJP8kJCT/IyMj/xoaGv9ZWVn/pKSk/7y8 + vP/AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXll/// + /wH///8BxsbG8cDAwP+oqKj/hYWF/4qKiv9fX1//Pj4+/2hoaP+Ojo7/6enp/3V1df8dHR3/ICAg/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/VlZW/8vLy//Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy/+pqan/KCgo/yQkJP8kJCT/IiIi/xIS + Ev8vLy//oqKi/7u7u//AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li + 4v/k5OT/5eXl/+bm5pf///8B////AcjIyPHDw8P/qKio/4qKiv+cnJz/X19f/zMzM/+CgoL/1tbW/4eH + h/8eHh7/ICAg/yEhIf8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/ysrK/+np6f/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Jycn/YWFh/yQk + JP8kJCT/IyMj/xUVFf8mJib/lZWV/7u7u//AwMD/xMTE/8nJyf/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb + 2//e3t7/4ODg/+Li4v/j4+P/5eXl/+fn5//o6OiX////Af///wHKysrxxcXF/6qqqv+bm5v/cnJy/1ZW + Vv9iYmL/MzMz/0NDQ/8qKir/ISEh/yAgIP8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/R0dH/729vf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vL + y//Kysr/kZGR/ycnJ/8kJCT/JSUl/zY2Nv8zMzP/lpaW/7u7u//AwMD/xMTE/8jIyP/MzMz/0NDQ/9PT + 0//W1tb/2dnZ/9vb2//d3d3/4ODg/+Li4v/j4+P/5eXl/+bm5v/o6Oj/6enpl////wH///8By8vL8cfH + x/+1tbX/e3t7/1BQUP9/f3//0dHR/4WFhf8mJib/GRkZ/x8fH/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP9LS0v/tbW1/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/8zMzP/IyMj/j4+P/y4uLv8kJCT/IyMj/yIiIv9LS0v/lJSU/729vf/BwcH/xcXF/8jI + yP/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5eXl/+bm5v/o6Oj/6enp/+rq + 6pf///8B////Ac7OzvHKysr/urq6/1lZWf96enr/xcXF/7y8vP8kJCT/Hx8f/x0dHf8iIiL/IiIi/yIi + Iv8oIiH/PiId/yMiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/zMzM/+Dg4P/v7+//8vL + y//Nzc3/zc3N/83Nzf/Nzc3/zMzM/8rKyv+srKz/XV1d/yYmJv8kJCT/IyMj/xsbG/8UFBT/goKC/7u7 + u//CwsL/xcXF/8nJyf/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm + 5v/o6Oj/6enp/+rq6v/r6+uX////Af///wHQ0NDxzc3N/8nJyf+wsLD/t7e3/9LS0v8oKCj/ICAg/x0d + Hf8jIyP/IyMj/yIiIv8jISH/gicW/3UnGf8jIiH/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/zAwMP9dXV3/fX19/5OTk/+ZmZn/jo6O/29vb/9HR0f/Jycn/yQkJP8kJCT/IyMj/x0d + Hf8NDQ3/dXV1/7q6uv/CwsL/xsbG/8rKyv/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh + 4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozsl////wH///8B09PT8dDQ0P/MzMz/xcXF/3Z2 + dv88PDz/Hx8f/x8fH/8lJSX/IyMj/yIiIv8iISH/dyYX/44oFv8lIiH/IiIi/yQhIf88Ih7/KCIh/y0i + IP9gJRr/aCYa/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/IyMj/y0tLf8bGxv/cnJy/7i4uP/Dw8P/xsbG/8rKyv/Ozs7/0dHR/9TU1P/W1tb/2dnZ/9vb + 2//d3d3/39/f/+Hh4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozs/+3t7Zf///8B////AdXV + 1fHS0tL/z8/P/8jIyP9kZGT/NDQ0/yMjI/8kJCT/IyMj/yIiIv8iISH/aCQY/5cpFf+RKBX/fSYW/3kl + Fv+WKBT/jykW/3slFv9uJhn/UyUd/1omHf9GJB3/WSQa/ygiIf8jIyL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/IyMj/yIiIv9FRUX/gICA/729vf/ExMT/x8fH/8vLy//Ozs7/0dHR/9TU + 1P/X19f/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t + 7f/u7u6X////Af///wHY2Njx1dXV/9LS0v/Ly8v/UlJS/ycnJ/8iIiL/IyMj/yIiIv8iIiL/RiMd/7Yr + Ev8zIR7/JiAg/2QlGv+SKBX/LSIg/ykhIP9GIx3/KCIh/2ImG/9EJB7/aSYZ/2IkGf94Jhj/NiMf/yci + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yAgIP8MDAz/Xl5e/7e3t//FxcX/ycnJ/8zM + zP/Pz8//0tLS/9XV1f/X19f/2tra/9zc3P/e3t7/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+np + 6f/r6+v/7Ozs/+3t7f/u7u7/7+/vl////wH///8B2tra8dfX1//U1NT/ysrK/z4+Pv8iIiL/IyMj/yMj + I/8iIiL/IiIi/yUhIP9dJRv/kicU/1QiGf9QIhn/oyoU/0QiHP+TKBT/fScX/4YmFf9eJRr/LiIg/2ol + Gf+DJxf/bCYZ/2UmG/9yJhj/LCIh/yMiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8NDQ3/TExM/7i4 + uP/IyMj/y8vL/83Nzf/Q0ND/09PT/9bW1v/Z2dn/29vb/93d3f/e3t7/4ODg/+Hh4f/j4+P/5OTk/+bm + 5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v75f///8B////Ad3d3fHa2tr/19fX/83N + zf8/Pz//IyMj/yQkJP8jIyP/IyMj/yIiIv8hISH/ISEh/y4hH/9tJhn/gScX/0cjHf+aKRT/OiIe/yEh + If9LIxz/fScX/yUhIf8tIiD/KiIg/1clHP9HIx3/bSca/2smGv88Ix7/LCMh/yMjI/8jIyP/IyMj/ycn + J/8WFhb/RkZG/7S0tP/Kysr/zc3N/8/Pz//S0tL/1NTU/9fX1//a2tr/3Nzc/97e3v/f39//4eHh/+Li + 4v/j4+P/5eXl/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v7//w8PCX////Af// + /wHf39/x3d3d/9ra2v/Y2Nj/vr6+/1xcXP8lJSX/IyMj/yMjI/8iIiL/IiIi/yIiIv8hISH/ISEh/yEh + If8nISD/likV/zAhHv8nIB//iSYU/1skG/92JRf/aCUZ/yIiIf8iIiH/RyMd/3QmGP9dJRv/ayca/zUk + IP8jIyP/IiIi/yMjI/9GRkb/a2tr/7m5uf/Nzc3/z8/P/9HR0f/U1NT/1tbW/9jY2P/b29v/3d3d/9/f + 3//g4OD/4uLi/+Pj4//k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHxl////wH///8B4eHh8d/f3//d3d3/29vb/9nZ2f/W1tb/paWl/0dHR/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8hISH/ISEh/zkiHv99Jhb/hyYV/14kGv9tJBf/gicX/yQhIP8+Ih3/fCYX/0Ij + Hv9YJRz/hSgX/ykjIv8jIyP/IyMj/yMjI/8TExP/NjY2/62trf/Q0ND/0tLS/9TU1P/W1tb/2NjY/9ra + 2v/c3Nz/3t7e/+Dg4P/i4uL/4+Pj/+Tk5P/l5eX/5+fn/+jo6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8pf///8B////AePj4/Hh4eH/39/f/93d3f/c3Nz/2tra/9jY + 2P/Pz8//ioqK/zU1Nf8iIiL/IyMj/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/yIhIP9QIxv/qioT/y0h + H/82IR3/nCkU/zojH/8mIiH/YiUa/ysjIf8jIyL/IyMj/yQkJP8YGBj/KCgo/6urq//S0tL/1dXV/9fX + 1//Y2Nj/2tra/9zc3P/e3t7/4ODg/+Li4v/j4+P/5OTk/+Xl5f/n5+f/6Ojo/+jo6P/p6en/6urq/+vr + 6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vKX////Af///wHl5eXx5OTk/+Li + 4v/g4OD/39/f/93d3f/c3Nz/2tra/9jY2P/BwcH/aWlp/ygoKP8iIiL/IiIi/yIiIv8iIiL/ISEh/yEh + If8hISH/KSEg/1kkG/+LJxT/pykT/00kHf8kIiH/fCcX/3QoGv8kIyL/IyMj/yQkJP8cHBz/ICAg/6Cg + oP/U1NT/19fX/9nZ2f/b29v/3Nzc/97e3v/g4OD/4eHh/+Pj4//k5OT/5ubm/+fn5//o6Oj/6Ojo/+np + 6f/q6ur/6+vr/+zs7P/s7Oz/7e3t/+7u7v/v7+//7+/v//Dw8P/x8fH/8fHx//Ly8v/z8/P/8/Pzl/// + /wH///8B5+fn8ebm5v/l5eX/4+Pj/+Li4v/g4OD/39/f/97e3v/c3Nz/29vb/9jY2P+tra3/lpaW/5eX + l/9aWlr/JCQk/yIiIv8iIiL/ISEh/yEhIf8iISH/MiIg/10mG/91Jhj/fSYX/30oGf8mIyL/IyMj/yMj + I/9BQUH/WVlZ/6ampv/X19f/2tra/9zc3P/d3d3/39/f/+Dg4P/i4uL/4+Pj/+Tk5P/m5ub/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7u7u/+7u7v/v7+//8PDw//Dw8P/x8fH/8fHx//Ly + 8v/z8/P/8/Pz//T09Jf///8B////Aenp6fHo6Oj/5+fn/+bm5v/k5OT/4+Pj/+Li4v/h4eH/39/f/97e + 3v/d3d3/3Nzc/9vb2//b29v/1NTU/1VVVf8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8kIiL/UCUd/1cm + Hf8mIyL/IyMj/yIiIv8aGhr/ICAg/5WVlf/Z2dn/3d3d/97e3v/f39//4eHh/+Li4v/j4+P/5eXl/+bm + 5v/n5+f/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Hx + 8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/09PSX////Af///wHr6+vx6urq/+np6f/o6Oj/5+fn/+bm + 5v/l5eX/5OTk/+Pj4//i4uL/4eHh/9/f3//f39//3t7e/93d3f+Xl5f/KSkp/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/IyMj/yIiIv8eHh7/DQ0N/4ODg//Z2dn/4ODg/+Hh4f/i4uL/4+Pj/+Tk + 5P/l5eX/5ubm/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Hx8f/x8fH/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9fX1l////wH///8B7e3t8ezs + 7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm5v/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/39/f/7m5 + uf9YWFj/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8gICD/DQ0N/3p6ev/Z2dn/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/6Ojo/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+/v + 7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Pz8//z8/P/9PT0//T09P/19fX/9fX1//b2 + 9pf///8B////Ae7u7vHt7e3/7Ozs/+zs7P/r6+v/6urq/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/i4uL/39/f/6Kiov8+Pj7/IyMj/yMjI/8jIyP/IyMj/yIiIv9ZWVn/tLS0/6en + p//c3Nz/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9fX1//X19f/29vaX////Af///wHv7+/x7u7u/+7u7v/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq + 6v/p6en/6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/l5eX/2NjY/4ODg/8xMTH/IiIi/yIi + Iv9NTU3/19fX/+bm5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2l////wH///8B8PDw8fDw8P/v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/6+vr/+rq6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+fn5//n5+f/5+fn/+fn + 5//m5ub/xMTE/2VlZf9LS0v/0tLS/+jo6P/p6en/6enp/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8vLy//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//X19f/19fX/9fX1//b29v/29vb/9vb2//f395f///8B////AfHx + 8fHx8fH/8PDw//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+3t7f/s7Oz/7Ozs/+vr6//q6ur/6urq/+rq + 6v/p6en/6enp/+np6f/p6en/6enp/+rq6v/n5+f/4eHh/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//f3 + 9//39/eX////Af///wHy8vLx8vLy//Hx8f/x8fH/8PDw//Dw8P/w8PD/7+/v/+/v7//u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3l////wH///8B8/Pz8fPz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Dw + 8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+7u7v/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/+Pj4//j4+Jf///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wHw8PDj8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW + 1v/V1dX/09PT/9LS0v/Q0ND/zs7O/83Nzf/Ly8v/ysrK/8jIyP/Hx8f/xcXF/8TExP/CwsL/wcHB/8DA + wP++vr7/vb29/7u7u/+6urr/uLi4/7e3t/+1tbX/tLS0/7Ozs/+ysrL/sbGx/7Gxsf+wsLD/sLCw/7Cw + sP+wsLD/sLCw/7Gxsf+xsbH/sbGx/7Kysv+ysrL/srKy/7S0tP+0tLT/tbW1/7a2tv+3t7f/uLi4/7m5 + uf+7u7v/u7u7/729vf++vr7/wMDA/8HBwf/BwcH/w8PD/8TExP/FxcX/xsbG/8jIyP/Jycn/ysrK/8vL + y//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e + 3v/e3t7/39/f/+Hh4f/h4eEx////Af///wH///8B////AfDw8OPv7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/3Nzc/9vb + 2//a2tr/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/z8/P/83Nzf/MzMz/ysrK/8jI + yP/Hx8f/xcXF/8PDw//BwcH/wMDA/7+/v/+9vb3/vLy8/7q6uv+4uLj/t7e3/7W1tf+zs7P/srKy/7Cw + sP+vr6//rq6u/62trf+tra3/rKys/6urq/+rq6v/q6ur/6urq/+rq6v/rKys/62trf+tra3/ra2t/66u + rv+urq7/sLCw/7CwsP+ysrL/srKy/7Ozs/+1tbX/tra2/7e3t/+5ubn/urq6/7y8vP+9vb3/vr6+/7+/ + v//AwMD/wsLC/8PDw//ExMT/xcXF/8bGxv/IyMj/ycnJ/8vLy//MzMz/zc3N/87Ozv/Pz8//0dHR/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e3v/f39//39/f/+Dg4DH///8B////Af// + /wH///8B7+/v4+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/93d3f/d3d3/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT + 0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Gxsb/xcXF/8LCwv/BwcH/v7+//729vf+8vLz/urq6/7i4 + uP+2trb/tLS0/7Kysv+wsLD/rq6u/6ysrP+rq6v/qamp/6ioqP+np6f/p6en/6ampv+lpaX/paWl/6Wl + pf+lpaX/paWl/6ampv+mpqb/p6en/6ioqP+oqKj/qamp/6qqqv+rq6v/rKys/62trf+vr6//sLCw/7Gx + sf+ysrL/tLS0/7a2tv+2trb/uLi4/7m5uf+7u7v/vLy8/729vf+/v7//wMDA/8LCwv/CwsL/w8PD/8XF + xf/Gxsb/yMjI/8nJyf/Ly8v/zMzM/83Nzf/Pz8//0NDQ/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ + 2f/b29v/3Nzc/97e3v/e3t7/39/fMf///wH///8B////Af///wHv7+/j7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/Pz//Nzc3/y8vL/8rKyv/Hx8f/xsbG/8PD + w//BwcH/v7+//729vf+7u7v/ubm5/7e3t/+1tbX/s7Oz/7Gxsf+urq7/rKys/6mpqf+np6f/paWl/6Oj + o/+ioqL/oaGh/6CgoP+goKD/n5+f/5+fn/+fn5//n5+f/5+fn/+goKD/oaGh/6Ghof+ioqL/o6Oj/6Sk + pP+lpaX/pqam/6enp/+oqKj/qamp/6qqqv+srKz/ra2t/6+vr/+xsbH/srKy/7Ozs/+1tbX/tra2/7i4 + uP+5ubn/u7u7/7y8vP+9vb3/v7+//8DAwP/BwcH/w8PD/8TExP/FxcX/x8fH/8jIyP/Kysr/y8vL/8zM + zP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/97e3v/e3t4x////Af// + /wH///8B////Ae7u7uPu7u7/7u7u/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/h4eH/4ODg/9/f + 3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/P + z//Ozs7/zMzM/8rKyv/IyMj/x8fH/8TExP/CwsL/v7+//729vf+7u7v/uLi4/7e3t/+0tLT/srKy/7Cw + sP+tra3/qqqq/6enp/+lpaX/oaGh/6CgoP+dnZ3/m5ub/5qamv+ZmZn/mJiY/5iYmP+YmJj/mJiY/5iY + mP+YmJj/mZmZ/5qamv+bm5v/nJyc/52dnf+dnZ3/n5+f/6CgoP+hoaH/oqKi/6Ojo/+lpaX/pqam/6io + qP+qqqr/q6ur/62trf+urq7/sLCw/7Kysv+zs7P/tbW1/7a2tv+4uLj/ubm5/7u7u/+8vLz/vb29/7+/ + v//AwMD/wsLC/8PDw//ExMT/xsbG/8fHx//Jycn/y8vL/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV + 1f/X19f/2dnZ/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8B7u7u4+3t7f/t7e3/7e3t/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/c3Nz/2tra/9nZ2f/Z2dn/19fX/9bW + 1v/V1dX/1NTU/9PT0//S0tL/0dHR/8/Pz//Nzc3/zMzM/8rKyv/IyMj/x8fH/8XFxf/Dw8P/wcHB/76+ + vv+7u7v/ubm5/7a2tv+0tLT/sbGx/66urv+srKz/qamp/6ampv+jo6P/n5+f/5mZmf+BgYH/ioqK/5SU + lP+Tk5P/kZGR/5CQkP+QkJD/kJCQ/5CQkP+QkJD/kZGR/5GRkf+SkpL/k5OT/5WVlf+Wlpb/lpaW/5eX + l/+ZmZn/mpqa/5ycnP+dnZ3/np6e/6CgoP+ioqL/o6Oj/6ampv+np6f/qamp/6urq/+srKz/rq6u/6+v + r/+xsbH/s7Oz/7S0tP+2trb/t7e3/7m5uf+6urr/vLy8/729vf+/v7//wMDA/8HBwf/ExMT/xcXF/8fH + x//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29v/3NzcMf// + /wH///8B////Af///wHt7e3j7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/q6ur/6enp/+np + 6f/o6Oj/5+fn/+bm5v/m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Li4v/i4uL/4ODg/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//S0tL/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Jycn/yMjI/8bGxv/Dw8P/wsLC/8DAwP++vr7/u7u7/7m5uf+2trb/s7Oz/6+vr/+srKz/qamp/6en + p/+jo6P/n5+f/5ycnP+VlZX/fX19/2RkZP9paWn/enp6/4qKiv+Li4v/iYmJ/4mJif+JiYn/iYmJ/4qK + iv+Kior/i4uL/4yMjP+Ojo7/j4+P/5CQkP+RkZH/kpKS/5SUlP+VlZX/l5eX/5mZmf+ampr/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/p6en/6ioqP+rq6v/rKys/66urv+wsLD/sbGx/7Ozs/+0tLT/tra2/7i4 + uP+5ubn/u7u7/7y8vP++vr7/wMDA/8HBwf/Dw8P/xcXF/8fHx//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR + 0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29sx////Af///wH///8B////Ae3t7ePs7Oz/7Ozs/+vr + 6//r6+v/6urq/+rq6v/q6ur/6enp/+np6f/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/k5OT/4+Pj/+Pj + 4//i4uL/4eHh/+Dg4P/f39//3t7e/93d3f/d3d3/29vb/9vb2//Z2dn/2NjY/9jY2P/W1tb/1dXV/9PT + 0//T09P/0tLS/9DQ0P/Pz8//zc3N/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP++vr7/vLy8/7m5 + uf+3t7f/tLS0/7Kysv+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4CAgP9jY2P/YmJi/2Fh + Yf9iYmL/enp6/4ODg/+CgoL/gYGB/4GBgf+CgoL/goKC/4ODg/+EhIT/hoaG/4eHh/+IiIj/iYmJ/4uL + i/+MjIz/jo6O/4+Pj/+RkZH/k5OT/5WVlf+Xl5f/mZmZ/5qamv+dnZ3/n5+f/6Ghof+ioqL/pKSk/6am + pv+oqKj/qqqq/6urq/+tra3/r6+v/7Gxsf+ysrL/tLS0/7a2tv+4uLj/ubm5/7u7u/+9vb3/v7+//8HB + wf/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9nZ + 2TH///8B////Af///wH///8B7Ozs4+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo/+fn + 5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Pj4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/X19f/1tbW/9XV1f/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fH + x//FxcX/xMTE/8HBwf+/v7//vb29/7u7u/+5ubn/tra2/7S0tP+wsLD/ra2t/6qqqv+lpaX/oqKi/52d + nf+ZmZn/lJSU/5CQkP+MjIz/dnZ2/2FhYf9jY2P/YmJi/2FhYf92dnb/fX19/3x8fP98fHz/e3t7/3x8 + fP98fHz/fX19/35+fv+AgID/gYGB/4ODg/+EhIT/hYWF/4eHh/+JiYn/i4uL/4yMjP+Ojo7/kJCQ/5KS + kv+UlJT/lpaW/5mZmf+bm5v/nZ2d/56env+goKD/oqKi/6SkpP+mpqb/qKio/6qqqv+srKz/ra2t/7Cw + sP+xsbH/s7Oz/7W1tf+2trb/ubm5/7q6uv+9vb3/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW1v/X19f/2NjYMf///wH///8B////Af///wHr6+vj6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/39/f/9/f3//e3t7/3Nzc/9zc3P/b29v/2tra/9jY2P/X19f/19fX/9XV1f/V1dX/09PT/9LS + 0v/R0dH/z8/P/87Ozv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7y8vP+5ubn/t7e3/7W1 + tf+ysrL/r6+v/6ysrP+pqan/pKSk/5+fn/+bm5v/lpaW/5GRkf+MjIz/iIiI/4SEhP9ycnL/YWFh/2Rk + ZP9iYmL/YWFh/3Fxcf92dnb/dnZ2/3V1df91dXX/dXV1/3V1df92dnb/eHh4/3p6ev97e3v/fX19/39/ + f/+AgID/goKC/4ODg/+Ghob/h4eH/4mJif+Li4v/jY2N/5CQkP+SkpL/lJSU/5aWlv+YmJj/mpqa/5yc + nP+enp7/oKCg/6Kiov+kpKT/pqam/6ioqP+qqqr/rKys/66urv+wsLD/srKy/7Ozs/+2trb/uLi4/7q6 + uv+8vLz/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW + 1v/X19cx////Af///wH///8B////Aevr6+Pr6+v/6urq/+np6f/p6en/6Ojo/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3t7e/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/v7+//729vf+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+rq6v/p6en/6Ojo/+enp7/mZmZ/5SU + lP+Ojo7/iYmJ/4SEhP9/f3//fHx8/21tbf9iYmL/ZWVl/2NjY/9iYmL/bW1t/3BwcP9wcHD/b29v/29v + b/9vb2//b29v/3Fxcf9zc3P/dHR0/3Z2dv94eHj/enp6/3t7e/99fX3/fn5+/4CAgP+CgoL/hISE/4aG + hv+JiYn/i4uL/42Njf+Pj4//kZGR/5SUlP+Wlpb/mJiY/5qamv+cnJz/np6e/6CgoP+jo6P/paWl/6am + pv+pqan/qqqq/62trf+vr6//sbGx/7Ozs/+1tbX/t7e3/7m5uf+8vLz/vr6+/7+/v//CwsL/xMTE/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/T09P/1dXV/9bW1jH///8B////Af///wH///8B6urq4+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh + 4f/f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1dXV/9TU1P/S0tL/0dHR/9DQ + 0P/Ozs7/zc3N/8vLy//Jycn/x8fH/8XFxf/Dw8P/wcHB/7+/v/+9vb3/urq6/7e3t/+1tbX/s7Oz/7Cw + sP+tra3/qamp/6ampv+ioqL/nZ2d/5iYmP+Tk5P/jY2N/4eHh/+CgoL/fX19/3h4eP91dXX/a2tr/2Rk + ZP9mZmb/ZWVl/2NjY/9paWn/ampq/2lpaf9paWn/aWlp/2pqav9ra2v/bW1t/25ubv9wcHD/cnJy/3Nz + c/91dXX/d3d3/3l5ef96enr/fHx8/319ff9/f3//gYGB/4SEhP+Hh4f/iYmJ/4uLi/+NjY3/kJCQ/5KS + kv+UlJT/lpaW/5iYmP+bm5v/nZ2d/5+fn/+hoaH/o6Oj/6ampv+oqKj/qqqq/6ysrP+urq7/sLCw/7Ky + sv+1tbX/t7e3/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS + 0v/U1NT/1dXVMf///wH///8B////Af///wHq6urj6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+Xl + 5f/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9fX + 1//X19f/1tbW/9TU1P/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/s7Oz/7Gxsf+urq7/rKys/6mpqf+lpaX/oaGh/5ubm/+Xl5f/kZGR/4uL + i/+Ghob/gYGB/3x8fP92dnb/cnJy/29vb/9oaGj/ZWVl/2lpaf9qamr/ampq/2hoaP9kZGT/Y2Nj/2Nj + Y/9kZGT/ZWVl/2ZmZv9oaGj/aWlp/2tra/9tbW3/bm5u/3BwcP9xcXH/c3Nz/3V1df92dnb/eHh4/3p6 + ev98fHz/fn5+/4GBgf+EhIT/hoaG/4mJif+Li4v/jY2N/4+Pj/+RkZH/lJSU/5aWlv+ZmZn/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/qKio/6urq/+tra3/r6+v/7Kysv+0tLT/tra2/7m5uf+7u7v/vb29/7+/ + v//CwsL/xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT0//T09Mx////Af///wH///8B////Aenp + 6ePp6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f + 3//f39//3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/09PT/9LS0v/R0dH/z8/P/87O + zv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7Ozs/+wsLD/rq6u/6ur + q/+oqKj/pKSk/6CgoP+cnJz/lZWV/5CQkP+Li4v/hoaG/39/f/96enr/dnZ2/3Fxcf9ubm7/a2tr/2dn + Z/9nZ2f/a2tr/25ubv9ycnL/cHBw/2dnZ/9fX1//X19f/2BgYP9hYWH/YmJi/2RkZP9lZWX/Z2dn/2ho + aP9qamr/a2tr/21tbf9vb2//cHBw/3Jycv90dHT/dnZ2/3l5ef97e3v/fX19/4CAgP+CgoL/hYWF/4eH + h/+JiYn/i4uL/46Ojv+QkJD/k5OT/5WVlf+YmJj/mpqa/5ycnP+fn5//oaGh/6Ojo/+lpaX/qKio/6qq + qv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8fHx//Jycn/y8vL/83N + zf/Pz8//0dHR/9LS0jH///8B////Af///wH///8B6enp4+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl + 5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg4P/g4OD/3t7e/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX + 1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+ + vv+7u7v/uLi4/7W1tf+zs7P/sLCw/62trf+qqqr/p6en/6Ojo/+fn5//mpqa/5WVlf+Pj4//ioqK/4WF + hf97e3v/Y2Nj/11dXf9nZ2f/ampq/2pqav9nZ2f/Z2dn/2lpaf9sbGz/b29v/3Nzc/90dHT/b29v/1xc + XP9bW1v/XFxc/11dXf9eXl7/X19f/2FhYf9iYmL/ZGRk/2VlZf9nZ2f/aWlp/2pqav9sbGz/bW1t/29v + b/9xcXH/dHR0/3Z2dv94eHj/enp6/35+fv+AgID/goKC/4SEhP+Hh4f/ioqK/4yMjP+Ojo7/kZGR/5SU + lP+Wlpb/mJiY/5ubm/+dnZ3/oKCg/6Kiov+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5 + uf+7u7v/vr6+/8DAwP/CwsL/xcXF/8fHx//Kysr/zMzM/87Ozv/Q0ND/0NDQMf///wH///8B////Af// + /wHp6enj6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Kysr/yMjI/8fHx//FxcX/w8PD/8DAwP++vr7/u7u7/7i4uP+1tbX/s7Oz/7CwsP+tra3/qamp/6am + pv+ioqL/np6e/5qamv+UlJT/j4+P/4mJif+EhIT/fX19/2NjY/9QUFD/S0tL/01NTf9dXV3/ZWVl/2Vl + Zf9oaGj/a2tr/25ubv9wcHD/c3Nz/3R0dP9wcHD/Wlpa/1dXV/9YWFj/WVlZ/1paWv9bW1v/XV1d/15e + Xv9gYGD/YWFh/2JiYv9kZGT/ZmZm/2dnZ/9paWn/a2tr/21tbf9vb2//cnJy/3R0dP92dnb/eXl5/3t7 + e/9+fn7/gICA/4ODg/+Ghob/iIiI/4uLi/+NjY3/kJCQ/5OTk/+VlZX/mJiY/5qamv+dnZ3/n5+f/6Gh + of+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/t7e3/7m5uf+7u7v/vr6+/8HBwf/Dw8P/xsbG/8jI + yP/Kysr/zMzM/8/Pz//Q0NAx////Af///wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/+Dg4P/f39//3t7e/93d3f/c3Nz/2tra/9nZ2f/Y2Nj/19fX/9bW + 1v/U1NT/09PT/9HR0f/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7u7 + u/+4uLj/tbW1/7Ozs/+wsLD/ra2t/6qqqv+mpqb/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/goKC/319 + ff9ycnL/VFRU/09PT/9JSUn/RUVF/1VVVf9hYWH/ZGRk/2pqav9tbW3/cHBw/3Jycv90dHT/dXV1/3Bw + cP9XV1f/VFRU/1VVVf9WVlb/V1dX/1hYWP9XV1f/S0tL/0lJSf9YWFj/Xl5e/2BgYP9hYWH/Y2Nj/2Vl + Zf9nZ2f/aWlp/2tra/9tbW3/cHBw/3Jycv91dXX/d3d3/3p6ev98fHz/fn5+/4GBgf+EhIT/h4eH/4qK + iv+MjIz/j4+P/5GRkf+UlJT/l5eX/5mZmf+cnJz/np6e/6Ghof+kpKT/p6en/6qqqv+srKz/r6+v/7Ky + sv+0tLT/t7e3/7q6uv+9vb3/v7+//8HBwf/ExMT/xsbG/8nJyf/Ly8v/zs7O/8/PzzH///8B////Af// + /wH///8B6Ojo4+fn5//m5ub/5ubm/+Xl5f/k5OT/5OTk/+Pj4//i4uL/4eHh/+Dg4P/g4OD/39/f/97e + 3v/d3d3/3Nzc/9vb2//Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/y8vL/8nJ + yf/IyMj/xsbG/8TExP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+ysrL/sLCw/62trf+qqqr/pqam/6Gh + of+enp7/mZmZ/5OTk/+Ojo7/h4eH/4KCgv98fHz/dnZ2/2xsbP9VVVX/UVFR/0dHR/9DQ0P/UlJS/15e + Xv9nZ2f/bGxs/25ubv9xcXH/dHR0/3d3d/93d3f/cXFx/1NTU/9QUFD/UVFR/1JSUv9TU1P/UlJS/z4+ + Pv8fHx//Hh4e/zExMf9KSkr/Wlpa/15eXv9fX1//YmJi/2NjY/9lZWX/Z2dn/2lpaf9ra2v/bm5u/3Bw + cP9ycnL/dXV1/3h4eP96enr/fX19/4CAgP+Dg4P/hYWF/4iIiP+Li4v/jo6O/5CQkP+Tk5P/lpaW/5mZ + mf+bm5v/np6e/6Ghof+kpKT/p6en/6qqqv+tra3/r6+v/7Kysv+1tbX/uLi4/7q6uv+9vb3/wMDA/8PD + w//FxcX/x8fH/8rKyv/MzMz/zc3NMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4uLi/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9jY2P/X19f/1tbW/9TU + 1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vLy//Jycn/x8fH/8bGxv/ExMT/wcHB/8DAwP+9vb3/u7u7/7m5 + uf+1tbX/s7Oz/7CwsP+tra3/qqqq/6ampv+jo6P/np6e/5mZmf+UlJT/j4+P/4iIiP+CgoL/fHx8/3Z2 + dv9wcHD/ZmZm/1ZWVv9TU1P/RkZG/0JCQv9PT0//X19f/2lpaf9tbW3/b29v/3Jycv96enr/fn5+/3h4 + eP9xcXH/UVFR/01NTf9OTk7/T09P/09PT/9AQED/ISEh/xoaGv8bGxv/Hh4e/yYmJv88PDz/VFRU/1xc + XP9eXl7/YGBg/2FhYf9jY2P/ZWVl/2dnZ/9qamr/bGxs/25ubv9xcXH/dHR0/3d3d/96enr/fHx8/39/ + f/+BgYH/hISE/4eHh/+Kior/jY2N/5CQkP+Tk5P/lZWV/5mZmf+cnJz/np6e/6Kiov+kpKT/p6en/6qq + qv+tra3/sLCw/7Ozs/+2trb/ubm5/7y8vP+/v7//wcHB/8TExP/Gxsb/ycnJ/8zMzP/MzMwx////Af// + /wH///8B////Aefn5+Pm5ub/5ubm/+Tk5P/k5OT/4+Pj/+Li4v/i4uL/4eHh/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/19fX/9fX1//V1dX/1NTU/9LS0v/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//Gxsb/w8PD/8HBwf+/v7//vb29/7u7u/+4uLj/tbW1/7Kysv+wsLD/ra2t/6mpqf+mpqb/oqKi/5+f + n/+ZmZn/lJSU/46Ojv+IiIj/goKC/3t7e/92dnb/b29v/2lpaf9gYGD/WFhY/1VVVf9ERET/QUFB/0tL + S/9eXl7/a2tr/25ubv9xcXH/enp6/46Ojv+VlZX/fHx8/3Nzc/9PT0//SUlJ/0pKSv9LS0v/PDw8/xsb + G/8TExP/HBwc/x4eHv8dHR3/Hh4e/x4eHv8oKCj/QEBA/1VVVf9bW1v/XV1d/19fX/9hYWH/Y2Nj/2Vl + Zf9oaGj/ampq/21tbf9wcHD/cnJy/3V1df94eHj/e3t7/319ff+AgID/g4OD/4aGhv+JiYn/jIyM/4+P + j/+SkpL/lZWV/5iYmP+bm5v/np6e/6Ghof+kpKT/qKio/6urq/+urq7/sbGx/7W1tf+3t7f/urq6/729 + vf/AwMD/w8PD/8XFxf/IyMj/y8vL/8vLyzH///8B////Af///wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj + 4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9jY2P/X19f/1dXV/9TU + 1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJyf/IyMj/xcXF/8TExP/BwcH/v7+//729vf+7u7v/uLi4/7W1 + tf+zs7P/r6+v/6ysrP+pqan/pqam/6Ojo/+fn5//mpqa/5SUlP+Pj4//iYmJ/4SEhP99fX3/dnZ2/3Bw + cP9paWn/YmJi/1xcXP9bW1v/V1dX/0ZGRv9FRUX/SkpK/11dXf9sbGz/cHBw/3Z2dv+MjIz/oKCg/4+P + j/9vb2//dnZ2/1dXV/9GRkb/R0dH/z4+Pv8dHR3/EhIS/xgYGP8uLi7/LCws/x4eHv8eHh7/Hh4e/x4e + Hv8hISH/NDQ0/0xMTP9ZWVn/W1tb/11dXf9fX1//YWFh/2RkZP9mZmb/aWlp/2xsbP9ubm7/cXFx/3R0 + dP93d3f/enp6/319ff+AgID/goKC/4aGhv+JiYn/jIyM/4+Pj/+SkpL/lZWV/5iYmP+cnJz/np6e/6Ki + ov+mpqb/qamp/6ysrP+vr6//s7Oz/7a2tv+5ubn/vLy8/76+vv/CwsL/xMTE/8fHx//Kysr/y8vLMf// + /wH///8B////Af///wHm5ubj5eXl/+Tk5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/U1NT/0tLS/9HR0f/Pz8//zc3N/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/7+/v/+9vb3/u7u7/7i4uP+2trb/s7Oz/7CwsP+srKz/qamp/6ampv+jo6P/np6e/5mZ + mf+VlZX/j4+P/4qKiv+EhIT/fn5+/3h4eP9wcHD/ampq/2JiYv9bW1v/WFhY/11dXf9fX1//X19f/1lZ + Wf9MTEz/Xl5e/25ubv92dnb/h4eH/5+fn/+SkpL/VVVV/1ZWVv93d3f/bGxs/05OTv89PT3/JCQk/xMT + E/8YGBj/KCgo/zY2Nv8rKyv/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/JSUl/z09Pf9QUFD/WFhY/1tb + W/9dXV3/X19f/2FhYf9kZGT/Z2dn/2pqav9tbW3/cHBw/3Nzc/91dXX/eHh4/3t7e/9+fn7/goKC/4WF + hf+IiIj/i4uL/46Ojv+SkpL/lZWV/5mZmf+cnJz/n5+f/6Ojo/+mpqb/qqqq/62trf+xsbH/tLS0/7e3 + t/+6urr/vb29/8DAwP/Dw8P/xsbG/8nJyf/Kysox////Af///wH///8B////AeXl5ePk5OT/5OTk/+Pj + 4//i4uL/4eHh/+Dg4P/f39//39/f/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9LS + 0v/R0dH/0NDQ/83Nzf/MzMz/ysrK/8jIyP/Gxsb/xMTE/8HBwf+/v7//vb29/7u7u/+4uLj/tra2/7S0 + tP+wsLD/ra2t/6qqqv+mpqb/o6Oj/6CgoP+ampr/lZWV/5CQkP+JiYn/hISE/35+fv9zc3P/aWlp/2lp + af9kZGT/XFxc/1VVVf9UVFT/YGBg/2NjY/9mZmb/XFxc/09PT/9dXV3/c3Nz/4WFhf+bm5v/lpaW/11d + Xf9MTEz/cHBw/4aGhv92dnb/Y2Nj/ykpKf8WFhb/GBgY/ycnJ/8rKyv/Hx8f/xwcHP8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/ywsLP9DQ0P/VVVV/1lZWf9bW1v/XV1d/2BgYP9jY2P/ZmZm/2lp + af9sbGz/b29v/3Jycv91dXX/eHh4/3t7e/9+fn7/gYGB/4SEhP+IiIj/i4uL/4+Pj/+SkpL/lpaW/5mZ + mf+dnZ3/oaGh/6SkpP+oqKj/q6ur/6+vr/+ysrL/tra2/7m5uf+8vLz/v7+//8LCwv/FxcX/yMjI/8rK + yjH///8B////Af///wH///8B5OTk4+Tk5P/j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2dnZ/9jY2P/X19f/1tbW/9XV1f/S0tL/0dHR/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+zs7P/sbGx/62trf+qqqr/pqam/6Ojo/+fn5//m5ub/5aW + lv+Pj4//ioqK/4ODg/9+fn7/dHR0/1paWv9NTU3/U1NT/1lZWf9XV1f/UVFR/1RUVP9iYmL/ZWVl/2ho + aP9dXV3/UFBQ/2FhYf+BgYH/mpqa/56env9hYWH/SEhI/2pqav+MjIz/fHx8/5+fn/9nZ2f/HBwc/xcX + F/8lJSX/Kysr/xwcHP8aGhr/HBwc/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/yMj + I/81NTX/S0tL/1ZWVv9aWlr/XFxc/19fX/9iYmL/ZmZm/2hoaP9ra2v/bm5u/3Fxcf90dHT/d3d3/3t7 + e/9+fn7/gYGB/4WFhf+IiIj/jIyM/4+Pj/+Tk5P/lpaW/5qamv+enp7/oaGh/6ampv+pqan/ra2t/7Gx + sf+0tLT/uLi4/7u7u/++vr7/wcHB/8XFxf/IyMj/ycnJMf///wH///8B////Af///wHj4+Pj4+Pj/+Li + 4v/h4eH/4ODg/9/f3//f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Y2Nj/2NjY/9bW1v/V1dX/09PT/9LS + 0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/s7Oz/7Cw + sP+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kJCQ/4qKiv+EhIT/fX19/3d3d/9eXl7/SkpK/0VF + Rf9BQUH/RUVF/1JSUv9PT0//XFxc/2VlZf9oaGj/ampq/1JSUv9OTk7/bW1t/5eXl/+cnJz/ampq/0dH + R/9mZmb/iYmJ/35+fv+vr6//+vr6/9HR0f84ODj/HR0d/ykpKf8hISH/GRkZ/xsbG/8dHR3/Hh4e/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/HR0d/x0dHf8lJSX/PT09/09PT/9YWFj/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9paWn/bGxs/3BwcP9zc3P/dnZ2/3p6ev9+fn7/gYGB/4SEhP+IiIj/i4uL/4+P + j/+Tk5P/l5eX/5ubm/+enp7/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/urq6/76+vv/BwcH/xMTE/8fH + x//IyMgx////Af///wH///8B////AePj4+Pi4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/W1tb/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8LC + wv/AwMD/vr6+/7u7u/+5ubn/tbW1/7Ozs/+wsLD/rq6u/6urq/+np6f/pKSk/6CgoP+cnJz/l5eX/5KS + kv+Li4v/hISE/39/f/93d3f/cHBw/1VVVf9MTEz/Q0ND/z4+Pv9BQUH/T09P/1NTU/9jY2P/Z2dn/2pq + av9ra2v/S0tL/0hISP9xcXH/m5ub/2tra/9GRkb/YWFh/4eHh/98fHz/nZ2d//Hx8f/8/Pz/wsLC/zAw + MP8gICD/JSUl/yIiIv8hISH/IiIi/yEhIf8fHx//Hh4e/x4eHv8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x0dHf8hISH/Ly8v/0hISP9XV1f/Wlpa/11dXf9gYGD/ZGRk/2ZmZv9paWn/bGxs/29v + b/9zc3P/dnZ2/3p6ev99fX3/gICA/4WFhf+IiIj/jY2N/5CQkP+UlJT/mZmZ/5ycnP+hoaH/paWl/6mp + qf+tra3/srKy/7a2tv+5ubn/vb29/8DAwP/ExMT/x8fH/8jIyDH///8B////Af///wH///8B4uLi4+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/0tLS/9HR + 0f/Ozs7/zc3N/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62t + rf+qqqr/p6en/6Ojo/+fn5//m5ub/5eXl/+RkZH/i4uL/4aGhv9+fn7/eHh4/3BwcP9qamr/VlZW/1BQ + UP9BQUH/Ojo6/z09Pf9NTU3/XFxc/2dnZ/9qamr/bGxs/25ubv9LS0v/R0dH/19fX/9mZmb/RERE/1tb + W/+IiIj/goKC/6CgoP/09PT//Pz8/7y8vP8+Pj7/HBwc/ygoKP8oKCj/ICAg/yIiIv8kJCT/JSUl/yQk + JP8gICD/Hh4e/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/IiIi/zY2 + Nv9MTEz/WFhY/1xcXP9fX1//YmJi/2VlZf9oaGj/a2tr/29vb/9ycnL/dnZ2/3l5ef98fHz/gYGB/4SE + hP+JiYn/jY2N/5GRkf+VlZX/mpqa/56env+ioqL/p6en/6ysrP+wsLD/tbW1/7m5uf+9vb3/wMDA/8PD + w//Gxsb/yMjIMf///wH///8B////Af///wHi4uLj4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/tLS0/7Gxsf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kZGR/4yM + jP+Ghob/gICA/3l5ef9zc3P/bGxs/2ZmZv9YWFj/UlJS/z8/P/83Nzf/Ozs7/09PT/9kZGT/aWlp/2tr + a/9tbW3/eHh4/2FhYf9LS0v/U1NT/0RERP9XV1f/f39//4aGhv+QkJD/6Ojo///////S0tL/R0dH/xwc + HP8nJyf/KSkp/yIiIv8fHx//IyMj/yQkJP8lJSX/JiYm/yUlJf8iIiL/Hx8f/x8fH/8fHx//Hx8f/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/yoqKv9CQkL/VFRU/1xcXP9fX1//YmJi/2Vl + Zf9oaGj/bGxs/29vb/9ycnL/dnZ2/3l5ef9+fn7/gYGB/4aGhv+Kior/jo6O/5KSkv+Xl5f/nJyc/6Cg + oP+mpqb/qqqq/6+vr/+zs7P/t7e3/7y8vP/AwMD/w8PD/8bGxv/IyMgx////Af///wH///8B////AeHh + 4ePg4OD/4ODg/9/f3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0tLS/9DQ + 0P/Ozs7/y8vL/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/rq6u/6ur + q/+np6f/pKSk/6CgoP+bm5v/lpaW/5CQkP+MjIz/hoaG/4CAgP96enr/c3Nz/25ubv9nZ2f/YWFh/1lZ + Wf9VVVX/PT09/zQ0NP85OTn/TU1N/2ZmZv9ra2v/bW1t/3Z2dv+NjY3/kZGR/15eXv9VVVX/QEBA/15e + Xv+Dg4P/jo6O/+Hh4f/8/Pz/1dXV/1dXV/8cHBz/JiYm/ykpKf8hISH/Hx8f/yIiIv8kJCT/JSUl/yYm + Jv8mJib/Jycn/yYmJv8jIyP/ISEh/x8fH/8fHx//Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/yEhIf8wMDD/TExM/1hYWP9eXl7/YWFh/2RkZP9oaGj/a2tr/25ubv9xcXH/dXV1/3p6 + ev99fX3/goKC/4WFhf+Kior/j4+P/5SUlP+ZmZn/np6e/6Ojo/+oqKj/ra2t/7Kysv+3t7f/u7u7/7+/ + v//Dw8P/xsbG/8jIyDH///8B////Af///wH///8B4eHh4+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/19fX/9bW1v/U1NT/09PT/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/Dw8P/wcHB/76+ + vv+8vLz/ubm5/7e3t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/m5ub/5aWlv+RkZH/i4uL/4aG + hv+AgID/enp6/3R0dP9ubm7/aGho/2JiYv9dXV3/W1tb/1paWv9ISEj/QkJC/zo6Ov9KSkr/Z2dn/2xs + bP91dXX/iYmJ/6CgoP+Kior/U1NT/1hYWP9JSUn/PT09/1dXV//X19f//////93d3f9oaGj/Hh4e/yYm + Jv8qKir/Hx8f/x4eHv8hISH/JCQk/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8mJib/Ozs7/1JS + Uv9dXV3/YGBg/2RkZP9nZ2f/ampq/21tbf9xcXH/dXV1/3h4eP99fX3/gYGB/4aGhv+Li4v/kZGR/5eX + l/+bm5v/oaGh/6ampv+srKz/sbGx/7a2tv+7u7v/v7+//8PDw//Gxsb/yMjIMf///wH///8B////Af// + /wHg4ODj4ODg/9/f3//d3d3/3d3d/9vb2//a2tr/2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/0NDQ/87O + zv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv+/v7//vb29/7q6uv+2trb/tLS0/7Kysv+urq7/q6ur/6io + qP+lpaX/oaGh/5ycnP+Xl5f/kZGR/4yMjP+Ghob/gYGB/3t7e/90dHT/b29v/2lpaf9jY2P/Xl5e/1lZ + Wf9cXFz/YGBg/2BgYP9YWFj/PT09/0dHR/9oaGj/cnJy/4aGhv+cnJz/kZGR/1dXV/9NTU3/YWFh/1hY + WP9AQED/NTU1/4uLi//W1tb/cHBw/yEhIf8iIiL/Kioq/yEhIf8eHh7/ISEh/yQkJP8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8mJib/JCQk/yIiIv8gICD/Hx8f/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8gICD/Li4u/0pKSv9aWlr/YGBg/2JiYv9lZWX/aGho/2xs + bP9wcHD/dHR0/3l5ef99fX3/goKC/4iIiP+Ojo7/lJSU/5mZmf+fn5//paWl/6urq/+wsLD/tbW1/7q6 + uv++vr7/w8PD/8bGxv/IyMgx////Af///wH///8B////AeDg4OPf39//3t7e/93d3f/b29v/2tra/9nZ + 2f/X19f/1tbW/9TU1P/T09P/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TExP/CwsL/v7+//729 + vf+6urr/t7e3/7S0tP+ysrL/rq6u/6urq/+oqKj/pKSk/6Ghof+dnZ3/mJiY/5KSkv+MjIz/h4eH/4GB + gf97e3v/b29v/1tbW/9dXV3/YmJi/19fX/9ZWVn/VlZW/15eXv9jY2P/ZWVl/1lZWf87Ozv/R0dH/29v + b/+EhIT/nJyc/5WVlf9QUFD/SkpK/3Jycv+CgoL/aWlp/1FRUf8jIyP/GRkZ/zY2Nv8jIyP/ISEh/yoq + Kv8hISH/HR0d/yIiIv8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/ISEh/zMzM/9PT0//W1tb/19fX/9jY2P/ZmZm/2pqav9ubm7/dHR0/3l5ef9/f3//hYWF/4uL + i/+SkpL/l5eX/52dnf+jo6P/qamp/7CwsP+0tLT/urq6/76+vv/Dw8P/xsbG/8jIyDH///8B////Af// + /wH///8B39/f497e3v/d3d3/3Nzc/9vb2//a2tr/2NjY/9fX1//V1dX/09PT/9LS0v/Q0ND/zs7O/8zM + zP/Kysr/yMjI/8fHx//ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/srKy/6+vr/+rq6v/qKio/6Wl + pf+hoaH/nZ2d/5mZmf+UlJT/jo6O/4iIiP+Dg4P/fHx8/3Nzc/9ZWVn/SkpK/0dHR/9OTk7/WFhY/1ZW + Vv9VVVX/YGBg/2RkZP9nZ2f/Wlpa/zo6Ov9KSkr/fX19/5mZmf+YmJj/YGBg/0ZGRv9oaGj/iYmJ/3t7 + e/+wsLD/hISE/x4eHv8RERH/IiIi/yYmJv8eHh7/IiIi/xwcHP8fHx//IyMj/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8iIiL/ISEh/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/ykpKf8/Pz//VVVV/11d + Xf9hYWH/ZWVl/2pqav9wcHD/dXV1/3x8fP+CgoL/iYmJ/5CQkP+VlZX/nJyc/6Kiov+pqan/r6+v/7Oz + s/+5ubn/vr6+/8PDw//Hx8f/yMjIMf///wH///8B////Af///wHe3t7j3t7e/9zc3P/b29v/2tra/9jY + 2P/X19f/1dXV/9TU1P/S0tL/0NDQ/8/Pz//MzMz/y8vL/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vb29/7u7 + u/+4uLj/tbW1/7Ozs/+vr6//rKys/6ioqP+lpaX/oaGh/52dnf+ZmZn/lJSU/4+Pj/+JiYn/goKC/319 + ff92dnb/ZWVl/05OTv9ISEj/QEBA/0BAQP9QUFD/U1NT/1paWv9jY2P/Z2dn/2hoaP9VVVX/MDAw/09P + T/+Tk5P/mZmZ/2BgYP9FRUX/aGho/4mJif97e3v/r6+v//f39//q6ur/dHR0/xgYGP8fHx//GBgY/xYW + Fv8ZGRn/Hx8f/yQkJP8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x4eHv8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x8fH/8tLS3/RkZG/1hYWP9gYGD/ZWVl/2xsbP9ycnL/eXl5/4CA + gP+Hh4f/jo6O/5SUlP+bm5v/oaGh/6enp/+tra3/s7Oz/7m5uf++vr7/w8PD/8fHx//IyMgx////Af// + /wH///8B////Ad7e3uPd3d3/3Nzc/9ra2v/Z2dn/19fX/9XV1f/U1NT/09PT/9HR0f/Pz8//zc3N/8vL + y//Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+pqan/pqam/6Ki + ov+enp7/mZmZ/5WVlf+QkJD/ioqK/4SEhP99fX3/d3d3/3BwcP9hYWH/UFBQ/0dHR/89PT3/PT09/01N + Tf9UVFT/YGBg/2VlZf9oaGj/ampq/1FRUf8rKyv/SkpK/5CQkP9paWn/RUVF/15eXv+IiIj/f39//6mp + qf/z8/P/+vr6/62trf83Nzf/HR0d/yAgIP8YGBj/Ghoa/x8fH/8lJSX/Jycn/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUl + Jf8kJCT/IiIi/yEhIf8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8kJCT/Nzc3/1RUVP9iYmL/ampq/3BwcP93d3f/fn5+/4WFhf+MjIz/kpKS/5mZmf+goKD/pqam/62t + rf+ysrL/uLi4/76+vv/Dw8P/x8fH/8jIyDH///8B////Af///wH///8B3d3d49zc3P/b29v/2dnZ/9jY + 2P/W1tb/1NTU/9PT0//R0dH/0NDQ/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HBwf++vr7/u7u7/7m5 + uf+2trb/s7Oz/7CwsP+tra3/qqqq/6ampv+ioqL/np6e/5qamv+VlZX/kZGR/4uLi/+FhYX/f39//3d3 + d/9xcXH/a2tr/19fX/9TU1P/RkZG/zo6Ov86Ojr/SkpK/1xcXP9lZWX/Z2dn/2lpaf9sbGz/WVlZ/y8v + L/87Ozv/UlJS/0ZGRv9dXV3/g4OD/4KCgv+ZmZn/8fHx//z8/P+/v7//ODg4/xwcHP8oKCj/JCQk/xwc + HP8fHx//JSUl/ycnJ/8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IyMj/yEhIf8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/LCws/0RERP9iYmL/bW1t/3V1 + df97e3v/fHx8/4ODg/+Pj4//mJiY/56env+lpaX/q6ur/7Gxsf+4uLj/vr6+/8PDw//Hx8f/yMjIMf// + /wH///8B////Af///wHc3Nzj29vb/9ra2v/Y2Nj/1tbW/9XV1f/U1NT/0dHR/9DQ0P/Ozs7/zMzM/8rK + yv/IyMj/xcXF/8PDw//AwMD/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/ra2t/6qqqv+np6f/o6Oj/5+f + n/+bm5v/lpaW/5GRkf+MjIz/hoaG/4CAgP95eXn/cnJy/2xsbP9mZmb/Xl5e/1VVVf9FRUX/Nzc3/zg4 + OP9ISEj/YWFh/2dnZ/9paWn/bGxs/3Z2dv97e3v/QUFB/zY2Nv8wMDD/SkpK/4KCgv+Ghob/mJiY/+rq + 6v/8/Pz/xsbG/0tLS/8aGhr/JiYm/yYmJv8dHR3/ISEh/yYmJv8nJyf/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yUlJf8kJCT/JCQk/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//ICAg/zg4OP9XV1f/b29v/3Fxcf9dXV3/Y2Nj/3l5ef+RkZH/nZ2d/6Oj + o/+qqqr/sbGx/7i4uP+9vb3/w8PD/8fHx//IyMgx////Af///wH///8B////Adzc3OPa2tr/2dnZ/9fX + 1//V1dX/1NTU/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wcHB/7+/v/+8vLz/ubm5/7e3 + t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/nJyc/5iYmP+Tk5P/jY2N/4iIiP+BgYH/e3t7/3R0 + dP9ubm7/aGho/2NjY/9dXV3/WFhY/0RERP81NTX/NTU1/0VFRf9iYmL/aWlp/2tra/90dHT/i4uL/5mZ + mf9cXFz/ODg4/y8vL/88PDz/dHR0/4eHh//q6ur//v7+/9jY2P9WVlb/Gxsb/yUlJf8pKSn/Hh4e/x8f + H/8kJCT/Jycn/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8lJSX/JSUl/yMj + I/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//ISEh/ykp + Kf9ISEj/VVVV/01NTf9fX1//ZWVl/4ODg/+cnJz/o6Oj/6qqqv+wsLD/uLi4/76+vv/Dw8P/x8fH/8jI + yDH///8B////Af///wH///8B2tra49nZ2f/X19f/1tbW/9TU1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJ + yf/Hx8f/xMTE/8LCwv+/v7//vLy8/7q6uv+3t7f/tbW1/7Gxsf+urq7/q6ur/6enp/+lpaX/oKCg/5yc + nP+Xl5f/kpKS/42Njf+IiIj/goKC/3x8fP92dnb/b29v/2lpaf9kZGT/X19f/1xcXP9bW1v/VFRU/09P + T/88PDz/QEBA/2RkZP9ra2v/dHR0/4yMjP+fn5//g4OD/0xMTP8+Pj7/NjY2/ysrK/89PT3/tra2//z8 + /P/c3Nz/UVFR/xkZGf8lJSX/KCgo/x4eHv8fHx//IyMj/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yQkJP8iIiL/ISEh/yAgIP8fHx//Hh4e/x8f + H/8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8oKCj/Ojo6/2BgYP9oaGj/f39//5ub + m/+jo6P/q6ur/7Gxsf+5ubn/vr6+/8TExP/Hx8f/yMjIMf///wH///8B////Af///wHa2trj2NjY/9bW + 1v/V1dX/09PT/9HR0f/Pz8//zs7O/8vLy//Jycn/x8fH/8XFxf/Dw8P/wMDA/729vf+6urr/uLi4/7W1 + tf+ysrL/r6+v/6urq/+oqKj/paWl/6Ghof+dnZ3/mZmZ/5OTk/+Ojo7/iYmJ/4ODg/99fX3/c3Nz/2tr + a/9qamr/ZWVl/2BgYP9cXFz/W1tb/15eXv9hYWH/YWFh/zs7O/8zMzP/ZGRk/3Fxcf+Ghob/n5+f/5GR + kf9NTU3/SkpK/2BgYP9DQ0P/NDQ0/ykpKf9LS0v/n5+f/2pqav8cHBz/IiIi/ykpKf8fHx//Gxsb/yEh + If8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/IyMj/yAgIP8eHh7/Hh4e/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8kJCT/Pj4+/2JiYv+BgYH/nJyc/6Ojo/+rq6v/srKy/7m5uf+/v7//xMTE/8fH + x//IyMgx////Af///wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8jI + yP/Gxsb/w8PD/8HBwf++vr7/u7u7/7i4uP+2trb/srKy/6+vr/+srKz/qKio/6Wlpf+hoaH/np6e/5mZ + mf+UlJT/jo6O/4mJif+EhIT/fX19/3Nzc/9WVlb/TU1N/1ZWVv9fX1//XFxc/1hYWP9bW1v/YWFh/2Rk + ZP9iYmL/OTk5/zIyMv9sbGz/hISE/5ycnP+QkJD/U1NT/0pKSv9ubm7/hoaG/21tbf9SUlL/GRkZ/xIS + Ev8gICD/IyMj/yEhIf8pKSn/IiIi/x8fH/8gICD/IyMj/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/yEh + If8fHx//ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8iIiL/R0dH/4KC + gv+cnJz/pKSk/6ysrP+ysrL/urq6/8DAwP/FxcX/yMjI/8jIyDH///8B////Af///wH///8B19fX49bW + 1v/U1NT/0tLS/9DQ0P/Pz8//zc3N/8vLy//IyMj/xsbG/8PDw//CwsL/v7+//7y8vP+5ubn/tra2/7Oz + s/+wsLD/ra2t/6mpqf+mpqb/oqKi/56env+ZmZn/lJSU/5CQkP+Kior/hISE/35+fv91dXX/XFxc/0tL + S/9ERET/QEBA/09PT/9ZWVn/WFhY/15eXv9jY2P/ZWVl/2JiYv8zMzP/MDAw/319ff+ampr/kpKS/1dX + V/9GRkb/a2tr/4uLi/9+fn7/vb29/8rKyv9NTU3/FRUV/xwcHP8dHR3/GBgY/x0dHf8dHR3/ISEh/yMj + I/8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yMjI/8iIiL/ISEh/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8gICD/ICAg/yEhIf9ERET/hYWF/52dnf+lpaX/rKys/7Ozs/+7u7v/wcHB/8XF + xf/IyMj/ycnJMf///wH///8B////Af///wHW1tbj1dXV/9TU1P/R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//FxcX/wsLC/7+/v/+8vLz/urq6/7e3t/+0tLT/sbGx/62trf+qqqr/pqam/6Kiov+enp7/mpqa/5aW + lv+QkJD/i4uL/4WFhf9+fn7/eXl5/25ubv9UVFT/TExM/0BAQP88PDz/SUlJ/1ZWVv9bW1v/YmJi/2Vl + Zf9nZ2f/YmJi/ywsLP8sLCz/ioqK/5ycnP9eXl7/RERE/2NjY/+IiIj/enp6/7S0tP/4+Pj/8fHx/39/ + f/8gICD/GRkZ/xUVFf8VFRX/Ghoa/yAgIP8jIyP/JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yQkJP8jIyP/ISEh/yAgIP8gICD/ICAg/yAgIP8hISH/ISEh/yEhIf8hISH/ISEh/0BA + QP+FhYX/np6e/6enp/+vr6//tra2/76+vv/CwsL/xsbG/8nJyf/Kysox////Af///wH///8B////AdbW + 1uPU1NT/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/Hx8f/xcXF/8PDw//AwMD/vb29/7q6uv+3t7f/tLS0/7Gx + sf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+VlZX/kZGR/4uLi/+FhYX/f39//3l5ef90dHT/aWlp/1VV + Vf9NTU3/PT09/zg4OP9GRkb/VVVV/2FhYf9lZWX/aGho/2lpaf9mZmb/LS0t/yUlJf9oaGj/ZmZm/0RE + RP9iYmL/hoaG/319ff+pqan/+vr6//f39/+cnJz/Jycn/xwcHP8kJCT/Ghoa/xsbG/8gICD/IyMj/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/yAgIP8hISH/ISEh/yEhIf8hISH/Nzc3/319ff+Xl5f/pqam/7Ozs/+6urr/wMDA/8TE + xP/Hx8f/ysrK/8vLyzH///8B////Af///wH///8B1dXV49PT0//R0dH/z8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/76+vv+8vLz/uLi4/7W1tf+ysrL/r6+v/6ysrP+oqKj/pKSk/6CgoP+bm5v/l5eX/5KS + kv+NjY3/hoaG/4GBgf96enr/dXV1/3BwcP9nZ2f/V1dX/05OTv85OTn/NTU1/0NDQ/9XV1f/ZWVl/2dn + Z/9paWn/bGxs/29vb/8zMzP/JSUl/zQ0NP9AQED/Wlpa/4ODg/98fHz/nZ2d/+/v7//7+/v/t7e3/zc3 + N/8cHBz/KCgo/yUlJf8eHh7/ICAg/yMjI/8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/IiIi/yAgIP8fHx//ICAg/yEhIf8hISH/ISEh/yEh + If8vLy//enp6/42Njf+cnJz/tra2/729vf/BwcH/xMTE/8fHx//Kysr/y8vLMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Nzc3/y8vL/8nJyf/Gxsb/xMTE/8HBwf+/v7//vLy8/7m5uf+1tbX/srKy/6+v + r/+srKz/qKio/6Wlpf+goKD/m5ub/5aWlv+SkpL/jY2N/4iIiP+BgYH/e3t7/3Z2dv9wcHD/a2tr/2Rk + ZP9ZWVn/UFBQ/zc3N/8yMjL/QUFB/1paWv9oaGj/aWlp/21tbf94eHj/jo6O/11dXf8oKCj/Jycn/zg4 + OP93d3f/gICA/5qamv/19fX//v7+/7m5uf86Ojr/Ghoa/ygoKP8mJib/HR0d/yAgIP8jIyP/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8hISH/ICAg/x8fH/8gICD/ISEh/ysrK/95eXn/jY2N/5ubm/+6urr/v7+//8PD + w//Gxsb/ycnJ/8zMzP/MzMwx////Af///wH///8B////AdPT0+PR0dH/z8/P/8zMzP/Kysr/x8fH/8XF + xf/Dw8P/wMDA/729vf+6urr/tra2/7Ozs/+wsLD/ra2t/6mpqf+mpqb/oaGh/52dnf+Xl5f/k5OT/46O + jv+JiYn/hISE/319ff93d3f/cnJy/2xsbP9nZ2f/YWFh/1tbW/9RUVH/Pj4+/zc3N/89PT3/W1tb/2lp + af9ra2v/d3d3/42Njf+goKD/bGxs/y4uLv8mJib/KSkp/01NTf+Li4v/5ubm//7+/v/a2tr/RUVF/xoa + Gv8lJSX/KCgo/x8fH/8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JiYm/yUlJf8hISH/Hh4e/x8f + H/8hISH/LCws/3p6ev+Ojo7/nZ2d/729vf/BwcH/xMTE/8bGxv/Jycn/zMzM/83NzTH///8B////Af// + /wH///8B0tLS49DQ0P/Ozs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/u7u7/7i4uP+0tLT/sbGx/62t + rf+qqqr/pqam/6Kiov+dnZ3/mZmZ/5SUlP+Pj4//ioqK/4WFhf9/f3//dnZ2/3Jycv9tbW3/aGho/2Rk + ZP9eXl7/XV1d/15eXv9eXl7/R0dH/zQ0NP9WVlb/bGxs/3R0dP+NjY3/oKCg/4CAgP9GRkb/Pj4+/ysr + K/8mJib/LCws/3Fxcf/b29v/0dHR/1hYWP8bGxv/JCQk/ykpKf8hISH/Hx8f/yMjI/8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yQkJP8iIiL/Hx8f/x8fH/8pKSn/d3d3/5CQkP+dnZ3/vr6+/8LC + wv/FxcX/yMjI/8vLy//Nzc3/zs7OMf///wH///8B////Af///wHR0dHjz8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/v7+//7y8vP+5ubn/tra2/7Kysv+vr6//q6ur/6enp/+jo6P/n5+f/5mZmf+VlZX/kJCQ/4qK + iv+FhYX/gICA/3Nzc/9cXFz/YmJi/2dnZ/9kZGT/YGBg/1xcXP9fX1//YmJi/2VlZf9ISEj/Kysr/1JS + Uv9zc3P/h4eH/56env+FhYX/S0tL/0xMTP9wcHD/VVVV/yoqKv8gICD/Ghoa/09PT/9nZ2f/ISEh/yMj + I/8oKCj/ICAg/yEhIf8kJCT/Jycn/yYmJv8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/IiIi/y0tLf97e3v/kZGR/56env+/v7//xMTE/8fHx//Jycn/zMzM/87Ozv/Pz88x////Af// + /wH///8B////Ac/Pz+POzs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/urq6/7e3t/+0tLT/sLCw/6ys + rP+oqKj/pKSk/6CgoP+cnJz/lpaW/5GRkf+MjIz/hoaG/4GBgf91dXX/W1tb/0tLS/9KSkr/UlJS/15e + Xv9cXFz/XFxc/2FhYf9lZWX/Z2dn/0VFRf8pKSn/VlZW/4aGhv+dnZ3/kJCQ/1BQUP9GRkb/bm5u/4iI + iP91dXX/dHR0/yAgIP8LCwv/KSkp/2tra/8pKSn/JSUl/yAgIP8fHx//JCQk/ycnJ/8mJib/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8rKyv/WVlZ/42Njf+SkpL/np6e/8DA + wP/FxcX/yMjI/8vLy//Nzc3/z8/P/9DQ0DH///8B////Af///wH///8Bzs7O48zMzP/Kysr/x8fH/8XF + xf/CwsL/v7+//7u7u/+4uLj/tbW1/7Gxsf+urq7/qamp/6Wlpf+hoaH/nJyc/5iYmP+RkZH/jY2N/4aG + hv+AgID/enp6/2RkZP9PT0//SEhI/0NDQ/9ERET/V1dX/1lZWf9gYGD/ZWVl/2dnZ/9paWn/QUFB/yYm + Jv9jY2P/np6e/5OTk/9TU1P/RUVF/2tra/+IiIj/dnZ2/87Ozv/4+Pj/nJyc/x8fH/8eHh7/IiIi/xMT + E/8YGBj/Hh4e/yMjI/8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/0lJSf+EhIT/k5OT/5OTk/+kpKT/w8PD/8bGxv/Kysr/y8vL/87Ozv/Q0ND/0dHRMf// + /wH///8B////Af///wHNzc3jy8vL/8nJyf/Gxsb/xMTE/8DAwP+9vb3/urq6/7a2tv+zs7P/rq6u/6ur + q/+np6f/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/gICA/3p6ev90dHT/YGBg/1FRUf9GRkb/Pz8//0JC + Qv9VVVX/Wlpa/2RkZP9mZmb/aWlp/2tra/89PT3/Hx8f/1tbW/+ampr/Xl5e/0JCQv9jY2P/hoaG/3p6 + ev+zs7P//Pz8//b29v+NjY3/Hx8f/x0dHf8VFRX/FBQU/x0dHf8gICD/IyMj/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQkJP8kJCT/Hx8f/zg4OP9+fn7/mZmZ/7W1 + tf/Gxsb/yMjI/8vLy//Nzc3/z8/P/9HR0f/S0tIx////Af///wH///8B////AczMzOPKysr/yMjI/8XF + xf/CwsL/vr6+/7u7u/+3t7f/s7Oz/7CwsP+srKz/qKio/6Ojo/+enp7/mZmZ/5SUlP+Pj4//iIiI/4KC + gv96enr/dHR0/25ubv9dXV3/VVVV/0RERP88PDz/Pj4+/1RUVP9gYGD/Z2dn/2lpaf9ra2v/bm5u/0FB + Qf8eHh7/MzMz/1VVVf9BQUH/Y2Nj/4WFhf95eXn/s7Oz//f39//z8/P/lJSU/yIiIv8cHBz/Jycn/x4e + Hv8bGxv/ICAg/yEhIf8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8jIyP/ISEh/w8PD/8CAgL/JSUl/4mJif+xsbH/w8PD/8fHx//Jycn/y8vL/83Nzf/Q0ND/0tLS/9LS + 0jH///8B////Af///wH///8BzMzM48nJyf/Gxsb/w8PD/8DAwP+8vLz/ubm5/7W1tf+xsbH/ra2t/6mp + qf+lpaX/oKCg/5ubm/+VlZX/kJCQ/4qKiv+Dg4P/fX19/3Z2dv9wcHD/a2tr/15eXv9YWFj/Q0ND/zg4 + OP88PDz/VFRU/2RkZP9paWn/a2tr/25ubv97e3v/Xl5e/x8fH/8hISH/NjY2/1hYWP+Dg4P/fHx8/6Gh + of/19fX//v7+/6enp/8wMDD/Ghoa/yYmJv8jIyP/Gxsb/x0dHf8hISH/IyMj/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8RERH/AwMD/yUlJf9vb2//r6+v/8HB + wf/FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PTMf///wH///8B////Af///wHLy8vjyMjI/8bG + xv/CwsL/v7+//7u7u/+3t7f/s7Oz/66urv+qqqr/pqam/6Kiov+cnJz/lpaW/5GRkf+Li4v/hYWF/35+ + fv94eHj/cnJy/21tbf9paWn/X19f/1tbW/9CQkL/Nzc3/zk5Of9TU1P/ZmZm/2tra/9ubm7/e3t7/5OT + k/+Hh4f/LCws/x8fH/8wMDD/YWFh/4GBgf+cnJz/7e3t//r6+v++vr7/MTEx/xoaGv8mJib/JSUl/x4e + Hv8fHx//ISEh/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQk + JP8nJyf/FxcX/wMDA/8eHh7/e3t7/6Ghof+/v7//xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT + 0//U1NQx////Af///wH///8B////AcrKyuPHx8f/xMTE/8DAwP+9vb3/ubm5/7W1tf+xsbH/rKys/6io + qP+ioqL/np6e/5iYmP+SkpL/jIyM/4aGhv+AgID/eHh4/3Nzc/9ubm7/ampq/2VlZf9fX1//Xl5e/1BQ + UP9JSUn/Nzc3/1BQUP9oaGj/bW1t/3h4eP+SkpL/oKCg/3R0dP8xMTH/Hx8f/yIiIv8zMzP/bGxs/+Xl + 5f/8/Pz/vLy8/0FBQf8ZGRn/JSUl/yQkJP8fHx//ICAg/yIiIv8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/xcXF/8DAwP/Hh4e/29vb/+kpKT/vb29/8LC + wv/ExMT/x8fH/8nJyf/Ly8v/zs7O/9DQ0P/S0tL/1NTU/9XV1TH///8B////Af///wH///8ByMjI48bG + xv/Dw8P/v7+//7y8vP+3t7f/s7Oz/6+vr/+qqqr/pqam/6CgoP+bm5v/lJSU/46Ojv+IiIj/goKC/3V1 + df9ubm7/b29v/2xsbP9nZ2f/YmJi/19fX/9hYWH/Y2Nj/1lZWf8yMjL/Q0ND/2hoaP92dnb/jIyM/5+f + n/+AgID/RkZG/0RERP84ODj/HR0d/yEhIf83Nzf/kJCQ/8XFxf9MTEz/GRkZ/yQkJP8lJSX/HR0d/x8f + H/8iIiL/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JSUl/ycn + J/8XFxf/BAQE/xEREf9mZmb/np6e/7u7u//CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/1tbWMf///wH///8B////Af///wHIyMjjxMTE/8HBwf+9vb3/urq6/7W1tf+xsbH/rKys/6en + p/+ioqL/m5ub/5aWlv+QkJD/ioqK/4ODg/90dHT/WFhY/09PT/9ZWVn/ZGRk/2RkZP9hYWH/YWFh/2Rk + ZP9nZ2f/W1tb/y4uLv88PDz/b29v/42Njf+hoaH/g4OD/0ZGRv9MTEz/dnZ2/3t7e/9BQUH/ISEh/w8P + D/8UFBT/QEBA/yEhIf8gICD/JiYm/x0dHf8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8uLi7/QUFB/y0tLf8hISH/aWlp/6SkpP+7u7v/wcHB/8PD + w//FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/X19cx////Af///wH///8B////AcbG + xuPExMT/wMDA/729vf+4uLj/s7Oz/6+vr/+pqan/pKSk/5+fn/+ZmZn/kpKS/4uLi/+FhYX/fHx8/2Fh + Yf9PT0//SEhI/0ZGRv9WVlb/YmJi/2BgYP9kZGT/ZmZm/2lpaf9aWlr/Kioq/0NDQ/+CgoL/oKCg/5GR + kf9KSkr/RkZG/29vb/+Ghob/e3t7/8DAwP95eXn/ExMT/xQUFP84ODj/ISEh/xwcHP8eHh7/Hh4e/yIi + Iv8kJCT/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/Kioq/0RE + RP9WVlb/e3t7/4KCgv+vr6//u7u7/8DAwP/CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9jY2DH///8B////Af///wH///8BxsbG48PDw/+/v7//u7u7/7e3t/+xsbH/rKys/6am + pv+hoaH/nJyc/5WVlf+Ojo7/hoaG/4CAgP92dnb/WVlZ/1FRUf9FRUX/QkJC/1JSUv9gYGD/YmJi/2dn + Z/9paWn/a2tr/1ZWVv8lJSX/RkZG/5WVlf+RkZH/UlJS/0ZGRv9qamr/hYWF/319ff/Kysr//f39/9/f + 3/9CQkL/HBwc/xsbG/8SEhL/FhYW/xwcHP8iIiL/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IyMj/yQkJP8nJyf/Kysr/zAwMP80NDT/NDQ0/zIyMv8uLi7/KSkp/yYmJv8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8qKir/PT09/1JSUv+IiIj/np6e/7u7u/+/v7//wcHB/8PD + w//FxcX/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/Y2Nj/2dnZMf///wH///8B////Af// + /wHFxcXjwsLC/729vf+5ubn/tbW1/6+vr/+qqqr/pKSk/5+fn/+ZmZn/kZGR/4qKiv+CgoL/e3t7/3Nz + c/9bW1v/U1NT/0FBQf8/Pz//UVFR/2BgYP9mZmb/aWlp/2tra/9tbW3/WFhY/yMjI/81NTX/f39//1ZW + Vv9BQUH/ZmZm/4aGhv96enr/u7u7//n5+f/s7Oz/gICA/xwcHP8fHx//Gxsb/xQUFP8aGhr/ISEh/yYm + Jv8lJSX/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/ygoKP85OTn/WVlZ/3Fxcf+EhIT/lZWV/52d + nf+dnZ3/mJiY/46Ojv9+fn7/ampq/09PT/85OTn/JiYm/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hh4e/wsL + C/8UFBT/WVlZ/5aWlv+zs7P/vr6+/8DAwP/Dw8P/xcXF/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9nZ2f/a2tox////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+0tLT/rq6u/6io + qP+ioqL/nJyc/5aWlv+Ojo7/hoaG/319ff93d3f/b29v/1xcXP9UVFT/PT09/zs7O/9PT0//Y2Nj/2lp + af9sbGz/bm5u/3Jycv9kZGT/JCQk/yEhIf86Ojr/QEBA/11dXf+FhYX/fn5+/7CwsP/5+fn/9vb2/4eH + h/8kJCT/HBwc/yYmJv8hISH/HR0d/yEhIf8mJib/JiYm/yUlJf8kJCT/IyMj/yMjI/8jIyP/JiYm/zIy + Mv9fX1//jY2N/6ysrP++vr7/xcXF/8nJyf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8nJyf/FxcX/vb29/6ur + q/99fX3/VFRU/zExMf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8lJSX/IyMj/yMjI/8LCwv/BgYG/0FBQf+Li4v/srKy/729vf/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1dXV/9bW1v/Y2Nj/2tra/9ra2jH///8B////Af// + /wH///8BxMTE48DAwP+8vLz/t7e3/7Kysv+srKz/p6en/6Ghof+ampr/k5OT/4uLi/+Dg4P/enp6/3R0 + dP9tbW3/X19f/1VVVf86Ojr/ODg4/09PT/9lZWX/bGxs/25ubv9ycnL/goKC/4eHh/8yMjL/Hh4e/ysr + K/9OTk7/gICA/39/f/+qqqr/9vb2//Pz8/+ampr/Hh4e/xoaGv8lJSX/IiIi/x4eHv8iIiL/JiYm/yYm + Jv8lJSX/JCQk/yMjI/8jIyP/IyMj/zAwMP9nZ2f/o6Oj/8XFxf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8vL + y//Ly8v/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/FxcX/m5ub/11dXf8uLi7/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8jIyP/CwsL/wYG + Bv85OTn/kJCQ/7Kysv+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9TU + 1P/V1dX/19fX/9nZ2f/a2tr/29vbMf///wH///8B////Af///wHExMTjwMDA/7u7u/+2trb/sbGx/6ur + q/+mpqb/oKCg/5mZmf+SkpL/iYmJ/4GBgf95eXn/dHR0/25ubv9iYmL/VlZW/0JCQv88PDz/T09P/2dn + Z/9vb2//cXFx/319ff+Xl5f/oaGh/0tLS/8dHR3/IyMj/0BAQP9lZWX/nJyc//Dw8P/6+vr/rKys/zMz + M/8YGBj/JSUl/yEhIf8cHBz/ISEh/yYmJv8mJib/JSUl/yQkJP8jIyP/IyMj/yMjI/9AQED/jY2N/8DA + wP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ly8v/vLy8/4GBgf89PT3/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yUlJf8kJCT/Kysr/xISEv8CAgL/Ly8v/4WFhf+tra3/vLy8/7+/v//BwcH/w8PD/8bG + xv/Hx8f/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//c3Nwx////Af// + /wH///8B////AcPDw+O/v7//u7u7/7W1tf+wsLD/qqqq/6Wlpf+enp7/l5eX/4yMjP+Hh4f/gYGB/3l5 + ef91dXX/b29v/2ZmZv9nZ2f/Z2dn/0lJSf9BQUH/ZWVl/3Jycv9/f3//lZWV/6Kiov91dXX/Ozs7/yws + LP8dHR3/JSUl/zg4OP+rq6v/7+/v/66urv8uLi7/GBgY/yUlJf8jIyP/HBwc/yAgIP8lJSX/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8qKir/XV1d/7W1tf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/7Cw + sP9nZ2f/KSkp/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/ycnJ/8PDw//AQEB/zIy + Mv+Hh4f/rKys/729vf+/v7//wcHB/8PDw//FxcX/x8fH/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9TU + 1P/W1tb/19fX/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8Bw8PD48DAwP+7u7v/tbW1/7Cw + sP+pqan/pKSk/52dnf+Li4v/bW1t/3Nzc/99fX3/e3t7/3h4eP9xcXH/aGho/2pqav9paWn/RUVF/zU1 + Nf9gYGD/e3t7/5OTk/+jo6P/fn5+/0VFRf9MTEz/ZGRk/zY2Nv8aGhr/HBwc/y4uLv9ycnL/Q0ND/xYW + Fv8iIiL/IyMj/xwcHP8fHx//IyMj/yUlJf8lJSX/JCQk/yQkJP8jIyP/KCgo/2lpaf+1tbX/zMzM/8zM + zP/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/7u7u/9mZmb/Kioq/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yQkJP8pKSn/FxcX/wEBAf8dHR3/fX19/6ioqP+6urr/vr6+/8DAwP/Dw8P/xcXF/8bG + xv/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3d3dMf// + /wH///8B////Af///wHDw8Pjv7+//7q6uv+0tLT/r6+v/6mpqf+jo6P/lJSU/21tbf9aWlr/VVVV/19f + X/94eHj/eXl5/3Jycv9sbGz/bm5u/2xsbP9ERET/MzMz/2pqav+Pj4//oqKi/4aGhv9BQUH/SUlJ/3R0 + dP+BgYH/b29v/1BQUP8VFRX/DQ0N/zs7O/9DQ0P/HR0d/yQkJP8bGxv/HR0d/yIiIv8kJCT/JCQk/yQk + JP8kJCT/IyMj/yUlJf9kZGT/u7u7/8rKyv/Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/8rK + yv/Kysr/ycnJ/7W1tf9dXV3/JSUl/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8lJSX/MzMz/0tLS/9TU1P/SUlJ/4GB + gf+rq6v/urq6/76+vv/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zs7O/8/Pz//R0dH/09PT/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/e3t4x////Af///wH///8B////AcPDw+O/v7//urq6/7W1 + tf+vr6//qamp/6Ojo/+Hh4f/Y2Nj/1dXV/9NTU3/UlJS/3h4eP96enr/cXFx/3BwcP9xcXH/bm5u/z8/ + P/8xMTH/eXl5/6Ghof+Hh4f/SkpK/0ZGRv9ubm7/g4OD/4KCgv/R0dH/3d3d/2hoaP8SEhL/IyMj/x0d + Hf8UFBT/GBgY/xwcHP8gICD/IiIi/yQkJP8kJCT/JCQk/yQkJP8jIyP/Q0ND/6+vr//Kysr/ysrK/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/y8vL/8vLy//Ly8v/y8vL/8rKyv/Kysr/ysrK/8rKyv/Kysr/ycnJ/7Gxsf9DQ0P/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/y0tLf9ERET/U1NT/3Nzc/+Kior/rq6u/7u7u/+9vb3/v7+//8LCwv/ExMT/xsbG/8jI + yP/Kysr/y8vL/83Nzf/Pz8//0dHR/9LS0v/U1NT/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3t7e/9/f + 3zH///8B////Af///wH///8BxMTE48DAwP+7u7v/tra2/7CwsP+pqan/o6Oj/4WFhf9nZ2f/VVVV/0hI + SP9PT0//enp6/3l5ef9zc3P/c3Nz/3R0dP9ubm7/Ozs7/ywsLP95eXn/k5OT/01NTf9CQkL/bGxs/4eH + h/97e3v/ycnJ//v7+//d3d3/X19f/xcXF/8YGBj/EhIS/xYWFv8bGxv/ICAg/yIiIv8jIyP/JCQk/yQk + JP8kJCT/JCQk/zAwMP+Hh4f/yMjI/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/ysrK/8rK + yv/Kysr/ysrK/8rKyv/Kysr/ycnJ/4qKiv8uLi7/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8mJib/HR0d/x8fH/9FRUX/enp6/56e + nv+3t7f/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1NTU/9XV + 1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/93d3f/f39//39/fMf///wH///8B////Af///wHExMTjwcHB/7y8 + vP+2trb/sbGx/6mpqf+jo6P/iIiI/2tra/9TU1P/RERE/0xMTP95eXn/d3d3/3V1df92dnb/d3d3/3Nz + c/8+Pj7/JCQk/0xMTP9RUVH/QUFB/2VlZf+Hh4f/eXl5/8fHx//+/v7/6Ojo/2RkZP8aGhr/Hh4e/yQk + JP8bGxv/HBwc/yEhIf8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/XFxc/76+vv/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Kysr/ysrK/8rKyv/Kysr/ysrK/8vLy//Ly8v/vLy8/1dX + V/8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8jIyP/IiIi/xkZGf8EBAT/ExMT/21tbf+goKD/uLi4/7y8vP++vr7/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Kysr/zc3N/87Ozv/Q0ND/0dHR/9PT0//V1dX/1tbW/9jY2P/Z2dn/2tra/9vb2//d3d3/3t7e/9/f + 3//g4OAx////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+ysrL/q6ur/6SkpP+Hh4f/bm5u/1BQ + UP9CQkL/TU1N/3t7e/93d3f/eHh4/3h4eP97e3v/g4OD/01NTf8iIiL/MDAw/0RERP9gYGD/hYWF/3V1 + df+vr6//+Pj4//Hx8f+IiIj/Hh4e/xwcHP8lJSX/Hx8f/x0dHf8gICD/IiIi/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf+SkpL/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zs7O/87Ozv/Ozs7/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/Jycn/hoaG/ywsLP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8bGxv/BAQE/wcHB/9RUVH/mZmZ/7S0 + tP+8vLz/vr6+/8DAwP/Dw8P/xcXF/8fHx//IyMj/ysrK/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9bW + 1v/X19f/2NjY/9ra2v/b29v/3d3d/97e3v/f39//4ODg/+Hh4TH///8B////Af///wH///8BxMTE48LC + wv++vr7/uLi4/7Ozs/+tra3/pqam/4iIiP9xcXH/T09P/0JCQv9LS0v/e3t7/3p6ev96enr/fX19/4iI + iP+enp7/eXl5/yUlJf8sLCz/Wlpa/3x8fP92dnb/srKy//j4+P/w8PD/ioqK/yIiIv8bGxv/JSUl/x8f + H/8cHBz/ICAg/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MjIy/7q6uv/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zc3N/83N + zf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/MzMz/zMzM/83N + zf+urq7/OTk5/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8iIiL/Gxsb/wYGBv8ODg7/UVFR/5mZmf+1tbX/u7u7/76+vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8rK + yv/MzMz/zs7O/9DQ0P/R0dH/09PT/9TU1P/V1dX/2NjY/9nZ2f/a2tr/29vb/9zc3P/e3t7/39/f/+Dg + 4P/h4eH/4eHhMf///wH///8B////Af///wHExMTjwsLC/76+vv+6urr/tbW1/66urv+oqKj/ioqK/3d3 + d/9oaGj/Xl5e/05OTv94eHj/fX19/35+fv+IiIj/mpqa/5+fn/9kZGT/KCgo/yAgIP9KSkr/aWlp/5WV + lf/29vb/+vr6/56env8oKCj/GRkZ/yUlJf8hISH/HBwc/yAgIP8iIiL/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP9LS0v/ysrK/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8HBwf9OTk7/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8kJCT/JSUl/x8fH/8HBwf/BgYG/05OTv+Pj4//r6+v/7u7 + u/+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Pz8//0dHR/9PT0//U1NT/1dXV/9fX + 1//Y2Nj/2tra/9vb2//d3d3/3d3d/97e3v/g4OD/4eHh/+Li4v/i4uIx////Af///wH///8B////AcTE + xOPCwsL/v7+//7u7u/+3t7f/sbGx/6qqqv+Kior/e3t7/3x8fP9sbGz/Pj4+/1lZWf9+fn7/iIiI/5ub + m/+jo6P/bm5u/z8/P/9GRkb/MTEx/yYmJv9JSUn/YGBg/7Gxsf+qqqr/Ly8v/xgYGP8kJCT/IiIi/x0d + Hf8fHx//IiIi/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/2BgYP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87O + zv/Ozs7/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/ysrK/11dXf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JCQk/yQk + JP8fHx//CQkJ/wcHB/9FRUX/kJCQ/62trf+6urr/vLy8/7+/v//BwcH/xMTE/8bGxv/IyMj/ysrK/8zM + zP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9ra2v/b29v/3Nzc/93d3f/e3t7/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4zH///8B////Af///wH///8BxcXF48LCwv+/v7//vLy8/7i4uP+zs7P/qqqq/4iI + iP9+fn7/fn5+/2lpaf83Nzf/VlZW/4aGhv+YmJj/oaGh/3x8fP8+Pj7/TU1N/3h4eP9oaGj/NjY2/xkZ + Gf8TExP/IyMj/z4+Pv8eHh7/IiIi/yQkJP8cHBz/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/aGho/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/a2tr/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yQkJP8mJib/NjY2/y0tLf8aGhr/Q0ND/5GRkf+urq7/ubm5/7y8 + vP+/v7//wcHB/8PDw//FxcX/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/09PT/9TU1P/V1dX/19fX/9jY + 2P/Z2dn/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTkMf///wH///8B////Af// + /wHFxcXjwsLC/7+/v/+8vLz/uLi4/7S0tP+jo6P/hISE/4CAgP+AgID/aWlp/zY2Nv9cXFz/l5eX/6Oj + o/+AgID/RUVF/0lJSf9ycnL/g4OD/4ODg/+1tbX/S0tL/w4ODv8iIiL/Ozs7/x8fH/8eHh7/Hh4e/x4e + Hv8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP9hYWH/zMzM/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zc3N/8vLy/9qamr/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8kJCT/JCQk/zQ0 + NP9MTEz/X19f/2pqav+SkpL/s7Oz/7m5uf+7u7v/vr6+/8DAwP/Dw8P/xcXF/8fHx//Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Tk5P/k5OQx////Af///wH///8B////AcbGxuPDw8P/wMDA/7y8vP+5ubn/sbGx/5KS + kv+CgoL/goKC/4GBgf9lZWX/NDQ0/1xcXP+ioqL/iIiI/0VFRf9ERET/dHR0/4SEhP+BgYH/3t7e//z8 + /P+wsLD/Li4u/ycnJ/8bGxv/FBQU/xoaGv8gICD/JSUl/yYmJv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/1FRUf/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/x8fH/1xcXP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/LS0t/0RERP9oaGj/hoaG/6+vr/+5ubn/vLy8/76+ + vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8vLy//Nzc3/z8/P/9DQ0P/S0tL/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+Xl5TH///8B////Af// + /wH///8BxsbG48TExP/BwcH/vb29/7q6uv+np6f/h4eH/4ODg/+Dg4P/g4OD/2VlZf8zMzP/Q0ND/4CA + gP9MTEz/QkJC/2hoaP+Hh4f/enp6/9DQ0P/9/f3/4ODg/1VVVf8ZGRn/Hx8f/xkZGf8WFhb/Hh4e/yUl + Jf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Ojo6/8HB + wf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP+8vLz/R0dH/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8iIiL/IiIi/xAQ + EP8GBgb/NjY2/4GBgf+hoaH/ubm5/7u7u/++vr7/wMDA/8LCwv/ExMT/xsbG/8nJyf/Ly8v/zc3N/8/P + z//Q0ND/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Xl5f/l5eX/5ubmMf///wH///8B////Af///wHHx8fjxMTE/8HBwf++vr7/u7u7/5iY + mP+EhIT/hYWF/4WFhf+IiIj/dnZ2/zc3N/8sLCz/RUVF/0NDQ/9paWn/hYWF/319ff/IyMj/+/v7/+Dg + 4P9lZWX/FhYW/x0dHf8kJCT/Hh4e/x8fH/8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8mJib/n5+f/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/ysrK/5ycnP8yMjL/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IiIi/yEhIf8TExP/AwMD/yoqKv+BgYH/qamp/7i4uP+8vLz/vr6+/8DA + wP/CwsL/xMTE/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9vb + 2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5uYx////Af// + /wH///8B////AcjIyOPFxcX/wsLC/7+/v/+8vLz/k5OT/4WFhf+Ghob/iIiI/5KSkv+Ojo7/QkJC/yoq + Kv9eXl7/cHBw/4ODg/93d3f/vr6+//n5+f/n5+f/dHR0/xwcHP8cHBz/JSUl/x4eHv8fHx//JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP9wcHD/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//FxcX/eHh4/ykpKf8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8hISH/ExMT/wMD + A/8bGxv/dHR0/6Wlpf+4uLj/vLy8/76+vv/AwMD/wsLC/8TExP/Gxsb/ycnJ/8vLy//Nzc3/z8/P/9DQ + 0P/S0tL/09PT/9XV1f/X19f/2NjY/9nZ2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj + 4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5zH///8B////Af///wH///8ByMjI48bGxv/ExMT/wcHB/729 + vf+SkpL/hoaG/4iIiP+RkZH/oKCg/5eXl/9HR0f/JSUl/1JSUv+Li4v/gICA/66urv/6+vr/8fHx/3x8 + fP8eHh7/Gxsb/yUlJf8fHx//Hh4e/yIiIv8kJCT/JCQk/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/z4+Pv+np6f/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/7CwsP9JSUn/JCQk/yQk + JP8kJCT/JCQk/yQkJP8jIyP/IyMj/xgYGP8EBAT/ExMT/2dnZ/+ampr/tra2/7y8vP++vr7/wMDA/8LC + wv/ExMT/xsbG/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/5+fnMf// + /wH///8B////Af///wHJycnjx8fH/8XFxf/CwsL/vr6+/5KSkv+JiYn/kZGR/6CgoP+fn5//Y2Nj/zo6 + Ov8sLCz/Kioq/21tbf+QkJD/w8PD/+zs7P+RkZH/Hh4e/xoaGv8kJCT/ICAg/x0dHf8gICD/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/KCgo/2dnZ//CwsL/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vL + y//Ly8v/y8vL/8vLy//Gxsb/ZmZm/ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8XFxf/BAQE/xkZ + Gf9oaGj/np6e/7S0tP+8vLz/vr6+/8DAwP/CwsL/xMTE/8fHx//IyMj/y8vL/8zMzP/Ozs7/0NDQ/9LS + 0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Ogx////Af///wH///8B////AcrKyuPIyMj/xsbG/8PD + w/+/v7//kpKS/5CQkP+dnZ3/o6Oj/3R0dP88PDz/Tk5O/2FhYf8vLy//LCws/z4+Pv8+Pj7/cHBw/zAw + MP8ZGRn/IyMj/yEhIf8dHR3/ICAg/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Li4u/5OTk//MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/y8vL/8vLy//Ly8v/ycnJ/56env8xMTH/JCQk/yQk + JP8kJCT/IyMj/yMjI/8mJib/ISEh/wcHB/8KCgr/YWFh/5mZmf+2trb/vLy8/76+vv/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/29vb/9zc + 3P/e3t7/39/f/+Dg4P/h4eH/4eHh/+Pj4//j4+P/5OTk/+Xl5f/l5eX/5ubm/+fn5//o6Oj/6Ojo/+np + 6TH///8B////Af///wH///8By8vL48nJyf/Hx8f/xcXF/7+/v/+YmJj/np6e/6Ojo/9ycnL/PT09/1JS + Uv96enr/fX19/3p6ev9RUVH/ERER/xISEv9MTEz/Pz8//yEhIf8iIiL/Hx8f/x8fH/8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/Nzc3/5WVlf/IyMj/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/y8vL/8rKyv+dnZ3/QEBA/yQkJP8kJCT/JCQk/yQkJP8jIyP/KSkp/0FBQf9RUVH/U1NT/2lp + af+qqqr/tra2/729vf+/v7//wcHB/8PDw//ExMT/x8fH/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9PT + 0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Li4v/i4uL/5OTk/+Tk + 5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+np6f/p6en/6enpMf///wH///8B////Af///wHMzMzjysrK/8jI + yP/Gxsb/wcHB/6Ojo/+mpqb/fX19/0FBQf9HR0f/dnZ2/4GBgf+Ghob/4eHh/9PT0/9MTEz/KSkp/zMz + M/8gICD/Ghoa/xwcHP8gICD/ISEh/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/QEBA/5aW + lv/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Kysr/qamp/0lJSf8mJib/JCQk/yQk + JP8kJCT/IyMj/yQkJP8zMzP/SkpK/1tbW/94eHj/mJiY/7q6uv+8vLz/v7+//8HBwf/Dw8P/xcXF/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3Nzc/93d + 3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq + 6v/q6uox////Af///wH///8B////Ac3NzePLy8v/ycnJ/8fHx//ExMT/rKys/4SEhP9ERET/R0dH/29v + b/+CgoL/hYWF/+Li4v/7+/v/wMDA/zY2Nv8eHh7/HR0d/xISEv8ZGRn/Hh4e/yEhIf8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MzMz/4KCgv+6urr/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/v7+//4qKiv9AQED/JSUl/yQkJP8kJCT/JCQk/yMjI/8iIiL/ICAg/xISEv8nJyf/YWFh/42N + jf+ysrL/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU + 1P/W1tb/19fX/9nZ2f/a2tr/29vb/93d3f/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6zH///8B////Af///wH///8Bz8/P483N + zf/Kysr/yMjI/8bGxv+jo6P/SkpK/0NDQ/9sbGz/goKC/35+fv/R0dH/+/v7/8zMzP9KSkr/ExMT/x0d + Hf8hISH/GRkZ/x4eHv8hISH/IiIi/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yQiIf8iIiL/IiIi/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/LCws/1dXV/+jo6P/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/x8fH/6mpqf9kZGT/Ly8v/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IiIi/x4eHv8LCwv/BwcH/0BAQP+QkJD/sbGx/729vf/AwMD/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Ly8v/zMzM/87Ozv/Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq + 6v/r6+v/6+vrMf///wH///8B////Af///wHPz8/jzs7O/8zMzP/Kysr/yMjI/7e3t/9vb2//aGho/4OD + g/94eHj/y8vL//v7+//T09P/VFRU/xcXF/8dHR3/IyMj/xwcHP8dHR3/ISEh/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv86Ih7/ciQW/0AhHP8jISH/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JiYm/zo6Ov9oaGj/o6Oj/8HB + wf/Jycn/zMzM/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Jycn/xMTE/62t + rf9wcHD/Pz8//ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8gICD/DAwM/wMDA/89PT3/h4eH/7Cw + sP+9vb3/v7+//8LCwv/ExMT/xsbG/8fHx//Jycn/y8vL/83Nzf/Pz8//0NDQ/9LS0v/T09P/1NTU/9bW + 1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Owx////Af///wH///8B////AdHR + 0ePPz8//zc3N/8vLy//Jycn/x8fH/7W1tf+SkpL/e3t7/76+vv/+/v7/5OTk/1paWv8UFBT/HBwc/yQk + JP8bGxv/HBwc/yEhIf8kJCT/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/NSIe/5EnFP/CLBH/ZCUa/yYi + If8iIiL/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8tLS3/TU1N/3Z2dv+goKD/rq6u/7q6uv/BwcH/yMjI/8nJ + yf/Hx8f/xcXF/729vf+urq7/m5ub/3p6ev9VVVX/MzMz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMj + I/8iIiL/ICAg/w4ODv8CAgL/Kioq/42Njf+tra3/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/d3d3/3t7e/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+np6f/p6en/6urq/+vr + 6//r6+v/7Ozs/+zs7DH///8B////Af///wH///8B0tLS49DQ0P/Ozs7/zMzM/8vLy//Jycn/xsbG/7Ky + sv+xsbH/9PT0/+np6f98fHz/GRkZ/xkZGf8jIyP/Hx8f/xwcHP8hISH/JSUl/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/ykhIP9/JRX/xCwR/4UoGP8qIiH/IiIi/yIiIv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/KCgo/zY2Nv9AQED/TExM/1lZWf9qamr/bW1t/2hoaP9iYmL/UVFR/0FBQf8zMzP/KCgo/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yEhIf8QEBD/AgIC/yAgIP90dHT/qqqq/7y8 + vP/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/0tLS/9PT0//U1NT/1tbW/9fX + 1//Z2dn/2tra/9zc3P/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4uLi/+Pj4//k5OT/5eXl/+bm + 5v/m5ub/5+fn/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7OzsMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/wsLC/5GRkf+kpKT/cHBw/xsbG/8ZGRn/IiIi/x8f + H/8eHh7/IyMj/yYmJv8lJSX/IyMj/yIiIv8iIiL/IiIi/yIiIv8sIR//eSYX/8UtEf+CKBj/LiIg/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yQiIv8jIyP/IyMj/yMjI/8jIiL/LCIh/0sjHP9vJRj/NSIf/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yQk + JP8nJyf/ERER/wICAv8lJSX/fX19/6ampv++vr7/wcHB/8PDw//ExMT/xsbG/8jIyP/Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3d3d/93d3f/e3t7/39/f/+Dg + 4P/h4eH/4uLi/+Pj4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+3t7f/t7e0x////Af///wH///8B////AdXV1ePT09P/0dHR/8/Pz//Nzc3/zMzM/8rK + yv/BwcH/aGho/zs7O/9DQ0P/ISEh/yIiIv8eHh7/HR0d/yIiIv8mJib/JSUl/yMjI/8iIiL/IiIi/yIi + Iv8hISH/JCEh/3QlF//DLBD/tSsS/z4iHf8iISH/IiIi/yIiIv8iIiL/IiEh/yohH/9JIhz/YiIX/zch + Hf8kIiL/JiIh/0ciG/9+Jhb/jCgW/7csE/9GJB7/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/Li4u/z4+Pv8sLCz/Kysr/35+fv+qqqr/vLy8/8HB + wf/Dw8P/xcXF/8bGxv/IyMj/ysrK/8zMzP/Nzc3/z8/P/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+bm + 5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7jH///8B////Af// + /wH///8B1dXV49TU1P/T09P/0dHR/8/Pz//Nzc3/y8vL/8LCwv9vb2//U1NT/0dHR/8tLS3/JiYm/x4e + Hv8iIiL/JSUl/yUlJf8jIyP/IyMj/yIiIv8hISH/ISEh/yYgIP9fIxj/xSwR/7QsE/+7KxL/lycT/1Ui + GP80IR7/OSEc/0ohGv9tIxb/nygT/7wrEv+6LBL/hiYV/1MiGf98Jhb/kSgV/2QmG/9YJhz/nisW/ywj + If8jIiL/MyIf/z8iHf8vIiD/IyIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/IyMj/yYm + Jv9DQ0P/UVFR/2xsbP9/f3//s7Oz/7+/v//BwcH/xMTE/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ + 0P/R0dH/09PT/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr + 6//s7Oz/7Ozs/+3t7f/u7u7/7u7uMf///wH///8B////Af///wHX19fj1dXV/9TU1P/S0tL/0NDQ/8/P + z//Nzc3/xcXF/35+fv9PT0//MDAw/ywsLP8mJib/ISEh/yQkJP8lJSX/IyMj/yMjI/8iIiL/IiIi/yEh + If8jICD/YiMZ/7srEf+fKhX/QSMd/1QkHP+eKhX/vCoQ/64pEf+sKBH/tioR/7ErE/+ZKhb/dCca/1Ml + HP98JRb/mCgU/3EnGv85JCD/JiMi/2smGv95KBn/IyMi/zQjIP+PJxT/hicW/3AkFv84Ix//IyIi/yMj + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/Hh4e/zIyMv9PT0//e3t7/5ycnP+9vb3/w8PD/8TE + xP/Gxsb/yMjI/8nJyf/Ly8v/zc3N/87Ozv/Q0ND/0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra + 2v/c3Nz/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//r6+v/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u4x////Af// + /wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/8/Pz//IyMj/gYGB/zc3N/8sLCz/KCgo/yEh + If8hISH/IyMj/yQkJP8jIyP/IiIi/yIiIv8hISH/ISEh/1EjG/+7KxH/tisS/0QjHf8iISD/IiEg/zUi + Hv9rJhn/tysS/7YqEf9eJBr/PiMe/y8iIP8lIiH/JCIh/0wkHf9DJB7/KCMi/yIiIv8qIiH/hSgX/1Ym + Hf8nIiH/QyQe/5YpFf9IIxz/TyUd/4gnFv9aJBn/JSIi/yMiIv8jIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/xoa + Gv8GBgb/FxcX/2RkZP+enp7/u7u7/8PDw//FxcX/x8fH/8jIyP/Kysr/zMzM/87Ozv/Pz8//0NDQ/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9ra2v/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7jH///8B////Af///wH///8B2tra49jY2P/W1tb/1NTU/9PT + 0//S0tL/0NDQ/8XFxf9kZGT/LS0t/ygoKP8iIiL/IiIi/yMjI/8kJCT/IyMj/yMjI/8iIiL/IiIi/yEh + If8oISD/gCcX/8ctEf+gKBP/QSEb/yYgH/8gICD/ICAg/yAgH/9MIxz/tisS/34mFv8mISD/ISEh/yYh + IP83IR3/RSIb/0MiHP8zIR7/IyEh/0IkHv+ZKRX/OyMf/1ckG/9zJRf/WSUc/4MmFf9uJBf/pSoU/1Yl + HP9EIx3/SyMc/zMiH/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8ZGRn/BQUF/wwMDP9bW1v/oaGh/7+/v//FxcX/xsbG/8jI + yP/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/n5+f/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7v/v7+//7+/vMf// + /wH///8B////Af///wHa2trj2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/w8PD/1dXV/8sLCz/IyMj/yEh + If8jIyP/JCQk/yQkJP8jIyP/IyMj/yIiIv8iIiL/IiIi/yEhIf8zIh//aiYa/64qE/+uKRH/bSMW/y0f + Hf8gICD/ICAg/zshHf+tKhL/oioU/y0hH/8rIB7/bCMW/6QpEv+0KhH/rykR/5onEv9aIhj/WiQa/3cn + Gf8pIiH/SSQd/40nFP9YIhn/fiYW/6YqFP9dJRv/WSQa/5goFf+JKBb/gCYW/zUiHv8kIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yMjI/8iIiL/HBwc/wcH + B/8GBgb/SkpK/5ycnP+9vb3/xcXF/8fHx//Jycn/ysrK/8zMzP/Nzc3/zs7O/9DQ0P/S0tL/09PT/9XV + 1f/W1tb/19fX/9nZ2f/Z2dn/2tra/9vb2//d3d3/3d3d/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+vr6//r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//w8PAx////Af///wH///8B////Advb2+Pa2tr/2dnZ/9fX + 1//W1tb/1NTU/9PT0//CwsL/UFBQ/yQkJP8hISH/IyMj/yQkJP8kJCT/JCQk/yMjI/8jIyP/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8iISD/OSIe/3wnGP+zKhL/nycR/2YiFv9WIRf/kCUS/8UsEf93Jxn/MSEe/4Ul + FP+5KxL/gygX/0wkHf9FIx3/dicY/68qEv98JRb/KiIg/yIiIf8kIiH/QyMe/38nGP+NKRb/XCYb/1wk + Gv+dKRT/SyUe/ykjIv98KBn/licU/z0iHv8tIiD/JSIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yMjI/8jIyP/JCQk/yEhIf8JCQn/CQkJ/0hISP+YmJj/wMDA/8fHx//IyMj/ycnJ/8vL + y//MzMz/zs7O/8/Pz//R0dH/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8DH///8B////Af///wH///8B3d3d49zc3P/a2tr/2dnZ/9fX1//W1tb/1NTU/8DAwP9GRkb/IiIi/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/JyEg/04j + HP+QKBX/tioR/70rEP+3KxL/gygX/zsiHv9tJRj/viwR/3AmGf8rISD/ISEh/yEhIf8nISD/dicY/7Eq + Ev88Ih7/IiIi/yIiIv8iIiL/JiIh/ykiIf82Ih7/likV/10mHP8kIiL/OCIe/5UpFv9pJxv/RCMe/3Ym + F/8xIyD/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yMjI/8jIyP/CgoK/wQE + BP9AQED/kpKS/7u7u//IyMj/ycnJ/8vLy//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//U1NT/1tbW/9fX + 1//Y2Nj/2tra/9vb2//c3Nz/3Nzc/97e3v/e3t7/39/f/+Dg4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDwMf///wH///8B////Af///wHe3t7j3d3d/9zc + 3P/a2tr/2dnZ/9fX1//W1tb/y8vL/2hoaP8sLCz/IyMj/yMjI/8kJCT/JCQk/yMjI/8jIyP/IyMj/yMj + I/8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEg/ywhH/9BIx3/TyQc/0AjHv8pISD/NCIe/6Iq + FP+cKRX/KyEf/yEhIf8hISH/ISEh/yQhIP9sJRj/vSsR/0sjHf8hISH/MCEf/0QiHP8oISD/IiIi/yci + If9CJB7/JyIh/zciH/+IJxX/cica/0YkHf+RKBX/YiYc/zoiHv9kJBn/RyMd/yUiIv8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/MTEx/x8fH/8NDQ3/Pz8//5WVlf+5ubn/ycnJ/8vLy//MzMz/zc3N/8/P + z//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg + 4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6enp/+np + 6f/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8P/x8fEx////Af///wH///8B////Ad/f3+Pe3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/xMTE/4yM + jP89PT3/JiYm/yMjI/8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yEhIf8hISH/ISEh/yEhIf8zIh//oioU/5AoFf8jICD/ISEh/yEhIf8gICD/OiEc/6Ao + Ev+rKhP/MiIf/ysgHv+EJhX/rikR/0QjHf8iIiL/IiIi/yIiIv8iIiL/TiMc/24nGv9CIx7/kikW/3co + Gf89Ix7/hicX/4EpGf9iJhv/KiMi/yMjI/8jIyP/IyMj/yMjI/8iIiL/JCQk/zg4OP9SUlL/XV1d/2Ji + Yv+ZmZn/xMTE/8zMzP/MzMz/zs7O/8/Pz//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/b29v/3Nzc/93d3f/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8TH///8B////Af///wH///8B4ODg49/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/0tLS/6qqqv9kZGT/Kysr/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/yYh + IP9zJxn/sCoS/1QhGP8oIB7/IyAf/zcgG/+MJRP/visR/2YlGf8oIB//aSMX/78rEf+CKBj/LCIg/yIi + Iv8iIiH/IyIh/yIhIf8oIiH/NyIe/4AmFv99KBj/PSId/4EnFv95KBn/LSMi/yYjIv8jIyL/IyMj/yMj + I/8jIyP/IiIi/yIiIv8lJSX/OTk5/1NTU/9nZ2f/hYWF/7m5uf/Nzc3/zs7O/8/Pz//Q0ND/0dHR/9LS + 0v/T09P/1NTU/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx + 8f/x8fH/8fHxMf///wH///8B////Af///wHh4eHj4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9TU1P+goKD/XFxc/y8vL/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/ykhIP9yJhj/qikS/54mEf+WJRH/rSgR/6sq + E/9kJRr/LyEe/3EkFv+/KxD/gygX/zAiH/8hISH/IiEh/zIiH/97JRX/VCMa/ysiIP9zJRf/eygZ/1Ek + HP+fKBP/likV/zMjIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JCQk/xEREf8HBwf/PT09/4GB + gf+0tLT/zs7O/8/Pz//R0dH/0tLS/9LS0v/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/x8fEx////Af///wH///8B////AeLi + 4uPh4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/ExMT/ioqK/0FB + Qf8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yghIP9FIx3/aCUZ/3UmGP9lJRn/QiMd/ychH/9YIhj/vSsR/5YpFf8wIh//ISEh/yEh + If8tIR//eSUW/7wsEf9lJhv/JyIh/0QkHv81IyD/YCUa/4spF/9UJR3/KyMh/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IiIi/yQkJP8XFxf/AgIC/xwcHP95eXn/sbGx/87Ozv/Q0ND/0tLS/9PT0//U1NT/1NTU/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/29vb/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx + 8f/y8vL/8vLy//Ly8jH///8B////Af///wH///8B4+Pj4+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/29vb/9ra2v/Z2dn/2NjY/9fX1//T09P/urq6/3t7e/81NTX/JSUl/yIiIv8jIyP/IyMj/yMj + I/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIP8iISD/JCEg/yIh + IP8lICD/WCIZ/7QqEf+sKxP/PiMe/yEhIP8hISH/KyAf/3klFv+7KxH/byca/yoiIf8iIiL/IyIi/y8i + IP9CIx3/MSMh/yQjIv8jIyL/IyMj/yMjI/8jIyP/IiIi/yMjI/8mJib/GBgY/wUFBf8eHh7/d3d3/7W1 + tf/Ozs7/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/19fX/9nZ2f/Z2dn/29vb/9zc3P/c3Nz/3t7e/97e + 3v/g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/PzMf///wH///8B////Af// + /wHk5OTj5OTk/+Li4v/i4uL/4ODg/+Dg4P/e3t7/3t7e/93d3f/c3Nz/29vb/9ra2v/a2tr/2dnZ/9jY + 2P/X19f/09PT/6SkpP9gYGD/Kioq/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/zIhHv+TKBT/qCoT/6EpFP82IR3/ISAg/yYg + H/9nIxf/uysR/4MoF/8uIiD/IiIi/yIiIv8xIiD/iSgW/48oFf81IyD/IyMj/yMjI/8jIyP/IyMj/yMj + I/8iIiL/KSkp/x8fH/8FBQX/FRUV/2lpaf+urq7/0NDQ/9TU1P/V1dX/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/Z2dn/29vb/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Pz8//z8/Mx////Af///wH///8B////AeXl5ePl5eX/5OTk/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/97e3v/c3Nz/3Nzc/9vb2//a2tr/2tra/9nZ2f/Y2Nj/1tbW/8nJyf+MjIz/RUVF/yYm + Jv8iIiL/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEh + If8hISH/JCEg/z0iHv9HIx3/pyoT/4gmE/9QIRj/dCQW/7orEf+OKRf/NCMf/yIiIv8iIiL/MCIf/4Em + Fv/ALRL/cCga/yojIv8jIyP/IyMj/yMjI/8jIyP/IiIi/yQkJP8eHh7/BQUF/wwMDP9hYWH/qamp/83N + zf/V1dX/1tbW/9fX1//X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8zH///8B////Af// + /wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/9/f3//e3t7/3d3d/9zc + 3P/c3Nz/29vb/9ra2v/Z2dn/2dnZ/9fX1/+8vLz/fHx8/zg4OP8kJCT/IiIi/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEh/yMhIP9TJBz/nSkV/7gr + Ef+2KxL/uiwS/08kHP8iIiL/IiIi/yoiIP+AJhX/vywS/3YoGv8pIyL/IyMj/yMjI/8jIyP/IyMj/yIi + Iv8qKir/JSUl/wkJCf8RERH/Xl5e/6enp//Pz8//19fX/9jY2P/Y2Nj/2dnZ/9ra2v/a2tr/3Nzc/9zc + 3P/d3d3/3t7e/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5+fn/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/PzMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5OTk/+Pj + 4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/29vb/9vb2//a2tr/2dnZ/9nZ + 2f/R0dH/pKSk/19fX/9LS0v/YmJi/2FhYf9PT0//LS0t/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8hISH/ISEh/yMhIP82Ix//TiQd/0okHf+iKhT/YCQZ/yQhIf8oISD/aCQY/8As + Ef+BKRn/MCMh/yMjI/8jIyP/IyMj/yMjI/8iIiL/Kysr/0xMTP9MTEz/QkJC/2RkZP+ysrL/zs7O/9jY + 2P/Z2dn/2dnZ/9ra2v/b29v/3Nzc/9zc3P/e3t7/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/z8/Mx////Af// + /wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg + 4P/g4OD/39/f/97e3v/e3t7/3d3d/9zc3P/c3Nz/29vb/9ra2v/a2tr/1tbW/9TU1P/Y2Nj/19fX/9TU + 1P+1tbX/ZWVl/ysrK/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEh + If8iIiH/IiIh/2YnG/+zKxL/nCgT/6MoEv/BLBH/gSkZ/zAkIf8jIyL/IyMj/yMjI/8jIyP/IiIi/ycn + J/84ODj/VFRU/2JiYv92dnb/q6ur/9fX1//a2tr/2tra/9vb2//c3Nz/3d3d/93d3f/e3t7/39/f/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Pz + 8//z8/P/8/Pz//Pz8//09PT/9PT0//Pz8zH///8B////Af///wH///8B6enp4+np6f/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d + 3f/d3d3/3Nzc/9vb2//b29v/29vb/9ra2v/a2tr/2dnZ/9nZ2f/Dw8P/YmJi/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/KiIh/10mHP+UKhb/nSsW/28o + G/8uIyH/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/ISEh/xQUFP8uLi7/Z2dn/4+Pj//Ozs7/29vb/9zc + 3P/c3Nz/3d3d/97e3v/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm + 5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx + 8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0Mf// + /wH///8B////Af///wHq6urj6urq/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/97e3v/e3t7/3d3d/93d3f/d3d3/3Nzc/9zc + 3P/b29v/29vb/9ra2v+mpqb/Kioq/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/JCMi/ysjIv8sIyH/JiMi/yMjIv8jIyP/IyMj/yMjI/8iIiL/IiIi/x0d + Hf8ICAj/BQUF/zs7O/+Wlpb/x8fH/9zc3P/d3d3/3t7e/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6urq/+rq + 6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//X19f/19fUx////Af///wH///8B////Aevr6+Pr6+v/6urq/+rq + 6v/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh + 4f/h4eH/4ODg/+Dg4P/f39//3t7e/97e3v/e3t7/3d3d/93d3f/c3Nz/3Nzc/8HBwf83Nzf/IiIi/yIi + Iv8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yIiIv8hISH/DQ0N/wMDA/80NDT/kJCQ/8nJyf/d3d3/39/f/9/f + 3//g4OD/4ODg/+Hh4f/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5eXl/+bm5v/n5+f/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X1 + 9TH///8B////Af///wH///8B7Ozs4+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Xl5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/9/f + 3//f39//3t7e/97e3v/d3d3/19fX/4uLi/89PT3/JCQk/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JSUl/w4O + Dv8CAgL/IyMj/4KCgv/FxcX/39/f/+Dg4P/g4OD/4eHh/+Hh4f/i4uL/4uLi/+Pj4//j4+P/5OTk/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr + 6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1Mf///wH///8B////Af///wHt7e3j7Ozs/+zs + 7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Xl + 5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Hh4f/g4OD/4ODg/9/f3//f39//3d3d/76+ + vv9ycnL/ODg4/yQkJP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yMjI/8RERH/AgIC/yYmJv+IiIj/xcXF/9/f3//i4uL/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+np + 6f/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vYx////Af///wH///8B////Ae3t7ePt7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Li + 4v/i4uL/4uLi/+Hh4f/h4eH/4eHh/+Dg4P/g4OD/4ODg/9TU1P+np6f/XFxc/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8nJyf/FBQU/wIC + Av8cHBz/dnZ2/8TExP/f39//4uLi/+Pj4//j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6enp/+np6f/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b29jH///8B////Af///wH///8B7u7u4+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo + 6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//i4uL/4uLi/+Li + 4v/i4uL/4eHh/+Hh4f/X19f/l5eX/05OTv8oKCj/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/Tk5O/5iYmP9zc3P/UVFR/5OTk//Gxsb/4uLi/+Tk5P/k5OT/5eXl/+Xl + 5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2Mf///wH///8B////Af///wHu7u7j7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/r6+v/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5eXl/+Tk5P/k5OT/5OTk/+Pj4//j4+P/4+Pj/+Pj4//i4uL/4uLi/+Pj4//g4OD/xMTE/3d3 + d/82Njb/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IiIi/0RERP+urq7/4uLi/+Li + 4v/a2tr/4ODg/+Tk5P/l5eX/5eXl/+Xl5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u + 7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 + 9P/09PT/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vYx////Af///wH///8B////Ae/v + 7+Pu7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq + 6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk + 5P/k5OT/5OTk/+Pj4//j4+P/5OTk/+Tk5P/k5OT/29vb/7i4uP9ra2v/LS0t/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IiIi/yMjI/84ODj/ra2t/+Li4v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm5v/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b2 + 9v/29vb/9vb2//b29jH///8B////Af///wH///8B8PDw4+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6enp/+jo + 6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm + 5v/m5ub/5ubm/9jY2P+dnZ3/V1dX/yYmJv8iIiL/IyMj/yMjI/8iIiL/PDw8/6CgoP/l5eX/5+fn/+fn + 5//n5+f/5+fn/+fn5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2Mf///wH///8B////Af// + /wHw8PDj8PDw//Dw8P/v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+np6f/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn + 5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+fn5//n5+f/5+fn/+Tk5P/MzMz/eHh4/zY2 + Nv8kJCT/IiIi/y0tLf+ampr/4ODg/+fn5//o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6enp/+np + 6f/p6en/6enp/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b2 + 9v/29vb/9vb2//f39//29vYx////Af///wH///8B////AfHx8ePx8fH/8PDw//Dw8P/w8PD/7+/v/+/v + 7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr + 6//q6ur/6urq/+rq6v/p6en/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo + 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/k5OT/xcXF/3R0dP9MTEz/kZGR/+bm5v/p6en/6enp/+np + 6f/p6en/6enp/+np6f/q6ur/6urq/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X1 + 9f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//b29jH///8B////Af// + /wH///8B8fHx4/Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u + 7v/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+np + 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np + 6f/p6en/3d3d/83Nzf/h4eH/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/39/f/9/f3//f39//39/f/9vb2Mf///wH///8B////Af///wHy8vLj8fHx//Hx8f/x8fH/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+rq + 6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//f39//39/cx////Af// + /wH///8B////AfLy8uPy8vL/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw/+/v + 7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX1//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f3 + 9//39/f/9/f3//f39//39/f/9/f3//j4+DH///8B////Af///wH///8B8/Pz4/Pz8//y8vL/8vLy//Ly + 8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7+/v/+/v + 7//u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T0 + 9P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//f39//39/f/9/f3//f39//4+Pj/+Pj4Mf// + /wH///8B////Af///wHz8/Pj8/Pz//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/9/f3//f3 + 9//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pgx////Af///wH///8B////AfT09OP09PT/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4 + +DH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ROMVault2/frmSetDir.Designer.cs b/ROMVault2/frmSetDir.Designer.cs new file mode 100644 index 0000000..202169f --- /dev/null +++ b/ROMVault2/frmSetDir.Designer.cs @@ -0,0 +1,241 @@ +namespace ROMVault2 +{ + partial class FrmSetDir + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSetDir)); + this.DataGridGames = new System.Windows.Forms.DataGridView(); + this.CDAT = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.CROM = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.btnDeleteSelected = new System.Windows.Forms.Button(); + this.grpBoxAddNew = new System.Windows.Forms.GroupBox(); + this.btnSetRomLocation = new System.Windows.Forms.Button(); + this.txtROMLocation = new System.Windows.Forms.Label(); + this.lblROMLocation = new System.Windows.Forms.Label(); + this.txtDATLocation = new System.Windows.Forms.Label(); + this.lblDATLocation = new System.Windows.Forms.Label(); + this.lblDelete = new System.Windows.Forms.Label(); + this.btnClose = new System.Windows.Forms.Button(); + this.btnResetAll = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.DataGridGames)).BeginInit(); + this.grpBoxAddNew.SuspendLayout(); + this.SuspendLayout(); + // + // DataGridGames + // + this.DataGridGames.AllowUserToAddRows = false; + this.DataGridGames.AllowUserToDeleteRows = false; + this.DataGridGames.AllowUserToResizeRows = false; + this.DataGridGames.BackgroundColor = System.Drawing.Color.White; + this.DataGridGames.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.DataGridGames.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.CDAT, + this.CROM}); + this.DataGridGames.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.DataGridGames.Location = new System.Drawing.Point(12, 135); + this.DataGridGames.Name = "DataGridGames"; + this.DataGridGames.ReadOnly = true; + this.DataGridGames.RowHeadersVisible = false; + this.DataGridGames.RowTemplate.Height = 17; + this.DataGridGames.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.DataGridGames.ShowCellErrors = false; + this.DataGridGames.ShowCellToolTips = false; + this.DataGridGames.ShowEditingIcon = false; + this.DataGridGames.ShowRowErrors = false; + this.DataGridGames.Size = new System.Drawing.Size(670, 214); + this.DataGridGames.TabIndex = 10; + this.DataGridGames.DoubleClick += new System.EventHandler(this.DataGridGamesDoubleClick); + // + // CDAT + // + this.CDAT.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.CDAT.HeaderText = "DAT Location"; + this.CDAT.Name = "CDAT"; + this.CDAT.ReadOnly = true; + // + // CROM + // + this.CROM.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.CROM.HeaderText = "ROM Location"; + this.CROM.Name = "CROM"; + this.CROM.ReadOnly = true; + // + // btnDeleteSelected + // + this.btnDeleteSelected.Location = new System.Drawing.Point(12, 355); + this.btnDeleteSelected.Name = "btnDeleteSelected"; + this.btnDeleteSelected.Size = new System.Drawing.Size(96, 25); + this.btnDeleteSelected.TabIndex = 11; + this.btnDeleteSelected.Text = "Delete Selected"; + this.btnDeleteSelected.UseVisualStyleBackColor = true; + this.btnDeleteSelected.Click += new System.EventHandler(this.BtnDeleteSelectedClick); + // + // grpBoxAddNew + // + this.grpBoxAddNew.Controls.Add(this.btnSetRomLocation); + this.grpBoxAddNew.Controls.Add(this.txtROMLocation); + this.grpBoxAddNew.Controls.Add(this.lblROMLocation); + this.grpBoxAddNew.Controls.Add(this.txtDATLocation); + this.grpBoxAddNew.Controls.Add(this.lblDATLocation); + this.grpBoxAddNew.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.grpBoxAddNew.Location = new System.Drawing.Point(12, 12); + this.grpBoxAddNew.Name = "grpBoxAddNew"; + this.grpBoxAddNew.Size = new System.Drawing.Size(670, 91); + this.grpBoxAddNew.TabIndex = 14; + this.grpBoxAddNew.TabStop = false; + this.grpBoxAddNew.Text = "Add New Directory Mapping"; + // + // btnSetRomLocation + // + this.btnSetRomLocation.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSetRomLocation.Location = new System.Drawing.Point(617, 53); + this.btnSetRomLocation.Name = "btnSetRomLocation"; + this.btnSetRomLocation.Size = new System.Drawing.Size(47, 24); + this.btnSetRomLocation.TabIndex = 14; + this.btnSetRomLocation.Text = "Set"; + this.btnSetRomLocation.UseVisualStyleBackColor = true; + this.btnSetRomLocation.Click += new System.EventHandler(this.BtnSetRomLocationClick); + // + // txtROMLocation + // + this.txtROMLocation.BackColor = System.Drawing.Color.White; + this.txtROMLocation.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtROMLocation.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtROMLocation.Location = new System.Drawing.Point(89, 55); + this.txtROMLocation.Name = "txtROMLocation"; + this.txtROMLocation.Size = new System.Drawing.Size(515, 22); + this.txtROMLocation.TabIndex = 13; + this.txtROMLocation.Text = "label2"; + this.txtROMLocation.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblROMLocation + // + this.lblROMLocation.AutoSize = true; + this.lblROMLocation.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblROMLocation.Location = new System.Drawing.Point(12, 60); + this.lblROMLocation.Name = "lblROMLocation"; + this.lblROMLocation.Size = new System.Drawing.Size(79, 13); + this.lblROMLocation.TabIndex = 12; + this.lblROMLocation.Text = "ROM Location:"; + // + // txtDATLocation + // + this.txtDATLocation.BackColor = System.Drawing.Color.White; + this.txtDATLocation.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtDATLocation.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtDATLocation.Location = new System.Drawing.Point(89, 25); + this.txtDATLocation.Name = "txtDATLocation"; + this.txtDATLocation.Size = new System.Drawing.Size(515, 22); + this.txtDATLocation.TabIndex = 11; + this.txtDATLocation.Text = "label2"; + this.txtDATLocation.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblDATLocation + // + this.lblDATLocation.AutoSize = true; + this.lblDATLocation.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblDATLocation.Location = new System.Drawing.Point(12, 30); + this.lblDATLocation.Name = "lblDATLocation"; + this.lblDATLocation.Size = new System.Drawing.Size(76, 13); + this.lblDATLocation.TabIndex = 10; + this.lblDATLocation.Text = "DAT Location:"; + // + // lblDelete + // + this.lblDelete.AutoSize = true; + this.lblDelete.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblDelete.Location = new System.Drawing.Point(20, 111); + this.lblDelete.Name = "lblDelete"; + this.lblDelete.Size = new System.Drawing.Size(144, 13); + this.lblDelete.TabIndex = 15; + this.lblDelete.Text = "Delete Existing Mapping"; + // + // btnClose + // + this.btnClose.Location = new System.Drawing.Point(586, 355); + this.btnClose.Name = "btnClose"; + this.btnClose.Size = new System.Drawing.Size(96, 25); + this.btnClose.TabIndex = 16; + this.btnClose.Text = "Done"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.BtnCloseClick); + // + // btnResetAll + // + this.btnResetAll.Location = new System.Drawing.Point(138, 355); + this.btnResetAll.Name = "btnResetAll"; + this.btnResetAll.Size = new System.Drawing.Size(96, 25); + this.btnResetAll.TabIndex = 17; + this.btnResetAll.Text = "Reset All"; + this.btnResetAll.UseVisualStyleBackColor = true; + this.btnResetAll.Click += new System.EventHandler(this.BtnResetAllClick); + // + // FrmSetDir + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(694, 391); + this.Controls.Add(this.btnResetAll); + this.Controls.Add(this.btnClose); + this.Controls.Add(this.lblDelete); + this.Controls.Add(this.grpBoxAddNew); + this.Controls.Add(this.btnDeleteSelected); + this.Controls.Add(this.DataGridGames); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmSetDir"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Set ROM Directories"; + this.Activated += new System.EventHandler(this.FrmSetDirActivated); + ((System.ComponentModel.ISupportInitialize)(this.DataGridGames)).EndInit(); + this.grpBoxAddNew.ResumeLayout(false); + this.grpBoxAddNew.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.DataGridView DataGridGames; + private System.Windows.Forms.DataGridViewTextBoxColumn CDAT; + private System.Windows.Forms.DataGridViewTextBoxColumn CROM; + private System.Windows.Forms.Button btnDeleteSelected; + private System.Windows.Forms.GroupBox grpBoxAddNew; + private System.Windows.Forms.Button btnSetRomLocation; + private System.Windows.Forms.Label txtROMLocation; + private System.Windows.Forms.Label lblROMLocation; + private System.Windows.Forms.Label txtDATLocation; + private System.Windows.Forms.Label lblDATLocation; + private System.Windows.Forms.Label lblDelete; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnResetAll; + } +} \ No newline at end of file diff --git a/ROMVault2/frmSetDir.cs b/ROMVault2/frmSetDir.cs new file mode 100644 index 0000000..fa07d0f --- /dev/null +++ b/ROMVault2/frmSetDir.cs @@ -0,0 +1,167 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Drawing; +using System.Windows.Forms; +using ROMVault2.Properties; +using ROMVault2.Utils; + +namespace ROMVault2 +{ + public partial class FrmSetDir : Form + { + private string _datLocation; + + private readonly Color _cMagenta = Color.FromArgb(255, 214, 255); + private readonly Color _cGreen = Color.FromArgb(214, 255, 214); + private readonly Color _cYellow = Color.FromArgb(255, 255, 214); + + public FrmSetDir() + { + InitializeComponent(); + } + + public void SetLocation(string dLocation) + { + _datLocation = dLocation; + txtDATLocation.Text = _datLocation; + txtROMLocation.Text = DBHelper.GetRealPath(_datLocation); + UpdateGrid(); + } + + private void UpdateGrid() + { + DataGridGames.Rows.Clear(); + foreach (DirMap t in Settings.DirPathMap) + { + DataGridGames.Rows.Add(); + int row = DataGridGames.Rows.Count - 1; + string key = t.DirKey; + DataGridGames.Rows[row].Cells["CDAT"].Value = t.DirKey; + DataGridGames.Rows[row].Cells["CROM"].Value = t.DirPath; + + if (key == "ToSort") + { + DataGridGames.Rows[row].Cells["CDAT"].Style.BackColor = _cMagenta; + DataGridGames.Rows[row].Cells["CROM"].Style.BackColor = _cMagenta; + } + else if (key == _datLocation) + { + DataGridGames.Rows[row].Cells["CDAT"].Style.BackColor = _cGreen; + DataGridGames.Rows[row].Cells["CROM"].Style.BackColor = _cGreen; + } + else if (key.Length >= _datLocation.Length) + { + if (key.Substring(0, _datLocation.Length) == _datLocation) + { + DataGridGames.Rows[row].Cells["CDAT"].Style.BackColor = _cYellow; + DataGridGames.Rows[row].Cells["CROM"].Style.BackColor = _cYellow; + } + } + } + + for (int j = 0; j < DataGridGames.Rows.Count; j++) + { + DataGridGames.Rows[j].Selected = false; + } + } + + + private void BtnSetRomLocationClick(object sender, EventArgs e) + { + FolderBrowserDialog browse = new FolderBrowserDialog + { + ShowNewFolderButton = true, + Description = Resources.FrmSetDir_BtnSetRomLocationClick_Please_select_a_folder_for_This_Rom_Set, + RootFolder = Environment.SpecialFolder.DesktopDirectory, + SelectedPath = DBHelper.GetRealPath(_datLocation) + }; + if (browse.ShowDialog() == DialogResult.OK) + { + for (int i = 0; i < Settings.DirPathMap.Count; i++) + { + if (Settings.DirPathMap[i].DirKey == _datLocation) + { + Settings.DirPathMap.RemoveAt(i); + i--; + } + } + + + string relPath = RelativePath.MakeRelative(AppDomain.CurrentDomain.BaseDirectory, browse.SelectedPath); + + Settings.DirPathMap.Add(new DirMap(_datLocation, relPath)); + Settings.DirPathMap.Sort(); + SetLocation(_datLocation); + Settings.WriteConfig(); + + //db.CheckNamesToLong(); + } + } + + private void BtnDeleteSelectedClick(object sender, EventArgs e) + { + for (int j = 0; j < DataGridGames.SelectedRows.Count; j++) + { + string datLocation = DataGridGames.SelectedRows[j].Cells["CDAT"].Value.ToString(); + + if (datLocation == "ToSort" || datLocation == "RomVault") + { + ReportError.Show(Resources.FrmSetDir_BtnDeleteSelectedClick_You_cannot_delete_the + datLocation + Resources.FrmSetDir_BtnDeleteSelectedClick_Directory_Settings, + Resources.FrmSetDir_BtnDeleteSelectedClick_RomVault_Rom_Location); + } + else + { + for (int i = 0; i < Settings.DirPathMap.Count; i++) + { + if (Settings.DirPathMap[i].DirKey == datLocation) + { + Settings.DirPathMap.RemoveAt(i); + i--; + } + } + } + } + Settings.WriteConfig(); + UpdateGrid(); + //db.CheckNamesToLong(); + } + + private void BtnCloseClick(object sender, EventArgs e) + { + //db.CheckNamesToLong(); + Close(); + } + + private void DataGridGamesDoubleClick(object sender, EventArgs e) + { + if (DataGridGames.SelectedRows.Count <= 0) return; + + grpBoxAddNew.Text = Resources.FrmSetDir_DataGridGamesDoubleClick_Edit_Existing_Directory_Mapping; + SetLocation(DataGridGames.SelectedRows[0].Cells["CDAT"].Value.ToString()); + } + + private void FrmSetDirActivated(object sender, EventArgs e) + { + + for (int j = 0; j < DataGridGames.Rows.Count; j++) + { + DataGridGames.Rows[j].Selected = false; + } + } + + private void BtnResetAllClick(object sender, EventArgs e) + { + Settings.ResetDirectories(); + Settings.WriteConfig(); + UpdateGrid(); + } + + + + } +} diff --git a/ROMVault2/frmSettings.Designer.cs b/ROMVault2/frmSettings.Designer.cs new file mode 100644 index 0000000..742994e --- /dev/null +++ b/ROMVault2/frmSettings.Designer.cs @@ -0,0 +1,271 @@ +namespace ROMVault2 +{ + partial class FrmSettings + { + /// + /// 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.label1 = new System.Windows.Forms.Label(); + this.lblDATRoot = new System.Windows.Forms.Label(); + this.btnDAT = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.cboFixLevel = new System.Windows.Forms.ComboBox(); + this.cboScanLevel = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.chkDebugLogs = new System.Windows.Forms.CheckBox(); + this.chkCacheSaveTimer = new System.Windows.Forms.CheckBox(); + this.upTime = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + this.chkDoubleCheckDelete = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.upTime)).BeginInit(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(8, 19); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(103, 13); + this.label1.TabIndex = 0; + this.label1.Text = "DAT Root Directory:"; + // + // lblDATRoot + // + this.lblDATRoot.BackColor = System.Drawing.Color.White; + this.lblDATRoot.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblDATRoot.Location = new System.Drawing.Point(123, 14); + this.lblDATRoot.Name = "lblDATRoot"; + this.lblDATRoot.Size = new System.Drawing.Size(357, 22); + this.lblDATRoot.TabIndex = 3; + this.lblDATRoot.Text = "label4"; + this.lblDATRoot.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // btnDAT + // + this.btnDAT.Location = new System.Drawing.Point(486, 12); + this.btnDAT.Name = "btnDAT"; + this.btnDAT.Size = new System.Drawing.Size(47, 24); + this.btnDAT.TabIndex = 6; + this.btnDAT.Text = "Set"; + this.btnDAT.UseVisualStyleBackColor = true; + this.btnDAT.Click += new System.EventHandler(this.BtnDatClick); + // + // btnOK + // + this.btnOK.Location = new System.Drawing.Point(167, 314); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(89, 23); + this.btnOK.TabIndex = 9; + this.btnOK.Text = "OK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.BtnOkClick); + // + // btnCancel + // + this.btnCancel.Location = new System.Drawing.Point(280, 314); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(89, 23); + this.btnCancel.TabIndex = 10; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.BtnCancelClick); + // + // textBox1 + // + this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBox1.Location = new System.Drawing.Point(123, 111); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(357, 136); + this.textBox1.TabIndex = 12; + // + // label4 + // + this.label4.Location = new System.Drawing.Point(8, 113); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(106, 72); + this.label4.TabIndex = 13; + this.label4.Text = "Filenames not to remove from RomDir\'s : (Put each file on its ow" + + "n line)"; + // + // cboFixLevel + // + this.cboFixLevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboFixLevel.FormattingEnabled = true; + this.cboFixLevel.Location = new System.Drawing.Point(123, 75); + this.cboFixLevel.Name = "cboFixLevel"; + this.cboFixLevel.Size = new System.Drawing.Size(357, 21); + this.cboFixLevel.TabIndex = 14; + // + // cboScanLevel + // + this.cboScanLevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboScanLevel.FormattingEnabled = true; + this.cboScanLevel.Location = new System.Drawing.Point(123, 48); + this.cboScanLevel.Name = "cboScanLevel"; + this.cboScanLevel.Size = new System.Drawing.Size(357, 21); + this.cboScanLevel.TabIndex = 15; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(8, 51); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(84, 13); + this.label2.TabIndex = 16; + this.label2.Text = "Scanning Level:"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(8, 79); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(66, 13); + this.label3.TabIndex = 17; + this.label3.Text = "Fixing Level:"; + // + // chkDebugLogs + // + this.chkDebugLogs.AutoSize = true; + this.chkDebugLogs.Location = new System.Drawing.Point(279, 261); + this.chkDebugLogs.Name = "chkDebugLogs"; + this.chkDebugLogs.Size = new System.Drawing.Size(126, 17); + this.chkDebugLogs.TabIndex = 18; + this.chkDebugLogs.Text = "Debug Logs Enabled"; + this.chkDebugLogs.UseVisualStyleBackColor = true; + // + // chkCacheSaveTimer + // + this.chkCacheSaveTimer.AutoSize = true; + this.chkCacheSaveTimer.Location = new System.Drawing.Point(125, 285); + this.chkCacheSaveTimer.Name = "chkCacheSaveTimer"; + this.chkCacheSaveTimer.Size = new System.Drawing.Size(156, 17); + this.chkCacheSaveTimer.TabIndex = 19; + this.chkCacheSaveTimer.Text = "Save Cache On Timer Ever"; + this.chkCacheSaveTimer.UseVisualStyleBackColor = true; + // + // upTime + // + this.upTime.Increment = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.upTime.Location = new System.Drawing.Point(279, 283); + this.upTime.Maximum = new decimal(new int[] { + 60, + 0, + 0, + 0}); + this.upTime.Minimum = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.upTime.Name = "upTime"; + this.upTime.Size = new System.Drawing.Size(47, 20); + this.upTime.TabIndex = 20; + this.upTime.Value = new decimal(new int[] { + 10, + 0, + 0, + 0}); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(329, 286); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(44, 13); + this.label5.TabIndex = 21; + this.label5.Text = "Minutes"; + // + // chkDoubleCheckDelete + // + this.chkDoubleCheckDelete.AutoSize = true; + this.chkDoubleCheckDelete.Location = new System.Drawing.Point(125, 261); + this.chkDoubleCheckDelete.Name = "chkDoubleCheckDelete"; + this.chkDoubleCheckDelete.Size = new System.Drawing.Size(128, 17); + this.chkDoubleCheckDelete.TabIndex = 22; + this.chkDoubleCheckDelete.Text = "Double Check Delete"; + this.chkDoubleCheckDelete.UseVisualStyleBackColor = true; + // + // FrmSettings + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(545, 346); + this.Controls.Add(this.chkDoubleCheckDelete); + this.Controls.Add(this.label5); + this.Controls.Add(this.upTime); + this.Controls.Add(this.chkCacheSaveTimer); + this.Controls.Add(this.chkDebugLogs); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.cboScanLevel); + this.Controls.Add(this.cboFixLevel); + this.Controls.Add(this.label4); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.btnDAT); + this.Controls.Add(this.lblDATRoot); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "FrmSettings"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "RomVault Settings"; + this.Load += new System.EventHandler(this.FrmConfigLoad); + ((System.ComponentModel.ISupportInitialize)(this.upTime)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblDATRoot; + private System.Windows.Forms.Button btnDAT; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox cboFixLevel; + private System.Windows.Forms.ComboBox cboScanLevel; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox chkDebugLogs; + private System.Windows.Forms.CheckBox chkCacheSaveTimer; + private System.Windows.Forms.NumericUpDown upTime; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox chkDoubleCheckDelete; + } +} \ No newline at end of file diff --git a/ROMVault2/frmSettings.cs b/ROMVault2/frmSettings.cs new file mode 100644 index 0000000..dc98973 --- /dev/null +++ b/ROMVault2/frmSettings.cs @@ -0,0 +1,101 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using ROMVault2.Properties; + +namespace ROMVault2 +{ + public partial class FrmSettings : Form + { + public FrmSettings() + { + InitializeComponent(); + + cboScanLevel.Items.Clear(); + cboScanLevel.Items.Add("Level1"); + cboScanLevel.Items.Add("Level2"); + cboScanLevel.Items.Add("Level3"); + + cboFixLevel.Items.Clear(); + cboFixLevel.Items.Add("TorrentZip Level 1"); + cboFixLevel.Items.Add("TorrentZip Level 2"); + cboFixLevel.Items.Add("TorrentZip Level 3"); + cboFixLevel.Items.Add("Level1"); + cboFixLevel.Items.Add("Level2"); + cboFixLevel.Items.Add("Level3"); + } + + private void FrmConfigLoad(object sender, EventArgs e) + { + lblDATRoot.Text = Settings.DatRoot; + cboScanLevel.SelectedIndex = (int)Settings.ScanLevel; + cboFixLevel.SelectedIndex = (int)Settings.FixLevel; + + textBox1.Text = ""; + for (int i = 0; i < Settings.IgnoreFiles.Count; i++) + textBox1.Text += Settings.IgnoreFiles[i] + Environment.NewLine; + + chkDoubleCheckDelete.Checked = Settings.DoubleCheckDelete; + chkCacheSaveTimer.Checked = Settings.CacheSaveTimerEnabled; + upTime.Value = Settings.CacheSaveTimePeriod; + chkDebugLogs.Checked = Settings.DebugLogsEnabled; + } + + private void BtnCancelClick(object sender, EventArgs e) + { + Close(); + } + + private void BtnOkClick(object sender, EventArgs e) + { + Settings.DatRoot = lblDATRoot.Text; + Settings.ScanLevel = (eScanLevel)cboScanLevel.SelectedIndex; + Settings.FixLevel = (eFixLevel)cboFixLevel.SelectedIndex; + + string strtxt = textBox1.Text; + strtxt = strtxt.Replace("\r", ""); + string[] strsplit = strtxt.Split('\n'); + + Settings.IgnoreFiles = new List(strsplit); + for (int i = 0; i < Settings.IgnoreFiles.Count; i++) + { + Settings.IgnoreFiles[i] = Settings.IgnoreFiles[i].Trim(); + if (string.IsNullOrEmpty(Settings.IgnoreFiles[i])) + { + Settings.IgnoreFiles.RemoveAt(i); + i--; + } + } + + Settings.DoubleCheckDelete = chkDoubleCheckDelete.Checked; + Settings.DebugLogsEnabled = chkDebugLogs.Checked; + Settings.CacheSaveTimerEnabled = chkCacheSaveTimer.Checked; + Settings.CacheSaveTimePeriod = (int)upTime.Value; + + Settings.WriteConfig(); + Close(); + } + + private void BtnDatClick(object sender, EventArgs e) + { + FolderBrowserDialog browse = new FolderBrowserDialog + { + ShowNewFolderButton = true, + Description = Resources.FrmSettings_BtnDatClick_Please_select_a_folder_for_DAT_Root, + RootFolder = Environment.SpecialFolder.DesktopDirectory, + SelectedPath = Settings.DatRoot + }; + + if (browse.ShowDialog() != DialogResult.OK) return; + + lblDATRoot.Text = Utils.RelativePath.MakeRelative(AppDomain.CurrentDomain.BaseDirectory, browse.SelectedPath); + } + + } +} diff --git a/ROMVault2/frmSettings.resx b/ROMVault2/frmSettings.resx new file mode 100644 index 0000000..5ea0895 --- /dev/null +++ b/ROMVault2/frmSettings.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ROMVault2/frmShowError.Designer.cs b/ROMVault2/frmShowError.Designer.cs new file mode 100644 index 0000000..71d830b --- /dev/null +++ b/ROMVault2/frmShowError.Designer.cs @@ -0,0 +1,89 @@ +namespace ROMVault2 +{ + partial class frmShowError + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmShowError)); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(12, 12); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBox1.Size = new System.Drawing.Size(565, 525); + this.textBox1.TabIndex = 0; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(460, 543); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(117, 28); + this.button1.TabIndex = 1; + this.button1.Text = "Exit"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(20, 551); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(202, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Sending Error Message to RomVault.Com"; + // + // frmShowError + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(589, 583); + this.Controls.Add(this.label1); + this.Controls.Add(this.button1); + this.Controls.Add(this.textBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "frmShowError"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "RomVault Error report"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/ROMVault2/frmShowError.cs b/ROMVault2/frmShowError.cs new file mode 100644 index 0000000..6e12bec --- /dev/null +++ b/ROMVault2/frmShowError.cs @@ -0,0 +1,29 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.Windows.Forms; + +namespace ROMVault2 +{ + public partial class frmShowError : Form + { + public frmShowError() + { + InitializeComponent(); + } + + public void settype(string s) + { + textBox1.Text = s; + } + + private void button1_Click(object sender, EventArgs e) + { + Environment.Exit(0); + } + } +} diff --git a/ROMVault2/frmShowError.resx b/ROMVault2/frmShowError.resx new file mode 100644 index 0000000..1e12950 --- /dev/null +++ b/ROMVault2/frmShowError.resx @@ -0,0 +1,1787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAAAIABoBAAAVgAAACAgAAAAACAAqBAAAL4EAAAwMAAAAAAgAKglAABmFQAAQEAAAAAA + IAAoQgAADjsAAICAAAAAACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAA + AAAAAAAA7e3tvevr6//m5ub/4ODg/9nZ2f/Q0ND/wsLC/66urv+ampr/nJyc/6Kiov+tra3/ubm5/8XF + xf/R0dH/2trapenp6b3l5eX/3t7e/9bW1v/Kysr/ubm5/5+fn/92dnb/ampq/21tbf97e3v/jIyM/56e + nv+wsLD/wsLC/8/Pz6Xl5eW939/f/9bW1v/Jycn/uLi4/5ycnP9ubm7/YWFh/2pqav8tLS3/RERE/2lp + af+AgID/mJiY/7Kysv/FxcWl39/fvdjY2P/Ly8v/ubm5/56env9ycnL/VlZW/2RkZP92dnb/IyMj/yAg + IP8qKir/VlZW/319ff+ioqL/v7+/pdnZ2b3Nzc3/u7u7/6Kiov94eHj/U1NT/15eXv99fX3/IiIi/yYm + Jv8lJSX/IyMj/yAgIP8+Pj7/hoaG/76+vqXQ0NC9wMDA/6ampv+AgID/U1NT/1tbW/+BgYH/ISEh/yUl + Jf8lJSX/JiYm/yYmJv8lJSX/IiIi/2BgYP/Dw8OlxsbGva6urv+Hh4f/VlZW/1paWv+BgYH/JCQk/yUl + Jf8kJCT/JSUl/yUlJf8mJib/JiYm/yQkJP91dXX/zc3Npby8vL2Wlpb/XV1d/1tbW/+AgID/JiYm/zs7 + O/9ubm7/YWFh/ykpKf8kJCT/JSUl/yUlJf9ZWVn/xcXF/9XV1aW4uLi9dXV1/2JiYv9/f3//Kysr/0BA + QP/FxcX/zMzM/8vLy/+hoaH/JCQk/yQkJP9NTU3/v7+//9LS0v/c3NylvLy8vXJycv9/f3//NjY2/yMj + I/9lZWX/zc3N/83Nzf/MzMz/ycnJ/ykpKf9DQ0P/uLi4/9DQ0P/c3Nz/4+PjpcDAwL1/f3//QkJC/yQi + Iv8jIyP/Li4u/6ioqP/MzMz/ysrK/3h4eP88PDz/s7Oz/8/Pz//b29v/4+Pj/+jo6KXR0dG9bm5u/yQi + Iv9hJRr/SCQd/0QkHv8yJCH/Ozs7/zExMf82Njb/r6+v/9HR0f/b29v/4+Pj/+jo6P/s7Oyl29vbvX9/ + f/8lJSX/PiMe/1okGv9dJBr/VSQc/zokIP8yMjL/rq6u/9XV1f/e3t7/5OTk/+np6f/t7e3/8PDwpeXl + 5b3f39//t7e3/2tra/8lJSX/RyMd/1QlHP8vLi7/ra2t/93d3f/j4+P/6Ojo/+vr6//u7u7/8fHx//Pz + 86Xs7Oy96enp/+bm5v/i4uL/n5+f/zY2Nv9JSUn/q6ur/+bm5v/p6en/7Ozs/+7u7v/w8PD/8vLy//T0 + 9P/19fWl8fHxvfDw8P/u7u7/7Ozs/+rq6v/g4OD/39/f/+zs7P/u7u7/7+/v//Hx8f/y8vL/9PT0//X1 + 9f/29vb/9/f3pQAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8oAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAA7+/vee7u + 7v/t7e3/6+vr/+np6f/n5+f/5OTk/+Hh4f/e3t7/29vb/9fX1//T09P/zc3N/8XFxf++vr7/uLi4/7Cw + sP+rq6v/qKio/6ioqP+rq6v/rq6u/7Kysv+4uLj/vb29/8LCwv/Hx8f/zMzM/9HR0f/X19f/3Nzc/9/f + 303t7e157Ozs/+rq6v/o6Oj/5ubm/+Pj4//g4OD/3Nzc/9jY2P/U1NT/z8/P/8jIyP/AwMD/tra2/6qq + qv+YmJj/goKC/42Njf+NjY3/kZGR/5aWlv+bm5v/oqKi/6qqqv+wsLD/tra2/729vf/Dw8P/ysrK/9HR + 0f/X19f/29vbTevr63nq6ur/6Ojo/+Xl5f/i4uL/3t7e/9vb2//W1tb/0tLS/8zMzP/ExMT/u7u7/7Gx + sf+jo6P/kJCQ/3Z2dv9mZmb/c3Nz/3R0dP96enr/gICA/4iIiP+RkZH/mZmZ/6Ghof+pqan/sbGx/7m5 + uf/CwsL/ysrK/9HR0f/W1tZN6enpeefn5//l5eX/4uLi/97e3v/a2tr/1dXV/9DQ0P/Kysr/wsLC/7m5 + uf+tra3/n5+f/4mJif9ra2v/aWlp/29vb/9hYWH/YWFh/2dnZ/9tbW3/dXV1/35+fv+IiIj/kpKS/5yc + nP+lpaX/r6+v/7m5uf/CwsL/y8vL/9HR0U3n5+d55eXl/+Li4v/f39//29vb/9bW1v/Q0ND/ycnJ/8LC + wv+4uLj/ra2t/52dnf+IiIj/a2tr/0tLS/9oaGj/enp6/1hYWP9ERET/Ly8v/1NTU/9kZGT/bW1t/3d3 + d/+CgoL/jY2N/5iYmP+kpKT/sLCw/7u7u//Gxsb/zMzMTeXl5Xnj4+P/39/f/9vb2//X19f/0dHR/8rK + yv/BwcH/uLi4/62trf+enp7/iYmJ/2tra/9bW1v/WFhY/3h4eP91dXX/X19f/yAgIP8iIiL/Hx8f/zk5 + Of9aWlr/Z2dn/3Jycv9+fn7/i4uL/5mZmf+np6f/tbW1/8HBwf/JyclN4uLieeDg4P/c3Nz/2NjY/9LS + 0v/Kysr/wsLC/7i4uP+tra3/n5+f/4uLi/9tbW3/Q0ND/11dXf9dXV3/aWlp/5WVlf+QkJD/IiIi/yEh + If8eHh7/Hh4e/yQkJP9HR0f/YmJi/29vb/99fX3/jIyM/52dnf+vr6//vr6+/8fHx03g4OB53d3d/9jY + 2P/T09P/zMzM/8PDw/+5ubn/rq6u/6CgoP+MjIz/cnJy/19fX/9NTU3/ampq/3d3d/9TU1P/jo6O/yYm + Jv8jIyP/JiYm/yQkJP8hISH/Hh4e/x4eHv8wMDD/WFhY/21tbf99fX3/kpKS/6mpqf+8vLz/xsbGTd7e + 3nna2tr/1NTU/83Nzf/ExMT/u7u7/6+vr/+hoaH/j4+P/3V1df9HR0f/Wlpa/1ZWVv9paWn/fn5+/5ub + m/8dHR3/IyMj/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x4eHv8hISH/QEBA/2xsbP+IiIj/o6Oj/7u7 + u//Hx8dN2traedXV1f/Ozs7/xsbG/7y8vP+xsbH/pKSk/5KSkv97e3v/ZGRk/0pKSv9gYGD/dXV1/0JC + Qv+qqqr/MjIy/yMjI/8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/ISEh/x8fH/8fHx//LS0t/1JS + Uv+cnJz/u7u7/8fHx03W1tZ50dHR/8nJyf+/v7//s7Oz/6ampv+UlJT/fX19/01NTf9ZWVn/WFhY/2ho + aP9ubm7/mJiY/xsbG/8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yEh + If8gICD/KSkp/5ycnP++vr7/ycnJTdLS0nnMzMz/wsLC/7a2tv+pqan/l5eX/4KCgv9sbGz/SkpK/1tb + W/91dXX/Nzc3/7W1tf9HR0f/IiIi/yQkJP8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8jIyP/mJiY/8XFxf/MzMxNzs7OecfHx/+7u7v/ra2t/5ubm/+Ghob/WVlZ/1lZ + Wf9dXV3/ZWVl/2hoaP+Kior/KSkp/yEhIf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/zIyMv+goKD/ysrK/9DQ0E3Kysp5wcHB/7Kysv+goKD/ioqK/3Jy + cv9PT0//V1dX/3V1df8zMzP/q6ur/2ZmZv8gICD/JCQk/yUlJf8lJSX/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8hISH/Q0ND/76+vv/Nzc3/09PTTcXFxXm7u7v/qKio/5GR + kf9mZmb/Xl5e/2JiYv9eXl7/bGxs/3d3d/82Njb/Hx8f/yQkJP8kJCT/JSUl/ycnJ/8lJSX/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/Kioq/1hYWP+3t7f/ycnJ/9HR0f/X19dNwsLCebW1 + tf+enp7/gYGB/1hYWP9WVlb/dXV1/zg4OP+UlJT/ioqK/x8fH/8kJCT/LCws/3l5ef+tra3/v7+//7S0 + tP+IiIj/OTk5/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yQkJP8xMTH/sbGx/8bGxv/Ozs7/1tbW/9ra + 2k3BwcF5srKy/4iIiP9xcXH/bGxs/1tbW/92dnb/YWFh/05OTv8eHh7/IyMj/zMzM/+wsLD/zMzM/8vL + y//Ly8v/zMzM/8vLy//BwcH/SkpK/yMjI/8kJCT/JCQk/yUlJf8oKCj/QkJC/6qqqv/ExMT/zMzM/9PT + 0//Z2dn/3d3dTcLCwnm0tLT/enp6/2FhYf97e3v/SEhI/319ff+np6f/ISEh/yEhIf8jIyP/iIiI/8zM + zP/MzMz/zc3N/83Nzf/MzMz/y8vL/8rKyv+vr6//JSUl/yQkJP8kJCT/IyMj/yUlJf+lpaX/w8PD/8vL + y//R0dH/19fX/93d3f/g4OBNw8PDebm5uf+JiYn/Y2Nj/4GBgf9WVlb/Y2Nj/ykpKf8hISH/IyMj/yQk + JP+wsLD/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8zMzP8zMzP/JCQk/yUlJf8zMzP/lpaW/8HB + wf/Kysr/0dHR/9fX1//c3Nz/4ODg/+Pj403FxcV5tra2/4aGhv9WVlb/bm5u/7i4uP8rKyv/ISEh/yQk + JP8kJCT/JCQk/52dnf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/Ly8v/wcHB/yoqKv8jIyP/ICAg/5aW + lv/AwMD/ycnJ/9DQ0P/X19f/3Nzc/+Dg4P/k5OT/5ubmTcnJyXm2trb/jY2N/1JSUv9zc3P/PDw8/yEh + If8jIyP/IyMj/yMjI/8kJCT/T09P/8nJyf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vLy/95eXn/JCQk/ygo + KP+Dg4P/wMDA/8jIyP/Q0ND/1tbW/9vb2//g4OD/4+Pj/+bm5v/o6OhNzc3NecDAwP9nZ2f/tLS0/zw8 + PP8eHh7/IiIi/ysiIf8iIiL/IyMj/yMjI/8jIyP/VlZW/7e3t//MzMz/zc3N/8zMzP/ExMT/d3d3/yYm + Jv8dHR3/h4eH/8HBwf/Jycn/0NDQ/9bW1v/b29v/39/f/+Pj4//m5ub/6enp/+vr603S0tJ5zMzM/6mp + qf9VVVX/ICAg/yMjI/84Ix//ayYa/yIiIf8qIiH/NCMg/zQjIP8jIyP/JiYm/0hISP9dXV3/UVFR/y0t + Lf8jIyP/IiIi/2tra//BwcH/ysrK/9HR0f/W1tb/29vb/9/f3//j4+P/5ubm/+np6f/r6+v/7e3tTdfX + 13nS0tL/kpKS/ygoKP8jIyP/KyIg/3omF/9mJRn/cyYY/14lGv9TJRz/UyUc/1ckG/8oIyH/IyMj/yMj + I/8jIyP/IyMj/x0dHf93d3f/xMTE/8vLy//S0tL/19fX/9vb2//f39//4+Pj/+bm5v/o6Oj/6+vr/+3t + 7f/u7u5N29vbedfX1/+FhYX/IyMj/yMjI/8jISH/TyQc/2QkGP9yJhj/WyQa/2slGf86Ix7/XCUb/2Ml + G/8+Ix//JSMi/yMjI/8hISH/VVVV/8bGxv/Ozs7/1NTU/9nZ2f/d3d3/4ODg/+Pj4//m5ub/6Ojo/+vr + 6//t7e3/7+/v//Dw8E3g4OB53d3d/9PT0/9/f3//LCws/yIiIv8hISH/ISEh/0UjHf9XIxr/bCUY/2El + Gv8/Ix7/VSQc/10mG/8nIyL/Hx8f/2VlZf/Kysr/09PT/9fX1//b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/r6+v/7e3t/+/v7//w8PD/8fHxTeTk5Hni4uL/3t7e/9vb2//Dw8P/YGBg/yQkJP8iIiL/ISEh/yEh + If9fJRr/ZSUZ/1IkHP9eJRv/JSMi/yIiIv9AQED/ysrK/9jY2P/b29v/39/f/+Li4v/l5eX/5+fn/+np + 6f/q6ur/7Ozs/+7u7v/v7+//8fHx//Ly8v/z8/NN6Ojoeebm5v/k5OT/4eHh/9/f3//c3Nz/v7+//6io + qP8vLy//IiIi/yEhIf81IyD/ZiYa/zskIP8gICD/VFRU/83Nzf/d3d3/4ODg/+Pj4//l5eX/5+fn/+np + 6f/r6+v/7Ozs/+3t7f/v7+//8PDw//Hx8f/y8vL/8/Pz//T09E3s7Ox56+vr/+np6f/n5+f/5OTk/+Li + 4v/h4eH/39/f/5aWlv8wMDD/IiIi/yIiIv8jIyP/IiIi/ywsLP/Gxsb/4uLi/+Tk5P/m5ub/6Ojo/+np + 6f/r6+v/7Ozs/+7u7v/v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9fX1Te7u7nnt7e3/7Ozs/+vr + 6//p6en/6Ojo/+bm5v/k5OT/4+Pj/9PT0/9vb2//JiYm/y0tLf+ysrL/1NTU/+bm5v/n5+f/6enp/+rq + 6v/s7Oz/7e3t/+7u7v/v7+//8PDw//Hx8f/y8vL/8vLy//Pz8//09PT/9fX1//X19f/29vZN8fHxefDw + 8P/v7+//7u7u/+3t7f/s7Oz/6urq/+np6f/o6Oj/6Ojo/+jo6P++vr7/urq6/+np6f/q6ur/6+vr/+vr + 6//t7e3/7u7u/+/v7//v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/29vb/9vb2//f3 + 903z8/N58vLy//Hx8f/w8PD/8PDw/+/v7//u7u7/7e3t/+3t7f/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vL/8/Pz//T09P/09PT/9fX1//X19f/29vb/9vb2//f3 + 9//39/f/9/f3TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAPDw + 8Dfv7+//7u7u/+3t7f/s7Oz/6+vr/+rq6v/p6en/5+fn/+Xl5f/j4+P/4eHh/9/f3//d3d3/29vb/9nZ + 2f/X19f/1NTU/9DQ0P/Ly8v/x8fH/8LCwv++vr7/urq6/7a2tv+xsbH/rq6u/62trf+srKz/rKys/62t + rf+vr6//sbGx/7S0tP+3t7f/u7u7/76+vv/BwcH/xcXF/8jIyP/Ly8v/z8/P/9LS0v/V1dX/2NjY/9zc + 3P/f39/x////Ae7u7jfu7u7/7e3t/+zs7P/r6+v/6enp/+jo6P/m5ub/5eXl/+Pj4//g4OD/3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zc3N/8jIyP/CwsL/vLy8/7e3t/+xsbH/qqqq/6Ojo/+enp7/nJyc/5ub + m/+cnJz/np6e/6CgoP+jo6P/pqam/6qqqv+urq7/srKy/7a2tv+6urr/vr6+/8HBwf/FxcX/ycnJ/83N + zf/R0dH/1dXV/9nZ2f/c3Nzx////Ae3t7Tfs7Oz/6+vr/+rq6v/p6en/6Ojo/+bm5v/k5OT/4uLi/+Dg + 4P/d3d3/29vb/9jY2P/V1dX/0tLS/87Ozv/Kysr/xMTE/7+/v/+5ubn/sbGx/6ioqP+fn5//ioqK/21t + bf+Ghob/iIiI/4iIiP+Li4v/jo6O/5GRkf+VlZX/mZmZ/56env+kpKT/qKio/62trf+xsbH/tbW1/7q6 + uv++vr7/w8PD/8jIyP/MzMz/0dHR/9XV1f/Z2dnx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Pj + 4//h4eH/39/f/9zc3P/Z2dn/19fX/9TU1P/Q0ND/zMzM/8fHx//CwsL/vLy8/7a2tv+urq7/pKSk/5iY + mP+MjIz/cHBw/2JiYv9zc3P/dnZ2/3d3d/96enr/fn5+/4ODg/+Hh4f/jIyM/5KSkv+YmJj/nZ2d/6Oj + o/+oqKj/ra2t/7Kysv+3t7f/vb29/8LCwv/Hx8f/zMzM/9HR0f/W1tbx////Aerq6jfp6en/6Ojo/+fn + 5//l5eX/4+Pj/+Hh4f/e3t7/3Nzc/9nZ2f/W1tb/09PT/8/Pz//Ly8v/xsbG/8DAwP+6urr/s7Oz/6ur + q/+hoaH/lJSU/4WFhf94eHj/ampq/2hoaP9oaGj/ZmZm/2hoaP9tbW3/cXFx/3V1df96enr/f39//4aG + hv+MjIz/kpKS/5iYmP+enp7/pKSk/6qqqv+wsLD/tra2/7y8vP/CwsL/x8fH/83Nzf/S0tLx////Aenp + 6Tfo6Oj/5ubm/+Xl5f/j4+P/4eHh/9/f3//c3Nz/2dnZ/9bW1v/S0tL/zs7O/8rKyv/FxcX/v7+//7i4 + uP+xsbH/qamp/5+fn/+RkZH/f39//2BgYP9nZ2f/aGho/29vb/9vb2//W1tb/11dXf9hYWH/ZWVl/2lp + af9ubm7/c3Nz/3p6ev+AgID/h4eH/42Njf+UlJT/m5ub/6Ghof+oqKj/r6+v/7W1tf+8vLz/wsLC/8nJ + yf/Ozs7x////Aejo6Dfn5+f/5eXl/+Pj4//h4eH/39/f/9zc3P/Z2dn/1tbW/9LS0v/Ozs7/ycnJ/8TE + xP+/v7//uLi4/7Gxsf+oqKj/nZ2d/5CQkP+AgID/ZmZm/0pKSv9XV1f/a2tr/3R0dP9xcXH/UlJS/1NT + U/84ODj/PT09/1tbW/9jY2P/aGho/25ubv91dXX/fHx8/4ODg/+Kior/kZGR/5mZmf+goKD/qKio/6+v + r/+3t7f/vr6+/8XFxf/Ly8vx////Aefn5zfm5ub/4+Pj/+Hh4f/f39//3Nzc/9ra2v/W1tb/09PT/87O + zv/Jycn/xMTE/76+vv+4uLj/sLCw/6ioqP+enp7/kJCQ/4GBgf9vb2//Xl5e/01NTf9VVVX/cXFx/42N + jf9xcXH/S0tL/zExMf8gICD/Hh4e/ygoKP9JSUn/XV1d/2NjY/9paWn/cXFx/3h4eP+AgID/iIiI/5CQ + kP+YmJj/oKCg/6mpqf+ysrL/urq6/8LCwv/Jycnx////AeXl5Tfk5OT/4uLi/9/f3//d3d3/2tra/9fX + 1//T09P/z8/P/8rKyv/FxcX/v7+//7i4uP+xsbH/qKio/5+fn/+RkZH/gYGB/2ZmZv9eXl7/WVlZ/2Nj + Y/9aWlr/i4uL/2tra/93d3f/VFRU/x0dHf8kJCT/Hh4e/x4eHv8eHh7/MjIy/1JSUv9eXl7/ZmZm/25u + bv91dXX/fn5+/4eHh/+QkJD/mZmZ/6Ojo/+tra3/tra2/7+/v//Gxsbx////AePj4zfi4uL/4ODg/93d + 3f/b29v/2NjY/9TU1P/Pz8//ysrK/8XFxf+/v7//uLi4/7Gxsf+pqan/n5+f/5OTk/+CgoL/ampq/0ZG + Rv9ISEj/YWFh/2VlZf9dXV3/cHBw/3Jycv/CwsL/jIyM/yQkJP8fHx//Hx8f/x4eHv8eHh7/HR0d/yEh + If8+Pj7/Wlpa/2NjY/9ra2v/dHR0/319ff+Hh4f/kZGR/5ycnP+np6f/s7Oz/7y8vP/FxcXx////AeLi + 4jfg4OD/3t7e/9vb2//Y2Nj/1dXV/9HR0f/Ly8v/xsbG/8DAwP+5ubn/srKy/6mpqf+fn5//kpKS/4SE + hP9zc3P/YWFh/0RERP9FRUX/ampq/3x8fP9WVlb/Xl5e/7e3t/+zs7P/KCgo/yIiIv8kJCT/JiYm/yIi + Iv8fHx//Hh4e/x4eHv8eHh7/KSkp/0xMTP9hYWH/ampq/3Nzc/99fX3/iIiI/5SUlP+ioqL/r6+v/7u7 + u//ExMTx////AeDg4Dff39//3Nzc/9nZ2f/V1dX/0dHR/8zMzP/Hx8f/wcHB/7q6uv+ysrL/qqqq/6Gh + of+Tk5P/hISE/3BwcP9lZWX/W1tb/15eXv9GRkb/fHx8/39/f/9hYWH/RERE/4iIiP8uLi7/IiIi/yMj + I/8lJSX/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x8fH/83Nzf/Wlpa/2dnZ/9xcXH/fX19/42N + jf+cnJz/q6ur/7m5uf/ExMTx////Ad/f3zfd3d3/2tra/9bW1v/R0dH/zc3N/8fHx//BwcH/u7u7/7Oz + s/+rq6v/oaGh/5aWlv+Hh4f/c3Nz/0pKSv9LS0v/XFxc/2ZmZv9GRkb/hISE/2JiYv+dnZ3/mpqa/xwc + HP8cHBz/IyMj/yYmJv8mJib/JSUl/yYmJv8mJib/JSUl/yMjI/8fHx//Hx8f/x4eHv8eHh7/JSUl/0VF + Rf9jY2P/dHR0/4aGhv+YmJj/qamp/7i4uP/ExMTx////Ad3d3Tfb29v/19fX/9LS0v/Ozs7/yMjI/8LC + wv+8vLz/tLS0/6ysrP+jo6P/l5eX/4mJif94eHj/ZmZm/0hISP9DQ0P/ZWVl/3Jycv89PT3/V1dX/5aW + lv/a2tr/Pj4+/yIiIv8kJCT/JiYm/yYmJv8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8kJCT/ISEh/x8f + H/8fHx//Hx8f/x8fH/8xMTH/YWFh/3BwcP+Li4v/paWl/7e3t//ExMTx////Advb2zfY2Nj/1NTU/8/P + z//Jycn/xMTE/729vf+1tbX/ra2t/6SkpP+ZmZn/jIyM/3t7e/9ra2v/X19f/1ZWVv9CQkL/cHBw/42N + jf9OTk7/ODg4/7S0tP9JSUn/IyMj/yIiIv8mJib/JiYm/yYmJv8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yMjI/8gICD/Hx8f/yAgIP8gICD/IiIi/zk5Of91dXX/paWl/7e3t//FxcXx////AdjY + 2DfV1dX/0NDQ/8vLy//FxcX/v7+//7e3t/+vr6//paWl/5ubm/+NjY3/fX19/1RUVP9OTk7/W1tb/2Rk + ZP8/Pz//i4uL/1xcXP+FhYX/h4eH/xsbG/8eHh7/ISEh/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IiIi/yAgIP8gICD/ICAg/yAgIP9jY2P/pqam/7q6 + uv/Gxsbx////AdXV1TfT09P/zc3N/8fHx//AwMD/ubm5/7CwsP+np6f/nJyc/4+Pj/+AgID/b29v/01N + Tf9AQED/YWFh/2xsbP83Nzf/VlZW/319ff/Y2Nj/aWlp/yEhIf8fHx//JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/JiYm/yUlJf8lJSX/JiYm/yUlJf8lJSX/JSUl/yUlJf8gICD/ICAg/yAg + IP9YWFj/paWl/7+/v//IyMjx////AdPT0zfQ0ND/ysrK/8PDw/+7u7v/srKy/6mpqf+enp7/kZGR/4SE + hP90dHT/ZWVl/1RUVP8/Pz//aWlp/4qKiv9LS0v/NjY2/7u7u/+BgYH/JCQk/yEhIf8kJCT/JSUl/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JCQk/yAgIP9TU1P/paWl/8PDw//Ly8vx////AdDQ0DfNzc3/xsbG/76+vv+2trb/rKys/6Gh + of+UlJT/hoaG/2VlZf9VVVX/XV1d/2NjY/89PT3/hISE/2tra/9ubm7/YmJi/zY2Nv8jIyP/IiIi/yYm + Jv8lJSX/JCQk/yUlJf8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/yYmJv8lJSX/JiYm/yYmJv9sbGz/qKio/8fHx//Ozs7x////Ac3NzTfJycn/wsLC/7m5 + uf+vr6//pKSk/5eXl/+IiIj/dnZ2/1RUVP9BQUH/Xl5e/2pqav83Nzf/YWFh/2pqav+5ubn/pqam/yAg + IP8bGxv/IyMj/yQkJP8kJCT/JSUl/yUlJf8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JiYm/yUl + Jf8mJib/JiYm/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/xoaGv9iYmL/u7u7/8rKyv/Q0NDx////AcvL + yzfGxsb/vr6+/7Ozs/+np6f/mpqa/4uLi/96enr/bGxs/1hYWP8+Pj7/ZGRk/35+fv9UVFT/NjY2/6en + p/+4uLj/Jycn/yEhIf8iIiL/JCQk/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/HBwc/zU1Nf+vr6//xsbG/83N + zf/S0tLx////AcjIyDfDw8P/ubm5/62trf+goKD/kJCQ/3Z2dv9cXFz/Y2Nj/2NjY/9GRkb/cHBw/4GB + gf9dXV3/R0dH/0FBQf8wMDD/ICAg/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8lJSX/JiYm/yUlJf81NTX/Pz8//6mp + qf/ExMT/ysrK/8/Pz//V1dXx////AcbGxjfAwMD/tbW1/6ampv+Xl5f/g4OD/2JiYv9FRUX/X19f/2pq + av9BQUH/bm5u/1xcXP+VlZX/zc3N/yIiIv8YGBj/IyMj/yQkJP8kJCT/KCgo/0VFRf9jY2P/a2tr/11d + Xf89PT3/JiYm/yMjI/8jIyP/JCQk/yQkJP8lJSX/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yAg + IP9HR0f/q6ur/8HBwf/Hx8f/zc3N/9LS0v/X19fx////AcTExDe+vr7/sbGx/6Kiov+Pj4//enp6/2Nj + Y/9AQED/Y2Nj/3Z2dv9eXl7/MTEx/4qKiv/Z2dn/Ozs7/yEhIf8kJCT/JCQk/yQkJP9kZGT/srKy/8rK + yv/Ly8v/zMzM/8zMzP/Kysr/qKio/1NTU/8kJCT/JCQk/yQkJP8kJCT/JSUl/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/IyMj/x0dHf+YmJj/wMDA/8bGxv/Ly8v/0NDQ/9XV1f/a2trx////AcTExDe9vb3/rq6u/5ub + m/92dnb/eXl5/2xsbP9VVVX/Y2Nj/5GRkf9XV1f/Nzc3/09PT/9OTk7/ICAg/yIiIv8kJCT/KSkp/4+P + j//MzMz/zMzM/8vLy//Ly8v/zMzM/8zMzP/MzMz/y8vL/8nJyf9/f3//JCQk/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8rKyv/ISEh/5GRkf+/v7//xcXF/8rKyv/Pz8//09PT/9jY2P/c3Nzx////AcTE + xDe9vb3/rq6u/4qKiv9SUlL/cHBw/3Jycv9UVFT/b29v/1paWv9+fn7/y8vL/y4uLv8bGxv/Hx8f/yMj + I/8kJCT/d3d3/8rKyv/Ly8v/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/8rKyv/Jycn/Y2Nj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8/Pz//mpqa/729vf/Dw8P/ycnJ/83Nzf/S0tL/1tbW/9ra + 2v/e3t7x////AcTExDe/v7//sbGx/42Njf9MTEz/cHBw/3p6ev9qamr/OTk5/3V1df/Q0ND/bW1t/yAg + IP8fHx//IyMj/yQkJP8xMTH/wMDA/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Ly8v/y8vL/8rK + yv/Ly8v/srKy/ygoKP8kJCT/JCQk/yQkJP8kJCT/IiIi/xMTE/95eXn/u7u7/8PDw//IyMj/zc3N/9HR + 0f/W1tb/2dnZ/9zc3P/g4ODx////AcXFxTfAwMD/tbW1/5KSkv9qamr/ZWVl/5KSkv9lZWX/Ojo6/2ho + aP98fHz/ICAg/x8fH/8jIyP/JCQk/yQkJP9NTU3/zc3N/83Nzf/MzMz/zc3N/83Nzf/Nzc3/zc3N/83N + zf/MzMz/y8vL/8vLy//MzMz/y8vL/zg4OP8kJCT/JCQk/yQkJP8mJib/FRUV/29vb/+4uLj/wcHB/8fH + x//Nzc3/0dHR/9XV1f/Z2dn/3Nzc/9/f3//i4uLx////AcbGxjfBwcH/t7e3/4uLi/9vb2//aGho/29v + b/9paWn/srKy/zw8PP8jIyP/ICAg/yQkJP8jIyP/JCQk/yMjI/9MTEz/zMzM/8zMzP/MzMz/zMzM/83N + zf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/y8vL/zs7O/8jIyP/JCQk/yQkJP85OTn/gICA/7m5 + uf/AwMD/xsbG/8zMzP/R0dH/1dXV/9jY2P/b29v/39/f/+Hh4f/k5OTx////AcfHxzfDw8P/r6+v/4WF + hf99fX3/Pj4+/2VlZf+xsbH/qamp/yAgIP8fHx//JCQk/yQkJP8jIyP/JCQk/yQkJP8xMTH/wMDA/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/tra2/ykpKf8jIyP/IyMj/xIS + Ev9dXV3/tbW1/8DAwP/Gxsb/zMzM/9DQ0P/V1dX/2NjY/9zc3P/f39//4eHh/+Tk5P/m5ubx////AcnJ + yTfGxsb/rq6u/5CQkP+AgID/ODg4/3p6ev+tra3/JSUl/yAgIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/fn5+/83Nzf/MzMz/zc3N/83Nzf/MzMz/zc3N/83Nzf/MzMz/zMzM/8vLy//Kysr/bm5u/yQk + JP8kJCT/FhYW/01NTf+ysrL/wMDA/8bGxv/Ly8v/0NDQ/9TU1P/Y2Nj/29vb/9/f3//h4eH/4+Pj/+Xl + 5f/n5+fx////AczMzDfJycn/tLS0/4mJif9ZWVn/kZGR/05OTv8uLi7/Hx8f/yEhIf8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/Kysr/5iYmP/MzMz/zMzM/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8vL + y/+QkJD/Jycn/yMjI/81NTX/ZGRk/7S0tP/BwcH/xsbG/8vLy//Q0ND/1NTU/9jY2P/b29v/3t7e/+Hh + 4f/j4+P/5eXl/+fn5//p6enx////Ac/PzzfMzMz/vb29/11dXf+Ojo7/zs7O/zExMf8cHBz/ISEh/yIi + Iv8iIiL/NSIf/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/ygoKP9xcXH/vb29/8zMzP/Nzc3/zc3N/83N + zf/MzMz/ubm5/2pqav8nJyf/IyMj/xkZGf88PDz/ra2t/8HBwf/Gxsb/y8vL/9DQ0P/U1NT/2NjY/9vb + 2//e3t7/4ODg/+Pj4//l5eX/5+fn/+np6f/q6urx////AdLS0jfPz8//ysrK/62trf/Nzc3/OTk5/x8f + H/8hISH/IyMj/yIiIv9ZJBv/dCcZ/yIiIf8iIiL/IyMj/yMjI/8oIiH/IyIi/yMjI/8jIyP/Kysr/1NT + U/9vb2//fHx8/29vb/9OTk7/Kioq/yMjI/8jIyP/Gxsb/yoqKv+oqKj/wsLC/8fHx//MzMz/0NDQ/9TU + 1P/Y2Nj/29vb/97e3v/g4OD/4uLi/+Xl5f/n5+f/6enp/+rq6v/s7Ozx////AdXV1TfT09P/zs7O/7e3 + t/9CQkL/IiIi/yIiIv8kJCT/IiIi/00jHP+oKhP/SiMc/0MiHP9xJhj/WiQa/1wlG/9+KBj/LSMh/zEj + IP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yMjI/8vLy//TExM/6mpqf/Dw8P/yMjI/83N + zf/R0dH/1dXV/9jY2P/b29v/3t7e/+Dg4P/j4+P/5eXl/+fn5//o6Oj/6urq/+zs7P/t7e3x////AdnZ + 2TfW1tb/0tLS/7y8vP8zMzP/IyMj/yMjI/8iIiL/NyIe/50pFP8tIR//bSYZ/4knFv85Ix//TyQc/y4i + If9gJhv/XiUb/3ImGP9BIx7/KCMh/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/x4eHv8lJSX/o6Oj/8XF + xf/Kysr/zs7O/9LS0v/W1tb/2dnZ/9zc3P/e3t7/4ODg/+Pj4//l5eX/5+fn/+jo6P/q6ur/6+vr/+3t + 7f/u7u7x////Adzc3DfZ2dn/1dXV/7Gxsf8lJSX/IyMj/yMjI/8iIiL/JCEh/1gkG/97Jhb/aCQX/34n + F/95Jhf/aiUZ/3wmF/88Ix7/UCQc/20mGf9oJhr/bSYZ/zIjIP8iIiL/IyMj/yMjI/8jIyP/ISEh/xkZ + Gf+YmJj/yMjI/8zMzP/Q0ND/1NTU/9fX1//a2tr/3d3d/9/f3//h4eH/4+Pj/+Xl5f/n5+f/6Ojo/+rq + 6v/r6+v/7e3t/+7u7v/v7+/x////Ad/f3zfd3d3/2dnZ/8fHx/9OTk7/JCQk/yMjI/8iIiL/IiIi/yEh + If8pISD/QSMd/0QjHf9pJRn/ISAg/3QlF/9DIx3/WCQb/ywiIP84Ix//aiYa/2UmGv9TJRz/IiIi/yIi + Iv8rKyv/Pj4+/5WVlf/Ly8v/z8/P/9LS0v/V1dX/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXl/+fn + 5//p6en/6urq/+vr6//t7e3/7u7u/+/v7//w8PDx////AeHh4Tfg4OD/3d3d/9ra2v/V1dX/k5OT/zc3 + N/8iIiL/IiIi/yIiIv8hISH/ISEh/yQhIP9oJRn/cSQX/2glGf+EJxb/PiMe/0kjHP9BIx7/YiUa/28m + Gf8kIyL/IyMj/yIiIv8cHBz/kJCQ/87Ozv/S0tL/1dXV/9jY2P/b29v/3d3d/+Dg4P/i4uL/5OTk/+Xl + 5f/n5+f/6Ojo/+np6f/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fHx////AeTk5Dfj4+P/4ODg/97e + 3v/b29v/2dnZ/8vLy/91dXX/Kioq/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/1wkGv90Jhj/QyIc/4An + F/8mIiH/ZyYa/ygjIv8jIyP/JCQk/xQUFP99fX3/0dHR/9bW1v/Y2Nj/2tra/93d3f/f39//4uLi/+Tk + 5P/l5eX/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7u7u/+/v7//w8PD/8PDw//Hx8f/y8vLx////Aefn + 5zfm5ub/4+Pj/+Hh4f/g4OD/3t7e/9zc3P/Z2dn/t7e3/1paWv9PT0//NTU1/yIiIv8hISH/ISEh/yEh + If9UJBz/iSgW/0QjHf9yJhj/VCYd/yMjIv8nJyf/Nzc3/3Z2dv/S0tL/2dnZ/9vb2//e3t7/4ODg/+Li + 4v/k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v//Dw8P/x8fH/8vLy//Ly + 8v/z8/Px////Aenp6Tfp6en/5+fn/+Xl5f/j4+P/4uLi/+Dg4P/e3t7/3d3d/9vb2//a2tr/ysrK/0BA + QP8iIiL/IiIi/yIiIv8iIiL/KCIh/2snGv9RJR7/IyMi/yIiIv8bGxv/eXl5/9bW1v/d3d3/39/f/+Dg + 4P/i4uL/5OTk/+bm5v/n5+f/6Ojo/+np6f/q6ur/6+vr/+zs7P/t7e3/7u7u/+/v7//w8PD/8PDw//Hx + 8f/y8vL/8/Pz//Pz8//09PTx////Aezs7Dfr6+v/6urq/+jo6P/n5+f/5eXl/+Tk5P/j4+P/4eHh/+Dg + 4P/f39//3t7e/5SUlP8rKyv/IiIi/yIiIv8iIiL/IiIi/yMjI/8iIiL/IyMj/xYWFv9SUlL/1dXV/+Hh + 4f/i4uL/4+Pj/+Xl5f/m5ub/5+fn/+np6f/q6ur/6+vr/+zs7P/t7e3/7e3t/+7u7v/v7+//7+/v//Dw + 8P/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/19fXx////Ae3t7Tft7e3/7Ozs/+vr6//q6ur/6enp/+fn + 5//m5ub/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/IyMj/YmJi/yQkJP8jIyP/IyMj/yMjI/8kJCT/WFhY/11d + Xf/U1NT/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw + 8P/w8PD/8fHx//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0//X19f/19fXx////Ae/v7zfu7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/7CwsP9HR0f/IyMj/yMj + I/+Dg4P/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//T09P/09PT/9fX1//X19f/29vbx////AfHx + 8Tfw8PD/7+/v/+/v7//u7u7/7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/6Ojo/+jo6P/n5+f/6Ojo/+jo + 6P/f39//kZGR/4GBgf/m5ub/6enp/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Hx8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//X19f/19fX/9vb2//b2 + 9v/29vbx////AfLy8jfy8vL/8fHx//Dw8P/w8PD/7+/v/+7u7v/u7u7/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//09PT/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//f39//39/fx////AfPz8zfz8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD/7+/v/+/v + 7//u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/19fX/9fX1//X1 + 9f/29vb/9vb2//b29v/29vb/9/f3//f39//39/fx////AQAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//ygA + AABAAAAAgAAAAAEAIAAAAAAAAEIAAAAAAAAAAAAAAAAAAAAAAAD///8B7+/v8e/v7//u7u7/7u7u/+3t + 7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5OTk/+Pj4//h4eH/4ODg/97e3v/d3d3/29vb/9ra + 2v/Y2Nj/19fX/9XV1f/R0dH/zs7O/8vLy//Hx8f/xMTE/8HBwf++vr7/u7u7/7i4uP+1tbX/srKy/7Cw + sP+vr6//rq6u/62trf+urq7/r6+v/7CwsP+xsbH/s7Oz/7W1tf+3t7f/urq6/7y8vP+/v7//wcHB/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/0NDQ/9LS0v/V1dX/19fX/9nZ2f/c3Nz/3t7e/+Dg4Jf///8B////Ae/v + 7/Hu7u7/7e3t/+3t7f/s7Oz/6+vr/+rq6v/p6en/6Ojo/+fn5//l5eX/5OTk/+Li4v/h4eH/39/f/93d + 3f/c3Nz/2tra/9jY2P/W1tb/1dXV/9LS0v/Q0ND/zMzM/8jIyP/ExMT/wMDA/7y8vP+4uLj/tLS0/7Cw + sP+srKz/qKio/6Wlpf+kpKT/o6Oj/6Kiov+ioqL/o6Oj/6Wlpf+np6f/qKio/6qqqv+tra3/sLCw/7Oz + s/+2trb/uLi4/7u7u/++vr7/wcHB/8PDw//Gxsb/ycnJ/8vLy//Ozs7/0dHR/9TU1P/W1tb/2dnZ/9zc + 3P/e3t6X////Af///wHu7u7x7e3t/+zs7P/s7Oz/6+vr/+rq6v/p6en/5+fn/+bm5v/l5eX/5OTk/+Li + 4v/g4OD/3t7e/93d3f/b29v/2dnZ/9fX1//U1NT/0tLS/9DQ0P/Nzc3/ycnJ/8bGxv/BwcH/vLy8/7e3 + t/+ysrL/rq6u/6ioqP+hoaH/k5OT/5iYmP+VlZX/lJSU/5SUlP+VlZX/lpaW/5iYmP+ampr/nJyc/5+f + n/+hoaH/paWl/6mpqf+srKz/r6+v/7Kysv+1tbX/uLi4/7u7u/++vr7/wcHB/8TExP/Hx8f/ysrK/87O + zv/R0dH/1NTU/9fX1//a2tr/3Nzcl////wH///8B7e3t8ezs7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm + 5v/k5OT/4+Pj/+Hh4f/f39//3t7e/9zc3P/a2tr/2NjY/9XV1f/T09P/0NDQ/87Ozv/Kysr/x8fH/8PD + w/+/v7//urq6/7W1tf+urq7/qKio/6Ghof+ZmZn/fX19/2RkZP94eHj/hoaG/4WFhf+Ghob/h4eH/4qK + iv+MjIz/jo6O/5GRkf+VlZX/mJiY/5ycnP+goKD/pKSk/6enp/+rq6v/rq6u/7Kysv+1tbX/uLi4/7u7 + u/+/v7//w8PD/8bGxv/Kysr/zs7O/9HR0f/U1NT/19fX/9ra2pf///8B////Aezs7PHr6+v/6urq/+np + 6f/o6Oj/5+fn/+Xl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9XV1f/S0tL/z8/P/8zM + zP/IyMj/xcXF/8HBwf+8vLz/uLi4/7Ozs/+tra3/pKSk/5ycnP+Tk5P/ioqK/2pqav9jY2P/ampq/3l5 + ef94eHj/eHh4/3p6ev99fX3/gYGB/4SEhP+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//o6Oj/6en + p/+rq6v/r6+v/7Kysv+2trb/urq6/76+vv/CwsL/xsbG/8rKyv/Nzc3/0dHR/9XV1f/X19eX////Af// + /wHq6urx6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra2v/Y2Nj/1tbW/9TU + 1P/R0dH/zs7O/8vLy//Hx8f/w8PD/7+/v/+6urr/tbW1/7CwsP+qqqr/oqKi/5iYmP+Ojo7/g4OD/3p6 + ev9oaGj/ZWVl/2dnZ/9tbW3/bGxs/21tbf9wcHD/c3Nz/3Z2dv96enr/fX19/4GBgf+FhYX/ioqK/46O + jv+Tk5P/l5eX/5ubm/+goKD/pKSk/6ioqP+srKz/sLCw/7W1tf+5ubn/vr6+/8LCwv/Gxsb/ysrK/87O + zv/S0tL/1dXVl////wH///8B6enp8ejo6P/n5+f/5ubm/+Xl5f/k5OT/4uLi/+Dg4P/e3t7/3Nzc/9ra + 2v/Y2Nj/1tbW/9PT0//R0dH/zs7O/8rKyv/Hx8f/w8PD/76+vv+5ubn/s7Oz/66urv+oqKj/oKCg/5aW + lv+MjIz/gICA/3Z2dv9ubm7/Z2dn/2tra/9tbW3/Y2Nj/2JiYv9jY2P/Z2dn/2pqav9tbW3/cHBw/3Nz + c/93d3f/fHx8/4CAgP+FhYX/ioqK/46Ojv+Tk5P/mJiY/52dnf+hoaH/pqam/6urq/+vr6//tLS0/7m5 + uf+9vb3/wsLC/8bGxv/Ly8v/z8/P/9LS0pf///8B////Aejo6PHn5+f/5ubm/+Xl5f/j4+P/4uLi/+Dg + 4P/f39//3d3d/9ra2v/Y2Nj/1tbW/9PT0//Q0ND/zc3N/8rKyv/Hx8f/w8PD/76+vv+4uLj/s7Oz/62t + rf+mpqb/n5+f/5SUlP+Kior/eHh4/1dXV/9fX1//Z2dn/2lpaf9vb2//dHR0/2VlZf9aWlr/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9qamr/bm5u/3Nzc/93d3f/fHx8/4GBgf+Ghob/i4uL/5CQkP+VlZX/mpqa/5+f + n/+kpKT/qqqq/6+vr/+0tLT/ubm5/76+vv/Dw8P/yMjI/8zMzP/Pz8+X////Af///wHo6Ojx5ubm/+Xl + 5f/k5OT/4uLi/+Dg4P/f39//3d3d/9vb2//Y2Nj/1tbW/9PT0//Q0ND/zc3N/8nJyf/Gxsb/wsLC/729 + vf+4uLj/s7Oz/62trf+mpqb/nZ2d/5SUlP+IiIj/fHx8/2JiYv9MTEz/TExM/2JiYv9sbGz/cXFx/3Z2 + dv9jY2P/UlJS/1RUVP9PT0//NDQ0/0xMTP9eXl7/YmJi/2ZmZv9qamr/b29v/3Nzc/95eXn/fn5+/4OD + g/+JiYn/jo6O/5SUlP+ZmZn/np6e/6SkpP+qqqr/r6+v/7W1tf+6urr/v7+//8XFxf/Jycn/zc3Nl/// + /wH///8B5+fn8eXl5f/k5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/1tbW/9PT0//Q0ND/zc3N/8nJ + yf/FxcX/wcHB/729vf+4uLj/s7Oz/62trf+mpqb/np6e/5SUlP+IiIj/fHx8/3BwcP9dXV3/TExM/0dH + R/9kZGT/b29v/319ff+CgoL/YWFh/0xMTP9JSUn/JCQk/xwcHP8gICD/NjY2/1RUVP9eXl7/YmJi/2Zm + Zv9ra2v/cHBw/3Z2dv97e3v/gYGB/4eHh/+MjIz/kpKS/5iYmP+enp7/pKSk/6urq/+xsbH/t7e3/7y8 + vP/CwsL/x8fH/8vLy5f///8B////Aebm5vHk5OT/4uLi/+Hh4f/f39//3d3d/9vb2//Z2dn/19fX/9TU + 1P/R0dH/zc3N/8rKyv/Gxsb/wcHB/729vf+4uLj/s7Oz/6ysrP+mpqb/np6e/5WVlf+JiYn/fn5+/3Bw + cP9iYmL/W1tb/1dXV/9NTU3/ZWVl/3l5ef+Xl5f/ampq/2xsbP9GRkb/JSUl/xsbG/8vLy//Hh4e/x4e + Hv8kJCT/QkJC/1hYWP9eXl7/Y2Nj/2hoaP9ubm7/c3Nz/3l5ef9/f3//hYWF/4yMjP+SkpL/mJiY/5+f + n/+mpqb/ra2t/7Ozs/+6urr/v7+//8XFxf/JycmX////Af///wHk5OTx4+Pj/+Hh4f/f39//3t7e/9zc + 3P/Z2dn/19fX/9TU1P/R0dH/zs7O/8rKyv/Gxsb/wsLC/729vf+4uLj/s7Oz/62trf+mpqb/n5+f/5WV + lf+Kior/fX19/2FhYf9eXl7/VlZW/1paWv9mZmb/VlZW/21tbf+Wlpb/Z2dn/2xsbP+Ghob/RERE/xsb + G/8mJib/HBwc/x4eHv8eHh7/Hh4e/x4eHv8sLCz/TExM/1paWv9gYGD/ZmZm/2xsbP9xcXH/d3d3/35+ + fv+EhIT/i4uL/5KSkv+ampr/oaGh/6ioqP+wsLD/t7e3/729vf/Dw8P/yMjIl////wH///8B4+Pj8eHh + 4f/g4OD/3t7e/9zc3P/a2tr/2NjY/9XV1f/S0tL/zs7O/8rKyv/Hx8f/wsLC/729vf+4uLj/s7Oz/66u + rv+np6f/n5+f/5eXl/+Kior/fn5+/2dnZ/9ISEj/QUFB/1FRUf9jY2P/ampq/01NTf+EhIT/bm5u/2Vl + Zf+IiIj/5eXl/39/f/8jIyP/Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/HR0d/x8fH/83Nzf/VFRU/15e + Xv9kZGT/aWlp/3BwcP92dnb/fX19/4SEhP+MjIz/k5OT/5ycnP+kpKT/rKys/7S0tP+8vLz/wsLC/8fH + x5f///8B////AeLi4vHg4OD/3t7e/9zc3P/a2tr/2NjY/9bW1v/T09P/z8/P/8vLy//Hx8f/w8PD/76+ + vv+5ubn/s7Oz/62trf+np6f/n5+f/5aWlv+MjIz/f39//3Jycv9fX1//SUlJ/zo6Ov9XV1f/aWlp/3Bw + cP9PT0//V1dX/11dXf+IiIj/39/f/7S0tP8nJyf/Jycn/yEhIf8lJSX/JCQk/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/yUlJf9ERET/W1tb/2JiYv9oaGj/b29v/3Z2dv99fX3/hYWF/42Njf+Wlpb/n5+f/6mp + qf+ysrL/urq6/8HBwf/GxsaX////Af///wHh4eHx39/f/93d3f/b29v/2NjY/9bW1v/T09P/0NDQ/8zM + zP/IyMj/w8PD/76+vv+5ubn/tLS0/66urv+np6f/oKCg/5aWlv+Li4v/gICA/3R0dP9nZ2f/XV1d/01N + Tf86Ojr/WVlZ/25ubv+Li4v/c3Nz/05OTv9dXV3/0dHR/8bGxv8uLi7/JiYm/yAgIP8kJCT/JSUl/yYm + Jv8lJSX/IiIi/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/zAwMP9RUVH/YWFh/2dnZ/9ubm7/dXV1/319 + ff+Ghob/kJCQ/5qamv+lpaX/r6+v/7m5uf/BwcH/xsbGl////wH///8B4ODg8d7e3v/b29v/2dnZ/9bW + 1v/T09P/0NDQ/8zMzP/IyMj/xMTE/7+/v/+6urr/tLS0/66urv+oqKj/oaGh/5iYmP+MjIz/gYGB/25u + bv9mZmb/Xl5e/1paWv9iYmL/SkpK/1lZWf+Ghob/hYWF/1hYWP9paWn/Ozs7/2xsbP81NTX/JiYm/yAg + IP8kJCT/JSUl/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x8fH/8eHh7/Hh4e/x4eHv8eHh7/IiIi/z4+ + Pv9bW1v/ZGRk/2tra/90dHT/fn5+/4qKiv+Wlpb/oaGh/62trf+3t7f/wcHB/8bGxpf///8B////Ad7e + 3vHc3Nz/2tra/9fX1//U1NT/0NDQ/8zMzP/IyMj/xMTE/8DAwP+7u7v/tbW1/6+vr/+oqKj/oaGh/5mZ + mf+Ojo7/goKC/3Jycv9OTk7/RUVF/1RUVP9dXV3/ZmZm/0ZGRv9qamr/ioqK/1RUVP99fX3/tLS0/4CA + gP8bGxv/HR0d/x4eHv8jIyP/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/KSkp/0pKSv9fX1//ampq/3d3d/+EhIT/kpKS/5+fn/+rq6v/tra2/8DA + wP/Hx8eX////Af///wHd3d3x2tra/9fX1//U1NT/0dHR/83Nzf/Jycn/xcXF/8DAwP+7u7v/tra2/7Cw + sP+qqqr/oqKi/5qamv+QkJD/hISE/3d3d/9nZ2f/TExM/zw8PP9SUlL/ZGRk/2pqav9BQUH/Wlpa/1RU + VP97e3v/ra2t/+rq6v9OTk7/IiIi/xsbG/8kJCT/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yMjI/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/NjY2/11dXf9ycnL/f39//4yM + jP+cnJz/qamp/7W1tf/AwMD/x8fHl////wH///8B29vb8djY2P/V1dX/0tLS/87Ozv/Kysr/xsbG/8HB + wf+8vLz/t7e3/7Gxsf+qqqr/pKSk/5ycnP+SkpL/h4eH/3p6ev9tbW3/YWFh/05OTv82Njb/VFRU/2lp + af94eHj/bGxs/zMzM/9fX1//pKSk/+/v7/9gYGD/JCQk/yAgIP8kJCT/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8mJib/Tk5O/1xcXP9oaGj/k5OT/6enp/+0tLT/wMDA/8fHx5f///8B////AdnZ2fHW1tb/09PT/8/P + z//Ly8v/x8fH/8LCwv+9vb3/t7e3/7Kysv+rq6v/pKSk/52dnf+Tk5P/iIiI/3t7e/9vb2//ZWVl/1xc + XP9cXFz/SkpK/09PT/92dnb/l5eX/1lZWf9GRkb/MTEx/6enp/9tbW3/IiIi/yAgIP8iIiL/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JCQk/yIi + Iv8fHx//Hx8f/yAgIP8gICD/ICAg/yAgIP8pKSn/Wlpa/46Ojv+np6f/tbW1/8HBwf/Hx8eX////Af// + /wHX19fx1NTU/9DQ0P/MzMz/yMjI/8PDw/++vr7/ubm5/7Ozs/+srKz/paWl/52dnf+UlJT/iYmJ/319 + ff9cXFz/SkpK/1lZWf9aWlr/Y2Nj/0xMTP9TU1P/k5OT/2BgYP9sbGz/i4uL/2BgYP8YGBj/Hh4e/yEh + If8hISH/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8lJSX/JCQk/yEhIf8gICD/ICAg/yAgIP8gICD/ICAg/zQ0NP+QkJD/qKio/7e3 + t//Dw8P/yMjIl////wH///8B1dXV8dLS0v/Ozs7/ycnJ/8XFxf/AwMD/urq6/7S0tP+urq7/p6en/5+f + n/+VlZX/i4uL/39/f/9xcXH/UVFR/zw8PP9OTk7/YWFh/2dnZ/9ISEj/UVFR/2lpaf9kZGT/ioqK/+fn + 5/+NjY3/Hh4e/xgYGP8fHx//JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/IyMj/yAgIP8gICD/ICAg/yEh + If8uLi7/jo6O/6urq/+7u7v/xcXF/8nJyZf///8B////AdPT0/HPz8//y8vL/8bGxv/BwcH/u7u7/7W1 + tf+vr6//qKio/6CgoP+Wlpb/jY2N/4GBgf91dXX/aWlp/1NTU/82Njb/TU1N/2dnZ/9vb2//Y2Nj/yoq + Kv9SUlL/hoaG/9/f3/+pqan/JSUl/yQkJP8gICD/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/ISEh/yAgIP8gICD/Jycn/4ODg/+qqqr/wMDA/8fHx//Ly8uX////Af///wHR0dHxzc3N/8jI + yP/Dw8P/vb29/7e3t/+wsLD/qqqq/6Kiov+YmJj/jo6O/4SEhP93d3f/bW1t/2NjY/9aWlr/R0dH/0hI + SP9tbW3/jIyM/3R0dP8vLy//MjIy/6+vr//AwMD/Jycn/yYmJv8gICD/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8kJCT/ICAg/yUlJf+EhIT/ra2t/8PDw//Jycn/zc3Nl/// + /wH///8Bz8/P8cvLy//Gxsb/wMDA/7q6uv+zs7P/rKys/6SkpP+bm5v/kZGR/4aGhv9xcXH/VVVV/19f + X/9dXV3/YmJi/1ZWVv8/Pz//h4eH/4GBgf9TU1P/cHBw/zc3N/8nJyf/R0dH/yQkJP8hISH/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf81NTX/i4uL/6+v + r//Gxsb/y8vL/8/Pz5f///8B////Ac3NzfHIyMj/w8PD/7y8vP+1tbX/rq6u/6ampv+dnZ3/kpKS/4eH + h/96enr/WVlZ/0RERP9NTU3/Xl5e/2dnZ/9UVFT/QUFB/4uLi/9PT0//fHx8/7y8vP/Gxsb/Hh4e/xgY + GP8dHR3/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/SUlJ/4+Pj/+4uLj/ycnJ/83Nzf/R0dGX////Af///wHLy8vxxcXF/7+/v/+4uLj/sLCw/6io + qP+fn5//lZWV/4mJif98fHz/b29v/1paWv8/Pz//SEhI/2VlZf9ra2v/YmJi/yQkJP9JSUn/enp6/7Gx + sf/k5OT/QEBA/yMjI/8dHR3/ISEh/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8kJCT/ERER/y8vL/+rq6v/xcXF/8rKyv/Pz8//0tLSl////wH///8BycnJ8cPD + w/+8vLz/tLS0/6urq/+ioqL/l5eX/4yMjP9/f3//c3Nz/2lpaf9eXl7/RERE/0VFRf9paWn/fHx8/4uL + i/8nJyf/Ojo6/5ycnP/o6Oj/UlJS/yIiIv8gICD/IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/FhYW/ywsLP+fn5//wsLC/8jIyP/MzMz/0NDQ/9TU + 1Jf///8B////AcbGxvHAwMD/ubm5/7CwsP+mpqb/m5ub/4+Pj/+AgID/YmJi/2ZmZv9kZGT/YWFh/2Bg + YP84ODj/d3d3/5SUlP9WVlb/W1tb/ygoKP87Ozv/XV1d/yEhIf8fHx//IiIi/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8nJyf/Kysr/ygoKP+ZmZn/wMDA/8bG + xv/Kysr/zs7O/9LS0v/W1taX////Af///wHFxcXxvr6+/7W1tf+rq6v/oKCg/5OTk/+Ghob/a2tr/0tL + S/9MTEz/YWFh/2ZmZv9hYWH/NjY2/5KSkv9dXV3/aWlp/5KSkv/FxcX/ISEh/yEhIf8bGxv/IiIi/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JiYm/ysrK/8rKyv/KCgo/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/NTU1/2tr + a/+jo6P/v7+//8TExP/IyMj/zMzM/9HR0f/V1dX/2NjYl////wH///8Bw8PD8bu7u/+xsbH/pqam/5qa + mv+MjIz/fHx8/2ZmZv9JSUn/RkZG/2RkZP9sbGz/Z2dn/ycnJ/9UVFT/YmJi/4uLi//p6en/hoaG/x8f + H/8bGxv/ICAg/yUlJf8kJCT/IyMj/ygoKP9OTk7/f39//6Ghof+ysrL/s7Oz/6ioqP+Pj4//YmJi/zMz + M/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yUl + Jf8lJSX/HBwc/xkZGf+Li4v/vLy8/8LCwv/Gxsb/y8vL/8/Pz//T09P/19fX/9nZ2Zf///8B////AcLC + wvG5ubn/r6+v/6Ojo/+Wlpb/hoaG/3d3d/9nZ2f/SkpK/0VFRf9qamr/dHR0/5CQkP8uLi7/Nzc3/4CA + gP/j4+P/m5ub/x0dHf8hISH/IiIi/yYmJv8kJCT/IyMj/0hISP+lpaX/ycnJ/8vLy//Ly8v/y8vL/8zM + zP/MzMz/zc3N/83Nzf++vr7/cnJy/yoqKv8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8lJSX/IiIi/xEREf9/f3//u7u7/8LCwv/Gxsb/ycnJ/83Nzf/R0dH/1dXV/9jY + 2P/b29uX////Af///wHBwcHxuLi4/62trf+hoaH/h4eH/35+fv94eHj/bGxs/2hoaP9BQUH/bGxs/5OT + k/92dnb/RkZG/yQkJP9LS0v/lZWV/yAgIP8iIiL/ICAg/yUlJf8kJCT/JCQk/2lpaf/Gxsb/zc3N/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/y8vL/8rKyv+np6f/Nzc3/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/IyMj/wwMDP93d3f/uLi4/8HBwf/FxcX/ycnJ/8zM + zP/Q0ND/1NTU/9fX1//a2tr/3Nzcl////wH///8BwcHB8be3t/+srKz/mJiY/2FhYf9VVVX/eXl5/3Bw + cP9ubm7/Ojo6/4WFhf9+fn7/UFBQ/35+fv+bm5v/Jycn/zAwMP8bGxv/HR0d/yMjI/8kJCT/IyMj/19f + X//Gxsb/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8rKyv/Kysr/ycnJ/6Oj + o/8rKyv/IyMj/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/MjIy/1lZWf+AgID/t7e3/8DA + wP/ExMT/yMjI/8vLy//Pz8//0tLS/9bW1v/Z2dn/29vb/97e3pf///8B////AcLCwvG5ubn/ra2t/5WV + lf9fX1//SkpK/3l5ef90dHT/c3Nz/zIyMv9qamr/TU1N/3x8fP/CwsL/ycnJ/ywsLP8aGhr/Gxsb/yIi + Iv8jIyP/JCQk/zU1Nf+2trb/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vL + y//Kysr/ysrK/8rKyv/Kysr/c3Nz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8kJCT/ISEh/xUV + Ff9zc3P/s7Oz/7+/v//Dw8P/x8fH/8vLy//Ozs7/0tLS/9XV1f/Y2Nj/2tra/93d3f/f39+X////Af// + /wHDw8Pxu7u7/6+vr/+Wlpb/X19f/0dHR/96enr/enp6/4mJif9DQ0P/Pj4+/3Z2dv+0tLT/2dnZ/zk5 + Of8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP9paWn/zMzM/83Nzf/MzMz/zMzM/83Nzf/Nzc3/zs7O/83N + zf/Nzc3/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/zMzM/7Ozs/8rKyv/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8kJCT/ISEh/w0NDf9RUVH/r6+v/76+vv/CwsL/x8fH/8rKyv/Ozs7/0dHR/9TU1P/X19f/2tra/9zc + 3P/f39//4eHhl////wH///8Bw8PD8b29vf+zs7P/mZmZ/3V1df9VVVX/c3Nz/4qKiv+Tk5P/RERE/zAw + MP9qamr/09PT/0NDQ/8hISH/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/kJCQ/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/83Nzf/MzMz/zMzM/8vLy//Ly8v/zMzM/83Nzf/Jycn/PDw8/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IyMj/w4ODv9KSkr/qamp/729vf/BwcH/xsbG/8rKyv/Ozs7/0dHR/9TU + 1P/X19f/2tra/9zc3P/e3t7/4eHh/+Li4pf///8B////AcPDw/G9vb3/tra2/5aWlv9/f3//UFBQ/3R0 + dP+Xl5f/UlJS/29vb/92dnb/ISEh/y8vL/8fHx//Hx8f/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/5iY + mP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/0dHR/8kJCT/JCQk/yQkJP8kJCT/KSkp/0RERP9WVlb/q6ur/7y8vP/AwMD/xcXF/8rK + yv/Nzc3/0dHR/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OSX////Af///wHFxcXxvr6+/7Oz + s/+Hh4f/goKC/0xMTP9wcHD/V1dX/2pqav+Tk5P/7u7u/1NTU/8eHh7/GRkZ/yQkJP8lJSX/JCQk/yQk + JP8kJCT/JCQk/yQkJP+Ghob/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8bGxv87Ozv/JCQk/yQkJP8kJCT/IyMj/xoaGv9ZWVn/pKSk/7y8 + vP/AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li4v/k5OT/5eXll/// + /wH///8BxsbG8cDAwP+oqKj/hYWF/4qKiv9fX1//Pj4+/2hoaP+Ojo7/6enp/3V1df8dHR3/ICAg/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/VlZW/8vLy//Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy/+pqan/KCgo/yQkJP8kJCT/IiIi/xIS + Ev8vLy//oqKi/7u7u//AwMD/xMTE/8nJyf/Nzc3/0NDQ/9TU1P/X19f/2dnZ/9zc3P/e3t7/4ODg/+Li + 4v/k5OT/5eXl/+bm5pf///8B////AcjIyPHDw8P/qKio/4qKiv+cnJz/X19f/zMzM/+CgoL/1tbW/4eH + h/8eHh7/ICAg/yEhIf8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/ysrK/+np6f/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Jycn/YWFh/yQk + JP8kJCT/IyMj/xUVFf8mJib/lZWV/7u7u//AwMD/xMTE/8nJyf/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb + 2//e3t7/4ODg/+Li4v/j4+P/5eXl/+fn5//o6OiX////Af///wHKysrxxcXF/6qqqv+bm5v/cnJy/1ZW + Vv9iYmL/MzMz/0NDQ/8qKir/ISEh/yAgIP8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/R0dH/729vf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8vL + y//Kysr/kZGR/ycnJ/8kJCT/JSUl/zY2Nv8zMzP/lpaW/7u7u//AwMD/xMTE/8jIyP/MzMz/0NDQ/9PT + 0//W1tb/2dnZ/9vb2//d3d3/4ODg/+Li4v/j4+P/5eXl/+bm5v/o6Oj/6enpl////wH///8By8vL8cfH + x/+1tbX/e3t7/1BQUP9/f3//0dHR/4WFhf8mJib/GRkZ/x8fH/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP9LS0v/tbW1/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/8zMzP/IyMj/j4+P/y4uLv8kJCT/IyMj/yIiIv9LS0v/lJSU/729vf/BwcH/xcXF/8jI + yP/MzMz/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5eXl/+bm5v/o6Oj/6enp/+rq + 6pf///8B////Ac7OzvHKysr/urq6/1lZWf96enr/xcXF/7y8vP8kJCT/Hx8f/x0dHf8iIiL/IiIi/yIi + Iv8oIiH/PiId/yMiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/zMzM/+Dg4P/v7+//8vL + y//Nzc3/zc3N/83Nzf/Nzc3/zMzM/8rKyv+srKz/XV1d/yYmJv8kJCT/IyMj/xsbG/8UFBT/goKC/7u7 + u//CwsL/xcXF/8nJyf/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm + 5v/o6Oj/6enp/+rq6v/r6+uX////Af///wHQ0NDxzc3N/8nJyf+wsLD/t7e3/9LS0v8oKCj/ICAg/x0d + Hf8jIyP/IyMj/yIiIv8jISH/gicW/3UnGf8jIiH/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/zAwMP9dXV3/fX19/5OTk/+ZmZn/jo6O/29vb/9HR0f/Jycn/yQkJP8kJCT/IyMj/x0d + Hf8NDQ3/dXV1/7q6uv/CwsL/xsbG/8rKyv/Nzc3/0NDQ/9PT0//W1tb/2dnZ/9vb2//d3d3/39/f/+Hh + 4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozsl////wH///8B09PT8dDQ0P/MzMz/xcXF/3Z2 + dv88PDz/Hx8f/x8fH/8lJSX/IyMj/yIiIv8iISH/dyYX/44oFv8lIiH/IiIi/yQhIf88Ih7/KCIh/y0i + IP9gJRr/aCYa/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/IyMj/y0tLf8bGxv/cnJy/7i4uP/Dw8P/xsbG/8rKyv/Ozs7/0dHR/9TU1P/W1tb/2dnZ/9vb + 2//d3d3/39/f/+Hh4f/i4uL/5OTk/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozs/+3t7Zf///8B////AdXV + 1fHS0tL/z8/P/8jIyP9kZGT/NDQ0/yMjI/8kJCT/IyMj/yIiIv8iISH/aCQY/5cpFf+RKBX/fSYW/3kl + Fv+WKBT/jykW/3slFv9uJhn/UyUd/1omHf9GJB3/WSQa/ygiIf8jIyL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/IyMj/yIiIv9FRUX/gICA/729vf/ExMT/x8fH/8vLy//Ozs7/0dHR/9TU + 1P/X19f/2dnZ/9vb2//d3d3/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t + 7f/u7u6X////Af///wHY2Njx1dXV/9LS0v/Ly8v/UlJS/ycnJ/8iIiL/IyMj/yIiIv8iIiL/RiMd/7Yr + Ev8zIR7/JiAg/2QlGv+SKBX/LSIg/ykhIP9GIx3/KCIh/2ImG/9EJB7/aSYZ/2IkGf94Jhj/NiMf/yci + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yAgIP8MDAz/Xl5e/7e3t//FxcX/ycnJ/8zM + zP/Pz8//0tLS/9XV1f/X19f/2tra/9zc3P/e3t7/39/f/+Hh4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+np + 6f/r6+v/7Ozs/+3t7f/u7u7/7+/vl////wH///8B2tra8dfX1//U1NT/ysrK/z4+Pv8iIiL/IyMj/yMj + I/8iIiL/IiIi/yUhIP9dJRv/kicU/1QiGf9QIhn/oyoU/0QiHP+TKBT/fScX/4YmFf9eJRr/LiIg/2ol + Gf+DJxf/bCYZ/2UmG/9yJhj/LCIh/yMiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8NDQ3/TExM/7i4 + uP/IyMj/y8vL/83Nzf/Q0ND/09PT/9bW1v/Z2dn/29vb/93d3f/e3t7/4ODg/+Hh4f/j4+P/5OTk/+bm + 5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v75f///8B////Ad3d3fHa2tr/19fX/83N + zf8/Pz//IyMj/yQkJP8jIyP/IyMj/yIiIv8hISH/ISEh/y4hH/9tJhn/gScX/0cjHf+aKRT/OiIe/yEh + If9LIxz/fScX/yUhIf8tIiD/KiIg/1clHP9HIx3/bSca/2smGv88Ix7/LCMh/yMjI/8jIyP/IyMj/ycn + J/8WFhb/RkZG/7S0tP/Kysr/zc3N/8/Pz//S0tL/1NTU/9fX1//a2tr/3Nzc/97e3v/f39//4eHh/+Li + 4v/j4+P/5eXl/+bm5v/n5+f/6Ojo/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v7//w8PCX////Af// + /wHf39/x3d3d/9ra2v/Y2Nj/vr6+/1xcXP8lJSX/IyMj/yMjI/8iIiL/IiIi/yIiIv8hISH/ISEh/yEh + If8nISD/likV/zAhHv8nIB//iSYU/1skG/92JRf/aCUZ/yIiIf8iIiH/RyMd/3QmGP9dJRv/ayca/zUk + IP8jIyP/IiIi/yMjI/9GRkb/a2tr/7m5uf/Nzc3/z8/P/9HR0f/U1NT/1tbW/9jY2P/b29v/3d3d/9/f + 3//g4OD/4uLi/+Pj4//k5OT/5eXl/+fn5//o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/u7u7/7+/v/+/v + 7//w8PD/8fHxl////wH///8B4eHh8d/f3//d3d3/29vb/9nZ2f/W1tb/paWl/0dHR/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8hISH/ISEh/zkiHv99Jhb/hyYV/14kGv9tJBf/gicX/yQhIP8+Ih3/fCYX/0Ij + Hv9YJRz/hSgX/ykjIv8jIyP/IyMj/yMjI/8TExP/NjY2/62trf/Q0ND/0tLS/9TU1P/W1tb/2NjY/9ra + 2v/c3Nz/3t7e/+Dg4P/i4uL/4+Pj/+Tk5P/l5eX/5+fn/+jo6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t + 7f/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8pf///8B////AePj4/Hh4eH/39/f/93d3f/c3Nz/2tra/9jY + 2P/Pz8//ioqK/zU1Nf8iIiL/IyMj/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEg/yIhIP9QIxv/qioT/y0h + H/82IR3/nCkU/zojH/8mIiH/YiUa/ysjIf8jIyL/IyMj/yQkJP8YGBj/KCgo/6urq//S0tL/1dXV/9fX + 1//Y2Nj/2tra/9zc3P/e3t7/4ODg/+Li4v/j4+P/5OTk/+Xl5f/n5+f/6Ojo/+jo6P/p6en/6urq/+vr + 6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/y8vKX////Af///wHl5eXx5OTk/+Li + 4v/g4OD/39/f/93d3f/c3Nz/2tra/9jY2P/BwcH/aWlp/ygoKP8iIiL/IiIi/yIiIv8iIiL/ISEh/yEh + If8hISH/KSEg/1kkG/+LJxT/pykT/00kHf8kIiH/fCcX/3QoGv8kIyL/IyMj/yQkJP8cHBz/ICAg/6Cg + oP/U1NT/19fX/9nZ2f/b29v/3Nzc/97e3v/g4OD/4eHh/+Pj4//k5OT/5ubm/+fn5//o6Oj/6Ojo/+np + 6f/q6ur/6+vr/+zs7P/s7Oz/7e3t/+7u7v/v7+//7+/v//Dw8P/x8fH/8fHx//Ly8v/z8/P/8/Pzl/// + /wH///8B5+fn8ebm5v/l5eX/4+Pj/+Li4v/g4OD/39/f/97e3v/c3Nz/29vb/9jY2P+tra3/lpaW/5eX + l/9aWlr/JCQk/yIiIv8iIiL/ISEh/yEhIf8iISH/MiIg/10mG/91Jhj/fSYX/30oGf8mIyL/IyMj/yMj + I/9BQUH/WVlZ/6ampv/X19f/2tra/9zc3P/d3d3/39/f/+Dg4P/i4uL/4+Pj/+Tk5P/m5ub/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7u7u/+7u7v/v7+//8PDw//Dw8P/x8fH/8fHx//Ly + 8v/z8/P/8/Pz//T09Jf///8B////Aenp6fHo6Oj/5+fn/+bm5v/k5OT/4+Pj/+Li4v/h4eH/39/f/97e + 3v/d3d3/3Nzc/9vb2//b29v/1NTU/1VVVf8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8kIiL/UCUd/1cm + Hf8mIyL/IyMj/yIiIv8aGhr/ICAg/5WVlf/Z2dn/3d3d/97e3v/f39//4eHh/+Li4v/j4+P/5eXl/+bm + 5v/n5+f/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Hx + 8f/x8fH/8vLy//Ly8v/z8/P/8/Pz//T09P/09PSX////Af///wHr6+vx6urq/+np6f/o6Oj/5+fn/+bm + 5v/l5eX/5OTk/+Pj4//i4uL/4eHh/9/f3//f39//3t7e/93d3f+Xl5f/KSkp/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IyMj/yMjI/8jIyP/IyMj/yIiIv8eHh7/DQ0N/4ODg//Z2dn/4ODg/+Hh4f/i4uL/4+Pj/+Tk + 5P/l5eX/5ubm/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v + 7//w8PD/8PDw//Hx8f/x8fH/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9fX1l////wH///8B7e3t8ezs + 7P/r6+v/6urq/+np6f/o6Oj/5+fn/+bm5v/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/39/f/7m5 + uf9YWFj/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8gICD/DQ0N/3p6ev/Z2dn/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/6Ojo/+np6f/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+/v + 7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Pz8//z8/P/9PT0//T09P/19fX/9fX1//b2 + 9pf///8B////Ae7u7vHt7e3/7Ozs/+zs7P/r6+v/6urq/+rq6v/p6en/6Ojo/+fn5//m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/i4uL/39/f/6Kiov8+Pj7/IyMj/yMjI/8jIyP/IyMj/yIiIv9ZWVn/tLS0/6en + p//c3Nz/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9fX1//X19f/29vaX////Af///wHv7+/x7u7u/+7u7v/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq + 6v/p6en/6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/l5eX/2NjY/4ODg/8xMTH/IiIi/yIi + Iv9NTU3/19fX/+bm5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v//Dw8P/w8PD/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2l////wH///8B8PDw8fDw8P/v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/6+vr/+rq6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+fn5//n5+f/5+fn/+fn + 5//m5ub/xMTE/2VlZf9LS0v/0tLS/+jo6P/p6en/6enp/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/x8fH/8fHx//Ly8v/y8vL/8vLy//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//X19f/19fX/9fX1//b29v/29vb/9vb2//f395f///8B////AfHx + 8fHx8fH/8PDw//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+3t7f/s7Oz/7Ozs/+vr6//q6ur/6urq/+rq + 6v/p6en/6enp/+np6f/p6en/6enp/+rq6v/n5+f/4eHh/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//f3 + 9//39/eX////Af///wHy8vLx8vLy//Hx8f/x8fH/8PDw//Dw8P/w8PD/7+/v/+/v7//u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3l////wH///8B8/Pz8fPz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Dw + 8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+7u7v/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/+Pj4//j4+Jf///8BAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAgAAAAAABAAABACAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAA////Af// + /wHw8PDj8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW + 1v/V1dX/09PT/9LS0v/Q0ND/zs7O/83Nzf/Ly8v/ysrK/8jIyP/Hx8f/xcXF/8TExP/CwsL/wcHB/8DA + wP++vr7/vb29/7u7u/+6urr/uLi4/7e3t/+1tbX/tLS0/7Ozs/+ysrL/sbGx/7Gxsf+wsLD/sLCw/7Cw + sP+wsLD/sLCw/7Gxsf+xsbH/sbGx/7Kysv+ysrL/srKy/7S0tP+0tLT/tbW1/7a2tv+3t7f/uLi4/7m5 + uf+7u7v/u7u7/729vf++vr7/wMDA/8HBwf/BwcH/w8PD/8TExP/FxcX/xsbG/8jIyP/Jycn/ysrK/8vL + y//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e + 3v/e3t7/39/f/+Hh4f/h4eEx////Af///wH///8B////AfDw8OPv7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/3Nzc/9vb + 2//a2tr/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/z8/P/83Nzf/MzMz/ysrK/8jI + yP/Hx8f/xcXF/8PDw//BwcH/wMDA/7+/v/+9vb3/vLy8/7q6uv+4uLj/t7e3/7W1tf+zs7P/srKy/7Cw + sP+vr6//rq6u/62trf+tra3/rKys/6urq/+rq6v/q6ur/6urq/+rq6v/rKys/62trf+tra3/ra2t/66u + rv+urq7/sLCw/7CwsP+ysrL/srKy/7Ozs/+1tbX/tra2/7e3t/+5ubn/urq6/7y8vP+9vb3/vr6+/7+/ + v//AwMD/wsLC/8PDw//ExMT/xcXF/8bGxv/IyMj/ycnJ/8vLy//MzMz/zc3N/87Ozv/Pz8//0dHR/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9nZ2f/b29v/3Nzc/97e3v/f39//39/f/+Dg4DH///8B////Af// + /wH///8B7+/v4+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/93d3f/d3d3/3Nzc/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT + 0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Gxsb/xcXF/8LCwv/BwcH/v7+//729vf+8vLz/urq6/7i4 + uP+2trb/tLS0/7Kysv+wsLD/rq6u/6ysrP+rq6v/qamp/6ioqP+np6f/p6en/6ampv+lpaX/paWl/6Wl + pf+lpaX/paWl/6ampv+mpqb/p6en/6ioqP+oqKj/qamp/6qqqv+rq6v/rKys/62trf+vr6//sLCw/7Gx + sf+ysrL/tLS0/7a2tv+2trb/uLi4/7m5uf+7u7v/vLy8/729vf+/v7//wMDA/8LCwv/CwsL/w8PD/8XF + xf/Gxsb/yMjI/8nJyf/Ly8v/zMzM/83Nzf/Pz8//0NDQ/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ + 2f/b29v/3Nzc/97e3v/e3t7/39/fMf///wH///8B////Af///wHv7+/j7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7Ozs/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/Pz//Nzc3/y8vL/8rKyv/Hx8f/xsbG/8PD + w//BwcH/v7+//729vf+7u7v/ubm5/7e3t/+1tbX/s7Oz/7Gxsf+urq7/rKys/6mpqf+np6f/paWl/6Oj + o/+ioqL/oaGh/6CgoP+goKD/n5+f/5+fn/+fn5//n5+f/5+fn/+goKD/oaGh/6Ghof+ioqL/o6Oj/6Sk + pP+lpaX/pqam/6enp/+oqKj/qamp/6qqqv+srKz/ra2t/6+vr/+xsbH/srKy/7Ozs/+1tbX/tra2/7i4 + uP+5ubn/u7u7/7y8vP+9vb3/v7+//8DAwP/BwcH/w8PD/8TExP/FxcX/x8fH/8jIyP/Kysr/y8vL/8zM + zP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/97e3v/e3t4x////Af// + /wH///8B////Ae7u7uPu7u7/7u7u/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh4f/h4eH/4ODg/9/f + 3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//S0tL/0NDQ/8/P + z//Ozs7/zMzM/8rKyv/IyMj/x8fH/8TExP/CwsL/v7+//729vf+7u7v/uLi4/7e3t/+0tLT/srKy/7Cw + sP+tra3/qqqq/6enp/+lpaX/oaGh/6CgoP+dnZ3/m5ub/5qamv+ZmZn/mJiY/5iYmP+YmJj/mJiY/5iY + mP+YmJj/mZmZ/5qamv+bm5v/nJyc/52dnf+dnZ3/n5+f/6CgoP+hoaH/oqKi/6Ojo/+lpaX/pqam/6io + qP+qqqr/q6ur/62trf+urq7/sLCw/7Kysv+zs7P/tbW1/7a2tv+4uLj/ubm5/7u7u/+8vLz/vb29/7+/ + v//AwMD/wsLC/8PDw//ExMT/xsbG/8fHx//Jycn/y8vL/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9XV + 1f/X19f/2dnZ/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8B7u7u4+3t7f/t7e3/7e3t/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/c3Nz/2tra/9nZ2f/Z2dn/19fX/9bW + 1v/V1dX/1NTU/9PT0//S0tL/0dHR/8/Pz//Nzc3/zMzM/8rKyv/IyMj/x8fH/8XFxf/Dw8P/wcHB/76+ + vv+7u7v/ubm5/7a2tv+0tLT/sbGx/66urv+srKz/qamp/6ampv+jo6P/n5+f/5mZmf+BgYH/ioqK/5SU + lP+Tk5P/kZGR/5CQkP+QkJD/kJCQ/5CQkP+QkJD/kZGR/5GRkf+SkpL/k5OT/5WVlf+Wlpb/lpaW/5eX + l/+ZmZn/mpqa/5ycnP+dnZ3/np6e/6CgoP+ioqL/o6Oj/6ampv+np6f/qamp/6urq/+srKz/rq6u/6+v + r/+xsbH/s7Oz/7S0tP+2trb/t7e3/7m5uf+6urr/vLy8/729vf+/v7//wMDA/8HBwf/ExMT/xcXF/8fH + x//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29v/3NzcMf// + /wH///8B////Af///wHt7e3j7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6urq/+rq6v/q6ur/6enp/+np + 6f/o6Oj/5+fn/+bm5v/m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Li4v/i4uL/4ODg/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//S0tL/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Jycn/yMjI/8bGxv/Dw8P/wsLC/8DAwP++vr7/u7u7/7m5uf+2trb/s7Oz/6+vr/+srKz/qamp/6en + p/+jo6P/n5+f/5ycnP+VlZX/fX19/2RkZP9paWn/enp6/4qKiv+Li4v/iYmJ/4mJif+JiYn/iYmJ/4qK + iv+Kior/i4uL/4yMjP+Ojo7/j4+P/5CQkP+RkZH/kpKS/5SUlP+VlZX/l5eX/5mZmf+ampr/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/p6en/6ioqP+rq6v/rKys/66urv+wsLD/sbGx/7Ozs/+0tLT/tra2/7i4 + uP+5ubn/u7u7/7y8vP++vr7/wMDA/8HBwf/Dw8P/xcXF/8fHx//Jycn/ysrK/8zMzP/Ozs7/z8/P/9HR + 0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29sx////Af///wH///8B////Ae3t7ePs7Oz/7Ozs/+vr + 6//r6+v/6urq/+rq6v/q6ur/6enp/+np6f/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/k5OT/4+Pj/+Pj + 4//i4uL/4eHh/+Dg4P/f39//3t7e/93d3f/d3d3/29vb/9vb2//Z2dn/2NjY/9jY2P/W1tb/1dXV/9PT + 0//T09P/0tLS/9DQ0P/Pz8//zc3N/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP++vr7/vLy8/7m5 + uf+3t7f/tLS0/7Kysv+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Xl5f/k5OT/4CAgP9jY2P/YmJi/2Fh + Yf9iYmL/enp6/4ODg/+CgoL/gYGB/4GBgf+CgoL/goKC/4ODg/+EhIT/hoaG/4eHh/+IiIj/iYmJ/4uL + i/+MjIz/jo6O/4+Pj/+RkZH/k5OT/5WVlf+Xl5f/mZmZ/5qamv+dnZ3/n5+f/6Ghof+ioqL/pKSk/6am + pv+oqKj/qqqq/6urq/+tra3/r6+v/7Gxsf+ysrL/tLS0/7a2tv+4uLj/ubm5/7u7u/+9vb3/v7+//8HB + wf/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/S0tL/1NTU/9bW1v/X19f/2dnZ/9nZ + 2TH///8B////Af///wH///8B7Ozs4+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo/+fn + 5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Pj4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/X19f/1tbW/9XV1f/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fH + x//FxcX/xMTE/8HBwf+/v7//vb29/7u7u/+5ubn/tra2/7S0tP+wsLD/ra2t/6qqqv+lpaX/oqKi/52d + nf+ZmZn/lJSU/5CQkP+MjIz/dnZ2/2FhYf9jY2P/YmJi/2FhYf92dnb/fX19/3x8fP98fHz/e3t7/3x8 + fP98fHz/fX19/35+fv+AgID/gYGB/4ODg/+EhIT/hYWF/4eHh/+JiYn/i4uL/4yMjP+Ojo7/kJCQ/5KS + kv+UlJT/lpaW/5mZmf+bm5v/nZ2d/56env+goKD/oqKi/6SkpP+mpqb/qKio/6qqqv+srKz/ra2t/7Cw + sP+xsbH/s7Oz/7W1tf+2trb/ubm5/7q6uv+9vb3/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW1v/X19f/2NjYMf///wH///8B////Af///wHr6+vj6+vr/+vr + 6//q6ur/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/j4+P/4uLi/+Hh + 4f/h4eH/39/f/9/f3//e3t7/3Nzc/9zc3P/b29v/2tra/9jY2P/X19f/19fX/9XV1f/V1dX/09PT/9LS + 0v/R0dH/z8/P/87Ozv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7y8vP+5ubn/t7e3/7W1 + tf+ysrL/r6+v/6ysrP+pqan/pKSk/5+fn/+bm5v/lpaW/5GRkf+MjIz/iIiI/4SEhP9ycnL/YWFh/2Rk + ZP9iYmL/YWFh/3Fxcf92dnb/dnZ2/3V1df91dXX/dXV1/3V1df92dnb/eHh4/3p6ev97e3v/fX19/39/ + f/+AgID/goKC/4ODg/+Ghob/h4eH/4mJif+Li4v/jY2N/5CQkP+SkpL/lJSU/5aWlv+YmJj/mpqa/5yc + nP+enp7/oKCg/6Kiov+kpKT/pqam/6ioqP+qqqr/rKys/66urv+wsLD/srKy/7Ozs/+2trb/uLi4/7q6 + uv+8vLz/vr6+/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9bW + 1v/X19cx////Af///wH///8B////Aevr6+Pr6+v/6urq/+np6f/p6en/6Ojo/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3t7e/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9bW1v/V1dX/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/v7+//729vf+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+rq6v/p6en/6Ojo/+enp7/mZmZ/5SU + lP+Ojo7/iYmJ/4SEhP9/f3//fHx8/21tbf9iYmL/ZWVl/2NjY/9iYmL/bW1t/3BwcP9wcHD/b29v/29v + b/9vb2//b29v/3Fxcf9zc3P/dHR0/3Z2dv94eHj/enp6/3t7e/99fX3/fn5+/4CAgP+CgoL/hISE/4aG + hv+JiYn/i4uL/42Njf+Pj4//kZGR/5SUlP+Wlpb/mJiY/5qamv+cnJz/np6e/6CgoP+jo6P/paWl/6am + pv+pqan/qqqq/62trf+vr6//sbGx/7Ozs/+1tbX/t7e3/7m5uf+8vLz/vr6+/7+/v//CwsL/xMTE/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/z8/P/9HR0f/T09P/1dXV/9bW1jH///8B////Af///wH///8B6urq4+rq + 6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh + 4f/f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1dXV/9TU1P/S0tL/0dHR/9DQ + 0P/Ozs7/zc3N/8vLy//Jycn/x8fH/8XFxf/Dw8P/wcHB/7+/v/+9vb3/urq6/7e3t/+1tbX/s7Oz/7Cw + sP+tra3/qamp/6ampv+ioqL/nZ2d/5iYmP+Tk5P/jY2N/4eHh/+CgoL/fX19/3h4eP91dXX/a2tr/2Rk + ZP9mZmb/ZWVl/2NjY/9paWn/ampq/2lpaf9paWn/aWlp/2pqav9ra2v/bW1t/25ubv9wcHD/cnJy/3Nz + c/91dXX/d3d3/3l5ef96enr/fHx8/319ff9/f3//gYGB/4SEhP+Hh4f/iYmJ/4uLi/+NjY3/kJCQ/5KS + kv+UlJT/lpaW/5iYmP+bm5v/nZ2d/5+fn/+hoaH/o6Oj/6ampv+oqKj/qqqq/6ysrP+urq7/sLCw/7Ky + sv+1tbX/t7e3/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS + 0v/U1NT/1dXVMf///wH///8B////Af///wHq6urj6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+Xl + 5f/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9fX + 1//X19f/1tbW/9TU1P/T09P/0tLS/9HR0f/Q0ND/zs7O/8zMzP/Kysr/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/s7Oz/7Gxsf+urq7/rKys/6mpqf+lpaX/oaGh/5ubm/+Xl5f/kZGR/4uL + i/+Ghob/gYGB/3x8fP92dnb/cnJy/29vb/9oaGj/ZWVl/2lpaf9qamr/ampq/2hoaP9kZGT/Y2Nj/2Nj + Y/9kZGT/ZWVl/2ZmZv9oaGj/aWlp/2tra/9tbW3/bm5u/3BwcP9xcXH/c3Nz/3V1df92dnb/eHh4/3p6 + ev98fHz/fn5+/4GBgf+EhIT/hoaG/4mJif+Li4v/jY2N/4+Pj/+RkZH/lJSU/5aWlv+ZmZn/m5ub/56e + nv+fn5//oqKi/6SkpP+mpqb/qKio/6urq/+tra3/r6+v/7Kysv+0tLT/tra2/7m5uf+7u7v/vb29/7+/ + v//CwsL/xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT0//T09Mx////Af///wH///8B////Aenp + 6ePp6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4ODg/9/f + 3//f39//3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/09PT/9LS0v/R0dH/z8/P/87O + zv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7Ozs/+wsLD/rq6u/6ur + q/+oqKj/pKSk/6CgoP+cnJz/lZWV/5CQkP+Li4v/hoaG/39/f/96enr/dnZ2/3Fxcf9ubm7/a2tr/2dn + Z/9nZ2f/a2tr/25ubv9ycnL/cHBw/2dnZ/9fX1//X19f/2BgYP9hYWH/YmJi/2RkZP9lZWX/Z2dn/2ho + aP9qamr/a2tr/21tbf9vb2//cHBw/3Jycv90dHT/dnZ2/3l5ef97e3v/fX19/4CAgP+CgoL/hYWF/4eH + h/+JiYn/i4uL/46Ojv+QkJD/k5OT/5WVlf+YmJj/mpqa/5ycnP+fn5//oaGh/6Ojo/+lpaX/qKio/6qq + qv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5uf+7u7v/vb29/8DAwP/CwsL/xMTE/8fHx//Jycn/y8vL/83N + zf/Pz8//0dHR/9LS0jH///8B////Af///wH///8B6enp4+jo6P/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl + 5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Dg4P/g4OD/3t7e/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX + 1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/zMzM/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+ + vv+7u7v/uLi4/7W1tf+zs7P/sLCw/62trf+qqqr/p6en/6Ojo/+fn5//mpqa/5WVlf+Pj4//ioqK/4WF + hf97e3v/Y2Nj/11dXf9nZ2f/ampq/2pqav9nZ2f/Z2dn/2lpaf9sbGz/b29v/3Nzc/90dHT/b29v/1xc + XP9bW1v/XFxc/11dXf9eXl7/X19f/2FhYf9iYmL/ZGRk/2VlZf9nZ2f/aWlp/2pqav9sbGz/bW1t/29v + b/9xcXH/dHR0/3Z2dv94eHj/enp6/35+fv+AgID/goKC/4SEhP+Hh4f/ioqK/4yMjP+Ojo7/kZGR/5SU + lP+Wlpb/mJiY/5ubm/+dnZ3/oKCg/6Kiov+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/tra2/7m5 + uf+7u7v/vr6+/8DAwP/CwsL/xcXF/8fHx//Kysr/zMzM/87Ozv/Q0ND/0NDQMf///wH///8B////Af// + /wHp6enj6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vL + y//Kysr/yMjI/8fHx//FxcX/w8PD/8DAwP++vr7/u7u7/7i4uP+1tbX/s7Oz/7CwsP+tra3/qamp/6am + pv+ioqL/np6e/5qamv+UlJT/j4+P/4mJif+EhIT/fX19/2NjY/9QUFD/S0tL/01NTf9dXV3/ZWVl/2Vl + Zf9oaGj/a2tr/25ubv9wcHD/c3Nz/3R0dP9wcHD/Wlpa/1dXV/9YWFj/WVlZ/1paWv9bW1v/XV1d/15e + Xv9gYGD/YWFh/2JiYv9kZGT/ZmZm/2dnZ/9paWn/a2tr/21tbf9vb2//cnJy/3R0dP92dnb/eXl5/3t7 + e/9+fn7/gICA/4ODg/+Ghob/iIiI/4uLi/+NjY3/kJCQ/5OTk/+VlZX/mJiY/5qamv+dnZ3/n5+f/6Gh + of+kpKT/p6en/6qqqv+tra3/r6+v/7Gxsf+0tLT/t7e3/7m5uf+7u7v/vr6+/8HBwf/Dw8P/xsbG/8jI + yP/Kysr/zMzM/8/Pz//Q0NAx////Af///wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/+Dg4P/f39//3t7e/93d3f/c3Nz/2tra/9nZ2f/Y2Nj/19fX/9bW + 1v/U1NT/09PT/9HR0f/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vr6+/7u7 + u/+4uLj/tbW1/7Ozs/+wsLD/ra2t/6qqqv+mpqb/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/goKC/319 + ff9ycnL/VFRU/09PT/9JSUn/RUVF/1VVVf9hYWH/ZGRk/2pqav9tbW3/cHBw/3Jycv90dHT/dXV1/3Bw + cP9XV1f/VFRU/1VVVf9WVlb/V1dX/1hYWP9XV1f/S0tL/0lJSf9YWFj/Xl5e/2BgYP9hYWH/Y2Nj/2Vl + Zf9nZ2f/aWlp/2tra/9tbW3/cHBw/3Jycv91dXX/d3d3/3p6ev98fHz/fn5+/4GBgf+EhIT/h4eH/4qK + iv+MjIz/j4+P/5GRkf+UlJT/l5eX/5mZmf+cnJz/np6e/6Ghof+kpKT/p6en/6qqqv+srKz/r6+v/7Ky + sv+0tLT/t7e3/7q6uv+9vb3/v7+//8HBwf/ExMT/xsbG/8nJyf/Ly8v/zs7O/8/PzzH///8B////Af// + /wH///8B6Ojo4+fn5//m5ub/5ubm/+Xl5f/k5OT/5OTk/+Pj4//i4uL/4eHh/+Dg4P/g4OD/39/f/97e + 3v/d3d3/3Nzc/9vb2//Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/0NDQ/8/Pz//Nzc3/y8vL/8nJ + yf/IyMj/xsbG/8TExP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+ysrL/sLCw/62trf+qqqr/pqam/6Gh + of+enp7/mZmZ/5OTk/+Ojo7/h4eH/4KCgv98fHz/dnZ2/2xsbP9VVVX/UVFR/0dHR/9DQ0P/UlJS/15e + Xv9nZ2f/bGxs/25ubv9xcXH/dHR0/3d3d/93d3f/cXFx/1NTU/9QUFD/UVFR/1JSUv9TU1P/UlJS/z4+ + Pv8fHx//Hh4e/zExMf9KSkr/Wlpa/15eXv9fX1//YmJi/2NjY/9lZWX/Z2dn/2lpaf9ra2v/bm5u/3Bw + cP9ycnL/dXV1/3h4eP96enr/fX19/4CAgP+Dg4P/hYWF/4iIiP+Li4v/jo6O/5CQkP+Tk5P/lpaW/5mZ + mf+bm5v/np6e/6Ghof+kpKT/p6en/6qqqv+tra3/r6+v/7Kysv+1tbX/uLi4/7q6uv+9vb3/wMDA/8PD + w//FxcX/x8fH/8rKyv/MzMz/zc3NMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5eXl/+Tk + 5P/j4+P/4uLi/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9jY2P/X19f/1tbW/9TU + 1P/T09P/0dHR/9DQ0P/Pz8//zc3N/8vLy//Jycn/x8fH/8bGxv/ExMT/wcHB/8DAwP+9vb3/u7u7/7m5 + uf+1tbX/s7Oz/7CwsP+tra3/qqqq/6ampv+jo6P/np6e/5mZmf+UlJT/j4+P/4iIiP+CgoL/fHx8/3Z2 + dv9wcHD/ZmZm/1ZWVv9TU1P/RkZG/0JCQv9PT0//X19f/2lpaf9tbW3/b29v/3Jycv96enr/fn5+/3h4 + eP9xcXH/UVFR/01NTf9OTk7/T09P/09PT/9AQED/ISEh/xoaGv8bGxv/Hh4e/yYmJv88PDz/VFRU/1xc + XP9eXl7/YGBg/2FhYf9jY2P/ZWVl/2dnZ/9qamr/bGxs/25ubv9xcXH/dHR0/3d3d/96enr/fHx8/39/ + f/+BgYH/hISE/4eHh/+Kior/jY2N/5CQkP+Tk5P/lZWV/5mZmf+cnJz/np6e/6Kiov+kpKT/p6en/6qq + qv+tra3/sLCw/7Ozs/+2trb/ubm5/7y8vP+/v7//wcHB/8TExP/Gxsb/ycnJ/8zMzP/MzMwx////Af// + /wH///8B////Aefn5+Pm5ub/5ubm/+Tk5P/k5OT/4+Pj/+Li4v/i4uL/4eHh/+Dg4P/f39//3t7e/93d + 3f/c3Nz/29vb/9ra2v/Z2dn/19fX/9fX1//V1dX/1NTU/9LS0v/Q0ND/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//Gxsb/w8PD/8HBwf+/v7//vb29/7u7u/+4uLj/tbW1/7Kysv+wsLD/ra2t/6mpqf+mpqb/oqKi/5+f + n/+ZmZn/lJSU/46Ojv+IiIj/goKC/3t7e/92dnb/b29v/2lpaf9gYGD/WFhY/1VVVf9ERET/QUFB/0tL + S/9eXl7/a2tr/25ubv9xcXH/enp6/46Ojv+VlZX/fHx8/3Nzc/9PT0//SUlJ/0pKSv9LS0v/PDw8/xsb + G/8TExP/HBwc/x4eHv8dHR3/Hh4e/x4eHv8oKCj/QEBA/1VVVf9bW1v/XV1d/19fX/9hYWH/Y2Nj/2Vl + Zf9oaGj/ampq/21tbf9wcHD/cnJy/3V1df94eHj/e3t7/319ff+AgID/g4OD/4aGhv+JiYn/jIyM/4+P + j/+SkpL/lZWV/5iYmP+bm5v/np6e/6Ghof+kpKT/qKio/6urq/+urq7/sbGx/7W1tf+3t7f/urq6/729 + vf/AwMD/w8PD/8XFxf/IyMj/y8vL/8vLyzH///8B////Af///wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj + 4//i4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb2//a2tr/2dnZ/9jY2P/X19f/1dXV/9TU + 1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJyf/IyMj/xcXF/8TExP/BwcH/v7+//729vf+7u7v/uLi4/7W1 + tf+zs7P/r6+v/6ysrP+pqan/pqam/6Ojo/+fn5//mpqa/5SUlP+Pj4//iYmJ/4SEhP99fX3/dnZ2/3Bw + cP9paWn/YmJi/1xcXP9bW1v/V1dX/0ZGRv9FRUX/SkpK/11dXf9sbGz/cHBw/3Z2dv+MjIz/oKCg/4+P + j/9vb2//dnZ2/1dXV/9GRkb/R0dH/z4+Pv8dHR3/EhIS/xgYGP8uLi7/LCws/x4eHv8eHh7/Hh4e/x4e + Hv8hISH/NDQ0/0xMTP9ZWVn/W1tb/11dXf9fX1//YWFh/2RkZP9mZmb/aWlp/2xsbP9ubm7/cXFx/3R0 + dP93d3f/enp6/319ff+AgID/goKC/4aGhv+JiYn/jIyM/4+Pj/+SkpL/lZWV/5iYmP+cnJz/np6e/6Ki + ov+mpqb/qamp/6ysrP+vr6//s7Oz/7a2tv+5ubn/vLy8/76+vv/CwsL/xMTE/8fHx//Kysr/y8vLMf// + /wH///8B////Af///wHm5ubj5eXl/+Tk5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/U1NT/0tLS/9HR0f/Pz8//zc3N/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/7+/v/+9vb3/u7u7/7i4uP+2trb/s7Oz/7CwsP+srKz/qamp/6ampv+jo6P/np6e/5mZ + mf+VlZX/j4+P/4qKiv+EhIT/fn5+/3h4eP9wcHD/ampq/2JiYv9bW1v/WFhY/11dXf9fX1//X19f/1lZ + Wf9MTEz/Xl5e/25ubv92dnb/h4eH/5+fn/+SkpL/VVVV/1ZWVv93d3f/bGxs/05OTv89PT3/JCQk/xMT + E/8YGBj/KCgo/zY2Nv8rKyv/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/JSUl/z09Pf9QUFD/WFhY/1tb + W/9dXV3/X19f/2FhYf9kZGT/Z2dn/2pqav9tbW3/cHBw/3Nzc/91dXX/eHh4/3t7e/9+fn7/goKC/4WF + hf+IiIj/i4uL/46Ojv+SkpL/lZWV/5mZmf+cnJz/n5+f/6Ojo/+mpqb/qqqq/62trf+xsbH/tLS0/7e3 + t/+6urr/vb29/8DAwP/Dw8P/xsbG/8nJyf/Kysox////Af///wH///8B////AeXl5ePk5OT/5OTk/+Pj + 4//i4uL/4eHh/+Dg4P/f39//39/f/97e3v/c3Nz/29vb/9ra2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9LS + 0v/R0dH/0NDQ/83Nzf/MzMz/ysrK/8jIyP/Gxsb/xMTE/8HBwf+/v7//vb29/7u7u/+4uLj/tra2/7S0 + tP+wsLD/ra2t/6qqqv+mpqb/o6Oj/6CgoP+ampr/lZWV/5CQkP+JiYn/hISE/35+fv9zc3P/aWlp/2lp + af9kZGT/XFxc/1VVVf9UVFT/YGBg/2NjY/9mZmb/XFxc/09PT/9dXV3/c3Nz/4WFhf+bm5v/lpaW/11d + Xf9MTEz/cHBw/4aGhv92dnb/Y2Nj/ykpKf8WFhb/GBgY/ycnJ/8rKyv/Hx8f/xwcHP8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/ywsLP9DQ0P/VVVV/1lZWf9bW1v/XV1d/2BgYP9jY2P/ZmZm/2lp + af9sbGz/b29v/3Jycv91dXX/eHh4/3t7e/9+fn7/gYGB/4SEhP+IiIj/i4uL/4+Pj/+SkpL/lpaW/5mZ + mf+dnZ3/oaGh/6SkpP+oqKj/q6ur/6+vr/+ysrL/tra2/7m5uf+8vLz/v7+//8LCwv/FxcX/yMjI/8rK + yjH///8B////Af///wH///8B5OTk4+Tk5P/j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/2dnZ/9jY2P/X19f/1tbW/9XV1f/S0tL/0dHR/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TE + xP/CwsL/wMDA/729vf+7u7v/uLi4/7W1tf+zs7P/sbGx/62trf+qqqr/pqam/6Ojo/+fn5//m5ub/5aW + lv+Pj4//ioqK/4ODg/9+fn7/dHR0/1paWv9NTU3/U1NT/1lZWf9XV1f/UVFR/1RUVP9iYmL/ZWVl/2ho + aP9dXV3/UFBQ/2FhYf+BgYH/mpqa/56env9hYWH/SEhI/2pqav+MjIz/fHx8/5+fn/9nZ2f/HBwc/xcX + F/8lJSX/Kysr/xwcHP8aGhr/HBwc/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/yMj + I/81NTX/S0tL/1ZWVv9aWlr/XFxc/19fX/9iYmL/ZmZm/2hoaP9ra2v/bm5u/3Fxcf90dHT/d3d3/3t7 + e/9+fn7/gYGB/4WFhf+IiIj/jIyM/4+Pj/+Tk5P/lpaW/5qamv+enp7/oaGh/6ampv+pqan/ra2t/7Gx + sf+0tLT/uLi4/7u7u/++vr7/wcHB/8XFxf/IyMj/ycnJMf///wH///8B////Af///wHj4+Pj4+Pj/+Li + 4v/h4eH/4ODg/9/f3//f39//3t7e/93d3f/c3Nz/29vb/9ra2v/Y2Nj/2NjY/9bW1v/V1dX/09PT/9LS + 0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/s7Oz/7Cw + sP+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kJCQ/4qKiv+EhIT/fX19/3d3d/9eXl7/SkpK/0VF + Rf9BQUH/RUVF/1JSUv9PT0//XFxc/2VlZf9oaGj/ampq/1JSUv9OTk7/bW1t/5eXl/+cnJz/ampq/0dH + R/9mZmb/iYmJ/35+fv+vr6//+vr6/9HR0f84ODj/HR0d/ykpKf8hISH/GRkZ/xsbG/8dHR3/Hh4e/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/HR0d/x0dHf8lJSX/PT09/09PT/9YWFj/W1tb/15e + Xv9hYWH/ZGRk/2dnZ/9paWn/bGxs/3BwcP9zc3P/dnZ2/3p6ev9+fn7/gYGB/4SEhP+IiIj/i4uL/4+P + j/+Tk5P/l5eX/5ubm/+enp7/o6Oj/6enp/+rq6v/r6+v/7Ozs/+3t7f/urq6/76+vv/BwcH/xMTE/8fH + x//IyMgx////Af///wH///8B////AePj4+Pi4uL/4uLi/+Hh4f/g4OD/39/f/97e3v/d3d3/3Nzc/9vb + 2//a2tr/2dnZ/9jY2P/W1tb/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8nJyf/Hx8f/xcXF/8LC + wv/AwMD/vr6+/7u7u/+5ubn/tbW1/7Ozs/+wsLD/rq6u/6urq/+np6f/pKSk/6CgoP+cnJz/l5eX/5KS + kv+Li4v/hISE/39/f/93d3f/cHBw/1VVVf9MTEz/Q0ND/z4+Pv9BQUH/T09P/1NTU/9jY2P/Z2dn/2pq + av9ra2v/S0tL/0hISP9xcXH/m5ub/2tra/9GRkb/YWFh/4eHh/98fHz/nZ2d//Hx8f/8/Pz/wsLC/zAw + MP8gICD/JSUl/yIiIv8hISH/IiIi/yEhIf8fHx//Hh4e/x4eHv8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/x0dHf8hISH/Ly8v/0hISP9XV1f/Wlpa/11dXf9gYGD/ZGRk/2ZmZv9paWn/bGxs/29v + b/9zc3P/dnZ2/3p6ev99fX3/gICA/4WFhf+IiIj/jY2N/5CQkP+UlJT/mZmZ/5ycnP+hoaH/paWl/6mp + qf+tra3/srKy/7a2tv+5ubn/vb29/8DAwP/ExMT/x8fH/8jIyDH///8B////Af///wH///8B4uLi4+Hh + 4f/h4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9bW1v/U1NT/0tLS/9HR + 0f/Ozs7/zc3N/8rKyv/Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62t + rf+qqqr/p6en/6Ojo/+fn5//m5ub/5eXl/+RkZH/i4uL/4aGhv9+fn7/eHh4/3BwcP9qamr/VlZW/1BQ + UP9BQUH/Ojo6/z09Pf9NTU3/XFxc/2dnZ/9qamr/bGxs/25ubv9LS0v/R0dH/19fX/9mZmb/RERE/1tb + W/+IiIj/goKC/6CgoP/09PT//Pz8/7y8vP8+Pj7/HBwc/ygoKP8oKCj/ICAg/yIiIv8kJCT/JSUl/yQk + JP8gICD/Hh4e/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/IiIi/zY2 + Nv9MTEz/WFhY/1xcXP9fX1//YmJi/2VlZf9oaGj/a2tr/29vb/9ycnL/dnZ2/3l5ef98fHz/gYGB/4SE + hP+JiYn/jY2N/5GRkf+VlZX/mpqa/56env+ioqL/p6en/6ysrP+wsLD/tbW1/7m5uf+9vb3/wMDA/8PD + w//Gxsb/yMjIMf///wH///8B////Af///wHi4uLj4eHh/+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/2NjY/9fX1//W1tb/1NTU/9PT0//R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HB + wf++vr7/vLy8/7m5uf+2trb/tLS0/7Gxsf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+Wlpb/kZGR/4yM + jP+Ghob/gICA/3l5ef9zc3P/bGxs/2ZmZv9YWFj/UlJS/z8/P/83Nzf/Ozs7/09PT/9kZGT/aWlp/2tr + a/9tbW3/eHh4/2FhYf9LS0v/U1NT/0RERP9XV1f/f39//4aGhv+QkJD/6Ojo///////S0tL/R0dH/xwc + HP8nJyf/KSkp/yIiIv8fHx//IyMj/yQkJP8lJSX/JiYm/yUlJf8iIiL/Hx8f/x8fH/8fHx//Hx8f/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hx8f/yoqKv9CQkL/VFRU/1xcXP9fX1//YmJi/2Vl + Zf9oaGj/bGxs/29vb/9ycnL/dnZ2/3l5ef9+fn7/gYGB/4aGhv+Kior/jo6O/5KSkv+Xl5f/nJyc/6Cg + oP+mpqb/qqqq/6+vr/+zs7P/t7e3/7y8vP/AwMD/w8PD/8bGxv/IyMgx////Af///wH///8B////AeHh + 4ePg4OD/4ODg/9/f3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/1tbW/9TU1P/T09P/0tLS/9DQ + 0P/Ozs7/y8vL/8nJyf/Hx8f/xcXF/8PDw//BwcH/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/rq6u/6ur + q/+np6f/pKSk/6CgoP+bm5v/lpaW/5CQkP+MjIz/hoaG/4CAgP96enr/c3Nz/25ubv9nZ2f/YWFh/1lZ + Wf9VVVX/PT09/zQ0NP85OTn/TU1N/2ZmZv9ra2v/bW1t/3Z2dv+NjY3/kZGR/15eXv9VVVX/QEBA/15e + Xv+Dg4P/jo6O/+Hh4f/8/Pz/1dXV/1dXV/8cHBz/JiYm/ykpKf8hISH/Hx8f/yIiIv8kJCT/JSUl/yYm + Jv8mJib/Jycn/yYmJv8jIyP/ISEh/x8fH/8fHx//Hx8f/x8fH/8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/Hh4e/yEhIf8wMDD/TExM/1hYWP9eXl7/YWFh/2RkZP9oaGj/a2tr/25ubv9xcXH/dXV1/3p6 + ev99fX3/goKC/4WFhf+Kior/j4+P/5SUlP+ZmZn/np6e/6Ojo/+oqKj/ra2t/7Kysv+3t7f/u7u7/7+/ + v//Dw8P/xsbG/8jIyDH///8B////Af///wH///8B4eHh4+Dg4P/f39//3t7e/93d3f/c3Nz/29vb/9ra + 2v/Z2dn/19fX/9bW1v/U1NT/09PT/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/Dw8P/wcHB/76+ + vv+8vLz/ubm5/7e3t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/m5ub/5aWlv+RkZH/i4uL/4aG + hv+AgID/enp6/3R0dP9ubm7/aGho/2JiYv9dXV3/W1tb/1paWv9ISEj/QkJC/zo6Ov9KSkr/Z2dn/2xs + bP91dXX/iYmJ/6CgoP+Kior/U1NT/1hYWP9JSUn/PT09/1dXV//X19f//////93d3f9oaGj/Hh4e/yYm + Jv8qKir/Hx8f/x4eHv8hISH/JCQk/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8mJib/Ozs7/1JS + Uv9dXV3/YGBg/2RkZP9nZ2f/ampq/21tbf9xcXH/dXV1/3h4eP99fX3/gYGB/4aGhv+Li4v/kZGR/5eX + l/+bm5v/oaGh/6ampv+srKz/sbGx/7a2tv+7u7v/v7+//8PDw//Gxsb/yMjIMf///wH///8B////Af// + /wHg4ODj4ODg/9/f3//d3d3/3d3d/9vb2//a2tr/2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/0NDQ/87O + zv/MzMz/ysrK/8jIyP/Gxsb/xMTE/8LCwv+/v7//vb29/7q6uv+2trb/tLS0/7Kysv+urq7/q6ur/6io + qP+lpaX/oaGh/5ycnP+Xl5f/kZGR/4yMjP+Ghob/gYGB/3t7e/90dHT/b29v/2lpaf9jY2P/Xl5e/1lZ + Wf9cXFz/YGBg/2BgYP9YWFj/PT09/0dHR/9oaGj/cnJy/4aGhv+cnJz/kZGR/1dXV/9NTU3/YWFh/1hY + WP9AQED/NTU1/4uLi//W1tb/cHBw/yEhIf8iIiL/Kioq/yEhIf8eHh7/ISEh/yQkJP8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8mJib/JCQk/yIiIv8gICD/Hx8f/x8fH/8fHx//Hh4e/x4e + Hv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/x4eHv8gICD/Li4u/0pKSv9aWlr/YGBg/2JiYv9lZWX/aGho/2xs + bP9wcHD/dHR0/3l5ef99fX3/goKC/4iIiP+Ojo7/lJSU/5mZmf+fn5//paWl/6urq/+wsLD/tbW1/7q6 + uv++vr7/w8PD/8bGxv/IyMgx////Af///wH///8B////AeDg4OPf39//3t7e/93d3f/b29v/2tra/9nZ + 2f/X19f/1tbW/9TU1P/T09P/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/xsbG/8TExP/CwsL/v7+//729 + vf+6urr/t7e3/7S0tP+ysrL/rq6u/6urq/+oqKj/pKSk/6Ghof+dnZ3/mJiY/5KSkv+MjIz/h4eH/4GB + gf97e3v/b29v/1tbW/9dXV3/YmJi/19fX/9ZWVn/VlZW/15eXv9jY2P/ZWVl/1lZWf87Ozv/R0dH/29v + b/+EhIT/nJyc/5WVlf9QUFD/SkpK/3Jycv+CgoL/aWlp/1FRUf8jIyP/GRkZ/zY2Nv8jIyP/ISEh/yoq + Kv8hISH/HR0d/yIiIv8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x4e + Hv8eHh7/ISEh/zMzM/9PT0//W1tb/19fX/9jY2P/ZmZm/2pqav9ubm7/dHR0/3l5ef9/f3//hYWF/4uL + i/+SkpL/l5eX/52dnf+jo6P/qamp/7CwsP+0tLT/urq6/76+vv/Dw8P/xsbG/8jIyDH///8B////Af// + /wH///8B39/f497e3v/d3d3/3Nzc/9vb2//a2tr/2NjY/9fX1//V1dX/09PT/9LS0v/Q0ND/zs7O/8zM + zP/Kysr/yMjI/8fHx//ExMT/wsLC/8DAwP+9vb3/u7u7/7i4uP+1tbX/srKy/6+vr/+rq6v/qKio/6Wl + pf+hoaH/nZ2d/5mZmf+UlJT/jo6O/4iIiP+Dg4P/fHx8/3Nzc/9ZWVn/SkpK/0dHR/9OTk7/WFhY/1ZW + Vv9VVVX/YGBg/2RkZP9nZ2f/Wlpa/zo6Ov9KSkr/fX19/5mZmf+YmJj/YGBg/0ZGRv9oaGj/iYmJ/3t7 + e/+wsLD/hISE/x4eHv8RERH/IiIi/yYmJv8eHh7/IiIi/xwcHP8fHx//IyMj/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8iIiL/ISEh/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x4eHv8eHh7/Hh4e/x4eHv8eHh7/Hh4e/ykpKf8/Pz//VVVV/11d + Xf9hYWH/ZWVl/2pqav9wcHD/dXV1/3x8fP+CgoL/iYmJ/5CQkP+VlZX/nJyc/6Kiov+pqan/r6+v/7Oz + s/+5ubn/vr6+/8PDw//Hx8f/yMjIMf///wH///8B////Af///wHe3t7j3t7e/9zc3P/b29v/2tra/9jY + 2P/X19f/1dXV/9TU1P/S0tL/0NDQ/8/Pz//MzMz/y8vL/8jIyP/Gxsb/xMTE/8LCwv/AwMD/vb29/7u7 + u/+4uLj/tbW1/7Ozs/+vr6//rKys/6ioqP+lpaX/oaGh/52dnf+ZmZn/lJSU/4+Pj/+JiYn/goKC/319 + ff92dnb/ZWVl/05OTv9ISEj/QEBA/0BAQP9QUFD/U1NT/1paWv9jY2P/Z2dn/2hoaP9VVVX/MDAw/09P + T/+Tk5P/mZmZ/2BgYP9FRUX/aGho/4mJif97e3v/r6+v//f39//q6ur/dHR0/xgYGP8fHx//GBgY/xYW + Fv8ZGRn/Hx8f/yQkJP8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8kJCT/ISEh/x4eHv8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hh4e/x4eHv8eHh7/Hh4e/x8fH/8tLS3/RkZG/1hYWP9gYGD/ZWVl/2xsbP9ycnL/eXl5/4CA + gP+Hh4f/jo6O/5SUlP+bm5v/oaGh/6enp/+tra3/s7Oz/7m5uf++vr7/w8PD/8fHx//IyMgx////Af// + /wH///8B////Ad7e3uPd3d3/3Nzc/9ra2v/Z2dn/19fX/9XV1f/U1NT/09PT/9HR0f/Pz8//zc3N/8vL + y//Jycn/x8fH/8XFxf/Dw8P/wMDA/76+vv+7u7v/uLi4/7a2tv+zs7P/sLCw/62trf+pqan/pqam/6Ki + ov+enp7/mZmZ/5WVlf+QkJD/ioqK/4SEhP99fX3/d3d3/3BwcP9hYWH/UFBQ/0dHR/89PT3/PT09/01N + Tf9UVFT/YGBg/2VlZf9oaGj/ampq/1FRUf8rKyv/SkpK/5CQkP9paWn/RUVF/15eXv+IiIj/f39//6mp + qf/z8/P/+vr6/62trf83Nzf/HR0d/yAgIP8YGBj/Ghoa/x8fH/8lJSX/Jycn/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUl + Jf8kJCT/IiIi/yEhIf8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8kJCT/Nzc3/1RUVP9iYmL/ampq/3BwcP93d3f/fn5+/4WFhf+MjIz/kpKS/5mZmf+goKD/pqam/62t + rf+ysrL/uLi4/76+vv/Dw8P/x8fH/8jIyDH///8B////Af///wH///8B3d3d49zc3P/b29v/2dnZ/9jY + 2P/W1tb/1NTU/9PT0//R0dH/0NDQ/83Nzf/Ly8v/ycnJ/8fHx//FxcX/w8PD/8HBwf++vr7/u7u7/7m5 + uf+2trb/s7Oz/7CwsP+tra3/qqqq/6ampv+ioqL/np6e/5qamv+VlZX/kZGR/4uLi/+FhYX/f39//3d3 + d/9xcXH/a2tr/19fX/9TU1P/RkZG/zo6Ov86Ojr/SkpK/1xcXP9lZWX/Z2dn/2lpaf9sbGz/WVlZ/y8v + L/87Ozv/UlJS/0ZGRv9dXV3/g4OD/4KCgv+ZmZn/8fHx//z8/P+/v7//ODg4/xwcHP8oKCj/JCQk/xwc + HP8fHx//JSUl/ycnJ/8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IyMj/yEhIf8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8gICD/LCws/0RERP9iYmL/bW1t/3V1 + df97e3v/fHx8/4ODg/+Pj4//mJiY/56env+lpaX/q6ur/7Gxsf+4uLj/vr6+/8PDw//Hx8f/yMjIMf// + /wH///8B////Af///wHc3Nzj29vb/9ra2v/Y2Nj/1tbW/9XV1f/U1NT/0dHR/9DQ0P/Ozs7/zMzM/8rK + yv/IyMj/xcXF/8PDw//AwMD/vr6+/7y8vP+5ubn/tra2/7S0tP+xsbH/ra2t/6qqqv+np6f/o6Oj/5+f + n/+bm5v/lpaW/5GRkf+MjIz/hoaG/4CAgP95eXn/cnJy/2xsbP9mZmb/Xl5e/1VVVf9FRUX/Nzc3/zg4 + OP9ISEj/YWFh/2dnZ/9paWn/bGxs/3Z2dv97e3v/QUFB/zY2Nv8wMDD/SkpK/4KCgv+Ghob/mJiY/+rq + 6v/8/Pz/xsbG/0tLS/8aGhr/JiYm/yYmJv8dHR3/ISEh/yYmJv8nJyf/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JSUl/yUlJf8kJCT/JCQk/yQkJP8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8f + H/8fHx//Hx8f/x8fH/8fHx//ICAg/zg4OP9XV1f/b29v/3Fxcf9dXV3/Y2Nj/3l5ef+RkZH/nZ2d/6Oj + o/+qqqr/sbGx/7i4uP+9vb3/w8PD/8fHx//IyMgx////Af///wH///8B////Adzc3OPa2tr/2dnZ/9fX + 1//V1dX/1NTU/9LS0v/Q0ND/zs7O/8zMzP/Kysr/yMjI/8bGxv/ExMT/wcHB/7+/v/+8vLz/ubm5/7e3 + t/+0tLT/sbGx/66urv+rq6v/qKio/6SkpP+goKD/nJyc/5iYmP+Tk5P/jY2N/4iIiP+BgYH/e3t7/3R0 + dP9ubm7/aGho/2NjY/9dXV3/WFhY/0RERP81NTX/NTU1/0VFRf9iYmL/aWlp/2tra/90dHT/i4uL/5mZ + mf9cXFz/ODg4/y8vL/88PDz/dHR0/4eHh//q6ur//v7+/9jY2P9WVlb/Gxsb/yUlJf8pKSn/Hh4e/x8f + H/8kJCT/Jycn/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8lJSX/JSUl/yMj + I/8hISH/Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//ISEh/ykp + Kf9ISEj/VVVV/01NTf9fX1//ZWVl/4ODg/+cnJz/o6Oj/6qqqv+wsLD/uLi4/76+vv/Dw8P/x8fH/8jI + yDH///8B////Af///wH///8B2tra49nZ2f/X19f/1tbW/9TU1P/S0tL/0dHR/8/Pz//Nzc3/y8vL/8nJ + yf/Hx8f/xMTE/8LCwv+/v7//vLy8/7q6uv+3t7f/tbW1/7Gxsf+urq7/q6ur/6enp/+lpaX/oKCg/5yc + nP+Xl5f/kpKS/42Njf+IiIj/goKC/3x8fP92dnb/b29v/2lpaf9kZGT/X19f/1xcXP9bW1v/VFRU/09P + T/88PDz/QEBA/2RkZP9ra2v/dHR0/4yMjP+fn5//g4OD/0xMTP8+Pj7/NjY2/ysrK/89PT3/tra2//z8 + /P/c3Nz/UVFR/xkZGf8lJSX/KCgo/x4eHv8fHx//IyMj/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yQkJP8iIiL/ISEh/yAgIP8fHx//Hh4e/x8f + H/8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8oKCj/Ojo6/2BgYP9oaGj/f39//5ub + m/+jo6P/q6ur/7Gxsf+5ubn/vr6+/8TExP/Hx8f/yMjIMf///wH///8B////Af///wHa2trj2NjY/9bW + 1v/V1dX/09PT/9HR0f/Pz8//zs7O/8vLy//Jycn/x8fH/8XFxf/Dw8P/wMDA/729vf+6urr/uLi4/7W1 + tf+ysrL/r6+v/6urq/+oqKj/paWl/6Ghof+dnZ3/mZmZ/5OTk/+Ojo7/iYmJ/4ODg/99fX3/c3Nz/2tr + a/9qamr/ZWVl/2BgYP9cXFz/W1tb/15eXv9hYWH/YWFh/zs7O/8zMzP/ZGRk/3Fxcf+Ghob/n5+f/5GR + kf9NTU3/SkpK/2BgYP9DQ0P/NDQ0/ykpKf9LS0v/n5+f/2pqav8cHBz/IiIi/ykpKf8fHx//Gxsb/yEh + If8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/IyMj/yAgIP8eHh7/Hh4e/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8kJCT/Pj4+/2JiYv+BgYH/nJyc/6Ojo/+rq6v/srKy/7m5uf+/v7//xMTE/8fH + x//IyMgx////Af///wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/87Ozv/MzMz/ysrK/8jI + yP/Gxsb/w8PD/8HBwf++vr7/u7u7/7i4uP+2trb/srKy/6+vr/+srKz/qKio/6Wlpf+hoaH/np6e/5mZ + mf+UlJT/jo6O/4mJif+EhIT/fX19/3Nzc/9WVlb/TU1N/1ZWVv9fX1//XFxc/1hYWP9bW1v/YWFh/2Rk + ZP9iYmL/OTk5/zIyMv9sbGz/hISE/5ycnP+QkJD/U1NT/0pKSv9ubm7/hoaG/21tbf9SUlL/GRkZ/xIS + Ev8gICD/IyMj/yEhIf8pKSn/IiIi/x8fH/8gICD/IyMj/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/yEh + If8fHx//ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8gICD/ICAg/yAgIP8iIiL/R0dH/4KC + gv+cnJz/pKSk/6ysrP+ysrL/urq6/8DAwP/FxcX/yMjI/8jIyDH///8B////Af///wH///8B19fX49bW + 1v/U1NT/0tLS/9DQ0P/Pz8//zc3N/8vLy//IyMj/xsbG/8PDw//CwsL/v7+//7y8vP+5ubn/tra2/7Oz + s/+wsLD/ra2t/6mpqf+mpqb/oqKi/56env+ZmZn/lJSU/5CQkP+Kior/hISE/35+fv91dXX/XFxc/0tL + S/9ERET/QEBA/09PT/9ZWVn/WFhY/15eXv9jY2P/ZWVl/2JiYv8zMzP/MDAw/319ff+ampr/kpKS/1dX + V/9GRkb/a2tr/4uLi/9+fn7/vb29/8rKyv9NTU3/FRUV/xwcHP8dHR3/GBgY/x0dHf8dHR3/ISEh/yMj + I/8kJCT/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JSUl/yMjI/8iIiL/ISEh/yAgIP8gICD/ICAg/yAg + IP8gICD/ICAg/yAgIP8gICD/ICAg/yEhIf9ERET/hYWF/52dnf+lpaX/rKys/7Ozs/+7u7v/wcHB/8XF + xf/IyMj/ycnJMf///wH///8B////Af///wHW1tbj1dXV/9TU1P/R0dH/z8/P/83Nzf/Ly8v/ycnJ/8fH + x//FxcX/wsLC/7+/v/+8vLz/urq6/7e3t/+0tLT/sbGx/62trf+qqqr/pqam/6Kiov+enp7/mpqa/5aW + lv+QkJD/i4uL/4WFhf9+fn7/eXl5/25ubv9UVFT/TExM/0BAQP88PDz/SUlJ/1ZWVv9bW1v/YmJi/2Vl + Zf9nZ2f/YmJi/ywsLP8sLCz/ioqK/5ycnP9eXl7/RERE/2NjY/+IiIj/enp6/7S0tP/4+Pj/8fHx/39/ + f/8gICD/GRkZ/xUVFf8VFRX/Ghoa/yAgIP8jIyP/JCQk/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JSUl/yQkJP8jIyP/ISEh/yAgIP8gICD/ICAg/yAgIP8hISH/ISEh/yEhIf8hISH/ISEh/0BA + QP+FhYX/np6e/6enp/+vr6//tra2/76+vv/CwsL/xsbG/8nJyf/Kysox////Af///wH///8B////AdbW + 1uPU1NT/0tLS/9DQ0P/Ozs7/zMzM/8rKyv/Hx8f/xcXF/8PDw//AwMD/vb29/7q6uv+3t7f/tLS0/7Gx + sf+urq7/qqqq/6enp/+jo6P/n5+f/5ubm/+VlZX/kZGR/4uLi/+FhYX/f39//3l5ef90dHT/aWlp/1VV + Vf9NTU3/PT09/zg4OP9GRkb/VVVV/2FhYf9lZWX/aGho/2lpaf9mZmb/LS0t/yUlJf9oaGj/ZmZm/0RE + RP9iYmL/hoaG/319ff+pqan/+vr6//f39/+cnJz/Jycn/xwcHP8kJCT/Ghoa/xsbG/8gICD/IyMj/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8kJCT/IiIi/yAg + IP8fHx//Hx8f/yAgIP8hISH/ISEh/yEhIf8hISH/Nzc3/319ff+Xl5f/pqam/7Ozs/+6urr/wMDA/8TE + xP/Hx8f/ysrK/8vLyzH///8B////Af///wH///8B1dXV49PT0//R0dH/z8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/wcHB/76+vv+8vLz/uLi4/7W1tf+ysrL/r6+v/6ysrP+oqKj/pKSk/6CgoP+bm5v/l5eX/5KS + kv+NjY3/hoaG/4GBgf96enr/dXV1/3BwcP9nZ2f/V1dX/05OTv85OTn/NTU1/0NDQ/9XV1f/ZWVl/2dn + Z/9paWn/bGxs/29vb/8zMzP/JSUl/zQ0NP9AQED/Wlpa/4ODg/98fHz/nZ2d/+/v7//7+/v/t7e3/zc3 + N/8cHBz/KCgo/yUlJf8eHh7/ICAg/yMjI/8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8kJCT/IiIi/yAgIP8fHx//ICAg/yEhIf8hISH/ISEh/yEh + If8vLy//enp6/42Njf+cnJz/tra2/729vf/BwcH/xMTE/8fHx//Kysr/y8vLMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Nzc3/y8vL/8nJyf/Gxsb/xMTE/8HBwf+/v7//vLy8/7m5uf+1tbX/srKy/6+v + r/+srKz/qKio/6Wlpf+goKD/m5ub/5aWlv+SkpL/jY2N/4iIiP+BgYH/e3t7/3Z2dv9wcHD/a2tr/2Rk + ZP9ZWVn/UFBQ/zc3N/8yMjL/QUFB/1paWv9oaGj/aWlp/21tbf94eHj/jo6O/11dXf8oKCj/Jycn/zg4 + OP93d3f/gICA/5qamv/19fX//v7+/7m5uf86Ojr/Ghoa/ygoKP8mJib/HR0d/yAgIP8jIyP/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8hISH/ICAg/x8fH/8gICD/ISEh/ysrK/95eXn/jY2N/5ubm/+6urr/v7+//8PD + w//Gxsb/ycnJ/8zMzP/MzMwx////Af///wH///8B////AdPT0+PR0dH/z8/P/8zMzP/Kysr/x8fH/8XF + xf/Dw8P/wMDA/729vf+6urr/tra2/7Ozs/+wsLD/ra2t/6mpqf+mpqb/oaGh/52dnf+Xl5f/k5OT/46O + jv+JiYn/hISE/319ff93d3f/cnJy/2xsbP9nZ2f/YWFh/1tbW/9RUVH/Pj4+/zc3N/89PT3/W1tb/2lp + af9ra2v/d3d3/42Njf+goKD/bGxs/y4uLv8mJib/KSkp/01NTf+Li4v/5ubm//7+/v/a2tr/RUVF/xoa + Gv8lJSX/KCgo/x8fH/8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8lJSX/JiYm/yUlJf8hISH/Hh4e/x8f + H/8hISH/LCws/3p6ev+Ojo7/nZ2d/729vf/BwcH/xMTE/8bGxv/Jycn/zMzM/83NzTH///8B////Af// + /wH///8B0tLS49DQ0P/Ozs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/u7u7/7i4uP+0tLT/sbGx/62t + rf+qqqr/pqam/6Kiov+dnZ3/mZmZ/5SUlP+Pj4//ioqK/4WFhf9/f3//dnZ2/3Jycv9tbW3/aGho/2Rk + ZP9eXl7/XV1d/15eXv9eXl7/R0dH/zQ0NP9WVlb/bGxs/3R0dP+NjY3/oKCg/4CAgP9GRkb/Pj4+/ysr + K/8mJib/LCws/3Fxcf/b29v/0dHR/1hYWP8bGxv/JCQk/ykpKf8hISH/Hx8f/yMjI/8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yQkJP8iIiL/Hx8f/x8fH/8pKSn/d3d3/5CQkP+dnZ3/vr6+/8LC + wv/FxcX/yMjI/8vLy//Nzc3/zs7OMf///wH///8B////Af///wHR0dHjz8/P/8zMzP/Kysr/yMjI/8bG + xv/Dw8P/v7+//7y8vP+5ubn/tra2/7Kysv+vr6//q6ur/6enp/+jo6P/n5+f/5mZmf+VlZX/kJCQ/4qK + iv+FhYX/gICA/3Nzc/9cXFz/YmJi/2dnZ/9kZGT/YGBg/1xcXP9fX1//YmJi/2VlZf9ISEj/Kysr/1JS + Uv9zc3P/h4eH/56env+FhYX/S0tL/0xMTP9wcHD/VVVV/yoqKv8gICD/Ghoa/09PT/9nZ2f/ISEh/yMj + I/8oKCj/ICAg/yEhIf8kJCT/Jycn/yYmJv8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8kJCT/IiIi/y0tLf97e3v/kZGR/56env+/v7//xMTE/8fHx//Jycn/zMzM/87Ozv/Pz88x////Af// + /wH///8B////Ac/Pz+POzs7/y8vL/8nJyf/Gxsb/xMTE/8HBwf++vr7/urq6/7e3t/+0tLT/sLCw/6ys + rP+oqKj/pKSk/6CgoP+cnJz/lpaW/5GRkf+MjIz/hoaG/4GBgf91dXX/W1tb/0tLS/9KSkr/UlJS/15e + Xv9cXFz/XFxc/2FhYf9lZWX/Z2dn/0VFRf8pKSn/VlZW/4aGhv+dnZ3/kJCQ/1BQUP9GRkb/bm5u/4iI + iP91dXX/dHR0/yAgIP8LCwv/KSkp/2tra/8pKSn/JSUl/yAgIP8fHx//JCQk/ycnJ/8mJib/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8rKyv/WVlZ/42Njf+SkpL/np6e/8DA + wP/FxcX/yMjI/8vLy//Nzc3/z8/P/9DQ0DH///8B////Af///wH///8Bzs7O48zMzP/Kysr/x8fH/8XF + xf/CwsL/v7+//7u7u/+4uLj/tbW1/7Gxsf+urq7/qamp/6Wlpf+hoaH/nJyc/5iYmP+RkZH/jY2N/4aG + hv+AgID/enp6/2RkZP9PT0//SEhI/0NDQ/9ERET/V1dX/1lZWf9gYGD/ZWVl/2dnZ/9paWn/QUFB/yYm + Jv9jY2P/np6e/5OTk/9TU1P/RUVF/2tra/+IiIj/dnZ2/87Ozv/4+Pj/nJyc/x8fH/8eHh7/IiIi/xMT + E/8YGBj/Hh4e/yMjI/8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8lJSX/JiYm/0lJSf+EhIT/k5OT/5OTk/+kpKT/w8PD/8bGxv/Kysr/y8vL/87Ozv/Q0ND/0dHRMf// + /wH///8B////Af///wHNzc3jy8vL/8nJyf/Gxsb/xMTE/8DAwP+9vb3/urq6/7a2tv+zs7P/rq6u/6ur + q/+np6f/oqKi/56env+ZmZn/lJSU/42Njf+IiIj/gICA/3p6ev90dHT/YGBg/1FRUf9GRkb/Pz8//0JC + Qv9VVVX/Wlpa/2RkZP9mZmb/aWlp/2tra/89PT3/Hx8f/1tbW/+ampr/Xl5e/0JCQv9jY2P/hoaG/3p6 + ev+zs7P//Pz8//b29v+NjY3/Hx8f/x0dHf8VFRX/FBQU/x0dHf8gICD/IyMj/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQkJP8kJCT/Hx8f/zg4OP9+fn7/mZmZ/7W1 + tf/Gxsb/yMjI/8vLy//Nzc3/z8/P/9HR0f/S0tIx////Af///wH///8B////AczMzOPKysr/yMjI/8XF + xf/CwsL/vr6+/7u7u/+3t7f/s7Oz/7CwsP+srKz/qKio/6Ojo/+enp7/mZmZ/5SUlP+Pj4//iIiI/4KC + gv96enr/dHR0/25ubv9dXV3/VVVV/0RERP88PDz/Pj4+/1RUVP9gYGD/Z2dn/2lpaf9ra2v/bm5u/0FB + Qf8eHh7/MzMz/1VVVf9BQUH/Y2Nj/4WFhf95eXn/s7Oz//f39//z8/P/lJSU/yIiIv8cHBz/Jycn/x4e + Hv8bGxv/ICAg/yEhIf8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUl + Jf8jIyP/ISEh/w8PD/8CAgL/JSUl/4mJif+xsbH/w8PD/8fHx//Jycn/y8vL/83Nzf/Q0ND/0tLS/9LS + 0jH///8B////Af///wH///8BzMzM48nJyf/Gxsb/w8PD/8DAwP+8vLz/ubm5/7W1tf+xsbH/ra2t/6mp + qf+lpaX/oKCg/5ubm/+VlZX/kJCQ/4qKiv+Dg4P/fX19/3Z2dv9wcHD/a2tr/15eXv9YWFj/Q0ND/zg4 + OP88PDz/VFRU/2RkZP9paWn/a2tr/25ubv97e3v/Xl5e/x8fH/8hISH/NjY2/1hYWP+Dg4P/fHx8/6Gh + of/19fX//v7+/6enp/8wMDD/Ghoa/yYmJv8jIyP/Gxsb/x0dHf8hISH/IyMj/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JCQk/yMjI/8RERH/AwMD/yUlJf9vb2//r6+v/8HB + wf/FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PTMf///wH///8B////Af///wHLy8vjyMjI/8bG + xv/CwsL/v7+//7u7u/+3t7f/s7Oz/66urv+qqqr/pqam/6Kiov+cnJz/lpaW/5GRkf+Li4v/hYWF/35+ + fv94eHj/cnJy/21tbf9paWn/X19f/1tbW/9CQkL/Nzc3/zk5Of9TU1P/ZmZm/2tra/9ubm7/e3t7/5OT + k/+Hh4f/LCws/x8fH/8wMDD/YWFh/4GBgf+cnJz/7e3t//r6+v++vr7/MTEx/xoaGv8mJib/JSUl/x4e + Hv8fHx//ISEh/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yQk + JP8nJyf/FxcX/wMDA/8eHh7/e3t7/6Ghof+/v7//xMTE/8bGxv/IyMj/ysrK/83Nzf/Pz8//0dHR/9PT + 0//U1NQx////Af///wH///8B////AcrKyuPHx8f/xMTE/8DAwP+9vb3/ubm5/7W1tf+xsbH/rKys/6io + qP+ioqL/np6e/5iYmP+SkpL/jIyM/4aGhv+AgID/eHh4/3Nzc/9ubm7/ampq/2VlZf9fX1//Xl5e/1BQ + UP9JSUn/Nzc3/1BQUP9oaGj/bW1t/3h4eP+SkpL/oKCg/3R0dP8xMTH/Hx8f/yIiIv8zMzP/bGxs/+Xl + 5f/8/Pz/vLy8/0FBQf8ZGRn/JSUl/yQkJP8fHx//ICAg/yIiIv8kJCT/JCQk/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/IyMj/xcXF/8DAwP/Hh4e/29vb/+kpKT/vb29/8LC + wv/ExMT/x8fH/8nJyf/Ly8v/zs7O/9DQ0P/S0tL/1NTU/9XV1TH///8B////Af///wH///8ByMjI48bG + xv/Dw8P/v7+//7y8vP+3t7f/s7Oz/6+vr/+qqqr/pqam/6CgoP+bm5v/lJSU/46Ojv+IiIj/goKC/3V1 + df9ubm7/b29v/2xsbP9nZ2f/YmJi/19fX/9hYWH/Y2Nj/1lZWf8yMjL/Q0ND/2hoaP92dnb/jIyM/5+f + n/+AgID/RkZG/0RERP84ODj/HR0d/yEhIf83Nzf/kJCQ/8XFxf9MTEz/GRkZ/yQkJP8lJSX/HR0d/x8f + H/8iIiL/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/JSUl/ycn + J/8XFxf/BAQE/xEREf9mZmb/np6e/7u7u//CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/1tbWMf///wH///8B////Af///wHIyMjjxMTE/8HBwf+9vb3/urq6/7W1tf+xsbH/rKys/6en + p/+ioqL/m5ub/5aWlv+QkJD/ioqK/4ODg/90dHT/WFhY/09PT/9ZWVn/ZGRk/2RkZP9hYWH/YWFh/2Rk + ZP9nZ2f/W1tb/y4uLv88PDz/b29v/42Njf+hoaH/g4OD/0ZGRv9MTEz/dnZ2/3t7e/9BQUH/ISEh/w8P + D/8UFBT/QEBA/yEhIf8gICD/JiYm/x0dHf8fHx//IiIi/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8uLi7/QUFB/y0tLf8hISH/aWlp/6SkpP+7u7v/wcHB/8PD + w//FxcX/x8fH/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/X19cx////Af///wH///8B////AcbG + xuPExMT/wMDA/729vf+4uLj/s7Oz/6+vr/+pqan/pKSk/5+fn/+ZmZn/kpKS/4uLi/+FhYX/fHx8/2Fh + Yf9PT0//SEhI/0ZGRv9WVlb/YmJi/2BgYP9kZGT/ZmZm/2lpaf9aWlr/Kioq/0NDQ/+CgoL/oKCg/5GR + kf9KSkr/RkZG/29vb/+Ghob/e3t7/8DAwP95eXn/ExMT/xQUFP84ODj/ISEh/xwcHP8eHh7/Hh4e/yIi + Iv8kJCT/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8lJSX/Kioq/0RE + RP9WVlb/e3t7/4KCgv+vr6//u7u7/8DAwP/CwsL/xMTE/8bGxv/IyMj/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9jY2DH///8B////Af///wH///8BxsbG48PDw/+/v7//u7u7/7e3t/+xsbH/rKys/6am + pv+hoaH/nJyc/5WVlf+Ojo7/hoaG/4CAgP92dnb/WVlZ/1FRUf9FRUX/QkJC/1JSUv9gYGD/YmJi/2dn + Z/9paWn/a2tr/1ZWVv8lJSX/RkZG/5WVlf+RkZH/UlJS/0ZGRv9qamr/hYWF/319ff/Kysr//f39/9/f + 3/9CQkL/HBwc/xsbG/8SEhL/FhYW/xwcHP8iIiL/JSUl/yUlJf8lJSX/JSUl/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IyMj/yQkJP8nJyf/Kysr/zAwMP80NDT/NDQ0/zIyMv8uLi7/KSkp/yYmJv8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yYmJv8mJib/JSUl/yUlJf8qKir/PT09/1JSUv+IiIj/np6e/7u7u/+/v7//wcHB/8PD + w//FxcX/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/1NTU/9bW1v/Y2Nj/2dnZMf///wH///8B////Af// + /wHFxcXjwsLC/729vf+5ubn/tbW1/6+vr/+qqqr/pKSk/5+fn/+ZmZn/kZGR/4qKiv+CgoL/e3t7/3Nz + c/9bW1v/U1NT/0FBQf8/Pz//UVFR/2BgYP9mZmb/aWlp/2tra/9tbW3/WFhY/yMjI/81NTX/f39//1ZW + Vv9BQUH/ZmZm/4aGhv96enr/u7u7//n5+f/s7Oz/gICA/xwcHP8fHx//Gxsb/xQUFP8aGhr/ISEh/yYm + Jv8lJSX/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/ygoKP85OTn/WVlZ/3Fxcf+EhIT/lZWV/52d + nf+dnZ3/mJiY/46Ojv9+fn7/ampq/09PT/85OTn/JiYm/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yYmJv8mJib/JiYm/yUlJf8jIyP/Hh4e/wsL + C/8UFBT/WVlZ/5aWlv+zs7P/vr6+/8DAwP/Dw8P/xcXF/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT + 0//V1dX/19fX/9nZ2f/a2tox////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+0tLT/rq6u/6io + qP+ioqL/nJyc/5aWlv+Ojo7/hoaG/319ff93d3f/b29v/1xcXP9UVFT/PT09/zs7O/9PT0//Y2Nj/2lp + af9sbGz/bm5u/3Jycv9kZGT/JCQk/yEhIf86Ojr/QEBA/11dXf+FhYX/fn5+/7CwsP/5+fn/9vb2/4eH + h/8kJCT/HBwc/yYmJv8hISH/HR0d/yEhIf8mJib/JiYm/yUlJf8kJCT/IyMj/yMjI/8jIyP/JiYm/zIy + Mv9fX1//jY2N/6ysrP++vr7/xcXF/8nJyf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8nJyf/FxcX/vb29/6ur + q/99fX3/VFRU/zExMf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYm + Jv8mJib/JiYm/yUlJf8lJSX/IyMj/yMjI/8LCwv/BgYG/0FBQf+Li4v/srKy/729vf/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1dXV/9bW1v/Y2Nj/2tra/9ra2jH///8B////Af// + /wH///8BxMTE48DAwP+8vLz/t7e3/7Kysv+srKz/p6en/6Ghof+ampr/k5OT/4uLi/+Dg4P/enp6/3R0 + dP9tbW3/X19f/1VVVf86Ojr/ODg4/09PT/9lZWX/bGxs/25ubv9ycnL/goKC/4eHh/8yMjL/Hh4e/ysr + K/9OTk7/gICA/39/f/+qqqr/9vb2//Pz8/+ampr/Hh4e/xoaGv8lJSX/IiIi/x4eHv8iIiL/JiYm/yYm + Jv8lJSX/JCQk/yMjI/8jIyP/IyMj/zAwMP9nZ2f/o6Oj/8XFxf/Ly8v/y8vL/8vLy//Ly8v/y8vL/8vL + y//Ly8v/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/FxcX/m5ub/11dXf8uLi7/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yYmJv8mJib/JiYm/yYmJv8mJib/JSUl/yYmJv8jIyP/CwsL/wYG + Bv85OTn/kJCQ/7Kysv+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9TU + 1P/V1dX/19fX/9nZ2f/a2tr/29vbMf///wH///8B////Af///wHExMTjwMDA/7u7u/+2trb/sbGx/6ur + q/+mpqb/oKCg/5mZmf+SkpL/iYmJ/4GBgf95eXn/dHR0/25ubv9iYmL/VlZW/0JCQv88PDz/T09P/2dn + Z/9vb2//cXFx/319ff+Xl5f/oaGh/0tLS/8dHR3/IyMj/0BAQP9lZWX/nJyc//Dw8P/6+vr/rKys/zMz + M/8YGBj/JSUl/yEhIf8cHBz/ISEh/yYmJv8mJib/JSUl/yQkJP8jIyP/IyMj/yMjI/9AQED/jY2N/8DA + wP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ly8v/vLy8/4GBgf89PT3/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8mJib/JiYm/yUlJf8kJCT/Kysr/xISEv8CAgL/Ly8v/4WFhf+tra3/vLy8/7+/v//BwcH/w8PD/8bG + xv/Hx8f/ysrK/8vLy//Nzc3/z8/P/9HR0f/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//c3Nwx////Af// + /wH///8B////AcPDw+O/v7//u7u7/7W1tf+wsLD/qqqq/6Wlpf+enp7/l5eX/4yMjP+Hh4f/gYGB/3l5 + ef91dXX/b29v/2ZmZv9nZ2f/Z2dn/0lJSf9BQUH/ZWVl/3Jycv9/f3//lZWV/6Kiov91dXX/Ozs7/yws + LP8dHR3/JSUl/zg4OP+rq6v/7+/v/66urv8uLi7/GBgY/yUlJf8jIyP/HBwc/yAgIP8lJSX/JiYm/yUl + Jf8kJCT/IyMj/yMjI/8qKir/XV1d/7W1tf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/ysrK/7Cw + sP9nZ2f/KSkp/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUl + Jf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/ycnJ/8PDw//AQEB/zIy + Mv+Hh4f/rKys/729vf+/v7//wcHB/8PDw//FxcX/x8fH/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9TU + 1P/W1tb/19fX/9nZ2f/b29v/3Nzc/93d3TH///8B////Af///wH///8Bw8PD48DAwP+7u7v/tbW1/7Cw + sP+pqan/pKSk/52dnf+Li4v/bW1t/3Nzc/99fX3/e3t7/3h4eP9xcXH/aGho/2pqav9paWn/RUVF/zU1 + Nf9gYGD/e3t7/5OTk/+jo6P/fn5+/0VFRf9MTEz/ZGRk/zY2Nv8aGhr/HBwc/y4uLv9ycnL/Q0ND/xYW + Fv8iIiL/IyMj/xwcHP8fHx//IyMj/yUlJf8lJSX/JCQk/yQkJP8jIyP/KCgo/2lpaf+1tbX/zMzM/8zM + zP/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/7u7u/9mZmb/Kioq/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/yQkJP8pKSn/FxcX/wEBAf8dHR3/fX19/6ioqP+6urr/vr6+/8DAwP/Dw8P/xcXF/8bG + xv/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3d3dMf// + /wH///8B////Af///wHDw8Pjv7+//7q6uv+0tLT/r6+v/6mpqf+jo6P/lJSU/21tbf9aWlr/VVVV/19f + X/94eHj/eXl5/3Jycv9sbGz/bm5u/2xsbP9ERET/MzMz/2pqav+Pj4//oqKi/4aGhv9BQUH/SUlJ/3R0 + dP+BgYH/b29v/1BQUP8VFRX/DQ0N/zs7O/9DQ0P/HR0d/yQkJP8bGxv/HR0d/yIiIv8kJCT/JCQk/yQk + JP8kJCT/IyMj/yUlJf9kZGT/u7u7/8rKyv/Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Kysr/ysrK/8rK + yv/Kysr/ycnJ/7W1tf9dXV3/JSUl/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JSUl/yUlJf8lJSX/JSUl/yUlJf8lJSX/JSUl/yQkJP8lJSX/MzMz/0tLS/9TU1P/SUlJ/4GB + gf+rq6v/urq6/76+vv/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zs7O/8/Pz//R0dH/09PT/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/e3t4x////Af///wH///8B////AcPDw+O/v7//urq6/7W1 + tf+vr6//qamp/6Ojo/+Hh4f/Y2Nj/1dXV/9NTU3/UlJS/3h4eP96enr/cXFx/3BwcP9xcXH/bm5u/z8/ + P/8xMTH/eXl5/6Ghof+Hh4f/SkpK/0ZGRv9ubm7/g4OD/4KCgv/R0dH/3d3d/2hoaP8SEhL/IyMj/x0d + Hf8UFBT/GBgY/xwcHP8gICD/IiIi/yQkJP8kJCT/JCQk/yQkJP8jIyP/Q0ND/6+vr//Kysr/ysrK/8vL + y//Ly8v/y8vL/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/y8vL/8vLy//Ly8v/y8vL/8rKyv/Kysr/ysrK/8rKyv/Kysr/ycnJ/7Gxsf9DQ0P/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JSUl/yUl + Jf8lJSX/JSUl/y0tLf9ERET/U1NT/3Nzc/+Kior/rq6u/7u7u/+9vb3/v7+//8LCwv/ExMT/xsbG/8jI + yP/Kysr/y8vL/83Nzf/Pz8//0dHR/9LS0v/U1NT/1dXV/9fX1//Y2Nj/2tra/9vb2//d3d3/3t7e/9/f + 3zH///8B////Af///wH///8BxMTE48DAwP+7u7v/tra2/7CwsP+pqan/o6Oj/4WFhf9nZ2f/VVVV/0hI + SP9PT0//enp6/3l5ef9zc3P/c3Nz/3R0dP9ubm7/Ozs7/ywsLP95eXn/k5OT/01NTf9CQkL/bGxs/4eH + h/97e3v/ycnJ//v7+//d3d3/X19f/xcXF/8YGBj/EhIS/xYWFv8bGxv/ICAg/yIiIv8jIyP/JCQk/yQk + JP8kJCT/JCQk/zAwMP+Hh4f/yMjI/8vLy//Ly8v/y8vL/8vLy//Ly8v/zMzM/8zMzP/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vLy//Ly8v/ysrK/8rK + yv/Kysr/ysrK/8rKyv/Kysr/ycnJ/4qKiv8uLi7/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8mJib/HR0d/x8fH/9FRUX/enp6/56e + nv+3t7f/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8vLy//Nzc3/zs7O/9DQ0P/S0tL/1NTU/9XV + 1f/W1tb/2NjY/9nZ2f/b29v/3Nzc/93d3f/f39//39/fMf///wH///8B////Af///wHExMTjwcHB/7y8 + vP+2trb/sbGx/6mpqf+jo6P/iIiI/2tra/9TU1P/RERE/0xMTP95eXn/d3d3/3V1df92dnb/d3d3/3Nz + c/8+Pj7/JCQk/0xMTP9RUVH/QUFB/2VlZf+Hh4f/eXl5/8fHx//+/v7/6Ojo/2RkZP8aGhr/Hh4e/yQk + JP8bGxv/HBwc/yEhIf8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/XFxc/76+vv/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Kysr/ysrK/8rKyv/Kysr/ysrK/8vLy//Ly8v/vLy8/1dX + V/8lJSX/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8jIyP/IiIi/xkZGf8EBAT/ExMT/21tbf+goKD/uLi4/7y8vP++vr7/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Kysr/zc3N/87Ozv/Q0ND/0dHR/9PT0//V1dX/1tbW/9jY2P/Z2dn/2tra/9vb2//d3d3/3t7e/9/f + 3//g4OAx////Af///wH///8B////AcTExOPBwcH/vb29/7i4uP+ysrL/q6ur/6SkpP+Hh4f/bm5u/1BQ + UP9CQkL/TU1N/3t7e/93d3f/eHh4/3h4eP97e3v/g4OD/01NTf8iIiL/MDAw/0RERP9gYGD/hYWF/3V1 + df+vr6//+Pj4//Hx8f+IiIj/Hh4e/xwcHP8lJSX/Hx8f/x0dHf8gICD/IiIi/yMjI/8kJCT/JCQk/yQk + JP8kJCT/JCQk/yUlJf+SkpL/zMzM/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zs7O/87Ozv/Ozs7/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/Jycn/hoaG/ywsLP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8lJSX/JCQk/yMjI/8bGxv/BAQE/wcHB/9RUVH/mZmZ/7S0 + tP+8vLz/vr6+/8DAwP/Dw8P/xcXF/8fHx//IyMj/ysrK/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9bW + 1v/X19f/2NjY/9ra2v/b29v/3d3d/97e3v/f39//4ODg/+Hh4TH///8B////Af///wH///8BxMTE48LC + wv++vr7/uLi4/7Ozs/+tra3/pqam/4iIiP9xcXH/T09P/0JCQv9LS0v/e3t7/3p6ev96enr/fX19/4iI + iP+enp7/eXl5/yUlJf8sLCz/Wlpa/3x8fP92dnb/srKy//j4+P/w8PD/ioqK/yIiIv8bGxv/JSUl/x8f + H/8cHBz/ICAg/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MjIy/7q6uv/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zc3N/83N + zf/Nzc3/zc3N/8zMzP/MzMz/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8zMzP/MzMz/zMzM/83N + zf+urq7/OTk5/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JSUl/yUlJf8lJSX/JSUl/yQk + JP8iIiL/Gxsb/wYGBv8ODg7/UVFR/5mZmf+1tbX/u7u7/76+vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8rK + yv/MzMz/zs7O/9DQ0P/R0dH/09PT/9TU1P/V1dX/2NjY/9nZ2f/a2tr/29vb/9zc3P/e3t7/39/f/+Dg + 4P/h4eH/4eHhMf///wH///8B////Af///wHExMTjwsLC/76+vv+6urr/tbW1/66urv+oqKj/ioqK/3d3 + d/9oaGj/Xl5e/05OTv94eHj/fX19/35+fv+IiIj/mpqa/5+fn/9kZGT/KCgo/yAgIP9KSkr/aWlp/5WV + lf/29vb/+vr6/56env8oKCj/GRkZ/yUlJf8hISH/HBwc/yAgIP8iIiL/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP9LS0v/ysrK/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zM + zP/Ly8v/y8vL/8vLy//MzMz/zMzM/83Nzf/Nzc3/zc3N/8HBwf9OTk7/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yUlJf8kJCT/JSUl/x8fH/8HBwf/BgYG/05OTv+Pj4//r6+v/7u7 + u/+9vb3/wMDA/8LCwv/ExMT/xsbG/8jIyP/Kysr/zMzM/87Ozv/Pz8//0dHR/9PT0//U1NT/1dXV/9fX + 1//Y2Nj/2tra/9vb2//d3d3/3d3d/97e3v/g4OD/4eHh/+Li4v/i4uIx////Af///wH///8B////AcTE + xOPCwsL/v7+//7u7u/+3t7f/sbGx/6qqqv+Kior/e3t7/3x8fP9sbGz/Pj4+/1lZWf9+fn7/iIiI/5ub + m/+jo6P/bm5u/z8/P/9GRkb/MTEx/yYmJv9JSUn/YGBg/7Gxsf+qqqr/Ly8v/xgYGP8kJCT/IiIi/x0d + Hf8fHx//IiIi/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/2BgYP/MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87O + zv/Ozs7/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zc3N/83N + zf/Nzc3/ysrK/11dXf8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8lJSX/JCQk/yQk + JP8fHx//CQkJ/wcHB/9FRUX/kJCQ/62trf+6urr/vLy8/7+/v//BwcH/xMTE/8bGxv/IyMj/ysrK/8zM + zP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9ra2v/b29v/3Nzc/93d3f/e3t7/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4zH///8B////Af///wH///8BxcXF48LCwv+/v7//vLy8/7i4uP+zs7P/qqqq/4iI + iP9+fn7/fn5+/2lpaf83Nzf/VlZW/4aGhv+YmJj/oaGh/3x8fP8+Pj7/TU1N/3h4eP9oaGj/NjY2/xkZ + Gf8TExP/IyMj/z4+Pv8eHh7/IiIi/yQkJP8cHBz/Hh4e/yIiIv8jIyP/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/aGho/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Ozs7/zs7O/87Ozv/Ozs7/zs7O/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/Nzc3/zc3N/83Nzf/Nzc3/a2tr/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8lJSX/JSUl/yQkJP8mJib/NjY2/y0tLf8aGhr/Q0ND/5GRkf+urq7/ubm5/7y8 + vP+/v7//wcHB/8PDw//FxcX/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/09PT/9TU1P/V1dX/19fX/9jY + 2P/Z2dn/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTkMf///wH///8B////Af// + /wHFxcXjwsLC/7+/v/+8vLz/uLi4/7S0tP+jo6P/hISE/4CAgP+AgID/aWlp/zY2Nv9cXFz/l5eX/6Oj + o/+AgID/RUVF/0lJSf9ycnL/g4OD/4ODg/+1tbX/S0tL/w4ODv8iIiL/Ozs7/x8fH/8eHh7/Hh4e/x4e + Hv8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP9hYWH/zMzM/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zc3N/8vLy/9qamr/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yUlJf8kJCT/JCQk/zQ0 + NP9MTEz/X19f/2pqav+SkpL/s7Oz/7m5uf+7u7v/vr6+/8DAwP/Dw8P/xcXF/8fHx//Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Tk5P/k5OQx////Af///wH///8B////AcbGxuPDw8P/wMDA/7y8vP+5ubn/sbGx/5KS + kv+CgoL/goKC/4GBgf9lZWX/NDQ0/1xcXP+ioqL/iIiI/0VFRf9ERET/dHR0/4SEhP+BgYH/3t7e//z8 + /P+wsLD/Li4u/ycnJ/8bGxv/FBQU/xoaGv8gICD/JSUl/yYmJv8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/1FRUf/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/x8fH/1xcXP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/LS0t/0RERP9oaGj/hoaG/6+vr/+5ubn/vLy8/76+ + vv/AwMD/wsLC/8TExP/Hx8f/ycnJ/8vLy//Nzc3/z8/P/9DQ0P/S0tL/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+Xl5TH///8B////Af// + /wH///8BxsbG48TExP/BwcH/vb29/7q6uv+np6f/h4eH/4ODg/+Dg4P/g4OD/2VlZf8zMzP/Q0ND/4CA + gP9MTEz/QkJC/2hoaP+Hh4f/enp6/9DQ0P/9/f3/4ODg/1VVVf8ZGRn/Hx8f/xkZGf8WFhb/Hh4e/yUl + Jf8mJib/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Ojo6/8HB + wf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zM + zP/MzMz/zMzM/8zMzP+8vLz/R0dH/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8iIiL/IiIi/xAQ + EP8GBgb/NjY2/4GBgf+hoaH/ubm5/7u7u/++vr7/wMDA/8LCwv/ExMT/xsbG/8nJyf/Ly8v/zc3N/8/P + z//Q0ND/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Xl5f/l5eX/5ubmMf///wH///8B////Af///wHHx8fjxMTE/8HBwf++vr7/u7u7/5iY + mP+EhIT/hYWF/4WFhf+IiIj/dnZ2/zc3N/8sLCz/RUVF/0NDQ/9paWn/hYWF/319ff/IyMj/+/v7/+Dg + 4P9lZWX/FhYW/x0dHf8kJCT/Hh4e/x8fH/8jIyP/JSUl/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8mJib/n5+f/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/ysrK/5ycnP8yMjL/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/IiIi/yEhIf8TExP/AwMD/yoqKv+BgYH/qamp/7i4uP+8vLz/vr6+/8DA + wP/CwsL/xMTE/8fHx//Jycn/y8vL/83Nzf/Pz8//0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9vb + 2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5uYx////Af// + /wH///8B////AcjIyOPFxcX/wsLC/7+/v/+8vLz/k5OT/4WFhf+Ghob/iIiI/5KSkv+Ojo7/QkJC/yoq + Kv9eXl7/cHBw/4ODg/93d3f/vr6+//n5+f/n5+f/dHR0/xwcHP8cHBz/JSUl/x4eHv8fHx//JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP9wcHD/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/MzMz/zMzM/8zMzP/Ly8v/y8vL/8vL + y//Ly8v/y8vL/8vLy//FxcX/eHh4/ykpKf8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8hISH/ExMT/wMD + A/8bGxv/dHR0/6Wlpf+4uLj/vLy8/76+vv/AwMD/wsLC/8TExP/Gxsb/ycnJ/8vLy//Nzc3/z8/P/9DQ + 0P/S0tL/09PT/9XV1f/X19f/2NjY/9nZ2f/a2tr/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj + 4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5zH///8B////Af///wH///8ByMjI48bGxv/ExMT/wcHB/729 + vf+SkpL/hoaG/4iIiP+RkZH/oKCg/5eXl/9HR0f/JSUl/1JSUv+Li4v/gICA/66urv/6+vr/8fHx/3x8 + fP8eHh7/Gxsb/yUlJf8fHx//Hh4e/yIiIv8kJCT/JCQk/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/z4+Pv+np6f/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/7CwsP9JSUn/JCQk/yQk + JP8kJCT/JCQk/yQkJP8jIyP/IyMj/xgYGP8EBAT/ExMT/2dnZ/+ampr/tra2/7y8vP++vr7/wMDA/8LC + wv/ExMT/xsbG/8nJyf/Ly8v/zMzM/8/Pz//Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/5+fnMf// + /wH///8B////Af///wHJycnjx8fH/8XFxf/CwsL/vr6+/5KSkv+JiYn/kZGR/6CgoP+fn5//Y2Nj/zo6 + Ov8sLCz/Kioq/21tbf+QkJD/w8PD/+zs7P+RkZH/Hh4e/xoaGv8kJCT/ICAg/x0dHf8gICD/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/KCgo/2dnZ//CwsL/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/zMzM/8vL + y//Ly8v/y8vL/8vLy//Gxsb/ZmZm/ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8XFxf/BAQE/xkZ + Gf9oaGj/np6e/7S0tP+8vLz/vr6+/8DAwP/CwsL/xMTE/8fHx//IyMj/y8vL/8zMzP/Ozs7/0NDQ/9LS + 0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Ogx////Af///wH///8B////AcrKyuPIyMj/xsbG/8PD + w/+/v7//kpKS/5CQkP+dnZ3/o6Oj/3R0dP88PDz/Tk5O/2FhYf8vLy//LCws/z4+Pv8+Pj7/cHBw/zAw + MP8ZGRn/IyMj/yEhIf8dHR3/ICAg/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/Li4u/5OTk//MzMz/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zMzM/8zMzP/MzMz/y8vL/8vLy//Ly8v/ycnJ/56env8xMTH/JCQk/yQk + JP8kJCT/IyMj/yMjI/8mJib/ISEh/wcHB/8KCgr/YWFh/5mZmf+2trb/vLy8/76+vv/AwMD/wsLC/8TE + xP/Gxsb/yMjI/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/29vb/9zc + 3P/e3t7/39/f/+Dg4P/h4eH/4eHh/+Pj4//j4+P/5OTk/+Xl5f/l5eX/5ubm/+fn5//o6Oj/6Ojo/+np + 6TH///8B////Af///wH///8By8vL48nJyf/Hx8f/xcXF/7+/v/+YmJj/np6e/6Ojo/9ycnL/PT09/1JS + Uv96enr/fX19/3p6ev9RUVH/ERER/xISEv9MTEz/Pz8//yEhIf8iIiL/Hx8f/x8fH/8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/Nzc3/5WVlf/IyMj/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zM + zP/MzMz/y8vL/8rKyv+dnZ3/QEBA/yQkJP8kJCT/JCQk/yQkJP8jIyP/KSkp/0FBQf9RUVH/U1NT/2lp + af+qqqr/tra2/729vf+/v7//wcHB/8PDw//ExMT/x8fH/8jIyP/Kysr/zMzM/87Ozv/Q0ND/0tLS/9PT + 0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Li4v/i4uL/5OTk/+Tk + 5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+np6f/p6en/6enpMf///wH///8B////Af///wHMzMzjysrK/8jI + yP/Gxsb/wcHB/6Ojo/+mpqb/fX19/0FBQf9HR0f/dnZ2/4GBgf+Ghob/4eHh/9PT0/9MTEz/KSkp/zMz + M/8gICD/Ghoa/xwcHP8gICD/ISEh/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8lJSX/QEBA/5aW + lv/Ly8v/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/MzMz/zMzM/8zMzP/Kysr/qamp/0lJSf8mJib/JCQk/yQk + JP8kJCT/IyMj/yQkJP8zMzP/SkpK/1tbW/94eHj/mJiY/7q6uv+8vLz/v7+//8HBwf/Dw8P/xcXF/8bG + xv/IyMj/ysrK/8zMzP/Ozs7/0NDQ/9LS0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/3Nzc/93d + 3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq + 6v/q6uox////Af///wH///8B////Ac3NzePLy8v/ycnJ/8fHx//ExMT/rKys/4SEhP9ERET/R0dH/29v + b/+CgoL/hYWF/+Li4v/7+/v/wMDA/zY2Nv8eHh7/HR0d/xISEv8ZGRn/Hh4e/yEhIf8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/MzMz/4KCgv+6urr/zMzM/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zM + zP/MzMz/v7+//4qKiv9AQED/JSUl/yQkJP8kJCT/JCQk/yMjI/8iIiL/ICAg/xISEv8nJyf/YWFh/42N + jf+ysrL/vb29/7+/v//BwcH/w8PD/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ0P/S0tL/09PT/9TU + 1P/W1tb/19fX/9nZ2f/a2tr/29vb/93d3f/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6zH///8B////Af///wH///8Bz8/P483N + zf/Kysr/yMjI/8bGxv+jo6P/SkpK/0NDQ/9sbGz/goKC/35+fv/R0dH/+/v7/8zMzP9KSkr/ExMT/x0d + Hf8hISH/GRkZ/x4eHv8hISH/IiIi/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yQiIf8iIiL/IiIi/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/LCws/1dXV/+jo6P/xsbG/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83N + zf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/x8fH/6mpqf9kZGT/Ly8v/yQkJP8kJCT/JCQk/yQk + JP8jIyP/IiIi/x4eHv8LCwv/BwcH/0BAQP+QkJD/sbGx/729vf/AwMD/wcHB/8PDw//FxcX/x8fH/8nJ + yf/Ly8v/zMzM/87Ozv/Q0ND/0tLS/9PT0//U1NT/1tbW/9fX1//Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq + 6v/r6+v/6+vrMf///wH///8B////Af///wHPz8/jzs7O/8zMzP/Kysr/yMjI/7e3t/9vb2//aGho/4OD + g/94eHj/y8vL//v7+//T09P/VFRU/xcXF/8dHR3/IyMj/xwcHP8dHR3/ISEh/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv86Ih7/ciQW/0AhHP8jISH/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JiYm/zo6Ov9oaGj/o6Oj/8HB + wf/Jycn/zMzM/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/83Nzf/Nzc3/zc3N/8zMzP/Jycn/xMTE/62t + rf9wcHD/Pz8//ycnJ/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8gICD/DAwM/wMDA/89PT3/h4eH/7Cw + sP+9vb3/v7+//8LCwv/ExMT/xsbG/8fHx//Jycn/y8vL/83Nzf/Pz8//0NDQ/9LS0v/T09P/1NTU/9bW + 1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Xl + 5f/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Owx////Af///wH///8B////AdHR + 0ePPz8//zc3N/8vLy//Jycn/x8fH/7W1tf+SkpL/e3t7/76+vv/+/v7/5OTk/1paWv8UFBT/HBwc/yQk + JP8bGxv/HBwc/yEhIf8kJCT/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/NSIe/5EnFP/CLBH/ZCUa/yYi + If8iIiL/IiIi/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8tLS3/TU1N/3Z2dv+goKD/rq6u/7q6uv/BwcH/yMjI/8nJ + yf/Hx8f/xcXF/729vf+urq7/m5ub/3p6ev9VVVX/MzMz/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMj + I/8iIiL/ICAg/w4ODv8CAgL/Kioq/42Njf+tra3/vb29/8DAwP/CwsL/xMTE/8bGxv/IyMj/ysrK/8vL + y//Nzc3/z8/P/9DQ0P/S0tL/09PT/9TU1P/W1tb/19fX/9nZ2f/a2tr/3Nzc/93d3f/d3d3/3t7e/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+np6f/p6en/6urq/+vr + 6//r6+v/7Ozs/+zs7DH///8B////Af///wH///8B0tLS49DQ0P/Ozs7/zMzM/8vLy//Jycn/xsbG/7Ky + sv+xsbH/9PT0/+np6f98fHz/GRkZ/xkZGf8jIyP/Hx8f/xwcHP8hISH/JSUl/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/ykhIP9/JRX/xCwR/4UoGP8qIiH/IiIi/yIiIv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQk + JP8kJCT/KCgo/zY2Nv9AQED/TExM/1lZWf9qamr/bW1t/2hoaP9iYmL/UVFR/0FBQf8zMzP/KCgo/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yEhIf8QEBD/AgIC/yAgIP90dHT/qqqq/7y8 + vP/AwMD/wsLC/8TExP/Gxsb/yMjI/8rKyv/MzMz/zc3N/8/Pz//R0dH/0tLS/9PT0//U1NT/1tbW/9fX + 1//Z2dn/2tra/9zc3P/c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4uLi/+Pj4//k5OT/5eXl/+bm + 5v/m5ub/5+fn/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7OzsMf///wH///8B////Af// + /wHU1NTj0tLS/9DQ0P/Ozs7/zMzM/8rKyv/IyMj/wsLC/5GRkf+kpKT/cHBw/xsbG/8ZGRn/IiIi/x8f + H/8eHh7/IyMj/yYmJv8lJSX/IyMj/yIiIv8iIiL/IiIi/yIiIv8sIR//eSYX/8UtEf+CKBj/LiIg/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yQiIv8jIyP/IyMj/yMjI/8jIiL/LCIh/0sjHP9vJRj/NSIf/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8kJCT/IyMj/yQk + JP8nJyf/ERER/wICAv8lJSX/fX19/6ampv++vr7/wcHB/8PDw//ExMT/xsbG/8jIyP/Kysr/zMzM/83N + zf/Pz8//0dHR/9PT0//U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3d3d/93d3f/e3t7/39/f/+Dg + 4P/h4eH/4uLi/+Pj4//j4+P/5OTk/+Xl5f/m5ub/5+fn/+fn5//o6Oj/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+3t7f/t7e0x////Af///wH///8B////AdXV1ePT09P/0dHR/8/Pz//Nzc3/zMzM/8rK + yv/BwcH/aGho/zs7O/9DQ0P/ISEh/yIiIv8eHh7/HR0d/yIiIv8mJib/JSUl/yMjI/8iIiL/IiIi/yIi + Iv8hISH/JCEh/3QlF//DLBD/tSsS/z4iHf8iISH/IiIi/yIiIv8iIiL/IiEh/yohH/9JIhz/YiIX/zch + Hf8kIiL/JiIh/0ciG/9+Jhb/jCgW/7csE/9GJB7/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8kJCT/JCQk/yQkJP8kJCT/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/Li4u/z4+Pv8sLCz/Kysr/35+fv+qqqr/vLy8/8HB + wf/Dw8P/xcXF/8bGxv/IyMj/ysrK/8zMzP/Nzc3/z8/P/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ + 2f/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+bm + 5v/n5+f/6Ojo/+jo6P/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7jH///8B////Af// + /wH///8B1dXV49TU1P/T09P/0dHR/8/Pz//Nzc3/y8vL/8LCwv9vb2//U1NT/0dHR/8tLS3/JiYm/x4e + Hv8iIiL/JSUl/yUlJf8jIyP/IyMj/yIiIv8hISH/ISEh/yYgIP9fIxj/xSwR/7QsE/+7KxL/lycT/1Ui + GP80IR7/OSEc/0ohGv9tIxb/nygT/7wrEv+6LBL/hiYV/1MiGf98Jhb/kSgV/2QmG/9YJhz/nisW/ywj + If8jIiL/MyIf/z8iHf8vIiD/IyIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yQkJP8kJCT/JCQk/yQkJP8jIyP/IyMj/yYm + Jv9DQ0P/UVFR/2xsbP9/f3//s7Oz/7+/v//BwcH/xMTE/8XFxf/Hx8f/ycnJ/8rKyv/MzMz/zs7O/9DQ + 0P/R0dH/09PT/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr + 6//s7Oz/7Ozs/+3t7f/u7u7/7u7uMf///wH///8B////Af///wHX19fj1dXV/9TU1P/S0tL/0NDQ/8/P + z//Nzc3/xcXF/35+fv9PT0//MDAw/ywsLP8mJib/ISEh/yQkJP8lJSX/IyMj/yMjI/8iIiL/IiIi/yEh + If8jICD/YiMZ/7srEf+fKhX/QSMd/1QkHP+eKhX/vCoQ/64pEf+sKBH/tioR/7ErE/+ZKhb/dCca/1Ml + HP98JRb/mCgU/3EnGv85JCD/JiMi/2smGv95KBn/IyMi/zQjIP+PJxT/hicW/3AkFv84Ix//IyIi/yMj + Iv8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQk + JP8kJCT/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/Hh4e/zIyMv9PT0//e3t7/5ycnP+9vb3/w8PD/8TE + xP/Gxsb/yMjI/8nJyf/Ly8v/zc3N/87Ozv/Q0ND/0dHR/9PT0//U1NT/1dXV/9fX1//Y2Nj/2dnZ/9ra + 2v/c3Nz/3Nzc/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/q6ur/6urq/+vr6//r6+v/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u4x////Af// + /wH///8B////AdjY2OPX19f/1dXV/9PT0//S0tL/0NDQ/8/Pz//IyMj/gYGB/zc3N/8sLCz/KCgo/yEh + If8hISH/IyMj/yQkJP8jIyP/IiIi/yIiIv8hISH/ISEh/1EjG/+7KxH/tisS/0QjHf8iISD/IiEg/zUi + Hv9rJhn/tysS/7YqEf9eJBr/PiMe/y8iIP8lIiH/JCIh/0wkHf9DJB7/KCMi/yIiIv8qIiH/hSgX/1Ym + Hf8nIiH/QyQe/5YpFf9IIxz/TyUd/4gnFv9aJBn/JSIi/yMiIv8jIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/JCQk/yQkJP8kJCT/JCQk/yMjI/8jIyP/IyMj/xoa + Gv8GBgb/FxcX/2RkZP+enp7/u7u7/8PDw//FxcX/x8fH/8jIyP/Kysr/zMzM/87Ozv/Pz8//0NDQ/9LS + 0v/T09P/1dXV/9bW1v/X19f/2NjY/9ra2v/a2tr/3Nzc/9zc3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Li + 4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+bm5v/n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/r6+v/6+vr/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7jH///8B////Af///wH///8B2tra49jY2P/W1tb/1NTU/9PT + 0//S0tL/0NDQ/8XFxf9kZGT/LS0t/ygoKP8iIiL/IiIi/yMjI/8kJCT/IyMj/yMjI/8iIiL/IiIi/yEh + If8oISD/gCcX/8ctEf+gKBP/QSEb/yYgH/8gICD/ICAg/yAgH/9MIxz/tisS/34mFv8mISD/ISEh/yYh + IP83IR3/RSIb/0MiHP8zIR7/IyEh/0IkHv+ZKRX/OyMf/1ckG/9zJRf/WSUc/4MmFf9uJBf/pSoU/1Yl + HP9EIx3/SyMc/zMiH/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yIiIv8ZGRn/BQUF/wwMDP9bW1v/oaGh/7+/v//FxcX/xsbG/8jI + yP/Jycn/y8vL/8zMzP/Ozs7/0NDQ/9HR0f/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/n5+f/5+fn/+jo + 6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7e3t/+3t7f/u7u7/7u7u/+7u7v/v7+//7+/vMf// + /wH///8B////Af///wHa2trj2dnZ/9fX1//W1tb/1NTU/9PT0//S0tL/w8PD/1dXV/8sLCz/IyMj/yEh + If8jIyP/JCQk/yQkJP8jIyP/IyMj/yIiIv8iIiL/IiIi/yEhIf8zIh//aiYa/64qE/+uKRH/bSMW/y0f + Hf8gICD/ICAg/zshHf+tKhL/oioU/y0hH/8rIB7/bCMW/6QpEv+0KhH/rykR/5onEv9aIhj/WiQa/3cn + Gf8pIiH/SSQd/40nFP9YIhn/fiYW/6YqFP9dJRv/WSQa/5goFf+JKBb/gCYW/zUiHv8kIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yQkJP8kJCT/JCQk/yMjI/8iIiL/HBwc/wcH + B/8GBgb/SkpK/5ycnP+9vb3/xcXF/8fHx//Jycn/ysrK/8zMzP/Nzc3/zs7O/9DQ0P/S0tL/09PT/9XV + 1f/W1tb/19fX/9nZ2f/Z2dn/2tra/9vb2//d3d3/3d3d/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+vr6//r6+v/7Ozs/+zs + 7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//w8PAx////Af///wH///8B////Advb2+Pa2tr/2dnZ/9fX + 1//W1tb/1NTU/9PT0//CwsL/UFBQ/yQkJP8hISH/IyMj/yQkJP8kJCT/JCQk/yMjI/8jIyP/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8iISD/OSIe/3wnGP+zKhL/nycR/2YiFv9WIRf/kCUS/8UsEf93Jxn/MSEe/4Ul + FP+5KxL/gygX/0wkHf9FIx3/dicY/68qEv98JRb/KiIg/yIiIf8kIiH/QyMe/38nGP+NKRb/XCYb/1wk + Gv+dKRT/SyUe/ykjIv98KBn/licU/z0iHv8tIiD/JSIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/JCQk/yMjI/8jIyP/JCQk/yEhIf8JCQn/CQkJ/0hISP+YmJj/wMDA/8fHx//IyMj/ycnJ/8vL + y//MzMz/zs7O/8/Pz//R0dH/0tLS/9TU1P/V1dX/19fX/9jY2P/Z2dn/2tra/9vb2//c3Nz/3d3d/97e + 3v/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8DH///8B////Af///wH///8B3d3d49zc3P/a2tr/2dnZ/9fX1//W1tb/1NTU/8DAwP9GRkb/IiIi/yMj + I/8kJCT/JCQk/yQkJP8kJCT/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/JyEg/04j + HP+QKBX/tioR/70rEP+3KxL/gygX/zsiHv9tJRj/viwR/3AmGf8rISD/ISEh/yEhIf8nISD/dicY/7Eq + Ev88Ih7/IiIi/yIiIv8iIiL/JiIh/ykiIf82Ih7/likV/10mHP8kIiL/OCIe/5UpFv9pJxv/RCMe/3Ym + F/8xIyD/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8kJCT/IyMj/yMjI/8jIyP/CgoK/wQE + BP9AQED/kpKS/7u7u//IyMj/ycnJ/8vLy//MzMz/zs7O/8/Pz//Q0ND/0dHR/9PT0//U1NT/1tbW/9fX + 1//Y2Nj/2tra/9vb2//c3Nz/3Nzc/97e3v/e3t7/39/f/+Dg4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDwMf///wH///8B////Af///wHe3t7j3d3d/9zc + 3P/a2tr/2dnZ/9fX1//W1tb/y8vL/2hoaP8sLCz/IyMj/yMjI/8kJCT/JCQk/yMjI/8jIyP/IyMj/yMj + I/8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEg/ywhH/9BIx3/TyQc/0AjHv8pISD/NCIe/6Iq + FP+cKRX/KyEf/yEhIf8hISH/ISEh/yQhIP9sJRj/vSsR/0sjHf8hISH/MCEf/0QiHP8oISD/IiIi/yci + If9CJB7/JyIh/zciH/+IJxX/cica/0YkHf+RKBX/YiYc/zoiHv9kJBn/RyMd/yUiIv8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/MTEx/x8fH/8NDQ3/Pz8//5WVlf+5ubn/ycnJ/8vLy//MzMz/zc3N/8/P + z//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3Nzc/93d3f/e3t7/39/f/+Dg + 4P/g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6enp/+np + 6f/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7u7u/+/v7//v7+//8PDw//Dw + 8P/x8fEx////Af///wH///8B////Ad/f3+Pe3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/xMTE/4yM + jP89PT3/JiYm/yMjI/8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yEhIf8hISH/ISEh/yEhIf8zIh//oioU/5AoFf8jICD/ISEh/yEhIf8gICD/OiEc/6Ao + Ev+rKhP/MiIf/ysgHv+EJhX/rikR/0QjHf8iIiL/IiIi/yIiIv8iIiL/TiMc/24nGv9CIx7/kikW/3co + Gf89Ix7/hicX/4EpGf9iJhv/KiMi/yMjI/8jIyP/IyMj/yMjI/8iIiL/JCQk/zg4OP9SUlL/XV1d/2Ji + Yv+ZmZn/xMTE/8zMzP/MzMz/zs7O/8/Pz//Q0ND/0dHR/9LS0v/U1NT/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/b29v/3Nzc/93d3f/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx8TH///8B////Af///wH///8B4ODg49/f + 3//e3t7/3d3d/9zc3P/a2tr/2dnZ/9jY2P/X19f/0tLS/6qqqv9kZGT/Kysr/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/yYh + IP9zJxn/sCoS/1QhGP8oIB7/IyAf/zcgG/+MJRP/visR/2YlGf8oIB//aSMX/78rEf+CKBj/LCIg/yIi + Iv8iIiH/IyIh/yIhIf8oIiH/NyIe/4AmFv99KBj/PSId/4EnFv95KBn/LSMi/yYjIv8jIyL/IyMj/yMj + I/8jIyP/IiIi/yIiIv8lJSX/OTk5/1NTU/9nZ2f/hYWF/7m5uf/Nzc3/zs7O/8/Pz//Q0ND/0dHR/9LS + 0v/T09P/1NTU/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3t7e/9/f3//g4OD/4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v7//w8PD/8PDw//Hx + 8f/x8fH/8fHxMf///wH///8B////Af///wHh4eHj4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ + 2f/Y2Nj/19fX/9TU1P+goKD/XFxc/y8vL/8iIiL/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/ykhIP9yJhj/qikS/54mEf+WJRH/rSgR/6sq + E/9kJRr/LyEe/3EkFv+/KxD/gygX/zAiH/8hISH/IiEh/zIiH/97JRX/VCMa/ysiIP9zJRf/eygZ/1Ek + HP+fKBP/likV/zMjIP8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JCQk/xEREf8HBwf/PT09/4GB + gf+0tLT/zs7O/8/Pz//R0dH/0tLS/9LS0v/T09P/1NTU/9XV1f/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//s7Oz/7Ozs/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//w8PD/8PDw//Hx8f/x8fH/8fHx//Ly8v/x8fEx////Af///wH///8B////AeLi + 4uPh4eH/4ODg/9/f3//e3t7/3d3d/9zc3P/b29v/2tra/9nZ2f/Y2Nj/19fX/9XV1f/ExMT/ioqK/0FB + Qf8kJCT/IyMj/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEh + If8hISH/ISEh/yghIP9FIx3/aCUZ/3UmGP9lJRn/QiMd/ychH/9YIhj/vSsR/5YpFf8wIh//ISEh/yEh + If8tIR//eSUW/7wsEf9lJhv/JyIh/0QkHv81IyD/YCUa/4spF/9UJR3/KyMh/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IiIi/yQkJP8XFxf/AgIC/xwcHP95eXn/sbGx/87Ozv/Q0ND/0tLS/9PT0//U1NT/1NTU/9XV + 1f/W1tb/19fX/9nZ2f/a2tr/29vb/9vb2//d3d3/3d3d/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5OTk/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8fHx//Hx + 8f/y8vL/8vLy//Ly8jH///8B////Af///wH///8B4+Pj4+Li4v/h4eH/4ODg/9/f3//e3t7/3d3d/9zc + 3P/b29v/29vb/9ra2v/Z2dn/2NjY/9fX1//T09P/urq6/3t7e/81NTX/JSUl/yIiIv8jIyP/IyMj/yMj + I/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIP8iISD/JCEg/yIh + IP8lICD/WCIZ/7QqEf+sKxP/PiMe/yEhIP8hISH/KyAf/3klFv+7KxH/byca/yoiIf8iIiL/IyIi/y8i + IP9CIx3/MSMh/yQjIv8jIyL/IyMj/yMjI/8jIyP/IiIi/yMjI/8mJib/GBgY/wUFBf8eHh7/d3d3/7W1 + tf/Ozs7/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/19fX/9nZ2f/Z2dn/29vb/9zc3P/c3Nz/3t7e/97e + 3v/g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t7f/u7u7/7u7u/+/v + 7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/PzMf///wH///8B////Af// + /wHk5OTj5OTk/+Li4v/i4uL/4ODg/+Dg4P/e3t7/3t7e/93d3f/c3Nz/29vb/9ra2v/a2tr/2dnZ/9jY + 2P/X19f/09PT/6SkpP9gYGD/Kioq/yIiIv8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yEhIf8hISH/ISEh/yEhIf8hISH/ISEh/zIhHv+TKBT/qCoT/6EpFP82IR3/ISAg/yYg + H/9nIxf/uysR/4MoF/8uIiD/IiIi/yIiIv8xIiD/iSgW/48oFf81IyD/IyMj/yMjI/8jIyP/IyMj/yMj + I/8iIiL/KSkp/x8fH/8FBQX/FRUV/2lpaf+urq7/0NDQ/9TU1P/V1dX/1dXV/9bW1v/X19f/2NjY/9nZ + 2f/Z2dn/29vb/9vb2//c3Nz/3d3d/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl + 5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/u7u7/7u7u/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Pz8//z8/Mx////Af///wH///8B////AeXl5ePl5eX/5OTk/+Pj4//i4uL/4eHh/+Dg + 4P/f39//3t7e/97e3v/c3Nz/3Nzc/9vb2//a2tr/2tra/9nZ2f/Y2Nj/1tbW/8nJyf+MjIz/RUVF/yYm + Jv8iIiL/IyMj/yMjI/8jIyP/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yEhIf8hISH/ISEh/yEh + If8hISH/JCEg/z0iHv9HIx3/pyoT/4gmE/9QIRj/dCQW/7orEf+OKRf/NCMf/yIiIv8iIiL/MCIf/4Em + Fv/ALRL/cCga/yojIv8jIyP/IyMj/yMjI/8jIyP/IiIi/yQkJP8eHh7/BQUF/wwMDP9hYWH/qamp/83N + zf/V1dX/1tbW/9fX1//X19f/2NjY/9nZ2f/a2tr/29vb/9zc3P/d3d3/3d3d/97e3v/f39//4ODg/+Hh + 4f/i4uL/4+Pj/+Pj4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq + 6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/v7+//7+/v/+/v + 7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8zH///8B////Af// + /wH///8B5ubm4+bm5v/l5eX/5OTk/+Pj4//i4uL/4eHh/+Hh4f/g4OD/39/f/9/f3//e3t7/3d3d/9zc + 3P/c3Nz/29vb/9ra2v/Z2dn/2dnZ/9fX1/+8vLz/fHx8/zg4OP8kJCT/IiIi/yMjI/8jIyP/IyMj/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8hISH/ISEh/yEhIf8hISH/ISEh/yMhIP9TJBz/nSkV/7gr + Ef+2KxL/uiwS/08kHP8iIiL/IiIi/yoiIP+AJhX/vywS/3YoGv8pIyL/IyMj/yMjI/8jIyP/IyMj/yIi + Iv8qKir/JSUl/wkJCf8RERH/Xl5e/6enp//Pz8//19fX/9jY2P/Y2Nj/2dnZ/9ra2v/a2tr/3Nzc/9zc + 3P/d3d3/3t7e/97e3v/f39//4ODg/+Hh4f/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5+fn/+fn + 5//n5+f/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/PzMf///wH///8B////Af///wHn5+fj5+fn/+bm5v/l5eX/5OTk/+Pj + 4//j4+P/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d3f/c3Nz/29vb/9vb2//a2tr/2dnZ/9nZ + 2f/R0dH/pKSk/19fX/9LS0v/YmJi/2FhYf9PT0//LS0t/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/ISEh/yEhIf8hISH/ISEh/yMhIP82Ix//TiQd/0okHf+iKhT/YCQZ/yQhIf8oISD/aCQY/8As + Ef+BKRn/MCMh/yMjI/8jIyP/IyMj/yMjI/8iIiL/Kysr/0xMTP9MTEz/QkJC/2RkZP+ysrL/zs7O/9jY + 2P/Z2dn/2dnZ/9ra2v/b29v/3Nzc/9zc3P/e3t7/3t7e/9/f3//g4OD/4ODg/+Hh4f/i4uL/4+Pj/+Pj + 4//k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn5//n5+f/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/z8/Mx////Af// + /wH///8B////Aejo6OPo6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/h4eH/4eHh/+Dg + 4P/g4OD/39/f/97e3v/e3t7/3d3d/9zc3P/c3Nz/29vb/9ra2v/a2tr/1tbW/9TU1P/Y2Nj/19fX/9TU + 1P+1tbX/ZWVl/ysrK/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/ISEh/yEhIf8hISH/ISEh/yEh + If8iIiH/IiIh/2YnG/+zKxL/nCgT/6MoEv/BLBH/gSkZ/zAkIf8jIyL/IyMj/yMjI/8jIyP/IiIi/ycn + J/84ODj/VFRU/2JiYv92dnb/q6ur/9fX1//a2tr/2tra/9vb2//c3Nz/3d3d/93d3f/e3t7/39/f/9/f + 3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u + 7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Pz + 8//z8/P/8/Pz//Pz8//09PT/9PT0//Pz8zH///8B////Af///wH///8B6enp4+np6f/o6Oj/5+fn/+fn + 5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4eHh/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d + 3f/d3d3/3Nzc/9vb2//b29v/29vb/9ra2v/a2tr/2dnZ/9nZ2f/Dw8P/YmJi/yQkJP8jIyP/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/KiIh/10mHP+UKhb/nSsW/28o + G/8uIyH/IyMj/yMjI/8jIyP/IyMj/yIiIv8iIiL/ISEh/xQUFP8uLi7/Z2dn/4+Pj//Ozs7/29vb/9zc + 3P/c3Nz/3d3d/97e3v/e3t7/39/f/9/f3//g4OD/4eHh/+Li4v/i4uL/4+Pj/+Tk5P/k5OT/5eXl/+bm + 5v/m5ub/5ubm/+fn5//o6Oj/6Ojo/+jo6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx + 8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0Mf// + /wH///8B////Af///wHq6urj6urq/+np6f/o6Oj/6Ojo/+fn5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Tk + 5P/j4+P/4+Pj/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/97e3v/e3t7/3d3d/93d3f/d3d3/3Nzc/9zc + 3P/b29v/29vb/9ra2v+mpqb/Kioq/yMjI/8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yIiIv8iIiL/JCMi/ysjIv8sIyH/JiMi/yMjIv8jIyP/IyMj/yMjI/8iIiL/IiIi/x0d + Hf8ICAj/BQUF/zs7O/+Wlpb/x8fH/9zc3P/d3d3/3t7e/97e3v/f39//4ODg/+Dg4P/h4eH/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6urq/+rq + 6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//X19f/19fUx////Af///wH///8B////Aevr6+Pr6+v/6urq/+rq + 6v/p6en/6Ojo/+jo6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh + 4f/h4eH/4ODg/+Dg4P/f39//3t7e/97e3v/e3t7/3d3d/93d3f/c3Nz/3Nzc/8HBwf83Nzf/IiIi/yIi + Iv8jIyP/IyMj/yIiIv8iIiL/IiIi/yIiIv8iIiL/IiIi/yIiIv8iIiL/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yIiIv8hISH/DQ0N/wMDA/80NDT/kJCQ/8nJyf/d3d3/39/f/9/f + 3//g4OD/4ODg/+Hh4f/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk5P/l5eX/5eXl/+bm5v/n5+f/5+fn/+fn + 5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/19fX/9fX1//X1 + 9TH///8B////Af///wH///8B7Ozs4+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+bm + 5v/m5ub/5eXl/+Xl5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/g4OD/39/f/9/f + 3//f39//3t7e/97e3v/d3d3/19fX/4uLi/89PT3/JCQk/yMjI/8jIyP/IyMj/yMjI/8iIiL/IiIi/yIi + Iv8iIiL/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8jIyP/JSUl/w4O + Dv8CAgL/IyMj/4KCgv/FxcX/39/f/+Dg4P/g4OD/4eHh/+Hh4f/i4uL/4uLi/+Pj4//j4+P/5OTk/+Tk + 5P/l5eX/5eXl/+bm5v/m5ub/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6urq/+rq6v/q6ur/6+vr/+vr + 6//r6+v/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1Mf///wH///8B////Af///wHt7e3j7Ozs/+zs + 7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/l5eX/5eXl/+Xl + 5f/k5OT/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Hh4f/g4OD/4ODg/9/f3//f39//3d3d/76+ + vv9ycnL/ODg4/yQkJP8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IiIi/yMjI/8RERH/AgIC/yYmJv+IiIj/xcXF/9/f3//i4uL/4uLi/+Li + 4v/j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+bm5v/n5+f/5+fn/+jo6P/o6Oj/6enp/+np + 6f/p6en/6urq/+rq6v/r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vYx////Af///wH///8B////Ae3t7ePt7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//q6ur/6urq/+np + 6f/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Li + 4v/i4uL/4uLi/+Hh4f/h4eH/4eHh/+Dg4P/g4OD/4ODg/9TU1P+np6f/XFxc/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yIiIv8nJyf/FBQU/wIC + Av8cHBz/dnZ2/8TExP/f39//4uLi/+Pj4//j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl5f/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6enp/+np6f/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+3t + 7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b29jH///8B////Af///wH///8B7u7u4+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo + 6P/n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/4+Pj/+Pj4//i4uL/4uLi/+Li + 4v/i4uL/4eHh/+Hh4f/X19f/l5eX/05OTv8oKCj/IiIi/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMj + I/8jIyP/IyMj/yMjI/8lJSX/Tk5O/5iYmP9zc3P/UVFR/5OTk//Gxsb/4uLi/+Tk5P/k5OT/5eXl/+Xl + 5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v + 7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//b2 + 9v/29vb/9vb2Mf///wH///8B////Af///wHu7u7j7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/r6+v/6+vr/+vr6//q6ur/6urq/+rq6v/p6en/6enp/+jo6P/o6Oj/5+fn/+fn5//m5ub/5ubm/+Xl + 5f/l5eX/5eXl/+Tk5P/k5OT/5OTk/+Pj4//j4+P/4+Pj/+Pj4//i4uL/4uLi/+Pj4//g4OD/xMTE/3d3 + d/82Njb/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IiIi/0RERP+urq7/4uLi/+Li + 4v/a2tr/4ODg/+Tk5P/l5eX/5eXl/+Xl5f/l5eX/5ubm/+bm5v/n5+f/5+fn/+fn5//o6Oj/6Ojo/+jo + 6P/p6en/6enp/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+3t7f/t7e3/7e3t/+7u + 7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T0 + 9P/09PT/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vYx////Af///wH///8B////Ae/v + 7+Pu7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq + 6v/q6ur/6enp/+np6f/o6Oj/6Ojo/+fn5//n5+f/5+fn/+bm5v/m5ub/5eXl/+Xl5f/l5eX/5OTk/+Tk + 5P/k5OT/5OTk/+Pj4//j4+P/5OTk/+Tk5P/k5OT/29vb/7i4uP9ra2v/LS0t/yQkJP8iIiL/IyMj/yMj + I/8jIyP/IiIi/yMjI/84ODj/ra2t/+Li4v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm5v/m5ub/5ubm/+fn + 5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+np6f/p6en/6enp/+rq6v/q6ur/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9vb2//b2 + 9v/29vb/9vb2//b29jH///8B////Af///wH///8B8PDw4+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t + 7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6enp/+jo + 6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Xl5f/l5eX/5eXl/+bm + 5v/m5ub/5ubm/9jY2P+dnZ3/V1dX/yYmJv8iIiL/IyMj/yMjI/8iIiL/PDw8/6CgoP/l5eX/5+fn/+fn + 5//n5+f/5+fn/+fn5//n5+f/5+fn/+jo6P/o6Oj/6Ojo/+jo6P/p6en/6enp/+np6f/q6ur/6urq/+rq + 6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2Mf///wH///8B////Af// + /wHw8PDj8PDw//Dw8P/v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+np6f/o6Oj/6Ojo/+jo6P/n5+f/5+fn/+fn + 5//n5+f/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+fn5//n5+f/5+fn/+Tk5P/MzMz/eHh4/zY2 + Nv8kJCT/IiIi/y0tLf+ampr/4ODg/+fn5//o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6enp/+np + 6f/p6en/6enp/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/t7e3/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b2 + 9v/29vb/9vb2//f39//29vYx////Af///wH///8B////AfHx8ePx8fH/8PDw//Dw8P/w8PD/7+/v/+/v + 7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/r6+v/6+vr/+vr + 6//q6ur/6urq/+rq6v/p6en/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo + 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/k5OT/xcXF/3R0dP9MTEz/kZGR/+bm5v/p6en/6enp/+np + 6f/p6en/6enp/+np6f/q6ur/6urq/+rq6v/q6ur/6urq/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//X19f/19fX/9fX1//X1 + 9f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//b29jH///8B////Af// + /wH///8B8fHx4/Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u + 7v/t7e3/7e3t/+3t7f/t7e3/7e3t/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+np + 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np + 6f/p6en/3d3d/83Nzf/h4eH/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+vr + 6//r6+v/6+vr/+vr6//s7Oz/7Ozs/+zs7P/s7Oz/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Ly + 8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9PT0//T09P/09PT/9PT0//T0 + 9P/09PT/9PT0//X19f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/39/f/9/f3//f39//39/f/9vb2Mf///wH///8B////Af///wHy8vLj8fHx//Hx8f/x8fH/8fHx//Dw + 8P/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6urq/+rq + 6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq6v/r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/t7e3/7e3t/+3t + 7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw + 8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Pz//Pz8//z8/P/8/Pz//Pz + 8//z8/P/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//f39//39/cx////Af// + /wH///8B////AfLy8uPy8vL/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw/+/v + 7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr + 6//r6+v/6+vr/+vr6//r6+v/6+vr/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+7u7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX1//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f3//f3 + 9//39/f/9/f3//f39//39/f/9/f3//j4+DH///8B////Af///wH///8B8/Pz4/Pz8//y8vL/8vLy//Ly + 8v/y8vL/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7+/v/+/v + 7//u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs + 7P/s7Oz/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7u7u/+7u7v/u7u7/7u7u/+/v + 7//v7+//7+/v/+/v7//v7+//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx + 8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PT/9PT0//T0 + 9P/09PT/9PT0//T09P/09PT/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b2 + 9v/29vb/9vb2//b29v/29vb/9vb2//f39//39/f/9/f3//f39//39/f/9/f3//f39//4+Pj/+Pj4Mf// + /wH///8B////Af///wHz8/Pj8/Pz//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Ly8v/x8fH/8fHx//Hx + 8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//v7+//7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t + 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/v7+//7+/v/+/v7//v7+//7+/v//Dw8P/w8PD/8PDw//Dw8P/w8PD/8fHx//Hx + 8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz + 8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/19fX/9fX1//X19f/19fX/9fX1//X1 + 9f/19fX/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/9/f3//f3 + 9//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pgx////Af///wH///8B////AfT09OP09PT/8/Pz//Pz + 8//z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw + 8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u + 7v/u7u7/7u7u/+7u7v/u7u7/7u7u/+7u7v/u7u7/7+/v/+/v7//v7+//7+/v/+/v7//v7+//8PDw//Dw + 8P/w8PD/8PDw//Dw8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8vLy//Ly8v/y8vL/8vLy//Ly + 8v/y8vL/8vLy//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T09P/09PT/9PT0//T09P/09PT/9PT0//X1 + 9f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2 + 9v/29vb/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4 + +DH///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/ROMVault2/frmSplashScreen.Designer.cs b/ROMVault2/frmSplashScreen.Designer.cs new file mode 100644 index 0000000..9003df2 --- /dev/null +++ b/ROMVault2/frmSplashScreen.Designer.cs @@ -0,0 +1,119 @@ +namespace ROMVault2 +{ + partial class FrmSplashScreen + { + /// + /// 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(FrmSplashScreen)); + this.lblStatus = new System.Windows.Forms.Label(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.progressBar = new System.Windows.Forms.ProgressBar(); + this.lblVersion = new System.Windows.Forms.Label(); + this.bgWork = new System.ComponentModel.BackgroundWorker(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblStatus + // + this.lblStatus.BackColor = System.Drawing.Color.White; + this.lblStatus.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblStatus.ImageAlign = System.Drawing.ContentAlignment.TopLeft; + this.lblStatus.Location = new System.Drawing.Point(7, 135); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Padding = new System.Windows.Forms.Padding(2, 2, 0, 0); + this.lblStatus.Size = new System.Drawing.Size(450, 20); + this.lblStatus.TabIndex = 0; + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.Timer1Tick); + // + // progressBar + // + this.progressBar.Location = new System.Drawing.Point(7, 159); + this.progressBar.Name = "progressBar"; + this.progressBar.Size = new System.Drawing.Size(450, 19); + this.progressBar.TabIndex = 4; + // + // lblVersion + // + this.lblVersion.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblVersion.Location = new System.Drawing.Point(10, 113); + this.lblVersion.Name = "lblVersion"; + this.lblVersion.Size = new System.Drawing.Size(445, 15); + this.lblVersion.TabIndex = 5; + this.lblVersion.Text = "label1"; + this.lblVersion.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // bgWork + // + this.bgWork.WorkerReportsProgress = true; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 185); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 6; + this.label1.Text = "label1"; + // + // FrmSplashScreen + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage"))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.ClientSize = new System.Drawing.Size(465, 207); + this.ControlBox = false; + this.Controls.Add(this.label1); + this.Controls.Add(this.lblVersion); + this.Controls.Add(this.progressBar); + this.Controls.Add(this.lblStatus); + this.DoubleBuffered = true; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "FrmSplashScreen"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "frmSplashScreen"; + this.Shown += new System.EventHandler(this.FrmSplashScreenShown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblStatus; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.ProgressBar progressBar; + private System.Windows.Forms.Label lblVersion; + private System.ComponentModel.BackgroundWorker bgWork; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/ROMVault2/frmSplashScreen.cs b/ROMVault2/frmSplashScreen.cs new file mode 100644 index 0000000..39c0c1a --- /dev/null +++ b/ROMVault2/frmSplashScreen.cs @@ -0,0 +1,159 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System; +using System.ComponentModel; +using System.ServiceModel; +using System.Threading; +using System.Windows.Forms; +using ROMVault2.Properties; +using ROMVault2.RVRef; +using ROMVault2.RvDB; + +namespace ROMVault2 +{ + public partial class FrmSplashScreen : Form + { + private double _opacityIncrement = 0.05; + + public FrmSplashScreen() + { + InitializeComponent(); + lblVersion.Text = @"Version " + Program.Version + @"." + Program.SubVersion + Resources.FixFiles_FixZip_Colon + Application.StartupPath; + Opacity = 0; + timer1.Interval = 50; + + label1.Text = @"Registered to : " + Settings.Username + @" Contact Email (" + Settings.EMail + @")"; + + bgWork.DoWork += StartUpCode; + bgWork.ProgressChanged += BgwProgressChanged; + bgWork.RunWorkerCompleted += BgwRunWorkerCompleted; + } + + private void FrmSplashScreenShown(object sender, EventArgs e) + { + bgWork.RunWorkerAsync(SynchronizationContext.Current); + timer1.Start(); + } + + + private void StartUpCode(object sender, DoWorkEventArgs e) + { + + BasicHttpBinding b = new BasicHttpBinding { SendTimeout = new TimeSpan(0, 0, 20), ReceiveTimeout = new TimeSpan(0, 0, 20) }; + EndpointAddress ep = new EndpointAddress(@"http://services.romvault.com/Service1.svc"); + Service1Client s = new Service1Client(b, ep); + + if (string.IsNullOrEmpty(Settings.Username) || string.IsNullOrEmpty(Settings.EMail)) + { + FrmRegistration freg = new FrmRegistration(); + freg.ShowDialog(); + freg.Dispose(); + } + + bool isNetworkAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); + + string r = "OK"; + try + { + if (isNetworkAvailable) + r = s.SendUser1(Settings.Username, Settings.EMail, Program.Version, Program.SubVersion); + } + catch (Exception) + { + r = "OK"; + } + + if (r != "OK") + { + Program.ErrorMessage=Resources.Program_Main_You_are_not_Authorised_to_use_this_program; + return; + } + // normal check ends + + string thisV = Program.Version + "." + Program.SubVersion.ToString("0000"); + string v = thisV; + try + { + if (isNetworkAvailable) + v = s.GetLatestVersion1(Program.Version, Program.SubVersion); + } + catch (Exception) + { + v = thisV; + } + if (String.Compare(v, thisV, StringComparison.Ordinal) > 0) + { + Program.URL = s.GetUpdateLink1(Program.Version, Program.SubVersion); + Program.ErrorMessage=Resources.Program_Main_There_is_a_new_release_download_now_from + Program.URL; + return; + } + + s.Close(); + + RepairStatus.InitStatusCheck(); + + Settings.SetDefaults(); + + DB.Read(sender,e); + + } + + + private void BgwProgressChanged(object sender, ProgressChangedEventArgs e) + { + if (e.UserState == null) + { + if (e.ProgressPercentage >= progressBar.Minimum && e.ProgressPercentage <= progressBar.Maximum) + progressBar.Value = e.ProgressPercentage; + return; + } + bgwSetRange bgwSr = e.UserState as bgwSetRange; + if (bgwSr != null) + { + progressBar.Minimum = 0; + progressBar.Maximum = bgwSr.MaxVal; + progressBar.Value = 0; + return; + } + + bgwText bgwT = e.UserState as bgwText; + if (bgwT != null) + { + lblStatus.Text = bgwT.Text; + } + } + + private void BgwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + _opacityIncrement = -0.1; + timer1.Start(); + } + + private void Timer1Tick(object sender, EventArgs e) + { + + if (_opacityIncrement > 0) + { + if (Opacity < 1) + Opacity += _opacityIncrement; + else + timer1.Stop(); + } + else + { + if (Opacity > 0) + Opacity += _opacityIncrement; + else + { + timer1.Stop(); + Close(); + } + } + } + + } +} diff --git a/ROMVault2/frmSplashScreen.resx b/ROMVault2/frmSplashScreen.resx new file mode 100644 index 0000000..488f942 --- /dev/null +++ b/ROMVault2/frmSplashScreen.resx @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + 104, 17 + + + + + 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 + + + \ No newline at end of file diff --git a/ROMVault2/rvImages.cs b/ROMVault2/rvImages.cs new file mode 100644 index 0000000..c867a9b --- /dev/null +++ b/ROMVault2/rvImages.cs @@ -0,0 +1,56 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System.Collections.Generic; +using System.Drawing; + +namespace ROMVault2 +{ + public static class rvImages + { + private static List names; + private static List images; + + + public static Bitmap GetBitmap(string bitmapName) + { + object bmObj = rvImages1.ResourceManager.GetObject(bitmapName); + + Bitmap bm = null; + if (bmObj != null) + bm = (Bitmap)bmObj; + + return bm; + } + + public static Bitmap TickBoxDisabled + { + get { return GetBitmap("TickBoxDisabled"); } + } + public static Bitmap TickBoxTicked + { + get { return GetBitmap("TickBoxTicked"); } + } + public static Bitmap TickBoxUnTicked + { + get { return GetBitmap("TickBoxUnTicked"); } + } + + public static Bitmap ExpandBoxMinus + { + get { return GetBitmap("ExpandBoxMinus"); } + } + public static Bitmap ExpandBoxPlus + { + get { return GetBitmap("ExpandBoxPlus"); } + } + + public static Bitmap romvaultTZ + { + get { return GetBitmap("romvaultTZ"); } + } + } +} diff --git a/ROMVault2/rvImages1.Designer.cs b/ROMVault2/rvImages1.Designer.cs new file mode 100644 index 0000000..341dc40 --- /dev/null +++ b/ROMVault2/rvImages1.Designer.cs @@ -0,0 +1,743 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34011 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ROMVault2 { + 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 rvImages1 { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal rvImages1() { + } + + /// + /// 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("ROMVault2.rvImages1", typeof(rvImages1).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; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DirDirCorrect { + get { + object obj = ResourceManager.GetObject("DirDirCorrect", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DirDirCorrectBadCase { + get { + object obj = ResourceManager.GetObject("DirDirCorrectBadCase", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DirDirMissing { + get { + object obj = ResourceManager.GetObject("DirDirMissing", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DirDirUnknown { + get { + object obj = ResourceManager.GetObject("DirDirUnknown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DirectoryTree1 { + get { + object obj = ResourceManager.GetObject("DirectoryTree1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DirectoryTree2 { + get { + object obj = ResourceManager.GetObject("DirectoryTree2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DirectoryTree3 { + get { + object obj = ResourceManager.GetObject("DirectoryTree3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DirectoryTree4 { + get { + object obj = ResourceManager.GetObject("DirectoryTree4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ExpandBoxMinus { + get { + object obj = ResourceManager.GetObject("ExpandBoxMinus", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ExpandBoxPlus { + get { + object obj = ResourceManager.GetObject("ExpandBoxPlus", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_CanBeFixed { + get { + object obj = ResourceManager.GetObject("G_CanBeFixed", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_Correct { + get { + object obj = ResourceManager.GetObject("G_Correct", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_Corrupt { + get { + object obj = ResourceManager.GetObject("G_Corrupt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_CorruptCanBeFixed { + get { + object obj = ResourceManager.GetObject("G_CorruptCanBeFixed", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_Delete { + get { + object obj = ResourceManager.GetObject("G_Delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_DirCorrupt { + get { + object obj = ResourceManager.GetObject("G_DirCorrupt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_Ignore { + get { + object obj = ResourceManager.GetObject("G_Ignore", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_InToSort { + get { + object obj = ResourceManager.GetObject("G_InToSort", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_Missing { + get { + object obj = ResourceManager.GetObject("G_Missing", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_MoveToSort { + get { + object obj = ResourceManager.GetObject("G_MoveToSort", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_NeededForFix { + get { + object obj = ResourceManager.GetObject("G_NeededForFix", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_NotCollected { + get { + object obj = ResourceManager.GetObject("G_NotCollected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_Rename { + get { + object obj = ResourceManager.GetObject("G_Rename", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_Unknown { + get { + object obj = ResourceManager.GetObject("G_Unknown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_UnNeeded { + get { + object obj = ResourceManager.GetObject("G_UnNeeded", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap G_UnScanned { + get { + object obj = ResourceManager.GetObject("G_UnScanned", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatBad_NotCollected { + get { + object obj = ResourceManager.GetObject("R_InDatBad_NotCollected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatCollect_CanBeFixed { + get { + object obj = ResourceManager.GetObject("R_InDatCollect_CanBeFixed", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatCollect_Correct { + get { + object obj = ResourceManager.GetObject("R_InDatCollect_Correct", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatCollect_Corrupt { + get { + object obj = ResourceManager.GetObject("R_InDatCollect_Corrupt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatCollect_CorruptCanBeFixed { + get { + object obj = ResourceManager.GetObject("R_InDatCollect_CorruptCanBeFixed", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatCollect_Missing { + get { + object obj = ResourceManager.GetObject("R_InDatCollect_Missing", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatCollect_MoveToCorrupt { + get { + object obj = ResourceManager.GetObject("R_InDatCollect_MoveToCorrupt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatCollect_UnScanned { + get { + object obj = ResourceManager.GetObject("R_InDatCollect_UnScanned", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatMerged_Deleted { + get { + object obj = ResourceManager.GetObject("R_InDatMerged_Deleted", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatMerged_NeededForFix { + get { + object obj = ResourceManager.GetObject("R_InDatMerged_NeededForFix", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatMerged_NotCollected { + get { + object obj = ResourceManager.GetObject("R_InDatMerged_NotCollected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InDatMerged_UnNeeded { + get { + object obj = ResourceManager.GetObject("R_InDatMerged_UnNeeded", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InToSort_Corrupt { + get { + object obj = ResourceManager.GetObject("R_InToSort_Corrupt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InToSort_Delete { + get { + object obj = ResourceManager.GetObject("R_InToSort_Delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InToSort_Deleted { + get { + object obj = ResourceManager.GetObject("R_InToSort_Deleted", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InToSort_InToSort { + get { + object obj = ResourceManager.GetObject("R_InToSort_InToSort", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InToSort_MoveToCorrupt { + get { + object obj = ResourceManager.GetObject("R_InToSort_MoveToCorrupt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_InToSort_NeededForFix { + get { + object obj = ResourceManager.GetObject("R_InToSort_NeededForFix", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_Corrupt { + get { + object obj = ResourceManager.GetObject("R_NotInDat_Corrupt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_Delete { + get { + object obj = ResourceManager.GetObject("R_NotInDat_Delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_Deleted { + get { + object obj = ResourceManager.GetObject("R_NotInDat_Deleted", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_Ignore { + get { + object obj = ResourceManager.GetObject("R_NotInDat_Ignore", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_MoveToCorrupt { + get { + object obj = ResourceManager.GetObject("R_NotInDat_MoveToCorrupt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_MoveToSort { + get { + object obj = ResourceManager.GetObject("R_NotInDat_MoveToSort", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_NeededForFix { + get { + object obj = ResourceManager.GetObject("R_NotInDat_NeededForFix", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_Rename { + get { + object obj = ResourceManager.GetObject("R_NotInDat_Rename", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_Unknown { + get { + object obj = ResourceManager.GetObject("R_NotInDat_Unknown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap R_NotInDat_UnScanned { + get { + object obj = ResourceManager.GetObject("R_NotInDat_UnScanned", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap romvaultTZ { + get { + object obj = ResourceManager.GetObject("romvaultTZ", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap TickBoxDisabled { + get { + object obj = ResourceManager.GetObject("TickBoxDisabled", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap TickBoxTicked { + get { + object obj = ResourceManager.GetObject("TickBoxTicked", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap TickBoxUnTicked { + get { + object obj = ResourceManager.GetObject("TickBoxUnTicked", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Tree1 { + get { + object obj = ResourceManager.GetObject("Tree1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Tree2 { + get { + object obj = ResourceManager.GetObject("Tree2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Tree3 { + get { + object obj = ResourceManager.GetObject("Tree3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Tree4 { + get { + object obj = ResourceManager.GetObject("Tree4", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ZipDirCorrect { + get { + object obj = ResourceManager.GetObject("ZipDirCorrect", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ZipDirCorrupt { + get { + object obj = ResourceManager.GetObject("ZipDirCorrupt", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ZipDirInToSort { + get { + object obj = ResourceManager.GetObject("ZipDirInToSort", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ZipDirMissing { + get { + object obj = ResourceManager.GetObject("ZipDirMissing", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ZipDirUnknown { + get { + object obj = ResourceManager.GetObject("ZipDirUnknown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ZipTZ { + get { + object obj = ResourceManager.GetObject("ZipTZ", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ROMVault2/rvImages1.resx b/ROMVault2/rvImages1.resx new file mode 100644 index 0000000..75a2f72 --- /dev/null +++ b/ROMVault2/rvImages1.resx @@ -0,0 +1,3922 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + y6WsttrvAQMfgh5KTfoXAAAAAElFTkSuQmCC + + + + + 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 + 1xe7R6QZxv8DiyxXTC5xLO8AAAAASUVORK5CYII= + + + + + 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 + Y/eRFMP4//ZFmX/edOjbAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAG4AAABuCAYAAADGWyb7AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuODc7gF0AACILSURBVHhe7Z0J + cBRXmuefMCCVDNjc5jCnQQZzm8PGCIS4hECgA4EQCMQhDgMCzA0GY+OjfTQ+sDHiEAiEECBV6ShVqbQT + u7Ex0TvRu7M93onZ3p3o6ZiZnt3Y3pmYnu3p2d3p2XZ/+/+/zJdKFYVcOgCB9SL+kVVZVVlZ3y+/733f + y5eVqrN1ts7W2TpbZ+tsD6Z9peL7f6E808+p+E3nlOcIlpegP/hUec4cUHGj+6qYOLytKxSjP9DZHk4D + mO7Qy4CRCUC7bDABQPoJ1v8Okub0uYr/L3NV1xewqZ5QN6gTYHs1GHgiQCyGtkOfAswtgvlSxf86HES4 + znd7Rop69pfLg4dL8fAxUpIwQa5PnCKX+g7Wr/E9HyvPN0NVl8n4qv4QPbATXksajDgAQI5DFwHlP0K/ + cEOIpPMxPaSoV3+5NGCoXBk2WkoA5ebMV+RWUpJUZKZLxepM8a5eJd6cbKmEvNlZUpGRLneWpUrZa4ly + wdNHb+eM8vzYo2KmYzcGQZ3wom0wXiwUgr6lId0q6tFPLvYZLFeGjpKScROldOp0KZ8HMGnLpTI70wKS + u0Z863KkKm+dVG3Kk+otG6V6a75Ub9ssNdT2LVKzYwueb9KvedfnSGVmhtyamyRfxz6rv+eUivtD7MrL + 0EAoFuqE11yD0fpBAej/0oCXnhumvaY8OVl7R+XqLO0xPhjbl5crvvz1UrUZcAhmuw1l51ap3VUg/t3b + pXbfTvHve13q9u8S/xu7xX+wUAIHCqWO4nO8VoP3Vm/ZoLd7CwfB+a49NLzDKrYWuzQVGgB1hzrh3a/B + YEEajbo8aLj2JO+aVRpSFT2nAF6iwWzTYPyFO7Tx/QBDEHUEc3ivpaP7oDckeOKApZOHJHjqkNRjWf8m + Hp84KEG8HsBn/IU7pQbb9q1dI2VzEh0PL1SxN7Bbk6B+UGfCEqnBUONpLIYrGq8ifSWArdUhrpaQ6DkH + 9kjdYcA5QijUfgkeIxhAgDSUU4e1Qm8dldBp6O1jlt45LqEzJxrF104d0RC5vbq9r2uv9eXmSOmMWQ68 + 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 + 7iNpSv1/UMkKCmeMXs0AAAAASUVORK5CYII= + + + + + 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 + KUYaLl4iYdYepObrZMaXc88d2rf4Prehfl6N3RZaTmrfXvvVyKHaE+s+03IT1mpR1E9lo4driTdep32J + z9sauy24cJ1yAQBygsBew8kDp+Wc8bU1dltwYSNzUsBJAnsOw+H2E6fmj0I/78ZuCy+cHHD9w9kdexG3 + nzg1b2vsHpeiaf8PHu0G+LJznRQAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAAG4AAABuCAYAAADGWyb7AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuODc7gF0AACJfSURBVHhe7Z0L + cFRXmt8vGAzCAqHuNtg8DRiwARkD5mGMQMhgC5mHEIg3QgIE4qEX74d5mIdtDAaDECAEwgIhJNBbrZZa + u5XU1tbs1iSb3cnWZpKtyVR2J0llktTOZnYmycxmZr78/+ee091q2qAXILBO1b/u7dvdt29/v/t95/vO + PX3b6mpdrat1ta7W1braE2p5rletS673rFxnqpXr2o9lAfTH1gXnSWt3xCjL2b03XtUD6qZe39WeUstz + vQxNAYxEANqhwXgA6S+x/XeQPFIXnf/emh32JvbUF+oJdQHssJbnigKIj6Ct0AWAuafAXHb98iEQQep5 + 5XXpmz9CBt14R4YXTpGxRbMk6nasOAvGqufU6846fmQN6TERn/QqRA/sgteqlucaACCHoOuA8m+gnwVC + CKVuV16VfvkjZUDBOBl2c7JEFcXKtLvxEnNvmSSUp0liebosr0yXpMrtklSxTZZhPaF8s8Tf3yAflCyR + sGvD7H2ddPzQCuv2Ho7idagLXotbnqsX5IV+rwwZoPD84eK4PkaG3HxX3i6KlknF82VO6TJZWJ4iiRWA + UrFdVlbukFVVGbK2OlPWV++SDTW7JaVmr2ys2Scba/fJptr9Sql4zOdWVWbI0oo0mX0vUXpdHWR/1tHI + P8WRTIEGQr2gLniPbHkuF+SB/i8N+FpBlPKa2NIVyjuWEQ48ZlVVpqypypJ1VTmAQzB7FBgC2Vx7QNLq + DstW92HZVndUtruPyo7647LTfVwy3Sck0wPVn5Cd2LbdfUzSag9LMgByv3PgnT2uvGbD29e/Dkc0CRoA + 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 + +CcA9CPrrOMX6J/+1lrxyp9YY3oW4/muYrcTN/YprwEgEwR6DZMHpuXM+LqK3U7caGQmBUwS6DmEw/qJ + qXkc9D0vdjt3Y3LA/ofZHb2I9RNT865i95k0y/r/EU4Y1WW4l4EAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAABGdBTUEAALGPC/xhBQAAAwBQTFRFS2On + kZGRuru84+Pj7e3s+vv7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlMgENQAAAAlwSFlzAAAO + vQAADr0BR/uQrQAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuND6NzHYAAAAnSURBVBhXY2Bi + hAAmBkZWCGDEzmJhAAEWEAsCgCxmCEBmQc1jZAIAKdsA3KpMtoEAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAMAAADXT/YiAAAABGdBTUEAALGPC/xhBQAAAwBQTFRFKUJy + S2OnkZGRuru84+Pj7e3s+vv7/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMVj7mgAAAAlwSFlzAAAO + vQAADr0BR/uQrQAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuND6NzHYAAAAySURBVBhXNcxZ + CgAxFAJBx7fk/jcejaRBqC9RTAWexCtEuwvN+pw1M9Ck7oYWOb4/1g84IgEnGNR0wgAAAABJRU5ErkJg + gg== + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEU9AAdPAAlUAApfAAtoAAxvAA18 + AA6BAA+MABCRABGeABKhABOlAxaoBhmrCButCh2wDSC2FCe6GCu7Gi2+HTDCJTfGKz3ILkDLNEbNN0nS + RFTUR1fVSVnXT1/ZUmLcW2rdXWzgaXbicH3mfIjohpLpjJfrkZvun6juoarwqbLytbz1xMr2x8330NT5 + 3eD64+b87O798vP+9fb++fn//Pz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq2/ciAAAACXBIWXMAAA68AAAOvAGVvHJJAAAAGXRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS40Po3MdgAAA65JREFUSEt9lYuWsjoMhasgtQgKghQEESgC + Fu0PFN//1U6Kl9G5nO2sJbPI1yQ7AdHtL8nulF0f12/6E+g5dRwvqh//vvQH0LcHz0555nk0/0zzKyDF + cWM6p2sPZVHPi9/T/Ab07Y6svJr34zjKsU2pT1l3v/Ur0DXEXEV13UH8pI5RSjN+v/sDGMVhYZrpCQp6 + SUqeUbqfmvkBdOWK2IwxLj51ZVGq7n8Dhma3Ih7Lc8bbp66TxJDuVcQHAO4sMaF5lmWM85q/qZUy/gEo + d/Bqn8bwyetT/aZW9HL/HRhKYhh2HMeR+rDTm1RDx/Ab0DULw/Cjl1Lo/CGoqF0vrY2AsBfQlUTHwbvS + /KGa1yeyHkRFxfgEumZj6KvAf1eQpim0r7phMyLlIJKLvAPKHd1wHoEvxSl0n9bsxGbrm+wvIoGaFNC3 + m4WOHfcu//HtuqqTjOWMmWSUfXUWST8BXbPEBvadSZHvOtH9UgExg6LWBC2PRXG+JHA6Uu4sS0K63LVt + J8C6rptwBfKhbxBd7iwN4QQAOgHXXMPUIOMoMjfCCogcE2T7fppGsYfCrjtjjb4AfgB8Di6I9mSaBGN3 + ijcdN4aavFkJ9QsLJUV1KegZgCZEuJiTvr/yk+/YdmwSJdPJYBYmKuGks7A0q6gqyHFBXYg0APDYtXWd + RwEL7oATg7HBbC3lBfyhyCqK6gwp0AFpiQWAFLxmNfz5gW9ibKdgMFkvwB9oV9CZBTUlNOnRGmlLy5o7 + qiKWxfkVynL9NABbF5udtURWojIQzaIQ30oUzpCmafOVaOtTnsZqDtBxC7aqcv4l2t3QkMCxSdPfUL4l + SNvqc7yvWZ5Gge/aYFVmmrN1B+tTLDQFFDQJdzs+gK08P4TlYWvM5zjI4ihwHQXEZOb1sofhLhVQXS60 + LDlsxg0NV94KoBRiqAQOuIQjY8alAB+TDaLKn4R2/+B8NTg5DGN/be4IcVQCADDSdmpWyQ66LipKq35U + 8QDcpZBwKmyadkTwDLZBAcofSovnG/YJwNK25YTokEAPiG9ALQAcQ3g46bGVj7Av4Db2CjEBgQyuYcBw + q0uVALI7XJ/x7wAgHS8PgOi6beimAlTbx6bppn4nfQDqZ4erLLDjYai2oYD1qYZHv5O+AfB2EirLtmwO + C0wTtT7q5fKlHwC0InjDRZtv4cGiNJnG9aWfACBDL+HJPWyX2Er466fkrt+ASaOAWYY73r3Vr/QnALMU + TdN+1gP6HwC66Ydv599u/wFxKBe9ZCaNnAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEUAMQAAPwAAQwAATAAAUwAAWQAA + YwACZwICaAIGcAYJdAkQgBARgRETgxMWhxYZihkbjRsdjx0gkiAnmCcrnCstnS0woDA3pTc9qT0/qz9F + r0VJsUlUuFRYulhau1pfvl9jwGNrxGttxW13ynd9zX2J0omS1pKX2Jec2pyo36ir4Kuy47K9573K7MrN + 7c3V8NXg9ODm9ubu+e7z+/P2/Pb5/fn8/vz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6Ra9RAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg + djMuMzap5+IlAAADs0lEQVRIS32VDbt6TBDGt0haRRFZImGFVu0fq+//zZ5ZvZw6L8/dua6cy/x2Zu4Z + Qre/JNpTen1cv+lPoGPEtt2wevz70h9A1xxcK2Gp65LsM82vgODHzdI+XTsoi7hu9J7mN6BrdnjlVqwb + hkEMTUI8QtvHvd+AtsbLVVhVLcSPaikhJGX3uz+AgR9mSyM5QUEvCcFSQvZjMz+Atlhhi1LK+KeuNEzk + /W9AX+9W2KVZRlnz1HUU75O9jPgAwJ2FjkmWpillrGJvaoSIfgDSHX21TyL4ZNWpelPDO7H/DvQF1jQr + iqJQfujpTbKhY/ANaOuZpnnhSwl0/hBU1KwX5oZD2AtoC6zq/ruS7KGKVSe87nlJ+PAE2nqjqSvfe5ef + JAm0L7uhEyxEz+OLuAPSHVWzH4EvRQl0n1T0RCfrm+guPIaaJNA1m5mq285d3uPbcWQnKc0oXeJBdOWZ + x90ItPVirumePSr0HDu8X0ogolDUGqPFMc/PlxhOR9KdRYFxmzmWZfu6qqoGXIE86BtEFjtTQfMYADIC + 10yZEw0PA0+dUJdAaBsgy/OSJIxcFLTtea6QF8AOgE/BBd6cDAPrujPGG7YTQU3upID6uYnivLzk5AxA + HaB5PsVdd2Unz7asyMBShp3CLJaogJPO3FTMvCwhxwW1AVIA0Ie2qaos9Kl/B+wIjPUnayEu4A9BZp6X + Z0iBDkiJTQAEZxWt4M/zPUPXrQQMxusZ+APtcjIxoaaYxB1aI2VhmlNbVkTTKLtCWY6X+GDrbLMzF8iM + ZQasmATiG4GCCVIUZbriTXXKkkjOATpuwFZZzr9YuRsaYDg2rrsbyrYYKVt1qu8rmiWh7zkWWJUaxmTd + wvrkM0UCOYmD3Y71YCvLDkFx2GrTqe6nUeg7tgQiPHE70cFwFxIoLxdSFAw244b6K2s4UBLRZAIbXNJD + bcIEBx/jDSLSn5i0/+B8OTjR90N3re8ItmUCAHSk7OSs4h10nZeElN0g4wG4SyLBWNg47RDrE9gGCUh/ + CMmfb9gnAEvbFCOiQgLVx54GtQBwDODhJMdGPMK+gNvQSWQJCGRwNA2GW17KGJDd4fqMfwcAaVlxAERV + LU1dSkC2fazrdux31Acgf3aYzAI7HgRyG3JYn7J/9DvqGwBvJy6zbIv6MJuTWK6PfLl86QcArXBWM95k + W3iwCInHcX3pJwBI3wl4cg/bxdyM2eun5K7fgFEDh1kGO9a+1S/1JwCz5HXdfNYD+h8Auun6b+ffbv8B + CV4lp0vtr3kAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEU4ADhIAEhNAE1XAFdfAF9mAGZy + AHJ2AHZ3AHeAAICEAISRAJGSAJKUAJSYAJibAZueA56gBaCjCKOpD6mtE62uFa6xGLG1ILW5Jrm7KLu/ + L7/AM8DHP8fJQ8nJRsnMS8zOT87RWNHSWtLWZdbZbNndet3ghODiieLjj+PnnOfooOjqqOrttO3xw/Hy + xvL0z/T33Pf44/j77Pv88fz99f3++P7+/P7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn1z/qAAAACXBIWXMAAA69AAAOvQFH+5CtAAAAGXRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS40Po3MdgAAA7NJREFUSEt9lQ27ekwQxrdIWkURWSJhhVbt + H6vv/82eWb2cOi/P3bmunMv8dmbuGUK3vyTaU3p9XL/pT6BjxLbdsHr8+9IfQNccXCthqeuS7DPNr4Dg + x83SPl07KIu4bvSe5jega3Z45VasG4ZBDE1CPELbx73fgLbGy1VYVS3Ej2opISRl97s/gIEfZksjOUFB + LwnBUkL2YzM/gLZYYYtSyvinrjRM5P1vQF/vVtilWUZZ89R1FO+TvYz4AMCdhY5JlqYpZaxib2qEiH4A + 0h19tU8i+GTVqXpTwzux/w70BdY0K4qiUH7o6U2yoWPwDWjrmaZ54UsJdP4QVNSsF+aGQ9gLaAus6v67 + kuyhilUnvO55SfjwBNp6o6kr33uXnyQJtC+7oRMsRM/ji7gD0h1Vsx+BL0UJdJ9U9EQn65voLjyGmiTQ + NZuZqtvOXd7j23FkJynNKF3iQXTlmcfdCLT1Yq7pnj0q9Bw7vF9KIKJQ1BqjxTHPz5cYTkfSnUWBcZs5 + lmX7uqqqBlyBPOgbRBY7U0HzGAAyAtdMmRMNDwNPnVCXQGgbIMvzkiSMXBS07XmukBfADoBPwQXenAwD + 67ozxhu2E0FN7qSA+rmJ4ry85OQMQB2geT7FXXdlJ8+2rMjAUoadwiyWqICTztxUzLwsIccFtQFSANCH + tqmqLPSpfwfsCIz1J2shLuAPQWael2dIgQ5IiU0ABGcVreDP8z1D160EDMbrGfgD7XIyMaGmmMQdWiNl + YZpTW1ZE0yi7QlmOl/hg62yzMxfIjGUGrJgE4huBgglSFGW64k11ypJIzgE6bsBWWc6/WLkbGmA4Nq67 + G8q2GClbdarvK5oloe85FliVGsZk3cL65DNFAjmJg92O9WAryw5Bcdhq06nup1HoO7YEIjxxO9HBcBcS + KC8XUhQMNuOG+itrOFAS0WQCG1zSQ23CBAcf4w0i0p+YtP/gfDk40fdDd63vCLZlAgB0pOzkrOIddJ2X + hJTdIOMBuEsiwVjYOO0Q6xPYBglIfwjJn2/YJwBL2xQjokIC1ceeBrUAcAzg4STHRjzCvoDb0ElkCQhk + cDQNhlteyhiQ3eH6jH8HAGlZcQBEVS1NXUpAtn2s63bsd9QHIH92mMwCOx4EchtyWJ+yf/Q76hsAbycu + s2yL+jCbk1iuj3y5fOkHAK1wVjPeZFt4sAiJx3F96ScASN8JeHIP28XcjNnrp+Su34BRA4dZBjvWvtUv + 9ScAs+R13XzWA/ofALrp+m/n327/AQleJadL7a95AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEUlEg8wFxMzGRQ5HBc/HhlDIBpL + JB1NJR5OJh5UKCFXKiJfLiVgLiVhLyZjMCdmMShoNCpqNixtOS90PzZ4Qzp5RTx8SD+BT0aFVEuHVk2M + XFSOX1eXamKabWWbb2efdGyhd2+mfneogHmuiIGzjoe6mJPAoJvDpJ/FqaTNs6/PtrLTvLjZxsLh0c7j + 1NHn2tjt5OPx6ej28fD49PT69/f8+vn9/fz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + H6YwJdAl+mOdAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEVMGwBhIgBoJAB2KQCALQCKMACZ + NgCfOAChOACtPACyPgDAQwDERADJRgDPSADRSQDUSgDZTwXdUwneVQvhWA7kXhbnYxzpZiDsaybtbinx + eDfzezrzfDz1gUP2hEb4ik/4jFH6lF37mmX9onL9qn3+roP+son/vJf/vZr/w6P/y7D/1sD/2MP/3sz/ + 59r/7OH/8er/9vH/+PX/+vj//fz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1zQOUAAAACXBIWXMAAA69AAAOvQFH+5CtAAAAGXRF + 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 + RU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAMAAABFNRROAAAABGdBTUEAALGPC/xhBQAAAwBQTFRFRFqS + R1yUSF2VSV6WSl+XS2CXTGGYV2qdXnGhYXOkZHalZ3inbn+qd4arjo+Pi5m7jJm6kJ29rrO5nafAo67I + r7jPsLnRt7/Vub/QusHVvMPWxsjKxcnNysvMyczQy8/Vzc/Ryc/dzNDW1dXW1djc1dnd2trb29zc3N3e + z9Ti3N/k3uDh3+Ll3uHp3+Lp4eLi4OLm5ubm5+fo6enq6+vs7O3t7e7u6uzw7e7x8vP08vP29PT09fX1 + 9vb2+Pj4+fn5+Pn6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARbOMIgAAAAlwSFlzAAAO + vgAADr4B6kKxwAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuND6NzHYAAAB/SURBVBhXY+BD + Bgx81hBgZ29rDeIJgYCcMK+WDZgnLy+vZMHOIGEL5SkZiDJwGUFUquqoWHIwSqmDeTKKImaSzFx2ymCe + Ng+jJjeruK0GmKegy8TMyulgrQ/mSZvzs7CJ2dsagnmyanoCglamJsZgnrW1jb2dDcg9QB4C8PEBAFWP + FTAV/UJaAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAMAAABFNRROAAAABGdBTUEAALGPC/xhBQAAAwBQTFRFjo+P + rrO5r7S6sre8tLm9uLu/u77BvL/CwcPFwsTGxsfIysvMzM3Ny8/VzdHWzdHX1NTV1NXW0NPY0NTZ0tXa + 1Nfb1djc29vc2Nve2tzf3N3e3d/h4OHh4OHj4eLi4eLj4uPk4+Tl5OXl5ebm5ufn6Ojo6enp6enq6urq + 6uvr6+vs6+zs7Ozs7e3t7+/v8PDw8vLy9PT09fX19vb2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkW0KowAAAAlwSFlzAAAO + vgAADr4B6kKxwAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuND6NzHYAAABrSURBVBhXXcdt + F4EwFADgRaSIUmJ6w1rycnVn//+/mbvj7BzPt4f9Uc53Hpn4c7vY2BZ88ds6P5SnyG6T7Xgr5Io2LXgt + nwApbVZehhciHmnBuQdUb9XQwh5GpbUWtGWyr7rb436lOWYOYx8cDA/QsvGKEgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEU9AAdPAAlUAApfAAtoAAxvAA18 + AA6BAA+MABCRABGeABKhABOlAxaoBhmrCButCh2wDSC2FCe6GCu7Gi2+HTDCJTfGKz3ILkDLNEbNN0nS + RFTUR1fVSVnXT1/ZUmLcW2rdXWzgaXbicH3mfIjohpLpjJfrkZvun6juoarwqbLytbz1xMr2x8330NT5 + 3eD64+b87O798vP+9fb++fn//Pz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq2/ciAAAACXBIWXMAAA69AAAOvQFH+5CtAAAAGXRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS40Po3MdgAAA65JREFUSEt9lYuWsjoMhasgtQgKghQEESgC + Fu0PFN//1U6Kl9G5nO2sJbPI1yQ7AdHtL8nulF0f12/6E+g5dRwvqh//vvQH0LcHz0555nk0/0zzKyDF + cWM6p2sPZVHPi9/T/Ab07Y6svJr34zjKsU2pT1l3v/Ur0DXEXEV13UH8pI5RSjN+v/sDGMVhYZrpCQp6 + SUqeUbqfmvkBdOWK2IwxLj51ZVGq7n8Dhma3Ih7Lc8bbp66TxJDuVcQHAO4sMaF5lmWM85q/qZUy/gEo + d/Bqn8bwyetT/aZW9HL/HRhKYhh2HMeR+rDTm1RDx/Ab0DULw/Cjl1Lo/CGoqF0vrY2AsBfQlUTHwbvS + /KGa1yeyHkRFxfgEumZj6KvAf1eQpim0r7phMyLlIJKLvAPKHd1wHoEvxSl0n9bsxGbrm+wvIoGaFNC3 + m4WOHfcu//HtuqqTjOWMmWSUfXUWST8BXbPEBvadSZHvOtH9UgExg6LWBC2PRXG+JHA6Uu4sS0K63LVt + J8C6rptwBfKhbxBd7iwN4QQAOgHXXMPUIOMoMjfCCogcE2T7fppGsYfCrjtjjb4AfgB8Di6I9mSaBGN3 + ijcdN4aavFkJ9QsLJUV1KegZgCZEuJiTvr/yk+/YdmwSJdPJYBYmKuGks7A0q6gqyHFBXYg0APDYtXWd + RwEL7oATg7HBbC3lBfyhyCqK6gwp0AFpiQWAFLxmNfz5gW9ibKdgMFkvwB9oV9CZBTUlNOnRGmlLy5o7 + qiKWxfkVynL9NABbF5udtURWojIQzaIQ30oUzpCmafOVaOtTnsZqDtBxC7aqcv4l2t3QkMCxSdPfUL4l + SNvqc7yvWZ5Gge/aYFVmmrN1B+tTLDQFFDQJdzs+gK08P4TlYWvM5zjI4ihwHQXEZOb1sofhLhVQXS60 + LDlsxg0NV94KoBRiqAQOuIQjY8alAB+TDaLKn4R2/+B8NTg5DGN/be4IcVQCADDSdmpWyQ66LipKq35U + 8QDcpZBwKmyadkTwDLZBAcofSovnG/YJwNK25YTokEAPiG9ALQAcQ3g46bGVj7Av4Db2CjEBgQyuYcBw + q0uVALI7XJ/x7wAgHS8PgOi6beimAlTbx6bppn4nfQDqZ4erLLDjYai2oYD1qYZHv5O+AfB2EirLtmwO + C0wTtT7q5fKlHwC0InjDRZtv4cGiNJnG9aWfACBDL+HJPWyX2Er466fkrt+ASaOAWYY73r3Vr/QnALMU + TdN+1gP6HwC66Ydv599u/wFxKBe9ZCaNnAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEVDQwBVVQBbWwBmZgBvbwB3dwCD + gwCHhwCJiQCSkgCWlgCYmACkpAWnpwerqwqurg2xsQ+zsxG2thS8vBu/vyDAwCHDwyXHxyvLyzHMzDTP + zzrR0T3W1knY2E3Y2E/a2lXc3Fne3mHf32Pi4m7k5HTn54Dp6Yrq6o/s7JXu7qLv76Xw8K3z87j19cb2 + 9sn399L5+d76+uT8/O39/fP9/fb+/vn+/vz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyxEXdAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg + djMuMzap5+IlAAADtElEQVRIS32VD7tyTBDGt0hCFJHlkLBCq/axVt//m72z6nTq/HnvznXlXOa3M3PP + ELr9JdGf8uvj+kV/Apxi1/Xj5vHvU38AvDv4TkZz38fFe5pfAcGOW8s9XTmUhX0/eU3zG8C7vbn2G8rH + cRRjl+EAk/5x7zegb01rHTdND/GTeoIxzun97g9gZIeFZWUnKOgpIWiO8cfUzA+gr9aGQwih7F1XEmfy + /jdgaPdrwydFQWj3qeskNmQfMuINAHdWuoGLPM8JpQ19USdE8gOQ7ujrjyyBT9Gcmhd1jIuP78BQmZrm + JEkSyw85vUg2dIy+AX270LQgfiqDzh+CirrNyt4yCHsCfWWoeviqrHiooc3J3Aysxmz8BPp2q6nrMHhV + mGUZtC+7ITNTiIGlF3EHpDuq5j4Cn0oy6D5ryInMNjfBLyyFmiTAu+1C1V3vruDx7Xmyk5wUhFjmKHh9 + ZimfgL5dLTU9cCfFgefG90sJJASK2phodSzL8yWF05F0Z1UZRl94juOGuqqqFlyBAugbhFd7W0HLFAA8 + AddCWWLNGEeWe7Eugdi1QE4QZFmc+Cjq+/NSwU+AHgCfG0Kw7mRZhq57U7zlegnU5M8qqJ/ZKC3rS4nP + ALQRWpZzg/MrPQWu4ySWIWW5OczCQhWcdGa2Ypd1DTkuqI+QAoA+9l3TFHFIwjvgJmBsONsIcQF/MLLL + sj5DCnRASmoDIBhtSAN/QRhYuu5kYLC5WYA/0C7DMxtqSnHK0QYpK9ueu7IikifFFcrygiwEWxfbvb1C + diozmIqNIb4TKJohRVHma9Y1pyJL5Byg4w5sleX8S5W7oZEJx6Ytv6FiZyJlp871j4YUWRwGngNW5ZY1 + 2/SwPuVCkUCJ02i/pwPYSotDVB122nyuh3kSh54rgcSY+VxwGO5KAvXlgquKwmbc0HClHQNKIppM4IJL + eqzNqGDgY7pFWPqT4v4fnC8HJ4Zh5Nf2jhiuTACAjpS9nFW6h67LGuOajzIegLskEk2FTdOODX0G2yAB + 6Q/G5ecb9hOApe2qCVEhgRoagQa1AHCM4OHEx048wr6A28glYgECGTxNg+HWlzoFZH+4fsa/AoD0tDoA + oqqOploSkG0f27af+p30BsifHSqzwI5HkdyGEtanHh79TvoGwNuJySy7qj0sljiV6yNfLl/6AUArjLaU + dcUOHiyM02lcX/oJADJwAU/uYbda2il9/pTc9RswaWQwy2hP+5f6pf4EYJasbbv3ekD/A0A3fPh2/u32 + H6YwJdAl+mOdAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEUAMQAAPwAAQwAATAAAUwAAWQAA + YwACZwICaAIGcAYJdAkQgBARgRETgxMWhxYZihkbjRsdjx0gkiAnmCcrnCstnS0woDA3pTc9qT0/qz9F + r0VJsUlUuFRYulhau1pfvl9jwGNrxGttxW13ynd9zX2J0omS1pKX2Jec2pyo36ir4Kuy47K9573K7MrN + 7c3V8NXg9ODm9ubu+e7z+/P2/Pb5/fn8/vz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6Ra9RAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg + djMuMzap5+IlAAADs0lEQVRIS32VDbt6TBDGt0haRRFZImGFVu0fq+//zZ5ZvZw6L8/dua6cy/x2Zu4Z + Qre/JNpTen1cv+lPoGPEtt2wevz70h9A1xxcK2Gp65LsM82vgODHzdI+XTsoi7hu9J7mN6BrdnjlVqwb + hkEMTUI8QtvHvd+AtsbLVVhVLcSPaikhJGX3uz+AgR9mSyM5QUEvCcFSQvZjMz+Atlhhi1LK+KeuNEzk + /W9AX+9W2KVZRlnz1HUU75O9jPgAwJ2FjkmWpillrGJvaoSIfgDSHX21TyL4ZNWpelPDO7H/DvQF1jQr + iqJQfujpTbKhY/ANaOuZpnnhSwl0/hBU1KwX5oZD2AtoC6zq/ruS7KGKVSe87nlJ+PAE2nqjqSvfe5ef + JAm0L7uhEyxEz+OLuAPSHVWzH4EvRQl0n1T0RCfrm+guPIaaJNA1m5mq285d3uPbcWQnKc0oXeJBdOWZ + x90ItPVirumePSr0HDu8X0ogolDUGqPFMc/PlxhOR9KdRYFxmzmWZfu6qqoGXIE86BtEFjtTQfMYADIC + 10yZEw0PA0+dUJdAaBsgy/OSJIxcFLTtea6QF8AOgE/BBd6cDAPrujPGG7YTQU3upID6uYnivLzk5AxA + HaB5PsVdd2Unz7asyMBShp3CLJaogJPO3FTMvCwhxwW1AVIA0Ie2qaos9Kl/B+wIjPUnayEu4A9BZp6X + Z0iBDkiJTQAEZxWt4M/zPUPXrQQMxusZ+APtcjIxoaaYxB1aI2VhmlNbVkTTKLtCWY6X+GDrbLMzF8iM + ZQasmATiG4GCCVIUZbriTXXKkkjOATpuwFZZzr9YuRsaYDg2rrsbyrYYKVt1qu8rmiWh7zkWWJUaxmTd + wvrkM0UCOYmD3Y71YCvLDkFx2GrTqe6nUeg7tgQiPHE70cFwFxIoLxdSFAw244b6K2s4UBLRZAIbXNJD + bcIEBx/jDSLSn5i0/+B8OTjR90N3re8ItmUCAHSk7OSs4h10nZeElN0g4wG4SyLBWNg47RDrE9gGCUh/ + CMmfb9gnAEvbFCOiQgLVx54GtQBwDODhJMdGPMK+gNvQSWQJCGRwNA2GW17KGJDd4fqMfwcAaVlxAERV + LU1dSkC2fazrdux31Acgf3aYzAI7HgRyG3JYn7J/9DvqGwBvJy6zbIv6MJuTWK6PfLl86QcArXBWM95k + W3iwCInHcX3pJwBI3wl4cg/bxdyM2eun5K7fgFEDh1kGO9a+1S/1JwCz5HXdfNYD+h8Auun6b+ffbv8B + CV4lp0vtr3kAAAAASUVORK5CYII= + + + + + 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 + SUwPzmIlAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEUAE1MAGWsAGnEAHoEAIYwAI5cA + J6cAKK0AKa4AK7kALL8ALcAGNc0HNs4JONAMO9UPPtgRQNwTQt4WReEdTOYiUekjUuomVe0tW/EzYPQ2 + Y/U9aPhAa/lLdf1PeP5Rev5Xfv9bgf9jh/9lif9wkf93l/+DoP+Mp/+Rq/+Wr/+juf+mu/+vwf+5yv/H + 1P/K1v/T3f/e5v/l6//t8f/y9f/1+P/5+v/8/f////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcxoJWAAAACXBIWXMAAA69AAAOvQFH+5CtAAAAGXRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS40Po3MdgAAA7dJREFUSEt9lYuWsjoMhasgIqCgIEhBELkJ + WLQ/pfj+T3ZSvIwzzpztrCWzyNckOwHR7S/x7pReH9dv+hNgBNu2G9aPf1/6A2DtwbUSkrouzr6n+RXg + 9LhZ2qcrg7Kw60bvaX4DWLvTV25N2DAMfGgT7OGie9z7DegafbkK67qD+FFdgTFOyf3uBzDQw2xpJCco + 6CXOSYrxfmzmA+jKlWYVRUHod12LMBH3fwB9s1tpbpFlBWmfuo6ifbIXEd8AcGehajhL07QgpCZvajmP + PgDhjrraJxF8svpUv6mljO9/An2pK4oVRVEoPsXpTaKhY/AD6JqZonjhSwl0/hBU1K4X5oZC2AvoSk1W + /Xcl2UM1qU/6uqcVpsMT6JqNIq98711+kiTQvuimmOic9zS+8Dsg3JEV+xH4UpRA90ldnIrJ+sbZhcZQ + kwBYu5nJqu3c5T2+HUd0khZZUSz1gbPqTGM2Al2zmCuqZ48KPccO75cCiAooaq2jxTHPz5cYTkfCnUWp + aV3mWJbtq7IsG3AF8qBvEF7sTAnNYwDwCFwzaY4VbRho6oSqAELbAFmelyRh5KKg685zCb8AcgB8qnFO + 25NhaKrqjPGG7URQkzspoX5qojivLjk+A9AEaJ5PNcau5OTZlhUZmpBhpzCLJSrhpDM1JTOvKshxQV2A + JADUoWvrOgv9wr8DdgTG+pM15xfwByMzz6szpEAHJMUmAJySuqjhz/M9Q1WtBAzW1zPwB9qleGJCTTGO + GVojaWGaU1tUVKRRdoWyHC/xwdbZZmcukBmLDLpkYohvOQomSJKk6Yq29SlLIjEH6LgFW0U5/2Lpbmig + w7Fxw24o2+pI2spTdV8XWRL6nmOBValhTNYdrE8+kwSQ4zjY7UgPtpLsEJSHrTKdqn4ahb5jCyDSJi7j + DIa7EEB1ueCyJLAZN9RfSUuBEogiEtjgkhoqE8Ip+BhvEBb+xLj7B+eLwfG+H9i1uSOaLRIAoCJpJ2YV + 76DrvMK4YoOIB+AugQRjYeO0Q02dwDYIQPiDcf58wz4BWNq2HBEZEsi+5ilQCwDHAB5OfGz5I+wLuA1M + IEtAIIOjKDDc6lLFgOwO12f8OwBIR8oDILJsKfJSAKLtY9N0Y7+jvgHiZ4eILLDjQSC2IYf1qfpHv6N+ + APB2oiLLtmwOszmOxfqIl8uXPgBohZKG0DbbwoOFcTyO60ufACA94/DkHraLuRmT10/JXb8BowYKswx2 + pHurX+hPAGZJm6b9Xg/ofwDohvU/zr/d/gOjFSyLIyVhmAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEVDQwBVVQBbWwBmZgBvbwB3dwCD + gwCHhwCJiQCSkgCWlgCYmACkpAWnpwerqwqurg2xsQ+zsxG2thS8vBu/vyDAwCHDwyXHxyvLyzHMzDTP + zzrR0T3W1knY2E3Y2E/a2lXc3Fne3mHf32Pi4m7k5HTn54Dp6Yrq6o/s7JXu7qLv76Xw8K3z87j19cb2 + 9sn399L5+d76+uT8/O39/fP9/fb+/vn+/vz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyxEXdAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQg + djMuMzap5+IlAAADtElEQVRIS32VD7tyTBDGt0hCFJHlkLBCq/axVt//m72z6nTq/HnvznXlXOa3M3PP + ELr9JdGf8uvj+kV/Apxi1/Xj5vHvU38AvDv4TkZz38fFe5pfAcGOW8s9XTmUhX0/eU3zG8C7vbn2G8rH + cRRjl+EAk/5x7zegb01rHTdND/GTeoIxzun97g9gZIeFZWUnKOgpIWiO8cfUzA+gr9aGQwih7F1XEmfy + /jdgaPdrwydFQWj3qeskNmQfMuINAHdWuoGLPM8JpQ19USdE8gOQ7ujrjyyBT9Gcmhd1jIuP78BQmZrm + JEkSyw85vUg2dIy+AX270LQgfiqDzh+CirrNyt4yCHsCfWWoeviqrHiooc3J3Aysxmz8BPp2q6nrMHhV + mGUZtC+7ITNTiIGlF3EHpDuq5j4Cn0oy6D5ryInMNjfBLyyFmiTAu+1C1V3vruDx7Xmyk5wUhFjmKHh9 + ZimfgL5dLTU9cCfFgefG90sJJASK2phodSzL8yWF05F0Z1UZRl94juOGuqqqFlyBAugbhFd7W0HLFAA8 + AddCWWLNGEeWe7Eugdi1QE4QZFmc+Cjq+/NSwU+AHgCfG0Kw7mRZhq57U7zlegnU5M8qqJ/ZKC3rS4nP + ALQRWpZzg/MrPQWu4ySWIWW5OczCQhWcdGa2Ypd1DTkuqI+QAoA+9l3TFHFIwjvgJmBsONsIcQF/MLLL + sj5DCnRASmoDIBhtSAN/QRhYuu5kYLC5WYA/0C7DMxtqSnHK0QYpK9ueu7IikifFFcrygiwEWxfbvb1C + diozmIqNIb4TKJohRVHma9Y1pyJL5Byg4w5sleX8S5W7oZEJx6Ytv6FiZyJlp871j4YUWRwGngNW5ZY1 + 2/SwPuVCkUCJ02i/pwPYSotDVB122nyuh3kSh54rgcSY+VxwGO5KAvXlgquKwmbc0HClHQNKIppM4IJL + eqzNqGDgY7pFWPqT4v4fnC8HJ4Zh5Nf2jhiuTACAjpS9nFW6h67LGuOajzIegLskEk2FTdOODX0G2yAB + 6Q/G5ecb9hOApe2qCVEhgRoagQa1AHCM4OHEx048wr6A28glYgECGTxNg+HWlzoFZH+4fsa/AoD0tDoA + oqqOploSkG0f27af+p30BsifHSqzwI5HkdyGEtanHh79TvoGwNuJySy7qj0sljiV6yNfLl/6AUArjLaU + dcUOHiyM02lcX/oJADJwAU/uYbda2il9/pTc9RswaWQwy2hP+5f6pf4EYJasbbv3ekD/A0A3fPh2/u32 + H6YwJdAl+mOdAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEVgBgB9CACECQCXCgCkCwCwDADE + DQDMDgDeDwDlDwD/AAD/AAL/AAX/BAD/AA3/CwD/DgD/AxP/BRX/DB35EQD+EAD/ESL/Hy3/IzL/JTT/ + LDv/Lj7/OUj/PUv/SVX/U2D/YGv/bXn/c37/eYL/i5T/jJX/lqD/pav/t73/u8L/xsn/1tn/3eD/5+n/ + 7/D/9PT/+Pj//Pz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADRANgHAAAACXBIWXMAAA68AAAOvAGVvHJJAAAAGnRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAAOkSURBVEhLfZWNlqo6DIWrILUCIoUiiEAR + sGgPpfj+D3dT/BlnnLnbWUtmka9JdgKi21/Sw6m4Pq7f9CegBA0CN2kf/770B6D6g8tyUbguLb+n+RXQ + 8riLg9NVQVnUddP3NL8Bqt8S5rZCTdOkpz6nHuXD495vwNCRmCVtO0D8rIFTSgtxv/sBTPKwiuP8BAW9 + pLUoKN3PzXwAQ80I45wL+V1XnuTm/g9g7LaMuLwsueifus6SY743Ed8AcGeNCS2LouBCtOJNvdbpB2Dc + wWyfp/Ap21P7pl4qvf8JjDVxHJamaWI+/PQm09Ax+gEM3cpxvOSlHDp/CCrq2ZrtJIS9gKEmNg7flZcP + taI9ETbKhsrpCQzdzrFZ6L0rzPMc2jfd8AXRepTZRd8B447tBI/Al9Icus9bfuILdtPqIjOoyQCq361s + HPh3eY9v3zedFLzkPCaTVs1ZZmoGhm6NHewFsxLPD5L7pQFSDkUxgtbHqjpfMjgdGXfWNSFD6TMWhNi2 + 7RiuQB70DaLrLbMQzgCgM3AtLUwdMk2y8BNsgCSIQczz8jxJXRQNwxlb9AWIA+BLcEH2pzgmGPtzfBz4 + KdTkLmqoXzKUVc2lomcAugjhakmUuoqTFzCWxsQoDgqYRYxqOOksmcWqpoEcFzREyAIAT0PftmUS8vAO + BCkYGy6Y1hfwhyJWVc0ZUqADsjIGgJai5S38eaEXY8xyMJiwFfgD7Uq6YFBTRjOFGLLWjC0DUxEv0vIK + ZfleHoKtq92WrRHLTAZiMQrxvUbRAlmWtWSyb09lnpo5QMc92GrK+ZdZd0MjAsdmnbqhckOQtbGXeN/y + Mk9Cz2dgVRHHCzbA+lQrywAVzaLtVoxgqygPUX3YOMslDos0Cf3AAClZuEorGO7aAM3lQutawGbc0HgV + vQTKII5JEIBLOHEWQkvwMdshavzJ6PAPzjeD0+M4qWt3R0hgEgCAkbU1s8q20HXVUNqoycQDcJdBormw + edoJwQvYBgMYfyitnm/YJwBL29czYkMCOySeA7UAcIzg4aTHXj/CvoDbpAwSAwIZfMeB4TaXJgNke7g+ + 498BQAZRHwCxbebYsQFM28euG+Z+Z30DzM+OMFlgx6PIbEMF69OMj35n/QDg7SRNlk3dHVaYZmZ9zMvl + Sx8AtCJFJ2RfbuDBojSbx/WlTwCQUWl4cg+bNWaZeP2U3PUbMGuSMMtoK4a3+o3+BGCWsuv67/WA/geA + btT44/zb7T/qbgW9TfW/8QAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAD0AAAAUCAMAAAAJH8UlAAAABGdBTUEAALGPC/xhBQAAAwBQTFRFTExM + WFhYW1tbYGBgY2NjZGRkZWVlZmZmZ2dnaWlpampqa2trbW1tbm5ucHBwcXFxcnJydHR0dXV1dnZ2d3d3 + eXl5e3t7fX19f39/gICAgYGBgoKCg4ODhISEhYWFhoaGh4eHiIiIiYmJioqKi4uLjIyMjo6Oj4+PkJCQ + kZGRkpKSk5OTlJSUlZWVlpaWl5eXmJiYmZmZmpqam5ubnJycnp6en5+foKCgo6OjpKSkpqamp6enqKio + qampqqqqq6urrq6usLCwsbGxsrKys7OztLS0tbW1tra2t7e3uLi4ubm5u7u7vLy8vb29vr6+wMDAwcHB + wsLCw8PDxMTExcXFxsbGx8fHyMjIycnJy8vLzMzMzc3Nzs7Oz8/P0NDQ0dHR0tLS09PT1NTU1dXV1tbW + 19fX2NjY2dnZ2tra29vb3Nzc3t7e39/f4ODg5eXl5ubm5+fn6Ojo6enp6urq6+vr7e3t7+/v8PDw8vLy + 8/Pz9PT09vb29/f3+vr6+/v7/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/DPJbQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAABlUlEQVQ4T52T + 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 + AABJRU5ErkJggg== + + + + + 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 + /wH43mXDvz/ONMu59lrKAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAD0AAAAUCAMAAAAJH8UlAAAABGdBTUEAALGPC/xhBQAAAwBQTFRF//// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyO34QAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAE0lEQVQ4T2MY + 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 + WFhYW1tbYGBgY2NjZGRkZWVlZmZmZ2dnaWlpampqa2trbW1tbm5ucHBwcXFxcnJydHR0dXV1dnZ2d3d3 + eXl5e3t7fX19f39/gICAgYGBgoKCg4ODhISEhYWFhoaGh4eHiIiIiYmJioqKi4uLjIyMjo6Oj4+PkJCQ + kZGRkpKSk5OTlJSUlZWVlpaWl5eXmJiYmZmZmpqam5ubnJycnp6en5+foKCgo6OjpKSkpqamp6enqKio + qampqqqqq6urrq6usLCwsbGxsrKys7OztLS0tbW1tra2t7e3uLi4ubm5u7u7vLy8vb29vr6+wMDAwcHB + wsLCw8PDxMTExcXFxsbGx8fHyMjIycnJy8vLzMzMzc3Nzs7Oz8/P0NDQ0dHR0tLS09PT1NTU1dXV1tbW + 19fX2NjY2dnZ2tra29vb3Nzc3t7e39/f4ODg5eXl5ubm5+fn6Ojo6enp6urq6+vr7e3t7+/v8PDw8vLy + 8/Pz9PT09vb29/f3+vr6+/v7/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/DPJbQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAABlUlEQVQ4T52T + 6zcCQRTAFxEljzxC2UjYapXXrrdED1t6SFa02tqdDSVKQp7/ui1z6NtOfp/u3Ht+M3PuuRcDTWR8IRGG + aDTZvGcjXwgFUi1c8GeztvXbz6+vJy6YkGBKkV/7ZGIPPL/JvNduImmYVALa6fUpLyvel8rlh0rlNX/2 + k1Xkxz4xTXoZJgauZW4equFEI6tMw44OWrZ3ZXzJ8wuuIKxxsUZNGdlOrejmaYqmKIo+DMezafyuhto2 + DCQtGtpBuqxOh510+9mwU5u8zsKqElhumhh5SSzr2mfMJsId3HTkF8akS0QdEzpJ7UfZZ1s0DI9S7iXL + c/VUwxdYtL9jY1pX71sxk/IS4yQ9a+wOXWVUQTaMaE9iqh4xF/dRuGtVv18icCCQxAGsKoHx3qhFbfZs + 2g3jQzu1x51hvhjj0HsuSWIE79TjQ4b+nqMi0+WJoM5K3a7DB00dar21beX2bMvewpbCOZeEgFGl65vL + Fo7BfzY0J0TP9wb8DAfPSPza8vtA3LWlkHe7TpMtI+VggAQA31EYtvsm5zkIAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAD0AAAAUCAMAAAAJH8UlAAAABGdBTUEAALGPC/xhBQAAAwBQTFRFmdXV + mdramdvbmdzcmd3dmd7emd/fnt/fmeDgm+HhmeLimePjmeTkmeXlmebmmefnnuPjn+fnmejomenpmerq + mevrmezsme3tme7ume/vnejonO3tnO/vmfDwmfHxmfLymfPzmfT0mfX1mfb2mff3nvPznfT0nPb2n/f3 + mfj4mfn5mfr6m/v7nPj4nPn5nfv7od3dod7eot/fpt7eoOLiouXlpubmp+fnoenpo+rqo+vroe7uoO/v + purqqO3toPHxofLyofPzo/T0oPX1o/b2p/LypPT0pfb2p/f3ofj4ovn5ofr6oPv7ofz8pfj4pvn5p/v7 + qvT0q/f3rPDwrfPzrfT0rPX1qvj4qvn5qfv7qvz8rfj4r/v7rfz8serqsu3ts+/vuezsuu/vvunpve7u + sfPzsfn5sfz8sv39tvn5tv39ufLyuvb2vPHxvPPzvvT0uvr6uP39vfr6vPv7vv39wurqxejoxuvrxezs + xe3txu7uzOXlzObmzefny+rqyezsz+rqzezswfHxw/LywPPzwvj4wfv7wf39xfz8zvDwyfr6yPz8yP39 + z/z8zf7+0uPj0+Tk0ubm1eHh1eLi1ePj1OTk1OXl0urq0/f30f7+1f7+2Pv72/7+3/7+4vz84/7+5/39 + 5f7+5v//6fv76v7+6///7P//9f//+////P//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFkrd1wAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAABpUlEQVQ4T2OY + hACT693i66Bs4gCS7uoQ1e7ecNeUfiifCIDQXWHj2LN85Yr5RZ4JDVAhggCme0qisHP63GUgsKjDqwwq + SghAdE+usRNV0Y/t65sJBLMWdSeCRQkDsO7JpRaiKlpa3ulZQFA4c344KbonJAuIKYOApo+vr29JUfCM + VIgkQQDUXWPLLaEIAZra2rExZosXtkFlCQGGSeVWnA6ycnLicrKyciqa+noyxplZxVBZQoBhmqC06ZJM + OW4mMTFRSWUtBdvZcXwZBbVQaQKAoYpZ2mj5THdJWWF+IXllOfMFc1o5okrSpkLl8QMGEw4Zo6XtsZHu + ksKSChIihkFZbay6kX5E6hZiYGXvytLRVRWztudtmmcpnFEsKenSCJUmABjyQlNFWKWUlWSFhXmSlsxy + 5Ilqj8gmUjMwzKdNqQwUZuUV4xfiNvBr92RT9w+DyhEG4LQ2rcVDiIWDV5xRpj1AUdJtOliGGABJ55Mm + trgLsXJxicWWeDeTk0MntkTnO3Fr6OVC+UQBuG5gXpncpCaRMwXKIwog6QaCiZ2kaJ40CQBLsmMl+qL9 + EAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAD0AAAAUCAYAAAA+wTUXAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA68AAAOvAGVvHJJAAAAGnRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAATSSURBVFhHzZh/TJR1HMcfyJPjuAOO40QQ + DrnljyOgAkJy0QTFZiKpRc7KlpbD3DTWZrrZr61Wbm6VS1zNWpttOVs/rJlbWZvLzR/4g9JSNzVZqa2J + iT84uQvu1ef7fTjl2IPZ9Bh/vPY9nufzfL/P+/l8Pz++GBgG/4sZM4lMqoF7q8A/1tpmiHPjoquqhfuJ + +PNhzTpY/xFUVpsfoLgMhg83sXp2iPHfogsKCM2Zw5X8bLrHjoG166HjAoTDJrv2EXm2CQoriNTOgEDR + oIsP2my0yxjlYu/1gbi+6NxcIkua+NOTTOSeCbBkOexsgRNtsbT9Dgd/hVVroGySUGk9X5xorquTQUkx + md17fSAGFK227d+FAc6n2ukO3A3VD8HiZbBhE2z8HDZ9afLpZvhiC3y1lZ5fjsBbsvXTvJZzxoubF+12 + Eyy+k5Ojc/gr3Q55heArNplQK95eAStei+WlN0zhLXvNLZ7nj50zztyc6HHjubLsBfbmeTiTJIJtbkga + EUtOAKY1QP1jJg3z4c136Hx9NcGaSkIfvg/zFuikFzN3HPl4yhQZrolelJVlaRflmui6ev6YOoVWp8Hl + pES5NmxglNfHS9wqzy9s0omspayYcOs+M7aV56dNF9vYxeLFTqGv6HerpdLIOBCGSladixZzqmQMLW4b + Ib+PSLLEtBBMdnDWlkAo2X71mgLnSNPjk2fSM7GWrrwRfH2Hn66lEvMrRbCKfYvF4sUBux2HwyE/TdE/ + jpT363O/PwZPL2RXURFnRo3iyO1ifPioeK+RsDeTn12JbE4xOOuyE04zCLv7iB59F5eyRnOwpJTIJxs5 + WP8gLekZ8PyL8MxzkDF4yexkdjY+n09+mqJ/SkiwtItiRBoeZ4PLRVthId/7RUz7OZ2RI5UTCWWkcHlk + Fu2uhKtEvCJMRF9IdrO7vNTM2D/skIS2nG1OWWz+Eh3jzJqn57Ba9FajdmJVr6e9Xi/HU1Ms7aIY2wOF + fOt2cmFsAd8p0cdOmGVHeWuuJKSScsLJwzjttNHpSYPUVM4PT9R/b8n30lX/sJnBxcNadJm0pyrRlUun + JrZWi8aDyYISXS4e7/B4LG2iGAcyMml2GPqFt2WnEVrTDMteNZOUKlfpLr21LwX89IzxcVgSXfvSRu3d + Q6WlHM2UBZpWyjMvcy7dQ9DpMNvSMmlmLBaMF8eE/b2j1f2+GCxYxPkZDQSfatQCvklNojXPR1eBZGgp + WSqGL6YbtHlctLpT+O3JJ8zdsGUbl8sr2J4uZU1t6bffo/u+afRI6dLdm8Vi8ULFcJGMUT4olnfvvWeF + obdgzijdY6v6Gpo9V4vf6riNQ44EroiXVSyrONkjCe0zX44Wp0NA+m21Q3THprazxLGex2KheNK/ZK2q + qLC0i6KsYi82PCpNRwOhmulavBK1xyVf05mkxW8Sz5/yj4PVa3XsduX69ZZWpUufuPrPNwjcvOgosyRB + SZyGqmo5npmmxe92DmOH085p8bZqStQBQ3ldt55TH7CeZxC4daIVUgZUp6bEh+se0fHaMbGa/Sk2usdJ + spJazbyFpp3V84PEP0Lfo6U6alrZRbm+6CjqfKx6canlSngwUEKHS3LBilf0f1IsnxnC3JjovqgPoLyv + xMqJzNJmSGPwL6Z88yCGTqF9AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAD0AAAAUCAYAAAA+wTUXAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA68AAAOvAGVvHJJAAAAGnRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAAZbSURBVFhHtZh7TJVlHMexVZtbtlxZ5uwy + y1Zbf1htNnNTqa1lqaMBpk5L5iWUcmhoJpJKeCEV4RwR5RLqUTyOA5y4y81OIAfOIUXPoRChEJCLIMNj + MFPbN74/9p5xDi8XTf747OW8l+d9P8/v9/ye58Fjn5cX7ofTfuHIn52NooWZSPoiRPWe0SQ5NBSFx3U4 + Ex8vZB85goyDBwX+TgsPV32uPyOWNgbtx5mPM5DxZgaa4prQfLIZFm+LkLUsDhqfxarPPQyOBgUhS5cE + k8kEU6kVecUVQmbBOZw05kETdwI7Iw5jV8QhHIiOhy5Jj5zUNJzavl21vWGlKZPsFwndCzoRpuw9xz3c + vfOv4Kh04ErwFZS8X4KUTzQ4tfp7RPouVG3rQbFYLCJpvdIBS50DlvoeF0prHUJJ9Q2YqtqR/9tVFJVX + wW6345Cf34D2hpSmcNGaVGif0KJwTgHqwurgqHDgdsPtAXTXdEsGMPIZa6JV23tQ0g7FwlZTj4aWDly9 + fkuou9Yp5xhtRjokbK8Qvl+D1J8z8fvlWhQZjKrtDSqdviEKSTN+EmFG0fa5DfU763Ej64YLnXmdQldR + l1Nc/9Ee1TYflNzEEyLa0PkPbI3dThh1ia69WSLMTPiz9Rbab93FzZ47KM7MUW1PVTppSTi0k7UiXDyz + WKA4o0jxhv0NLjRGNoo4s8C6yCpprtauO9rFPqrn3eGYpjCpud4r3qwOrzV39QmTX/TJqu25SDOdjy8I + w44JOxD7VCxyp+Yi7408F9gB9hV22AJsqF5bjerAaolurbYWKe+loCq2Sq4lb97h8iI1Sr6cj/MfvIuj + vvNVr/dHiSDF/mjtE3SHncJ7um/fRcfNHhxeuVq1Lac00zlhejSCHw1G/Lh4GCcakfZsGozP9R0VeJ5R + t861otK3UooY0byjQUtFi6Q4OyA9ZN+Al7lT7j0LeGwcuic9P6Q8C6OS3jpTC8IN9Ui3dvw/ac69ca/H + ibD+VT10Y3V9PKOTDuDRea6X/hFnyrOyb5qyCbatlyTVWfDcXxTtvQAn53i6UOX5tkgrDCV/mYWsVyo8 + pQ7fxduxaNdF5F/skHMKFFbG89XGa6qVm3gwIoxS4iuJCJsYJpFiehomG6QT/Mf4S6pHj4kWFGlGO+ut + LCTMSECDoQGJ8xKxd9JeGfOUj128xuVF+Us/dBEciq6pL+LcRtfnOU+zeFE093w7VkZUSbQ5hhUUaUa6 + PLfA5fn+eHB6Wff0OhybdgwbJ2yUOZhFyTzXLBFm5Hc/vtsJO4PSPLKz2EksYBQNGhskqc4xLh234Qfn + ixhp/aw5LrhH+s6T49E4ezryApYjZvkylw/lKozChGIsXNr0JhFXZBVhrh/Kc/Jcnu+PR+jLwSJLOR45 + 5/Kj+fEsUkxjRpfC7ASOaaY8KzvvNy8zSwVnSq9/ZL2MdaZ9uXcptEuWqL5UQRnTlG3ynKEqq5C5WyNT + Ump5m6Qyp6t5Wyvx6bZLLtMUpQk7Sa0d4sGp6TOPz+SDKVEbXysSLFIUZkSZ1uwUJerZq7LRXtwuqc3n + mdJ1e+pkbLNjuJBJDfhR9YX9KVnq6ZQdroN4nQuSqIy/nOnt+U0FvEIuoKbJ4RRmlPl33NoA1XaIR+W2 + UonWhc1lIsAUjXotCgUzC5A9JdsZ5YjxEU5hpnSXqQs5s3OkDjArWo+2yhzNdkYiTJjyw8kq8D5WZIqX + WOxSzJaGVeBA0nlZj3OpyuLl+LtHGFKajbG0J6z4CmWhmbCssog8I09JRplHwkwglKMkixnvYwexinMc + j1TifmG7lCotsyInJ1eOlFd+c5NB8ba2NrmPu67BvmXAiozyJd8aRYzyrN5KB7CK87d+ml7GPccuKzhT + mtLcibm397CgAKUoyN0W/1aQ3VcvFyorUVNTI+d4HGxcqy5DCacc04ZkFHsVQzNBI+KcwhjphJcSnFWa + ncP73Keo0UAfGQWDwYCzv56DuczsIs7OILzOI3dYNrNZNdqDSiuwal4+cEnSniutwvmFEnWmNmFNeNhb + ycE4tmWLCFGYUoSSgYGB8PHxhb+/P2JiYpzSTHG1doaVJpTiupzYI8plDLNSl31dJOfUnhktKM7dk7u0 + Isyonz19etAlKBmRtDvZ2w6iYGvvtnOUitZI4Hyu/MuIGPcNv9bvwwv/AUwhNrQbsABCAAAAAElFTkSu + QmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAD0AAAAUCAMAAAAJH8UlAAAABGdBTUEAALGPC/xhBQAAAwBQTFRF//// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyO34QAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAE0lEQVQ4T2MY + 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 + 2Zu+iiHUgUsAAAAASUVORK5CYII= + + + + + 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 + YII= + + + + + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyO34QAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAAE0lEQVQ4T2MY + BaNgFIyCYQUYGAAE2AABE91XygAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAD0AAAAUCAYAAAA+wTUXAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA68AAAOvAGVvHJJAAAAGnRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAAZfSURBVFhHxZd9TNR1HMeRhSvJNUoNrDRL + K521Rbm55R+NWjMrN0trs1mjJ+csszlXM2czNdRUJoqaZ6YkiIj4gKIgoiDi8SxHhxwPwnEgTyooDwJ3 + 3Lvf+3P+rjvud0g+1B/v/bjjft/f9/V9f55+PiXrjBioynUmXI84CLwegpszPodleZLm7+6bIoyoTKp2 + ++7SwWqY02pRcdKCkq2lbv/zpgFDX9GdgX3mTFifHQXrxkjYduwAJoXA9tqbuDovHKawfM377pkU4JQM + AzLzylBsrER5eY2osKIe54wWHL9Qi2M5VfK3qrQLNSiKMXmsdVtoU8RfaN++B12jg2AbNw7YtB32llbY + u7sdysqBfd4i9E54BZ2fLYFlTZrmOncjy2Ej2lszkXQgFLs2jYBuvb+HDiR8haMFFlG83izak1WLE3ty + PNbrF5rA1pXr0BDwIKyTJgscIXHJ7K76BtiNpfJbut+4NFZzvTtV4+UsNNWmwlKhQ92f03Bthi9qp/qi + dKUvilJ9oE/0RVr8A0g9sw0xqSWIiM0SbTvXjMSIsx7raUITtmFDChqnvIGmIX7ioi3kPQd0zH432eKO + ipCYLOC9azejafZKjzXvRgSmmmsS0PZrKGx+fqIb3/qgLs8hgvNQqmuvYPOpGiyJTEZaah70+wwoDS9x + W88DmsB1q3UwjxkpDvc+/RJsT453SMlfCeUlqzwk8Hm5cjgDhTZuyNX83lXcMJ3u7rgoaglf5oSu/NQH + PWYfNBoGOaGbrrbht4IuLN2ZhfxE7TXdoAlMp3JGDHc4/NAwDxG+950PncKsULmHod0RMlkKXG/ofNRF + uz9IS8bFX6Pmg9ko+TlR8/+qVGhes8O/d0IXfzMIHZWe0Lvyb9we2hRZisaIZNRPfQvZ/o4F+xXBlZBn + /orzCmRO8ERxWkJccX4g0GWhc2S9zqAgr/B0uqI4FtkZq0SFcXOd+yhf5AhrNa9doZftzvEOTeDW3/eh + /vmxyAnwk5bkhFNEx10/U66OE7zrqRE4MWEc7IuWCjCv7OluD/slHVUL4tzEQ5a1bq3rDZ4u9/aY5Wo1 + xTh/b01whDfd7gsdFq33Dt28Nx/nJ05EfWAgSscGOpxSnLMNe0xcT/b3dYJ3BgyWq4S6kuvcpOHFl6Wg + GaZPQ84jAQJM96uWpbg9yPjdYudmVVBv19axo6SuqPeq4c221WmORs/0IPS8PQhthQ5grfDu1+mWsL2I + 8R+MS+PHI2VMoLQfFiW2KEK2Bz4uG2FR42cBVw6EG9S/GiyH1JWcLbA8IB4Yc9z2/hxYtub98zDFver5 + 0W5ydZpXit8JsDKMiJR7zWUJAt3TUSBOW398AtYffHD9qDY0C1m/0AzLlOFDJbwJLf1Wmbi4efvHX+Dm + BKV6K5ui2+oB8G8qfvRImdLE3VvQPCwpclOmueV137bBz8Z5jvajwlat/kOKqevvqJryQxLedLw4fIXc + Q+k/8azebFnsz2xZnOCKdBc91vNhpY4c4iMbThw93AHMFqS0J+at6m7bC89Ivhc/7IvmBXNhT09HcXAw + TIrrKjRTRCCUIte685THw/qK0IRltJVvKtT8DcVCRhlytyB3xUdOaFZv9mjTWUdOn8k+AP3Fehk/j2WV + I+58tfZERsCW6bPEWQIQnlcpVLdCj9CmR4eKWHEZDRxGGAU8KDWk6S5bV9fBdI8HaUopbv3BqmowFYjL + 5aYkCfWm5LUymZn07zp15PRWmcYIqsrrGMowk4FECcVuXbzkogpPVwnNfObfLGwMacJxBqejEtLPBTte + PpR7B9Kq/q3YYdgNzmZWCkxsZpXbjK3O2dSWRAPW7i+S6q075JjI+q7nMZxw0zfXR8lkpcITVu3fLHrM + f3FWyV1GBL/nQVyOPOeRu/dUSmE7lVwsucoRk1dX8e2Lb2HqGCouK/fw9dN1X15nb8JLFVZym2GtglPM + XXy50BnSPKT74bCm1KrOd2flygg4WXBVXjCyyq5JEduQ4bgy3JPijdif2+D24qEJ7ZSyKPu4hLLiKvOV + LyEEZ0hL3ivgWhX3vxKhT5e1Y+GKQwLPdkXtMNgkvAnOA9j+0xHnPf1Du4hO8gE9G3dLAWPLGui4eV+l + OM4wjlmVJPm7ZsthLA+PF62PiIMhqgRRUSdwPCzDec+AoVURnMMI9b8D35GM+BtD6z86AGwUowAAAABJ + RU5ErkJggg== + + + + + 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 + AABJRU5ErkJggg== + + + + + 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 + RK5CYII= + + + + + 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 + fhwAAAAASUVORK5CYII= + + + + + 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 + v93+A6MVLIsjJWGYAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEVMGwBhIgBoJAB2KQCALQCKMACZ + NgCfOAChOACtPACyPgDAQwDERADJRgDPSADRSQDUSgDZTwXdUwneVQvhWA7kXhbnYxzpZiDsaybtbinx + eDfzezrzfDz1gUP2hEb4ik/4jFH6lF37mmX9onL9qn3+roP+son/vJf/vZr/w6P/y7D/1sD/2MP/3sz/ + 59r/7OH/8er/9vH/+PX/+vj//fz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1zQOUAAAACXBIWXMAAA68AAAOvAGVvHJJAAAAGXRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS40Po3MdgAAA65JREFUSEt9lY2WqjoMhasgYrEKghQGRKAI + WLSHUnz/V7spOo7Oz93OWjKLfE2yExDd/pLqT/n1cf2iPwHJqev6cfP496k/ANkdfJLx3Pdp8Z7mV0CJ + 49ZxT1cJZVHfT17T/AbIbo/XfsPlOI5q7DIaUNY/7v0G9C121nHT9BA/qWeU0pzf7/4ARnFYOE52goKe + UornlH5MzfwA+mqNCWOMi3ddWZzp+9+Aod2vsc+KgvHuU9dJYsg+dMQbAO6sbEyLPM8Z5w1/UadU8gPQ + 7tjrjyyBT9Gcmhd1QqqP78BQYcsiSZLE+sNOL9INHaNvQN8uLCuIn8qg84egom6zIlsBYU+gr7Bph6/K + ioca3pzwZhA1FeMn0Ldby1yHwavCLMugfd0Nm2GlBpFe1B3Q7piW+wh8Ksmg+6xhJzbb3JS8iBRq0oDs + tgvTdr27gse35+lOclYw5uBRyfosUjkBfbtaWnbgTooDz43vlxpIGBS1wWh1LMvzJYXTkXZnVWHcFx4h + bmibpunAFSiAvkF0tScGWqYA0Am4FsaSWngcRe7FtgZi1wGRIMiyOPFR1PfnpUGfAD8APgcXRHdyHGzb + 3hTvuF4CNfmzCuoXBKVlfSnpGYA2QstyjqW88lPgEpI4WMtxc5iFgyo46SyIQcq6hhwX1EfIAMAe+65p + ijhk4R1wEzA2nG2UuoA/FJGyrM+QAh2QkRIAlOANa+AvCAPHtkkGBuPNAvyBdgWdEagppalEG2SsCJm7 + uiKWJ8UVyvKCLARbF9s9WSGS6gzYIBTiO4WiGTIMY74WXXMqskTPATruwFZdzr/UuBsaYTg2beUNFTuM + jJ05tz8aVmRxGHgErModZ7bpYX3KhaGBkqbRfs8HsJUXh6g67Kz53A7zJA49VwMJnvlSSRjuSgP15UKr + isNm3NBw5Z0ASiOWTuCCS3ZszbgS4GO6RVT7k9L+H5yvB6eGYZTX9o5gVycAwEbGXs8q3UPXZU1pLUcd + D8BdGommwqZpx9iewTZoQPtDafn5hv0EYGm7akJMSGCGOLCgFgCOETyc9NipR9gXcBulRhxAIINnWTDc + +lKngOwP18/4VwCQnlcHQEyTWKajAd32sW37qd9Jb4D+2eE6C+x4FOltKGF96uHR76RvALydhM6yq9rD + YklTvT765fKlHwC0InjLRVfs4MGiNJ3G9aWfACCDVPDkHnarJUn586fkrt+ASaOAWUZ73r/Ur/UnALMU + bdu91wP6HwC6kcO382+3/wCaQBhXpUSmlgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEUASUkAXl4AZGQAcXEAfHwAhYUA + lJQAmpoAm5sAp6cAra0Arq4Au7sAvLwAvr4Aw8MAxsYAyckAy8sAzs4A1NQA19cA2NgA29sA398A4uIA + 5OQA5+cA6OgA7e0A7u4A7+8A8PAA8fEA8/MA9PQK9vYU9/co+fk5+vpB+/tK+/tg/Pxj/f1x/f2E/v6c + /v6i/v6x/v7F///P///f///q///v///0///6//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 1xe7R6QZxv8DiyxXTC5xLO8AAAAASUVORK5CYII= + + + + + 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 + 1xe7R6QZxv8DiyxXTC5xLO8AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAADAAAAApCAMAAABEBVrmAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEWZysqZ0NCZ0dGZ1dWZ2NiZ29uZ + 39+Z4eGZ5eWZ5uaZ5+eZ6uqZ6+uZ7e2Z7u6Z7++Z8PCZ8vKZ8/OZ9PSZ9fWZ9vaZ9/eZ+PiZ+fmZ+vqZ + +/ud/Pyh/Pyp/Pyw/Pyz/f23/f2//f3A/v7G/v7O/v7X/v7Z/v7f/v7n///r///y///2///5///+//8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XfXWAAAACXBIWXMAAA68AAAOvAGVvHJJAAAAGnRF + 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 + SUwPzmIlAAAAAElFTkSuQmCC + + + + + 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 + SUwPzmIlAAAAAElFTkSuQmCC + + + + + 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 + dxRklOT2WyEJAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAAD0AAAAUCAIAAACxo6JAAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAA6+AAAOvgHqQrHAAAAAGnRF + WHRTb2Z0d2FyZQBQYWludC5ORVQgdjMuNS4xMDD0cqEAAATXSURBVEhLzZZpUFNXFICjo9ixFKZKC2gr + lQE0ZcAVQRBaOoQEKYtlKVoRFGzVDkYo2whtQRAYtSPIotSFgIigrIqySANFIGwiSSCAQC3rpMCUJYQl + yXunF5+jzmu0paS2M9+8H+/ce+ab984991AEAng1ra1w9z7mFjoRFDdd24i3tJIX/Cf8hXdlA+4Z9ruR + hzC9RJZTLv0iTLwvTHz9DtbMI698zbzUu60drhWKdBw6jD0Hs37CRFMglc3B74ao1Fmn4zMxKbKGJvIu + hdDSAnWNWG3DHA1NWOufFiDke/NbIfHm1ArzWhvm8JnrwOuG/qGnDAzD4Ah09QPrLrY3XHqbTd67cIrY + Eh3HvndpPQjaIWFTM05agJDjXV6L2R3tVvuYa+snOnwGTmfA3VoorYeyxjnYD6DiIVRyoXsA0kshIVNO + 0gUyb++2NriSM65tw1H76AGNOWMbIEN4nsTQJ0/Ke05yAZQ3AbcT8zopjrsmezGDQnjRm35E+JD7Sm9e + K34xZ1TdrGAVjbvZQ2R0QPwMhu/MsTjwT4CARDieDKnF8GOeyPJg1+W8kaD46WcZFAW7SmrgOkB4uwUN + k6IET73ZHIm9D19pw21N60d6ziM6TiO6T54E6I2tv9QlFN8fBdFXISJFauRc/EAg6uyb+/bPcikKdCi3 + ewwS3n6nRklRAkp7B2SXjus7NiwzzNmyt1+D3qvJ6NV26NWwatGy61G3Rvyqyegz8RbTfaVf/wDu4TO6 + jl3aFpcir0xeyIezWYqvb34LTjssJLxPXRaRogQUfjuYuN6j7uJrmBf/MoAHJ06ud+pbali4WPe8Jo33 + pin/DePmd6y6Tbwn7QNlOw4OWXpy8iumHY5UrqWVxd6AmKvS6jrFq6PyILxZOVOkEAHlVgWmYZS0bQ9X + wyRtTDTXMXYFjr1n00V1eqy0pW6RYeWSTRyqq9DYa5Lq3GO+p6SzT9rYDicujaluzjiRAqlFEHJeQkq6 + cPxOjyLpVYzewjL5ySnGzoVq2zI2fN6+2iwdteeMexCZCiHJmJ3/hDqtS9Wsbq1d9zqXIXWrtpUW9erb + Ln0ZNZaUC2czJUofslxCpo/GYl/FSElJF87lm1P2zKHdwcP3a+X3K8q6nRWUNd8v02et3JrKKhTHZ8OB + KKD7zlBdhKhIDF07DN16lLcWM2M6OXyJuXuNtk3N2SyIzZLpOXauond+FjhRr+hbs5mLp+VOJ2eKETlF + s6QoASX9NsaM+e3bxAm9T+tUNrL07SvozImN7uPoOC7dUqdmwVmxvehQOO/xIF7NB7rP4BrLWxEsyCwD + 72hJ0k0MTVqkjAunkiPbtPtpH3T65pV9EA195TUQfG5Sm1Gz3ID1llGJsilvseHPb5tVqWy9pbXj4v6I + SVRCu4JnlhukMo6N7YuYDUpQ/I1DMA9vAmSfXYp7R05oWVct0kuhrM9SNS7RsBIs0T1n6tGWXgLMONzU + a+T9nV37IyRN3OcbFcu8vQm4fLhRjLt/N7b6k+ol1DTlzXkrjXOpDk1RaZBWDF7RWAUHf/ivSSPQiF9T + L0MnEoHuIFKUQI43Ae+JfWi8KK1gam+IUMXojn2A2D5QwspXfEH/A17q/SLsamD4DH1g++jCDancafj1 + 87e8EWiWR3/gfyItEMAfGSFv/tw5mZ0AAAAASUVORK5CYII= + + + \ No newline at end of file diff --git a/ROMVault2/rvTree.Designer.cs b/ROMVault2/rvTree.Designer.cs new file mode 100644 index 0000000..5dff86c --- /dev/null +++ b/ROMVault2/rvTree.Designer.cs @@ -0,0 +1,47 @@ +namespace ROMVault2 +{ + partial class RvTree + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // rvTree + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.DoubleBuffered = true; + this.Name = "RvTree"; + this.Size = new System.Drawing.Size(455, 416); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/ROMVault2/rvTree.cs b/ROMVault2/rvTree.cs new file mode 100644 index 0000000..28e0a57 --- /dev/null +++ b/ROMVault2/rvTree.cs @@ -0,0 +1,452 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using ROMVault2.RvDB; + +namespace ROMVault2 +{ + + public partial class RvTree : UserControl + { + + + public event MouseEventHandler RvSelected; + + private RvDir _lTree; + + private RvDir _lSelected; + + public RvTree() + { + InitializeComponent(); + } + + #region "Setup" + private int _yPos; + + public void Setup(ref RvDir dirTree) + { + _lSelected = null; + _lTree = dirTree; + SetupInt(); + } + + private void SetupInt() + { + _yPos = 0; + + int treeCount = _lTree.ChildCount; + + if (treeCount >= 1) + { + for (int i = 0; i < treeCount - 1; i++) + SetupTree((RvDir)_lTree.Child(i), "├"); + + SetupTree((RvDir)_lTree.Child(treeCount - 1), "└"); + } + AutoScrollMinSize = new Size(500, _yPos); + Refresh(); + } + + private void SetupTree(RvDir pTree, string pTreeBranches) + { + int nodeDepth = pTreeBranches.Length - 1; + + pTree.Tree.TreeBranches = pTreeBranches; + + pTree.Tree.RTree = new Rectangle(0, _yPos - 8, nodeDepth * 18, 16); + pTree.Tree.RExpand = new Rectangle(5 + nodeDepth * 18, _yPos + 4, 9, 9); + pTree.Tree.RChecked = new Rectangle(20 + nodeDepth * 18, _yPos + 2, 13, 13); + pTree.Tree.RIcon = new Rectangle(35 + nodeDepth * 18, _yPos, 16, 16); + pTree.Tree.RText = new Rectangle(51 + nodeDepth * 18, _yPos, 500, 16); + + pTreeBranches = pTreeBranches.Replace("├", "│"); + pTreeBranches = pTreeBranches.Replace("└", " "); + + _yPos = _yPos + 16; + + bool found = false; + int last = 0; + for (int i = 0; i < pTree.ChildCount; i++) + { + RvBase t = pTree.Child(i); + if (t is RvDir) + if (((RvDir)t).Tree != null) + { + found = true; + if (pTree.Tree.TreeExpanded) + last = i; + } + } + if (!found) + pTree.Tree.RExpand = new Rectangle(0, 0, 0, 0); + + + + for (int i = 0; i < pTree.ChildCount; i++) + { + RvBase t = pTree.Child(i); + if (t is RvDir) + if (((RvDir)t).Tree != null) + { + if (pTree.Tree.TreeExpanded) + { + if (i != last) + SetupTree((RvDir)pTree.Child(i), pTreeBranches + "├"); + else + SetupTree((RvDir)pTree.Child(i), pTreeBranches + "└"); + } + } + } + + + } + #endregion + + #region "Paint" + private int _hScroll; + private int _vScroll; + protected override void OnPaint(PaintEventArgs e) + { + + Graphics g = e.Graphics; + + _hScroll = HorizontalScroll.Value; + _vScroll = VerticalScroll.Value; + + Rectangle t = new Rectangle(e.ClipRectangle.Left + _hScroll, e.ClipRectangle.Top + _vScroll, e.ClipRectangle.Width, e.ClipRectangle.Height); + + g.FillRectangle(Brushes.White, e.ClipRectangle); + + if (_lTree != null) + for (int i = 0; i < _lTree.ChildCount; i++) + { + RvBase tBase = _lTree.Child(i); + if (tBase is RvDir) + { + RvDir tDir = (RvDir)tBase; + if (tDir.Tree != null) + PaintTree(tDir, g, t); + } + } + + + } + + private void PaintTree(RvDir pTree, Graphics g, Rectangle t) + { + int y = pTree.Tree.RTree.Top - _vScroll; + + if (pTree.Tree.RTree.IntersectsWith(t)) + { + Pen p = new Pen(Brushes.Gray, 1) { DashStyle = DashStyle.Dot }; + + string lTree = pTree.Tree.TreeBranches; + for (int j = 0; j < lTree.Length; j++) + { + int x = j * 18 - _hScroll; + string cTree = lTree.Substring(j, 1); + switch (cTree) + { + case "│": + g.DrawLine(p, x + 9, y, x + 9, y + 16); + break; + + case "├": + case "└": + g.DrawLine(p, x + 9, y, x + 9, y + 16); + g.DrawLine(p, x + 9, y + 16, x + 27, y + 16); + break; + } + } + } + + if (!pTree.Tree.RExpand.IsEmpty) + if (pTree.Tree.RExpand.IntersectsWith(t)) + { + g.DrawImage(pTree.Tree.TreeExpanded ? rvImages.ExpandBoxMinus : rvImages.ExpandBoxPlus, RSub(pTree.Tree.RExpand, _hScroll, _vScroll)); + } + + + if (pTree.Tree.RChecked.IntersectsWith(t)) + { + switch (pTree.Tree.Checked) + { + case RvTreeRow.TreeSelect.Disabled: + g.DrawImage(rvImages.TickBoxDisabled, RSub(pTree.Tree.RChecked, _hScroll, _vScroll)); + break; + case RvTreeRow.TreeSelect.UnSelected: + g.DrawImage(rvImages.TickBoxUnTicked, RSub(pTree.Tree.RChecked, _hScroll, _vScroll)); + break; + case RvTreeRow.TreeSelect.Selected: + g.DrawImage(rvImages.TickBoxTicked, RSub(pTree.Tree.RChecked, _hScroll, _vScroll)); + break; + } + } + + if (pTree.Tree.RIcon.IntersectsWith(t)) + { + int icon = 2; + if (pTree.DirStatus.HasInToSort()) + { + icon = 4; + } + else if (!pTree.DirStatus.HasCorrect()) + { + icon = 1; + } + else if (!pTree.DirStatus.HasMissing()) + { + icon = 3; + } + + + + Bitmap bm; + if (pTree.Dat == null && pTree.DirDatCount != 1) // Directory above DAT's in Tree + bm = rvImages.GetBitmap("DirectoryTree" + icon); + else if (pTree.Dat == null && pTree.DirDatCount == 1) // Directory that contains DAT's + bm = rvImages.GetBitmap("Tree" + icon); + else if (pTree.Dat != null && pTree.DirDatCount == 0) // Directories made by a DAT + bm = rvImages.GetBitmap("Tree" + icon); + else + { + ReportError.SendAndShow("Unknown Tree settings in DisplayTree."); + bm = null; + } + + if (bm != null) + { + g.DrawImage(bm, RSub(pTree.Tree.RIcon, _hScroll, _vScroll)); + } + } + + + + Rectangle recBackGround = new Rectangle(pTree.Tree.RText.X, pTree.Tree.RText.Y, Width - pTree.Tree.RText.X + _hScroll, pTree.Tree.RText.Height); + + if (recBackGround.IntersectsWith(t)) + { + string thistxt; + + if (pTree.Dat == null && pTree.DirDatCount != 1) // Directory above DAT's in Tree + thistxt = pTree.Name; + else if (pTree.Dat == null && pTree.DirDatCount == 1) // Directory that contains DAT's + thistxt = pTree.Name + ": " + pTree.DirDat(0).GetData(RvDat.DatData.Description) + " ( Have:" + pTree.DirStatus.CountCorrect() + " \\ Missing: " + pTree.DirStatus.CountMissing() + " )"; + + // pTree.Parent.DirDatCount>1: This should probably be a test like parent contains Dat + else if (pTree.Dat != null && pTree.Dat.AutoAddDirectory && pTree.Parent.DirDatCount > 1) + thistxt = pTree.Name + ": " + pTree.Dat.GetData(RvDat.DatData.Description) + " ( Have:" + pTree.DirStatus.CountCorrect() + " \\ Missing: " + pTree.DirStatus.CountMissing() + " )"; + else if (pTree.Dat != null && pTree.DirDatCount == 0) // Directories made by a DAT + thistxt = pTree.Name + " ( Have:" + pTree.DirStatus.CountCorrect() + " \\ Missing: " + pTree.DirStatus.CountMissing() + " )"; + else + { + ReportError.SendAndShow("Unknown Tree settings in DisplayTree."); + thistxt = ""; + } + + + if (_lSelected != null && pTree.TreeFullName == _lSelected.TreeFullName) + { + g.FillRectangle(new SolidBrush(Color.FromArgb(51, 153, 255)), RSub(recBackGround, _hScroll, _vScroll)); + g.DrawString(thistxt, new Font("Microsoft Sans Serif", 8), Brushes.White, pTree.Tree.RText.Left - _hScroll, pTree.Tree.RText.Top + 1 - _vScroll); + } + else + { + g.DrawString(thistxt, new Font("Microsoft Sans Serif", 8), Brushes.Black, pTree.Tree.RText.Left - _hScroll, pTree.Tree.RText.Top + 1 - _vScroll); + } + } + + if (pTree.Tree.TreeExpanded) + for (int i = 0; i < pTree.ChildCount; i++) + { + RvBase tBase = pTree.Child(i); + if (tBase is RvDir) + { + RvDir tDir = (RvDir)tBase; + if (tDir.Tree != null) + PaintTree(tDir, g, t); + } + } + + } + + + private static Rectangle RSub(Rectangle r, int h, int v) + { + Rectangle ret = new Rectangle(r.Left - h, r.Top - v, r.Width, r.Height); + return ret; + } + #endregion + + #region"Mouse Events" + private bool _mousehit; + protected override void OnMouseDown(MouseEventArgs mevent) + { + int x = mevent.X + HorizontalScroll.Value; + int y = mevent.Y + VerticalScroll.Value; + + if (_lTree != null) + for (int i = 0; i < _lTree.ChildCount; i++) + { + RvDir tDir = (RvDir)_lTree.Child(i); + if (tDir.Tree != null) + if (CheckMouseDown(tDir, x, y, mevent)) + break; + } + + if (!_mousehit) return; + + SetupInt(); + base.OnMouseDown(mevent); + } + + public void SetSelected(RvDir selected) + { + bool found = false; + + RvDir t = selected; + while (t != null) + { + if (t.Tree != null) + { + if (!found) + { + _lSelected = t; + found = true; + } + else + t.Tree.TreeExpanded = true; + } + t = t.Parent; + } + SetupInt(); + } + + public RvDir GetSelected() + { + return _lSelected; + } + + private bool CheckMouseDown(RvDir pTree, int x, int y, MouseEventArgs mevent) + { + if (pTree.Tree.RChecked.Contains(x, y)) + { + if (pTree.Tree.Checked == RvTreeRow.TreeSelect.Disabled) + return true; + + _mousehit = true; + SetChecked(pTree, pTree.Tree.Checked == RvTreeRow.TreeSelect.Selected ? RvTreeRow.TreeSelect.UnSelected : RvTreeRow.TreeSelect.Selected); + return true; + } + + if (pTree.Tree.RExpand.Contains(x, y)) + { + _mousehit = true; + SetExpanded(pTree, mevent.Button == MouseButtons.Right); + return true; + } + + if (pTree.Tree.RText.Contains(x, y)) + { + _mousehit = true; + + if (RvSelected != null) + RvSelected(pTree, mevent); + + _lSelected = pTree; + return true; + } + + if (pTree.Tree.TreeExpanded) + for (int i = 0; i < pTree.ChildCount; i++) + { + RvBase rBase = pTree.Child(i); + if (rBase is RvDir) + { + RvDir rDir = (RvDir)rBase; + if (rDir.Tree != null) + if (CheckMouseDown(rDir, x, y, mevent)) + return true; + } + } + + return false; + } + + private static void SetChecked(RvDir pTree, RvTreeRow.TreeSelect nSelection) + { + pTree.Tree.Checked = nSelection; + for (int i = 0; i < pTree.ChildCount; i++) + { + RvBase b = pTree.Child(i); + if (b is RvDir) + { + RvDir d = (RvDir)b; + if (d.Tree != null) + { + SetChecked(d, nSelection); + } + } + } + } + + private static void SetExpanded(RvDir pTree, bool rightClick) + { + if (!rightClick) + { + pTree.Tree.TreeExpanded = !pTree.Tree.TreeExpanded; + return; + } + + // Find the value of the first child node. + for (int i = 0; i < pTree.ChildCount; i++) + { + RvBase b = pTree.Child(i); + if (b is RvDir) + { + RvDir d = (RvDir)b; + if (d.Tree != null) + { + //Recusivly Set All Child Nodes to this value + SetExpandedRecurse(pTree, !d.Tree.TreeExpanded); + break; + } + } + } + } + + private static void SetExpandedRecurse(RvDir pTree, bool expanded) + { + for (int i = 0; i < pTree.ChildCount; i++) + { + RvBase b = pTree.Child(i); + if (b is RvDir) + { + RvDir d = (RvDir)b; + if (d.Tree != null) + { + d.Tree.TreeExpanded = expanded; + SetExpandedRecurse(d, expanded); + } + } + } + } + #endregion + + public RvBase Selected + { + get + { + return _lSelected; + } + } + } + +} diff --git a/ROMVault2/rvTree.resx b/ROMVault2/rvTree.resx new file mode 100644 index 0000000..5ea0895 --- /dev/null +++ b/ROMVault2/rvTree.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/ROMVault2/rvTreeRow.cs b/ROMVault2/rvTreeRow.cs new file mode 100644 index 0000000..d1f3c9a --- /dev/null +++ b/ROMVault2/rvTreeRow.cs @@ -0,0 +1,99 @@ +/****************************************************** + * ROMVault2 is written by Gordon J. * + * Contact gordon@romvault.com * + * Copyright 2014 * + ******************************************************/ + +using System.Drawing; +using System.IO; + +namespace ROMVault2 +{ + public class RvTreeRow + { + public enum TreeSelect { UnSelected, Selected, Disabled } + + + public string TreeBranches; + private long _filePointer = -1; + private bool _pTreeExpanded; + private TreeSelect _pChecked; + + public Rectangle RTree; + public Rectangle RExpand; + public Rectangle RChecked; + public Rectangle RIcon; + public Rectangle RText; + + public RvTreeRow() + { + _pTreeExpanded = true; + _pChecked = TreeSelect.Selected; + } + + public void Write(BinaryWriter bw) + { + _filePointer = bw.BaseStream.Position; + bw.Write(_pTreeExpanded); + bw.Write((byte)_pChecked); + } + + public void Read(BinaryReader br) + { + _filePointer = br.BaseStream.Position; + _pTreeExpanded = br.ReadBoolean(); + _pChecked = (TreeSelect)br.ReadByte(); + } + + public bool TreeExpanded + { + get + { + return _pTreeExpanded; + } + set + { + if (_pTreeExpanded != value) + { + _pTreeExpanded = value; + CacheUpdate(); + } + } + } + + public TreeSelect Checked + { + get + { + return _pChecked; + } + set + { + if (_pChecked != value) + { + _pChecked = value; + CacheUpdate(); + } + } + } + + private void CacheUpdate() + { + if (_filePointer >= 0) + { + FileStream fs = new FileStream(Settings.CacheFile, FileMode.Open, FileAccess.Write); + BinaryWriter bw = new BinaryWriter(fs); + fs.Position = _filePointer; + bw.Write(_pTreeExpanded); + bw.Write((byte)_pChecked); + + bw.Flush(); + bw.Close(); + + fs.Close(); + fs.Dispose(); + } + } + } + +}