diff --git a/.gitignore b/.gitignore index f46d884e..b99ed157 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,5 @@ Thumbs.db *\TestResults *\updater.exe *.orig -packages/ \ No newline at end of file +packages/ +FeedBuilder/FeedBuilder.xml diff --git a/FeedBuilder/FeedBuilder.csproj b/FeedBuilder/FeedBuilder.csproj index c27efdd5..6dabad06 100644 --- a/FeedBuilder/FeedBuilder.csproj +++ b/FeedBuilder/FeedBuilder.csproj @@ -1,5 +1,5 @@  - + Debug x86 @@ -12,7 +12,7 @@ FeedBuilder 512 WindowsForms - v3.5 + v4.6.2 1591 @@ -25,6 +25,7 @@ true bin\Debug\ FeedBuilder.xml + false x86 @@ -35,6 +36,7 @@ bin\Release\ FeedBuilder.xml 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false On @@ -63,6 +65,7 @@ false false false + false true @@ -73,18 +76,34 @@ pdbonly AnyCPU true + false - - ..\src\NAppUpdate.Framework\bin\Release\net35\NAppUpdate.Framework.dll - + + ..\packages\System.Reactive.Core.3.1.1\lib\net46\System.Reactive.Core.dll + True + + + ..\packages\System.Reactive.Interfaces.3.1.1\lib\net45\System.Reactive.Interfaces.dll + True + + + ..\packages\System.Reactive.Linq.3.1.1\lib\net46\System.Reactive.Linq.dll + True + + + ..\packages\System.Reactive.Windows.Forms.3.1.1\lib\net46\System.Reactive.Windows.Forms.dll + True + + + @@ -98,6 +117,12 @@ frmMain.cs Form + + Form + + + frmWait.cs + Component @@ -133,6 +158,9 @@ frmMain.cs + + frmWait.cs + ResXFileCodeGenerator Resources.Designer.cs @@ -140,6 +168,7 @@ + SettingsSingleFileGenerator Settings.Designer.cs @@ -149,6 +178,17 @@ + + + + + {3637b716-7eee-4a84-b6b9-982c4d8a39a6} + FileIcons + + + {5c07ebdf-d43f-4be9-b560-d7a443c0edce} + NAppUpdate.Framework + \ No newline at end of file diff --git a/FeedBuilder/FeedBuilder.xml b/FeedBuilder/FeedBuilder.xml deleted file mode 100644 index 21409532..00000000 --- a/FeedBuilder/FeedBuilder.xml +++ /dev/null @@ -1,171 +0,0 @@ - - - - FeedBuilder - - - - - A strongly-typed resource class, for looking up localized strings, etc. - - - - - Returns the cached ResourceManager instance used by this class. - - - - - Overrides the current thread's CurrentUICulture property for all - resource lookups using this strongly typed resource class. - - - - - Actually, the system cue only works for editable (i.e. not read-only) text boxes. - - - - - - - Required designer variable. - - - - - Clean up any resources being used. - - true if managed resources should be disposed; otherwise, false. - - - - Required method for Designer support - do not modify - the contents of this method with the code editor. - - - - - Required designer variable. - - - - - Clean up any resources being used. - - true if managed resources should be disposed; otherwise, false. - - - - Required method for Designer support - do not modify - the contents of this method with the code editor. - - - - - Structure that maps to WIN32_FIND_DATA - - - - - SafeHandle class for holding find handles - - - - - Constructor - - - - - Release the find handle - - true if the handle was released - - - - Wrapper for P/Invoke methods used by FileSystemEnumerator - - - - - File system enumerator. This class provides an easy to use, efficient mechanism for searching a list of - directories for files matching a list of file specifications. The search is done incrementally as matches - are consumed, so the overhead before processing the first match is always kept to a minimum. - - - - - Stack of open scopes. This is a member (instead of a local variable) - to allow Dispose to close any open find handles if the object is disposed - before the enumeration is completed. - - - - - Array of paths to be searched. - - - - - Array of regular expressions that will detect matching files. - - - - - If true, sub-directories are searched. - - - - - IDisposable.Dispose - - - - - Constructor. - - Semicolon- or comma-delimitted list of paths to search. - Semicolon- or comma-delimitted list of wildcard filespecs to match. - If true, subdirectories are searched. - - - - Get an enumerator that returns all of the files that match the wildcards that - are in any of the directories to be searched. - - An IEnumerable that returns all matching files one by one. - - The enumerator that is returned finds files using a lazy algorithm that - searches directories incrementally as matches are consumed. - - - - - Information that's kept in our stack for simulated recursion - - - - - Find handle returned by FindFirstFile - - - - - Path that was searched to yield the find handle. - - - - - Constructor - - Find handle returned by FindFirstFile. - Path corresponding to find handle. - - - - The main entry point for the application. - - - - diff --git a/FeedBuilder/FeedBuilderSettingsProvider.cs b/FeedBuilder/FeedBuilderSettingsProvider.cs index 0ff59e00..6c2c804f 100644 --- a/FeedBuilder/FeedBuilderSettingsProvider.cs +++ b/FeedBuilder/FeedBuilderSettingsProvider.cs @@ -7,6 +7,7 @@ using System.Windows.Forms; using System.Xml; using System.Xml.Serialization; +using FeedBuilder.Properties; namespace FeedBuilder { diff --git a/FeedBuilder/FileInfoEx.cs b/FeedBuilder/FileInfoEx.cs index d3c3170d..01282d4d 100644 --- a/FeedBuilder/FileInfoEx.cs +++ b/FeedBuilder/FileInfoEx.cs @@ -1,6 +1,6 @@ +using System; using System.Diagnostics; using System.IO; -using NAppUpdate.Framework.Utils; namespace FeedBuilder { @@ -24,6 +24,30 @@ public string Hash { get { return myHash; } } + private static readonly string[] SizeSuffixes = + { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" }; + public string getFileSize(int decimalPlaces = 1) + { + long value = myFileInfo.Length; + if (value == 0) { return "0.0 bytes"; } + + // mag is 0 for bytes, 1 for KB, 2, for MB, etc. + int mag = (int)Math.Log(value, 1024); + + // 1L << (mag * 10) == 2 ^ (10 * mag) + // [i.e. the number of bytes in the unit corresponding to mag] + decimal adjustedSize = (decimal)value / (1L << (mag * 10)); + + // make adjustment when the value is large enough that + // it would round up to 1000 or more + if (Math.Round(adjustedSize, decimalPlaces) >= 1000) + { + mag += 1; + adjustedSize /= 1024; + } + + return $"{adjustedSize.ToString("n" + decimalPlaces.ToString())} {SizeSuffixes[mag]}"; + } public string RelativeName { get; private set; } @@ -31,11 +55,12 @@ public FileInfoEx(string fileName, int rootDirLength) { myFileInfo = new FileInfo(fileName); var verInfo = FileVersionInfo.GetVersionInfo(fileName); - if (myFileVersion == null) - myFileVersion = new System.Version(verInfo.FileMajorPart, verInfo.FileMinorPart, verInfo.FileBuildPart, verInfo.FilePrivatePart).ToString(); + myFileVersion = new Version(verInfo.FileMajorPart, verInfo.FileMinorPart, verInfo.FileBuildPart, verInfo.FilePrivatePart).ToString(); + RelativeName = fileName.Substring(rootDirLength); + while (RelativeName.StartsWith(@"\")) + RelativeName = RelativeName.Substring(1);//Just in case the file name starts with a \ myHash = NAppUpdate.Framework.Utils.FileChecksum.GetSHA256Checksum(fileName); - RelativeName = fileName.Substring(rootDirLength); } } } diff --git a/FeedBuilder/FileSystemEnumerator.cs b/FeedBuilder/FileSystemEnumerator.cs index fd7e3877..3d9e56b4 100644 --- a/FeedBuilder/FileSystemEnumerator.cs +++ b/FeedBuilder/FileSystemEnumerator.cs @@ -1,79 +1,13 @@ using System; using System.Collections.Generic; using System.IO; -using System.Runtime.ConstrainedExecution; -using System.Runtime.InteropServices; +using System.Linq; using System.Security.Permissions; using System.Text.RegularExpressions; -using FeedBuilder.Win32; -using Microsoft.Win32.SafeHandles; - +using System.Threading; +using System.Threading.Tasks; namespace FeedBuilder { - namespace Win32 - { - /// - /// Structure that maps to WIN32_FIND_DATA - /// - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - internal sealed class FindData - { - public int fileAttributes; - public int creationTime_lowDateTime; - public int creationTime_highDateTime; - public int lastAccessTime_lowDateTime; - public int lastAccessTime_highDateTime; - public int lastWriteTime_lowDateTime; - public int lastWriteTime_highDateTime; - public int nFileSizeHigh; - public int nFileSizeLow; - public int dwReserved0; - public int dwReserved1; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] - public String fileName; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] - public String alternateFileName; - } - - /// - /// SafeHandle class for holding find handles - /// - internal sealed class SafeFindHandle : SafeHandleMinusOneIsInvalid - { - /// - /// Constructor - /// - public SafeFindHandle() : base(true) { } - - /// - /// Release the find handle - /// - /// true if the handle was released - [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] - protected override bool ReleaseHandle() - { - return SafeNativeMethods.FindClose(handle); - } - } - - /// - /// Wrapper for P/Invoke methods used by FileSystemEnumerator - /// - [SecurityPermission(SecurityAction.Assert, UnmanagedCode = true)] - internal static class SafeNativeMethods - { - [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] - public static extern SafeFindHandle FindFirstFile(String fileName, [In, Out] FindData findFileData); - - [DllImport("kernel32", CharSet = CharSet.Auto)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool FindNextFile(SafeFindHandle hFindFile, [In, Out] FindData lpFindFileData); - - [DllImport("kernel32", CharSet = CharSet.Auto)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool FindClose(IntPtr hFindFile); - } - } /// /// File system enumerator. This class provides an easy to use, efficient mechanism for searching a list of @@ -82,40 +16,6 @@ internal static class SafeNativeMethods /// public sealed class FileSystemEnumerator : IDisposable { - /// - /// Information that's kept in our stack for simulated recursion - /// - private struct SearchInfo - { - /// - /// Find handle returned by FindFirstFile - /// - public readonly SafeFindHandle Handle; - - /// - /// Path that was searched to yield the find handle. - /// - public readonly string Path; - - /// - /// Constructor - /// - /// Find handle returned by FindFirstFile. - /// Path corresponding to find handle. - public SearchInfo(SafeFindHandle h, string p) - { - Handle = h; - Path = p; - } - } - - /// - /// Stack of open scopes. This is a member (instead of a local variable) - /// to allow Dispose to close any open find handles if the object is disposed - /// before the enumeration is completed. - /// - private readonly Stack m_scopes; - /// /// Array of paths to be searched. /// @@ -126,6 +26,11 @@ public SearchInfo(SafeFindHandle h, string p) /// private readonly List m_fileSpecs; + /// + /// Array of regular expressions that will detect matching files to exclude. + /// + private readonly List m_excludeFileSpecs; + /// /// If true, sub-directories are searched. /// @@ -138,11 +43,7 @@ public SearchInfo(SafeFindHandle h, string p) /// public void Dispose() { - while (m_scopes.Count > 0) - { - SearchInfo si = m_scopes.Pop(); - si.Handle.Close(); - } + } #endregion @@ -150,31 +51,101 @@ public void Dispose() /// /// Constructor. /// - /// Semicolon- or comma-delimitted list of paths to search. - /// Semicolon- or comma-delimitted list of wildcard filespecs to match. + /// Semicolon- or comma-delimited list of paths to search. + /// Semicolon- or comma-delimited list of wildcard filespecs to match. + /// Semicolon- or comma-delimited list of wildcard filespecs to exclude from matching. /// If true, subdirectories are searched. - public FileSystemEnumerator(string pathsToSearch, string fileTypesToMatch, bool includeSubDirs) + public FileSystemEnumerator(string pathsToSearch, string fileTypesToMatch, string excludeFileTypesToMatch, bool includeSubDirs) { - m_scopes = new Stack(); + // check for nulls if (null == pathsToSearch) throw new ArgumentNullException("pathsToSearch"); if (null == fileTypesToMatch) throw new ArgumentNullException("fileTypesToMatch"); // make sure spec doesn't contain invalid characters - if (fileTypesToMatch.IndexOfAny(new[] { ':', '<', '>', '/', '\\' }) >= 0) throw new ArgumentException("invalid cahracters in wildcard pattern", "fileTypesToMatch"); + if (fileTypesToMatch.IndexOfAny(new[] { ':', '<', '>', '/', '\\' }) >= 0) throw new ArgumentException("Invalid characters in wildcard pattern", "fileTypesToMatch"); m_includeSubDirs = includeSubDirs; m_paths = pathsToSearch.Split(new[] { ';', ',' }); string[] specs = fileTypesToMatch.Split(new[] { ';', ',' }); + string[] exSpecs = string.IsNullOrEmpty(excludeFileTypesToMatch) ? new string[] { } : excludeFileTypesToMatch.Split(new[] { ';', ',' }); m_fileSpecs = new List(specs.Length); + m_excludeFileSpecs = new List(exSpecs.Length); foreach (string spec in specs) { // trim whitespace off file spec and convert Win32 wildcards to regular expressions string pattern = spec.Trim().Replace(".", @"\.").Replace("*", @".*").Replace("?", @".?"); m_fileSpecs.Add(new Regex("^" + pattern + "$", RegexOptions.IgnoreCase)); } + + foreach (string spec in exSpecs) + { + // trim whitespace off file spec and convert Win32 wildcards to regular expressions + string pattern = spec.Trim().Replace(".", @"\.").Replace("*", @".*").Replace("?", @".?"); + m_excludeFileSpecs.Add(new Regex("^" + pattern + "$", RegexOptions.IgnoreCase)); + } + } + private int fileCount = 0; + + private IEnumerable ProcessFiles(string folderPath) + { + foreach (var file in Directory.GetFiles(folderPath)) + { + string tmpFile = Path.GetFileName(file); + foreach (Regex fileSpec in m_fileSpecs) + { + // if this spec matches, return this file's info + if (fileSpec.IsMatch(tmpFile)) + { + bool showFile = true; + foreach (Regex exSpec in m_excludeFileSpecs) + if (exSpec.IsMatch(tmpFile)) + { + showFile = false; + break; + } + if (showFile) + { + yield return new FileInfo(file); + fileCount++; + OnFileProcess(new FileProcessedEventArgs(fileCount)); + break; + } + } + } + if (token != null) + token.ThrowIfCancellationRequested(); + + } + } + void CheckSecurity(string folderPath) + { + new FileIOPermission(FileIOPermissionAccess.PathDiscovery, Path.Combine(folderPath, ".")).Demand(); + } + + private IEnumerable ProcessSubdirectories(string folderPath) + { + + // check security - ensure that caller has rights to read this directory + CheckSecurity(folderPath); + foreach (var d in Directory.GetDirectories(folderPath)) + { + new FileIOPermission(FileIOPermissionAccess.PathDiscovery, Path.Combine(d, ".")).Demand(); + yield return d; + foreach (var sd in ProcessSubdirectories(d)) + yield return sd; + } + } + + public event EventHandler FileProcessed; + + // Invoke the FileProcessed event; called whenever a file is processed: + private void OnFileProcess(FileProcessedEventArgs e) + { + if (FileProcessed != null) + FileProcessed(this, e); } /// @@ -188,75 +159,71 @@ public FileSystemEnumerator(string pathsToSearch, string fileTypesToMatch, bool /// public IEnumerable Matches() { + fileCount = 0; + foreach (string rootPath in m_paths) { string path = rootPath.Trim(); - // we "recurse" into a new directory by jumping to this spot - top: - // check security - ensure that caller has rights to read this directory - new FileIOPermission(FileIOPermissionAccess.PathDiscovery, Path.Combine(path, ".")).Demand(); - - // now that security is checked, go read the directory - FindData findData = new FindData(); - SafeFindHandle handle = SafeNativeMethods.FindFirstFile(Path.Combine(path, "*"), findData); - m_scopes.Push(new SearchInfo(handle, path)); - bool restart = false; - - // we "return" from a sub-directory by jumping to this spot - restart: - // ReSharper disable InvertIf - if (!handle.IsInvalid) - { - // ReSharper restore InvertIf - do - { - // if we restarted the loop (unwound a recursion), fetch the next match - if (restart) - { - restart = false; - continue; - } + CheckSecurity(path); - // don't match . or .. - if (findData.fileName.Equals(@".") || findData.fileName.Equals(@"..")) continue; + foreach (var fi in ProcessFiles(path)) + yield return fi; - if ((findData.fileAttributes & (int)FileAttributes.Directory) != 0) - { - if (m_includeSubDirs) - { - // it's a directory - recurse into it - path = Path.Combine(path, findData.fileName); - goto top; - } - } - else - { - // it's a file, see if any of the filespecs matches it - foreach (Regex fileSpec in m_fileSpecs) - { - // if this spec matches, return this file's info - if (fileSpec.IsMatch(findData.fileName)) yield return new FileInfo(Path.Combine(path, findData.fileName)); - } - } - } while (SafeNativeMethods.FindNextFile(handle, findData)); - - // close this find handle - handle.Close(); + if (m_includeSubDirs) + { - // unwind the stack - are we still in a recursion? - m_scopes.Pop(); - if (m_scopes.Count > 0) + foreach (var d in ProcessSubdirectories(path)) { - SearchInfo si = m_scopes.Peek(); - handle = si.Handle; - path = si.Path; - restart = true; - goto restart; + foreach (var fi in ProcessFiles(d)) + yield return fi; } } } } + private CancellationToken token; + public Task> MatchesToFileInfoExAsync(int outputDirLength, CancellationTokenSource TokenSource) + { + token = TokenSource.Token; + try + { + return Task.Run(() => + { + List items = new List(); + foreach (var info in Matches().OrderBy(f => f.FullName) + .Select(f => new FileInfoEx(f.FullName, outputDirLength))) + { + items.Add(info); + + } + return items.AsEnumerable(); + + }, token); + } + catch + { + return Task.FromResult(Enumerable.Empty().AsEnumerable()); + } + + + } + } + + public class FileProcessedEventArgs : EventArgs + + { + + public int FileProcesCount { get; private set; } + + + + public FileProcessedEventArgs(int FileProcesCount) + + { + + this.FileProcesCount = FileProcesCount; + + } } } diff --git a/FeedBuilder/Properties/Resources.Designer.cs b/FeedBuilder/Properties/Resources.Designer.cs index 12793502..340367ae 100644 --- a/FeedBuilder/Properties/Resources.Designer.cs +++ b/FeedBuilder/Properties/Resources.Designer.cs @@ -59,5 +59,15 @@ internal Resources() { resourceCulture = value; } } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ajax_loader { + get { + object obj = ResourceManager.GetObject("ajax-loader", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/FeedBuilder/Properties/Resources.resx b/FeedBuilder/Properties/Resources.resx index 85c90909..0fece34b 100644 --- a/FeedBuilder/Properties/Resources.resx +++ b/FeedBuilder/Properties/Resources.resx @@ -1,101 +1,124 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\ajax-loader.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/FeedBuilder/Properties/Settings.Designer.cs b/FeedBuilder/Properties/Settings.Designer.cs index 9fcef998..a9c30499 100644 --- a/FeedBuilder/Properties/Settings.Designer.cs +++ b/FeedBuilder/Properties/Settings.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace FeedBuilder { +namespace FeedBuilder.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -193,5 +193,29 @@ public string AddExtension { this["AddExtension"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("*.*")] + public string MatchFileSpec { + get { + return ((string)(this["MatchFileSpec"])); + } + set { + this["MatchFileSpec"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string ExcludeFileSpec { + get { + return ((string)(this["ExcludeFileSpec"])); + } + set { + this["ExcludeFileSpec"] = value; + } + } } } diff --git a/FeedBuilder/Properties/Settings.settings b/FeedBuilder/Properties/Settings.settings index 5452825a..2eb9216c 100644 --- a/FeedBuilder/Properties/Settings.settings +++ b/FeedBuilder/Properties/Settings.settings @@ -45,5 +45,11 @@ + + *.* + + + + \ No newline at end of file diff --git a/FeedBuilder/Resources/ajax-loader.gif b/FeedBuilder/Resources/ajax-loader.gif new file mode 100644 index 00000000..162b15c2 Binary files /dev/null and b/FeedBuilder/Resources/ajax-loader.gif differ diff --git a/FeedBuilder/app.config b/FeedBuilder/app.config index 2fa6e95d..6a97487f 100644 --- a/FeedBuilder/app.config +++ b/FeedBuilder/app.config @@ -1,3 +1,63 @@ - + + +
+ + + + + + + + + True + + + False + + + True + + + False + + + True + + + True + + + + + + True + + + + + *.pdb + *.config + + + + + True + + + + + + + + + *.* + + + + + + + diff --git a/FeedBuilder/frmMain.Designer.cs b/FeedBuilder/frmMain.Designer.cs index 99407283..3371eb86 100644 --- a/FeedBuilder/frmMain.Designer.cs +++ b/FeedBuilder/frmMain.Designer.cs @@ -22,9 +22,14 @@ partial class frmMain /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { + if (disposing && (components != null)) + { components.Dispose(); } + if (disposing && (curSelector != null)) + { + curSelector.Dispose(); + } base.Dispose(disposing); } @@ -36,549 +41,614 @@ protected override void Dispose(bool disposing) ///
private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); - this.lstFiles = new System.Windows.Forms.ListView(); - this.colFilename = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.colVersion = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.colSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.colDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.colHash = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.imgFiles = new System.Windows.Forms.ImageList(this.components); - this.fbdOutputFolder = new System.Windows.Forms.FolderBrowserDialog(); - this.sfdFeedXML = new System.Windows.Forms.SaveFileDialog(); - this.tsMain = new System.Windows.Forms.ToolStrip(); - this.btnNew = new System.Windows.Forms.ToolStripButton(); - this.btnOpen = new System.Windows.Forms.ToolStripButton(); - this.btnSave = new System.Windows.Forms.ToolStripButton(); - this.btnSaveAs = new System.Windows.Forms.ToolStripButton(); - this.tsSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.btnRefresh = new System.Windows.Forms.ToolStripButton(); - this.btnOpenOutputs = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.btnBuild = new System.Windows.Forms.ToolStripButton(); - this.ToolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); - this.panFiles = new System.Windows.Forms.Panel(); - this.grpSettings = new System.Windows.Forms.GroupBox(); - this.chkCleanUp = new System.Windows.Forms.CheckBox(); - this.chkCopyFiles = new System.Windows.Forms.CheckBox(); - this.lblIgnore = new System.Windows.Forms.Label(); - this.lblMisc = new System.Windows.Forms.Label(); - this.lblCompare = new System.Windows.Forms.Label(); - this.chkHash = new System.Windows.Forms.CheckBox(); - this.chkDate = new System.Windows.Forms.CheckBox(); - this.chkSize = new System.Windows.Forms.CheckBox(); - this.chkVersion = new System.Windows.Forms.CheckBox(); - this.txtBaseURL = new FeedBuilder.HelpfulTextBox(this.components); - this.lblBaseURL = new System.Windows.Forms.Label(); - this.chkIgnoreVsHost = new System.Windows.Forms.CheckBox(); - this.chkIgnoreSymbols = new System.Windows.Forms.CheckBox(); - this.cmdFeedXML = new System.Windows.Forms.Button(); - this.txtFeedXML = new FeedBuilder.HelpfulTextBox(this.components); - this.lblFeedXML = new System.Windows.Forms.Label(); - this.cmdOutputFolder = new System.Windows.Forms.Button(); - this.txtOutputFolder = new FeedBuilder.HelpfulTextBox(this.components); - this.lblOutputFolder = new System.Windows.Forms.Label(); - this.txtAddExtension = new FeedBuilder.HelpfulTextBox(this.components); - this.lblAddExtension = new System.Windows.Forms.Label(); - this.tsMain.SuspendLayout(); - this.ToolStripContainer1.ContentPanel.SuspendLayout(); - this.ToolStripContainer1.TopToolStripPanel.SuspendLayout(); - this.ToolStripContainer1.SuspendLayout(); - this.panFiles.SuspendLayout(); - this.grpSettings.SuspendLayout(); - this.SuspendLayout(); - // - // lstFiles - // - this.lstFiles.CheckBoxes = true; - this.lstFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.colFilename, - this.colVersion, - this.colSize, - this.colDate, - this.colHash}); - this.lstFiles.Dock = System.Windows.Forms.DockStyle.Fill; - this.lstFiles.Location = new System.Drawing.Point(0, 12); - this.lstFiles.Margin = new System.Windows.Forms.Padding(0); - this.lstFiles.Name = "lstFiles"; - this.lstFiles.Size = new System.Drawing.Size(810, 230); - this.lstFiles.SmallImageList = this.imgFiles; - this.lstFiles.TabIndex = 0; - this.lstFiles.UseCompatibleStateImageBehavior = false; - this.lstFiles.View = System.Windows.Forms.View.Details; - // - // colFilename - // - this.colFilename.Text = "Filename"; - this.colFilename.Width = 200; - // - // colVersion - // - this.colVersion.Text = "Version"; - this.colVersion.Width = 80; - // - // colSize - // - this.colSize.Text = "Size"; - this.colSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - this.colSize.Width = 80; - // - // colDate - // - this.colDate.Text = "Date"; - this.colDate.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - this.colDate.Width = 120; - // - // colHash - // - this.colHash.Text = "Hash"; - this.colHash.Width = 300; - // - // imgFiles - // - this.imgFiles.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgFiles.ImageStream"))); - this.imgFiles.TransparentColor = System.Drawing.Color.Transparent; - this.imgFiles.Images.SetKeyName(0, "file_extension_other.png"); - this.imgFiles.Images.SetKeyName(1, "file_extension_bmp.png"); - this.imgFiles.Images.SetKeyName(2, "file_extension_dll.png"); - this.imgFiles.Images.SetKeyName(3, "file_extension_doc.png"); - this.imgFiles.Images.SetKeyName(4, "file_extension_exe.png"); - this.imgFiles.Images.SetKeyName(5, "file_extension_htm.png"); - this.imgFiles.Images.SetKeyName(6, "file_extension_jpg.png"); - this.imgFiles.Images.SetKeyName(7, "file_extension_pdf.png"); - this.imgFiles.Images.SetKeyName(8, "file_extension_png.png"); - this.imgFiles.Images.SetKeyName(9, "file_extension_txt.png"); - this.imgFiles.Images.SetKeyName(10, "file_extension_wav.png"); - this.imgFiles.Images.SetKeyName(11, "file_extension_wmv.png"); - this.imgFiles.Images.SetKeyName(12, "file_extension_zip.png"); - // - // fbdOutputFolder - // - this.fbdOutputFolder.Description = "Select your projects output folder:"; - // - // sfdFeedXML - // - this.sfdFeedXML.DefaultExt = "xml"; - this.sfdFeedXML.Filter = "XML Files (*.xml)|*.xml|All Files (*.*)|*.*"; - this.sfdFeedXML.Title = "Select the location to save your NauXML file:"; - // - // tsMain - // - this.tsMain.Dock = System.Windows.Forms.DockStyle.None; - this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.btnNew, - this.btnOpen, - this.btnSave, - this.btnSaveAs, - this.tsSeparator1, - this.btnRefresh, - this.btnOpenOutputs, - this.toolStripSeparator1, - this.btnBuild}); - this.tsMain.Location = new System.Drawing.Point(0, 0); - this.tsMain.Name = "tsMain"; - this.tsMain.Size = new System.Drawing.Size(834, 25); - this.tsMain.Stretch = true; - this.tsMain.TabIndex = 2; - this.tsMain.Text = "Commands"; - // - // btnNew - // - this.btnNew.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnNew.Image = ((System.Drawing.Image)(resources.GetObject("btnNew.Image"))); - this.btnNew.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnNew.Name = "btnNew"; - this.btnNew.Size = new System.Drawing.Size(23, 22); - this.btnNew.Text = "&New"; - this.btnNew.Click += new System.EventHandler(this.btnNew_Click); - // - // btnOpen - // - this.btnOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnOpen.Image = ((System.Drawing.Image)(resources.GetObject("btnOpen.Image"))); - this.btnOpen.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnOpen.Name = "btnOpen"; - this.btnOpen.Size = new System.Drawing.Size(23, 22); - this.btnOpen.Text = "&Open"; - this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click); - // - // btnSave - // - this.btnSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnSave.Image = ((System.Drawing.Image)(resources.GetObject("btnSave.Image"))); - this.btnSave.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnSave.Name = "btnSave"; - this.btnSave.Size = new System.Drawing.Size(23, 22); - this.btnSave.Text = "&Save"; - this.btnSave.Click += new System.EventHandler(this.btnSave_Click); - // - // btnSaveAs - // - this.btnSaveAs.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.btnSaveAs.Image = ((System.Drawing.Image)(resources.GetObject("btnSaveAs.Image"))); - this.btnSaveAs.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnSaveAs.Name = "btnSaveAs"; - this.btnSaveAs.Size = new System.Drawing.Size(60, 22); - this.btnSaveAs.Text = "Save As..."; - this.btnSaveAs.Click += new System.EventHandler(this.btnSaveAs_Click); - // - // tsSeparator1 - // - this.tsSeparator1.Name = "tsSeparator1"; - this.tsSeparator1.Size = new System.Drawing.Size(6, 25); - // - // btnRefresh - // - this.btnRefresh.Image = ((System.Drawing.Image)(resources.GetObject("btnRefresh.Image"))); - this.btnRefresh.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnRefresh.Name = "btnRefresh"; - this.btnRefresh.Size = new System.Drawing.Size(92, 22); - this.btnRefresh.Text = "Refresh Files"; - this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click); - // - // btnOpenOutputs - // - this.btnOpenOutputs.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.btnOpenOutputs.Image = ((System.Drawing.Image)(resources.GetObject("btnOpenOutputs.Image"))); - this.btnOpenOutputs.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnOpenOutputs.Name = "btnOpenOutputs"; - this.btnOpenOutputs.Size = new System.Drawing.Size(133, 22); - this.btnOpenOutputs.Text = "Open Output Folder"; - this.btnOpenOutputs.Click += new System.EventHandler(this.btnOpenOutputs_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); - // - // btnBuild - // - this.btnBuild.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.btnBuild.Image = ((System.Drawing.Image)(resources.GetObject("btnBuild.Image"))); - this.btnBuild.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnBuild.Name = "btnBuild"; - this.btnBuild.Size = new System.Drawing.Size(54, 22); - this.btnBuild.Text = "Build"; - this.btnBuild.Click += new System.EventHandler(this.cmdBuild_Click); - // - // ToolStripContainer1 - // - // - // ToolStripContainer1.ContentPanel - // - this.ToolStripContainer1.ContentPanel.Controls.Add(this.panFiles); - this.ToolStripContainer1.ContentPanel.Controls.Add(this.grpSettings); - this.ToolStripContainer1.ContentPanel.Padding = new System.Windows.Forms.Padding(12, 8, 12, 12); - this.ToolStripContainer1.ContentPanel.Size = new System.Drawing.Size(834, 467); - this.ToolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.ToolStripContainer1.Location = new System.Drawing.Point(0, 0); - this.ToolStripContainer1.Name = "ToolStripContainer1"; - this.ToolStripContainer1.Size = new System.Drawing.Size(834, 492); - this.ToolStripContainer1.TabIndex = 3; - this.ToolStripContainer1.Text = "ToolStripContainer1"; - // - // ToolStripContainer1.TopToolStripPanel - // - this.ToolStripContainer1.TopToolStripPanel.Controls.Add(this.tsMain); - // - // panFiles - // - this.panFiles.Controls.Add(this.lstFiles); - this.panFiles.Dock = System.Windows.Forms.DockStyle.Fill; - this.panFiles.Location = new System.Drawing.Point(12, 213); - this.panFiles.Name = "panFiles"; - this.panFiles.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); - this.panFiles.Size = new System.Drawing.Size(810, 242); - this.panFiles.TabIndex = 2; - // - // grpSettings - // - this.grpSettings.Controls.Add(this.lblAddExtension); - this.grpSettings.Controls.Add(this.txtAddExtension); - this.grpSettings.Controls.Add(this.chkCleanUp); - this.grpSettings.Controls.Add(this.chkCopyFiles); - this.grpSettings.Controls.Add(this.lblIgnore); - this.grpSettings.Controls.Add(this.lblMisc); - this.grpSettings.Controls.Add(this.lblCompare); - this.grpSettings.Controls.Add(this.chkHash); - this.grpSettings.Controls.Add(this.chkDate); - this.grpSettings.Controls.Add(this.chkSize); - this.grpSettings.Controls.Add(this.chkVersion); - this.grpSettings.Controls.Add(this.txtBaseURL); - this.grpSettings.Controls.Add(this.lblBaseURL); - this.grpSettings.Controls.Add(this.chkIgnoreVsHost); - this.grpSettings.Controls.Add(this.chkIgnoreSymbols); - this.grpSettings.Controls.Add(this.cmdFeedXML); - this.grpSettings.Controls.Add(this.txtFeedXML); - this.grpSettings.Controls.Add(this.lblFeedXML); - this.grpSettings.Controls.Add(this.cmdOutputFolder); - this.grpSettings.Controls.Add(this.txtOutputFolder); - this.grpSettings.Controls.Add(this.lblOutputFolder); - this.grpSettings.Dock = System.Windows.Forms.DockStyle.Top; - this.grpSettings.Location = new System.Drawing.Point(12, 8); - this.grpSettings.Name = "grpSettings"; - this.grpSettings.Padding = new System.Windows.Forms.Padding(12, 8, 12, 8); - this.grpSettings.Size = new System.Drawing.Size(810, 205); - this.grpSettings.TabIndex = 1; - this.grpSettings.TabStop = false; - this.grpSettings.Text = "Settings:"; - // - // chkCleanUp - // - this.chkCleanUp.AutoSize = true; - this.chkCleanUp.Checked = true; - this.chkCleanUp.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkCleanUp.Location = new System.Drawing.Point(293, 145); - this.chkCleanUp.Name = "chkCleanUp"; - this.chkCleanUp.Size = new System.Drawing.Size(134, 17); - this.chkCleanUp.TabIndex = 17; - this.chkCleanUp.Text = "Clean Unselected Files"; - this.chkCleanUp.UseVisualStyleBackColor = true; - // - // chkCopyFiles - // - this.chkCopyFiles.AutoSize = true; - this.chkCopyFiles.Checked = true; - this.chkCopyFiles.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkCopyFiles.Location = new System.Drawing.Point(146, 145); - this.chkCopyFiles.Name = "chkCopyFiles"; - this.chkCopyFiles.Size = new System.Drawing.Size(141, 17); - this.chkCopyFiles.TabIndex = 16; - this.chkCopyFiles.Text = "Copy Files with NauXML"; - this.chkCopyFiles.UseVisualStyleBackColor = true; - this.chkCopyFiles.CheckedChanged += new System.EventHandler(this.chkCopyFiles_CheckedChanged); - // - // lblIgnore - // - this.lblIgnore.AutoSize = true; - this.lblIgnore.Location = new System.Drawing.Point(15, 174); - this.lblIgnore.Name = "lblIgnore"; - this.lblIgnore.Size = new System.Drawing.Size(40, 13); - this.lblIgnore.TabIndex = 15; - this.lblIgnore.Text = "Ignore:"; - // - // lblMisc - // - this.lblMisc.AutoSize = true; - this.lblMisc.Location = new System.Drawing.Point(15, 146); - this.lblMisc.Name = "lblMisc"; - this.lblMisc.Size = new System.Drawing.Size(32, 13); - this.lblMisc.TabIndex = 15; - this.lblMisc.Text = "Misc:"; - // - // lblCompare - // - this.lblCompare.AutoSize = true; - this.lblCompare.Location = new System.Drawing.Point(15, 118); - this.lblCompare.Name = "lblCompare"; - this.lblCompare.Size = new System.Drawing.Size(52, 13); - this.lblCompare.TabIndex = 14; - this.lblCompare.Text = "Compare:"; - // - // chkHash - // - this.chkHash.AutoSize = true; - this.chkHash.Checked = true; - this.chkHash.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkHash.Location = new System.Drawing.Point(320, 117); - this.chkHash.Name = "chkHash"; - this.chkHash.Size = new System.Drawing.Size(51, 17); - this.chkHash.TabIndex = 13; - this.chkHash.Text = "Hash"; - this.chkHash.UseVisualStyleBackColor = true; - // - // chkDate - // - this.chkDate.AutoSize = true; - this.chkDate.Location = new System.Drawing.Point(265, 117); - this.chkDate.Name = "chkDate"; - this.chkDate.Size = new System.Drawing.Size(49, 17); - this.chkDate.TabIndex = 12; - this.chkDate.Text = "Date"; - this.chkDate.UseVisualStyleBackColor = true; - // - // chkSize - // - this.chkSize.AutoSize = true; - this.chkSize.Location = new System.Drawing.Point(213, 117); - this.chkSize.Name = "chkSize"; - this.chkSize.Size = new System.Drawing.Size(46, 17); - this.chkSize.TabIndex = 11; - this.chkSize.Text = "Size"; - this.chkSize.UseVisualStyleBackColor = true; - // - // chkVersion - // - this.chkVersion.AutoSize = true; - this.chkVersion.Checked = true; - this.chkVersion.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkVersion.Location = new System.Drawing.Point(146, 117); - this.chkVersion.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); - this.chkVersion.Name = "chkVersion"; - this.chkVersion.Size = new System.Drawing.Size(61, 17); - this.chkVersion.TabIndex = 10; - this.chkVersion.Text = "Version"; - this.chkVersion.UseVisualStyleBackColor = true; - // - // txtBaseURL - // - this.txtBaseURL.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtBaseURL.HelpfulText = "Where you will upload the feed and update files for distribution to clients"; - this.txtBaseURL.Location = new System.Drawing.Point(146, 86); - this.txtBaseURL.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); - this.txtBaseURL.Name = "txtBaseURL"; - this.txtBaseURL.Size = new System.Drawing.Size(617, 20); - this.txtBaseURL.TabIndex = 9; - // - // lblBaseURL - // - this.lblBaseURL.AutoSize = true; - this.lblBaseURL.Location = new System.Drawing.Point(15, 89); - this.lblBaseURL.Name = "lblBaseURL"; - this.lblBaseURL.Size = new System.Drawing.Size(59, 13); - this.lblBaseURL.TabIndex = 8; - this.lblBaseURL.Text = "Base URL:"; - // - // chkIgnoreVsHost - // - this.chkIgnoreVsHost.AutoSize = true; - this.chkIgnoreVsHost.Checked = true; - this.chkIgnoreVsHost.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkIgnoreVsHost.Location = new System.Drawing.Point(293, 173); - this.chkIgnoreVsHost.Name = "chkIgnoreVsHost"; - this.chkIgnoreVsHost.Size = new System.Drawing.Size(103, 17); - this.chkIgnoreVsHost.TabIndex = 7; - this.chkIgnoreVsHost.Text = "VS Hosting Files"; - this.chkIgnoreVsHost.UseVisualStyleBackColor = true; - // - // chkIgnoreSymbols - // - this.chkIgnoreSymbols.AutoSize = true; - this.chkIgnoreSymbols.Checked = true; - this.chkIgnoreSymbols.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkIgnoreSymbols.Location = new System.Drawing.Point(146, 173); - this.chkIgnoreSymbols.Name = "chkIgnoreSymbols"; - this.chkIgnoreSymbols.Size = new System.Drawing.Size(100, 17); - this.chkIgnoreSymbols.TabIndex = 7; - this.chkIgnoreSymbols.Text = "Debug Symbols"; - this.chkIgnoreSymbols.UseVisualStyleBackColor = true; - this.chkIgnoreSymbols.CheckedChanged += new System.EventHandler(this.chkIgnoreSymbols_CheckedChanged); - // - // cmdFeedXML - // - this.cmdFeedXML.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.cmdFeedXML.Location = new System.Drawing.Point(769, 53); - this.cmdFeedXML.Name = "cmdFeedXML"; - this.cmdFeedXML.Size = new System.Drawing.Size(26, 23); - this.cmdFeedXML.TabIndex = 5; - this.cmdFeedXML.Text = "..."; - this.cmdFeedXML.UseVisualStyleBackColor = true; - this.cmdFeedXML.Click += new System.EventHandler(this.cmdFeedXML_Click); - // - // txtFeedXML - // - this.txtFeedXML.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtFeedXML.BackColor = System.Drawing.Color.White; - this.txtFeedXML.HelpfulText = "The file your application downloads to determine if there are updates"; - this.txtFeedXML.Location = new System.Drawing.Point(146, 55); - this.txtFeedXML.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); - this.txtFeedXML.Name = "txtFeedXML"; - this.txtFeedXML.Size = new System.Drawing.Size(617, 20); - this.txtFeedXML.TabIndex = 4; - // - // lblFeedXML - // - this.lblFeedXML.AutoSize = true; - this.lblFeedXML.Location = new System.Drawing.Point(15, 58); - this.lblFeedXML.Name = "lblFeedXML"; - this.lblFeedXML.Size = new System.Drawing.Size(98, 13); - this.lblFeedXML.TabIndex = 3; - this.lblFeedXML.Text = "Feed NauXML File:"; - // - // cmdOutputFolder - // - this.cmdOutputFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.cmdOutputFolder.Location = new System.Drawing.Point(769, 22); - this.cmdOutputFolder.Name = "cmdOutputFolder"; - this.cmdOutputFolder.Size = new System.Drawing.Size(26, 23); - this.cmdOutputFolder.TabIndex = 2; - this.cmdOutputFolder.Text = "..."; - this.cmdOutputFolder.UseVisualStyleBackColor = true; - this.cmdOutputFolder.Click += new System.EventHandler(this.cmdOutputFolder_Click); - // - // txtOutputFolder - // - this.txtOutputFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtOutputFolder.BackColor = System.Drawing.Color.White; - this.txtOutputFolder.HelpfulText = "The folder that contains the files you want to distribute"; - this.txtOutputFolder.Location = new System.Drawing.Point(146, 24); - this.txtOutputFolder.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); - this.txtOutputFolder.Name = "txtOutputFolder"; - this.txtOutputFolder.Size = new System.Drawing.Size(617, 20); - this.txtOutputFolder.TabIndex = 1; - // - // lblOutputFolder - // - this.lblOutputFolder.AutoSize = true; - this.lblOutputFolder.Location = new System.Drawing.Point(15, 27); - this.lblOutputFolder.Name = "lblOutputFolder"; - this.lblOutputFolder.Size = new System.Drawing.Size(110, 13); - this.lblOutputFolder.TabIndex = 0; - this.lblOutputFolder.Text = "Project Output Folder:"; - // - // txtAddExtension - // - this.txtAddExtension.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtAddExtension.HelpfulText = "Add extension to each file"; - this.txtAddExtension.Location = new System.Drawing.Point(516, 142); - this.txtAddExtension.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); - this.txtAddExtension.Name = "txtAddExtension"; - this.txtAddExtension.Size = new System.Drawing.Size(98, 20); - this.txtAddExtension.TabIndex = 18; - // - // lblAddExtension - // - this.lblAddExtension.AutoSize = true; - this.lblAddExtension.Location = new System.Drawing.Point(433, 146); - this.lblAddExtension.Name = "lblAddExtension"; - this.lblAddExtension.Size = new System.Drawing.Size(77, 13); - this.lblAddExtension.TabIndex = 19; - this.lblAddExtension.Text = "Add extension:"; - // - // frmMain - // - this.AllowDrop = true; - 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(834, 492); - this.Controls.Add(this.ToolStripContainer1); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MinimumSize = new System.Drawing.Size(850, 530); - this.Name = "frmMain"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Feed Builder"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmMain_FormClosing); - this.Load += new System.EventHandler(this.frmMain_Load); - this.DragDrop += new System.Windows.Forms.DragEventHandler(this.frmMain_DragDrop); - this.DragEnter += new System.Windows.Forms.DragEventHandler(this.frmMain_DragEnter); - this.tsMain.ResumeLayout(false); - this.tsMain.PerformLayout(); - this.ToolStripContainer1.ContentPanel.ResumeLayout(false); - this.ToolStripContainer1.TopToolStripPanel.ResumeLayout(false); - this.ToolStripContainer1.TopToolStripPanel.PerformLayout(); - this.ToolStripContainer1.ResumeLayout(false); - this.ToolStripContainer1.PerformLayout(); - this.panFiles.ResumeLayout(false); - this.grpSettings.ResumeLayout(false); - this.grpSettings.PerformLayout(); - this.ResumeLayout(false); + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); + this.lstFiles = new System.Windows.Forms.ListView(); + this.colFilename = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colVersion = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colHash = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.imgFiles = new System.Windows.Forms.ImageList(this.components); + this.fbdOutputFolder = new System.Windows.Forms.FolderBrowserDialog(); + this.sfdFeedXML = new System.Windows.Forms.SaveFileDialog(); + this.tsMain = new System.Windows.Forms.ToolStrip(); + this.btnNew = new System.Windows.Forms.ToolStripButton(); + this.btnOpen = new System.Windows.Forms.ToolStripButton(); + this.btnSave = new System.Windows.Forms.ToolStripButton(); + this.btnSaveAs = new System.Windows.Forms.ToolStripButton(); + this.tsSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.btnRefresh = new System.Windows.Forms.ToolStripButton(); + this.btnOpenOutputs = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.btnBuild = new System.Windows.Forms.ToolStripButton(); + this.ToolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); + this.panFiles = new System.Windows.Forms.Panel(); + this.grpSettings = new System.Windows.Forms.GroupBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.txtExcludeFileSpec = new System.Windows.Forms.TextBox(); + this.txtMatchFileSpec = new System.Windows.Forms.TextBox(); + this.lblAddExtension = new System.Windows.Forms.Label(); + this.chkCleanUp = new System.Windows.Forms.CheckBox(); + this.chkCopyFiles = new System.Windows.Forms.CheckBox(); + this.lblIgnore = new System.Windows.Forms.Label(); + this.lblMisc = new System.Windows.Forms.Label(); + this.lblCompare = new System.Windows.Forms.Label(); + this.chkHash = new System.Windows.Forms.CheckBox(); + this.chkDate = new System.Windows.Forms.CheckBox(); + this.chkSize = new System.Windows.Forms.CheckBox(); + this.chkVersion = new System.Windows.Forms.CheckBox(); + this.lblBaseURL = new System.Windows.Forms.Label(); + this.chkIgnoreVsHost = new System.Windows.Forms.CheckBox(); + this.chkIgnoreSymbols = new System.Windows.Forms.CheckBox(); + this.cmdFeedXML = new System.Windows.Forms.Button(); + this.lblFeedXML = new System.Windows.Forms.Label(); + this.cmdOutputFolder = new System.Windows.Forms.Button(); + this.lblOutputFolder = new System.Windows.Forms.Label(); + this.txtFileSearch = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.txtAddExtension = new FeedBuilder.HelpfulTextBox(this.components); + this.txtBaseURL = new FeedBuilder.HelpfulTextBox(this.components); + this.txtFeedXML = new FeedBuilder.HelpfulTextBox(this.components); + this.txtOutputFolder = new FeedBuilder.HelpfulTextBox(this.components); + this.tsMain.SuspendLayout(); + this.ToolStripContainer1.ContentPanel.SuspendLayout(); + this.ToolStripContainer1.TopToolStripPanel.SuspendLayout(); + this.ToolStripContainer1.SuspendLayout(); + this.panFiles.SuspendLayout(); + this.grpSettings.SuspendLayout(); + this.SuspendLayout(); + // + // lstFiles + // + this.lstFiles.CheckBoxes = true; + this.lstFiles.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.colFilename, + this.colVersion, + this.colSize, + this.colDate, + this.colHash}); + this.lstFiles.Dock = System.Windows.Forms.DockStyle.Fill; + this.lstFiles.FullRowSelect = true; + this.lstFiles.Location = new System.Drawing.Point(0, 12); + this.lstFiles.Margin = new System.Windows.Forms.Padding(0); + this.lstFiles.Name = "lstFiles"; + this.lstFiles.Size = new System.Drawing.Size(847, 290); + this.lstFiles.SmallImageList = this.imgFiles; + this.lstFiles.TabIndex = 0; + this.lstFiles.UseCompatibleStateImageBehavior = false; + this.lstFiles.View = System.Windows.Forms.View.Details; + // + // colFilename + // + this.colFilename.Text = "Filename"; + this.colFilename.Width = 200; + // + // colVersion + // + this.colVersion.Text = "Version"; + this.colVersion.Width = 80; + // + // colSize + // + this.colSize.Text = "Size"; + this.colSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.colSize.Width = 80; + // + // colDate + // + this.colDate.Text = "Date"; + this.colDate.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.colDate.Width = 120; + // + // colHash + // + this.colHash.Text = "Hash"; + this.colHash.Width = 300; + // + // imgFiles + // + this.imgFiles.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imgFiles.ImageSize = new System.Drawing.Size(32, 32); + this.imgFiles.TransparentColor = System.Drawing.Color.Transparent; + // + // fbdOutputFolder + // + this.fbdOutputFolder.Description = "Select your projects output folder:"; + // + // sfdFeedXML + // + this.sfdFeedXML.DefaultExt = "xml"; + this.sfdFeedXML.Filter = "XML Files (*.xml)|*.xml|All Files (*.*)|*.*"; + this.sfdFeedXML.Title = "Select the location to save your NauXML file:"; + // + // tsMain + // + this.tsMain.Dock = System.Windows.Forms.DockStyle.None; + this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.btnNew, + this.btnOpen, + this.btnSave, + this.btnSaveAs, + this.tsSeparator1, + this.btnRefresh, + this.btnOpenOutputs, + this.toolStripSeparator1, + this.btnBuild}); + this.tsMain.Location = new System.Drawing.Point(0, 0); + this.tsMain.Name = "tsMain"; + this.tsMain.Size = new System.Drawing.Size(871, 25); + this.tsMain.Stretch = true; + this.tsMain.TabIndex = 2; + this.tsMain.Text = "Commands"; + // + // btnNew + // + this.btnNew.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnNew.Image = ((System.Drawing.Image)(resources.GetObject("btnNew.Image"))); + this.btnNew.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnNew.Name = "btnNew"; + this.btnNew.Size = new System.Drawing.Size(23, 22); + this.btnNew.Text = "&New"; + this.btnNew.Click += new System.EventHandler(this.btnNew_Click); + // + // btnOpen + // + this.btnOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnOpen.Image = ((System.Drawing.Image)(resources.GetObject("btnOpen.Image"))); + this.btnOpen.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnOpen.Name = "btnOpen"; + this.btnOpen.Size = new System.Drawing.Size(23, 22); + this.btnOpen.Text = "&Open"; + this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click); + // + // btnSave + // + this.btnSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnSave.Image = ((System.Drawing.Image)(resources.GetObject("btnSave.Image"))); + this.btnSave.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(23, 22); + this.btnSave.Text = "&Save"; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // btnSaveAs + // + this.btnSaveAs.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.btnSaveAs.Image = ((System.Drawing.Image)(resources.GetObject("btnSaveAs.Image"))); + this.btnSaveAs.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnSaveAs.Name = "btnSaveAs"; + this.btnSaveAs.Size = new System.Drawing.Size(60, 22); + this.btnSaveAs.Text = "Save As..."; + this.btnSaveAs.Click += new System.EventHandler(this.btnSaveAs_Click); + // + // tsSeparator1 + // + this.tsSeparator1.Name = "tsSeparator1"; + this.tsSeparator1.Size = new System.Drawing.Size(6, 25); + // + // btnRefresh + // + this.btnRefresh.Image = ((System.Drawing.Image)(resources.GetObject("btnRefresh.Image"))); + this.btnRefresh.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnRefresh.Name = "btnRefresh"; + this.btnRefresh.Size = new System.Drawing.Size(92, 22); + this.btnRefresh.Text = "Refresh Files"; + this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click); + // + // btnOpenOutputs + // + this.btnOpenOutputs.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.btnOpenOutputs.Image = ((System.Drawing.Image)(resources.GetObject("btnOpenOutputs.Image"))); + this.btnOpenOutputs.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnOpenOutputs.Name = "btnOpenOutputs"; + this.btnOpenOutputs.Size = new System.Drawing.Size(133, 22); + this.btnOpenOutputs.Text = "Open Output Folder"; + this.btnOpenOutputs.Click += new System.EventHandler(this.btnOpenOutputs_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // btnBuild + // + this.btnBuild.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.btnBuild.Image = ((System.Drawing.Image)(resources.GetObject("btnBuild.Image"))); + this.btnBuild.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnBuild.Name = "btnBuild"; + this.btnBuild.Size = new System.Drawing.Size(54, 22); + this.btnBuild.Text = "Build"; + this.btnBuild.Click += new System.EventHandler(this.cmdBuild_Click); + // + // ToolStripContainer1 + // + // + // ToolStripContainer1.ContentPanel + // + this.ToolStripContainer1.ContentPanel.Controls.Add(this.panFiles); + this.ToolStripContainer1.ContentPanel.Controls.Add(this.grpSettings); + this.ToolStripContainer1.ContentPanel.Padding = new System.Windows.Forms.Padding(12, 8, 12, 12); + this.ToolStripContainer1.ContentPanel.Size = new System.Drawing.Size(871, 600); + this.ToolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.ToolStripContainer1.Location = new System.Drawing.Point(0, 0); + this.ToolStripContainer1.Name = "ToolStripContainer1"; + this.ToolStripContainer1.Size = new System.Drawing.Size(871, 625); + this.ToolStripContainer1.TabIndex = 3; + this.ToolStripContainer1.Text = "ToolStripContainer1"; + // + // ToolStripContainer1.TopToolStripPanel + // + this.ToolStripContainer1.TopToolStripPanel.Controls.Add(this.tsMain); + // + // panFiles + // + this.panFiles.Controls.Add(this.lstFiles); + this.panFiles.Dock = System.Windows.Forms.DockStyle.Fill; + this.panFiles.Location = new System.Drawing.Point(12, 286); + this.panFiles.Name = "panFiles"; + this.panFiles.Padding = new System.Windows.Forms.Padding(0, 12, 0, 0); + this.panFiles.Size = new System.Drawing.Size(847, 302); + this.panFiles.TabIndex = 2; + // + // grpSettings + // + this.grpSettings.Controls.Add(this.txtFileSearch); + this.grpSettings.Controls.Add(this.label2); + this.grpSettings.Controls.Add(this.label1); + this.grpSettings.Controls.Add(this.txtExcludeFileSpec); + this.grpSettings.Controls.Add(this.txtMatchFileSpec); + this.grpSettings.Controls.Add(this.lblAddExtension); + this.grpSettings.Controls.Add(this.txtAddExtension); + this.grpSettings.Controls.Add(this.chkCleanUp); + this.grpSettings.Controls.Add(this.chkCopyFiles); + this.grpSettings.Controls.Add(this.label4); + this.grpSettings.Controls.Add(this.label3); + this.grpSettings.Controls.Add(this.lblIgnore); + this.grpSettings.Controls.Add(this.lblMisc); + this.grpSettings.Controls.Add(this.lblCompare); + this.grpSettings.Controls.Add(this.chkHash); + this.grpSettings.Controls.Add(this.chkDate); + this.grpSettings.Controls.Add(this.chkSize); + this.grpSettings.Controls.Add(this.chkVersion); + this.grpSettings.Controls.Add(this.txtBaseURL); + this.grpSettings.Controls.Add(this.lblBaseURL); + this.grpSettings.Controls.Add(this.chkIgnoreVsHost); + this.grpSettings.Controls.Add(this.chkIgnoreSymbols); + this.grpSettings.Controls.Add(this.cmdFeedXML); + this.grpSettings.Controls.Add(this.txtFeedXML); + this.grpSettings.Controls.Add(this.lblFeedXML); + this.grpSettings.Controls.Add(this.cmdOutputFolder); + this.grpSettings.Controls.Add(this.txtOutputFolder); + this.grpSettings.Controls.Add(this.lblOutputFolder); + this.grpSettings.Dock = System.Windows.Forms.DockStyle.Top; + this.grpSettings.Location = new System.Drawing.Point(12, 8); + this.grpSettings.Name = "grpSettings"; + this.grpSettings.Padding = new System.Windows.Forms.Padding(12, 8, 12, 8); + this.grpSettings.Size = new System.Drawing.Size(847, 278); + this.grpSettings.TabIndex = 1; + this.grpSettings.TabStop = false; + this.grpSettings.Text = "Settings:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(449, 34); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(95, 13); + this.label2.TabIndex = 21; + this.label2.Text = "File Exclude Spec:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(15, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(87, 13); + this.label1.TabIndex = 21; + this.label1.Text = "File Match Spec:"; + // + // txtExcludeFileSpec + // + this.txtExcludeFileSpec.Location = new System.Drawing.Point(563, 31); + this.txtExcludeFileSpec.Name = "txtExcludeFileSpec"; + this.txtExcludeFileSpec.Size = new System.Drawing.Size(237, 20); + this.txtExcludeFileSpec.TabIndex = 20; + // + // txtMatchFileSpec + // + this.txtMatchFileSpec.Location = new System.Drawing.Point(146, 31); + this.txtMatchFileSpec.Name = "txtMatchFileSpec"; + this.txtMatchFileSpec.Size = new System.Drawing.Size(237, 20); + this.txtMatchFileSpec.TabIndex = 20; + this.txtMatchFileSpec.Text = "*.*"; + // + // lblAddExtension + // + this.lblAddExtension.AutoSize = true; + this.lblAddExtension.Location = new System.Drawing.Point(433, 179); + this.lblAddExtension.Name = "lblAddExtension"; + this.lblAddExtension.Size = new System.Drawing.Size(77, 13); + this.lblAddExtension.TabIndex = 19; + this.lblAddExtension.Text = "Add extension:"; + // + // chkCleanUp + // + this.chkCleanUp.AutoSize = true; + this.chkCleanUp.Checked = true; + this.chkCleanUp.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkCleanUp.Location = new System.Drawing.Point(293, 178); + this.chkCleanUp.Name = "chkCleanUp"; + this.chkCleanUp.Size = new System.Drawing.Size(134, 17); + this.chkCleanUp.TabIndex = 17; + this.chkCleanUp.Text = "Clean Unselected Files"; + this.chkCleanUp.UseVisualStyleBackColor = true; + // + // chkCopyFiles + // + this.chkCopyFiles.AutoSize = true; + this.chkCopyFiles.Checked = true; + this.chkCopyFiles.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkCopyFiles.Location = new System.Drawing.Point(146, 178); + this.chkCopyFiles.Name = "chkCopyFiles"; + this.chkCopyFiles.Size = new System.Drawing.Size(141, 17); + this.chkCopyFiles.TabIndex = 16; + this.chkCopyFiles.Text = "Copy Files with NauXML"; + this.chkCopyFiles.UseVisualStyleBackColor = true; + this.chkCopyFiles.CheckedChanged += new System.EventHandler(this.chkCopyFiles_CheckedChanged); + // + // lblIgnore + // + this.lblIgnore.AutoSize = true; + this.lblIgnore.Location = new System.Drawing.Point(15, 207); + this.lblIgnore.Name = "lblIgnore"; + this.lblIgnore.Size = new System.Drawing.Size(40, 13); + this.lblIgnore.TabIndex = 15; + this.lblIgnore.Text = "Ignore:"; + // + // lblMisc + // + this.lblMisc.AutoSize = true; + this.lblMisc.Location = new System.Drawing.Point(15, 179); + this.lblMisc.Name = "lblMisc"; + this.lblMisc.Size = new System.Drawing.Size(32, 13); + this.lblMisc.TabIndex = 15; + this.lblMisc.Text = "Misc:"; + // + // lblCompare + // + this.lblCompare.AutoSize = true; + this.lblCompare.Location = new System.Drawing.Point(15, 151); + this.lblCompare.Name = "lblCompare"; + this.lblCompare.Size = new System.Drawing.Size(52, 13); + this.lblCompare.TabIndex = 14; + this.lblCompare.Text = "Compare:"; + // + // chkHash + // + this.chkHash.AutoSize = true; + this.chkHash.Checked = true; + this.chkHash.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkHash.Location = new System.Drawing.Point(320, 150); + this.chkHash.Name = "chkHash"; + this.chkHash.Size = new System.Drawing.Size(51, 17); + this.chkHash.TabIndex = 13; + this.chkHash.Text = "Hash"; + this.chkHash.UseVisualStyleBackColor = true; + // + // chkDate + // + this.chkDate.AutoSize = true; + this.chkDate.Location = new System.Drawing.Point(265, 150); + this.chkDate.Name = "chkDate"; + this.chkDate.Size = new System.Drawing.Size(49, 17); + this.chkDate.TabIndex = 12; + this.chkDate.Text = "Date"; + this.chkDate.UseVisualStyleBackColor = true; + // + // chkSize + // + this.chkSize.AutoSize = true; + this.chkSize.Location = new System.Drawing.Point(213, 150); + this.chkSize.Name = "chkSize"; + this.chkSize.Size = new System.Drawing.Size(46, 17); + this.chkSize.TabIndex = 11; + this.chkSize.Text = "Size"; + this.chkSize.UseVisualStyleBackColor = true; + // + // chkVersion + // + this.chkVersion.AutoSize = true; + this.chkVersion.Checked = true; + this.chkVersion.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkVersion.Location = new System.Drawing.Point(146, 150); + this.chkVersion.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); + this.chkVersion.Name = "chkVersion"; + this.chkVersion.Size = new System.Drawing.Size(61, 17); + this.chkVersion.TabIndex = 10; + this.chkVersion.Text = "Version"; + this.chkVersion.UseVisualStyleBackColor = true; + // + // lblBaseURL + // + this.lblBaseURL.AutoSize = true; + this.lblBaseURL.Location = new System.Drawing.Point(15, 122); + this.lblBaseURL.Name = "lblBaseURL"; + this.lblBaseURL.Size = new System.Drawing.Size(59, 13); + this.lblBaseURL.TabIndex = 8; + this.lblBaseURL.Text = "Base URL:"; + // + // chkIgnoreVsHost + // + this.chkIgnoreVsHost.AutoSize = true; + this.chkIgnoreVsHost.Checked = true; + this.chkIgnoreVsHost.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkIgnoreVsHost.Location = new System.Drawing.Point(293, 206); + this.chkIgnoreVsHost.Name = "chkIgnoreVsHost"; + this.chkIgnoreVsHost.Size = new System.Drawing.Size(103, 17); + this.chkIgnoreVsHost.TabIndex = 7; + this.chkIgnoreVsHost.Text = "VS Hosting Files"; + this.chkIgnoreVsHost.UseVisualStyleBackColor = true; + // + // chkIgnoreSymbols + // + this.chkIgnoreSymbols.AutoSize = true; + this.chkIgnoreSymbols.Checked = true; + this.chkIgnoreSymbols.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkIgnoreSymbols.Location = new System.Drawing.Point(146, 206); + this.chkIgnoreSymbols.Name = "chkIgnoreSymbols"; + this.chkIgnoreSymbols.Size = new System.Drawing.Size(100, 17); + this.chkIgnoreSymbols.TabIndex = 7; + this.chkIgnoreSymbols.Text = "Debug Symbols"; + this.chkIgnoreSymbols.UseVisualStyleBackColor = true; + this.chkIgnoreSymbols.CheckedChanged += new System.EventHandler(this.chkIgnoreSymbols_CheckedChanged); + // + // cmdFeedXML + // + this.cmdFeedXML.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdFeedXML.Location = new System.Drawing.Point(806, 86); + this.cmdFeedXML.Name = "cmdFeedXML"; + this.cmdFeedXML.Size = new System.Drawing.Size(26, 23); + this.cmdFeedXML.TabIndex = 5; + this.cmdFeedXML.Text = "..."; + this.cmdFeedXML.UseVisualStyleBackColor = true; + this.cmdFeedXML.Click += new System.EventHandler(this.cmdFeedXML_Click); + // + // lblFeedXML + // + this.lblFeedXML.AutoSize = true; + this.lblFeedXML.Location = new System.Drawing.Point(15, 91); + this.lblFeedXML.Name = "lblFeedXML"; + this.lblFeedXML.Size = new System.Drawing.Size(98, 13); + this.lblFeedXML.TabIndex = 3; + this.lblFeedXML.Text = "Feed NauXML File:"; + // + // cmdOutputFolder + // + this.cmdOutputFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOutputFolder.Location = new System.Drawing.Point(806, 55); + this.cmdOutputFolder.Name = "cmdOutputFolder"; + this.cmdOutputFolder.Size = new System.Drawing.Size(26, 23); + this.cmdOutputFolder.TabIndex = 2; + this.cmdOutputFolder.Text = "..."; + this.cmdOutputFolder.UseVisualStyleBackColor = true; + this.cmdOutputFolder.Click += new System.EventHandler(this.cmdOutputFolder_Click); + // + // lblOutputFolder + // + this.lblOutputFolder.AutoSize = true; + this.lblOutputFolder.Location = new System.Drawing.Point(15, 60); + this.lblOutputFolder.Name = "lblOutputFolder"; + this.lblOutputFolder.Size = new System.Drawing.Size(110, 13); + this.lblOutputFolder.TabIndex = 0; + this.lblOutputFolder.Text = "Project Output Folder:"; + // + // txtFileSearch + // + this.txtFileSearch.Enabled = false; + this.txtFileSearch.Location = new System.Drawing.Point(146, 254); + this.txtFileSearch.Name = "txtFileSearch"; + this.txtFileSearch.Size = new System.Drawing.Size(505, 20); + this.txtFileSearch.TabIndex = 22; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(15, 257); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(61, 13); + this.label3.TabIndex = 15; + this.label3.Text = "Select Files"; + // + // label4 + // + this.label4.BackColor = System.Drawing.SystemColors.Info; + this.label4.Location = new System.Drawing.Point(657, 245); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(143, 30); + this.label4.TabIndex = 15; + this.label4.Text = "Use regex pattern to select files in the listview."; + this.label4.TextAlign = System.Drawing.ContentAlignment.BottomLeft; + // + // txtAddExtension + // + this.txtAddExtension.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtAddExtension.HelpfulText = "Add extension to each file"; + this.txtAddExtension.Location = new System.Drawing.Point(516, 175); + this.txtAddExtension.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); + this.txtAddExtension.Name = "txtAddExtension"; + this.txtAddExtension.Size = new System.Drawing.Size(135, 20); + this.txtAddExtension.TabIndex = 18; + // + // txtBaseURL + // + this.txtBaseURL.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtBaseURL.HelpfulText = "Where you will upload the feed and update files for distribution to clients"; + this.txtBaseURL.Location = new System.Drawing.Point(146, 119); + this.txtBaseURL.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); + this.txtBaseURL.Name = "txtBaseURL"; + this.txtBaseURL.Size = new System.Drawing.Size(654, 20); + this.txtBaseURL.TabIndex = 9; + // + // txtFeedXML + // + this.txtFeedXML.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtFeedXML.BackColor = System.Drawing.Color.White; + this.txtFeedXML.HelpfulText = "The file your application downloads to determine if there are updates"; + this.txtFeedXML.Location = new System.Drawing.Point(146, 88); + this.txtFeedXML.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); + this.txtFeedXML.Name = "txtFeedXML"; + this.txtFeedXML.Size = new System.Drawing.Size(654, 20); + this.txtFeedXML.TabIndex = 4; + // + // txtOutputFolder + // + this.txtOutputFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtOutputFolder.BackColor = System.Drawing.Color.White; + this.txtOutputFolder.HelpfulText = "The folder that contains the files you want to distribute"; + this.txtOutputFolder.Location = new System.Drawing.Point(146, 57); + this.txtOutputFolder.Margin = new System.Windows.Forms.Padding(3, 3, 3, 8); + this.txtOutputFolder.Name = "txtOutputFolder"; + this.txtOutputFolder.Size = new System.Drawing.Size(654, 20); + this.txtOutputFolder.TabIndex = 1; + // + // frmMain + // + this.AllowDrop = true; + 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(871, 625); + this.Controls.Add(this.ToolStripContainer1); + this.DoubleBuffered = true; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MinimumSize = new System.Drawing.Size(850, 530); + this.Name = "frmMain"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Feed Builder"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmMain_FormClosing); + this.Load += new System.EventHandler(this.frmMain_Load); + this.Shown += new System.EventHandler(this.frmMain_Shown); + this.DragDrop += new System.Windows.Forms.DragEventHandler(this.frmMain_DragDrop); + this.DragEnter += new System.Windows.Forms.DragEventHandler(this.frmMain_DragEnter); + this.tsMain.ResumeLayout(false); + this.tsMain.PerformLayout(); + this.ToolStripContainer1.ContentPanel.ResumeLayout(false); + this.ToolStripContainer1.TopToolStripPanel.ResumeLayout(false); + this.ToolStripContainer1.TopToolStripPanel.PerformLayout(); + this.ToolStripContainer1.ResumeLayout(false); + this.ToolStripContainer1.PerformLayout(); + this.panFiles.ResumeLayout(false); + this.grpSettings.ResumeLayout(false); + this.grpSettings.PerformLayout(); + this.ResumeLayout(false); } @@ -597,7 +667,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton btnNew; private System.Windows.Forms.ToolStripButton btnOpen; private System.Windows.Forms.ToolStripButton btnSave; - private System.Windows.Forms.ToolStripButton btnRefresh; + private System.Windows.Forms.ToolStripButton btnRefresh; private System.Windows.Forms.ToolStripContainer ToolStripContainer1; private System.Windows.Forms.GroupBox grpSettings; private System.Windows.Forms.CheckBox chkCleanUp; @@ -622,10 +692,17 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton btnSaveAs; private System.Windows.Forms.ToolStripButton btnBuild; private System.Windows.Forms.ToolStripSeparator tsSeparator1; - private ToolStripButton btnOpenOutputs; + private ToolStripButton btnOpenOutputs; private Panel panFiles; private ToolStripSeparator toolStripSeparator1; - private Label lblAddExtension; - private HelpfulTextBox txtAddExtension; - } + private Label lblAddExtension; + private HelpfulTextBox txtAddExtension; + private Label label2; + private Label label1; + private TextBox txtExcludeFileSpec; + private TextBox txtMatchFileSpec; + private TextBox txtFileSearch; + private Label label4; + private Label label3; + } } diff --git a/FeedBuilder/frmMain.cs b/FeedBuilder/frmMain.cs index 1fea997b..368d1059 100644 --- a/FeedBuilder/frmMain.cs +++ b/FeedBuilder/frmMain.cs @@ -1,12 +1,21 @@ using System; +using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; +using System.Drawing; using System.Globalization; using System.IO; +using System.Linq; +using System.Reactive; +using System.Reactive.Linq; using System.Runtime.InteropServices; +using System.Text.RegularExpressions; using System.Threading; +using System.Threading.Tasks; using System.Windows.Forms; using System.Xml; +using FeedBuilder.Properties; +using FileIcons; namespace FeedBuilder { @@ -35,11 +44,11 @@ public frmMain() #endregion #region " Loading/Initialization/Lifetime" - - private void frmMain_Load(Object sender, EventArgs e) + private bool loadedSettings = false; + private async void frmMain_Load(Object sender, EventArgs e) { - Visible = false; - InitializeFormSettings(); + + string[] args = Environment.GetCommandLineArgs(); // The first arg is the path to ourself //If args.Count >= 2 Then @@ -59,6 +68,7 @@ private void frmMain_Load(Object sender, EventArgs e) return; } + Visible = false; FileName = _argParser.FileName; if (!string.IsNullOrEmpty(FileName)) { @@ -66,7 +76,7 @@ private void frmMain_Load(Object sender, EventArgs e) { FeedBuilderSettingsProvider p = new FeedBuilderSettingsProvider(); p.LoadFrom(FileName); - InitializeFormSettings(); + await InitializeFormSettings(); } else { @@ -75,25 +85,24 @@ private void frmMain_Load(Object sender, EventArgs e) UpdateTitle(); } } + if (_argParser.ShowGui) Show(); if (_argParser.Build) Build(); if (!_argParser.ShowGui) Close(); } - - private void InitializeFormSettings() + private async void frmMain_Shown(object sender, EventArgs e) { - if (string.IsNullOrEmpty(Settings.Default.OutputFolder)) - { - txtOutputFolder.Text = string.Empty; - } - else - { - string path = GetFullDirectoryPath(Settings.Default.OutputFolder); - txtOutputFolder.Text = Directory.Exists(path) ? Settings.Default.OutputFolder : string.Empty; - } + if (!loadedSettings) + await InitializeFormSettings(); + } + private async Task InitializeFormSettings() + { + txtOutputFolder.Text = !string.IsNullOrEmpty(Settings.Default.OutputFolder) && Directory.Exists(Settings.Default.OutputFolder) ? Settings.Default.OutputFolder : string.Empty; txtFeedXML.Text = string.IsNullOrEmpty(Settings.Default.FeedXML) ? string.Empty : Settings.Default.FeedXML; txtBaseURL.Text = string.IsNullOrEmpty(Settings.Default.BaseURL) ? string.Empty : Settings.Default.BaseURL; + txtMatchFileSpec.Text = string.IsNullOrEmpty(Settings.Default.MatchFileSpec) ? "*.*" : Settings.Default.MatchFileSpec; + txtExcludeFileSpec.Text = string.IsNullOrEmpty(Settings.Default.ExcludeFileSpec) ? string.Empty : Settings.Default.ExcludeFileSpec; chkVersion.Checked = Settings.Default.CompareVersion; chkSize.Checked = Settings.Default.CompareSize; @@ -104,11 +113,12 @@ private void InitializeFormSettings() chkIgnoreVsHost.Checked = Settings.Default.IgnoreVsHosting; chkCopyFiles.Checked = Settings.Default.CopyFiles; chkCleanUp.Checked = Settings.Default.CleanUp; - txtAddExtension.Text = Settings.Default.AddExtension; + txtAddExtension.Text = Settings.Default.AddExtension; - if (Settings.Default.IgnoreFiles == null) Settings.Default.IgnoreFiles = new StringCollection(); - ReadFiles(); + if (Settings.Default.IgnoreFiles == null) Settings.Default.IgnoreFiles = new StringCollection(); + await ReadFiles(); UpdateTitle(); + loadedSettings = true; } private void UpdateTitle() @@ -125,9 +135,11 @@ private void SaveFormSettings() // ReSharper restore AssignNullToNotNullAttribute if (!string.IsNullOrEmpty(txtBaseURL.Text.Trim())) Settings.Default.BaseURL = txtBaseURL.Text.Trim(); - if (!string.IsNullOrEmpty(txtAddExtension.Text.Trim())) Settings.Default.AddExtension = txtAddExtension.Text.Trim(); + Settings.Default.MatchFileSpec = string.IsNullOrWhiteSpace(txtMatchFileSpec.Text) ? "*.*" : txtMatchFileSpec.Text; + Settings.Default.ExcludeFileSpec = string.IsNullOrWhiteSpace(txtMatchFileSpec.Text) ? string.Empty : txtExcludeFileSpec.Text; - Settings.Default.CompareVersion = chkVersion.Checked; + if (!string.IsNullOrEmpty(txtAddExtension.Text.Trim())) Settings.Default.AddExtension = txtAddExtension.Text.Trim(); + Settings.Default.CompareVersion = chkVersion.Checked; Settings.Default.CompareSize = chkSize.Checked; Settings.Default.CompareDate = chkDate.Checked; Settings.Default.CompareHash = chkHash.Checked; @@ -165,13 +177,13 @@ private void btnOpenOutputs_Click(object sender, EventArgs e) OpenOutputsFolder(); } - private void btnNew_Click(Object sender, EventArgs e) + private async void btnNew_Click(Object sender, EventArgs e) { Settings.Default.Reset(); - InitializeFormSettings(); + await InitializeFormSettings(); } - private void btnOpen_Click(Object sender, EventArgs e) + private async void btnOpen_Click(Object sender, EventArgs e) { OpenFileDialog dlg; if (_openDialog == null) @@ -189,7 +201,7 @@ private void btnOpen_Click(Object sender, EventArgs e) FeedBuilderSettingsProvider p = new FeedBuilderSettingsProvider(); p.LoadFrom(dlg.FileName); FileName = dlg.FileName; - InitializeFormSettings(); + await InitializeFormSettings(); } private void btnSave_Click(Object sender, EventArgs e) @@ -202,21 +214,21 @@ private void btnSaveAs_Click(Object sender, EventArgs e) Save(true); } - private void btnRefresh_Click(Object sender, EventArgs e) + private async void btnRefresh_Click(Object sender, EventArgs e) { - ReadFiles(); + await ReadFiles(); } #endregion #region " Options Events" - private void cmdOutputFolder_Click(Object sender, EventArgs e) + private async void cmdOutputFolder_Click(Object sender, EventArgs e) { fbdOutputFolder.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); if (fbdOutputFolder.ShowDialog(this) != DialogResult.OK) return; txtOutputFolder.Text = fbdOutputFolder.SelectedPath; - ReadFiles(); + await ReadFiles(); } private void cmdFeedXML_Click(Object sender, EventArgs e) @@ -225,9 +237,9 @@ private void cmdFeedXML_Click(Object sender, EventArgs e) if (sfdFeedXML.ShowDialog(this) == DialogResult.OK) txtFeedXML.Text = sfdFeedXML.FileName; } - private void chkIgnoreSymbols_CheckedChanged(object sender, EventArgs e) + private async void chkIgnoreSymbols_CheckedChanged(object sender, EventArgs e) { - ReadFiles(); + await ReadFiles(); } private void chkCopyFiles_CheckedChanged(Object sender, EventArgs e) @@ -240,10 +252,11 @@ private void chkCopyFiles_CheckedChanged(Object sender, EventArgs e) #region " Helper Methods " - private void Build() + private async void Build() { + SaveFormSettings(); AttachConsole(ATTACH_PARENT_PROCESS); - + Console.WriteLine("Building NAppUpdater feed '{0}'", txtBaseURL.Text.Trim()); if (string.IsNullOrEmpty(txtFeedXML.Text)) { @@ -254,7 +267,7 @@ private void Build() } // If the target folder doesn't exist, create a path to it string dest = txtFeedXML.Text.Trim(); - var destDir = Directory.GetParent(GetFullDirectoryPath(Path.GetDirectoryName(dest))); + var destDir = Directory.GetParent(new FileInfo(dest).FullName); if (!Directory.Exists(destDir.FullName)) Directory.CreateDirectory(destDir.FullName); XmlDocument doc = new XmlDocument(); @@ -267,131 +280,144 @@ private void Build() XmlElement tasks = doc.CreateElement("Tasks"); - Console.WriteLine("Processing feed items"); - int itemsCopied = 0; - int itemsCleaned = 0; - int itemsSkipped = 0; - int itemsFailed = 0; - int itemsMissingConditions = 0; - foreach (ListViewItem thisItem in lstFiles.Items) + Console.WriteLine("Refreshing file data..."); + if (_argParser.Build || await ReadFiles())// Force refresh if we didn't build from cmdline { - string destFile = ""; - string filename = ""; - try - { - filename = thisItem.Text; - destFile = Path.Combine(destDir.FullName, filename); - } - catch { } - if (destFile == "" || filename == "") + Console.WriteLine("Processing feed items"); + int itemsCopied = 0; + int itemsCleaned = 0; + int itemsSkipped = 0; + int itemsFailed = 0; + int itemsMissingConditions = 0; + foreach (ListViewItem thisItem in lstFiles.Items) { - string msg = string.Format("The file could not be pathed:\nFolder:'{0}'\nFile:{1}", destDir.FullName, filename); - if (_argParser.ShowGui) MessageBox.Show(msg); - Console.WriteLine(msg); - continue; - } - - if (thisItem.Checked) - { - var fileInfoEx = (FileInfoEx)thisItem.Tag; - XmlElement task = doc.CreateElement("FileUpdateTask"); - task.SetAttribute("localPath", fileInfoEx.RelativeName); - if (!string.IsNullOrEmpty(txtAddExtension.Text)) task.SetAttribute("updateTo",fileInfoEx.RelativeName+"."+txtAddExtension.Text.Trim()); - // generate FileUpdateTask metadata items - task.SetAttribute("lastModified", fileInfoEx.FileInfo.LastWriteTime.ToFileTime().ToString(CultureInfo.InvariantCulture)); - task.SetAttribute("fileSize", fileInfoEx.FileInfo.Length.ToString(CultureInfo.InvariantCulture)); - if (!string.IsNullOrEmpty(fileInfoEx.FileVersion)) task.SetAttribute("version", fileInfoEx.FileVersion); - - XmlElement conds = doc.CreateElement("Conditions"); - XmlElement cond; - - //File Exists - cond = doc.CreateElement("FileExistsCondition"); - cond.SetAttribute("type", "or-not"); - conds.AppendChild(cond); - - //Version - if (chkVersion.Checked && !string.IsNullOrEmpty(fileInfoEx.FileVersion)) + string destFile = ""; + string folder = ""; + string filename = ""; + try { - cond = doc.CreateElement("FileVersionCondition"); - cond.SetAttribute("type", "or"); - cond.SetAttribute("what", "below"); - cond.SetAttribute("version", fileInfoEx.FileVersion); - conds.AppendChild(cond); + folder = Path.GetDirectoryName(txtFeedXML.Text.Trim()); + filename = thisItem.Text; + if (folder != null) destFile = Path.Combine(folder, filename); } - - //Size - if (chkSize.Checked) + catch { } + if (destFile == "" || folder == "" || filename == "") { - cond = doc.CreateElement("FileSizeCondition"); - cond.SetAttribute("type", "or-not"); - cond.SetAttribute("what", "is"); - cond.SetAttribute("size", fileInfoEx.FileInfo.Length.ToString(CultureInfo.InvariantCulture)); - conds.AppendChild(cond); + string msg = string.Format("The file could not be pathed:\nFolder:'{0}'\nFile:{1}", folder, filename); + if (_argParser.ShowGui) MessageBox.Show(msg); + Console.WriteLine(msg); + continue; } - //Date - if (chkDate.Checked) + if (thisItem.Checked) { - cond = doc.CreateElement("FileDateCondition"); + var fileInfoEx = (FileInfoEx)thisItem.Tag; + XmlElement task = doc.CreateElement("FileUpdateTask"); + task.SetAttribute("localPath", fileInfoEx.RelativeName); + // generate FileUpdateTask metadata items + task.SetAttribute("lastModified", fileInfoEx.FileInfo.LastWriteTime.ToFileTime().ToString(CultureInfo.InvariantCulture)); + if (!string.IsNullOrEmpty(txtAddExtension.Text)) task.SetAttribute("updateTo", fileInfoEx.RelativeName + (txtAddExtension.Text.Trim().StartsWith(".") ? String.Empty : ".") + txtAddExtension.Text.Trim()); + task.SetAttribute("fileSize", fileInfoEx.FileInfo.Length.ToString(CultureInfo.InvariantCulture)); + if (!string.IsNullOrEmpty(fileInfoEx.FileVersion)) task.SetAttribute("version", fileInfoEx.FileVersion); + + XmlElement conds = doc.CreateElement("Conditions"); + XmlElement cond; + bool hasFirstCondition = false; + + //File Exists + cond = doc.CreateElement("FileExistsCondition"); cond.SetAttribute("type", "or"); - cond.SetAttribute("what", "older"); - // local timestamp, not UTC - cond.SetAttribute("timestamp", fileInfoEx.FileInfo.LastWriteTime.ToFileTime().ToString(CultureInfo.InvariantCulture)); conds.AppendChild(cond); - } - //Hash - if (chkHash.Checked) - { - cond = doc.CreateElement("FileChecksumCondition"); - cond.SetAttribute("type", "or-not"); - cond.SetAttribute("checksumType", "sha256"); - cond.SetAttribute("checksum", fileInfoEx.Hash); - conds.AppendChild(cond); - } - if (conds.ChildNodes.Count == 0) itemsMissingConditions++; - task.AppendChild(conds); - tasks.AppendChild(task); + //Version + if (chkVersion.Checked && !string.IsNullOrEmpty(fileInfoEx.FileVersion)) + { + cond = doc.CreateElement("FileVersionCondition"); + cond.SetAttribute("type", "or"); + cond.SetAttribute("what", "below"); + cond.SetAttribute("version", fileInfoEx.FileVersion); + conds.AppendChild(cond); + hasFirstCondition = true; + } - if (chkCopyFiles.Checked) - { - if (CopyFile(fileInfoEx.FileInfo.FullName, destFile)) itemsCopied++; - else itemsFailed++; - } - } - else - { - try - { - if (chkCleanUp.Checked & File.Exists(destFile)) + //Size + if (chkSize.Checked) + { + cond = doc.CreateElement("FileSizeCondition"); + cond.SetAttribute("type", hasFirstCondition ? "or-not" : "not"); + cond.SetAttribute("what", "is"); + cond.SetAttribute("size", fileInfoEx.FileInfo.Length.ToString(CultureInfo.InvariantCulture)); + conds.AppendChild(cond); + } + + //Date + if (chkDate.Checked) + { + cond = doc.CreateElement("FileDateCondition"); + if (hasFirstCondition) cond.SetAttribute("type", "or"); + cond.SetAttribute("what", "older"); + // local timestamp, not UTC + cond.SetAttribute("timestamp", fileInfoEx.FileInfo.LastWriteTime.ToFileTime().ToString(CultureInfo.InvariantCulture)); + conds.AppendChild(cond); + } + + //Hash + if (chkHash.Checked) { - File.Delete(destFile); - itemsCleaned += 1; + cond = doc.CreateElement("FileChecksumCondition"); + cond.SetAttribute("type", hasFirstCondition ? "or-not" : "not"); + cond.SetAttribute("checksumType", "sha256"); + cond.SetAttribute("checksum", fileInfoEx.Hash); + conds.AppendChild(cond); + } + + if (conds.ChildNodes.Count == 0) itemsMissingConditions++; + task.AppendChild(conds); + tasks.AppendChild(task); + + if (chkCopyFiles.Checked) + { + if (CopyFile(fileInfoEx.FileInfo.FullName, destFile)) itemsCopied++; + else itemsFailed++; } - else itemsSkipped += 1; } - catch (IOException) + else { - itemsFailed += 1; + try + { + if (chkCleanUp.Checked & File.Exists(destFile)) + { + File.Delete(destFile); + itemsCleaned += 1; + } + else itemsSkipped += 1; + } + catch (IOException) + { + itemsFailed += 1; + } } } + feed.AppendChild(tasks); + + string xmlDest = Path.Combine(destDir.FullName, Path.GetFileName(dest)); + doc.Save(xmlDest); + + // open the outputs folder if we're running from the GUI or + // we have an explicit command line option to do so + if (!_argParser.HasArgs || _argParser.OpenOutputsFolder) OpenOutputsFolder(); + Console.WriteLine("Done building feed."); + if (itemsCopied > 0) Console.WriteLine("{0,5} items copied", itemsCopied); + if (itemsCleaned > 0) Console.WriteLine("{0,5} items cleaned", itemsCleaned); + if (itemsSkipped > 0) Console.WriteLine("{0,5} items skipped", itemsSkipped); + if (itemsFailed > 0) Console.WriteLine("{0,5} items failed", itemsFailed); + if (itemsMissingConditions > 0) Console.WriteLine("{0,5} items without any conditions", itemsMissingConditions); + } + else + { + Console.WriteLine("File refresh failed."); } - feed.AppendChild(tasks); - - string xmlDest = Path.Combine(destDir.FullName, Path.GetFileName(dest)); - doc.Save(xmlDest); - - // open the outputs folder if we're running from the GUI or - // we have an explicit command line option to do so - if (!_argParser.HasArgs || _argParser.OpenOutputsFolder) OpenOutputsFolder(); - Console.WriteLine("Done building feed."); - if (itemsCopied > 0) Console.WriteLine("{0,5} items copied", itemsCopied); - if (itemsCleaned > 0) Console.WriteLine("{0,5} items cleaned", itemsCleaned); - if (itemsSkipped > 0) Console.WriteLine("{0,5} items skipped", itemsSkipped); - if (itemsFailed > 0) Console.WriteLine("{0,5} items failed", itemsFailed); - if (itemsMissingConditions > 0) Console.WriteLine("{0,5} items without any conditions", itemsMissingConditions); } private bool CopyFile(string sourceFile, string destFile) @@ -400,7 +426,7 @@ private bool CopyFile(string sourceFile, string destFile) var fi = new FileInfo(destFile); var d = Directory.GetParent(fi.FullName); if (!Directory.Exists(d.FullName)) CreateDirectoryPath(d.FullName); - if (!string.IsNullOrEmpty(txtAddExtension.Text)) destFile += "." + txtAddExtension.Text.Trim(); + if (!string.IsNullOrEmpty(txtAddExtension.Text)) destFile += (txtAddExtension.Text.Trim().StartsWith(".") ? String.Empty : ".") + txtAddExtension.Text.Trim(); // Copy with delayed retry int retries = 3; while (retries > 0) @@ -408,7 +434,7 @@ private bool CopyFile(string sourceFile, string destFile) try { if (File.Exists(destFile)) File.Delete(destFile); - File.Copy(sourceFile, destFile); + File.Copy(sourceFile, destFile); retries = 0; // success return true; } @@ -439,20 +465,12 @@ private void CreateDirectoryPath(string directoryPath) private void OpenOutputsFolder() { - string path = txtOutputFolder.Text.Trim(); - - if (string.IsNullOrEmpty(path)) - { - return; - } - - string dir = GetFullDirectoryPath(path); - + string dir = Path.GetDirectoryName(txtFeedXML.Text.Trim()); + if (dir == null) return; CreateDirectoryPath(dir); Process process = new Process { - StartInfo = - { + StartInfo = { UseShellExecute = true, FileName = dir } @@ -460,102 +478,146 @@ private void OpenOutputsFolder() process.Start(); } - private int GetImageIndex(string ext) + private IDisposable curSelector = null; + IDisposable ItemSelector() { - switch (ext.Trim('.')) + var observe = Observable.FromEventPattern(txtFileSearch, "TextChanged") + .Select(evt => ((TextBox)evt.Sender).Text) + .Where(txt => !string.IsNullOrWhiteSpace(txt)) + .DistinctUntilChanged() + .Throttle(TimeSpan.FromMilliseconds(500)) + .Select(txt => + { + try + { + Regex reg = new Regex(txt, RegexOptions.IgnoreCase); + return reg; + } + catch + { + return null; + } + }).Where(reg => reg != null); + + return ControlObservable.ObserveOn(observe, txtFileSearch).Subscribe(reg => { - case "bmp": - return 1; - case "dll": - return 2; - case "doc": - case "docx": - return 3; - case "exe": - return 4; - case "htm": - case "html": - return 5; - case "jpg": - case "jpeg": - return 6; - case "pdf": - return 7; - case "png": - return 8; - case "txt": - return 9; - case "wav": - case "mp3": - return 10; - case "wmv": - return 11; - case "xls": - case "xlsx": - return 12; - case "zip": - return 13; - default: - return 0; - } + lstFiles.SelectedIndices.Clear(); + foreach (var lvi in lstFiles.Items.Cast().Where(itm => reg.IsMatch(itm.Text))) + { + lvi.Selected = true; + } + }); } - private void ReadFiles() + private async Task ReadFiles() { - string outputDir = GetFullDirectoryPath(txtOutputFolder.Text.Trim()); - - if (string.IsNullOrEmpty(outputDir) || !Directory.Exists(outputDir)) - { - return; - } + bool result = true; + string outputDir = string.IsNullOrEmpty(txtOutputFolder.Text.Trim()) || !Directory.Exists(txtOutputFolder.Text.Trim()) ? string.Empty : txtOutputFolder.Text.Trim(); + txtFileSearch.Text = ""; + if (curSelector != null) + curSelector.Dispose(); - outputDir = GetFullDirectoryPath(outputDir); + lstFiles.HideSelection = true; lstFiles.BeginUpdate(); lstFiles.Items.Clear(); - FileSystemEnumerator enumerator = new FileSystemEnumerator(outputDir, "*.*", true); - foreach (FileInfo fi in enumerator.Matches()) + if (!string.IsNullOrEmpty(outputDir)) { - string filePath = fi.FullName; - - if ((IsIgnorable(filePath))) + FileSystemEnumerator enumerator = new FileSystemEnumerator(txtOutputFolder.Text.Trim(), string.IsNullOrWhiteSpace(txtMatchFileSpec.Text) ? "*.*" : txtMatchFileSpec.Text, string.IsNullOrWhiteSpace(txtExcludeFileSpec.Text) ? "" : txtExcludeFileSpec.Text, true); + using (frmWait wait = new frmWait()) { - continue; - } + var handler = new EventHandler(wait.FileProcessed); + enumerator.FileProcessed += handler; + wait.CancelTokenSource.Token.Register(() => + { + frmMain mn = this; + Action alert = () => + { + if (_argParser.ShowGui) + MessageBox.Show(mn, "File processing was canceled.", "File Processing Canceled", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + else + Console.WriteLine("File processing was canceled."); + }; + Invoke(alert); + }); + wait.Show(this); + List files; + try + { + var tmp = await enumerator.MatchesToFileInfoExAsync(outputDir.Length, wait.CancelTokenSource); + files = tmp.ToList(); + } + catch (Exception ex) + { + files = Enumerable.Empty().ToList(); + result = false; + Console.WriteLine(ex.Message); - FileInfoEx fileInfo = new FileInfoEx(filePath, outputDir.Length); + } - ListViewItem item = new ListViewItem(fileInfo.RelativeName, GetImageIndex(fileInfo.FileInfo.Extension)); - item.SubItems.Add(fileInfo.FileVersion); - item.SubItems.Add(fileInfo.FileInfo.Length.ToString(CultureInfo.InvariantCulture)); - item.SubItems.Add(fileInfo.FileInfo.LastWriteTime.ToString(CultureInfo.InvariantCulture)); - item.SubItems.Add(fileInfo.Hash); - item.Checked = (!Settings.Default.IgnoreFiles.Contains(fileInfo.FileInfo.Name)); - item.Tag = fileInfo; - lstFiles.Items.Add(item); - } + var exts = files.Select(f => f.FileInfo.Extension).Except(new string[] { ".exe" }).Distinct().ToList(); + var exes = files.Where(f => f.FileInfo.Extension == ".exe").Where(f => !imgFiles.Images.ContainsKey(f.FileInfo.FullName)).Select(f => f.FileInfo.FullName); + var iconInfos = (await FileIconListCreator.GenerateAsync(FileIcon.enmIconSize.Large, exts)).ToArray(); + int offset = imgFiles.Images.Count; + for (int index = 0; index < iconInfos.Count(); index++) + { + imgFiles.Images.Add(iconInfos[index].Icon); + imgFiles.Images.SetKeyName(index + offset, iconInfos[index].FileName); - lstFiles.EndUpdate(); - } + } + foreach (var exe in exes) + { + using (Icon ico = Icon.ExtractAssociatedIcon(exe)) + { + var bmp = ((Icon)ico.Clone()).ToBitmap(); + bmp.MakeTransparent(); + int indx = imgFiles.Images.Count; + imgFiles.Images.Add(bmp); + imgFiles.Images.SetKeyName(indx, exe); + } - private string GetFullDirectoryPath(string path) - { - string absolutePath = path; + } + foreach (FileInfoEx fi in files) + { + string thisFile = fi.FileInfo.FullName; + if ((IsIgnorable(thisFile))) continue; + + //if (!imgFiles.Images.ContainsKey(fi.FileInfo.Extension)) + //{ + // var info = System.Drawing.Icon.ExtractAssociatedIcon(thisFile); + // imgFiles.Images.Add(fi.FileInfo.Extension, iconForFile); + + //} + ListViewItem thisItem = new ListViewItem(fi.RelativeName, fi.FileInfo.Extension == ".exe" ? fi.FileInfo.FullName : fi.FileInfo.Extension); + thisItem.SubItems.Add(fi.FileVersion); + thisItem.SubItems.Add(fi.getFileSize(1)); + thisItem.SubItems.Add(fi.FileInfo.LastWriteTime.ToString(CultureInfo.InvariantCulture)); + thisItem.SubItems.Add(fi.Hash); + thisItem.Checked = (!Settings.Default.IgnoreFiles.Contains(fi.FileInfo.Name)); + thisItem.Tag = fi; + lstFiles.Items.Add(thisItem); + } + enumerator.FileProcessed -= handler; + wait.Close(); - if (!Path.IsPathRooted(absolutePath)) - { - absolutePath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), path); + } } - if (!absolutePath.EndsWith("\\")) + + lstFiles.EndUpdate(); + if (lstFiles.Items.Count > 0) { - absolutePath += "\\"; + lstFiles.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + lstFiles.HideSelection = false; + curSelector = ItemSelector(); + txtFileSearch.Enabled = true; } - return Path.GetFullPath(absolutePath); + return result; } + private bool IsIgnorable(string filename) { string ext = Path.GetExtension(filename); @@ -598,7 +660,7 @@ private void frmMain_DragEnter(object sender, DragEventArgs e) e.Effect = files[0].EndsWith(".config") ? DragDropEffects.Move : DragDropEffects.None; } - private void frmMain_DragDrop(object sender, DragEventArgs e) + private async void frmMain_DragDrop(object sender, DragEventArgs e) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); if (files.Length == 0) return; @@ -608,7 +670,7 @@ private void frmMain_DragDrop(object sender, DragEventArgs e) FeedBuilderSettingsProvider p = new FeedBuilderSettingsProvider(); p.LoadFrom(fileName); FileName = fileName; - InitializeFormSettings(); + await InitializeFormSettings(); } catch (Exception ex) { @@ -623,5 +685,7 @@ private void frmMain_DragDrop(object sender, DragEventArgs e) [DllImport("kernel32.dll")] private static extern bool FreeConsole(); + + } } diff --git a/FeedBuilder/frmMain.resx b/FeedBuilder/frmMain.resx index 5fcffc9e..6da02ab2 100644 --- a/FeedBuilder/frmMain.resx +++ b/FeedBuilder/frmMain.resx @@ -112,458 +112,132 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 255, 18 - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABW - SgAAAk1TRnQBSQFMAgEBDQEAAXgBAQF4AQEBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABQAMAAQEBAAEgBgABQBYAAxkEIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEz - AyMBMwMZASPMAAFYAloBwAEUAZEBvAH/ARQBkAG8Af8BFAGQAbwB/wEUAZABvAH/ARQBkAG8Af8BFAGQ - AbwB/wEUAZABvAH/ARQBkAG8Af8BFAGQAbwB/wEUAZABvAH/ARQBkQG8Af8BWAJaAcDMAAEUAZEBvAH/ - ATEBxAHpAf8BKwG8AeEB/wErAbwB4QH/ASkBuwHhAf8BKQG7AeEB/wEpAbsB4QH/ASkBuwHhAf8BKwG8 - AeEB/wErAbwB4QH/ASsBvAHhAf8BMQHEAekB/wEUAZEBvAH/zAABEwGQAbsB/wE1AcQB6AH/AScBtQHc - Af8BJAGzAdwB/wEcAbAB2gH/ARgBrgHZAf8BGAGuAdkB/wEcAbAB2gH/ASQBswHcAf8BKAG1AdwB/wEo - AbUB3AH/ATUBxAHoAf8BEwGQAbsB/8wAARMBjwG7Af8BOwHGAeoB/wEjAbAB2AH/ARsBrQHWEf8BGwGt - AdYB/wEkAbEB2QH/ASUBsQHYAf8BOwHGAeoB/wETAY8BuwH/zAABEwGPAbsB/wFAAckB7QH/ASEBrQHU - Af8BGQGqAdMB/wHHAeUB8Qn/AcYB5QHxAf8BGQGqAdMB/wEiAa4B1QH/ASIBrgHVAf8BQAHJAe0B/wET - AY8BuwH/zAABEgGPAbsB/wFFAcwB8AH/ASABqgHRAf8BHQGpAdEB/wENAaIBzgn/AQwBoQHNAf8BHgGp - AdEB/wEiAawB0gH/ASEBqgHRAf8BRQHMAfAB/wESAY8BuwH/zAABEgGPAbsB/wFLAc4B8gH/AR4BpgHP - Af8BHgGmAdAB/wESAaEBzQH/AZoBzQHlBf8BEQGgAc0B/wEeAaYB0AH/ASEBpwHRAf8BHgGmAc8B/wFL - Ac4B8gH/ARIBjwG7Af/MAAERAY8BuwH/AVAB0QH1Af8BHAGiAcsB/wEcAaMBzQH/AREBngHKBf8BnAHN - AeMB/wERAZ0BygH/ARwBowHNAf8BHQGjAc0B/wEbAaIBywH/AVAB0QH1Af8BEQGPAbsB/8wAAREBjwG6 - Af8BhAHVAfgB/wEaAZ8ByAH/ARsBoAHKAf8BEQGbAccB/wGdAcwB4gX/AQ4BmQHFAf8BGAGdAccB/wEZ - AZ0BxwH/ARcBnAHFAf8BgwHUAfcB/wERAY8BugH/zAABEQGPAboB/wGJAdgB+gH/ARcBmwHFAf8BGQGd - AcYB/wEOAZcBwwX/AZkByAHfAf8BIgGpAdQB/wGFAdUB+QH/AYYB1QH5Af8BhQHUAfgB/wGGAdYB+QH/ - ARABjgG6Af/MAAEQAY8BugH/AZAB2wH9Af8BFQGXAcIB/wEXAZoBxQH/AQwBlAHCAf8BmgHHAd8F/wGA - AdEB+AH/ASQBpAHPAf8BAwGGAbUB/wEBAYUBtAH/AYsB2AH8Af8BEAGPAboB/8wAARABjgG6Af8BlAHd - Av8BEwGTAb4B/wEVAZYBwAH/AQoBkAG+Bf8BlAHCAdoB/wGEAdQB+gH/AQABhQG0Av8B9AHpBf8BPgG8 - AeUB/wFTAlQBrMwAARABjgG6Af8BmAHfAv8BDAGNAbcB/wEOAY4BugH/AQcBiwG3Af8BnAHEAdoF/wGJ - AdYB/AH/AQABgwGyBf8BOgG7AeUB/wFRAlIBp9AAAREBjwG7Af8BnwHjAv8BnQHiAv8BngHiAv8BmwHh - Av8BlQHdAv8BkgHbAv8BlgHdAv8BmQHgAv8BRAG/AecB/wFSAlQBptQAAVgCYgHvAREBjwG7Af8BEAGO - AboB/wEPAY4BugH/AQ8BjgG6Af8BDgGOAbkB/wEOAY0BuQH/AQ4BjQG5Af8BDwGOAboB/wFVAlwB6tgA - AyEBMAMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyEBMAwAAxkEIwEz - AyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMZASMMAAMZBCMBMwMjATMDIwEz - AyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDGQEjDAADGAEiAyMBMwMjATMDIwEzAyMBMwMj - ATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDGAEiDAACZwFZAfIBuAFMARcB/wG6AUoBFAH/AcABSgER - Af8BxAFLAQ8B/wHGAUsBDgH/AcYBSgEOAf8BxgFKAQ4B/wHCAUoBEAH/AbwBSgETAf8BuAFKARUB/wG4 - AUwBFwH/AmcBWQHyDAADWgHAAYoBSQEyAf8BiQFIATEB/wGIAUcBLwH/AYgBRwEvAf8BiAFGAS8B/wGI - AUcBLwH/AYgBRwEvAf8BiQFIATAB/wGJAUgBMAH/AYkBSAExAf8BigFJATIB/wNaAcAMAAJaAVgBwAGx - AZYBDAH/AbEBlgELAf8BsQGWAQsB/wGxAZYBCwH/AbEBlgEKAf8BsQGVAQoB/wGxAZYBCgH/AbEBlgEL - Af8BsQGWAQsB/wGxAZYBCwH/AbEBlgEMAf8CWgFYAcAMAAFWAlgBuQEAAagB/gH/AQABpwH+Af8BAAGn - Af4B/wEAAacB/gH/AQABpwH+Af8BAAGqAv8BwgFFAQAB/wG3AUgBAAH/AbcBSAEAAf8BtwFIAQAB/wG4 - AUgBAAH/AlgBVgG5DAABuAFLARcC/wH8AcgC/wHoAaMB/wEVAd0C/wEgAd4C/wEoAd0B/QH/ASsB3QH7 - Af8BKgHdAfsB/wEjAd0D/wHnAZ4C/wHnAaQC/wH8AcgB/wG4AUsBFwH/DAABigFJATEB/wGuAZoBiQH/ - AagBkwGAAf8BpAGPAUwB/wGiAY0BSQH/AaIBjAFJAf8BogGNAUkB/wGkAY4BTAH/AaYBkQFOAf8BpgGR - AU8B/wGpAZQBgQH/Aa4BmgGJAf8BigFJATEB/wwAAbEBlgELAf8BzAHDATUB/wHIAbsBLgH/AcgBuwEu - Af8ByAG7AS0B/wHGAbkBKQH/AcUBuAEmAf8BxgG6ASkB/wHIAbsBLQH/AcgBuwEuAf8ByAG7AS4B/wHM - AcMBNQH/AbEBlgELAf8NAAGoAf4B/wE7Ae0C/wE6AesC/wE6AesC/wE4AeoC/wE4AeoC/wEwAe4D/wGv - ASYB/wH3AbIBMwH/AfcBsgEzAf8B9wGyATEB/wH4AbMBMgH/AbgBSAEAAf8MAAG2AUkBFAL/AfcBxAL/ - AccBQgL/AcgBPwL/AcgBNQH/ASoB0QHqAf8BMAHQAeUB/wEwAdAB5QH/ASkB0QHqAf8BFwHRAfYC/wHH - AT8C/wH3AcQB/wG2AUkBFAH/DAABiQFIATEB/wGtAZoBiQH/AZ8BjAFJFf8BmwGGAUIF/wGgAYwBSgH/ - Aa0BmgGJAf8BiQFIATEB/wwAAbEBlQELAf8BzQHCATcB/wHEAbYBKQH/AcMBtQEnAf8BwQGzASEB/wG9 - Aa4BFgX/Ab8BsAEaAf8BwQGyASAB/wHCAbQBJQH/AcQBtgEoAf8BzQHCATcB/wGxAZUBCwH/DQABpwH+ - Af8BOgHrAv8BAAHLAf4B/wEAAcwB/gH/ARQB2QH+Af8BEgHZAf4B/wEAAdIC/wHdAYgBAAH/AdMBjAEA - Af8B1AGMAQAB/wHSAYsBAAH/AfcBsgEyAf8BtwFIAQAB/wwAAbUBRgERAv8B9QHCAv8BrQEPAv8BrQEN - Af8BGQHLAekB/wEnAcoB3wH/ASsByQHcAf8BKgHJAdwB/wEiAcoB4wL/Aa0BCAL/AawBDQL/AfUBwgH/ - AbUBRgERAf8MAAGJAUgBMAH/AbABnAGMAf8BnQGIAUUB/wGWAVABOwH/AZIBTAE2Af8BlAFNATcB/wGV - AVABOwH/AZUBTwE6Af8BlgGAATsB/wGYAYEBPgH/AZ0BiAFFAf8BsAGcAYwB/wGJAUgBMAH/DAABsAGV - AQoB/wHPAcQBOgH/AcEBsAEgAf8BvgGsARcB/wG6AacBDAn/AboBpwEMBf8BvgGsARcB/wHBAbABIAH/ - Ac8BxAE6Af8BsAGVAQoB/w0AAacB/gH/ATsB6wL/AQAByAH+Af8BAAHHAf4J/wE8AeUC/wHWAYsBAAH/ - Ac4BiQEAAf8BzwGKAQAB/wHNAYgBAAH/AfcBsgEzAf8BtwFIAQAB/wwAAcwBqAFIAv8B8wHMAf8ByQHd - AbcB/wHQAd0BtQH/Ad0B3gGtAf8B5wHfAaYB/wHqAd8BpAH/AecB3wGmAf8C3gGsAf8B0gHdAbQB/wHJ - Ad0BtgL/AfMBzAH/AcwBqAFIAf8MAAGJAUgBMAH/AbEBnwGPAf8BmgGEAUIN/wGUAU8BOQ3/AZoBhAFC - Af8BsQGfAY8B/wGJAUgBMAH/DAABsAGVAQoB/wHRAccBPQH/AbsBqQEWEf8BtwGjAQgB/wHtAecBzAH/ - Ae4B6gHQAf8BvAGqARkB/wHRAcgBPQH/AbABlQEKAf8NAAGnAf4B/wE7AewC/wEAAcMB/gH/AQABwQH+ - Bf8BMgIxBf8B4wG6AT4B/wHLAYkBAAH/AcgBhAEAAf8BxgGCAQAB/wH4AbIBMwH/AbcBSAEAAf8MAAHL - AaUBRQL/AfIBzAH/AdMB1wGnAf8B3QHZAaQB/wGpAc0BwgH/AQEBsgL/AQABrwL/AQEBsgL/AbYB0AG6 - Af8B3AHYAaQB/wHTAdcBpwL/AfIBzAH/AcsBpQFFAf8MAAGJAUgBMAH/AbMBogGRAf8BlwGDAT8B/wGS - AU4BOAH/AZABTAE2Af8BkAFLATQB/wGQAUsBNAH/AY0BSAExAf8BjQFIATAB/wGQAUsBNQH/AZcBgwE/ - Af8BswGiAZEB/wGJAUgBMAH/DAABsAGVAQkB/wHUAcgBQQH/AbcBpAEOEf8BtQGgAQcB/wG2AaEBBwX/ - AbkBpQESAf8B1AHJAUIB/wGwAZUBCQH/DQABpwH+Af8BOwHsAv8BAAG/Af4B/wEAAb0B/gX/AzsB/wI5 - AToF/wHfAbcBQAH/AcUBhQEAAf8BvwFOAQAB/wH4AbMBMgH/AbcBSAEAAf8MAAHKAaUBRAL/AfMBzgH/ - AdsB1AGcAf8B6QHXAZcB/wEAAbgC/wEBAbkC/wEFAboC/wEBAbkC/wEAAbgC/wHpAdcBlwH/AdsB1AGc - Av8B8wHOAf8BygGlAUQB/wwAAYkBSAEwAf8BtQGkAZQB/wGVAYABOwX/AY8BSwEzFf8BlAFQAToB/wG1 - AaQBlAH/AYkBSAEwAf8MAAGwAZUBCQH/AdcBywFFAf8BuAGjAQ4R/wG0AZ0BAQH/Ae0B5wHLAf8B7AHn - Ac0B/wG5AaQBEQH/AdcBywFGAf8BsAGVAQkB/w0AAagC/wE7AewC/wEAAbkC/wEAAbcG/wM8Af8DQwH/ - AjkBOgX/AdsBtAE+Af8BwQFPAQAC/wG0AScB/wG/AUwBAAH/DAABygGlAUQC/wH0AdMB/wHhAdEBkwH/ - AfEB1AGNAf8BAAG/Av8BBQHBAv8BCAHBAv8BBQHAAv8BAAG+Av8B8QHTAYwB/wHhAdABkgL/AfQB0wH/ - AcoBpQFEAf8MAAGJAUcBMAH/AbcBpwGXAf8BkwFPATkB/wGOAUoBMgH/AYwBRwEvAf8BiQFEASwB/wGJ - AUQBLAH/AYsBRgEuAf8BiQFEASwB/wGLAUcBLwH/AZIBTgE4Af8BtwGnAZcB/wGJAUcBMAH/DAABsAGV - AQkB/wHaAc8BSwH/AbgBowEUAf8BtgGgAQ0B/wGyAZsBAQn/AbIBmgEABf8BtgGgAQwB/wG4AaMBFAH/ - AdoBzwFLAf8BsAGVAQkB/w0AAaABiQH/ATkB7AGPAf8BDgHCAScB/wEFAcEBIgX/AzwB/wNFAf8DPwH/ - Ao0BjAX/AUEBTwL/AYYBtAL/AQYBAAGSAf8MAAHKAaUBRAL/AfYB1gH/AecBzQGKAf8B9QHPAYYB/wEA - AcgC/wEAAcgC/wEEAcgC/wEAAccC/wEAAcYC/wH0Ac0BgQH/AecBzAGGAv8B9QHVAf8BygGlAUMB/wwA - AYgBRwEwAf8BuQGqAZoB/wGOAUwBNRH/AYkBRgEtCf8BjAFKATIB/wG5AakBmAH/AYgBRwEvAf8MAAGw - AZQBCQH/AdwB0gFPAf8BuQGiARQB/wG6AaMBFgH/AbgBoQEQAf8BswGbAQQF/wGzAZsBBgH/AbUBnQEL - Af8BtgGfAQ8B/wG2AZ8BEQH/AdwB0QFOAf8BsAGUAQkB/w0AAZ0BNgH/ATkB7AGYAf8BBgG+ASgB/wEA - AbwBIgX/AzwB/wNBAf8CkwGRBf8BPQFNAf4B/wEKASAB/AH/AZABtwL/AgABwQH/DAABygGlAUQC/wH3 - AdkB/wHsAcsBgwH/AfQBzQGDAf8BuAHOAasB/wEAAc8C/wEAAc8C/wEAAdAC/wHKAeoB4QL/AfcB0wL/ - AfYB1QL/AfcB1wH/AcoBpQFDAf8MAAGIAUcBLwH/AbsBrQGeAf8BjwFNATYB/wGNAUsBMwH/AYsBSQEx - Af8BiwFIATAB/wGLAUkBMQH/AZsBiQFFAf8BtAGkAZMB/wGzAaMBkwH/AbYBpwGXAf8BuQGrAZwB/wGI - AUcBLwH/DAABsAGUAQkB/wHfAdQBggH/AbYBnwETAf8BuQGhARYB/wG4AaEBFQH/AbcBnwERAf8BtAGb - AQsB/wHCAbABJQH/Ad0B0gFPAf8B3QHSAU8B/wHdAdEBTwH/Ad4B0wFQAf8BsAGUAQgB/w0AAZ0BNwH/ - AToB7QGZAf8BAQG4ASEB/wEAAbcBGgX/AzgB/wGTAZIBkQX/ATQBTAL/AQcBJQL/AQcBJAL/AZIBuQL/ - AgABvgH/DAABygGlAUMC/wH4AdwB/wHyAccBSwH/AfQByQFPAf8B+gHKAU0C/wHJAUcC/wHIAUEC/wH3 - AdQB/wHeAbMBTgH/AbwBiAEbAf8BtwGFARoC/wH5AdsB/wHLAaUBRAH/DAABiAFHAS8B/wG9AbABoQH/ - AY8BTAE1Af8BkAFOATcB/wGQAU4BOAH/AZABTQE3Af8BjgFLATUB/wG7Aa4BnwH/AZYBhQFAAf8BUAE8 - ASIB/wFQATwBIgH/AbsBrQGeAf8BiAFHAS8B/wwAAbABlAEIAf8B4gHXAYYB/wG0AZwBDwH/AbYBnwET - Af8BtwGgARQB/wG2AZ8BEgH/AbQBnAEOAf8B4QHWAYQB/wG+AagBHgH/AaoBjAEAAf8BqQGLAQAB/wHg - AdUBggH/AbABlAEIAf8NAAGdATcB/wE6Ae0BmgH/AQABswEbAf8BAAGyARQF/wKLAYkF/wGAAZ0C/wEL - ARcB1QH/AgABuwH/AgABuQH/AZABugL/AgABvwH/DAABygGlAUMC/wH5AeAB/wH4AcUBQQH/AfgBxgFH - Af8B+gHHAUcB/wH6AcYBRQH/AfsBxQFAAv8B+QHfAf8BugGIARwB/wHpAfAB+QX/AfEB2gG0Af8DVAGs - DAABiAFHAS8B/wG/AbIBpAH/AYsBSQEzAf8BjQFMATYB/wGOAU0BNwH/AY0BTAE2Af8BiwFJATMB/wG+ - AbEBoQH/AYABPQEkAf8B9wH6Af4F/wGmAZYBhAH/A1QBrAwAAa8BlAEIAf8B5AHaAYsB/wGyAZgBDAH/ - AbQBmwEQAf8BtQGcAREB/wG1AZsBEAH/AbIBmAEMAf8B4wHYAYgB/wGqAYwBAAH/Ae4B8wb/Ac4BvQE0 - Af8CVAFTAawNAAGdATcB/wE6Ae0BmgH/AQABrwETAf8BAAGuAQ8J/wEjAUIC/wGOAbUC/wIAAbsD/wHy - Bf8BlgGRAcgB/wJSAVQBpgwAAcoBpQFDAv8B+gHiAv8BvwEyAf8B/gHBATcB/wH+AcEBOAH/Af4BwQE3 - Av8BvwEyAv8B+AHgAf8BtwGFARkF/wHwAdkBsQH/A1IBpxAAAYgBRgEvAf8BwAG0AaYB/wGGAUUBLAH/ - AYgBRwEvAf8BiQFHATAB/wGIAUcBLwH/AYYBRAEsAf8BvgGyAaMB/wFPATsBIgX/AaQBkwGAAf8DUgGn - EAABrwGUAQgB/wHlAdwBjgH/Aa4BkQEEAf8BrwGUAQgB/wGwAZUBCQH/Aa8BlAEIAf8BrQGRAQQB/wHj - AdkBigH/AagBiwEABf8BzQG7ATAB/wJSAVEBpxEAAZ0BNwH/AToB7QGaAf8BAAGmAQcB/wEAAagBCQH/ - AQABpQECAf8BAAGqAQAB/wEAAQ8C/wGQAbYC/wIAAbkF/wGOAYoBxwH/AlABUgGkEAABzAGmAUUC/wH+ - AeYC/wH7AeUC/wH7AeYC/wH8AecC/wH7AeYC/wH7AeQC/wH7AeIC/wH9AeMB/wHxAdsBtgH/A1QBphQA - AYkBRwEwAf8BxAG4AakB/wHDAbcBqAH/AcMBtwGpAf8BwwG4AakB/wHDAbcBqQH/AcIBtgGoAf8BwQG1 - AaYB/wHAAbQBpQH/AagBmQGHAf8DVAGmFAABsAGVAQkB/wHoAd8BkwH/AecB3gGSAf8B6AHfAZIB/wHo - Ad8BkwH/AegB3wGSAf8B5wHeAZEB/wHmAdwBjwH/AeYB3AGOAf8B0AG/ATkB/wJUAVIBphUAAZ0BOAH/ - ATwB7gGZAf8BOgHtAZoB/wE7Ae4BmwH/ATsB7gGbAf8BOQHzAZMB/wGTAbMC/wGPAbYC/wGQAbkC/wGW - AZIByAH/AlABUgGkFAADYgHvAcsBpgFFAf8BygGlAUMB/wHKAaUBQwH/AcoBpQFDAf8BygGlAUMB/wHK - AaQBQwH/AcoBpAFDAf8BywGlAUMB/wNcAeoYAAJiAWEB7wGJAUcBMAH/AYgBRgEvAf8BiAFGAS8B/wGI - AUYBLwH/AYgBRgEvAf8BiAFGAS8B/wGHAUYBLgH/AYgBRgEvAf8DXAHqGAACYgFYAe8BsAGVAQkB/wGv - AZQBCAH/Aa8BlAEIAf8BrwGUAQgB/wGvAZQBCAH/Aa8BlAEIAf8BrwGTAQcB/wGvAZQBCAH/AlwBVQHq - GAABXQJhAeIBAAGdATgB/wEAAZ0BNwH/AQABnQE3Af8BAAGdATcB/wEAAaUBMgH/AgABxAH/AgABvgH/ - AgABvwH/AlIBVAGmGAADGQQjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEz - AxkBIwwAAxkEIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMZASMMAAMh - ATADIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMhATAMAAMYASIDIwEz - AyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMYASIMAAJaAVgBwAG4AYMBAAH/ - AbYBggEAAf8BtgGCAQAB/wG2AYIBAAH/AbYBggEAAf8BtgGCAQAB/wG2AYIBAAH/AbYBggEAAf8BtgGC - AQAB/wG2AYIBAAH/AbgBgwEAAf8CWgFYAcAMAAJaAVgCwAFGAQAB/wG/AUUBAAH/Ab8BRAEAAf8BvwFE - AQAB/wG/AUQBAAH/AcABRQEAAf8BwAFFAQAB/wHAAUUBAAH/AcABRQEAAf8BwAFFAQAB/wHAAUYBAAH/ - AloBWAHADAABWQJnAfIBBQGgAUwB/wEFAaABSwH/AQUBoAFLAf8BBQGgAUwB/wEFAaABTAH/AQUBoAFM - Af8BBQGgAUwB/wEFAaABTAH/AQUBoAFLAf8BBQGgAUsB/wEFAaABTAH/AVkCZwHyDAACVgFYAbkCAAHX - Af8CAAHXAf8CAAHXAf8CAAHXAf8CAAHXAf8CAAHXAf8CAAHXAf8CAAHXAf8CAAHXAf8CAAHXAf8CAAHX - Af8CVgFYAbkMAAG4AYMBAAH/AfIBxQGFAf8B6wG8AUYB/wHrAbwBRQH/AeoBvAFFAf8B6gG7AUQB/wHq - AbsBRAH/AeoBuwFEAf8B6gG8AUUB/wHrAbwBRQH/AesBvAFGAf8B8gHFAYUB/wG4AYMBAAH/DAABwAFG - AQAB/wHgAacBAQH/AdkBngEAAf8B2AGaAQAB/wHYAZkBAAH/AdgBmgEAAf8B2QGdAQAB/wHaAZ4BAAH/ - AdoBnwEAAf8B2gGfAQAB/wHaAaABAAH/AeABqAEBAf8BwAFGAQAB/wwAAQUBoAFMAf8BKwHRAaIB/wEi - AcUBmQH/ASMBxgGaAf8BIwHGAZoB/wEjAcYBmgH/ASMBxgGaAf8BIwHGAZoB/wEjAcYBmgH/ASMBxgGa - Af8BIgHFAZkB/wErAdEBogH/AQUBoAFMAf8OAAHXAf8BIgEeAv8BLgEjAv8BLwElAv8BMwEoAv8BMwEp - Av8BMwEpAv8BMwEpAv8BMwEpAv8BMwEpAv8BNAEpAv8BJAEgAv8CAAHXAf8MAAG2AYIBAAH/AfABxAGE - Af8B5AGwATEB/wHiAa0BKgH/AeIBrAEoAf8B4gGsASgB/wHiAawBKAH/AeIBrAEoAf8B4gGsASgB/wHi - Aa0BKgH/AeQBsAExAf8B8AHEAYQB/wG2AYIBAAH/DAABvwFFAQAB/wHiAagBCAH/AdMBkwEABf8B/AH5 - AfIB/wHvAdkBrQH/AdEBjQEAAf8B0wGQAQAB/wHTAZMBAAH/AdQBlgEAAf8B1gGYAQAB/wHiAakBCgH/ - Ab8BRQEAAf8MAAECAaABSwH/ASgBzwGhAf8BEQGzAYkB/wESAbQBigH/ARIBtQGKAf8BEgG1AYoB/wES - AbUBigH/ARMBtwGKAf8BFAG4AYoB/wETAbYBigH/ARIBswGJAf8BKAHPAaEB/wECAaABSwH/DgAB1wH/ - ASIBHgT/Af4B/wGWAZEB/AH/ASMBGQH6Af8BKAEeAfoB/wEpAR8B+gH/ASkBHwH6Af8BKQEfAfoB/wEp - AR8B+gH/ASkBHwH6Af8BKAElAv8CAAHXAf8MAAG2AYEBAAH/AfIBxAGHAf8B3gGnAR0d/wHeAacBHQH/ - AfIBxAGHAf8BtgGBAQAB/wwAAb8BRAEAAf8B5QGqARAB/wHQAY0BAAH/AfwB+AHwAf8B1QGZAQIN/wH9 - AfsB9QH/AeIBuQFCAf8B0gGRAQAB/wHmAasBEgH/Ab8BRAEAAf8NAAGfAUwB/wEZAc0BnwH/AQABnwFK - Af8BAAGgAUsB/wEAAaABSwH/AQABoAFLAf8BAAGiAUsB/wEAAaYBTAH/AQABFAGRAf8BAAGmAUwB/wEA - AaABSgH/ARkBzQGfAf8BAAGfAUwB/w4AAdcB/wErAScC/wGSAYwB+AX/AUsBRAH5Af8BHAETAfcB/wEg - ARcB9wH/ASIBGQH3Af8BIQEYAfcB/wEeARUB9wH/AR4BFQH2Af8BLgErAv8CAAHXAf8MAAG2AYEBAAH/ - AfMBxwGLAf8B3AGgAQ8F/wHaAZwBCQH/AdwBoQERAf8B3AGiARQB/wHcAaEBEQH/AdoBnAEJBf8B3AGg - AQ8B/wHzAccBiwH/AbYBgQEAAf8MAAG/AUQBAAH/AekBrgEaAf8BzgGLAQAB/wH0AeUBzQX/AfgB7gHc - Af8BzAGBAQAB/wHTAZcBBQH/AeABswE8Af8B6QHKAZwB/wHOAYsBAAH/AekBrgEaAf8BvwFEAQAB/wwA - Ac4BkQEqAv8B9QHMAv8B7AG/Av8B7AG/Av8B7QG/Av8B7gHBAv8B8gHCAv8B+QHFAf8BAAEoAZ0C/wH5 - AcUC/wHyAcIC/wH2Ac0B/wHOAZEBKgH/DgAB1wH/ATYBMwL/ARcBDwHzAf8BHQEUAfMB/wHiAeEB/QH/ - AZ8BmwH5Af8BTAFGAfcB/wEgARkB8wH/AS4BJgH0Af8BrgGqAfsB/wGvAasB+QH/ATIBLwL/AgAB1wH/ - DAABtgGBAQAB/wH2AcoBkAH/AdgBmgEDBf8B2AGaAQMB/wHaAaABDwH/AdsBoQESAf8B2gGgAQ8B/wHY - AZoBAwX/AdgBmgEDAf8B9gHKAZAB/wG2AYEBAAH/DAABvwFEAQAB/wHtAbMBJAH/AcwBigEAAf8B1QGc - ARUZ/wHKAYUBAAH/Ae0BsgEiAf8BvwFEAQAB/wwAAcABkQEqAv8B8gHNAv8B5QG0Av8B5AG0Av8B5QG1 - Av8B6AG2Af8BQgG2AZIB/wEAAZsBTAH/AQABnwFNAf8BAAGbAUsB/wFDAbcBkgL/AfYBzwH/AcIBkQEr - Af8OAAHXAf8BPQE7Av8BFgEMAfAB/wEUAQoB8QH/AZABigH2Af8BiwGGAfYB/wEwASgB8gX/AbYBswH5 - Af8BqAGkAfgB/wGqAaYB9wH/ATkBNgL/AgAB1wH/DAABtgGBAQAB/wH3AcsBlQH/AdQBkwEABf8B0wGP - AQAB/wHUAZMBAAH/AdQBlAEAAf8B1AGTAQAB/wHTAY8BAAX/AdQBkwEAAf8B9wHLAZUB/wG2AYEBAAH/ - DAABvgFEAQAB/wHxAbcBLQH/AcsBhwEAAf8ByQGBAQAJ/wHeAbEBPwH/Ad4BsQE/Bf8B/gH8AfoB/wHI - AVABAAH/AfABtgErAf8BvgFEAQAB/wwAAb4BkQEqAv8B8wHQAv8B4AGsAv8B4AGtAv8B4QGtAv8B5QGw - Af8BAAGeAYEB/wEAAaQBhQH/AQABpgGGAf8BAAGkAYQB/wEAAZ8BgAL/AfgB0gH/AcABkQErAf8OAAHX - Af8BRgFDAv8BDwEHAewB/wERAQkB7QH/AQgBAAHsAf8B0AHOAfoB/wGiAZ4B9gH/AT0BNwHyAf8BCQEB - AewB/wEMAQQB7QH/AQsBAgHsAf8BRQFCAv8CAAHXAf8MAAG2AYEBAAH/AfkBzgGaAf8B0gGOAQAd/wHR - AY0BAAH/AfkBzgGaAf8BtgGBAQAB/wwAAb4BRAEAAf8B9AG6ATUB/wHKAYUBAAH/AcoBgwEAAf8B0wGY - ARgR/wHhAbgBggH/AccBTgEAAf8B8wG4ATMB/wG+AUQBAAH/DAABvgGRASoC/wH1AdQC/wHdAaUC/wHd - AacC/wHdAacC/wHgAakB/wFIAbwBlQH/AQABqQGMAf8BAAGqAY0B/wEAAagBjAH/AUkBvAGTAv8B+AHW - Af8BvwGRASsB/w4AAdcB/wFNAUoC/wEIAQEB6QH/AQwBBQHqAf8BBQEAAekB/wGxAa4B9wH/AcEBvwH4 - Af8BBAEAAekB/wELAQQB6gH/AQwBBQHqAf8BCAEBAekB/wFNAUoC/wIAAdcB/wwAAbYBgQEAAf8B/AHR - AaAB/wHPAYsBAAH/AfIB3gG9Ff8B7wHZAbQB/wHNAYcBAAH/AfsBzwGdAf8BtgGBAQAB/wwAAb4BRAEA - Af8B9wG+AT8B/wHIAYIBAAH/AcoBhAEAAf8ByQGBAQAB/wHGAUwBAAH/AdUBngEpAf8B6AHMAacB/wHw - Ad4BxwH/AfYB7gHkAf8BwwFKAQAB/wH2AbwBPAH/Ab4BQwEAAf8MAAG+AZEBKgL/AfcB1gL/AdoBnAL/ - AdoBngL/AdoBnwL/AdwBoAL/Ad8BoQH/AQABrgGWAf8BAAGvAZUB/wEAAa4BlAL/Ad4BnQL/AfgB1gH/ - Ab8BkQEqAf8OAAHXAf8BgwGBAv8BAgEAAeUB/wEGAQAB5wH/AQEBAAHmAf8BgwGAAfAB/wE1AS8B7QH/ - AQEBAAHnAf8BBgEAAecB/wEGAQAB5wH/AQIBAAHlAf8BgwGBAv8CAAHXAf8MAAG2AYEBAAH/Af0B1AGn - Af8BzwGKAQAB/wHPAYoBAAH/Ac4BiAEAAf8BzQGGAQAB/wHMAYMBAAH/AdsBmwEGAf8B+AHJAZEB/wH5 - AcsBlQH/AfoBzgGbAf8B/AHRAaEB/wG1AYEBAAH/DAABvQFDAQAB/wH7AcIBSAH/AcYBUAEAAf8ByAGC - AQAB/wHJAYIBAAH/AccBgAEAAf8BxQFMAQAB/wHWAY8BCgH/AfcBuAE4Af8B9wG5ATkB/wH4AbwBPwH/ - AfkBvwFDAf8BvQFDAQAB/wwAAb8BkQEpAv8B+QHXAv8B2AGPAv8B2QGQAv8B2AGTAv8B2AGXAv8B1wGX - Av8B4wGvAv8B+AHXAv8B+QHXAv8B9gHVAv8B+QHZAf8BvgGRASoB/w4AAdcB/wGKAYkC/wIAAeIB/wEB - AQAB5AH/AgAB4wH/AZ8BnAHyAf8BoAGdAfIB/wIAAeMB/wIAAeQB/wECAQAB5AH/AgAB4wH/AYoBiQL/ - AgAB1wH/DAABtgGBAQAC/wHYAawB/wHMAYYBAAH/Ac4BigEAAf8BzgGKAQAB/wHNAYkBAAH/AcsBhgEA - Af8B/QHVAacB/wHNAZoBEAH/Aa8BRwEAAf8BrgFHAQAC/wHVAaUB/wG2AYEBAAH/DAABvQFDAQAC/wHG - AVAB/wHDAUwBAAH/AcYBUAEAAf8BxwGAAQAB/wHGAVABAAH/AcMBTAEAAf8B/gHDAU0B/wHSAYoBDwH/ - AbgBOAEAAf8BtwE3AQAB/wH+AcMBSwH/Ab0BQwEAAf8MAAHAAZEBKQL/AfoB1QH/AQABtwL/AQABuAL/ - AUsBxAHdAv8B1QGMAv8B0wGPAv8B9gHaAf8B2AGzAYEB/wG7AYgBHAH/AbgBhgEaAv8B+wHdAf8BvwGS - ASsB/w4AAdcB/wGRAY8C/wIAAd8B/wIAAeEB/wIAAeAB/wGhAZ0B8gH/AY0BigHuAf8BGwEXAewB/wEV - AREB6AH/AgAB1gH/AgAB1QH/AY8BjQL/AgAB1wH/DAABtQGBAQAC/wHZAbAB/wHJAYABAAH/AcsBhQEA - Af8BzAGFAQAB/wHLAYUBAAH/AckBgAEAAv8B1wGsAf8BsAFIAQAB/wHrAfYG/wHkAbUBPgH/AlQBUwGs - DAABvQFDAQAC/wHIAYcB/wHAAUgBAAH/AcMBTAEAAf8BxAFNAQAB/wHDAUwBAAH/AcABSAEAAv8BxgGE - Af8BuAE4AQAB/wHqAfoG/wHoAaQBLAH/AlQBUwGsDAABwQGRASgC/wH7AdcB/wEAAcEC/wEEAcMC/wEA - AcMD/wHQAYIC/wHOAYYC/wH4Ad4B/wG5AYcBHAH/AekB8AH6Bf8B7gHUAawB/wNUAawOAAHXAf8CmAL/ - AgAB3AH/AgAB3gH/AgAB3gH/AgAB3wH/AgAB3gH/ApgC/wIAAdUD/wHvBf8BmAGVAdAB/wJSAVQBpgwA - AbUBgQEAAv8B2wGzAf8BwwFHAQAB/wHFAUsBAAH/AcUBSwEAAf8BxQFLAQAB/wHDAUcBAAL/AdgBrgH/ - Aa4BRgEABf8B5AGyATkB/wJSAVEBpxAAAb0BQwEAAv8BywGQAf8BugFAAQAB/wG9AUMBAAH/Ab4BRAEA - Af8BvQFDAQAB/wG6AUABAAL/AcgBiwH/AbYBNgEABf8B6AGiASkB/wJSAVEBpxAAAcABkQEpAv8B/AHc - Af8BgQHJAdAB/wEAAcsC/wEAAcsD/wHKAUkC/wHJAU0C/wH4Ad8B/wG3AYUBGQX/Ae0B0wGqAf8DUgGn - EgAB1wH/AZ4BnQL/AgAB1wH/AgAB2QH/AgAB2QH/AgAB2AH/AgAB1wH/ApwC/wIAAdQF/wGQAYwB0AH/ - AlABUgGkEAABtgGCAQAC/wHfAbgC/wHdAbcC/wHeAbkC/wHfAboC/wHeAbkC/wHdAbYC/wHbAbIC/wHb - AbIB/wHnAbcBQwH/AlQBUgGmFAABvgFEAQAC/wHRAZoC/wHPAZgC/wHQAZkC/wHQAZoC/wHQAZkC/wHO - AZgC/wHMAZUC/wHNAZQB/wHsAacBNwH/AlQBUgGmFAABwAGTASwD/wHnAv8B/QHfAv8B/QHcAv8B/QHe - Av8B/QHjAv8B/AHkAv8B/QHkA/8B5gH/Ae4B1QGvAf8DVAGmFgAB1wH/AaYBpwL/AaQBpQL/AaYBpwL/ - AaYBpwL/AaYBpwL/AaQBpQL/AqIC/wKjAv8BlwGUAdAB/wJQAVIBpBQAAmIBWAHvAbYBggEAAf8BtQGB - AQAB/wG1AYEBAAH/AbUBgQEAAf8BtQGBAQAB/wG1AYEBAAH/AbUBgAEAAf8BtgGBAQAB/wJcAVUB6hgA - AmIBWAHvAb4BRAEAAf8BvQFDAQAB/wG9AUMBAAH/Ab0BQwEAAf8BvQFDAQAB/wG8AUIBAAH/AbwBQgEA - Af8BvQFDAQAB/wJcAVUB6hgAAmIBYAHvAcABkwErAf8BwAGRASkB/wHAAZABKAH/AcABkAEoAf8BvwGQ - ASkB/wG+AZABKQH/Ab4BkAEpAf8BvwGRASoB/wNcAeoYAAJdAWEB4gIAAdcB/wIAAdcB/wIAAdcB/wIA - AdcB/wIAAdcB/wIAAdcB/wIAAdcB/wIAAdcB/wNfAeAYAAMZBCMBMwMjATMDIwEzAyMBMwMjATMDIwEz - AyMBMwMjATMDIwEzAyMBMwMjATMDGQEjDAADIQEwAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMj - ATMDIwEzAyMBMwMjATMDIQEwDAADGAEiAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEz - AyMBMwMjATMDGAEiDAADGAEiAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMjATMDIwEzAyMBMwMj - ATMDGAEiDAADWgHAAYoBSQEyAf8BiQFIATEB/wGIAUcBLwH/AYgBRwEvAf8BiAFGAS8B/wGIAUcBLwH/ - AYgBRwEvAf8BiQFIATAB/wGJAUgBMAH/AYkBSAExAf8BigFJATIB/wNaAcAMAAFZAmcB8gEFAaEBTAH/ - AQUBoAFMAf8BBQGgAUwB/wEFAaEBTAH/AQUBoQFMAf8BBQGhAUwB/wEFAaEBTAH/AQUBoQFMAf8BBQGg - AUwB/wEFAaABTAH/AQUBoQFMAf8BWQJnAfIMAANYAbkBiQFIATEB/wGJAUgBMAH/AYkBSAEwAf8BiQFI - ATAB/wGJAUgBMAH/AYkBSAEwAf8BiQFIATAB/wGJAUgBMAH/AYkBSAEwAf8BiQFIATAB/wGJAUgBMQH/ - A1gBuQwAAlgBVgG5AcEBTAEHAf8BwQFMAQgB/wHBAUwBCAH/AcEBTAEIAf8BwQFMAQgB/wHBAUwBCAH/ - AcEBTAEIAf8BwQFMAQgB/wHBAUwBCAH/AcEBTAEIAf8BwQFMAQcB/wJYAVYBuQwAAYoBSQExAf8BrgGa - AYkB/wGoAZMBgAH/AaQBjwFMAf8BogGNAUkB/wGiAYwBSQH/AaIBjQFJAf8BpAGOAUwB/wGmAZEBTgH/ - AaYBkQFPAf8BqQGUAYEB/wGuAZoBiQH/AYoBSQExAf8MAAEDAaABTAH/ASoB0QGiAf8BHgHBAZUB/wEf - AcIBlgH/ASABwwGWAf8BIAHCAZYB/wEfAcIBlgH/AR8BwgGWAf8BHwHCAZYB/wEfAcIBlQH/AR4BwQGV - Af8BKgHRAaIB/wEDAaABTAH/DAABiQFIATEB/wHJAbcBpgH/AcMBsQGfAf8BwwGxAZ4B/wHCAbABnAH/ - AcIBsAGdAf8BwQGuAZsB/wHCAbABnQH/AcIBsAGcAf8BwwGxAZ4B/wHDAbEBnwH/AckBtwGmAf8BiQFI - ATEB/wwAAcEBTAEHAf8B3QGjAQAB/wHZAZ4BAAH/AdoBngEAAf8B2gGeAQAB/wHaAZ4BAAH/AdoBngEA - Af8B2gGeAQAB/wHaAZ4BAAH/AdoBngEAAf8B2QGeAQAB/wHdAaMBAAH/AcEBTAEHAf8MAAGJAUgBMQH/ - Aa0BmgGJAf8BnwGMAUkB/wGbAYYBQgH/AZsBhgFCAf8BmwGGAUIB/wGbAYYBQgH/AZsBhgFCAf8BmwGG - AUIB/wGbAYYBQgH/AaABjAFKAf8BrQGaAYkB/wGJAUgBMQH/DQABoAFMAf8BIQHQAaAB/wEFAacBTwH/ - AQkBqgGBAf8BAAGTAUcB/wEKAasBggH/AQkBqgGBAf8BCQGpAYEB/wEJAakBgQH/AQgBqAGAAf8BBQGn - AU8B/wEhAdABoAH/AQABoAFMAf8MAAGIAUcBMAH/AcgBtgGkAf8BugGoAZUB/wG3AaQBkAH/AeoB5AHg - Af8BsgGeAYkF/wGyAZ4BiQH/AeoB5AHgAf8BtwGkAZAB/wG6AagBlQH/AcgBtgGkAf8BiAFHATAB/wwA - AcABTAEHAf8B3gGjAQMB/wHWAZkBAAH/AdYBmQEAAf8B1gGZAQAB/wHWAZkBAAH/AdYBmQEAAf8B1gGZ - AQAB/wHWAZkBAAH/AdYBmQEAAf8B1gGZAQAB/wHeAaMBAwH/AcABTAEHAf8MAAGJAUgBMAH/AbABnAGM - Af8BnQGIAUUB/wGWAVABOwH/AZIBTAE2Af8BlAFNATcB/wGVAVABOwH/AZUBTwE6Af8BlgGAATsB/wGY - AYEBPgH/AZ0BiAFFAf8BsAGcAYwB/wGJAUgBMAH/DAAB1AGTASkB/wHKAeYB4gH/ASYBowGIAf8BLwGo - AYwB/wEMAVABRgH/ASgBoAGGAf8BLgGnAYwB/wEuAaYBjAH/AS4BpgGMAf8BLQGmAYsB/wEmAaIBhwH/ - AcsB5gHhAf8B1AGTASkB/wwAAYgBRwEwAf8ByQG3AaYB/wGzAaEBjQH/AekB5AHfFf8B6QHkAd8B/wGz - AaEBjQH/AckBtwGmAf8BiAFHATAB/wwAAcABTAEHAf8B4AGlAQkB/wHTAZQBAAH/AdIBkQEAAf8B0gGS - AQAB/wHTAZMBAAH/AdIBkQEAAf8B0gGSAQAB/wHUAZUBAAH/AdQBlgEAAf8B0wGVAQAB/wHgAaUBCQH/ - AcABTAEHAf8MAAGJAUgBMAH/AbEBnwGPAf8BmgGEAUIB/wGUAU8BOQH/AZQBTwE5Af8BlAFPATkB/wGU - AU8BOQH/AZQBTwE5Af8BlAFPATkB/wGUAU8BOQH/AZoBhAFCAf8BsQGfAY8B/wGJAUgBMAH/DAAByAGT - ASoB/wHCAeMB5QH/ARUBmAGQAf8BIAGfAZUB/wECAUoBTQH/AQcBUAFKAf8BHgGdAZUB/wEgAZ0BlAH/ - ASIBngGUAf8BIQGdAZMB/wEXAZkBjwH/Ab0B4QHjAf8ByQGTASkB/wwAAYgBRwEwAf8BywG5AacB/wGv - AZ0BiAH/AagBlAFPBf8B4wHcAdYB/wGqAZYBgAH/AeMB3AHWBf8BqAGUAU8B/wGvAZ0BiAH/AcsBuQGn - Af8BiAFHATAB/wwAAcABTAEHAf8B4wGmAQ0B/wHPAY0BAAX/AesB0QGlAf8B2gGoASYF/wHsAdIBpwH/ - AdABjgEAAf8B0gGTAQAB/wHRAZIBAAH/AeMBpgENAf8BwAFMAQcB/wwAAYkBSAEwAf8BswGiAZEB/wGX - AYMBPwH/AZIBTgE4Af8BkAFMATYB/wGQAUsBNAH/AZABSwE0Af8BjQFIATEB/wGNAUgBMAH/AZABSwE1 - Af8BlwGDAT8B/wGzAaIBkQH/AYkBSAEwAf8MAAHDAZMBKwH/AeoB5wHGAf8BEAGQAZwB/wELAY8BnQH/ - AQABPwGGAf8BhwGrAZ8B/wFDAagBpgH/AQ4BjwGcAf8BFQGTAZ0B/wEVAZMBnAH/AQkBjQGaAf8BxwHm - AeoB/wHFAZMBKQH/DAABiAFHATAB/wHNAboBqAH/AaoBlwGCCf8BpQGRAUwB/wGrAZgBgwH/AaUBkQFM - Cf8BqgGXAYIB/wHNAboBqAH/AYgBRwEwAf8MAAHAAUsBBgH/AeUBqQESAf8BzAGIAQAJ/wHpAcgBmAn/ - AdoBqAEqAf8BzwGOAQAB/wHPAY8BAAH/AeUBqQESAf8BwAFLAQYB/wwAAYkBSAEwAf8BtQGkAZQB/wGV - AYABOwH/AY8BSwEzAf8BjwFLATMB/wGPAUsBMwH/AY8BSwEzAf8BjwFLATMB/wGPAUsBMwH/AY8BSwEz - Af8BlAFQAToB/wG1AaQBlAH/AYkBSAEwAf8MAAHAAZEBKgL/AfkB0gH/AeUB2QG1Af8BSwGnAaoB/wH4 - AeMBuQL/Ae4BvAL/AfABuwH/AYMBqwGsAf8BAQGFAaUB/wECAYYBpQH/ASUBlgGnAv8B8wHOAf8BwgGS - ASoB/wwAAYgBRwEwAf8BzwG7AaoB/wGlAZMBTwH/AZ8BigFEBf8B3wHYAdEB/wG6AasBmgH/Ad8B2AHR - Bf8BnwGKAUQB/wGlAZMBTwH/Ac8BuwGqAf8BiAFHATAB/wwAAcABSwEGAf8B6AGqARcB/wHKAYMBAAX/ - AfYB6AHWCf8B/QH7AfgB/wH8AfgB8wH/Ac4BjQEAAf8BzAGJAQAB/wHoAaoBFwH/AcABSwEGAf8MAAGJ - AUcBMAH/AbcBpwGXAf8BkwFPATkB/wGOAUoBMgH/AYwBRwEvAf8BiQFEASwB/wGJAUQBLAH/AYsBRgEu - Af8BiQFEASwB/wGLAUcBLwH/AZIBTgE4Af8BtwGnAZcB/wGJAUcBMAH/DAABvgGRASoC/wH2AdQC/wHk - Aa8C/wHlAbAC/wHkAbAC/wHjAbAC/wHkAbAC/wHpAbAB/wFHAaIBrgH/ARcBiQGtAv8B4wGvAv8B+AHU - Af8BvwGRASoB/wwAAYgBRwEwAf8B0AG9AasB/wGhAY4BSgH/AeQB3gHYFf8B5AHeAdgB/wGhAY4BSgH/ - AdABvQGrAf8BiAFHATAB/wwAAcABSwEGAf8B6QGqARkB/wHKAYUBAAX/AdYBoQEoAf8B/gH9AfsF/wHX - AaIBKwP/Af4B/wHwAd0BwwH/AcgBTwEAAf8B6QGqARkB/wHAAUsBBgH/DAABiAFHATAB/wG5AaoBmgH/ - AY4BTAE1Af8BjAFHAS8B/wGMAUcBLwH/AYwBRwEvAf8BjAFHAS8B/wGJAUYBLQH/AYkBRgEtAf8BiQFG - AS0B/wGMAUoBMgH/AbkBqQGYAf8BiAFHAS8B/wwAAb4BkQEqAv8B9gHXAv8B3QGlAv8B3QGnAv8B3QGn - Av8B3QGnAv8B3QGmAv8B3wGlAv8B4QGkAv8B4gGkAv8B3wGjAv8B9wHXAf8BvgGRASoB/wwAAYgBRwEw - Af8B0QG+Aa0B/wGdAYoBRgH/AZsBhwFCAf8B4wHdAdgB/wGUAYEBOgX/AZQBgQE6Af8B4wHdAdgB/wGb - AYcBQgH/AZ0BigFGAf8B0QG+Aa0B/wGIAUcBMAH/DAABwAFLAQYB/wHqAakBGAn/AfkB8gHoAf8B3AGu - AUMF/wHVAZ0BJwH/Af0B+gH2Cf8B6gGpARkB/wHAAUsBBgH/DAABiAFHAS8B/wG7Aa0BngH/AY8BTQE2 - Af8BjQFLATMB/wGLAUkBMQH/AYsBSAEwAf8BiwFJATEB/wGbAYkBRQH/AbQBpAGTAf8BswGjAZMB/wG2 - AacBlwH/AbkBqwGcAf8BiAFHAS8B/wwAAb4BkQEqAv8B+AHbAv8B2QGcAv8B2gGeAv8B2gGfAv8B2gGf - Av8B2QGdAv8B4wGxAv8B9QHWAv8B9gHWAv8B9QHWAv8B+AHaAf8BvgGRASoB/wwAAYgBRwEwAf8B0wHA - Aa4B/wGZAYcBQgH/AZsBiQFEAf8BmgGHAUIB/wGaAYgBQgH/AZgBhgFAAf8BmQGHAUEB/wGZAYcBQQH/ - AZwBigFEAf8BmgGIAUIB/wHTAcABrgH/AYgBRwEwAf8MAAG/AUsBBQH/Ae4BrgEiAf8BxQFMAQAB/wHG - AU0BAAH/AcYBTgEAAf8BxwFQAQAB/wHGAU4BAAH/AccBUAEAAf8BxgFOAQAB/wHGAU0BAAH/AcUBTAEA - Af8B7gGuASIB/wG/AUsBBQH/DAABiAFHAS8B/wG9AbABoQH/AY8BTAE1Af8BkAFOATcB/wGQAU4BOAH/ - AZABTQE3Af8BjgFLATUB/wG7Aa4BnwH/AZYBhQFAAf8BUAE8ASIB/wFQATwBIgH/AbsBrQGeAf8BiAFH - AS8B/wwAAb4BkQEqAv8B+QHeAv8B1QGTAv8B1gGWAv8B1gGXAv8B1gGWAv8B1QGTAv8B9gHaAf8B1QGy - AYIB/wG5AYcBHAH/AbcBhgEaAv8B/QHfAf8BvwGSASsB/wwAAYgBRwEwAf8B1AHBAbAB/wGUAYIBPAH/ - AZcBhQFAAf8BlwGFAUAB/wGXAYUBQAH/AZUBgwE+Af8BrAGaAYcB/wGlAZIBTgH/AYUBQwErAf8BggFA - ASgB/wHUAcABrgH/AYgBRwEwAf8MAAG/AUsBBQH/AfEBsAEqAf8BxQFOAQAB/wHHAYABAAH/AccBgAEA - Af8BxwGAAQAB/wHGAVABAAH/AdYBkQENAf8B0gGOARIB/wG+AUcBAAH/Ab0BRQEAAf8B8gGvASUB/wHA - AUsBBAH/DAABiAFHAS8B/wG/AbIBpAH/AYsBSQEzAf8BjQFMATYB/wGOAU0BNwH/AY0BTAE2Af8BiwFJ - ATMB/wG+AbEBoQH/AYABPQEkAf8B9wH6Af4F/wGmAZYBhAH/A1QBrAwAAb4BkQEqAv8B+gHgAv8B0AGK - Av8B0QGOAv8B0QGPAv8B0QGOAv8B0AGKAv8B9wHdAf8BuQGHARwB/wHpAfAB+gX/Ae4B1AGsAf8DVAGs - DAABiAFHATAB/wHWAcMBsQH/AY8BTgE3Af8BkwGBATsB/wGTAYEBOwH/AZMBgQE7Af8BkAFPATcB/wHX - AcQBsgH/AYIBQAEoAf8B+QH7Af0F/wG7AbQBrAH/A1QBpgwAAb8BSwEFAf8B8wGzAS8B/wHCAUsBAAH/ - AcUBTgEAAf8BxQFOAQAB/wHFAU4BAAH/AcMBSwEAAf8B9AG0AS8B/wG9AUUBAAH/AfMB+wb/AcsBtQGg - Af8CVAFSAaYMAAGIAUYBLwH/AcABtAGmAf8BhgFFASwB/wGIAUcBLwH/AYkBRwEwAf8BiAFHAS8B/wGG - AUQBLAH/Ab4BsgGjAf8BTwE7ASIF/wGkAZMBgAH/A1IBpxAAAb4BkQEqAv8B/AHjAv8BywFOAv8BywGA - Av8BywGBAv8BywGAAv8BygFOAv8B+AHfAf8BtwGFARkF/wHtAdMBqgH/A1IBpxAAAYgBRwEwAf8B1wHD - AbIB/wGGAUYBLgH/AYoBSQEyAf8BigFJATIB/wGKAUkBMgH/AYYBRgEuAf8B1wHCAbEB/wFQAT0BJQX/ - AbcBrwGnAf8DUgGkEAABvwFLAQUB/wH0AbMBMgH/Ab4BRQEAAf8BwAFHAQAB/wHAAUcBAAH/AcABRwEA - Af8BvgFFAQAB/wHzAbMBMgH/AbsBQgEABf8BygGwAZcB/wJSAVABpBAAAYkBRwEwAf8BxAG4AakB/wHD - AbcBqAH/AcMBtwGpAf8BwwG4AakB/wHDAbcBqQH/AcIBtgGoAf8BwQG1AaYB/wHAAbQBpQH/AagBmQGH - Af8DVAGmFAABvwGTASwD/wHpAv8B/QHmAv8B/QHmAv8B/QHnAv8B/QHmAv8B/AHlAv8B/QHkA/8B5gH/ - Ae4B1QGvAf8DVAGmFAABiAFHATAB/wHZAcUBtAH/AdkBxAGzAf8B2QHFAbQB/wHZAcUBtAH/AdkBxQG0 - Af8B2QHEAbMB/wHXAcMBsQH/AdgBwwGxAf8BugG0AawB/wNSAaQUAAHAAUsBBQH/AfcBtgE3Af8B9gG2 - ATcB/wH3AbYBOAH/AfcBtgE4Af8B9wG2ATgB/wH2AbYBNwH/AfUBtAE2Af8B9wG0ATIB/wHLAbUBoAH/ - AlIBUAGkFAACYgFhAe8BiQFHATAB/wGIAUYBLwH/AYgBRgEvAf8BiAFGAS8B/wGIAUYBLwH/AYgBRgEv - Af8BhwFGAS4B/wGIAUYBLwH/A1wB6hgAAmIBYAHvAb8BkwEsAf8BvgGRASoB/wG+AZABKQH/Ab4BkAEp - Af8BvgGQASkB/wG+AZABKQH/Ab4BkAEpAf8BvwGRASoB/wNcAeoYAANhAeIBiAFIATAB/wGIAUcBMAH/ - AYgBRwEwAf8BiAFHATAB/wGIAUcBMAH/AYgBRwEwAf8BiAFHATAB/wGIAUcBMAH/A18B4BgAAmEBXQHi - AcABSwEFAf8BvwFLAQQB/wG/AUsBBAH/Ab8BSwEEAf8BvwFLAQQB/wG/AUsBBAH/Ab8BSwEEAf8BvwFL - AQQB/wNfAeAUAAFCAU0BPgcAAT4DAAEoAwABQAMAAUADAAEBAQABAQYAAQIWAAP/AQABgAEDBgABgAED - BgABgAEDBgABgAEDBgABgAEDBgABgAEDBgABgAEDBgABgAEDBgABgAEDBgABgAEDBgABgAEDBgABgAED - BgABgAEDBgABgAEHBgABgAEPBgABgAEfBgABgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABBwGA - AQcBgAEHAYABBwGAAQ8BgAEPAYABDwGAAQ8BgAEfAYABHwGAAR8BgAEfAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQcBgAEHAYABBwGAAQcBgAEPAYABDwGAAQ8BgAEPAYABHwGAAR8BgAEfAYABHwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEDAYABAwGA - AQMBgAEDAYABAwGAAQMBgAEDAYABAwGAAQMBgAEHAYABBwGAAQcBgAEHAYABDwGAAQ8BgAEPAYABDwGA - AR8BgAEfAYABHwGAAR8L - - - + 17, 17 - + 150, 19 - + 351, 18 - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEPSURBVDhPrdPZasJAFAZgX8q+Q32N9o2kXkjphQsigoJC - ixa1VAWXiohG7IakbmjcNcYl5i8TCQSdGXPhgcPczHwz5xzGZrtWRN+bOM1wqo5gvAJfrIBy4w/cu8hh - VjyG3nDjuOcjkbTABB58cSRy9SMiiPSXhF6rTMDpedEPG0ktJfD8wQT26gEEMSAq4I3mqYCmaZCVHQZj - WQfst3f0Ep7CGSqw3amYzBWI/TkfcAdTZ4B60LCQt+hJK3yJEz7g8ifOAGWzhzRdo9WdofYt8QFSnzlI - 42bLDdqDBZqtMUpC3zpgbtxPe4rq5xDZSsc6YG6c8DtCodZDsihaA4x5s1bmGI0Zkw2X8lofWHf+AdjM - 9sNc+xBlAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAERSURBVDhPrZDbSgJRGIXnpewd6jXsjSQvIrwoI0RQMChU + 0iiDPCGiE3ZCRkvR8VzTeBhnyR5/ccaZNnPhB4t9sdf6Ln5hb8QeathNJFVFKF5C8DqL4ksDVHWGDf7j + LHyPg6NjviSaFqlu5yQYR+KpupaIkrMknCxT3Y7v/NYYb0ITK1c3BarbWWhLQ7IR0cTKReyZ6lZ0XYei + ztHpK4bAc+h1FgQijzSxMptrGIxVSO0xX3AaStFki7bUMVFmaMm/eJMGfIH/MkGzLep0AXn4h/r3CJV3 + mS9gn2bY4UY/UzQ7E9TqfeTFtnuB+XAfzSHKr11kSl/uBebDiZ89ZCst3OUkdwL28sIVsE83ock+EIQV + 2Mz2wxeg6/UAAAAASUVORK5CYII= iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJQSURBVDhPlZNdSNNRGMb/F110ZZEVhVBgeeHNICiiuggp - olAUyyxI0oSaH1QYC3N+tKnp5ubm1JUua5uuqdPKMgr7kApFItTUkWZqVhSVYmao5Nev/xyoQ4k88Nyc - 8z6/93nP4QjCfy6lwc4ltZVso4P/tMyXRcmMHqZ0EeY6jZQVInzuf0e1Tb9Ina3P/tkpLD6XkNg8BJe5 - u93C+HDVrP4M2ZkcMOOw5tLZ9nxJyJE4HSExBoKkBQhVpTrGhso9zNPfiph0JlB+U01ZcRbmwnRMeWlc - 08opUCV6QissGsZ+WOY6z4hmuuXglC6pRYBbJSp+fzXNxnaZ66o1s3rkyKHWruJuWRYOcwZ2kxKr8TI3 - DCkU6+QYNUnuNGWmLEY+5uOK3degoKZcx3SfEvozPfVB3OtNhi4ZvI2nrTIc23U9gtmYwa8eNXzScq8i - l6bHWnfRwhHeREJzGFONgYw/CeB9qQSZNNR9FyUGBT87lfQ3plJj1zLTq4COGDegLVo0HmeqKZjx+gOM - PNzDYPU2lLF+4jhyN6BIl8pgexK3bRpaXopJuhJEwGloiWDmVSgTLw4xWreXoZrtfK/wp/nKak4E+s6/ - hDFHTkd9GndsOdCTBq1i3NdHmWgIYvRpAMO1OxlwSPhi2YpT641CuoWzsSfnAfnZiVRZ1Tjvx9GsF+bU - pF1BvWolD9JXUZmyDnOiD1cvbCZiYXfXCPrMi+gVZ8hOiiL53DHORwdzKnw/hw/uYt9uCTskfvj7+rBp - 41rWr/Fig7fX8j/Tsn/fcgx/ARfG3ml6M3rzAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJHSURBVDhPxZBdSNNhFMb/F110ZZEVhVBgeeHNICiiuggp + olAUyyxI0oSaH1QYC3N+tKnp5ubm1JUua5uuqdNKMwr7kApFItTUkWZqVhSVYmao5Nevvy7UoYR3HXh4 + 4XCe33nOKyy3lAY7l9RWMo0O/raWXxEyo5spVYTNvOGyfIRPfW+ptOkXqaPl6T83hcRmExSdgzAz3NVm + YWyoYla/B+1M9JtxWLPpaH22JORIjI6gKAMB0jyEimIdo4OlbuaprwVMOOMovammpDADc34qppwUrmnl + 5Kni3aFlFg2j3y1z5mnRTJccnNIltQhwq0jFry+mOXNtpWZWDx1Z1NhV3C3JwGFOw25SYjVe5oYhiUKd + HKMmwQUrMWUw/CF3NnZvvYKqUh1TvUroS3fXe7HXkwidMngTS2t5KLbregSzMY2f3Wr4qKW6LJvGR1rX + 0MLor8OhKYTJBn/GHvvxrliCTBrsOqXIoOBHh5K+hmSq7FqmexTQHuUytkaKxuNMNgYyVneA4Qd7GKjc + hjLaRzxH7gIU6JIZaEvgtk1D8wsxSWecCDgNzWFMvwxm/PkhRmr3Mli1nW9lvjRdWc0Jf+/5jzRmyWmv + S+GOLQu6U6BFjPvqKOP1AYw88WOoZif9DgmfLVtxaj1RSLdwNvrkPCA3M54KqxrnvRia9MKcGrUrqFOt + 5H7qKsqT1mGO9+Lqhc2ELdw+U/r0i+gVZ8hMiCDx3DHORwZyKnQ/hw/uYt9uCTskPvh6e7Fp41rWr/Fg + g6eHO+A/lyD8ARfG3mk9fv1YAAAAAElFTkSuQmCC iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIsSURBVDhPrZPdS5NxFMf3L3TfTdBFtzU1hmuxGjzlHMqq - YVgRvT2RL+XSZZqoWJlGLV8gW+HSScvpJJxU+AamSI2hTCVLM1e0xKGm2EQw+PY7v+j5tTIvoh+cy8/n - POec76NS/Y/37GkUVL72ZbR5l/DYvYDGhgjuO2ZQW/MJ9tsh3CifQmnJBAoLXiMvdxQXzgeh9Cawtweo - qV7FRm9ldQ3GtF4cTnvCSxF4Wxe5oLLiy195giMLK9htfg61WoblkEcI3I/muaC05PO6gp/w+/Ai4kw+ - FFyexgFzkxA462e54JLt3R+CX+GRyQi2SV5Yc8aRmuIUgrq7YS7IzhqNEfwODwbD2Kx3Q5YDMJkcQlBd - 9ZEL5DMBRbAe3OP/gE2JDThy9AWSkmqF4GblNLq7wE4JHD/5CpZjA3zbtDCamT6bOv+A+3DQ0glJsgvB - 1bJJdPjAMgA0ub6xu39F+fU5vlRaGM2cmRFU4OTUdhgMFUJwpXAcnmbgoXONBScKY3pOTJlP2JB+roh3 - Tk5h8H4P9PoyIbDljTEYqLoT5Z1JwEKCOK2EobezGJuag5x7DXuNbRzW7nFBpysSAoql4x6UzyYBwWfz - b+FNaB6hmSVcLLYjXu9icCPidz2ANjFfCDIzhtncy3zmrQYPtuyQ0NLRD1/XILr7/Bh4OYR9JgvUunok - MHi7pg4ajVUIKNOnT/XzeFLCKCR0ZzoVbZsWRjNTVyqCdyZkxwr+9a/+Dk60OMVjMFpXAAAAAElFTkSu - QmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIySURBVDhPrZLfS5NRGMfff6H7boIuuq2pMZyL1eAt11CW + DcOKsB9vpFmaLtNExco0av6CbIVLJ61Wk3BSkT/AFCkRZSpZmrmiJQ41xSaCwdfznL15XEUX0Reem5f3 + 8znnec4j/Zc8fxYGla91CS3eRTx0z6OpMYS7jmnU1X6B/VYA18snUVoyjsKCt8jLHcH5c36ouCQR2NUJ + 1Nas4G9ZXlmFKbULh1Kf8lJxSfI+WeCCyopv6q+/h+DQ/DJ2WV5Ao1FgPegRAveDOS4oLfmq/h6dn/DH + 4AJizD4UXJrCAUuzEDgbZrjgou2DiohshIcnQtgme5GTPYbkJKcQ1N8OckHW2REVi+RXuM8fxGaDG4oy + ALPZIQQ11Z+5QDk1oKJ/hjv7P2FTfCMOH3mFxMQ6IbhROYWOdrCnBI4dfwPr0V4+bRoY9UzXppMjcDdS + rC8hy3YhuFI2gTYf2A4Aza4f7N2/o/zaLB8qDYx6zszwr8P7k1thNFYIweXCMXgeAfedq2xxwjClZUeV + Jd2GtDNFETiJwfs8MBjKhMCWN8pgoLoqzE8miH1GjE7G4PsZjE7OQsm9ij2mFg7rdrug1xcJAa2l4w7W + r00Cgk/n38S7wBwC04u4UGxHrMHF4CbEJtyDLj5fCDIzhljfSxzeavRgyw4Zj9t64GvvQ0d3P3pfD2Kv + 2QqNvgFxDN6urYdWmyMElJMnevh60obRktA701PRtGlg1DOdSkXwzrisaMG/RZLWAE60OMW5fNhvAAAA + AElFTkSuQmCC iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI - ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9 - HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN - rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K - TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx - oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8 - 7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI - xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX - LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd - KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALhSURBVDhPZdN7SNNRFAfwM82kt4/Mx9ZLjWg9kOoPNzLD - DGxokpK6ilqkYWIPreWrlGaSEkkwyygyLXuSscwYmpktWrmW4qOoEJRMehAUrXRF7vS9arXqwof72+/e - c9g99/yI/h2p5t1T87ussw50DQXltA26qQ2NFH40Cdsmget/+51fSHJ7T0hLBxzy4z9YWcW88hKz9i6z - LOPJF1Ic2I+9fjAGJKOcwtOsGpfcp28ovuwYzYs5SuF5V4J03QOJBuace8wzdz2ykY9S460x10/dbDEj - 0hfc/2RIfqinOZEqvEiBDbCWgqOy5bqXA9om5mILM6mqP522OnjBTpMN6xshwPkEU/BjKSwcze6BeTop - DpXsM9q5zMp8so3Z0MM8bW3Fc6zpIHAkQUH/eJKFjsOTSCJml+Ezqur8SKnXKfIfOyo7mc+1M9/oZXYJ - yTKJKJhFlNycEFnRa4+u6PkWon/dF3Dw5WO3HZabFF++gmKvlVe+YG7sZ25+jfkVcwNmkiYZEJwBUqIt - 9fp+G/MDLBq7mau6mPPvY1OMvppmx60fE33+qq+6plW+vaEvosBkV+xpHiTvxWcQrAEfmpDedKv9HXN1 - B/NZnFGuax0i+bpL5D65BBviYDlshmwoJInrEcx5EA4TKSin5dkdnKsCwSdQKM3FD0zzEy5gMQ3k4Ani - ymZCEMwFUTyP4VotKewcKDINsWuK8WNpC/NeXNnsvE47BUZljQaNNE7k7RmkqhfNJDrSDUaGV2Z726St - tU00we+MbLf561Yjs7oW3aftsFOE/hQpyzS06vJByeq6txRanI6QRaNJfucQzbAJtpFcnSnNsNhirzNH - 1TCHoZXl5cz+Be8dpCytwp5kUAyf3WmIdhQ9LvhTwLIkSdhho2eK6bN3Wsv3sSvL22h6tKh6ISSCDP77 - qH59HKKBvCAUUqEIxG1oYQ2IQv45v/PfcHoWyUQ3+oOoejDMAHEboqB/jZ/HMyq1QmdD8QAAAABJRU5E - rkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALZSURBVDhPddN7LNVhGAfw57hkhZJLLscttOZ0mVl/cJYU + 2kxkWC7VchqamQpLrjFkscbajmg1Ikq1NEk7IwmN0ClzqaXaWFjZ2moJpxZP35eSzTzbZ+9ve5/n3e99 + fs+PVkRsV4Jp1pDaPnNwzjG1b1Y3or6FPIvCsWMI2gs5q4UkfbRUWjQ9L7v8m+VVzN61zMlPma0T1D/I + /VwmUixAR6T+tSzi1Aqt9NefKKTkEjkHFJFnxh3HnPczYfXMae3Mdqe7p8hMrjBRdDWZRvZ2ocIc9BZq + FyL6uZK2+PjhKQaOQBA5+abKcoZnkluZC3qZya/62zX1PG8/1TGF/aNgBUuxAXbBDhCnG4ENuZ8vPKvS + cIma+Uofc/0I86agirfYywUHQGRPrCNrt7V4EoeIVQsk5NdoQXJlrntW73zlIPONfuYHo8xaLikdogrs + 8eptod4Vo5oD5SM/XZTjY1Y5717onux9SCFleynwXlnlMHPLBHPbONaPzM1YSRpej+JEkBIdb1JOTDF3 + YlP1gblqiDnrGZIClDW0Ofiwjn/1XfOIulfOsc1j+7I7NG5JbbNk4lqOYgWYkX5866P+SeaaAebruKMs + 9+UcyQ7Vkt76QiQEwx6IhFTII4n2RawZ4AkG5JDW8+YJ7lWB4lI0SnHrC9O20JvYjAMZbATRVDtwhK0g + miearEWuuYMz+R1zrB2j+lrcw3wGn8w+Y0BDDr4pSBBFi4Pj89iW/JrEMImJ1IXFME7q7zOMamglfYty + 64TO6SgVc0QDszS5X0NeyqskL1HQ/ts5Et/Gz+RWEI+SnSAOWQoxDMfgBMkikqSJPVOB95l965g9MMqy + MmbL7Ml5khdXISca3MEAlkKMo5hxwZKsdodLPC6ojGLav5vEdf9a41XWRzb+out5EAbWsOKn+vdziAEy + BjeIhXwQXyMZDoLoyf/7rxLiIDGNliC67gS2IL6GaOiyIPoDdNYqkMF3kJ4AAAAASUVORK5CYII= iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJQSURBVDhPlZNdSNNRGMb/F110ZZEVhVBgeeHNICiiuggp - olAUyyxI0oSaH1QYC3N+tKnp5ubm1JUua5uuqdPKMgr7kApFItTUkWZqVhSVYmao5Nev/xyoQ4k88Nyc - 8z6/93nP4QjCfy6lwc4ltZVso4P/tMyXRcmMHqZ0EeY6jZQVInzuf0e1Tb9Ina3P/tkpLD6XkNg8BJe5 - u93C+HDVrP4M2ZkcMOOw5tLZ9nxJyJE4HSExBoKkBQhVpTrGhso9zNPfiph0JlB+U01ZcRbmwnRMeWlc - 08opUCV6QissGsZ+WOY6z4hmuuXglC6pRYBbJSp+fzXNxnaZ66o1s3rkyKHWruJuWRYOcwZ2kxKr8TI3 - DCkU6+QYNUnuNGWmLEY+5uOK3degoKZcx3SfEvozPfVB3OtNhi4ZvI2nrTIc23U9gtmYwa8eNXzScq8i - l6bHWnfRwhHeREJzGFONgYw/CeB9qQSZNNR9FyUGBT87lfQ3plJj1zLTq4COGDegLVo0HmeqKZjx+gOM - PNzDYPU2lLF+4jhyN6BIl8pgexK3bRpaXopJuhJEwGloiWDmVSgTLw4xWreXoZrtfK/wp/nKak4E+s6/ - hDFHTkd9GndsOdCTBq1i3NdHmWgIYvRpAMO1OxlwSPhi2YpT641CuoWzsSfnAfnZiVRZ1Tjvx9GsF+bU - pF1BvWolD9JXUZmyDnOiD1cvbCZiYXfXCPrMi+gVZ8hOiiL53DHORwdzKnw/hw/uYt9uCTskfvj7+rBp - 41rWr/Fig7fX8j/Tsn/fcgx/ARfG3ml6M3rzAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJHSURBVDhPxZBdSNNhFMb/F110ZZEVhVBgeeHNICiiuggp + olAUyyxI0oSaH1QYC3N+tKnp5ubm1JUua5uuqdNKMwr7kApFItTUkWZqVhSVYmao5Nevvy7UoYR3HXh4 + 4XCe33nOKyy3lAY7l9RWMo0O/raWXxEyo5spVYTNvOGyfIRPfW+ptOkXqaPl6T83hcRmExSdgzAz3NVm + YWyoYla/B+1M9JtxWLPpaH22JORIjI6gKAMB0jyEimIdo4OlbuaprwVMOOMovammpDADc34qppwUrmnl + 5Kni3aFlFg2j3y1z5mnRTJccnNIltQhwq0jFry+mOXNtpWZWDx1Z1NhV3C3JwGFOw25SYjVe5oYhiUKd + HKMmwQUrMWUw/CF3NnZvvYKqUh1TvUroS3fXe7HXkwidMngTS2t5KLbregSzMY2f3Wr4qKW6LJvGR1rX + 0MLor8OhKYTJBn/GHvvxrliCTBrsOqXIoOBHh5K+hmSq7FqmexTQHuUytkaKxuNMNgYyVneA4Qd7GKjc + hjLaRzxH7gIU6JIZaEvgtk1D8wsxSWecCDgNzWFMvwxm/PkhRmr3Mli1nW9lvjRdWc0Jf+/5jzRmyWmv + S+GOLQu6U6BFjPvqKOP1AYw88WOoZif9DgmfLVtxaj1RSLdwNvrkPCA3M54KqxrnvRia9MKcGrUrqFOt + 5H7qKsqT1mGO9+Lqhc2ELdw+U/r0i+gVZ8hMiCDx3DHORwZyKnQ/hw/uYt9uCTskPvh6e7Fp41rWr/Fg + g6eHO+A/lyD8ARfG3mk9fv1YAAAAAElFTkSuQmCC iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIASURBVDhPY2CAgZVC0jnPqxWDbiYqRb0oUGIA8uFyRDGW - i1plParw8Lka5xl+P8OTYYmoNZo+G0ZGxtVAMRsgloOypRBqFoikpdwrqnc5E1IXcie1jmGhSCqyAUAN - a0B8NBrJgNmCk2Jv5m23Peq3zedq7HYGIB/NgLVQA5BpJAOmCuyIvJj23GyP63O385HPGaYJ7ETzgh3Q - 9vVAMTsgloeyDRFq+vjPhF1M+2+82+W/y5nQ/wxAPlFhB1fUyXMm9HwK2ACnU8H/GYB8NAOsgLZugorZ - Q9n2CDVN3Gf8T8X9V1lj+l9vm/1/BiAfzQBpoKbN0HBAoSHqqrjOWG3x/C84UwlsCIiPZoAM0ICtUAOQ - 6EKOmQwl7GcYkplOWGx3/y+4QOm/4nqj/yA+WBwkDwGgdLAdSCsAsQOU7cDAmMt+1v1M2H/X06H/tfZY - /xdcq/Rfc5flf/tjfv9tj/r8Z8hmIxCYmawxDGmsZ7RP2/wX3KMEx6rHzf6DxBlA8hDgBLR1F4gGYkUo - WwYilcgUA8RnVC6b/hc8DfTCJaAXgHywOBQANeyF+h+ZlkWEkytQcQzTGflbBv9BNAOIjwoOQ7nItBxI - jBUaMMYMlgwlDOGMZ8A0A4MeECsBsSgQ8wGxHxCfhNK6ULYDyABmIBYAYlC6RsbiQL4gEHMDMTsuDAB4 - S6v3Lg3zbAAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH8SURBVDhPjZLdSxRhFMbPbGwbGbYTLoGatoNdVCSVKLlq + u8gutrBsUK5irILkLn2j4YUUKHjXTRdBgnSjIEikCH24pXYVWrlvWIkXShR0s/4Xp3PeOSOrDOQDP57n + zDPnHWYY2NHLYxX3Co+D1zZ7rRvb/RbP0uxT04HQnb9DVxIbPfHOP7fiMBVoksZRs2EYr9iJKsnlXNia + KMv2/X44ElXtw+2/MsMwWZaRRosWZly86IAX5rPuzQe5luXkfGKjO8ezNFq0MOviRQc897/v+p4pNCzG + CrG1rgKM+T9I4+gyLc2xE9WSL3Bh6+lR1fEji3WLUYyqFPIszT715IhKrfXpA1pXryPP0jgK0VNfSw5L + Dtsja7REXV3twZqZeqydDyPP0jiqoKU3HPa6rUeHVehtHM1xSx/CszSOKmnhHYfdPnBoHAZ9Cm56vlzK + taE5YWFw7iLyrK9zb4v/gxz5SSIiOQLGfd+3NtWBsXwKzyw1oTlr4emFRgyvJLFlOYFw9+B/PuZtbxqy + XnU234zmkrXDqc8NyNd1b6uVnrrATgQlV3IB0OtJE6pmvR7NPL3CT3oFmvV1ES18dPETnG3F6Oa0R1Vv + nUd2Pe/WJxev4uAl+MPUQSMMQqehtAPUEhYRIEqJJPFV/JzkCAEHCD/B/3UxxwmTKCF87oDvH2xfq/MU + 47gKAAAAAElFTkSuQmCC - + 47 diff --git a/FeedBuilder/frmWait.Designer.cs b/FeedBuilder/frmWait.Designer.cs new file mode 100644 index 00000000..e11885c5 --- /dev/null +++ b/FeedBuilder/frmWait.Designer.cs @@ -0,0 +1,105 @@ +namespace FeedBuilder +{ + partial class frmWait + { + /// + /// 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.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.label1 = new System.Windows.Forms.Label(); + this.lblFileCount = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox1 + // + this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.pictureBox1.Image = global::FeedBuilder.Properties.Resources.ajax_loader; + this.pictureBox1.Location = new System.Drawing.Point(0, 66); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(479, 50); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(136, 43); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(206, 20); + this.label1.TabIndex = 1; + this.label1.Text = "Loading files. Please wait...."; + // + // lblFileCount + // + this.lblFileCount.AutoSize = true; + this.lblFileCount.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F); + this.lblFileCount.Location = new System.Drawing.Point(136, 9); + this.lblFileCount.Name = "lblFileCount"; + this.lblFileCount.Size = new System.Drawing.Size(0, 20); + this.lblFileCount.TabIndex = 2; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.ForeColor = System.Drawing.Color.Red; + this.label2.Location = new System.Drawing.Point(12, 80); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(104, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Press ESC to cancel"; + // + // frmWait + // + 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(479, 116); + this.ControlBox = false; + this.Controls.Add(this.label2); + this.Controls.Add(this.lblFileCount); + this.Controls.Add(this.label1); + this.Controls.Add(this.pictureBox1); + this.Name = "frmWait"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.frmWait_KeyUp); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblFileCount; + private System.Windows.Forms.Label label2; + } +} \ No newline at end of file diff --git a/FeedBuilder/frmWait.cs b/FeedBuilder/frmWait.cs new file mode 100644 index 00000000..75a5a45d --- /dev/null +++ b/FeedBuilder/frmWait.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FeedBuilder +{ + public partial class frmWait : Form + { + public frmWait() + { + InitializeComponent(); + KeyPreview = true; + CancelTokenSource = new CancellationTokenSource(); + } + + private int fileCount = 0; + /// + /// Gets or sets the count of files processed. + /// + public int FileProcessedCount + { + get { return fileCount; } + set + { + fileCount = value; + lblFileCount.Text = string.Format("{0} files processed.", value); + } + } + public CancellationTokenSource CancelTokenSource { get; set; } + public void FileProcessed(object sender, FileProcessedEventArgs e) + { + if (InvokeRequired) + { + Invoke((MethodInvoker)delegate { FileProcessed(sender, e); }); + + return; + } + else + FileProcessedCount = e.FileProcesCount; + } + + private void frmWait_KeyUp(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + try + { + CancelTokenSource.Cancel(); + } + catch { } + } + } + } +} diff --git a/FeedBuilder/frmWait.resx b/FeedBuilder/frmWait.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/FeedBuilder/frmWait.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FeedBuilder/packages.config b/FeedBuilder/packages.config new file mode 100644 index 00000000..f1bf95dc --- /dev/null +++ b/FeedBuilder/packages.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/FileIcons/FileIcon.vb b/FileIcons/FileIcon.vb new file mode 100644 index 00000000..5b103cd8 --- /dev/null +++ b/FileIcons/FileIcon.vb @@ -0,0 +1,160 @@ +Imports System.Runtime.InteropServices +Imports System.Drawing + +''' +''' Class that retrieves icons from file paths or extensions +''' +''' +Public Class FileIcon + Private Sub New() + End Sub + Private Declare Auto Function DestroyIcon Lib "user32" (ByVal hIcon As Integer) As Integer + + Private Declare Auto Function SHGetFileInfo Lib "shell32.dll" ( + ByVal pszPath As String, + ByVal dwFileAttributes As Int32, + ByRef psfi As SHFILEINFO, + ByVal cbFileInfo As Int32, + ByVal uFlags As Int32 +) As IntPtr + + + Private Structure SHFILEINFO + Private Const MAX_PATH As Int32 = 260 + Public hIcon As IntPtr + Public iIcon As Int32 + Public dwAttributes As Int32 + + Public szDisplayName As String + + Public szTypeName As String + Public Sub New(ByVal B As Boolean) + hIcon = IntPtr.Zero + iIcon = 0 + dwAttributes = 0 + szDisplayName = vbNullString + szTypeName = vbNullString + End Sub + End Structure + + + Private Declare Auto Function SHGetFileInfo Lib "shell32.dll" _ + (ByVal pszPath As String, + ByVal dwFileAttributes As Integer, + ByRef psfi As SHFILEINFO, + ByVal cbFileInfo As Integer, + ByVal uFlags As SHGFI) As IntPtr + + + + Public Enum SHGFI As Int32 + + SHGFI_ICON = &H100 + SHGFI_DISPLAYNAME = &H200 + SHGFI_TYPENAME = &H400 + SHGFI_ATTRIBUTES = &H800 + SHGFI_ICONLOCATION = &H1000 + SHGFI_EXETYPE = &H2000 + SHGFI_SYSICONINDEX = &H4000 + SHGFI_LINKOVERLAY = &H8000 + SHGFI_SELECTED = &H10000 + SHGFI_ATTR_SPECIFIED = &H20000 + SHGFI_LARGEICON = &H0 + SHGFI_SMALLICON = &H1 + SHGFI_OPENICON = &H2 + SHGFI_SHELLICONSIZE = &H4 + SHGFI_PIDL = &H8 + SHGFI_USEFILEATTRIBUTES = &H10 + SHGFI_ADDOVERLAYS = &H20 + SHGFI_OVERLAYINDEX = &H40 + End Enum + + Public Enum enmIconSize + Small + Large + End Enum + ''' + ''' Gets an icon from a file path or extension. + ''' + ''' Path of file or extension. Must contain a ".". + ''' Whether you want a large(32x32) or small(16x16) sized icon. + ''' A string that will be set with the short file type description. + ''' A bitmap object with the filetype icon associated with the file or extension. + ''' + Public Shared Function GetIconAsImageFromExtension(ByVal Extension As String, ByVal IconSize As enmIconSize, ByRef FileDescr As String) As Bitmap + If Not Extension.Contains(".") Then Throw New System.ArgumentException("Extension must contain a ""."" to retrieve the icon from the filetype.") + Dim shinfo As SHFILEINFO + shinfo = New SHFILEINFO(True) + Dim hImg As IntPtr + 'shinfo.szTypeName = Extension + Dim baseFlags As SHGFI = SHGFI.SHGFI_TYPENAME Or SHGFI.SHGFI_DISPLAYNAME Or SHGFI.SHGFI_ICON + If Not IO.File.Exists(Extension) Then + baseFlags = baseFlags Or SHGFI.SHGFI_USEFILEATTRIBUTES + End If + + If IconSize = enmIconSize.Small Then + hImg = SHGetFileInfo(Extension, 256, shinfo, + Marshal.SizeOf(shinfo), + baseFlags Or SHGFI.SHGFI_SMALLICON) + Else + hImg = SHGetFileInfo(Extension, 256, shinfo, + Marshal.SizeOf(shinfo), + baseFlags Or SHGFI.SHGFI_LARGEICON) 'Or SHGFI.SHGFI_LARGEICON) + End If + FileDescr = shinfo.szTypeName + Using MyIcon As Icon = CType(Icon.FromHandle(shinfo.hIcon).Clone, Icon) + + + + DestroyIcon(shinfo.iIcon) + 'If IO.File.Exists(Extension) Then Return Icon.ExtractAssociatedIcon(Extension).ToBitmap + Return MyIcon.ToBitmap() + + End Using + + + End Function + +End Class +''' +''' Used in the to return information on all files or extensions requested. +''' +''' +Public Class OSFileInfo + Private _FileName As String + Private _Icon As Bitmap + Private _FileTypeDescription As String + ''' + ''' Returns the file name or extension used to get the icon. + ''' + ''' The file name or extension used to get the icon. + ''' + ''' + Public ReadOnly Property FileName() As String + Get + Return _FileName + End Get + End Property + ''' + ''' Returns the short file type description of the file or extension. + ''' + ''' The short file type description of the file or extension. + ''' + ''' + Public ReadOnly Property FileTypeDescription() As String + Get + Return _FileTypeDescription + End Get + End Property + Public ReadOnly Property Icon() As Bitmap + Get + Return _Icon + End Get + End Property + + Public Sub New(ByVal FileName As String, ByVal TypeDesc As String, ByVal Icon As Bitmap) + _Icon = Icon + _FileTypeDescription = TypeDesc + _FileName = FileName + End Sub +End Class diff --git a/FileIcons/FileIconListCreator.vb b/FileIcons/FileIconListCreator.vb new file mode 100644 index 00000000..dbe941b4 --- /dev/null +++ b/FileIcons/FileIconListCreator.vb @@ -0,0 +1,43 @@ +Imports System.Threading.Tasks +Imports System.Threading.Tasks.Schedulers +Imports System.Threading +Imports System.Drawing +''' +''' A class that will generate icons from files or filetypes. +''' +''' +Public NotInheritable Class FileIconListCreator + + Private Sub New() + + End Sub + + Public Shared Async Function GenerateAsync(iconSize As FileIcon.enmIconSize, extensions As IEnumerable(Of String)) As Task(Of IEnumerable(Of OSFileInfo)) + Try + Using ts As StaTaskScheduler = New StaTaskScheduler(1) + Dim tsk = Task.Factory.StartNew(Of IEnumerable(Of OSFileInfo))( + Function() + Return GenerateIcons(iconSize, extensions).AsEnumerable + End Function, + CancellationToken.None, + TaskCreationOptions.None, + ts) + Return Await tsk + End Using + Catch ex As Exception + Return Enumerable.Empty(Of OSFileInfo) + End Try + End Function + Private Shared Function GenerateIcons(iconSize As FileIcon.enmIconSize, extensions As IEnumerable(Of String)) As IEnumerable(Of OSFileInfo) + Dim results As New List(Of OSFileInfo) + For Each ext As String In extensions + Dim fdesc As String = "" + Dim ic As Bitmap = FileIcon.GetIconAsImageFromExtension(ext, iconSize, fdesc) + ic.MakeTransparent() + results.Add(New OSFileInfo(ext, fdesc, ic)) + Next + Return results.AsEnumerable + End Function + +End Class + diff --git a/FileIcons/FileIcons.vbproj b/FileIcons/FileIcons.vbproj new file mode 100644 index 00000000..a7e9d1d8 --- /dev/null +++ b/FileIcons/FileIcons.vbproj @@ -0,0 +1,120 @@ + + + + + Debug + AnyCPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6} + Library + FileIcons + FileIcons + 512 + Windows + v4.6.2 + + + true + full + true + true + bin\Debug\ + FileIcons.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + bin\Release\ + FileIcons.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + On + + + On + + + true + + + fileiicons.snk + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + \ No newline at end of file diff --git a/FileIcons/My Project/Application.Designer.vb b/FileIcons/My Project/Application.Designer.vb new file mode 100644 index 00000000..88dd01c7 --- /dev/null +++ b/FileIcons/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/FileIcons/My Project/Application.myapp b/FileIcons/My Project/Application.myapp new file mode 100644 index 00000000..758895de --- /dev/null +++ b/FileIcons/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/FileIcons/My Project/AssemblyInfo.vb b/FileIcons/My Project/AssemblyInfo.vb new file mode 100644 index 00000000..c7e3235c --- /dev/null +++ b/FileIcons/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports 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. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' 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: +' + + + diff --git a/FileIcons/My Project/Resources.Designer.vb b/FileIcons/My Project/Resources.Designer.vb new file mode 100644 index 00000000..35bb14e4 --- /dev/null +++ b/FileIcons/My Project/Resources.Designer.vb @@ -0,0 +1,62 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My.Resources + + '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. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("FileIcons.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set(ByVal value As Global.System.Globalization.CultureInfo) + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/FileIcons/My Project/Resources.resx b/FileIcons/My Project/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/FileIcons/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/FileIcons/My Project/Settings.Designer.vb b/FileIcons/My Project/Settings.Designer.vb new file mode 100644 index 00000000..afff2612 --- /dev/null +++ b/FileIcons/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.FileIcons.My.MySettings + Get + Return Global.FileIcons.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/FileIcons/My Project/Settings.settings b/FileIcons/My Project/Settings.settings new file mode 100644 index 00000000..85b890b3 --- /dev/null +++ b/FileIcons/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/FileIcons/STATaskScheduler.vb b/FileIcons/STATaskScheduler.vb new file mode 100644 index 00000000..fdd3b8ed --- /dev/null +++ b/FileIcons/STATaskScheduler.vb @@ -0,0 +1,98 @@ +Imports System.Collections.Concurrent +Imports System.Collections.Generic +Imports System.Linq +Imports System.Threading +Imports System.Threading.Tasks + +Namespace Global.System.Threading.Tasks.Schedulers + ''' Provides a scheduler that uses STA threads. + Public NotInheritable Class StaTaskScheduler + Inherits TaskScheduler + Implements IDisposable + ''' Stores the queued tasks to be executed by our pool of STA threads. + Private _tasks As BlockingCollection(Of Task) + ''' The STA threads used by the scheduler. + Private ReadOnly _threads As List(Of Thread) + + ''' Initializes a new instance of the StaTaskScheduler class with the specified concurrency level. + ''' The number of threads that should be created and used by this scheduler. + Public Sub New(numberOfThreads As Integer) + ' Validate arguments + If numberOfThreads < 1 Then + Throw New ArgumentOutOfRangeException("concurrencyLevel") + End If + + ' Initialize the tasks collection + _tasks = New BlockingCollection(Of Task)() + + ' Create the threads to be used by this scheduler + ' Continually get the next task and try to execute it. + ' This will continue until the scheduler is disposed and no more tasks remain. + _threads = Enumerable.Range(0, numberOfThreads).Select(Function(i) + Dim thread As New Thread(Sub() + For Each t As Task In _tasks.GetConsumingEnumerable() + TryExecuteTask(t) + Next + + End Sub) + thread.IsBackground = True + thread.SetApartmentState(ApartmentState.STA) + Return thread + + End Function).ToList() + + ' Start all of the threads + _threads.ForEach(Sub(t) t.Start()) + End Sub + + ''' Queues a Task to be executed by this scheduler. + ''' The task to be executed. + Protected Overrides Sub QueueTask(task As Task) + ' Push it into the blocking collection of tasks + _tasks.Add(task) + End Sub + + ''' Provides a list of the scheduled tasks for the debugger to consume. + ''' An enumerable of all tasks currently scheduled. + Protected Overrides Function GetScheduledTasks() As IEnumerable(Of Task) + ' Serialize the contents of the blocking collection of tasks for the debugger + Return _tasks.ToArray() + End Function + + ''' Determines whether a Task may be inlined. + ''' The task to be executed. + ''' Whether the task was previously queued. + ''' true if the task was successfully inlined; otherwise, false. + Protected Overrides Function TryExecuteTaskInline(task As Task, taskWasPreviouslyQueued As Boolean) As Boolean + ' Try to inline if the current thread is STA + Return Thread.CurrentThread.GetApartmentState() = ApartmentState.STA AndAlso TryExecuteTask(task) + End Function + + ''' Gets the maximum concurrency level supported by this scheduler. + Public Overrides ReadOnly Property MaximumConcurrencyLevel() As Integer + Get + Return _threads.Count + End Get + End Property + + ''' + ''' Cleans up the scheduler by indicating that no more tasks will be queued. + ''' This method blocks until all threads successfully shutdown. + ''' + Public Sub Dispose() Implements IDisposable.Dispose + If _tasks IsNot Nothing Then + ' Indicate that no new tasks will be coming in + _tasks.CompleteAdding() + + ' Wait for all threads to finish processing tasks + For Each thread As Thread In _threads + thread.Join() + Next + + ' Cleanup + _tasks.Dispose() + _tasks = Nothing + End If + End Sub + End Class +End Namespace diff --git a/FileIcons/fileiicons.snk b/FileIcons/fileiicons.snk new file mode 100644 index 00000000..9deea399 Binary files /dev/null and b/FileIcons/fileiicons.snk differ diff --git a/NAppUpdate.sln b/NAppUpdate.sln index 17b75adb..af526226 100644 --- a/NAppUpdate.sln +++ b/NAppUpdate.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.40629.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{BDD7694F-9B8D-45B1-B75E-3901BC6F04DD}" EndProject @@ -24,6 +24,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FeedBuilder", "FeedBuilder\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsProgressSample", "Samples\WinFormsProgressSample\WinFormsProgressSample.csproj", "{991B322D-C0EC-47A6-B67A-665C873C7B19}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "FileIcons", "FileIcons\FileIcons.vbproj", "{3637B716-7EEE-4A84-B6B9-982C4D8A39A6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -35,6 +37,9 @@ Global Release 4.0|Any CPU = Release 4.0|Any CPU Release 4.0|Mixed Platforms = Release 4.0|Mixed Platforms Release 4.0|x86 = Release 4.0|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {2742ABE7-977D-4989-B12A-992A50B28E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -52,6 +57,12 @@ Global {2742ABE7-977D-4989-B12A-992A50B28E2F}.Release 4.0|Mixed Platforms.ActiveCfg = Release|Any CPU {2742ABE7-977D-4989-B12A-992A50B28E2F}.Release 4.0|Mixed Platforms.Build.0 = Release|Any CPU {2742ABE7-977D-4989-B12A-992A50B28E2F}.Release 4.0|x86.ActiveCfg = Release|Any CPU + {2742ABE7-977D-4989-B12A-992A50B28E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2742ABE7-977D-4989-B12A-992A50B28E2F}.Release|Any CPU.Build.0 = Release|Any CPU + {2742ABE7-977D-4989-B12A-992A50B28E2F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2742ABE7-977D-4989-B12A-992A50B28E2F}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2742ABE7-977D-4989-B12A-992A50B28E2F}.Release|x86.ActiveCfg = Release|Any CPU + {2742ABE7-977D-4989-B12A-992A50B28E2F}.Release|x86.Build.0 = Release|Any CPU {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Debug|Any CPU.Build.0 = Debug|Any CPU {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -67,6 +78,12 @@ Global {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Release 4.0|Mixed Platforms.ActiveCfg = Release 4.0|Any CPU {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Release 4.0|Mixed Platforms.Build.0 = Release 4.0|Any CPU {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Release 4.0|x86.ActiveCfg = Release 4.0|Any CPU + {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Release|Any CPU.ActiveCfg = Release 4.0|Any CPU + {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Release|Any CPU.Build.0 = Release 4.0|Any CPU + {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Release|Mixed Platforms.ActiveCfg = Release 4.0|Any CPU + {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Release|Mixed Platforms.Build.0 = Release 4.0|Any CPU + {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Release|x86.ActiveCfg = Release 4.0|Any CPU + {7D4D18D4-DBD2-4ADC-9D82-397D6C5E9F40}.Release|x86.Build.0 = Release 4.0|Any CPU {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Debug|Any CPU.Build.0 = Debug|Any CPU {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -82,6 +99,12 @@ Global {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Release 4.0|Mixed Platforms.ActiveCfg = Release|Any CPU {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Release 4.0|Mixed Platforms.Build.0 = Release|Any CPU {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Release 4.0|x86.ActiveCfg = Release|Any CPU + {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Release|Any CPU.Build.0 = Release|Any CPU + {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Release|x86.ActiveCfg = Release|Any CPU + {D4321517-F941-4B1C-A9F7-9F63F5B86EE8}.Release|x86.Build.0 = Release|Any CPU {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Debug|Any CPU.Build.0 = Debug|Any CPU {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -97,6 +120,12 @@ Global {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Release 4.0|Mixed Platforms.ActiveCfg = Release 4.0|Any CPU {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Release 4.0|Mixed Platforms.Build.0 = Release 4.0|Any CPU {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Release 4.0|x86.ActiveCfg = Release 4.0|Any CPU + {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Release|Any CPU.ActiveCfg = Release 4.0|Any CPU + {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Release|Any CPU.Build.0 = Release 4.0|Any CPU + {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Release|Mixed Platforms.ActiveCfg = Release 4.0|Any CPU + {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Release|Mixed Platforms.Build.0 = Release 4.0|Any CPU + {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Release|x86.ActiveCfg = Release 4.0|Any CPU + {5C07EBDF-D43F-4BE9-B560-D7A443C0EDCE}.Release|x86.Build.0 = Release 4.0|Any CPU {935426A8-2F13-449E-A808-A3BD07AA3570}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {935426A8-2F13-449E-A808-A3BD07AA3570}.Debug|Any CPU.Build.0 = Debug|Any CPU {935426A8-2F13-449E-A808-A3BD07AA3570}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -112,6 +141,12 @@ Global {935426A8-2F13-449E-A808-A3BD07AA3570}.Release 4.0|Mixed Platforms.ActiveCfg = Release|Any CPU {935426A8-2F13-449E-A808-A3BD07AA3570}.Release 4.0|Mixed Platforms.Build.0 = Release|Any CPU {935426A8-2F13-449E-A808-A3BD07AA3570}.Release 4.0|x86.ActiveCfg = Release|Any CPU + {935426A8-2F13-449E-A808-A3BD07AA3570}.Release|Any CPU.ActiveCfg = Release|Any CPU + {935426A8-2F13-449E-A808-A3BD07AA3570}.Release|Any CPU.Build.0 = Release|Any CPU + {935426A8-2F13-449E-A808-A3BD07AA3570}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {935426A8-2F13-449E-A808-A3BD07AA3570}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {935426A8-2F13-449E-A808-A3BD07AA3570}.Release|x86.ActiveCfg = Release|Any CPU + {935426A8-2F13-449E-A808-A3BD07AA3570}.Release|x86.Build.0 = Release|Any CPU {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Debug|Any CPU.Build.0 = Debug|Any CPU {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -130,6 +165,12 @@ Global {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Release 4.0|Mixed Platforms.Build.0 = Release|Any CPU {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Release 4.0|x86.ActiveCfg = Release|x86 {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Release 4.0|x86.Build.0 = Release|x86 + {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Release|Any CPU.Build.0 = Release|Any CPU + {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Release|x86.ActiveCfg = Release|x86 + {734FA44E-39AC-478E-A5AA-0F3D1F1974AA}.Release|x86.Build.0 = Release|x86 {991B322D-C0EC-47A6-B67A-665C873C7B19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {991B322D-C0EC-47A6-B67A-665C873C7B19}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {991B322D-C0EC-47A6-B67A-665C873C7B19}.Debug|Mixed Platforms.Build.0 = Debug|x86 @@ -146,6 +187,36 @@ Global {991B322D-C0EC-47A6-B67A-665C873C7B19}.Release 4.0|Mixed Platforms.Build.0 = Release|x86 {991B322D-C0EC-47A6-B67A-665C873C7B19}.Release 4.0|x86.ActiveCfg = Release|x86 {991B322D-C0EC-47A6-B67A-665C873C7B19}.Release 4.0|x86.Build.0 = Release|x86 + {991B322D-C0EC-47A6-B67A-665C873C7B19}.Release|Any CPU.ActiveCfg = Release|Any CPU + {991B322D-C0EC-47A6-B67A-665C873C7B19}.Release|Any CPU.Build.0 = Release|Any CPU + {991B322D-C0EC-47A6-B67A-665C873C7B19}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {991B322D-C0EC-47A6-B67A-665C873C7B19}.Release|Mixed Platforms.Build.0 = Release|x86 + {991B322D-C0EC-47A6-B67A-665C873C7B19}.Release|x86.ActiveCfg = Release|x86 + {991B322D-C0EC-47A6-B67A-665C873C7B19}.Release|x86.Build.0 = Release|x86 + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Debug|x86.ActiveCfg = Debug|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Debug|x86.Build.0 = Debug|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 3.5|Any CPU.ActiveCfg = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 3.5|Any CPU.Build.0 = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 3.5|Mixed Platforms.ActiveCfg = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 3.5|Mixed Platforms.Build.0 = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 3.5|x86.ActiveCfg = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 3.5|x86.Build.0 = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 4.0|Any CPU.ActiveCfg = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 4.0|Any CPU.Build.0 = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 4.0|Mixed Platforms.ActiveCfg = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 4.0|Mixed Platforms.Build.0 = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 4.0|x86.ActiveCfg = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release 4.0|x86.Build.0 = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release|Any CPU.Build.0 = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release|x86.ActiveCfg = Release|Any CPU + {3637B716-7EEE-4A84-B6B9-982C4D8A39A6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Samples/WPFSampleApp/WPFSampleApp.csproj b/Samples/WPFSampleApp/WPFSampleApp.csproj index 6abc1696..27d53ca4 100644 --- a/Samples/WPFSampleApp/WPFSampleApp.csproj +++ b/Samples/WPFSampleApp/WPFSampleApp.csproj @@ -56,9 +56,6 @@ AllRules.ruleset - - ..\..\src\NAppUpdate.Framework\bin\Release\net35\NAppUpdate.Framework.dll - 3.5 @@ -170,6 +167,12 @@ true + + + {5c07ebdf-d43f-4be9-b560-d7a443c0edce} + NAppUpdate.Framework + +