From 052cb096c41c061b90a44ee5df5626352b64d437 Mon Sep 17 00:00:00 2001 From: chudov Date: Tue, 8 Mar 2011 15:37:43 +0000 Subject: [PATCH] CUETools 2.1.1 * Local Database for verification results and metadata * FlaCuda replaced with FLACCL --- CUEControls/FileSystemTreeView.cs | 325 ++++--- CUEControls/IIconManager.cs | 11 + CUEControls/Properties/AssemblyInfo.cs | 4 +- CUEControls/ShellIconMgr.cs | 10 + CUEPlayer/Browser.cs | 2 +- CUEPlayer/Properties/AssemblyInfo.cs | 4 +- CUEPlayer/frmCUEPlayer.Designer.cs | 2 +- CUERipper/CUERipper.csproj | 2 +- CUERipper/frmCUERipper.de-DE.resx | 2 +- CUERipper/frmCUERipper.resx | 16 +- CUERipper/frmFreedbSubmit.resx | 2 +- CUETools.ARCUE/Properties/AssemblyInfo.cs | 4 +- CUETools.AccurateRip/AccurateRip.cs | 378 ++++++--- CUETools.AccurateRip/CDRepair.cs | 8 + .../Properties/AssemblyInfo.cs | 4 +- CUETools.CDImage/Properties/AssemblyInfo.cs | 4 +- CUETools.CTDB/CUEToolsDB.cs | 7 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- CUETools.Codecs/Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- CUETools.FlaCudaExe/CUETools.FlaCuda.csproj | 5 +- .../Properties/AssemblyInfo.cs | 4 +- CUETools.Processor/CUEMetadata.cs | 25 +- CUETools.Processor/Processor.cs | 611 +++++++++++--- CUETools.Processor/Properties/AssemblyInfo.cs | 4 +- CUETools.Ripper.Console/Program.cs | 2 +- .../Properties/AssemblyInfo.cs | 4 +- CUETools.Ripper.SCSI/SCSIDrive.cs | 2 +- CUETools.Ripper/Properties/AssemblyInfo.cs | 4 +- .../AccurateRipVerifyTest.cs | 63 ++ .../CUETools.TestCodecs.csproj | 2 + .../CUETools.TestCodecs/FlakeWriterTest.cs | 52 +- .../CUETools.TestProcessor.csproj | 5 +- CUETools/CUETools.csproj | 12 +- CUETools/CUETools.sln | 369 ++++---- CUETools/CUETools1.vsmdi | 2 +- CUETools/Properties/AssemblyInfo.cs | 4 +- CUETools/Properties/Resources.Designer.cs | 72 +- CUETools/Properties/Resources.resx | 42 +- CUETools/Resources/alarm-clock.ico | Bin 0 -> 1150 bytes CUETools/Resources/calendar.ico | Bin 0 -> 1150 bytes CUETools/Resources/images-question.ico | Bin 0 -> 1150 bytes CUETools/Resources/images.ico | Bin 0 -> 1150 bytes CUETools/Resources/picture.ico | Bin 0 -> 1150 bytes CUETools/Resources/pictures.ico | Bin 0 -> 1150 bytes CUETools/Resources/puzzle.ico | Bin 0 -> 1150 bytes CUETools/Resources/users.ico | Bin 0 -> 1150 bytes CUETools/frmCUETools.Designer.cs | 107 ++- CUETools/frmCUETools.cs | 795 ++++++++++++++++-- CUETools/frmCUETools.de-DE.resx | 2 +- CUETools/frmCUETools.resx | 279 ++++-- CUETools/frmChoice.Designer.cs | 11 +- CUETools/frmChoice.cs | 32 +- CUETools/frmChoice.de-DE.resx | 55 -- CUETools/frmChoice.resx | 469 ++++++----- MAC_SDK/Source/MACLib/Assembly/Assembly.obj | Bin 836 -> 836 bytes MAC_SDK/Source/MACLib/Assembly/Assembly64.obj | Bin 1259 -> 1259 bytes MAC_SDK/Source/MACLib/NNFilter.cpp | 12 +- MAC_SDK/Source/MACLib/UnBitArray.cpp | 9 + 65 files changed, 2839 insertions(+), 1037 deletions(-) create mode 100644 CUETools/Resources/alarm-clock.ico create mode 100644 CUETools/Resources/calendar.ico create mode 100644 CUETools/Resources/images-question.ico create mode 100644 CUETools/Resources/images.ico create mode 100644 CUETools/Resources/picture.ico create mode 100644 CUETools/Resources/pictures.ico create mode 100644 CUETools/Resources/puzzle.ico create mode 100644 CUETools/Resources/users.ico diff --git a/CUEControls/FileSystemTreeView.cs b/CUEControls/FileSystemTreeView.cs index 08eea7b..8df3c3a 100644 --- a/CUEControls/FileSystemTreeView.cs +++ b/CUEControls/FileSystemTreeView.cs @@ -40,9 +40,169 @@ namespace CUEControls public delegate void FileSystemTreeViewNodeExpandHandler(object sender, FileSystemTreeViewNodeExpandEventArgs e); #endregion + public class DummyNode : TreeNode + { + } + + public abstract class FileSystemTreeNode : TreeNode + { + protected IIconManager icon_mgr; + + abstract public string Path + { + get; + } + + abstract public string DisplayName + { + get; + } + + abstract public int DisplayIcon + { + get; + } + + public bool IsExpandable + { + get + { + return Nodes.Count == 1 && Nodes[0] is DummyNode; + } + + set + { + if (value) + { + Nodes.Clear(); + Nodes.Add(new DummyNode()); + } + } + } + + public FileSystemTreeNode(IIconManager icon_mgr, bool expandable) + { + this.icon_mgr = icon_mgr; + if (expandable) + IsExpandable = true; + } + + virtual public void DoExpand() + { + if (!Directory.Exists(this.Path)) + return; + var info = new DirectoryInfo(this.Path); + FileSystemTreeViewNodeExpandEventArgs e = new FileSystemTreeViewNodeExpandEventArgs(); + e.node = this; + e.files = info.GetFileSystemInfos(); + (this.TreeView as FileSystemTreeView).OnDoExpand(e); + } + } + + public class FileSystemTreeNodeSpecialFolder : FileSystemTreeNode + { + public ExtraSpecialFolder Folder + { + get; + private set; + } + + public override string Path + { + get + { + return icon_mgr.GetFolderPath(Folder); + } + } + + public override string DisplayName + { + get + { + return icon_mgr.GetDisplayName(Folder); + } + } + + public override int DisplayIcon + { + get + { + return icon_mgr.GetIconIndex(Folder, !IsExpandable); + } + } + + public FileSystemTreeNodeSpecialFolder(IIconManager icon_mgr, ExtraSpecialFolder folder) + : base(icon_mgr, true) + { + this.Folder = folder; + this.SelectedImageIndex = this.ImageIndex = this.DisplayIcon; + this.Text = this.DisplayName; + } + + public override void DoExpand() + { + switch (Folder) + { + case ExtraSpecialFolder.Desktop: + foreach (ExtraSpecialFolder fldr in (this.TreeView as FileSystemTreeView).SpecialFolders) + try { Nodes.Add(new FileSystemTreeNodeSpecialFolder(icon_mgr, fldr)); } + catch { } + break; + case ExtraSpecialFolder.MyComputer: + if (Path == "/") + break; + foreach (DriveInfo di in DriveInfo.GetDrives()) + try { Nodes.Add(new FileSystemTreeNodeFileSystemInfo(icon_mgr, new DirectoryInfo(di.Name))); } + catch { } + return; + } + base.DoExpand(); + } + } + + public class FileSystemTreeNodeFileSystemInfo : FileSystemTreeNode + { + public FileSystemInfo File + { + get; + private set; + } + + public override string Path + { + get + { + return File.FullName; + } + } + + public override string DisplayName + { + get + { + return icon_mgr.GetDisplayName(File); + } + } + + public override int DisplayIcon + { + get + { + return icon_mgr.GetIconIndex(File, !IsExpandable); + } + } + + public FileSystemTreeNodeFileSystemInfo(IIconManager icon_mgr, FileSystemInfo file) + : base(icon_mgr, (file.Attributes & FileAttributes.Directory) != 0) + { + this.File = file; + this.SelectedImageIndex = this.ImageIndex = this.DisplayIcon; + this.Text = this.DisplayName; + } + } + public partial class FileSystemTreeView : TreeView { - private const string DummyNodeText = "DUMMY"; private IIconManager m_icon_mgr; private ExtraSpecialFolder[] m_extra_folders; @@ -117,10 +277,8 @@ namespace CUEControls { if (!DesignMode && SelectedNode != null) { - if (SelectedNode.Tag is FileSystemInfo) - return ((FileSystemInfo)SelectedNode.Tag).FullName; - if (SelectedNode.Tag is ExtraSpecialFolder) - return m_icon_mgr.GetFolderPath((ExtraSpecialFolder)SelectedNode.Tag); + if (SelectedNode is FileSystemTreeNode) + return (SelectedNode as FileSystemTreeNode).Path; if (SelectedNode.Tag is string) return (string)SelectedNode.Tag; } @@ -145,9 +303,8 @@ namespace CUEControls } get { - if (!DesignMode && SelectedNode != null) - if (SelectedNode.Tag is ExtraSpecialFolder) - return (ExtraSpecialFolder)SelectedNode.Tag; + if (!DesignMode && SelectedNode as FileSystemTreeNodeSpecialFolder != null) + return (SelectedNode as FileSystemTreeNodeSpecialFolder).Folder; return ExtraSpecialFolder.Desktop; } } @@ -170,7 +327,7 @@ namespace CUEControls private TreeNode LookupNode(TreeNodeCollection nodes, ExtraSpecialFolder tag) { foreach (TreeNode node in nodes) - if (node.Tag is ExtraSpecialFolder && (ExtraSpecialFolder)node.Tag == tag) + if (node is FileSystemTreeNodeSpecialFolder && (node as FileSystemTreeNodeSpecialFolder).Folder == tag) return node; return null; } @@ -196,10 +353,10 @@ namespace CUEControls } foreach (TreeNode node in desktop.Nodes) - if (node.Tag is ExtraSpecialFolder) + if (node is FileSystemTreeNodeSpecialFolder) { - specialPath = m_icon_mgr.GetFolderPath((ExtraSpecialFolder)node.Tag); - if (specialPath != null && path.StartsWith(specialPath.ToUpper()) && (top == null || m_icon_mgr.GetFolderPath((ExtraSpecialFolder)top.Tag).Length < specialPath.Length)) + specialPath = (node as FileSystemTreeNodeSpecialFolder).Path; + if (specialPath != null && path.StartsWith(specialPath.ToUpper()) && (top as FileSystemTreeNodeSpecialFolder == null || (top as FileSystemTreeNodeSpecialFolder).Path.Length < specialPath.Length)) { if (path == specialPath.ToUpper()) return node; @@ -222,9 +379,9 @@ namespace CUEControls found = false; foreach (TreeNode node in top.Nodes) { - if (node.Tag is FileSystemInfo) + if (node is FileSystemTreeNodeFileSystemInfo) { - string prefix = ((FileSystemInfo)node.Tag).FullName.ToUpper(); + string prefix = (node as FileSystemTreeNodeFileSystemInfo).File.FullName.ToUpper(); if (path == prefix) return node; if (path.StartsWith(prefix) && (prefix.EndsWith(PathSeparator) || path.Substring(prefix.Length).StartsWith(PathSeparator))) @@ -239,31 +396,23 @@ namespace CUEControls return null; } - private bool IsDummy(TreeNode n) - { - return n.Nodes.Count == 1 && n.Nodes[0].Tag == null && n.Nodes[0].Text == DummyNodeText; - } - public TreeNode NewNode(ExtraSpecialFolder folder) { - TreeNode node = new TreeNode(); - node.Tag = folder; - node.ImageIndex = m_icon_mgr.GetIconIndex(folder, false); - node.SelectedImageIndex = node.ImageIndex; - node.Text = m_icon_mgr.GetDisplayName(folder); - node.Nodes.Add(DummyNodeText); - return node; + return new FileSystemTreeNodeSpecialFolder(m_icon_mgr, folder); } - public TreeNode NewNode(FileSystemInfo file, bool expandable) + public TreeNode NewNode(FileSystemInfo file) { - TreeNode node = new TreeNode(); - node.Tag = file; - node.ImageIndex = m_icon_mgr.GetIconIndex(file, false); - node.SelectedImageIndex = node.ImageIndex; - node.Text = m_icon_mgr.GetDisplayName(file); - if (expandable) node.Nodes.Add(DummyNodeText); - return node; + return new FileSystemTreeNodeFileSystemInfo(m_icon_mgr, file); + } + + public TreeNode NewNode(string file) + { + if (File.Exists(file)) + return new FileSystemTreeNodeFileSystemInfo(m_icon_mgr, new FileInfo(file)); + var icon = m_icon_mgr.GetIconIndex(file); + var res = new TreeNode(Path.GetFileNameWithoutExtension(file), icon, icon); + return res; } /// @@ -272,24 +421,28 @@ namespace CUEControls /// the arguments giving the node to be expanded protected override void OnBeforeExpand(TreeViewCancelEventArgs e) { - if (!IsDummy(e.Node)) - return; - - e.Node.Nodes.Clear(); - try + FileSystemTreeNode node = e.Node as FileSystemTreeNode; + if (node != null && node.IsExpandable) { - ExpandDirInNode(e.Node); - base.OnBeforeExpand(e); - } - catch (Exception ex) - { - e.Node.Text = (e.Node.Tag is FileSystemInfo ? m_icon_mgr.GetDisplayName((FileSystemInfo)e.Node.Tag) : - e.Node.Tag is ExtraSpecialFolder ? m_icon_mgr.GetDisplayName((ExtraSpecialFolder)e.Node.Tag) : "" - ) + " : " + ex.Message; - e.Node.Nodes.Clear(); - e.Node.Nodes.Add(DummyNodeText); - e.Cancel = true; + BeginUpdate(); + node.Nodes.Clear(); + try + { + node.DoExpand(); + node.SelectedImageIndex = node.ImageIndex = node.DisplayIcon; + } + catch (Exception ex) + { + node.Text = node.DisplayName + " : " + ex.Message; + node.IsExpandable = true; + e.Cancel = true; + } + finally + { + EndUpdate(); + } } + base.OnBeforeExpand(e); } /// @@ -299,75 +452,23 @@ namespace CUEControls /// protected override void OnAfterCollapse(TreeViewEventArgs e) { - e.Node.Nodes.Clear(); - - // Add the dummy node - e.Node.Nodes.Add(DummyNodeText); - if (e.Node.Tag is ExtraSpecialFolder) - e.Node.ImageIndex = m_icon_mgr.GetIconIndex((ExtraSpecialFolder)e.Node.Tag, false); - else if (e.Node.Tag is DirectoryInfo) - e.Node.ImageIndex = m_icon_mgr.GetIconIndex((DirectoryInfo)e.Node.Tag, false); + FileSystemTreeNode node = e.Node as FileSystemTreeNode; + if (node != null) + { + node.IsExpandable = true; + node.SelectedImageIndex = node.ImageIndex = node.DisplayIcon; + } } - private void ExpandDirInNode(TreeNode node, DirectoryInfo info) + internal void OnDoExpand(FileSystemTreeViewNodeExpandEventArgs e) { - FileSystemTreeViewNodeExpandEventArgs e = new FileSystemTreeViewNodeExpandEventArgs(); - e.node = node; - e.files = info.GetFileSystemInfos(); if (NodeExpand != null) NodeExpand(this, e); else { foreach (FileSystemInfo file in e.files) - { - bool isExpandable = (file.Attributes & FileAttributes.Directory) != 0; if ((file.Attributes & FileAttributes.Hidden) == 0 && (file.Attributes & FileAttributes.Directory) != 0) - node.Nodes.Add(NewNode(file, isExpandable)); - } - } - } - - private void ExpandDirInNode(TreeNode node, ExtraSpecialFolder path) - { - switch (path) - { - case ExtraSpecialFolder.Desktop: - foreach (ExtraSpecialFolder fldr in m_extra_folders) - try { node.Nodes.Add(NewNode(fldr)); } - catch { } - break; - case ExtraSpecialFolder.MyComputer: - if (m_icon_mgr.GetFolderPath(path) == "/") - break; - foreach (DriveInfo di in DriveInfo.GetDrives()) - try { node.Nodes.Add(NewNode(new DirectoryInfo(di.Name), true)); } - catch { } - return; - } - string dir = m_icon_mgr.GetFolderPath(path); - if (dir != null && dir != "" && Directory.Exists(dir)) - ExpandDirInNode(node, new DirectoryInfo(dir)); - } - - private void ExpandDirInNode(TreeNode node) - { - try - { - BeginUpdate(); - if (node.Tag is ExtraSpecialFolder) - { - ExpandDirInNode(node, (ExtraSpecialFolder)node.Tag); - node.ImageIndex = m_icon_mgr.GetIconIndex((ExtraSpecialFolder)node.Tag, true); - } - if (node.Tag is DirectoryInfo) - { - ExpandDirInNode(node, (DirectoryInfo)node.Tag); - node.ImageIndex = m_icon_mgr.GetIconIndex((DirectoryInfo)node.Tag, true); - } - } - finally - { - EndUpdate(); + e.node.Nodes.Add(NewNode(file)); } } @@ -385,10 +486,10 @@ namespace CUEControls /// the location of the event protected override void OnItemDrag(ItemDragEventArgs e) { - if (e.Item != null && e.Item is TreeNode && (e.Item as TreeNode).Tag is FileSystemInfo) + if (e.Item != null && e.Item is FileSystemTreeNodeFileSystemInfo) { string[] arr = new string[1]; - arr[0] = ((FileSystemInfo)((e.Item as TreeNode).Tag)).FullName; + arr[0] = (e.Item as FileSystemTreeNodeFileSystemInfo).File.FullName; DataObject dobj = new DataObject(DataFormats.FileDrop, arr); DragDropEffects effects = DoDragDrop(dobj, DragDropEffects.All); return; diff --git a/CUEControls/IIconManager.cs b/CUEControls/IIconManager.cs index 6c77ba8..9f4be00 100644 --- a/CUEControls/IIconManager.cs +++ b/CUEControls/IIconManager.cs @@ -26,6 +26,7 @@ namespace CUEControls /// if true, the file is "open", most useful for folders /// the index into the image list for the icon associated with this file int GetIconIndex(ExtraSpecialFolder folder, bool open); + int GetIconIndex(string filename); void SetExtensionIcon(string extension, Image icon); void SetExtensionIcon(string extension, Icon icon); string GetFolderPath(ExtraSpecialFolder folder); @@ -280,6 +281,16 @@ namespace CUEControls { return 0; } + + public int GetIconIndex(string filename) + { + int iIcon; + if (m_extension_map.TryGetValue(Path.GetExtension(filename).ToLower(), out iIcon)) + return iIcon; + if (m_extension_map.TryGetValue(".wav", out iIcon)) + return iIcon; + return 0; + } #endregion #region private methods diff --git a/CUEControls/Properties/AssemblyInfo.cs b/CUEControls/Properties/AssemblyInfo.cs index 8689bb2..574607d 100644 --- a/CUEControls/Properties/AssemblyInfo.cs +++ b/CUEControls/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUEControls/ShellIconMgr.cs b/CUEControls/ShellIconMgr.cs index 2d13f94..4ed865e 100644 --- a/CUEControls/ShellIconMgr.cs +++ b/CUEControls/ShellIconMgr.cs @@ -183,6 +183,16 @@ namespace CUEControls DestroyIcon(info.hIcon); return iIcon; } + + public int GetIconIndex(string filename) + { + int iIcon; + if (m_extension_map.TryGetValue(Path.GetExtension(filename).ToLower(), out iIcon)) + return iIcon; + if (m_extension_map.TryGetValue(".wav", out iIcon)) + return iIcon; + return 0; + } #endregion #region private methods diff --git a/CUEPlayer/Browser.cs b/CUEPlayer/Browser.cs index d21d465..5a245ea 100644 --- a/CUEPlayer/Browser.cs +++ b/CUEPlayer/Browser.cs @@ -42,7 +42,7 @@ namespace CUEPlayer List fileGroups = CUESheet.ScanFolder(_config, e.files); foreach (FileGroupInfo fileGroup in fileGroups) { - TreeNode node = fileSystemTreeView1.NewNode(fileGroup.main, fileGroup.type == FileGroupInfoType.Folder); + TreeNode node = fileSystemTreeView1.NewNode(fileGroup.main); if (fileGroup.type == FileGroupInfoType.TrackFiles) node.Text = node.Text + ": " + fileGroup.files.Count.ToString() + " files"; e.node.Nodes.Add(node); diff --git a/CUEPlayer/Properties/AssemblyInfo.cs b/CUEPlayer/Properties/AssemblyInfo.cs index d0ccf2a..25b1535 100644 --- a/CUEPlayer/Properties/AssemblyInfo.cs +++ b/CUEPlayer/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUEPlayer/frmCUEPlayer.Designer.cs b/CUEPlayer/frmCUEPlayer.Designer.cs index 972272e..bfc65c8 100644 --- a/CUEPlayer/frmCUEPlayer.Designer.cs +++ b/CUEPlayer/frmCUEPlayer.Designer.cs @@ -68,7 +68,7 @@ this.IsMdiContainer = true; this.MainMenuStrip = this.menuStrip1; this.Name = "frmCUEPlayer"; - this.Text = "CUEPlayer 2.0.9"; + this.Text = "CUEPlayer 2.1.1"; this.Load += new System.EventHandler(this.frmCUEPlayer_Load); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmCUEPlayer_FormClosing); this.menuStrip1.ResumeLayout(false); diff --git a/CUERipper/CUERipper.csproj b/CUERipper/CUERipper.csproj index edcc698..d71ff63 100644 --- a/CUERipper/CUERipper.csproj +++ b/CUERipper/CUERipper.csproj @@ -40,7 +40,7 @@ true index.html 2 - 2.0.9.0 + 2.1.1.0 false true true diff --git a/CUERipper/frmCUERipper.de-DE.resx b/CUERipper/frmCUERipper.de-DE.resx index 1c6fd32..1f41acd 100644 --- a/CUERipper/frmCUERipper.de-DE.resx +++ b/CUERipper/frmCUERipper.de-DE.resx @@ -208,6 +208,6 @@ Senden - CUERipper 2.0.9 + CUERipper 2.1.1 \ No newline at end of file diff --git a/CUERipper/frmCUERipper.resx b/CUERipper/frmCUERipper.resx index e8b88ef..a0118e7 100644 --- a/CUERipper/frmCUERipper.resx +++ b/CUERipper/frmCUERipper.resx @@ -468,7 +468,7 @@ bnComboBoxLosslessOrNot - CUEControls.ImgComboBox, CUEControls, Version=2.0.9.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null groupBoxSettings @@ -495,7 +495,7 @@ bnComboBoxEncoder - CUEControls.ImgComboBox, CUEControls, Version=2.0.9.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null groupBoxSettings @@ -549,7 +549,7 @@ bnComboBoxFormat - CUEControls.ImgComboBox, CUEControls, Version=2.0.9.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null groupBoxSettings @@ -615,7 +615,7 @@ bnComboBoxImage - CUEControls.ImgComboBox, CUEControls, Version=2.0.9.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null groupBoxSettings @@ -1005,7 +1005,7 @@ bnComboBoxRelease - CUEControls.ImgComboBox, CUEControls, Version=2.0.9.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null $this @@ -1029,7 +1029,7 @@ bnComboBoxDrives - CUEControls.ImgComboBox, CUEControls, Version=2.0.9.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null $this @@ -1053,7 +1053,7 @@ bnComboBoxOutputFormat - CUEControls.ImgComboBox, CUEControls, Version=2.0.9.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null $this @@ -1729,7 +1729,7 @@ CenterScreen - CUERipper 2.0.9 + CUERipper 2.1.1 toolStripStatusLabel1 diff --git a/CUERipper/frmFreedbSubmit.resx b/CUERipper/frmFreedbSubmit.resx index 07ed5ff..e5256f0 100644 --- a/CUERipper/frmFreedbSubmit.resx +++ b/CUERipper/frmFreedbSubmit.resx @@ -138,7 +138,7 @@ imgComboBoxCategory - CUEControls.ImgComboBox, CUEControls, Version=2.0.9.0, Culture=neutral, PublicKeyToken=null + CUEControls.ImgComboBox, CUEControls, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null groupBox1 diff --git a/CUETools.ARCUE/Properties/AssemblyInfo.cs b/CUETools.ARCUE/Properties/AssemblyInfo.cs index 132549b..57b34d4 100644 --- a/CUETools.ARCUE/Properties/AssemblyInfo.cs +++ b/CUETools.ARCUE/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.AccurateRip/AccurateRip.cs b/CUETools.AccurateRip/AccurateRip.cs index a573da1..8721ece 100644 --- a/CUETools.AccurateRip/AccurateRip.cs +++ b/CUETools.AccurateRip/AccurateRip.cs @@ -4,12 +4,152 @@ using System.Globalization; using System.IO; using System.Net; using System.Text; +using System.Threading; +using System.Xml.Serialization; using CUETools.Parity; using CUETools.CDImage; using CUETools.Codecs; namespace CUETools.AccurateRip { + [Serializable] + public class OffsetSafeCRCRecord + { + private uint[] val; + + public OffsetSafeCRCRecord() + { + this.val = new uint[1]; + } + + public OffsetSafeCRCRecord(AccurateRipVerify ar) + : this(new uint[64 + 64]) + { + int offset = 64 * 64; + for (int i = 0; i < 64; i++) + this.val[i] = ar.GetMiddleCRC32(offset + i * 64 + 64, 2 * offset - 64 - i * 64); + for (int i = 0; i < 64; i++) + this.val[i + 64] = ar.GetMiddleCRC32(offset + 64 - 1 - i, 2 * offset - 64 + 1 + i); + } + + public OffsetSafeCRCRecord(uint[] val) + { + this.val = val; + } + + [XmlIgnore] + public uint[] Value + { + get + { + return val; + } + } + + public unsafe string Base64 + { + get + { + byte[] res = new byte[val.Length * 4]; + fixed (byte* pres = &res[0]) + fixed (uint* psrc = &val[0]) + AudioSamples.MemCpy(pres, (byte*)psrc, res.Length); + var b64 = new char[res.Length * 2 + 4]; + int b64len = Convert.ToBase64CharArray(res, 0, res.Length, b64, 0); + StringBuilder sb = new StringBuilder(b64len + b64len / 4 + 1); + for (int i = 0; i < b64len; i += 64) + { + sb.Append(b64, i, Math.Min(64, b64len - i)); + sb.AppendLine(); + } + return sb.ToString(); + } + + set + { + if (value == null) + throw new ArgumentNullException(); + byte[] bytes = Convert.FromBase64String(value); + if (bytes.Length % 4 != 0) + throw new InvalidDataException(); + val = new uint[bytes.Length / 4]; + fixed (byte* pb = &bytes[0]) + fixed (uint* pv = &val[0]) + AudioSamples.MemCpy((byte*)pv, pb, bytes.Length); + } + } + + public override bool Equals(object obj) + { + return obj is OffsetSafeCRCRecord && this == (OffsetSafeCRCRecord)obj; + } + + public override int GetHashCode() + { + return (int)val[0]; + } + + public static bool operator == (OffsetSafeCRCRecord x, OffsetSafeCRCRecord y) + { + if (x as object == null || y as object == null) return x as object == null && y as object == null; + if (x.Value.Length != y.Value.Length) return false; + for (int i = 0; i < x.Value.Length; i++) + if (x.Value[i] != y.Value[i]) + return false; + return true; + } + + public static bool operator !=(OffsetSafeCRCRecord x, OffsetSafeCRCRecord y) + { + return !(x == y); + } + + public bool DifferByOffset(OffsetSafeCRCRecord rec) + { + int offset; + return FindOffset(rec, out offset); + } + + public bool FindOffset (OffsetSafeCRCRecord rec, out int offset) + { + if (this.Value.Length != 128 || rec.Value.Length != 128) + { + offset = 0; + return false; + //throw new InvalidDataException("Unsupported OffsetSafeCRCRecord"); + } + + for (int i = 0; i < 64; i++) + { + if (rec.Value[0] == Value[i]) + { + offset = i * 64; + return true; + } + if (Value[0] == rec.Value[i]) + { + offset = -i * 64; + return true; + } + for (int j = 0; j < 64; j++) + { + if (rec.Value[i] == Value[64 + j]) + { + offset = i * 64 + j + 1; + return true; + } + if (Value[i] == rec.Value[64 + j]) + { + offset = -i * 64 - j - 1; + return true; + } + } + } + offset = 0; + return false; + } + } + public class AccurateRipVerify : IAudioDest { public AccurateRipVerify(CDImageLayout toc, IWebProxy proxy) @@ -153,6 +293,19 @@ namespace CUETools.AccurateRip return _Peak[iTrack]; } + internal uint GetMiddleCRC32(int prefixLen, int suffixLen) + { + return CTDBCRC(prefixLen * 2, suffixLen * 2); + } + + public OffsetSafeCRCRecord OffsetSafeCRC + { + get + { + return new OffsetSafeCRCRecord(this); + } + } + public uint CRC32(int iTrack) { return CRC32(iTrack, 0); @@ -333,13 +486,17 @@ namespace CUETools.AccurateRip Init(_toc); } - internal unsafe uint CTDBCRC(int actualOffset) + public unsafe uint CTDBCRC(int prefixLen, int suffixLen) { + if (prefixLen > leadin.Length || suffixLen > leadout.Length) + throw new ArgumentOutOfRangeException(); + // stride - 2 * actualOffset + // laststride + 2 * actualOffset fixed (uint* crct = Crc32.table) { // calculate leadin CRC uint crc0 = 0; - for (int off = 0; off < stride - 2 * actualOffset; off++) + for (int off = 0; off < prefixLen; off++) { ushort dd = leadin[off]; crc0 = (crc0 >> 8) ^ crct[(byte)(crc0 ^ dd)]; @@ -347,17 +504,22 @@ namespace CUETools.AccurateRip } // calculate leadout CRC uint crc2 = 0; - for (int off = laststride + 2 * actualOffset - 1; off >= 0; off--) + for (int off = suffixLen - 1; off >= 0; off--) { ushort dd = leadout[off]; crc2 = (crc2 >> 8) ^ crct[(byte)(crc2 ^ dd)]; crc2 = (crc2 >> 8) ^ crct[(byte)(crc2 ^ (dd >> 8))]; } - return GetCRC32(crc0, (stride - 2 * actualOffset) * 2, crc2, (laststride + 2 * actualOffset) * 2); + return GetCRC32(crc0, prefixLen * 2, crc2, suffixLen * 2); } } + public uint CTDBCRC(int actualOffset) + { + return CTDBCRC(stride - 2 * actualOffset, laststride + 2 * actualOffset); + } + private unsafe static void CalcSyn8(ushort* exp, ushort* log, ushort* syn, uint lo, uint n, int npar) { syn[0] ^= (ushort)lo; @@ -438,9 +600,8 @@ namespace CUETools.AccurateRip /// /// /// - /// /// - public unsafe void CalculateCRCs(uint* t, ushort* exp, ushort* log, ushort* syn, ushort* wr, uint* pSampleBuff, int count, int currentOffset, int offs) + public unsafe void CalculateCRCs(uint* t, ushort* exp, ushort* log, ushort* syn, ushort* wr, uint* pSampleBuff, int count, int offs) { int currentStride = ((int)_sampleCount * 2) / stride; bool doSyn = currentStride >= 1 && currentStride <= stridecount && calcSyn; @@ -453,7 +614,7 @@ namespace CUETools.AccurateRip uint crcwn = _CRCWN[_currentTrack, 0]; int crcnl = _CRCNL[_currentTrack, 0]; int peak = _Peak[_currentTrack]; - //fixed (ushort* exp = expTbl, log = logTbl, synptr = syndrome) + for (int i = 0; i < count; i++) { if (offs >= 0) @@ -467,7 +628,7 @@ namespace CUETools.AccurateRip uint sample = *(pSampleBuff++); crcsm += sample; - crcar += sample * (uint)(currentOffset + i + 1); + crcar += sample * (uint)(_samplesDoneTrack + i + 1); uint lo = sample & 0xffff; crc32 = (crc32 >> 8) ^ t[(byte)(crc32 ^ lo)]; @@ -510,7 +671,8 @@ namespace CUETools.AccurateRip _Peak[_currentTrack] = peak; } - private long _samplesRemTrack = 0; + private int _samplesRemTrack = 0; + private int _samplesDoneTrack = 0; public long Position { @@ -521,14 +683,15 @@ namespace CUETools.AccurateRip set { _sampleCount = value; - int tempLocation = (int)_toc[_toc.FirstAudio][0].Start * 588; + int tempLocation = 0; // NOT (int)_toc[_toc.FirstAudio][0].Start * 588; for (int iTrack = 0; iTrack <= _toc.AudioTracks; iTrack++) { int tempLen = (int)(iTrack == 0 ? _toc[_toc.FirstAudio].Pregap : _toc[_toc.FirstAudio + iTrack - 1].Length) * 588; if (tempLocation + tempLen > _sampleCount) { _currentTrack = iTrack; - _samplesRemTrack = tempLocation + tempLen - _sampleCount; + _samplesRemTrack = tempLocation + tempLen - (int)_sampleCount; + _samplesDoneTrack = (int)_sampleCount - tempLocation; return; } tempLocation += tempLen; @@ -549,55 +712,67 @@ namespace CUETools.AccurateRip { // Process no more than there is in the buffer, no more than there is in this track, and no more than up to a sector boundary. int copyCount = Math.Min(Math.Min(sampleBuffer.Length - pos, (int)_samplesRemTrack), 588 - (int)_sampleCount % 588); - // Calculate offset within a track - int currentOffset = (int)_sampleCount - (int)(_currentTrack > 0 ? _toc[_currentTrack + _toc.FirstAudio - 1].Start * 588 : 0); - int currentSector = currentOffset / 588; - int remaingSectors = (int)(_samplesRemTrack - 1) / 588; + int currentSector = _samplesDoneTrack / 588; + int remaingSectors = (_samplesRemTrack - 1) / 588; uint* samples = ((uint*)pSampleBuff) + pos; int currentPart = ((int)_sampleCount * 2) % stride; ushort* synptr = synptr1 + npar * currentPart; ushort* wr = ((ushort*)bpar) + npar * currentPart; int currentStride = ((int)_sampleCount * 2) / stride; - if (currentStride < 2 && leadin != null) - for (int i = 0; i < copyCount * 2; i++) - leadin[_sampleCount * 2 + i] = ((ushort*)samples)[i]; - - if (currentStride >= stridecount && leadout != null) - for (int i = 0; i < copyCount * 2; i++) - { - int remaining = (int)(_finalSampleCount - _sampleCount) * 2 - i - 1; - if (remaining < stride + laststride) - leadout[remaining] = ((ushort*)samples)[i]; - } + for (int i = 0; i < Math.Min(leadin.Length - (int)_sampleCount * 2, copyCount * 2); i++) + leadin[_sampleCount * 2 + i] = ((ushort*)samples)[i]; + for (int i = Math.Max(0, (int)(_finalSampleCount - _sampleCount) * 2 - leadout.Length); i < copyCount * 2; i++) + //if (currentStride >= stridecount && leadout != null) + //for (int i = 0; i < copyCount * 2; i++) + { + int remaining = (int)(_finalSampleCount - _sampleCount) * 2 - i - 1; + leadout[remaining] = ((ushort*)samples)[i]; + } + if (currentSector < 10) - CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, currentOffset, currentOffset); + CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, _samplesDoneTrack); else if (remaingSectors < 10) - CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, currentOffset, 20 * 588 - (int)_samplesRemTrack); + CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, 20 * 588 - _samplesRemTrack); else if (currentSector >= 445 && currentSector <= 455) - CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, currentOffset, 20 * 588 + currentOffset - 445 * 588); + CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, 20 * 588 + _samplesDoneTrack - 445 * 588); else - CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, currentOffset, -1); + CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, -1); pos += copyCount; _samplesRemTrack -= copyCount; + _samplesDoneTrack += copyCount; _sampleCount += copyCount; while (_samplesRemTrack <= 0) { if (++_currentTrack > _toc.AudioTracks) return; - _samplesRemTrack = _toc[_currentTrack + _toc.FirstAudio - 1].Length * 588; + _samplesRemTrack = (int)_toc[_currentTrack + _toc.FirstAudio - 1].Length * 588; + _samplesDoneTrack = 0; } } } public void Combine(AccurateRipVerify part, int start, int end) { + for (int i = 0; i < leadin.Length; i++) + { + int currentOffset = i / 2; + if (currentOffset >= start && currentOffset < end) + this.leadin[i] = part.leadin[i]; + } + for (int i = 0; i < leadout.Length; i++) + { + int currentOffset = (int)_finalSampleCount - i / 2 - 1; + if (currentOffset >= start && currentOffset < end) + this.leadout[i] = part.leadout[i]; + } for (int iTrack = 0; iTrack <= _toc.AudioTracks; iTrack++) { - int tempLocation = (int) (iTrack == 0 ? _toc[_toc.FirstAudio][0].Start : _toc[_toc.FirstAudio + iTrack - 1].Start) * 588; + // ??? int tempLocation = (int) (iTrack == 0 ? _toc[_toc.FirstAudio][0].Start : _toc[_toc.FirstAudio + iTrack - 1].Start) * 588; + int tempLocation = (int) (iTrack == 0 ? 0 : _toc[_toc.FirstAudio + iTrack - 1].Start - _toc[_toc.FirstAudio][0].Start) * 588; int tempLen = (int) (iTrack == 0 ? _toc[_toc.FirstAudio].Pregap : _toc[_toc.FirstAudio + iTrack - 1].Length) * 588; int trStart = Math.Max(tempLocation, start); int trEnd = Math.Min(tempLocation + tempLen, end); @@ -660,18 +835,12 @@ namespace CUETools.AccurateRip _Peak = new int[_toc.AudioTracks + 1]; syndrome = new ushort[calcSyn ? stride : 1, npar]; parity = new byte[stride * npar * 2]; - if (calcSyn || calcParity) - { - leadin = new ushort[stride * 2]; - leadout = new ushort[stride + laststride]; - } - else - { - leadin = null; - leadout = null; - } + int leadin_len = Math.Max(4096 * 4, (calcSyn || calcParity) ? stride * 2 : 0); + int leadout_len = Math.Max(4096 * 4, (calcSyn || calcParity) ? stride + laststride : 0); + leadin = new ushort[leadin_len]; + leadout = new ushort[leadout_len]; _currentTrack = 0; - Position = _toc[_toc.FirstAudio][0].Start * 588; + Position = 0; // NOT _toc[_toc.FirstAudio][0].Start * 588; } private uint readIntLE(byte[] data, int pos) @@ -679,6 +848,10 @@ namespace CUETools.AccurateRip return (uint)(data[pos] + (data[pos + 1] << 8) + (data[pos + 2] << 16) + (data[pos + 3] << 24)); } + static DateTime last_accessed; + static readonly TimeSpan min_interval = new TimeSpan (5000000); // 0.5 second + static readonly object server_mutex = new object (); + public void ContactAccurateRip(string accurateRipId) { // Calculate the three disc ids used by AR @@ -703,72 +876,89 @@ namespace CUETools.AccurateRip req.Method = "GET"; req.Proxy = proxy; - try + lock (server_mutex) { - HttpWebResponse response = (HttpWebResponse)req.GetResponse(); - ExceptionStatus = WebExceptionStatus.ProtocolError; - ResponseStatus = response.StatusCode; - if (ResponseStatus == HttpStatusCode.OK) + // Don't access the AR server twice within min_interval + if (last_accessed != null) { - ExceptionStatus = WebExceptionStatus.Success; + TimeSpan time = DateTime.Now - last_accessed; + if (min_interval > time) + Thread.Sleep((min_interval - time).Milliseconds); + } - // Retrieve response stream and wrap in StreamReader - Stream respStream = response.GetResponseStream(); - - // Allocate byte buffer to hold stream contents - byte[] urlData = new byte[13]; - int urlDataLen, bytesRead; - - _accDisks.Clear(); - while (true) + try + { + using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) { - for (urlDataLen = 0; urlDataLen < 13; urlDataLen += bytesRead) + ExceptionStatus = WebExceptionStatus.ProtocolError; + ResponseStatus = response.StatusCode; + if (ResponseStatus == HttpStatusCode.OK) { - bytesRead = respStream.Read(urlData, urlDataLen, 13 - urlDataLen); - if (0 == bytesRead) - break; - } - if (urlDataLen == 0) - break; - if (urlDataLen < 13) - { - ExceptionStatus = WebExceptionStatus.ReceiveFailure; - return; - } - AccDisk dsk = new AccDisk(); - dsk.count = urlData[0]; - dsk.discId1 = readIntLE(urlData, 1); - dsk.discId2 = readIntLE(urlData, 5); - dsk.cddbDiscId = readIntLE(urlData, 9); + ExceptionStatus = WebExceptionStatus.Success; - for (int i = 0; i < dsk.count; i++) - { - for (urlDataLen = 0; urlDataLen < 9; urlDataLen += bytesRead) + // Retrieve response stream and wrap in StreamReader + Stream respStream = response.GetResponseStream(); + + // Allocate byte buffer to hold stream contents + byte[] urlData = new byte[13]; + int urlDataLen, bytesRead; + + _accDisks.Clear(); + while (true) { - bytesRead = respStream.Read(urlData, urlDataLen, 9 - urlDataLen); - if (0 == bytesRead) + for (urlDataLen = 0; urlDataLen < 13; urlDataLen += bytesRead) + { + bytesRead = respStream.Read(urlData, urlDataLen, 13 - urlDataLen); + if (0 == bytesRead) + break; + } + if (urlDataLen == 0) + break; + if (urlDataLen < 13) { ExceptionStatus = WebExceptionStatus.ReceiveFailure; return; } + AccDisk dsk = new AccDisk(); + dsk.count = urlData[0]; + dsk.discId1 = readIntLE(urlData, 1); + dsk.discId2 = readIntLE(urlData, 5); + dsk.cddbDiscId = readIntLE(urlData, 9); + + for (int i = 0; i < dsk.count; i++) + { + for (urlDataLen = 0; urlDataLen < 9; urlDataLen += bytesRead) + { + bytesRead = respStream.Read(urlData, urlDataLen, 9 - urlDataLen); + if (0 == bytesRead) + { + ExceptionStatus = WebExceptionStatus.ReceiveFailure; + return; + } + } + AccTrack trk = new AccTrack(); + trk.count = urlData[0]; + trk.CRC = readIntLE(urlData, 1); + trk.Frame450CRC = readIntLE(urlData, 5); + dsk.tracks.Add(trk); + } + _accDisks.Add(dsk); } - AccTrack trk = new AccTrack(); - trk.count = urlData[0]; - trk.CRC = readIntLE(urlData, 1); - trk.Frame450CRC = readIntLE(urlData, 5); - dsk.tracks.Add(trk); + respStream.Close(); } - _accDisks.Add(dsk); } - respStream.Close(); } - } - catch (WebException ex) - { - ExceptionStatus = ex.Status; - ExceptionMessage = ex.Message; - if (ExceptionStatus == WebExceptionStatus.ProtocolError) - ResponseStatus = (ex.Response as HttpWebResponse).StatusCode; + catch (WebException ex) + { + ExceptionStatus = ex.Status; + ExceptionMessage = ex.Message; + if (ExceptionStatus == WebExceptionStatus.ProtocolError) + ResponseStatus = (ex.Response as HttpWebResponse).StatusCode; + } + finally + { + last_accessed = DateTime.Now; + } } } diff --git a/CUETools.AccurateRip/CDRepair.cs b/CUETools.AccurateRip/CDRepair.cs index c483b99..7b27f47 100644 --- a/CUETools.AccurateRip/CDRepair.cs +++ b/CUETools.AccurateRip/CDRepair.cs @@ -430,6 +430,14 @@ namespace CUETools.AccurateRip return fix; } + public string OffsetSafeCRC + { + get + { + return ar.OffsetSafeCRC.Base64; + } + } + public byte[] Parity { get diff --git a/CUETools.AccurateRip/Properties/AssemblyInfo.cs b/CUETools.AccurateRip/Properties/AssemblyInfo.cs index 299631f..cee8c88 100644 --- a/CUETools.AccurateRip/Properties/AssemblyInfo.cs +++ b/CUETools.AccurateRip/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.CDImage/Properties/AssemblyInfo.cs b/CUETools.CDImage/Properties/AssemblyInfo.cs index e5ce9a1..b586691 100644 --- a/CUETools.CDImage/Properties/AssemblyInfo.cs +++ b/CUETools.CDImage/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.CTDB/CUEToolsDB.cs b/CUETools.CTDB/CUEToolsDB.cs index 7cb0db0..99c6a5d 100644 --- a/CUETools.CTDB/CUEToolsDB.cs +++ b/CUETools.CTDB/CUEToolsDB.cs @@ -188,7 +188,11 @@ namespace CUETools.CTDB public string Confirm(DBEntry entry) { - HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlbase + "/confirm.php?tocid=" + toc.TOCID + "&id=" + entry.id + "&userid=" + GetUUID()); + HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlbase + + "/confirm.php?tocid=" + toc.TOCID + + "&id=" + entry.id + + "&userid=" + GetUUID() + + "&offscrc=" + verify.OffsetSafeCRC.Replace('+', '.').Replace('/', '_').Replace('=', '-').Replace("\r", "").Replace("\n", "")); req.Method = "GET"; req.Proxy = proxy; req.UserAgent = userAgent; @@ -253,6 +257,7 @@ namespace CUETools.CTDB using (DBHDR CONF = DISC.HDR("CONF")) CONF.Write(confidence); using (DBHDR NPAR = DISC.HDR("NPAR")) NPAR.Write(verify.NPAR); using (DBHDR CRC_ = DISC.HDR("CRC ")) CRC_.Write(verify.CRC); + using (var OFFS = DISC.HDR("OFFS")) OFFS.Write(verify.OffsetSafeCRC); using (DBHDR PAR_ = DISC.HDR("PAR ")) PAR_.Write(verify.Parity); } } diff --git a/CUETools.Codecs.ALAC/Properties/AssemblyInfo.cs b/CUETools.Codecs.ALAC/Properties/AssemblyInfo.cs index c330398..d1323c2 100644 --- a/CUETools.Codecs.ALAC/Properties/AssemblyInfo.cs +++ b/CUETools.Codecs.ALAC/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Codecs.FLACCL/Properties/AssemblyInfo.cs b/CUETools.Codecs.FLACCL/Properties/AssemblyInfo.cs index 83e2da4..cb10a0b 100644 --- a/CUETools.Codecs.FLACCL/Properties/AssemblyInfo.cs +++ b/CUETools.Codecs.FLACCL/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Codecs.FLAKE/Properties/AssemblyInfo.cs b/CUETools.Codecs.FLAKE/Properties/AssemblyInfo.cs index ab7c715..9b67c1d 100644 --- a/CUETools.Codecs.FLAKE/Properties/AssemblyInfo.cs +++ b/CUETools.Codecs.FLAKE/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Codecs.FlaCuda/Properties/AssemblyInfo.cs b/CUETools.Codecs.FlaCuda/Properties/AssemblyInfo.cs index d0a30b9..a577430 100644 --- a/CUETools.Codecs.FlaCuda/Properties/AssemblyInfo.cs +++ b/CUETools.Codecs.FlaCuda/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Codecs/Properties/AssemblyInfo.cs b/CUETools.Codecs/Properties/AssemblyInfo.cs index 6ffa803..f2ced86 100644 --- a/CUETools.Codecs/Properties/AssemblyInfo.cs +++ b/CUETools.Codecs/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Compression.Rar/Properties/AssemblyInfo.cs b/CUETools.Compression.Rar/Properties/AssemblyInfo.cs index a1eb439..fddd40f 100644 --- a/CUETools.Compression.Rar/Properties/AssemblyInfo.cs +++ b/CUETools.Compression.Rar/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Compression.Zip/Properties/AssemblyInfo.cs b/CUETools.Compression.Zip/Properties/AssemblyInfo.cs index 1160d60..eae5589 100644 --- a/CUETools.Compression.Zip/Properties/AssemblyInfo.cs +++ b/CUETools.Compression.Zip/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Compression/Properties/AssemblyInfo.cs b/CUETools.Compression/Properties/AssemblyInfo.cs index 88f8a76..5666bde 100644 --- a/CUETools.Compression/Properties/AssemblyInfo.cs +++ b/CUETools.Compression/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.FLACCL.cmd/Properties/AssemblyInfo.cs b/CUETools.FLACCL.cmd/Properties/AssemblyInfo.cs index 43135ef..3bef97e 100644 --- a/CUETools.FLACCL.cmd/Properties/AssemblyInfo.cs +++ b/CUETools.FLACCL.cmd/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.FlaCudaExe/CUETools.FlaCuda.csproj b/CUETools.FlaCudaExe/CUETools.FlaCuda.csproj index 5b0d116..db2da18 100644 --- a/CUETools.FlaCudaExe/CUETools.FlaCuda.csproj +++ b/CUETools.FlaCudaExe/CUETools.FlaCuda.csproj @@ -2,7 +2,7 @@ Debug AnyCPU - 8.0.50727 + 9.0.30729 2.0 {1FCA8834-34E6-47CF-B53F-D8DF49F0819E} Exe @@ -19,10 +19,11 @@ true full false - ..\bin\x64\Debug\ + ..\bin\Debug\ DEBUG;TRACE prompt 4 + x86 pdbonly diff --git a/CUETools.FlaCudaExe/Properties/AssemblyInfo.cs b/CUETools.FlaCudaExe/Properties/AssemblyInfo.cs index 9af01d2..0a5eaac 100644 --- a/CUETools.FlaCudaExe/Properties/AssemblyInfo.cs +++ b/CUETools.FlaCudaExe/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Processor/CUEMetadata.cs b/CUETools.Processor/CUEMetadata.cs index 66c7f19..da76225 100644 --- a/CUETools.Processor/CUEMetadata.cs +++ b/CUETools.Processor/CUEMetadata.cs @@ -43,7 +43,7 @@ namespace CUETools.Processor { get { - string cache = System.IO.Path.Combine(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CUE Tools"), "MetadataCache"); + string cache = Path.Combine(SettingsShared.GetProfileDir("CUE Tools", System.Windows.Forms.Application.ExecutablePath), "MetadataCache"); if (!Directory.Exists(cache)) Directory.CreateDirectory(cache); return cache; @@ -67,6 +67,27 @@ namespace CUETools.Processor public string Catalog { get; set; } public List Tracks { get; set; } + [XmlIgnore] + public string DiscNumber01 + { + get + { + uint td = 0, dn = 0; + if (uint.TryParse(TotalDiscs, out td) && uint.TryParse(DiscNumber, out dn) && td > 9 && dn > 0) + return string.Format("{0:00}", dn); + return DiscNumber; + } + } + + [XmlIgnore] + public string DiscNumberAndTotal + { + get + { + return (TotalDiscs != "" && TotalDiscs != "1" ? DiscNumber01 + "/" + TotalDiscs : (DiscNumber != "" && DiscNumber != "1" ? DiscNumber01 : "")); + } + } + public void Save() { TextWriter writer = new StreamWriter(Path.Combine(MetadataPath, Id + ".xml")); @@ -272,7 +293,7 @@ namespace CUETools.Processor public CUEMetadataEntry(CUEMetadata metadata, CDImageLayout TOC, string key) { - this.metadata = metadata; + this.metadata = new CUEMetadata(metadata); this.TOC = TOC; this.ImageKey = key; } diff --git a/CUETools.Processor/Processor.cs b/CUETools.Processor/Processor.cs index df8dab3..5645168 100644 --- a/CUETools.Processor/Processor.cs +++ b/CUETools.Processor/Processor.cs @@ -28,6 +28,7 @@ using System.Collections.Specialized; using System.Text; using System.Globalization; using System.IO; +using System.IO.Compression; using System.Net; using System.Security.Policy; using System.Security.Cryptography; @@ -96,6 +97,183 @@ namespace CUETools.Processor GapsLeftOut } + [Serializable] + public class CUEToolsLocalDBEntry + { + public CUEToolsLocalDBEntry() + { + } + + public string DiscID { get; set; } + + public OffsetSafeCRCRecord OffsetSafeCRC { get; set; } + + public CUEMetadata Metadata { get; set; } + + public List InputPaths { get; set; } + + public List AudioPaths { get; set; } + + public int TrackCount { get; set; } + + public int AudioTracks { get; set; } + + public int FirstAudio { get; set; } + + public string TrackOffsets { get; set; } + + public uint ARConfidence { get; set; } + + public string Status { get; set; } + + public string Log { get; set; } + + public DateTime VerificationDate { get; set; } + + [XmlIgnore] + public string Path + { + get + { + return InputPaths == null || InputPaths.Count < 1 ? null : InputPaths[0]; + } + } + + static public string NormalizePath(string path) + { + if (System.Environment.OSVersion.Platform != System.PlatformID.Unix) + return System.IO.Path.GetFullPath(path).ToLower(); + else + return System.IO.Path.GetFullPath(path); + } + + public bool HasPath(string inputPath) + { + string norm = CUEToolsLocalDBEntry.NormalizePath(inputPath); + return this.InputPaths != null && this.InputPaths.Find(i => i == norm) != null; + } + + public bool EqualAudioPaths(List fullAudioPaths) + { + int count1 = this.AudioPaths == null ? 0 : this.AudioPaths.Count; + int count2 = fullAudioPaths == null ? 0 : fullAudioPaths.Count; + if (count1 == count2) + { + bool equals = true; + for (int i = 0; i < count1; i++) + equals &= this.AudioPaths[i] == fullAudioPaths[i]; + return equals; + } + return false; + } + + public bool EqualLayouts(CDImageLayout layout) + { + return this.TrackCount == layout.TrackCount + && this.AudioTracks == layout.AudioTracks + && this.FirstAudio == layout.FirstAudio + && this.TrackOffsets == layout.TrackOffsets; + } + + public bool Equals(CDImageLayout layout, List fullAudioPaths) + { + return EqualLayouts(layout) && EqualAudioPaths(fullAudioPaths); + } + } + + [Serializable] + public class CUEToolsLocalDB : List + { + private static XmlSerializer serializer = new XmlSerializer(typeof(CUEToolsLocalDB)); + + public bool Dirty + { + get; + set; + } + + public static List[] Group(List items, Converter convert, Comparison> compare) + { + var results = new Dictionary>(items.Count); + foreach (var item in items) + { + var key = convert(item); + if (key != null) + { + if (!results.ContainsKey(key)) + results[key] = new List(); + results[key].Add(item); + } + } + + var groups = new List[results.Count]; + results.Values.CopyTo(groups, 0); + if (compare != null) + Array.Sort(groups, (a, b) => compare(a, b)); + else + { + var keys = new string[results.Count]; + results.Keys.CopyTo(keys, 0); + Array.Sort(keys, groups); + } + return groups; + } + + public CUEToolsLocalDBEntry Lookup(string inputPath) + { + return this.Find(e => e.HasPath(inputPath)); + } + + public CUEToolsLocalDBEntry Lookup(CDImageLayout layout, List audioPaths) + { + List fullAudioPaths = audioPaths == null ? null : audioPaths.ConvertAll(p => CUEToolsLocalDBEntry.NormalizePath(p)); + var entry = this.Find(e => e.Equals(layout, fullAudioPaths)); + if (entry == null) + { + entry = new CUEToolsLocalDBEntry(); + entry.TrackCount = layout.TrackCount; + entry.AudioTracks = (int)layout.AudioTracks; + entry.FirstAudio = layout.FirstAudio; + entry.TrackOffsets = layout.TrackOffsets; + entry.DiscID = layout.TOCID; + entry.AudioPaths = fullAudioPaths; + this.Add(entry); + this.Dirty = true; + } + return entry; + } + + public static string LocalDBPath + { + get + { + return Path.Combine(SettingsShared.GetProfileDir("CUE Tools", System.Windows.Forms.Application.ExecutablePath), "LocalDB.xml.z"); + } + } + + public void Save() + { + if (!this.Dirty) return; + string tempPath = LocalDBPath + "." + DateTime.Now.Ticks.ToString() + ".tmp"; + using (var fileStream = new FileStream(tempPath, FileMode.CreateNew)) + using (var deflateStream = new DeflateStream(fileStream, CompressionMode.Compress)) + using (TextWriter writer = new StreamWriter(deflateStream)) + serializer.Serialize(writer, this); + File.Delete(LocalDBPath); + File.Move(tempPath, LocalDBPath); + this.Dirty = false; + } + + public static CUEToolsLocalDB Load() + { + if (!File.Exists(LocalDBPath)) + return new CUEToolsLocalDB(); + using (var fileStream = new FileStream(LocalDBPath, FileMode.Open)) + using (var deflateStream = new DeflateStream(fileStream, CompressionMode.Decompress)) + return serializer.Deserialize(deflateStream) as CUEToolsLocalDB; + } + } + public static class General { public static CUELine FindCUELine(List list, string command) { command = command.ToUpper(); @@ -933,7 +1111,7 @@ namespace CUETools.Processor public string ProxyPassword { get; set; } [DefaultValue(true), Category("Cache"), DisplayName("Cache metadata")] public bool CacheMetadata { get; set; } - [DefaultValue(new string[]{"folder.jpg", "cover.jpg", "albumart.jpg", "thumbnail.jpg", "albumartlarge.jpg", "front.jpg"})] + [DefaultValue(new string[]{"folder.jpg", "cover.jpg", "albumart.jpg", "thumbnail.jpg", "albumartlarge.jpg", "front.jpg", "%album%.jpg"})] [Category("Cover Art"), DisplayName("Cover Art Files")] public string[] CoverArtFiles { get; set; } [DefaultValue(true)] @@ -1621,6 +1799,8 @@ string status = processor.Go(); _useMusicBrainz = sr.LoadBoolean("MusicBrainzLookup") ?? _useMusicBrainz; _useAccurateRip = sr.LoadBoolean("AccurateRipLookup") ?? _useAccurateRip; _useCUEToolsDB = sr.LoadBoolean("CUEToolsDBLookup") ?? _useCUEToolsDB; + _useLocalDB = sr.LoadBoolean("LocalDBLookup") ?? _useLocalDB; + _skipRecent = sr.LoadBoolean("SkipRecent") ?? _skipRecent; _outputAudioType = (AudioEncoderType?)sr.LoadInt32("OutputAudioType", null, null) ?? _outputAudioType; _outputAudioFormat = sr.Load("OutputAudioFmt") ?? _outputAudioFormat; _action = (CUEAction?)sr.LoadInt32("AccurateRipMode", (int)CUEAction.Encode, (int)CUEAction.CorrectFilenames) ?? _action; @@ -1637,6 +1817,8 @@ string status = processor.Go(); sw.Save("FreedbLookup", _useFreeDb); sw.Save("MusicBrainzLookup", _useMusicBrainz); sw.Save("AccurateRipLookup", _useAccurateRip); + sw.Save("LocalDBLookup", _useLocalDB); + sw.Save("SkipRecent", _skipRecent); sw.Save("CUEToolsDBLookup", _useCUEToolsDB); sw.Save("OutputAudioType", (int)_outputAudioType); sw.Save("OutputAudioFmt", _outputAudioFormat); @@ -1653,7 +1835,7 @@ string status = processor.Go(); public CUEAction _action = CUEAction.Encode; public CUEStyle _CUEStyle = CUEStyle.SingleFileWithCUE; public int _writeOffset = 0; - public bool _useFreeDb = true, _useMusicBrainz = true, _useAccurateRip = true, _useCUEToolsDB = true; + public bool _useFreeDb = true, _useMusicBrainz = true, _useAccurateRip = true, _useCUEToolsDB = true, _useLocalDB = true, _skipRecent = true; public string _name; } @@ -1739,6 +1921,8 @@ string status = processor.Go(); private int _padding = 8192; private IWebProxy proxy; private CUEMetadata taglibMetadata; + private bool _useLocalDB; + private CUEToolsLocalDB _localDB; public event EventHandler PasswordRequired; public event EventHandler CUEToolsProgress; @@ -1768,6 +1952,7 @@ string status = processor.Go(); _hasEmbeddedCUESheet = false; _isArchive = false; _isCD = false; + _useLocalDB = false; proxy = _config.GetProxy(); } @@ -1902,31 +2087,193 @@ string status = processor.Go(); } } - public List LookupAlbumInfo(bool useFreedb, bool useMusicBrainz, bool useCache) + protected void ReportProgress(string status, double percent) + { + ShowProgress(status, percent, null, null); + } + + public void ScanLocalDB(string folder) + { + var results = new List(); + + int n = 2, j = 0; + foreach (var fmt in _config.formats) + if (fmt.Value.allowLossless) + n++; + + CheckStop(); + ReportProgress("Scanning *.cue", (double)(j++) / n); + results.AddRange(Directory.GetFiles(folder, "*.cue", SearchOption.AllDirectories)); + + CheckStop(); + ReportProgress("Scanning *.m3u", (double)(j++) / n); + results.AddRange(Directory.GetFiles(folder, "*.m3u", SearchOption.AllDirectories)); + + foreach (var fmt in _config.formats) + if (fmt.Value.allowLossless) + { + CheckStop(); + ReportProgress("Scanning *." + fmt.Key, (double)(j++) / n); + results.AddRange(Directory.GetFiles(folder, "*." + fmt.Key, SearchOption.AllDirectories)); + } + + int i = 0; + foreach (var result in results) + { + CheckStop(); + + var path = CUEToolsLocalDBEntry.NormalizePath(result); + var pathextension = Path.GetExtension(path).ToLower(); + bool skip = false; + if (_localDB.Find( + item => item.HasPath(path) || + (item.AudioPaths != null && + item.AudioPaths.Count > 1 && + item.AudioPaths.Contains(path)) + ) != null) + skip = true; + if (!skip && pathextension == ".m3u") + { + var contents = new List(); + using (StreamReader m3u = new StreamReader(path)) + { + do + { + string line = m3u.ReadLine(); + if (line == null) break; + if (line == "" || line[0] == '#') continue; + //if (line.IndexOfAny(Path.GetInvalidPathChars()) >= 0) + // continue; + try + { + string extension = Path.GetExtension(line); + CUEToolsFormat fmt1; + if (!extension.StartsWith(".") || !_config.formats.TryGetValue(extension.ToLower().Substring(1), out fmt1) || !fmt1.allowLossless) + { + skip = true; + break; + } + string fullpath = CUEToolsLocalDBEntry.NormalizePath(Path.Combine(Path.GetDirectoryName(path), line)); + if (!File.Exists(fullpath)) + { + skip = true; + break; + } + contents.Add(fullpath); + } + catch + { + skip = true; + break; + } + } while (!skip); + } + if (!skip && _localDB.Find(item => item.EqualAudioPaths(contents)) != null) + skip = true; + } + if (!skip && pathextension != ".cue" && pathextension != ".m3u") + { + if (_localDB.Find(item => + item.AudioPaths != null && + item.AudioPaths.Count == 1 && + item.AudioPaths[0] == path + ) != null) + { + CUEToolsFormat fmt; + if (!pathextension.StartsWith(".") || !_config.formats.TryGetValue(pathextension.Substring(1), out fmt) || !fmt.allowLossless || !fmt.allowEmbed) + skip = true; + else + { + TagLib.File fileInfo; + TagLib.UserDefined.AdditionalFileTypes.Config = _config; + TagLib.File.IFileAbstraction file = (TagLib.File.IFileAbstraction)new TagLib.File.LocalFileAbstraction(path); + fileInfo = TagLib.File.Create(file); + NameValueCollection tags = Tagging.Analyze(fileInfo); + if (tags.Get("CUESHEET") == null) + skip = true; + } + } + } + if (skip) + { + ReportProgress("Skipping " + path, (double)(i++) / results.Count); + } + else + { + ReportProgress("Checking " + path, (double)(i++) / results.Count); + var cueSheet = new CUESheet(_config); + cueSheet.UseLocalDB(_localDB); + //cueSheet.PasswordRequired += new EventHandler(PasswordRequired); + //cueSheet.CUEToolsProgress += new EventHandler(SetStatus); + //cueSheet.CUEToolsSelection += new EventHandler(MakeSelection); + try + { + cueSheet.Open(path); + cueSheet.OpenLocalDBEntry(); + } + catch (Exception) + { + } + cueSheet.Close(); + } + } + _localDB.Save(); + } + + public List LookupAlbumInfo(bool useFreedb, bool useMusicBrainz, bool useCache, bool useCUE) { List Releases = new List(); StringCollection DiscIds = new StringCollection(); DiscIds.Add(_toc.MusicBrainzId); - if (useCache) + CUEMetadata dbmeta = null; + + if (useCache && _localDB != null) { - try + List fullAudioPaths = this.SourcePaths.ConvertAll(p => CUEToolsLocalDBEntry.NormalizePath(p)); + var myEntry = _localDB.Find(e => e.Equals(this.TOC, fullAudioPaths)); + if (myEntry != null) + dbmeta = myEntry.Metadata; + } + + if (dbmeta != null) + Releases.Add(new CUEMetadataEntry(dbmeta, TOC, "local")); + + //if (useCache) + //{ + // try + // { + // CUEMetadata cache = CUEMetadata.Load(TOC.TOCID); + // if (cache != null) + // Releases.Add(new CUEMetadataEntry(cache, TOC, "local")); + // } + // catch (Exception ex) + // { + // System.Diagnostics.Trace.WriteLine(ex.Message); + // } + //} + + if (useCUE) + { + CUEMetadata meta = Metadata; + if (dbmeta == null || !dbmeta.Contains(meta)) { - CUEMetadata cache = CUEMetadata.Load(TOC.TOCID); - if (cache != null) - Releases.Add(new CUEMetadataEntry(cache, TOC, "local")); + if (meta.Contains(taglibMetadata) || !taglibMetadata.Contains(meta)) + Releases.Add(new CUEMetadataEntry(meta, TOC, "cue")); } - catch (Exception ex) + if (dbmeta == null || !dbmeta.Contains(taglibMetadata)) { - System.Diagnostics.Trace.WriteLine(ex.Message); + if (!meta.Contains(taglibMetadata)) + Releases.Add(new CUEMetadataEntry(new CUEMetadata(taglibMetadata), TOC, "tags")); } } - CUEMetadata meta = Metadata; - if (meta.Contains(taglibMetadata) || !taglibMetadata.Contains(meta)) - Releases.Add(new CUEMetadataEntry(meta, TOC, "cue")); - if (!meta.Contains(taglibMetadata)) - Releases.Add(new CUEMetadataEntry(new CUEMetadata(taglibMetadata), TOC, "tags")); + if (useCache && _localDB != null) + { + foreach (var entry in _localDB) + if (entry.DiscID == TOC.TOCID && entry.Metadata != null && (dbmeta == null || !dbmeta.Contains(entry.Metadata))) + Releases.Add(new CUEMetadataEntry(entry.Metadata, TOC, "local")); + } if (useFreedb) { @@ -2042,6 +2389,7 @@ string status = processor.Go(); //if (cdEntry != null) // FillFromFreedb(cdEntry); } + ShowProgress("", 0, null, null); return Releases; } @@ -2379,6 +2727,8 @@ string status = processor.Go(); } if (!fileIsBinary) { + if (_sourcePaths.Count != 0 && !seenFirstFileIndex) + throw new Exception("Double FILE in CUE sheet: \"" + line.Params[1] + "\"."); if (!_hasEmbeddedCUESheet) { if (_isArchive) @@ -2427,7 +2777,10 @@ string status = processor.Go(); isAudioTrack = line.Params[2].ToUpper() == "AUDIO"; trackNumber = int.Parse(line.Params[1]); if (trackNumber != _toc.TrackCount + 1) - throw new Exception("Invalid track number."); + throw new Exception("Invalid track number"); + // Disabled this check: fails on Headcandy test image + //if (isAudioTrack && _sourcePaths.Count == 0) + // throw new Exception("No FILE seen before TRACK"); _toc.AddTrack(new CDTrack((uint)trackNumber, 0, 0, isAudioTrack, false)); if (isAudioTrack) { @@ -2880,10 +3233,6 @@ string status = processor.Go(); break; ShowProgress((string)"Contacting AccurateRip database...", (dtl - minDTL) / 75.0, null, null); CheckStop(); - lock (this) - { - Monitor.Wait(this, 500); - } } } else @@ -3087,12 +3436,15 @@ string status = processor.Go(); for (int iDir = 0; iDir < dirList.Count; iDir++) { for (int iFile = 0; iFile < fileList.Count; iFile++) { string path = Path.Combine(dirList[iDir], fileList[iFile]); - if ((contents == null && System.IO.File.Exists(path)) - || (contents != null && contents.Contains(path))) - return path; - path = dirList[iDir] + '/' + fileList[iFile]; - if (contents != null && contents.Contains(path)) + if (contents == null && System.IO.File.Exists(path)) return path; + if (contents != null) + { + List matching = contents.FindAll(s => s.ToLower().Replace('/', Path.DirectorySeparatorChar) == + path.ToLower().Replace('/', Path.DirectorySeparatorChar)); + if (matching.Count == 1) + return matching[0]; + } } } @@ -3322,7 +3674,7 @@ string status = processor.Go(); { ShowProgress("Analyzing input file...", 0.0, path, null); - if (Path.GetExtension(path) == ".dummy" || Path.GetExtension(path) == ".bin") + if (Path.GetExtension(path).ToLower() == ".dummy" || Path.GetExtension(path).ToLower() == ".bin") { fileInfo = null; } @@ -3773,7 +4125,7 @@ string status = processor.Go(); } } - public readonly static string CUEToolsVersion = "2.0.9"; + public readonly static string CUEToolsVersion = "2.1.1"; public void GenerateAccurateRipLog(TextWriter sw) { @@ -3982,6 +4334,16 @@ string status = processor.Go(); CreateRipperLOG(); + if (_action == CUEAction.Verify && _useLocalDB) + { + var entry = OpenLocalDBEntry(); + entry.Status = this.GenerateAccurateRipStatus(); + entry.ARConfidence = _arVerify.WorstConfidence(); + entry.Log = AccurateRipLog; + entry.VerificationDate = DateTime.Now; + entry.OffsetSafeCRC = _arVerify.OffsetSafeCRC; + } + if (_action == CUEAction.Encode) { uint tracksMatch = 0; @@ -4139,6 +4501,23 @@ string status = processor.Go(); return WriteReport(); } + public CUEToolsLocalDBEntry OpenLocalDBEntry() + { + if (!_useLocalDB) + return null; + + string path = CUEToolsLocalDBEntry.NormalizePath(InputPath); + CUEToolsLocalDBEntry entry = _localDB.Lookup(_toc, _sourcePaths); + if (entry.InputPaths == null) + entry.InputPaths = new List(); + if (!entry.InputPaths.Contains(path)) + entry.InputPaths.Add(path); + if (entry.Metadata == null) + entry.Metadata = Metadata; + _localDB.Dirty = true; + return entry; + } + private static Bitmap resizeImage(Image imgToResize, Size size) { int sourceWidth = imgToResize.Width; @@ -4195,8 +4574,9 @@ string status = processor.Go(); } if ((_config.extractAlbumArt || _config.embedAlbumArt) && !_isCD) { - foreach (string name in _config.advanced.CoverArtFiles) + foreach (string tpl in _config.advanced.CoverArtFiles) { + string name = tpl.Replace("%album%", Title).Replace("%artist%", Artist); string imgPath = Path.Combine(_isArchive ? _archiveCUEpath : _inputDir, name); bool exists = _isArchive ? _archiveContents.Contains(imgPath) : File.Exists(imgPath); if (exists) @@ -4213,51 +4593,50 @@ string status = processor.Go(); if (!_isArchive && _config.advanced.CoverArtSearchSubdirs) { + List allfiles = new List(Directory.GetFiles(_inputDir, "*.jpg", SearchOption.AllDirectories)); // TODO: archive case - foreach (string name in _config.advanced.CoverArtFiles) + foreach (string tpl in _config.advanced.CoverArtFiles) { - foreach (string imgPath in Directory.GetFiles(_inputDir, name, SearchOption.AllDirectories)) + string name = tpl.Replace("%album%", Title).Replace("%artist%", Artist); + List matching = allfiles.FindAll(s => Path.GetFileName(s) == name); + if (matching.Count == 1) { + string imgPath = matching[0]; TagLib.File.IFileAbstraction file = _isArchive ? (TagLib.File.IFileAbstraction)new ArchiveFileAbstraction(this, imgPath) : (TagLib.File.IFileAbstraction)new TagLib.File.LocalFileAbstraction(imgPath); TagLib.Picture pic = new TagLib.Picture(file); pic.Description = name; _albumArt.Add(pic); - } - if (_albumArt.Count == 1) return; - if (_albumArt.Count > 1) - { - _albumArt.Clear(); - break; } } - foreach (string imgPath in Directory.GetFiles(_inputDir, "*.jpg", SearchOption.AllDirectories)) + + if (CUEToolsSelection != null + && ( (Action == CUEAction.Encode && allfiles.Count < 32) + || (Action != CUEAction.Encode && allfiles.Count < 2) + ) + ) { - TagLib.Picture pic = new TagLib.Picture(imgPath); - if (imgPath.StartsWith(_inputDir)) - pic.Description = imgPath.Substring(_inputDir.Length).Trim(Path.DirectorySeparatorChar); - else - pic.Description = Path.GetFileName(imgPath); - _albumArt.Add(pic); + foreach (string imgPath in allfiles) + { + TagLib.Picture pic = new TagLib.Picture(imgPath); + if (imgPath.StartsWith(_inputDir)) + pic.Description = imgPath.Substring(_inputDir.Length).Trim(Path.DirectorySeparatorChar); + else + pic.Description = Path.GetFileName(imgPath); + _albumArt.Add(pic); + } + if (_albumArt.Count > 0) + { + CUEToolsSelectionEventArgs e = new CUEToolsSelectionEventArgs(); + e.choices = _albumArt.ToArray(); + CUEToolsSelection(this, e); + TagLib.IPicture selected = e.selection == -1 ? null : _albumArt[e.selection]; + _albumArt.RemoveAll(t => t != selected); + } } } - - if (Action != CUEAction.Encode && _albumArt.Count > 1) - { - _albumArt.Clear(); - return; - } - - if (_albumArt.Count != 0) - { - CUEToolsSelectionEventArgs e = new CUEToolsSelectionEventArgs(); - e.choices = _albumArt.ToArray(); - CUEToolsSelection(this, e); - TagLib.IPicture selected = e.selection == -1 ? null : _albumArt[e.selection]; - _albumArt.RemoveAll(t => t != selected); - } } } @@ -4310,6 +4689,14 @@ string status = processor.Go(); } } + public List SourcePaths + { + get + { + return _sourcePaths; + } + } + public string WriteReport() { if (_useAccurateRip) @@ -4697,6 +5084,8 @@ string status = processor.Go(); } copyCount = audioSource.Read(sampleBuffer, copyCount); + if (copyCount == 0) + throw new Exception("Unexpected end of file"); if (_useCUEToolsDB && _useCUEToolsDBFix) _CUEToolsDB.SelectedEntry.repair.Write(sampleBuffer); // we use AR after CTDB fix, so that we can verify what we fixed @@ -4737,6 +5126,15 @@ string status = processor.Go(); } } } + if (hdcdDecoder != null) + (hdcdDecoder as IAudioFilter).AudioDest = null; + hdcdDecoder = null; + if (audioSource != null) + audioSource.Close(); + audioSource = null; + if (audioDest != null) + audioDest.Close(); + audioDest = null; } #if !DEBUG catch (Exception ex) @@ -4753,13 +5151,6 @@ string status = processor.Go(); throw ex; } #endif - - if (hdcdDecoder != null) - (hdcdDecoder as IAudioFilter).AudioDest = null; - if (audioSource != null) - audioSource.Close(); - if (audioDest != null) - audioDest.Close(); } public void VerifyAudio() @@ -4844,7 +5235,8 @@ string status = processor.Go(); } int copyCount = task.Step(sampleBuffer); - + if (copyCount == 0) + throw new Exception("Unexpected end of file"); diskOffset += copyCount; CheckStop(); @@ -4918,7 +5310,14 @@ string status = processor.Go(); int trackNo = 0; foreach (FileSystemInfo file in fileGroup.files) { - sw.WriteLine(String.Format("FILE \"{0}\" WAVE", file.Name)); + string name = file.Name; + if (fileGroup.type == FileGroupInfoType.M3UFile + && Path.GetDirectoryName(file.FullName) != Path.GetDirectoryName(fileGroup.main.FullName) + && Path.GetDirectoryName(file.FullName).StartsWith(Path.GetDirectoryName(fileGroup.main.FullName))) + { + name = file.FullName.Substring(Path.GetDirectoryName(fileGroup.main.FullName).Length + 1); + } + sw.WriteLine(String.Format("FILE \"{0}\" WAVE", name)); sw.WriteLine(String.Format(" TRACK {0:00} AUDIO", ++trackNo)); sw.WriteLine(String.Format(" INDEX 01 00:00:00")); } @@ -4946,6 +5345,7 @@ string status = processor.Go(); CUELine line; int i; string CDDBID = ""; + //bool isBinary = false; using (StringReader sr = new StringReader(cue)) { @@ -4956,12 +5356,28 @@ string status = processor.Go(); if ((line.Params.Count == 3) && (line.Params[0].ToUpper() == "FILE")) { string fileType = line.Params[2].ToUpper(); - if ((fileType != "BINARY") && (fileType != "MOTOROLA")) - { - filePos.Add(lines.Count - 1); - origFiles.Add(line.Params[1]); - foundAll &= (LocateFile(dir, line.Params[1], files) != null); - } + if (fileType == "MOTOROLA") + continue; + if (fileType == "BINARY") + continue; + //{ + // if (filePos.Count > 0) + // continue; + // isBinary = true; + //} + //else + //{ + // if (isBinary) + // { + // filePos.Clear(); + // origFiles.Clear(); + // foundAll = false; + // isBinary = false; + // } + //} + filePos.Add(lines.Count - 1); + origFiles.Add(line.Params[1]); + foundAll &= (LocateFile(dir, line.Params[1], files) != null); } if (line.Params.Count == 3 && line.Params[0].ToUpper() == "REM" && line.Params[1].ToUpper() == "DISCID") CDDBID = line.Params[2].ToLower(); @@ -5000,39 +5416,19 @@ string status = processor.Go(); List fileGroups = CUESheet.ScanFolder(_config, dir == "" ? "." : dir); // Choose filegroup by track count - foreach (FileGroupInfo fileGroup in fileGroups) + List + matching = fileGroups.FindAll(f => f.type == FileGroupInfoType.TrackFiles && f.files.Count == filePos.Count); + // If ambiguous, use DISCID + if (matching.Count > 1) + matching = fileGroups.FindAll(f => f.type == FileGroupInfoType.TrackFiles && f.files.Count == filePos.Count && f.TOC != null && AccurateRipVerify.CalculateCDDBId(f.TOC).ToLower() == CDDBID); + if (matching.Count == 1) { - if (fileGroup.type == FileGroupInfoType.TrackFiles && fileGroup.files.Count == filePos.Count) - { - if (foundAll) - { - foundAll = false; - break; - } - audioFiles = fileGroup.files.ConvertAll(info => info.FullName).ToArray(); - // No need to sort - hopefully already sorted by ScanFolder - extension = fileGroup.main.Extension.ToLower().TrimStart('.'); - foundAll = true; - } + audioFiles = matching[0].files.ConvertAll(info => info.FullName).ToArray(); + // No need to sort - hopefully already sorted by ScanFolder + extension = matching[0].main.Extension.ToLower().TrimStart('.'); + foundAll = true; } - // Choose filegroup by DISCID - if (!foundAll) - foreach (FileGroupInfo fileGroup in fileGroups) - { - if (fileGroup.type == FileGroupInfoType.TrackFiles && fileGroup.files.Count == filePos.Count && fileGroup.TOC != null && AccurateRipVerify.CalculateCDDBId(fileGroup.TOC).ToLower() == CDDBID) - { - if (foundAll) - { - foundAll = false; - break; - } - audioFiles = fileGroup.files.ConvertAll(info => info.FullName).ToArray(); - extension = fileGroup.main.Extension.ToLower().TrimStart('.'); - foundAll = true; - } - } - if (!foundAll && filePos.Count == 1) foreach (FileGroupInfo fileGroup in fileGroups) { @@ -5067,7 +5463,7 @@ string status = processor.Go(); audioFiles = files.FindAll(s => Path.GetDirectoryName(s) == dir && Path.GetExtension(s).ToLower() == "." + format.Key).ToArray(); if (audioFiles.Length == filePos.Count) { - Array.Sort(audioFiles); + Array.Sort(audioFiles, FileGroupInfo.CompareTrackNames); extension = format.Key; foundAll = true; break; @@ -5496,6 +5892,7 @@ string status = processor.Go(); return; if (!_toc[1].IsAudio) { + // TODO: if track 2 has a pregap, we should adjust it!!! for (int i = 2; i <= _toc.TrackCount; i++) { _toc[i].Start += value - _toc[1].Length; @@ -5864,6 +6261,12 @@ string status = processor.Go(); return fileGroups; } + public void UseLocalDB(CUEToolsLocalDB db) + { + _useLocalDB = true; + _localDB = db; + } + public string AccurateRipLog { get diff --git a/CUETools.Processor/Properties/AssemblyInfo.cs b/CUETools.Processor/Properties/AssemblyInfo.cs index 092c69b..8791f5a 100644 --- a/CUETools.Processor/Properties/AssemblyInfo.cs +++ b/CUETools.Processor/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Ripper.Console/Program.cs b/CUETools.Ripper.Console/Program.cs index d2bd40c..d9ed370 100644 --- a/CUETools.Ripper.Console/Program.cs +++ b/CUETools.Ripper.Console/Program.cs @@ -89,7 +89,7 @@ namespace CUETools.ConsoleRipper static void Main(string[] args) { Console.SetOut(Console.Error); - Console.WriteLine("CUERipper v2.0.9 Copyright (C) 2008-10 Gregory S. Chudov"); + Console.WriteLine("CUERipper v2.1.1 Copyright (C) 2008-10 Gregory S. Chudov"); Console.WriteLine("This is free software under the GNU GPLv3+ license; There is NO WARRANTY, to"); Console.WriteLine("the extent permitted by law. for details."); diff --git a/CUETools.Ripper.SCSI/Properties/AssemblyInfo.cs b/CUETools.Ripper.SCSI/Properties/AssemblyInfo.cs index ed82be6..5254ec6 100644 --- a/CUETools.Ripper.SCSI/Properties/AssemblyInfo.cs +++ b/CUETools.Ripper.SCSI/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools.Ripper.SCSI/SCSIDrive.cs b/CUETools.Ripper.SCSI/SCSIDrive.cs index 53fbb44..35dbfc3 100644 --- a/CUETools.Ripper.SCSI/SCSIDrive.cs +++ b/CUETools.Ripper.SCSI/SCSIDrive.cs @@ -1187,7 +1187,7 @@ namespace CUETools.Ripper.SCSI { get { - return "CUERipper v2.0.9 Copyright (C) 2008-10 Gregory S. Chudov"; + return "CUERipper v2.1.1 Copyright (C) 2008-10 Gregory S. Chudov"; // ripper.GetName().Name + " " + ripper.GetName().Version; } } diff --git a/CUETools.Ripper/Properties/AssemblyInfo.cs b/CUETools.Ripper/Properties/AssemblyInfo.cs index 85f3c3d..8f61584 100644 --- a/CUETools.Ripper/Properties/AssemblyInfo.cs +++ b/CUETools.Ripper/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools/CUETools.TestCodecs/AccurateRipVerifyTest.cs b/CUETools/CUETools.TestCodecs/AccurateRipVerifyTest.cs index 07a3815..4cb4bf0 100644 --- a/CUETools/CUETools.TestCodecs/AccurateRipVerifyTest.cs +++ b/CUETools/CUETools.TestCodecs/AccurateRipVerifyTest.cs @@ -190,6 +190,69 @@ namespace CUETools.TestCodecs Assert.AreEqual(2012115554, ar2.CRC450(1, 55), "CRC450[1,55] was not set correctly."); Assert.AreEqual(1483829604, ar2.CRC450(1, -3), "CRC450[1,-3] was not set correctly."); } + + + /// + ///OffsetSafeCRCRecord + /// + [TestMethod()] + public void OffsetSafeCRCRecordTest() + { + OffsetSafeCRCRecord[] records = new OffsetSafeCRCRecord[5000]; + for (int i = 0; i < records.Length; i++) + { + var arv = new AccurateRipVerify(toc, null); + Random rnd = new Random(2314); + Random rnd2 = new Random(2314); + for (int k = 0; k < i; k++) + { + rnd.Next(-32768, 32767); + rnd.Next(-32768, 32767); + } + int chunk; + for (int k = 0; k < toc.AudioLength * 588; k += chunk) + { + chunk = Math.Min(512 + rnd2.Next(512), (int)toc.AudioLength * 588 - k); + AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, chunk); + buff.Length = chunk; + for (int s = 0; s < chunk; s++) + { + buff.Samples[s, 0] = rnd.Next(-32768, 32767); + buff.Samples[s, 1] = rnd.Next(-32768, 32767); + } + arv.Write(buff); + } + records[i] = arv.OffsetSafeCRC; + arv.Close(); + } + + for (int i = 0; i < records.Length; i++) + { + int real_off = -i; + int off; + bool found = records[0].FindOffset(records[i], out off); + if (real_off > 4096 || real_off < -4096) + { + Assert.IsFalse(found, string.Format("FindOffset found offset where it shouldn't have, real offset {0}", real_off)); + } + else + { + Assert.IsTrue(found, string.Format("FindOffset failed to detect offset, real offset {0}", real_off)); + Assert.AreEqual(real_off, off, string.Format("FindOffset returned {0}, should be {1}", off, real_off)); + } + real_off = i; + found = records[i].FindOffset(records[0], out off); + if (real_off > 4096 || real_off < -4096) + { + Assert.IsFalse(found, string.Format("FindOffset found offset where it shouldn't have, real offset {0}", real_off)); + } + else + { + Assert.IsTrue(found, string.Format("FindOffset failed to detect offset, real offset {0}", real_off)); + Assert.AreEqual(real_off, off, string.Format("FindOffset returned {0}, should be {1}", off, real_off)); + } + } + } } diff --git a/CUETools/CUETools.TestCodecs/CUETools.TestCodecs.csproj b/CUETools/CUETools.TestCodecs/CUETools.TestCodecs.csproj index 0d12178..39cb438 100644 --- a/CUETools/CUETools.TestCodecs/CUETools.TestCodecs.csproj +++ b/CUETools/CUETools.TestCodecs/CUETools.TestCodecs.csproj @@ -23,6 +23,7 @@ false .\bin\Debug\ DEBUG;TRACE + true true @@ -30,6 +31,7 @@ ..\bin\Release\ DEBUG;TRACE full + true diff --git a/CUETools/CUETools.TestCodecs/FlakeWriterTest.cs b/CUETools/CUETools.TestCodecs/FlakeWriterTest.cs index 2ead645..bbc1b8b 100644 --- a/CUETools/CUETools.TestCodecs/FlakeWriterTest.cs +++ b/CUETools/CUETools.TestCodecs/FlakeWriterTest.cs @@ -99,7 +99,55 @@ namespace CUETools.TestCodecs CollectionAssert.AreEqual(File.ReadAllBytes("flake.flac"), File.ReadAllBytes("flakewriter1.flac"), "flakewriter1.flac doesn't match."); } + public static unsafe void + compute_schur_reflection(/*const*/ double* autoc, uint max_order, + double* dreff/*[][MAX_LPC_ORDER]*/, double* err) + { + float* gen0 = stackalloc float[lpc.MAX_LPC_ORDER]; + float* gen1 = stackalloc float[lpc.MAX_LPC_ORDER]; + + // Schur recursion + for (uint i = 0; i < max_order; i++) + gen0[i] = gen1[i] = (float)autoc[i + 1]; + float error = (float)autoc[0]; + + for (uint i = 0; i < max_order; i++) + { + float reff = -gen1[0] / error; + error += gen1[0] * reff; + + for (uint j = 0; j < max_order - i - 1; j++) + { + gen1[j] = gen1[j + 1] + reff * gen0[j]; + gen0[j] = gen1[j + 1] * reff + gen0[j]; + } + + dreff[i] = reff; + err[i] = error; + } + } + + + [TestMethod()] + public unsafe void LPCTest() + { + double* autoc = stackalloc double[9]; + double* reff = stackalloc double[8]; + double* err = stackalloc double[8]; + float* lpcs = stackalloc float[9 * lpc.MAX_LPC_ORDER]; + autoc[0] = 177286873088.0; + autoc[1] = 177010016256.0; + autoc[2] = 176182624256.0; + autoc[3] = 174806581248.0; + autoc[4] = 172888768512.0; + autoc[5] = 170436820992.0; + autoc[6] = 167460765696.0; + autoc[7] = 163973169152.0; + autoc[8] = 159987859456.0; + + compute_schur_reflection(autoc, 8, reff, err); + lpc.compute_lpc_coefs(8, reff, lpcs); + Assert.IsTrue(lpcs[7 * lpc.MAX_LPC_ORDER] < 3000); + } } - - } diff --git a/CUETools/CUETools.TestProcessor/CUETools.TestProcessor.csproj b/CUETools/CUETools.TestProcessor/CUETools.TestProcessor.csproj index 8a2b8a2..90f3190 100644 --- a/CUETools/CUETools.TestProcessor/CUETools.TestProcessor.csproj +++ b/CUETools/CUETools.TestProcessor/CUETools.TestProcessor.csproj @@ -25,10 +25,11 @@ DEBUG;TRACE - false + true true ..\bin\Release\ - TRACE + DEBUG;TRACE + full diff --git a/CUETools/CUETools.csproj b/CUETools/CUETools.csproj index cfe0517..1d3d5e7 100644 --- a/CUETools/CUETools.csproj +++ b/CUETools/CUETools.csproj @@ -51,7 +51,7 @@ prompt 4 true - AnyCPU + x86 pdbonly @@ -281,6 +281,16 @@ + + + + + + + + + + diff --git a/CUETools/CUETools.sln b/CUETools/CUETools.sln index 09baa38..61b0cf2 100644 --- a/CUETools/CUETools.sln +++ b/CUETools/CUETools.sln @@ -169,692 +169,629 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Codecs.Icecast", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFRipper", "..\WPFRipper\WPFRipper.csproj", "{2D8D7A03-DFFA-44EF-9299-8BB56D122245}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Codecs.FLACCL", "..\CUETools.Codecs.FLACCL\CUETools.Codecs.FLACCL.csproj", "{DFE55765-564C-4B8F-993B-A94C4D1C212E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.FLACL.cmd", "..\CUETools.FLACCL.cmd\CUETools.FLACL.cmd.csproj", "{1FCA8834-34E6-47CF-B53F-D8DF35345363}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenCLNet", "..\..\ATI Stream\OpenCL.Net 0.6\source\OpenCLNet\OpenCLNet.csproj", "{758285C6-1ACA-458A-9906-EE6701D5AF87}" +EndProject Global GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = CUETools1.vsmdi EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms Release|Win32 = Release|Win32 Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {EF351583-A9CD-4530-92C3-20AC02136BC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF351583-A9CD-4530-92C3-20AC02136BC2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EF351583-A9CD-4530-92C3-20AC02136BC2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {EF351583-A9CD-4530-92C3-20AC02136BC2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {EF351583-A9CD-4530-92C3-20AC02136BC2}.Debug|Win32.ActiveCfg = Debug|Any CPU {EF351583-A9CD-4530-92C3-20AC02136BC2}.Debug|x64.ActiveCfg = Debug|Any CPU + {EF351583-A9CD-4530-92C3-20AC02136BC2}.Debug|x86.ActiveCfg = Debug|Any CPU {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|Any CPU.Build.0 = Release|Any CPU - {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|Mixed Platforms.Build.0 = Release|Any CPU {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|Win32.ActiveCfg = Release|Any CPU {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|x64.ActiveCfg = Release|Any CPU + {EF351583-A9CD-4530-92C3-20AC02136BC2}.Release|x86.ActiveCfg = Release|Any CPU {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Any CPU.ActiveCfg = Debug|x64 - {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Mixed Platforms.Build.0 = Debug|x64 {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Win32.ActiveCfg = Debug|Win32 {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|Win32.Build.0 = Debug|Win32 {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|x64.ActiveCfg = Debug|x64 {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|x64.Build.0 = Debug|x64 + {E70FA90A-7012-4A52-86B5-362B699D1540}.Debug|x86.ActiveCfg = Debug|x64 {E70FA90A-7012-4A52-86B5-362B699D1540}.Release|Any CPU.ActiveCfg = Release|x64 - {E70FA90A-7012-4A52-86B5-362B699D1540}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {E70FA90A-7012-4A52-86B5-362B699D1540}.Release|Mixed Platforms.Build.0 = Release|x64 {E70FA90A-7012-4A52-86B5-362B699D1540}.Release|Win32.ActiveCfg = Release|Win32 {E70FA90A-7012-4A52-86B5-362B699D1540}.Release|Win32.Build.0 = Release|Win32 {E70FA90A-7012-4A52-86B5-362B699D1540}.Release|x64.ActiveCfg = Release|x64 {E70FA90A-7012-4A52-86B5-362B699D1540}.Release|x64.Build.0 = Release|x64 + {E70FA90A-7012-4A52-86B5-362B699D1540}.Release|x86.ActiveCfg = Release|x64 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Debug|Any CPU.ActiveCfg = Debug|x64 - {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Debug|Mixed Platforms.Build.0 = Debug|x64 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Debug|Win32.ActiveCfg = Debug|Win32 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Debug|Win32.Build.0 = Debug|Win32 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Debug|x64.ActiveCfg = Debug|x64 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Debug|x64.Build.0 = Debug|x64 + {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Debug|x86.ActiveCfg = Debug|x64 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Release|Any CPU.ActiveCfg = Release|x64 - {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Release|Mixed Platforms.Build.0 = Release|x64 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Release|Win32.ActiveCfg = Release|Win32 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Release|Win32.Build.0 = Release|Win32 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Release|x64.ActiveCfg = Release|x64 {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Release|x64.Build.0 = Release|x64 + {9AE965C4-301E-4C01-B90F-297AF341ACC6}.Release|x86.ActiveCfg = Release|x64 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Debug|Any CPU.ActiveCfg = Debug|x64 - {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Debug|Mixed Platforms.Build.0 = Debug|x64 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Debug|Win32.ActiveCfg = Debug|Win32 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Debug|Win32.Build.0 = Debug|Win32 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Debug|x64.ActiveCfg = Debug|x64 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Debug|x64.Build.0 = Debug|x64 + {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Debug|x86.ActiveCfg = Debug|x64 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Release|Any CPU.ActiveCfg = Release|Win32 - {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Release|Mixed Platforms.Build.0 = Release|x64 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Release|Win32.ActiveCfg = Release|Win32 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Release|Win32.Build.0 = Release|Win32 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Release|x64.ActiveCfg = Release|x64 {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Release|x64.Build.0 = Release|x64 + {CC2E74B6-534A-43D8-9F16-AC03FE955000}.Release|x86.ActiveCfg = Release|x64 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Debug|Any CPU.ActiveCfg = Debug|x64 - {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Debug|Mixed Platforms.Build.0 = Debug|x64 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Debug|Win32.ActiveCfg = Debug|Win32 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Debug|Win32.Build.0 = Debug|Win32 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Debug|x64.ActiveCfg = Debug|x64 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Debug|x64.Build.0 = Debug|x64 + {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Debug|x86.ActiveCfg = Debug|x64 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Release|Any CPU.ActiveCfg = Release|x64 - {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Release|Mixed Platforms.Build.0 = Release|x64 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Release|Win32.ActiveCfg = Release|Win32 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Release|Win32.Build.0 = Release|Win32 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Release|x64.ActiveCfg = Release|x64 {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Release|x64.Build.0 = Release|x64 + {0B9C97D4-61B8-4294-A1DF-BA90752A1779}.Release|x86.ActiveCfg = Release|x64 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Debug|Any CPU.ActiveCfg = Debug|x64 - {4CEFBC84-C215-11DB-8314-0800200C9A66}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {4CEFBC84-C215-11DB-8314-0800200C9A66}.Debug|Mixed Platforms.Build.0 = Debug|x64 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Debug|Win32.ActiveCfg = Debug|Win32 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Debug|Win32.Build.0 = Debug|Win32 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Debug|x64.ActiveCfg = Debug|x64 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Debug|x64.Build.0 = Debug|x64 + {4CEFBC84-C215-11DB-8314-0800200C9A66}.Debug|x86.ActiveCfg = Debug|x64 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Release|Any CPU.ActiveCfg = Release|x64 - {4CEFBC84-C215-11DB-8314-0800200C9A66}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {4CEFBC84-C215-11DB-8314-0800200C9A66}.Release|Mixed Platforms.Build.0 = Release|x64 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Release|Win32.ActiveCfg = Release|Win32 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Release|Win32.Build.0 = Release|Win32 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Release|x64.ActiveCfg = Release|x64 {4CEFBC84-C215-11DB-8314-0800200C9A66}.Release|x64.Build.0 = Release|x64 + {4CEFBC84-C215-11DB-8314-0800200C9A66}.Release|x86.ActiveCfg = Release|x64 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Debug|Any CPU.ActiveCfg = Debug|x64 - {5CCCB9CF-0384-458F-BA08-72B73866840F}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {5CCCB9CF-0384-458F-BA08-72B73866840F}.Debug|Mixed Platforms.Build.0 = Debug|x64 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Debug|Win32.ActiveCfg = Debug|Win32 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Debug|Win32.Build.0 = Debug|Win32 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Debug|x64.ActiveCfg = Debug|x64 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Debug|x64.Build.0 = Debug|x64 + {5CCCB9CF-0384-458F-BA08-72B73866840F}.Debug|x86.ActiveCfg = Debug|x64 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Release|Any CPU.ActiveCfg = Release|x64 - {5CCCB9CF-0384-458F-BA08-72B73866840F}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {5CCCB9CF-0384-458F-BA08-72B73866840F}.Release|Mixed Platforms.Build.0 = Release|x64 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Release|Win32.ActiveCfg = Release|Win32 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Release|Win32.Build.0 = Release|Win32 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Release|x64.ActiveCfg = Release|x64 {5CCCB9CF-0384-458F-BA08-72B73866840F}.Release|x64.Build.0 = Release|x64 + {5CCCB9CF-0384-458F-BA08-72B73866840F}.Release|x86.ActiveCfg = Release|x64 {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Debug|Win32.ActiveCfg = Debug|Any CPU {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Debug|x64.ActiveCfg = Debug|Any CPU + {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Debug|x86.ActiveCfg = Debug|Any CPU {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Release|Any CPU.ActiveCfg = Release|Any CPU {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Release|Any CPU.Build.0 = Release|Any CPU - {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Release|Mixed Platforms.Build.0 = Release|Any CPU {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Release|Win32.ActiveCfg = Release|Any CPU {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Release|x64.ActiveCfg = Release|Any CPU + {A5A8D8FA-9E32-4010-8AAF-AE580C5AF728}.Release|x86.ActiveCfg = Release|Any CPU {4911BD82-49EF-4858-8B51-5394F86739A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4911BD82-49EF-4858-8B51-5394F86739A4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4911BD82-49EF-4858-8B51-5394F86739A4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4911BD82-49EF-4858-8B51-5394F86739A4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {4911BD82-49EF-4858-8B51-5394F86739A4}.Debug|Win32.ActiveCfg = Debug|Any CPU {4911BD82-49EF-4858-8B51-5394F86739A4}.Debug|x64.ActiveCfg = Debug|Any CPU {4911BD82-49EF-4858-8B51-5394F86739A4}.Debug|x64.Build.0 = Debug|Any CPU + {4911BD82-49EF-4858-8B51-5394F86739A4}.Debug|x86.ActiveCfg = Debug|Any CPU {4911BD82-49EF-4858-8B51-5394F86739A4}.Release|Any CPU.ActiveCfg = Release|Any CPU {4911BD82-49EF-4858-8B51-5394F86739A4}.Release|Any CPU.Build.0 = Release|Any CPU - {4911BD82-49EF-4858-8B51-5394F86739A4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {4911BD82-49EF-4858-8B51-5394F86739A4}.Release|Mixed Platforms.Build.0 = Release|Any CPU {4911BD82-49EF-4858-8B51-5394F86739A4}.Release|Win32.ActiveCfg = Release|Any CPU {4911BD82-49EF-4858-8B51-5394F86739A4}.Release|x64.ActiveCfg = Release|Any CPU + {4911BD82-49EF-4858-8B51-5394F86739A4}.Release|x86.ActiveCfg = Release|Any CPU {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Debug|Mixed Platforms.Build.0 = Debug|x86 {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Debug|Win32.ActiveCfg = Debug|Any CPU {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Debug|x64.ActiveCfg = Debug|x64 {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Debug|x64.Build.0 = Debug|x64 + {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Debug|x86.ActiveCfg = Debug|x86 + {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Debug|x86.Build.0 = Debug|x86 {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Release|Any CPU.ActiveCfg = Release|Any CPU {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Release|Any CPU.Build.0 = Release|Any CPU - {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Release|Mixed Platforms.Build.0 = Release|x86 {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Release|Win32.ActiveCfg = Release|Any CPU {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Release|x64.ActiveCfg = Release|Any CPU + {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Release|x86.ActiveCfg = Release|x86 + {32338A04-5B6B-4C63-8EE7-C6400F73B5D7}.Release|x86.Build.0 = Release|x86 {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Debug|Win32.ActiveCfg = Debug|Any CPU {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Debug|x64.ActiveCfg = Debug|Any CPU {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Debug|x64.Build.0 = Debug|Any CPU + {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Debug|x86.ActiveCfg = Debug|Any CPU {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Release|Any CPU.ActiveCfg = Release|Any CPU {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Release|Any CPU.Build.0 = Release|Any CPU - {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Release|Win32.ActiveCfg = Release|Any CPU {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Release|x64.ActiveCfg = Release|Any CPU + {6458A13A-30EF-45A9-9D58-E5031B17BEE2}.Release|x86.ActiveCfg = Release|Any CPU {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Debug|Win32.ActiveCfg = Debug|Any CPU {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Debug|x64.ActiveCfg = Debug|Any CPU {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Debug|x64.Build.0 = Debug|Any CPU + {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Debug|x86.ActiveCfg = Debug|Any CPU {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Release|Any CPU.ActiveCfg = Release|Any CPU {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Release|Any CPU.Build.0 = Release|Any CPU - {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Release|Mixed Platforms.Build.0 = Release|Any CPU {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Release|Win32.ActiveCfg = Release|Any CPU {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Release|x64.ActiveCfg = Release|Any CPU + {F2EC7193-D5E5-4252-9803-5CEB407E910F}.Release|x86.ActiveCfg = Release|Any CPU {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Debug|Win32.ActiveCfg = Debug|Any CPU {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Debug|x64.ActiveCfg = Debug|Any CPU + {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Debug|x86.ActiveCfg = Debug|Any CPU {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Release|Mixed Platforms.Build.0 = Release|Any CPU {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Release|Win32.ActiveCfg = Release|Any CPU {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Release|x64.ActiveCfg = Release|Any CPU + {8427CAA5-80B8-4952-9A68-5F3DFCFBDF40}.Release|x86.ActiveCfg = Release|Any CPU {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Debug|Win32.ActiveCfg = Debug|Any CPU {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Debug|x64.ActiveCfg = Debug|Any CPU - {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Debug|x64.Build.0 = Debug|Any CPU + {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Debug|x86.ActiveCfg = Debug|Any CPU {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Release|Any CPU.Build.0 = Release|Any CPU - {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Release|Mixed Platforms.Build.0 = Release|Any CPU {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Release|Win32.ActiveCfg = Release|Any CPU {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Release|x64.ActiveCfg = Release|Any CPU + {8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}.Release|x86.ActiveCfg = Release|Any CPU {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Debug|Win32.ActiveCfg = Debug|Any CPU {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Debug|x64.ActiveCfg = Debug|Any CPU + {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Debug|x86.ActiveCfg = Debug|Any CPU {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Release|Any CPU.ActiveCfg = Release|Any CPU {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Release|Any CPU.Build.0 = Release|Any CPU - {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Release|Mixed Platforms.Build.0 = Release|Any CPU {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Release|Win32.ActiveCfg = Release|Any CPU {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Release|x64.ActiveCfg = Release|Any CPU + {A574F3B1-E38B-4EE4-9394-49D6E2DF52EA}.Release|x86.ActiveCfg = Release|Any CPU {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Debug|Win32.ActiveCfg = Debug|Any CPU {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Debug|x64.ActiveCfg = Debug|Any CPU + {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Debug|x86.ActiveCfg = Debug|Any CPU {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Release|Any CPU.Build.0 = Release|Any CPU - {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Release|Mixed Platforms.Build.0 = Release|Any CPU {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Release|Win32.ActiveCfg = Release|Any CPU {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Release|x64.ActiveCfg = Release|Any CPU + {B75FA7AD-968E-4990-B342-1B4B17C850DF}.Release|x86.ActiveCfg = Release|Any CPU {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Debug|Win32.ActiveCfg = Debug|Any CPU {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Debug|x64.ActiveCfg = Debug|Any CPU + {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Debug|x86.ActiveCfg = Debug|Any CPU {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Release|Any CPU.ActiveCfg = Release|Any CPU {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Release|Any CPU.Build.0 = Release|Any CPU - {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Release|Mixed Platforms.Build.0 = Release|Any CPU {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Release|Win32.ActiveCfg = Release|Any CPU {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Release|x64.ActiveCfg = Release|Any CPU + {F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}.Release|x86.ActiveCfg = Release|Any CPU {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Debug|Win32.ActiveCfg = Debug|Any CPU {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Debug|x64.ActiveCfg = Debug|Any CPU + {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Debug|x86.ActiveCfg = Debug|Any CPU {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Release|Any CPU.ActiveCfg = Release|Any CPU {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Release|Any CPU.Build.0 = Release|Any CPU - {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Release|Mixed Platforms.Build.0 = Release|Any CPU {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Release|Win32.ActiveCfg = Release|Any CPU {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Release|x64.ActiveCfg = Release|Any CPU + {A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}.Release|x86.ActiveCfg = Release|Any CPU {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Debug|Win32.ActiveCfg = Debug|Any CPU {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Debug|x64.ActiveCfg = Debug|Any CPU + {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Debug|x86.ActiveCfg = Debug|Any CPU {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Release|Any CPU.ActiveCfg = Release|Any CPU {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Release|Any CPU.Build.0 = Release|Any CPU - {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Release|Win32.ActiveCfg = Release|Any CPU {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Release|x64.ActiveCfg = Release|Any CPU + {8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}.Release|x86.ActiveCfg = Release|Any CPU {9253A314-1821-42BF-B02F-2BF986B1765D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9253A314-1821-42BF-B02F-2BF986B1765D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9253A314-1821-42BF-B02F-2BF986B1765D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {9253A314-1821-42BF-B02F-2BF986B1765D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {9253A314-1821-42BF-B02F-2BF986B1765D}.Debug|Win32.ActiveCfg = Debug|Any CPU {9253A314-1821-42BF-B02F-2BF986B1765D}.Debug|x64.ActiveCfg = Debug|Any CPU + {9253A314-1821-42BF-B02F-2BF986B1765D}.Debug|x86.ActiveCfg = Debug|Any CPU {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|Any CPU.ActiveCfg = Release|Any CPU {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|Any CPU.Build.0 = Release|Any CPU - {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|Mixed Platforms.Build.0 = Release|Any CPU {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|Win32.ActiveCfg = Release|Any CPU {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|x64.ActiveCfg = Release|Any CPU + {9253A314-1821-42BF-B02F-2BF986B1765D}.Release|x86.ActiveCfg = Release|Any CPU {1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|Win32.ActiveCfg = Debug|Any CPU {1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|x64.ActiveCfg = Debug|Any CPU + {1DD41038-D885-46C5-8DDE-E0B82F066584}.Debug|x86.ActiveCfg = Debug|Any CPU {1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|Any CPU.ActiveCfg = Release|Any CPU {1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|Any CPU.Build.0 = Release|Any CPU - {1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|Win32.ActiveCfg = Release|Any CPU {1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|x64.ActiveCfg = Release|Any CPU + {1DD41038-D885-46C5-8DDE-E0B82F066584}.Release|x86.ActiveCfg = Release|Any CPU {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|Win32.ActiveCfg = Debug|Any CPU {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|x64.ActiveCfg = Debug|Any CPU + {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Debug|x86.ActiveCfg = Debug|Any CPU {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|Any CPU.ActiveCfg = Release|Any CPU {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|Any CPU.Build.0 = Release|Any CPU - {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|Win32.ActiveCfg = Release|Any CPU {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|x64.ActiveCfg = Release|Any CPU + {5802C7E9-157E-4124-946D-70B5AE48A5A1}.Release|x86.ActiveCfg = Release|Any CPU {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Debug|Any CPU.Build.0 = Debug|Any CPU - {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Debug|Win32.ActiveCfg = Debug|Any CPU {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Debug|x64.ActiveCfg = Debug|Any CPU {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Debug|x64.Build.0 = Debug|Any CPU + {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Debug|x86.ActiveCfg = Debug|Any CPU {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Release|Any CPU.ActiveCfg = Release|Any CPU {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Release|Any CPU.Build.0 = Release|Any CPU - {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Release|Mixed Platforms.Build.0 = Release|Any CPU {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Release|Win32.ActiveCfg = Release|Any CPU {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Release|x64.ActiveCfg = Release|Any CPU + {74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}.Release|x86.ActiveCfg = Release|Any CPU {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Debug|Win32.ActiveCfg = Debug|Any CPU {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Debug|x64.ActiveCfg = Debug|Any CPU + {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Debug|x86.ActiveCfg = Debug|Any CPU {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Release|Any CPU.ActiveCfg = Release|Any CPU {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Release|Any CPU.Build.0 = Release|Any CPU - {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Release|Mixed Platforms.Build.0 = Release|Any CPU {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Release|Win32.ActiveCfg = Release|Any CPU {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Release|x64.ActiveCfg = Release|Any CPU + {39B43BBB-BAFC-4D85-9BEA-3BCB7EFED89C}.Release|x86.ActiveCfg = Release|Any CPU {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Debug|Win32.ActiveCfg = Debug|Any CPU {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Debug|x64.ActiveCfg = Debug|Any CPU {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Debug|x64.Build.0 = Debug|Any CPU + {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Debug|x86.ActiveCfg = Debug|Any CPU {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Release|Any CPU.ActiveCfg = Release|Any CPU {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Release|Any CPU.Build.0 = Release|Any CPU - {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Release|Mixed Platforms.Build.0 = Release|Any CPU {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Release|Win32.ActiveCfg = Release|Any CPU {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Release|x64.ActiveCfg = Release|Any CPU + {5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}.Release|x86.ActiveCfg = Release|Any CPU {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Debug|Mixed Platforms.Build.0 = Debug|x64 {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Debug|Win32.ActiveCfg = Debug|Win32 {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Debug|Win32.Build.0 = Debug|Win32 {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Debug|x64.ActiveCfg = Debug|x64 {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Debug|x64.Build.0 = Debug|x64 + {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Debug|x86.ActiveCfg = Debug|x64 {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Release|Any CPU.ActiveCfg = Release|Win32 - {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Release|Mixed Platforms.Build.0 = Release|x64 {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Release|Win32.ActiveCfg = Release|Win32 {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Release|Win32.Build.0 = Release|Win32 {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Release|x64.ActiveCfg = Release|x64 {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Release|x64.Build.0 = Release|x64 + {B3DF599C-1C8F-451D-91E4-DD766210DA1F}.Release|x86.ActiveCfg = Release|x64 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Debug|Mixed Platforms.ActiveCfg = Debug|x64 - {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Debug|Mixed Platforms.Build.0 = Debug|x64 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Debug|Win32.ActiveCfg = Debug|Win32 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Debug|Win32.Build.0 = Debug|Win32 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Debug|x64.ActiveCfg = Debug|x64 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Debug|x64.Build.0 = Debug|x64 + {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Debug|x86.ActiveCfg = Debug|x64 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Release|Any CPU.ActiveCfg = Release|Win32 - {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Release|Mixed Platforms.Build.0 = Release|x64 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Release|Win32.ActiveCfg = Release|Win32 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Release|Win32.Build.0 = Release|Win32 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Release|x64.ActiveCfg = Release|x64 {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Release|x64.Build.0 = Release|x64 + {1D1E99BC-6D22-41C0-BD94-FF4DD5EC725B}.Release|x86.ActiveCfg = Release|x64 {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Debug|Any CPU.Build.0 = Debug|Any CPU - {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Debug|Win32.ActiveCfg = Debug|Any CPU {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Debug|x64.ActiveCfg = Debug|Any CPU + {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Debug|x86.ActiveCfg = Debug|Any CPU {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Release|Any CPU.ActiveCfg = Release|Any CPU {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Release|Any CPU.Build.0 = Release|Any CPU - {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Release|Mixed Platforms.Build.0 = Release|Any CPU {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Release|Win32.ActiveCfg = Release|Any CPU {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Release|x64.ActiveCfg = Release|Any CPU + {115CC5B0-0385-41CD-8A23-6A7EA4C51926}.Release|x86.ActiveCfg = Release|Any CPU {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Debug|Win32.ActiveCfg = Debug|Any CPU {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Debug|x64.ActiveCfg = Debug|Any CPU + {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Debug|x86.ActiveCfg = Debug|Any CPU {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Release|Any CPU.ActiveCfg = Release|Any CPU {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Release|Any CPU.Build.0 = Release|Any CPU - {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Release|Mixed Platforms.Build.0 = Release|Any CPU {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Release|Win32.ActiveCfg = Release|Any CPU {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Release|x64.ActiveCfg = Release|Any CPU + {CA4D64E6-6544-4A29-8BA5-7DB08D50D072}.Release|x86.ActiveCfg = Release|Any CPU {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Debug|Win32.ActiveCfg = Debug|Any CPU {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Debug|x64.ActiveCfg = Debug|Any CPU {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Debug|x64.Build.0 = Debug|Any CPU + {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Debug|x86.ActiveCfg = Debug|Any CPU {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Release|Any CPU.ActiveCfg = Release|Any CPU {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Release|Any CPU.Build.0 = Release|Any CPU - {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Release|Win32.ActiveCfg = Release|Any CPU {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Release|x64.ActiveCfg = Release|Any CPU + {082D6B9E-326E-4D15-9798-EDAE9EDE70A6}.Release|x86.ActiveCfg = Release|Any CPU {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Debug|Win32.ActiveCfg = Debug|Any CPU {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Debug|x64.ActiveCfg = Debug|Any CPU {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Debug|x64.Build.0 = Debug|Any CPU + {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Debug|x86.ActiveCfg = Debug|Any CPU {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Release|Any CPU.Build.0 = Release|Any CPU - {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Release|Mixed Platforms.Build.0 = Release|Any CPU {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Release|Win32.ActiveCfg = Release|Any CPU {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Release|x64.ActiveCfg = Release|Any CPU + {2379BAAF-A406-4477-BF53-2D6A326C24C8}.Release|x86.ActiveCfg = Release|Any CPU {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Debug|Win32.ActiveCfg = Debug|Any CPU {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Debug|x64.ActiveCfg = Debug|Any CPU + {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Debug|x86.ActiveCfg = Debug|Any CPU {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Release|Any CPU.ActiveCfg = Release|Any CPU {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Release|Any CPU.Build.0 = Release|Any CPU - {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Release|Mixed Platforms.Build.0 = Release|Any CPU {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Release|Win32.ActiveCfg = Release|Any CPU {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Release|x64.ActiveCfg = Release|Any CPU + {8E6E1763-39AE-491D-A10F-44C8844ABA5B}.Release|x86.ActiveCfg = Release|Any CPU {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Debug|Win32.ActiveCfg = Debug|Any CPU {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Debug|x64.ActiveCfg = Debug|Any CPU {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Debug|x64.Build.0 = Debug|Any CPU + {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Debug|x86.ActiveCfg = Debug|Any CPU {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Release|Any CPU.ActiveCfg = Release|Any CPU {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Release|Any CPU.Build.0 = Release|Any CPU - {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Release|Mixed Platforms.Build.0 = Release|Any CPU {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Release|Win32.ActiveCfg = Release|Any CPU {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Release|x64.ActiveCfg = Release|Any CPU + {DFE50673-906C-4B8F-993B-A24CAD1CA17D}.Release|x86.ActiveCfg = Release|Any CPU {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Debug|Win32.ActiveCfg = Debug|Any CPU {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Debug|x64.ActiveCfg = Debug|Any CPU {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Debug|x64.Build.0 = Debug|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Debug|x86.ActiveCfg = Debug|Any CPU {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Release|Any CPU.ActiveCfg = Release|Any CPU {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Release|Any CPU.Build.0 = Release|Any CPU - {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Release|Win32.ActiveCfg = Release|Any CPU {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Release|x64.ActiveCfg = Release|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF49F0819E}.Release|x86.ActiveCfg = Release|Any CPU {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Debug|Win32.ActiveCfg = Debug|Any CPU {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Debug|x64.ActiveCfg = Debug|Any CPU + {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Debug|x86.ActiveCfg = Debug|Any CPU {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Release|Any CPU.ActiveCfg = Release|Any CPU {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Release|Any CPU.Build.0 = Release|Any CPU - {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Release|Win32.ActiveCfg = Release|Any CPU {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Release|x64.ActiveCfg = Release|Any CPU + {DDE1EA77-637C-4D5F-96F3-1328BC45CE80}.Release|x86.ActiveCfg = Release|Any CPU {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Debug|Win32.ActiveCfg = Debug|Any CPU {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Debug|x64.ActiveCfg = Debug|Any CPU + {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Debug|x86.ActiveCfg = Debug|Any CPU {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Release|Any CPU.ActiveCfg = Release|Any CPU {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Release|Any CPU.Build.0 = Release|Any CPU - {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Release|Win32.ActiveCfg = Release|Any CPU {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Release|x64.ActiveCfg = Release|Any CPU + {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A}.Release|x86.ActiveCfg = Release|Any CPU {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Debug|Win32.ActiveCfg = Debug|Any CPU {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Debug|x64.ActiveCfg = Debug|Any CPU {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Debug|x64.Build.0 = Debug|Any CPU + {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Debug|x86.ActiveCfg = Debug|Any CPU {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Release|Any CPU.ActiveCfg = Release|Any CPU {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Release|Any CPU.Build.0 = Release|Any CPU - {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Release|Win32.ActiveCfg = Release|Any CPU {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Release|x64.ActiveCfg = Release|Any CPU + {04945FB2-8410-4F14-8262-2ED18DCDACD6}.Release|x86.ActiveCfg = Release|Any CPU {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Debug|Win32.ActiveCfg = Debug|Any CPU {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Debug|x64.ActiveCfg = Debug|Any CPU + {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Debug|x86.ActiveCfg = Debug|Any CPU {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Release|Any CPU.ActiveCfg = Release|Any CPU {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Release|Any CPU.Build.0 = Release|Any CPU - {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Release|Mixed Platforms.Build.0 = Release|Any CPU {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Release|Win32.ActiveCfg = Release|Any CPU {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Release|x64.ActiveCfg = Release|Any CPU + {A430AD28-B76A-4ED0-AF7D-D13B8969297F}.Release|x86.ActiveCfg = Release|Any CPU {14EE067E-C218-4625-9540-2361AB27C4A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {14EE067E-C218-4625-9540-2361AB27C4A6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {14EE067E-C218-4625-9540-2361AB27C4A6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {14EE067E-C218-4625-9540-2361AB27C4A6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {14EE067E-C218-4625-9540-2361AB27C4A6}.Debug|Win32.ActiveCfg = Debug|Any CPU {14EE067E-C218-4625-9540-2361AB27C4A6}.Debug|x64.ActiveCfg = Debug|Any CPU + {14EE067E-C218-4625-9540-2361AB27C4A6}.Debug|x86.ActiveCfg = Debug|Any CPU {14EE067E-C218-4625-9540-2361AB27C4A6}.Release|Any CPU.ActiveCfg = Release|Any CPU {14EE067E-C218-4625-9540-2361AB27C4A6}.Release|Any CPU.Build.0 = Release|Any CPU - {14EE067E-C218-4625-9540-2361AB27C4A6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {14EE067E-C218-4625-9540-2361AB27C4A6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {14EE067E-C218-4625-9540-2361AB27C4A6}.Release|Win32.ActiveCfg = Release|Any CPU {14EE067E-C218-4625-9540-2361AB27C4A6}.Release|x64.ActiveCfg = Release|Any CPU + {14EE067E-C218-4625-9540-2361AB27C4A6}.Release|x86.ActiveCfg = Release|Any CPU {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Debug|Win32.ActiveCfg = Debug|Any CPU {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Debug|x64.ActiveCfg = Debug|Any CPU + {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Debug|x86.ActiveCfg = Debug|Any CPU {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Release|Any CPU.ActiveCfg = Release|Any CPU {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Release|Any CPU.Build.0 = Release|Any CPU - {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Release|Mixed Platforms.Build.0 = Release|Any CPU {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Release|Win32.ActiveCfg = Release|Any CPU {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Release|x64.ActiveCfg = Release|Any CPU + {EA2CAE21-940C-4F51-A802-E02ABB97A9B5}.Release|x86.ActiveCfg = Release|Any CPU {D2700165-3E77-4B28-928D-551F5FC11954}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D2700165-3E77-4B28-928D-551F5FC11954}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2700165-3E77-4B28-928D-551F5FC11954}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D2700165-3E77-4B28-928D-551F5FC11954}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {D2700165-3E77-4B28-928D-551F5FC11954}.Debug|Win32.ActiveCfg = Debug|Any CPU {D2700165-3E77-4B28-928D-551F5FC11954}.Debug|x64.ActiveCfg = Debug|Any CPU + {D2700165-3E77-4B28-928D-551F5FC11954}.Debug|x86.ActiveCfg = Debug|Any CPU {D2700165-3E77-4B28-928D-551F5FC11954}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2700165-3E77-4B28-928D-551F5FC11954}.Release|Any CPU.Build.0 = Release|Any CPU - {D2700165-3E77-4B28-928D-551F5FC11954}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D2700165-3E77-4B28-928D-551F5FC11954}.Release|Mixed Platforms.Build.0 = Release|Any CPU {D2700165-3E77-4B28-928D-551F5FC11954}.Release|Win32.ActiveCfg = Release|Any CPU {D2700165-3E77-4B28-928D-551F5FC11954}.Release|x64.ActiveCfg = Release|Any CPU + {D2700165-3E77-4B28-928D-551F5FC11954}.Release|x86.ActiveCfg = Release|Any CPU {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|Win32.ActiveCfg = Debug|Any CPU {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|x64.ActiveCfg = Debug|Any CPU + {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|x86.ActiveCfg = Debug|Any CPU {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|Any CPU.ActiveCfg = Release|Any CPU {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|Any CPU.Build.0 = Release|Any CPU - {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|Mixed Platforms.Build.0 = Release|Any CPU {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|Win32.ActiveCfg = Release|Any CPU {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|x64.ActiveCfg = Release|Any CPU + {5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|x86.ActiveCfg = Release|Any CPU {ECEB839C-171B-4535-958F-9899310A0342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ECEB839C-171B-4535-958F-9899310A0342}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ECEB839C-171B-4535-958F-9899310A0342}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ECEB839C-171B-4535-958F-9899310A0342}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {ECEB839C-171B-4535-958F-9899310A0342}.Debug|Win32.ActiveCfg = Debug|Any CPU {ECEB839C-171B-4535-958F-9899310A0342}.Debug|x64.ActiveCfg = Debug|Any CPU + {ECEB839C-171B-4535-958F-9899310A0342}.Debug|x86.ActiveCfg = Debug|Any CPU {ECEB839C-171B-4535-958F-9899310A0342}.Release|Any CPU.ActiveCfg = Release|Any CPU {ECEB839C-171B-4535-958F-9899310A0342}.Release|Any CPU.Build.0 = Release|Any CPU - {ECEB839C-171B-4535-958F-9899310A0342}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {ECEB839C-171B-4535-958F-9899310A0342}.Release|Mixed Platforms.Build.0 = Release|Any CPU {ECEB839C-171B-4535-958F-9899310A0342}.Release|Win32.ActiveCfg = Release|Any CPU {ECEB839C-171B-4535-958F-9899310A0342}.Release|x64.ActiveCfg = Release|Any CPU + {ECEB839C-171B-4535-958F-9899310A0342}.Release|x86.ActiveCfg = Release|Any CPU {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|Win32.ActiveCfg = Debug|Any CPU {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|x64.ActiveCfg = Debug|Any CPU + {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|x86.ActiveCfg = Debug|Any CPU {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|Any CPU.ActiveCfg = Release|Any CPU {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|Any CPU.Build.0 = Release|Any CPU - {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|Mixed Platforms.Build.0 = Release|Any CPU {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|Win32.ActiveCfg = Release|Any CPU {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|x64.ActiveCfg = Release|Any CPU + {6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|x86.ActiveCfg = Release|Any CPU {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|Win32.ActiveCfg = Debug|Any CPU {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|x64.ActiveCfg = Debug|Any CPU + {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|x86.ActiveCfg = Debug|Any CPU {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|Any CPU.Build.0 = Release|Any CPU - {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|Mixed Platforms.Build.0 = Release|Any CPU {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|Win32.ActiveCfg = Release|Any CPU {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|x64.ActiveCfg = Release|Any CPU + {AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|x86.ActiveCfg = Release|Any CPU {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Debug|Win32.ActiveCfg = Debug|Any CPU {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Debug|x64.ActiveCfg = Debug|Any CPU + {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Debug|x86.ActiveCfg = Debug|Any CPU {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Release|Any CPU.ActiveCfg = Release|Any CPU {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Release|Any CPU.Build.0 = Release|Any CPU - {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Release|Win32.ActiveCfg = Release|Any CPU {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Release|x64.ActiveCfg = Release|Any CPU + {8DD1E84B-0B03-4C0B-9B42-1E49F75E7CB1}.Release|x86.ActiveCfg = Release|Any CPU {04E59836-0C5A-4B9B-8899-848D56911758}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {04E59836-0C5A-4B9B-8899-848D56911758}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04E59836-0C5A-4B9B-8899-848D56911758}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {04E59836-0C5A-4B9B-8899-848D56911758}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {04E59836-0C5A-4B9B-8899-848D56911758}.Debug|Win32.ActiveCfg = Debug|Any CPU {04E59836-0C5A-4B9B-8899-848D56911758}.Debug|x64.ActiveCfg = Debug|Any CPU + {04E59836-0C5A-4B9B-8899-848D56911758}.Debug|x86.ActiveCfg = Debug|Any CPU {04E59836-0C5A-4B9B-8899-848D56911758}.Release|Any CPU.ActiveCfg = Release|Any CPU {04E59836-0C5A-4B9B-8899-848D56911758}.Release|Any CPU.Build.0 = Release|Any CPU - {04E59836-0C5A-4B9B-8899-848D56911758}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {04E59836-0C5A-4B9B-8899-848D56911758}.Release|Mixed Platforms.Build.0 = Release|Any CPU {04E59836-0C5A-4B9B-8899-848D56911758}.Release|Win32.ActiveCfg = Release|Any CPU {04E59836-0C5A-4B9B-8899-848D56911758}.Release|x64.ActiveCfg = Release|Any CPU + {04E59836-0C5A-4B9B-8899-848D56911758}.Release|x86.ActiveCfg = Release|Any CPU {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Debug|Win32.ActiveCfg = Debug|Any CPU {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Debug|x64.ActiveCfg = Debug|Any CPU + {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Debug|x86.ActiveCfg = Debug|Any CPU {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Release|Any CPU.ActiveCfg = Release|Any CPU {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Release|Any CPU.Build.0 = Release|Any CPU - {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Release|Win32.ActiveCfg = Release|Any CPU {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Release|x64.ActiveCfg = Release|Any CPU + {FAD09EE2-D6B2-4A8E-9F1C-2A9FB293661A}.Release|x86.ActiveCfg = Release|Any CPU {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Debug|Win32.ActiveCfg = Debug|Any CPU {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Debug|x64.ActiveCfg = Debug|Any CPU + {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Debug|x86.ActiveCfg = Debug|Any CPU {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Release|Any CPU.ActiveCfg = Release|Any CPU {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Release|Any CPU.Build.0 = Release|Any CPU - {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Release|Win32.ActiveCfg = Release|Any CPU {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Release|x64.ActiveCfg = Release|Any CPU + {1AF02E2C-2CB2-44B5-B417-37653071FEC6}.Release|x86.ActiveCfg = Release|Any CPU {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Debug|Win32.ActiveCfg = Debug|Any CPU {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Debug|x64.ActiveCfg = Debug|Any CPU + {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Debug|x86.ActiveCfg = Debug|Any CPU {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Release|Any CPU.Build.0 = Release|Any CPU - {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Release|Mixed Platforms.Build.0 = Release|Any CPU {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Release|Win32.ActiveCfg = Release|Any CPU {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Release|x64.ActiveCfg = Release|Any CPU + {5A9FB016-6388-475D-AB33-6F86AD49FDAD}.Release|x86.ActiveCfg = Release|Any CPU {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Debug|Win32.ActiveCfg = Debug|Any CPU {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Debug|x64.ActiveCfg = Debug|Any CPU + {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Debug|x86.ActiveCfg = Debug|Any CPU {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Release|Any CPU.Build.0 = Release|Any CPU - {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Release|Mixed Platforms.Build.0 = Release|Any CPU {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Release|Win32.ActiveCfg = Release|Any CPU {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Release|x64.ActiveCfg = Release|Any CPU + {AFF1AFF9-839D-4892-88CD-8BD09BAFC1D2}.Release|x86.ActiveCfg = Release|Any CPU {A6303861-CA06-4C2C-A104-BA9291538F6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A6303861-CA06-4C2C-A104-BA9291538F6F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A6303861-CA06-4C2C-A104-BA9291538F6F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A6303861-CA06-4C2C-A104-BA9291538F6F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {A6303861-CA06-4C2C-A104-BA9291538F6F}.Debug|Win32.ActiveCfg = Debug|Any CPU {A6303861-CA06-4C2C-A104-BA9291538F6F}.Debug|x64.ActiveCfg = Debug|Any CPU + {A6303861-CA06-4C2C-A104-BA9291538F6F}.Debug|x86.ActiveCfg = Debug|Any CPU {A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|Any CPU.ActiveCfg = Release|Any CPU {A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|Any CPU.Build.0 = Release|Any CPU - {A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|Mixed Platforms.Build.0 = Release|Any CPU {A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|Win32.ActiveCfg = Release|Any CPU {A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|x64.ActiveCfg = Release|Any CPU + {A6303861-CA06-4C2C-A104-BA9291538F6F}.Release|x86.ActiveCfg = Release|Any CPU {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|Win32.ActiveCfg = Debug|Any CPU {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|x64.ActiveCfg = Debug|Any CPU + {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Debug|x86.ActiveCfg = Debug|Any CPU {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|Any CPU.Build.0 = Release|Any CPU - {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|Mixed Platforms.Build.0 = Release|Any CPU {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|Win32.ActiveCfg = Release|Any CPU {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|x64.ActiveCfg = Release|Any CPU + {8FC5DA7C-F6AC-4D04-85BC-1233DDF569E7}.Release|x86.ActiveCfg = Release|Any CPU {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Debug|Win32.ActiveCfg = Debug|Any CPU {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Debug|x64.ActiveCfg = Debug|Any CPU + {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Debug|x86.ActiveCfg = Debug|Any CPU {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Release|Any CPU.Build.0 = Release|Any CPU - {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Release|Mixed Platforms.Build.0 = Release|Any CPU {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Release|Win32.ActiveCfg = Release|Any CPU {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Release|x64.ActiveCfg = Release|Any CPU + {2D8D7A03-DFFA-44EF-9299-8BB56D122245}.Release|x86.ActiveCfg = Release|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Debug|Win32.ActiveCfg = Debug|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Debug|x64.ActiveCfg = Debug|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Debug|x86.ActiveCfg = Debug|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Release|Any CPU.Build.0 = Release|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Release|Win32.ActiveCfg = Release|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Release|x64.ActiveCfg = Release|Any CPU + {DFE55765-564C-4B8F-993B-A94C4D1C212E}.Release|x86.ActiveCfg = Release|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Debug|Win32.ActiveCfg = Debug|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Debug|x64.ActiveCfg = Debug|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Debug|x86.ActiveCfg = Debug|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Release|Any CPU.Build.0 = Release|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Release|Win32.ActiveCfg = Release|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Release|x64.ActiveCfg = Release|Any CPU + {1FCA8834-34E6-47CF-B53F-D8DF35345363}.Release|x86.ActiveCfg = Release|Any CPU + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Debug|Win32.ActiveCfg = Debug|x86 + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Debug|x64.ActiveCfg = Debug|x64 + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Debug|x64.Build.0 = Debug|x64 + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Debug|x86.ActiveCfg = Debug|x86 + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Debug|x86.Build.0 = Debug|x86 + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Release|Any CPU.Build.0 = Release|Any CPU + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Release|Win32.ActiveCfg = Release|Any CPU + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Release|x64.ActiveCfg = Release|x64 + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Release|x64.Build.0 = Release|x64 + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Release|x86.ActiveCfg = Release|x86 + {758285C6-1ACA-458A-9906-EE6701D5AF87}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -877,6 +814,7 @@ Global {8E6E1763-39AE-491D-A10F-44C8844ABA5B} = {4B59E09C-A51F-4B80-91BE-987904DCEF7D} {1FCA8834-34E6-47CF-B53F-D8DF49F0819E} = {4B59E09C-A51F-4B80-91BE-987904DCEF7D} {FC4BCF9B-F4C7-41AD-8A16-2A90A082954A} = {4B59E09C-A51F-4B80-91BE-987904DCEF7D} + {1FCA8834-34E6-47CF-B53F-D8DF35345363} = {4B59E09C-A51F-4B80-91BE-987904DCEF7D} {8B179853-B7D6-479C-B8B2-6CBCE835D040} = {39A17A65-E893-44B8-A312-DDCDD990D9D1} {E70FA90A-7012-4A52-86B5-362B699D1540} = {39A17A65-E893-44B8-A312-DDCDD990D9D1} {9AE965C4-301E-4C01-B90F-297AF341ACC6} = {39A17A65-E893-44B8-A312-DDCDD990D9D1} @@ -891,6 +829,7 @@ Global {DFE50673-906C-4B8F-993B-A24CAD1CA17D} = {93B7AE1D-DEF6-4A04-A222-5CDE09DF262D} {DDE1EA77-637C-4D5F-96F3-1328BC45CE80} = {93B7AE1D-DEF6-4A04-A222-5CDE09DF262D} {1AF02E2C-2CB2-44B5-B417-37653071FEC6} = {93B7AE1D-DEF6-4A04-A222-5CDE09DF262D} + {DFE55765-564C-4B8F-993B-A94C4D1C212E} = {93B7AE1D-DEF6-4A04-A222-5CDE09DF262D} {04945FB2-8410-4F14-8262-2ED18DCDACD6} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4} {A430AD28-B76A-4ED0-AF7D-D13B8969297F} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4} {5C8B61C0-BC3D-4316-B8A7-419D55BB5796} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4} diff --git a/CUETools/CUETools1.vsmdi b/CUETools/CUETools1.vsmdi index bfa89ec..8cadba3 100644 --- a/CUETools/CUETools1.vsmdi +++ b/CUETools/CUETools1.vsmdi @@ -5,7 +5,7 @@ - + \ No newline at end of file diff --git a/CUETools/Properties/AssemblyInfo.cs b/CUETools/Properties/AssemblyInfo.cs index 429b688..314b552 100644 --- a/CUETools/Properties/AssemblyInfo.cs +++ b/CUETools/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.0.9.0")] -[assembly: AssemblyFileVersion("2.0.9.0")] +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] diff --git a/CUETools/Properties/Resources.Designer.cs b/CUETools/Properties/Resources.Designer.cs index fda7f38..4b72c30 100644 --- a/CUETools/Properties/Resources.Designer.cs +++ b/CUETools/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.4200 +// Runtime Version:2.0.50727.4206 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -67,6 +67,20 @@ namespace JDP.Properties { } } + internal static System.Drawing.Icon alarm_clock { + get { + object obj = ResourceManager.GetObject("alarm_clock", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Bitmap alarm_clock__minus { + get { + object obj = ResourceManager.GetObject("alarm-clock--minus", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + internal static System.Drawing.Icon ape { get { object obj = ResourceManager.GetObject("ape", resourceCulture); @@ -88,6 +102,13 @@ namespace JDP.Properties { } } + internal static System.Drawing.Icon calendar { + get { + object obj = ResourceManager.GetObject("calendar", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + internal static System.Drawing.Icon cdrepair { get { object obj = ResourceManager.GetObject("cdrepair", resourceCulture); @@ -230,6 +251,20 @@ namespace JDP.Properties { } } + internal static System.Drawing.Icon images { + get { + object obj = ResourceManager.GetObject("images", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon images_question { + get { + object obj = ResourceManager.GetObject("images_question", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + internal static System.Drawing.Bitmap info2 { get { object obj = ResourceManager.GetObject("info2", resourceCulture); @@ -286,6 +321,34 @@ namespace JDP.Properties { } } + internal static System.Drawing.Icon picture { + get { + object obj = ResourceManager.GetObject("picture", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon pictures { + get { + object obj = ResourceManager.GetObject("pictures", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon puzzle { + get { + object obj = ResourceManager.GetObject("puzzle", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Bitmap puzzle__arrow { + get { + object obj = ResourceManager.GetObject("puzzle--arrow", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + internal static System.Drawing.Bitmap report { get { object obj = ResourceManager.GetObject("report", resourceCulture); @@ -316,6 +379,13 @@ namespace JDP.Properties { } } + internal static System.Drawing.Icon users { + get { + object obj = ResourceManager.GetObject("users", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + /// /// Looks up a localized string similar to Verify. /// diff --git a/CUETools/Properties/Resources.resx b/CUETools/Properties/Resources.resx index 576e230..f9f8684 100644 --- a/CUETools/Properties/Resources.resx +++ b/CUETools/Properties/Resources.resx @@ -130,6 +130,9 @@ ..\Resources\AR.ico;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\cdrepair.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\info2.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -160,6 +163,9 @@ Stop + + ..\Resources\cdrepair.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\world_go.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -223,25 +229,49 @@ ..\Resources\report.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\more\icon\puzzle--arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\more\icons\folder_page.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\more\icons\folder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\disk.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\resources\accuraterip_16.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\more\icon\alarm-clock--minus.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\cdrepair.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\alarm-clock.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\cdrepair.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\calendar.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\puzzle.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\users.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\images.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pictures.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\images-question.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\picture.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/CUETools/Resources/alarm-clock.ico b/CUETools/Resources/alarm-clock.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e54fdd15e0f18368460239c26ee889b5ca3cf35 GIT binary patch literal 1150 zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD?u1_lQf5Q%|7qM{583{oUw zkRFg;b_NCpO-@eEGInm~h-MeSt>Op!fEG+(mXav6f|K`mz|BoEG_mPqD@N|U!6B};c zy!Z!Mzp1I||MK$k{~jJ5|3gDV|0g9S{m;wG`@eGKg8vU5-2TJJcwz%W|Cw#qub&6& zM>fOX-yiNCnEOHU_wL>N!^n7M8(4p6qcTHi!){s7z{Cx{Gkiy{)6-| zfb@nn^~z`Ter{g40<8Agvs-XGTUuJ+Y>@pRx%>Ce{cm2h;y*|aLs(NULv+V>-<9Wo z=@w4@zkBzp|DZVd@Zlv`Ur$dDmH4O)F=E z&3OL&Hdx=mgZscVNIysnq!*+Hq!y$Hq?a*$c6IFf%XhoazyDvnM~p*KhlO z=Ju`sAUi=A#0H6hX-|Na?K7^IegL8S?#6M|LifBpLS z|MTb9L}8Fx1_sr7h+Yt>R{i_;*Z<$Ye|L@=5L}8Fx1_t#~kWL8JDEdz#U|`TFg6IX2hfgLa|M>6bcJF^c zz;iGLv7@3s{KtktY8e;~p9JZI;M0e4bASK8e*O3Vg$v*OU$Nrj|073U{7*^w3db=q z@BjPxJ^2r!L24NoP9K8kWnf@ryt=cz{O^B#{e%An1v|iWUf%Ej$QW4;q!y$Hq5tlt z=H~zZZEdgq-?(ujn69h){~sA6%YoD~GTz;U(Ep@~k@3kI28O9;u3fwKA4G%r$QUGs kCWn;%U?wq`GcYj3GcbT@xFD2)PmZC1k%46V_&5Ut0ERARod5s; literal 0 HcmV?d00001 diff --git a/CUETools/Resources/images-question.ico b/CUETools/Resources/images-question.ico new file mode 100644 index 0000000000000000000000000000000000000000..d4ea4fc692f3812ce81c122b33e730477387fee9 GIT binary patch literal 1150 zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD?u1_lQf5Q!VFDhcjdUF3gw zRj%uYRoTv%xWMbfs*>OdxJ+1)>+$g2n^*t8fBNwM$7c|J|Nr}^cVPVE)4Ts4-@W?3 zy1?r_F8#|=tUi2w|N8%*=hy!Kd3F_!|AP3>ul@i2=IMWsyKw1Wl4SAm)9dH|YvSzx zFRl*$zpyF@OfRho`Cpgd@c+xJ#~}UxKxVAM^b6zSWQ&gvZeRP~n&R?*Nlozo`4xd+ zdR=qm|LH}(|35sx|9@SH-+yGkz`|^Kw)4k%2^RlPA3yv*&Q$4tzJlQYB5|(&`SJq) z3!Jq7*Cjaqe}4bQ|20Lv|Np+Y4)+Tz%s#$(^?y#X!~cb~rT=?0h5w%jF#P}S-MjzC z{S5y1>xllZj&S;a=i2%Ii?V$FM?`P^{|y=zpfLOP;m!Xq_s{>I5@-Ft&raw6fnd}B zXTwbX@2yVxe>BM8|1M9>|1E}+|F4`q{(o_{@BgHXd;h<^efl31&&yIQKYai2=D%^e z`Tves>;IEYr2k(k@c+NdPv`%oOPBud>#q90C&cJ~hdTHF3#X6%Uzq9hKQZmv|8H-f zf%UIQv-Ikc<^Qu%-TrT$G83%-`}-IFSLeEZSdnJ);ro}5|MTWn{O>(A>wnX({{J=QLI3-W z1pY6ull$LlsQ$kyu<(C<#nJzrjaUCq?z;QGp?c^4?;l?w>Hqvcb9(Xr?qjq5cOIVh zzh&=){}b~A|L@+t^Z&(*7yjSBd*}b_7tj8GdG`{m@B63M|3AKa@qbl;*ZUQ@ZXZ5> z`uN|wF7$uK?Bf6Fvx@$w%_#ie*_!fyPEpAJ<%Pcgmn2*MUz%e1aapqE#}z47AHX=< z`NN8m!2Z>h5ijrEyYuh!=THB?fBF3X`y%mF8DfNB6ESk9Yxc m2PiJU7-k2EhT4Nm{{wag1~_J5U^swFA-cFd0|SFS0|NkS=v@{7 literal 0 HcmV?d00001 diff --git a/CUETools/Resources/images.ico b/CUETools/Resources/images.ico new file mode 100644 index 0000000000000000000000000000000000000000..23b55920f3bf88f0b0d6e56fdd2046f8cf739485 GIT binary patch literal 1150 zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD?u1_lQf5Q!VFDhcjdUF3gw zRj%uYRoTv%xWMbfs*>OdxJ+1)>+$g2n^*t8fBNwM$7c|J|Nr}^cVPVE)4Ts4-@W?3 zy1?r_F8#|=tUi4E@aF&D7uWy)L&G4k?{A*|2e}Kke#;NvKfL+hnB??-O;ZF428n%x z=>G>YV-*&^tVpx^@crW(u)e2jOaCKdka^$UKK;MG)c-%SUy#FWMVigO@1NfOUsfOX z|K6%%Fut?A=syTAsSW-A?d`Mw>r4E={)71iIn37Px&QzE<>UW-t2_Sxd%E@i-zNwR z68rZ4`Tu3Pe*Yt)xBiFvfWA%SgzT5xLpFaMd))@1D_p$~!-m{|le}6;j z|L-4P{a=w6@INu_8rUx&{je}|pWyRja3|Ae#i{!hBN;Qz|TID&pzRp9l0MXuWi zP?&kwh5pZ+Qv%0*T^auumq+|xTN?0xMVj?LP&lnfvHAeV+0GwUlmzy#u8eqj@7|q% z_`(ci53V%7sye!Nb$P@KkUPM3q#@Y>vJYwxF8vSK85rQ0fq~%xE`{jg_6!UR_6!UF Du%nGM literal 0 HcmV?d00001 diff --git a/CUETools/Resources/picture.ico b/CUETools/Resources/picture.ico new file mode 100644 index 0000000000000000000000000000000000000000..f7ed4c2df9e4c626a09dca6ab53aae4d2c4bbe06 GIT binary patch literal 1150 zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD?u1_lQf5J`P}ZvC9D^Xq0E zKDTk^(&IFiC&aR&J@Zwn1n%l|{>U;J<1 zw*J4vtn~kOGgANCOiTX%?cKBgps<4357z(b?f(~h7yf^~d;b3mn@PEmr75~#u&;Fl$V*3BA zlQaG|@9zG;bY|B7>+`GrfB*3E|M}HZKET6&_0$hvK7acEc+1rP7q;~NU%9p6|Ku|Z z|F>LR^}p%Dvj5$Oru?5ZFZ2K5xyApl%`N}`{nKj{{pUB$fBELk>wjOqeE$Fa>lgg^ z^PB&l-oN~R4k`Vf+q|&%{Kok&&aR&N0hAUn@Up%SXOZ!$$sf+HpWP30KPB}4{|pQb JjO1aEUI2(9Zd(8V literal 0 HcmV?d00001 diff --git a/CUETools/Resources/pictures.ico b/CUETools/Resources/pictures.ico new file mode 100644 index 0000000000000000000000000000000000000000..67ba03200291338c13d8c891031d483a08df13b8 GIT binary patch literal 1150 zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD?u1_lQf5J`Kyqr0H%;Pl$V zho@J6I5M;L!;zVF|H1T(+7Cx&)P6WLv-ZQz-l7S(TykJ))x!_(-u(aZ<>UV!Uq1Z* z4#J<`|NjofpWeOte`IFedvyIfx(jL!POsf?Xllj(Zy(?OcVATS-)V04f1BxP|IH>Q z{5R~5`mfU#`v3deXaA4Rs{4no|G?C$(;wcwd3JbO#sBXg-~7L`Z{GiVduRXmpLgcJ zVa3A#x3*9Ge{ECm|8MV}{XaUp99unXO|AI(>DAMpdqDa>zx#jx_`3h8 z%X0o(uFd+dzas9x-*mtKm)3Ru|Mu?r|0A>NKEUihFtuvShj(wz9G~0x>-)zyzmCqR z{{Q{U`~MHm@BZ&_p!>i7@tOZU4)y*wT$TL)^eRmKho)AX{`T?hna$J7zrTF*7HUnf1I{x(T#s5PyYvJ(+*8k=GnPYPszQ6qV z=GVzhbN=pH(D8rw^osv`W>o$M#mAB9RsWC8to?U*O8MV|Q!75~=q>Drh2P<6m8ZXd z{cz^w@`>N>zIgKM^{02gUVVD|>&1sxzrK8U`|JDH&%Zvud;ROvyBE(6&8)ov(+8u$ z_J93y=KSV)Pq!@W{JME|_4m!QtG@4^QSs~8torXK=eK@8Jf-66!KoEDcJvlD!t}xD z!}HsBy?*`b^!Kk{&S1lz-n}?;XlCtxn0j=2=j6)5!*knr9hy>h;PBM)1Ba(ooH;zD z`~VCeoLX^UM{i*fx;|>~|Nm!T_`wLl4;UF3K)8XCfdMOKXJBXmVR;6I26+YskX``w Ct{ad5 literal 0 HcmV?d00001 diff --git a/CUETools/Resources/puzzle.ico b/CUETools/Resources/puzzle.ico new file mode 100644 index 0000000000000000000000000000000000000000..2ac2dabfd710bfc267ce390ba8a6a70f560bb2d0 GIT binary patch literal 1150 zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD?u1_lQf5Q%~L85kI(85kHe z85kIhnA{kav1Kz|1YxE)hBT0B5DnrZV-{b=l?)6F#taM$91IK$d<+Z>q6`cSlB}5w zXOylA{+Haq^PVA;VJ1jFhz9XN;xNov#&nT^fk6r^k3?`*Fq~06EApQundu@!DA;@k z5Dnrhoe}&G!#qu3{S4gA49?t53_HLW!ak#UMB+bd5;I6Y*!>Kl3~4NhOc#|73jT*- zzAlJSY8+iubQ%+tnjMrb1IP37%E|K;Zjzh_Tnz045GaE2{~<+Ai_{`V@| zh5svW6Z)^TP4GW|4@5t27sDC9qqhHDb{qfqJ!13Ud9TrbrPYG}Rn`dq*H|wO#_H?E z{>v>Ede7R%d=Z4D7xKRs=w}A`pMkHBVN=*y*Z)qt4L|esF`QADCwS9jgYtjnMMD3T z77Bu~<_d}b938Be85$VU7#bLi85$U7vNS{DhJO-+Gyf!p9Z(Enp9wf_|KEPQ-hb1z zD*v^YNc}fjrTCwrf#D2NFymwjOk+3`e9Gy+>mCz02KkGxha1Iy);5U!=mrVSWH=LX z-u=JVK}$IHIc)vkahJ(^?k>)YAndTy_u12J!J~K$8?*!LXy~ zW#a$bCo%sEUnKko@zIpv<%+Iia28#~ut{_k!x<>;jH01|fq|icf#E|V0|NsHGlB~Y VP@%!VAkV%=XALXRa&DPCVYR`_+FC2C+e6AURz6 z(8UEj8t0prZu}3z0v-(u;tiNUVFwCBP*@TSS4Pi?tMZoK{13wH9!*E>Q`MFQHX5D{ z?J#)(3R4gUu|Z-WIaxg+f0!GXe5UCzS(fgbc;v%>5SH*s`PsBJ;eW^OwEvZB!ogt* z3Re&tBnFa8ob2!lp?`)B1B2*|1($#Q2VqWLsn?T_75-mvx$ghe6UE>#1%)k$4H5&% zm97YGfawR(jEoX1{QZ;OSX%nL0kJ#xq$l(p%y|&e-}Dg_rXUPrgTz2`AU(*Kkx|-; zkx_ak6kCDhJhRe`1yxgyfx;AoL2Qs1NRBAX85qyN8F&U1rXUPrGl0a1(#*iXz~pSm z!0dVk6s8~yVuQtq)z9F-!yp=S#-)5KI9x$&29Oxh`WYA)bSgJlW^ejvoVw;Ch)s%C zuv(jbX9nAeo4^>v1`9$7dj J;eR^=0{}RV78C#g literal 0 HcmV?d00001 diff --git a/CUETools/frmCUETools.Designer.cs b/CUETools/frmCUETools.Designer.cs index 1b5c09e..f1698f4 100644 --- a/CUETools/frmCUETools.Designer.cs +++ b/CUETools/frmCUETools.Designer.cs @@ -38,6 +38,10 @@ namespace JDP { this.fileSystemTreeView1 = new CUEControls.FileSystemTreeView(); this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); this.groupBoxMode = new System.Windows.Forms.GroupBox(); + this.tableLayoutPanelVerifyMode = new System.Windows.Forms.TableLayoutPanel(); + this.checkBoxSkipRecent = new System.Windows.Forms.CheckBox(); + this.checkBoxVerifyUseLocal = new System.Windows.Forms.CheckBox(); + this.checkBoxVerifyUseCDRepair = new System.Windows.Forms.CheckBox(); this.tableLayoutPanelCUEStyle = new System.Windows.Forms.TableLayoutPanel(); this.checkBoxUseAccurateRip = new System.Windows.Forms.CheckBox(); this.checkBoxUseFreeDb = new System.Windows.Forms.CheckBox(); @@ -51,8 +55,6 @@ namespace JDP { this.toolStripMenuItemCorrectorModeLocateFiles = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemCorrectorModeChangeExtension = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripDropDownButtonCorrectorFormat = new System.Windows.Forms.ToolStripDropDownButton(); - this.tableLayoutPanelVerifyMode = new System.Windows.Forms.TableLayoutPanel(); - this.checkBoxVerifyUseCDRepair = new System.Windows.Forms.CheckBox(); this.grpAudioOutput = new System.Windows.Forms.GroupBox(); this.labelEncoderMaxMode = new System.Windows.Forms.Label(); this.labelEncoderMinMode = new System.Windows.Forms.Label(); @@ -78,6 +80,7 @@ namespace JDP { this.toolStripMenuItemInputBrowserFiles = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemInputBrowserMulti = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemInputBrowserDrag = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemLocalDatabase = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemInputBrowserHide = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripOutput = new System.Windows.Forms.ToolStrip(); this.toolStripLabelOutput = new System.Windows.Forms.ToolStripLabel(); @@ -121,6 +124,10 @@ namespace JDP { this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.setAsMyMusicFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.resetToOriginalLocationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editMetadataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addFolderToLocalDatabaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeItemFromDatabaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.backgroundWorkerAddToLocalDB = new System.ComponentModel.BackgroundWorker(); this.toolStripContainer1.BottomToolStripPanel.SuspendLayout(); this.toolStripContainer1.ContentPanel.SuspendLayout(); this.toolStripContainer1.TopToolStripPanel.SuspendLayout(); @@ -130,9 +137,9 @@ namespace JDP { this.grpInput.SuspendLayout(); this.tableLayoutPanel2.SuspendLayout(); this.groupBoxMode.SuspendLayout(); + this.tableLayoutPanelVerifyMode.SuspendLayout(); this.tableLayoutPanelCUEStyle.SuspendLayout(); this.toolStripCorrectorFormat.SuspendLayout(); - this.tableLayoutPanelVerifyMode.SuspendLayout(); this.grpAudioOutput.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.trackBarEncoderMode)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMotd)).BeginInit(); @@ -295,13 +302,45 @@ namespace JDP { // // groupBoxMode // + this.groupBoxMode.Controls.Add(this.tableLayoutPanelVerifyMode); this.groupBoxMode.Controls.Add(this.tableLayoutPanelCUEStyle); this.groupBoxMode.Controls.Add(this.toolStripCorrectorFormat); - this.groupBoxMode.Controls.Add(this.tableLayoutPanelVerifyMode); resources.ApplyResources(this.groupBoxMode, "groupBoxMode"); this.groupBoxMode.Name = "groupBoxMode"; this.groupBoxMode.TabStop = false; // + // tableLayoutPanelVerifyMode + // + resources.ApplyResources(this.tableLayoutPanelVerifyMode, "tableLayoutPanelVerifyMode"); + this.tableLayoutPanelVerifyMode.Controls.Add(this.checkBoxSkipRecent, 2, 0); + this.tableLayoutPanelVerifyMode.Controls.Add(this.checkBoxVerifyUseLocal, 1, 0); + this.tableLayoutPanelVerifyMode.Controls.Add(this.checkBoxVerifyUseCDRepair, 0, 0); + this.tableLayoutPanelVerifyMode.Name = "tableLayoutPanelVerifyMode"; + // + // checkBoxSkipRecent + // + resources.ApplyResources(this.checkBoxSkipRecent, "checkBoxSkipRecent"); + this.checkBoxSkipRecent.Image = global::JDP.Properties.Resources.alarm_clock__minus; + this.checkBoxSkipRecent.Name = "checkBoxSkipRecent"; + this.toolTip1.SetToolTip(this.checkBoxSkipRecent, resources.GetString("checkBoxSkipRecent.ToolTip")); + this.checkBoxSkipRecent.UseVisualStyleBackColor = true; + // + // checkBoxVerifyUseLocal + // + resources.ApplyResources(this.checkBoxVerifyUseLocal, "checkBoxVerifyUseLocal"); + this.checkBoxVerifyUseLocal.Image = global::JDP.Properties.Resources.puzzle__arrow; + this.checkBoxVerifyUseLocal.Name = "checkBoxVerifyUseLocal"; + this.toolTip1.SetToolTip(this.checkBoxVerifyUseLocal, resources.GetString("checkBoxVerifyUseLocal.ToolTip")); + this.checkBoxVerifyUseLocal.UseVisualStyleBackColor = true; + // + // checkBoxVerifyUseCDRepair + // + resources.ApplyResources(this.checkBoxVerifyUseCDRepair, "checkBoxVerifyUseCDRepair"); + this.checkBoxVerifyUseCDRepair.Image = global::JDP.Properties.Resources.cdrepair1; + this.checkBoxVerifyUseCDRepair.Name = "checkBoxVerifyUseCDRepair"; + this.toolTip1.SetToolTip(this.checkBoxVerifyUseCDRepair, resources.GetString("checkBoxVerifyUseCDRepair.ToolTip")); + this.checkBoxVerifyUseCDRepair.UseVisualStyleBackColor = true; + // // tableLayoutPanelCUEStyle // resources.ApplyResources(this.tableLayoutPanelCUEStyle, "tableLayoutPanelCUEStyle"); @@ -420,20 +459,6 @@ namespace JDP { this.toolStripDropDownButtonCorrectorFormat.Name = "toolStripDropDownButtonCorrectorFormat"; this.toolStripDropDownButtonCorrectorFormat.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.toolStripDropDownButtonCorrectorFormat_DropDownItemClicked); // - // tableLayoutPanelVerifyMode - // - resources.ApplyResources(this.tableLayoutPanelVerifyMode, "tableLayoutPanelVerifyMode"); - this.tableLayoutPanelVerifyMode.Controls.Add(this.checkBoxVerifyUseCDRepair, 0, 0); - this.tableLayoutPanelVerifyMode.Name = "tableLayoutPanelVerifyMode"; - this.toolTip1.SetToolTip(this.tableLayoutPanelVerifyMode, resources.GetString("tableLayoutPanelVerifyMode.ToolTip")); - // - // checkBoxVerifyUseCDRepair - // - resources.ApplyResources(this.checkBoxVerifyUseCDRepair, "checkBoxVerifyUseCDRepair"); - this.checkBoxVerifyUseCDRepair.Image = global::JDP.Properties.Resources.cdrepair1; - this.checkBoxVerifyUseCDRepair.Name = "checkBoxVerifyUseCDRepair"; - this.checkBoxVerifyUseCDRepair.UseVisualStyleBackColor = true; - // // grpAudioOutput // this.grpAudioOutput.Controls.Add(this.labelEncoderMaxMode); @@ -624,6 +649,7 @@ namespace JDP { this.toolStripMenuItemInputBrowserFiles, this.toolStripMenuItemInputBrowserMulti, this.toolStripMenuItemInputBrowserDrag, + this.toolStripMenuItemLocalDatabase, this.toolStripMenuItemInputBrowserHide}); this.toolStripSplitButtonInputBrowser.Image = global::JDP.Properties.Resources.folder; resources.ApplyResources(this.toolStripSplitButtonInputBrowser, "toolStripSplitButtonInputBrowser"); @@ -649,6 +675,12 @@ namespace JDP { this.toolStripMenuItemInputBrowserDrag.Name = "toolStripMenuItemInputBrowserDrag"; resources.ApplyResources(this.toolStripMenuItemInputBrowserDrag, "toolStripMenuItemInputBrowserDrag"); // + // toolStripMenuItemLocalDatabase + // + this.toolStripMenuItemLocalDatabase.Image = global::JDP.Properties.Resources.puzzle__arrow; + this.toolStripMenuItemLocalDatabase.Name = "toolStripMenuItemLocalDatabase"; + resources.ApplyResources(this.toolStripMenuItemLocalDatabase, "toolStripMenuItemLocalDatabase"); + // // toolStripMenuItemInputBrowserHide // this.toolStripMenuItemInputBrowserHide.Image = global::JDP.Properties.Resources.folder_delete; @@ -970,7 +1002,10 @@ namespace JDP { this.SelectedNodeName, this.toolStripSeparator2, this.setAsMyMusicFolderToolStripMenuItem, - this.resetToOriginalLocationToolStripMenuItem}); + this.resetToOriginalLocationToolStripMenuItem, + this.editMetadataToolStripMenuItem, + this.addFolderToLocalDatabaseToolStripMenuItem, + this.removeItemFromDatabaseToolStripMenuItem}); this.contextMenuStripFileTree.Name = "contextMenuStripFileTree"; resources.ApplyResources(this.contextMenuStripFileTree, "contextMenuStripFileTree"); // @@ -996,6 +1031,29 @@ namespace JDP { resources.ApplyResources(this.resetToOriginalLocationToolStripMenuItem, "resetToOriginalLocationToolStripMenuItem"); this.resetToOriginalLocationToolStripMenuItem.Click += new System.EventHandler(this.resetToOriginalLocationToolStripMenuItem_Click); // + // editMetadataToolStripMenuItem + // + this.editMetadataToolStripMenuItem.Name = "editMetadataToolStripMenuItem"; + resources.ApplyResources(this.editMetadataToolStripMenuItem, "editMetadataToolStripMenuItem"); + this.editMetadataToolStripMenuItem.Click += new System.EventHandler(this.editMetadataToolStripMenuItem_Click); + // + // addFolderToLocalDatabaseToolStripMenuItem + // + this.addFolderToLocalDatabaseToolStripMenuItem.Name = "addFolderToLocalDatabaseToolStripMenuItem"; + resources.ApplyResources(this.addFolderToLocalDatabaseToolStripMenuItem, "addFolderToLocalDatabaseToolStripMenuItem"); + this.addFolderToLocalDatabaseToolStripMenuItem.Click += new System.EventHandler(this.addFolderToLocalDatabaseToolStripMenuItem_Click); + // + // removeItemFromDatabaseToolStripMenuItem + // + this.removeItemFromDatabaseToolStripMenuItem.Name = "removeItemFromDatabaseToolStripMenuItem"; + resources.ApplyResources(this.removeItemFromDatabaseToolStripMenuItem, "removeItemFromDatabaseToolStripMenuItem"); + this.removeItemFromDatabaseToolStripMenuItem.Click += new System.EventHandler(this.removeItemFromDatabaseToolStripMenuItem_Click); + // + // backgroundWorkerAddToLocalDB + // + this.backgroundWorkerAddToLocalDB.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorkerAddToLocalDB_DoWork); + this.backgroundWorkerAddToLocalDB.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorkerAddToLocalDB_RunWorkerCompleted); + // // frmCUETools // resources.ApplyResources(this, "$this"); @@ -1018,12 +1076,12 @@ namespace JDP { this.grpInput.ResumeLayout(false); this.tableLayoutPanel2.ResumeLayout(false); this.groupBoxMode.ResumeLayout(false); + this.tableLayoutPanelVerifyMode.ResumeLayout(false); + this.tableLayoutPanelVerifyMode.PerformLayout(); this.tableLayoutPanelCUEStyle.ResumeLayout(false); this.tableLayoutPanelCUEStyle.PerformLayout(); this.toolStripCorrectorFormat.ResumeLayout(false); this.toolStripCorrectorFormat.PerformLayout(); - this.tableLayoutPanelVerifyMode.ResumeLayout(false); - this.tableLayoutPanelVerifyMode.PerformLayout(); this.grpAudioOutput.ResumeLayout(false); this.grpAudioOutput.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.trackBarEncoderMode)).EndInit(); @@ -1147,6 +1205,13 @@ namespace JDP { private System.Windows.Forms.TableLayoutPanel tableLayoutPanelVerifyMode; private System.Windows.Forms.CheckBox checkBoxVerifyUseCDRepair; private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelCTDB; + private System.Windows.Forms.CheckBox checkBoxVerifyUseLocal; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemLocalDatabase; + private System.Windows.Forms.CheckBox checkBoxSkipRecent; + private System.Windows.Forms.ToolStripMenuItem editMetadataToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addFolderToLocalDatabaseToolStripMenuItem; + private System.ComponentModel.BackgroundWorker backgroundWorkerAddToLocalDB; + private System.Windows.Forms.ToolStripMenuItem removeItemFromDatabaseToolStripMenuItem; } } diff --git a/CUETools/frmCUETools.cs b/CUETools/frmCUETools.cs index 5280352..642bfde 100644 --- a/CUETools/frmCUETools.cs +++ b/CUETools/frmCUETools.cs @@ -59,6 +59,21 @@ namespace JDP { m_icon_mgr.SetExtensionIcon(".m4a", global::JDP.Properties.Resources.ipod_sound); m_icon_mgr.SetExtensionIcon(".ogg", global::JDP.Properties.Resources.ogg); m_icon_mgr.SetExtensionIcon(".cue", global::JDP.Properties.Resources.cue3); + m_icon_mgr.SetExtensionIcon(".#puzzle", global::JDP.Properties.Resources.puzzle); + m_icon_mgr.SetExtensionIcon(".#users", global::JDP.Properties.Resources.users); + m_icon_mgr.SetExtensionIcon(".#alarm_clock", global::JDP.Properties.Resources.alarm_clock); + m_icon_mgr.SetExtensionIcon(".#calendar", global::JDP.Properties.Resources.calendar); + m_icon_mgr.SetExtensionIcon(".#ar", global::JDP.Properties.Resources.AR); + m_icon_mgr.SetExtensionIcon(".#images", global::JDP.Properties.Resources.images); + m_icon_mgr.SetExtensionIcon(".#images_question", global::JDP.Properties.Resources.images_question); + m_icon_mgr.SetExtensionIcon(".#pictures", global::JDP.Properties.Resources.pictures); + m_icon_mgr.SetExtensionIcon(".#picture", global::JDP.Properties.Resources.picture); + + //m_state_image_list = new ImageList(); + //m_state_image_list.ImageSize = new Size(16, 16); + //m_state_image_list.ColorDepth = ColorDepth.Depth32Bit; + //m_state_image_list.Images.Add("blank", new Bitmap(16, 16)); + //m_state_image_list.Images.Add("cue", Properties.Resources.cue3); } private void AddCheckedNodesToBatch(TreeNodeCollection nodes) @@ -67,8 +82,34 @@ namespace JDP { { if (node.IsExpanded) AddCheckedNodesToBatch(node.Nodes); - else if (node.Checked && node.Tag is FileSystemInfo) - _batchPaths.Add(((FileSystemInfo)node.Tag).FullName); + else if (node.Checked && node is CUEControls.FileSystemTreeNodeFileSystemInfo) + _batchPaths.Add((node as CUEControls.FileSystemTreeNodeFileSystemInfo).Path); + } + } + + private void AddAllNodesToBatch(TreeNode node) + { + if (node.IsExpanded || !(node is CUEControls.FileSystemTreeNode)) + { + AddAllNodesToBatch(node.Nodes); + return; + } + if (node is CUEControls.FileSystemTreeNodeFileSystemInfo) + { + _batchPaths.Add((node as CUEControls.FileSystemTreeNodeFileSystemInfo).Path); + return; + } + if (node is FileSystemTreeNodeLocalDBEntry) + { + _batchPaths.Add((node as FileSystemTreeNodeLocalDBEntry).Path); + return; + } + if (node is FileSystemTreeNodeLocalDBFolder) + { + foreach (var entry in (node as FileSystemTreeNodeLocalDBFolder).Group) + if (entry.Path != null) + _batchPaths.Add(entry.Path); + return; } } @@ -76,10 +117,7 @@ namespace JDP { { foreach (TreeNode node in nodes) { - if (node.IsExpanded) - AddAllNodesToBatch(node.Nodes); - else if (node.Tag is FileSystemInfo) - _batchPaths.Add(((FileSystemInfo)node.Tag).FullName); + AddAllNodesToBatch(node); } } @@ -128,6 +166,7 @@ namespace JDP { if (FileBrowserState != FileBrowserStateEnum.Checkboxes && FileBrowserState != FileBrowserStateEnum.DragDrop + && (FileBrowserState != FileBrowserStateEnum.LocalDB || fileSystemTreeView1.SelectedPath != null) && !Directory.Exists(InputPath)) { StartConvert(); @@ -143,6 +182,8 @@ namespace JDP { AddCheckedNodesToBatch(fileSystemTreeView1.Nodes); else if (FileBrowserState == FileBrowserStateEnum.DragDrop) AddAllNodesToBatch(fileSystemTreeView1.Nodes); + else if (FileBrowserState == FileBrowserStateEnum.LocalDB && fileSystemTreeView1.SelectedNode != null) + AddAllNodesToBatch(fileSystemTreeView1.SelectedNode); else { _batchRoot = InputPath; @@ -249,6 +290,52 @@ namespace JDP { private void frmCUETools_Load(object sender, EventArgs e) { _batchPaths = new List(); + try + { + _localDB = CUEToolsLocalDB.Load(); + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, "Error loading local database", + MessageBoxButtons.OK, MessageBoxIcon.Error); + string tempPath = CUEToolsLocalDB.LocalDBPath + "." + DateTime.Now.Ticks.ToString() + ".tmp"; + File.Move(CUEToolsLocalDB.LocalDBPath, tempPath); + _localDB = new CUEToolsLocalDB(); + } + //foreach (var entry in _localDB) + //{ + // try + // { + // CUEMetadata cache = CUEMetadata.Load(entry.DiscID); + // foreach (var entry2 in _localDB) + // if (entry2.DiscID == entry.DiscID) + // entry2.Metadata = new CUEMetadata(cache); + // } + // catch + // { + // } + //} + //_localDB.Dirty = true; + //foreach (var entries in _localDB) + // if (entries.InputPaths != null) + // entries.InputPaths = entries.InputPaths.ConvertAll(i => CUEToolsLocalDBEntry.NormalizePath(i)); + //_localDB.Dirty = true; + //foreach (var entries in _localDB) + // entry.AudioPaths = entry.AudioPaths.ConvertAll(p => p.ToLower()); + //_localDB.Dirty = true; + //var t = CUEToolsLocalDB.Group(_localDB, i => string.Join("$", i.AudioPaths.ToArray()) + "$" + i.DiscID.ToString() + "$" + i.TrackOffsets.ToString() + "$" + i.FirstAudio.ToString() + "$" + i.TrackCount.ToString(), null); + //foreach (var entries in t) + //{ + // if (entries.Count > 1) + // { + // for (int i = 1; i < entries.Count; i++) + // { + // entries[0].InputPaths.AddRange(entries[i].InputPaths); + // _localDB.Remove(entries[i]); + // _localDB.Dirty = true; + // } + // } + //} labelFormat.ImageList = m_icon_mgr.ImageList; toolStripCorrectorFormat.ImageList = m_icon_mgr.ImageList; toolStripDropDownButtonCorrectorFormat.DropDown.ImageList = m_icon_mgr.ImageList; @@ -289,6 +376,7 @@ namespace JDP { } private void frmCUETools_FormClosed(object sender, FormClosedEventArgs e) { + SaveDatabase(); SaveSettings(); } @@ -298,6 +386,7 @@ namespace JDP { Tree = 0, Checkboxes = 1, DragDrop = 2, + LocalDB = 8, Hidden = 4 } @@ -309,6 +398,7 @@ namespace JDP { // ******************************************************************************** private CUEControls.IIconManager m_icon_mgr; + //private ImageList m_state_image_list; List _batchPaths; StringBuilder _batchReport; string _batchRoot; @@ -334,6 +424,7 @@ namespace JDP { "[%directoryname%\\]%filename%-new[%unique%].cue", "[%directoryname%\\]new[%unique%]\\%filename%.cue" }; + CUEToolsLocalDB _localDB; private bool IsCDROM(string pathIn) { @@ -344,6 +435,7 @@ namespace JDP { try { _workThread = null; + _workClass = null; if (_batchPaths.Count != 0) { InputPath = _batchPaths[0]; @@ -464,7 +556,7 @@ namespace JDP { { get { - return "CUETools 2.0.9"; + return "CUETools 2.1.0"; } } @@ -483,6 +575,8 @@ namespace JDP { bool outputAudio = action == CUEAction.Encode && audioEncoderType != AudioEncoderType.NoAudio; bool useAR = action == CUEAction.Verify || (outputAudio && checkBoxUseAccurateRip.Checked); bool useCUEToolsDB = action == CUEAction.Verify && checkBoxVerifyUseCDRepair.Checked; + bool useLocalDB = action != CUEAction.Verify || checkBoxVerifyUseLocal.Checked; + bool skipRecent = action == CUEAction.Verify && checkBoxSkipRecent.Checked; try { @@ -748,35 +842,43 @@ namespace JDP { else if (File.Exists(pathIn) || IsCDROM(pathIn)) { string pathOut = null; - List releases = null; if (Directory.Exists(pathIn) && !pathIn.EndsWith(new string(Path.DirectorySeparatorChar, 1))) pathIn = pathIn + Path.DirectorySeparatorChar; + var fullInputPath = CUEToolsLocalDBEntry.NormalizePath(pathIn); + var recentEntry = skipRecent ? _localDB.Find(item => + item.HasPath(fullInputPath) && item.VerificationDate != DateTime.MinValue && item.Status != null && item.VerificationDate.AddDays(30) > DateTime.Now) : null; + if (recentEntry != null) + throw new Exception("recently verified: " + recentEntry.Status); + cueSheet.Action = action; cueSheet.OutputStyle = cueStyle; cueSheet.Open(pathIn); cueSheet.PreGapLengthMSF = txtPreGapLength.Text; if (useAR || useCUEToolsDB) cueSheet.DataTrackLengthMSF = txtDataTrackLength.Text; + if (useLocalDB) + cueSheet.UseLocalDB(_localDB); if (useCUEToolsDB) cueSheet.UseCUEToolsDB(false, "CUETools " + CUESheet.CUEToolsVersion); if (useAR) cueSheet.UseAccurateRip(); - if (_batchPaths.Count == 0 && action == CUEAction.Encode && (checkBoxUseFreeDb.Checked || checkBoxUseMusicBrainz.Checked)) - releases = cueSheet.LookupAlbumInfo(checkBoxUseFreeDb.Checked, checkBoxUseMusicBrainz.Checked, _profile._config.advanced.CacheMetadata); - else if (_profile._config.advanced.CacheMetadata) + List fullAudioPaths = cueSheet.SourcePaths.ConvertAll(sp => CUEToolsLocalDBEntry.NormalizePath(sp)); + recentEntry = skipRecent ? _localDB.Find(item => + item.Equals(cueSheet.TOC, fullAudioPaths) && item.VerificationDate != null && item.Status != null && item.VerificationDate.AddDays(30) > DateTime.Now) : null; + if (recentEntry != null) { - try - { - CUEMetadata cache = CUEMetadata.Load(cueSheet.TOC.TOCID); - if (cache != null) - cueSheet.CopyMetadata(cache); - } - catch + if (useLocalDB) { + _localDB.Dirty = true; + if (recentEntry.InputPaths == null) + recentEntry.InputPaths = new List(); + if (!recentEntry.InputPaths.Contains(fullInputPath)) + recentEntry.InputPaths.Add(fullInputPath); } + throw new Exception("recently verified: " + recentEntry.Status); } this.Invoke((MethodInvoker)delegate() @@ -784,18 +886,35 @@ namespace JDP { toolStripStatusLabelAR.Visible = useAR; toolStripStatusLabelCTDB.Visible = useCUEToolsDB; - if (releases != null) + if (_batchPaths.Count == 0 && action == CUEAction.Encode && (checkBoxUseFreeDb.Checked || checkBoxUseMusicBrainz.Checked)) { frmChoice dlg = new frmChoice(); dlg.CUE = cueSheet; - dlg.Choices = releases; + dlg.LookupAlbumInfo(checkBoxUseFreeDb.Checked, checkBoxUseMusicBrainz.Checked, _profile._config.advanced.CacheMetadata, true); dlgRes = dlg.ShowDialog(this); if (dlgRes == DialogResult.Cancel) { cueSheet.Close(); SetupControls(false); } + else if (_profile._config.advanced.CacheMetadata && dlg.ChosenRelease != null) + { + var entry = cueSheet.OpenLocalDBEntry(); + if (entry != null) + { + _localDB.Dirty = true; + entry.Metadata.CopyMetadata(dlg.ChosenRelease.metadata); + } + } + dlg.Close(); } + else if (_profile._config.advanced.CacheMetadata) + { + recentEntry = _localDB.Find(item => item.Equals(cueSheet.TOC, fullAudioPaths)); + if (recentEntry != null) + cueSheet.CopyMetadata(recentEntry.Metadata); + } + UpdateOutputPath(pathIn, cueSheet); pathOut = txtOutputPath.Text; if (dlgRes != DialogResult.Cancel && cueSheet.AlbumArt.Count != 0) @@ -970,7 +1089,12 @@ namespace JDP { if (_batchPaths.Count != 0) { _batchPaths.RemoveAt(0); - this.BeginInvoke((MethodInvoker)delegate() { + if (_batchPaths.Count == 0) + { + SaveDatabase(); + } + this.BeginInvoke((MethodInvoker)delegate() + { if (_batchPaths.Count == 0) { SetupControls(false); ReportState = true; @@ -1029,7 +1153,7 @@ namespace JDP { toolStripMenu.Enabled = !running; fileSystemTreeView1.Enabled = !running; txtInputPath.Enabled = !running; - txtInputPath.ReadOnly = FileBrowserState == FileBrowserStateEnum.DragDrop || FileBrowserState == FileBrowserStateEnum.Checkboxes; + txtInputPath.ReadOnly = FileBrowserState == FileBrowserStateEnum.DragDrop || FileBrowserState == FileBrowserStateEnum.Checkboxes || FileBrowserState == FileBrowserStateEnum.LocalDB; grpExtra.Enabled = !running && (converting || verifying); //groupBoxCorrector.Enabled = !running && SelectedAction == CUEAction.CorrectFilenames; //grpOutputStyle.Enabled = !running && converting; @@ -1138,6 +1262,8 @@ namespace JDP { checkBoxUseMusicBrainz.Checked = _profile._useMusicBrainz; checkBoxUseAccurateRip.Checked = _profile._useAccurateRip; checkBoxVerifyUseCDRepair.Checked = _profile._useCUEToolsDB; + checkBoxVerifyUseLocal.Checked = _profile._useLocalDB; + checkBoxSkipRecent.Checked = _profile._skipRecent; } private void ActivateProfile(string profileName) @@ -1182,6 +1308,8 @@ namespace JDP { _profile._useMusicBrainz = checkBoxUseMusicBrainz.Checked; _profile._useAccurateRip = checkBoxUseAccurateRip.Checked; _profile._useCUEToolsDB = checkBoxVerifyUseCDRepair.Checked; + _profile._useLocalDB = checkBoxVerifyUseLocal.Checked; + _profile._skipRecent = checkBoxSkipRecent.Checked; if (_profile != _defaultProfile) { @@ -1233,7 +1361,7 @@ namespace JDP { if (InputPath == "") { InputPath = sr.Load("InputPath") ?? ""; - FileBrowserState = (FileBrowserStateEnum)(sr.LoadInt32("FileBrowserState", (int)FileBrowserStateEnum.Tree, (int)FileBrowserStateEnum.Hidden) ?? (int)FileBrowserStateEnum.Hidden); + FileBrowserState = (FileBrowserStateEnum)(sr.LoadInt32("FileBrowserState", (int)FileBrowserStateEnum.Tree, (int)FileBrowserStateEnum.LocalDB) ?? (int)FileBrowserStateEnum.Hidden); } else FileBrowserState = FileBrowserStateEnum.Hidden; @@ -1427,6 +1555,7 @@ namespace JDP { case FileBrowserStateEnum.Checkboxes: return toolStripMenuItemInputBrowserMulti; case FileBrowserStateEnum.DragDrop: return toolStripMenuItemInputBrowserDrag; case FileBrowserStateEnum.Hidden: return toolStripMenuItemInputBrowserHide; + case FileBrowserStateEnum.LocalDB: return toolStripMenuItemLocalDatabase; } return null; } @@ -1494,7 +1623,7 @@ namespace JDP { fileSystemTreeView1.Nodes[0].Expand(); if (value == FileBrowserStateEnum.Checkboxes && fileSystemTreeView1.SelectedNode != null - && fileSystemTreeView1.SelectedNode.Tag is FileSystemInfo) + && fileSystemTreeView1.SelectedNode is CUEControls.FileSystemTreeNodeFileSystemInfo) { fileSystemTreeView1.SelectedNode.Checked = true; fileSystemTreeView1.SelectedNode.Expand(); @@ -1502,6 +1631,7 @@ namespace JDP { _fileBrowserControlState = value; } fileSystemTreeView1.Select(); + fileSystemTreeView1.ShowRootLines = false; break; case FileBrowserStateEnum.DragDrop: OutputPathUseTemplate = true; @@ -1515,7 +1645,94 @@ namespace JDP { _fileBrowserControlState = value; } fileSystemTreeView1.Select(); - break; + fileSystemTreeView1.ShowRootLines = false; + break; + case FileBrowserStateEnum.LocalDB: + OutputPathUseTemplate = true; + if (_fileBrowserControlState != value) + { + fileSystemTreeView1.BeginUpdate(); + fileSystemTreeView1.CheckBoxes = false; + //fileSystemTreeView1.StateImageList = m_state_image_list; + fileSystemTreeView1.Nodes.Clear(); + fileSystemTreeView1.Nodes.Add("dummy"); + fileSystemTreeView1.IconManager = m_icon_mgr; + fileSystemTreeView1.Nodes.Clear(); + + fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory( + m_icon_mgr, _localDB, true, true, m_icon_mgr.GetIconIndex(".#puzzle"), "By Uniqueness", + i => ((int)FileSystemTreeNodeLocalDBCollision.GetGroupType(_localDB.FindAll(j => j.DiscID == i.DiscID))).ToString(), + i => FileSystemTreeNodeLocalDBCollision.GroupTypeToDescription(FileSystemTreeNodeLocalDBCollision.GetGroupType(_localDB.FindAll(j => j.DiscID == i.DiscID))), + i => m_icon_mgr.GetIconIndex(FileSystemTreeNodeLocalDBCollision.GroupTypeToIconTag(FileSystemTreeNodeLocalDBCollision.GetGroupType(_localDB.FindAll(j => j.DiscID == i.DiscID)))))); //converter_icon + + fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory( + m_icon_mgr, _localDB, true, true, m_icon_mgr.GetIconIndex(".flac"), "By Format", + i => i.AudioPaths == null || i.AudioPaths.Count == 0 ? null : Path.GetExtension(i.AudioPaths[0]).ToLower(), + null, + i => m_icon_mgr.GetIconIndex(i.AudioPaths[0]))); + + fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory( + m_icon_mgr, _localDB, false, true, m_icon_mgr.GetIconIndex(".#users"), "By Artist", + i => i.Metadata.Artist, null, null)); + + fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory( + m_icon_mgr, _localDB, true, false, m_icon_mgr.GetIconIndex(".#calendar"), "By Release Date", + i => i.Metadata.Year, null, null)); + + fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory( + m_icon_mgr, _localDB, true, true, m_icon_mgr.GetIconIndex(".#alarm_clock"), "By Verification Date", + i => + i.VerificationDate == DateTime.MinValue ? "0" : + i.VerificationDate.AddHours(1) > DateTime.Now ? "1" : + i.VerificationDate.AddDays(1) > DateTime.Now ? "2" : + i.VerificationDate.AddDays(7) > DateTime.Now ? "3" : + i.VerificationDate.AddDays(31) > DateTime.Now ? "4" : + i.VerificationDate.AddDays(365) > DateTime.Now ? "5" : + "6", + i => + i.VerificationDate == DateTime.MinValue ? "never" : + i.VerificationDate.AddHours(1) > DateTime.Now ? "this hour" : + i.VerificationDate.AddDays(1) > DateTime.Now ? "this day" : + i.VerificationDate.AddDays(7) > DateTime.Now ? "this week" : + i.VerificationDate.AddDays(31) > DateTime.Now ? "this month" : + i.VerificationDate.AddDays(365) > DateTime.Now ? "this year" : + "more than a year ago", + null)); + + fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory( + m_icon_mgr, _localDB, true, true, m_icon_mgr.GetIconIndex(".#ar"), "By AccurateRip Confidence", + i => + i.VerificationDate == DateTime.MinValue ? "00" : + i.ARConfidence == 0 ? "01" : + i.ARConfidence == 1 ? "02" : + i.ARConfidence == 2 ? "03" : + i.ARConfidence == 3 ? "04" : + i.ARConfidence < 5 ? "05" : + i.ARConfidence < 10 ? "06" : + i.ARConfidence < 20 ? "07" : + i.ARConfidence < 50 ? "08" : + i.ARConfidence < 100 ? "09" : + "10", + i => + i.VerificationDate == DateTime.MinValue ? "?" : + i.ARConfidence == 0 ? "0" : + i.ARConfidence == 1 ? "1" : + i.ARConfidence == 2 ? "2" : + i.ARConfidence == 3 ? "3" : + i.ARConfidence < 5 ? "< 5" : + i.ARConfidence < 10 ? "< 10" : + i.ARConfidence < 20 ? "< 20" : + i.ARConfidence < 50 ? "< 50" : + i.ARConfidence < 100 ? "< 100" : + ">=100", + null)); + + _fileBrowserControlState = value; + fileSystemTreeView1.EndUpdate(); + } + fileSystemTreeView1.Select(); + fileSystemTreeView1.ShowRootLines = true; + break; case FileBrowserStateEnum.Hidden: break; } @@ -1599,13 +1816,13 @@ namespace JDP { private void btnStop_Click(object sender, EventArgs e) { - if ((_workThread != null) && (_workThread.IsAlive)) + if ((_workThread == null || _workThread.IsAlive) && _workClass != null) _workClass.Stop(); } private void btnPause_Click(object sender, EventArgs e) { - if ((_workThread != null) && (_workThread.IsAlive)) + if ((_workThread == null || _workThread.IsAlive) && _workClass != null) { _workClass.Pause(); btnPause.Visible = !btnPause.Visible; @@ -1646,7 +1863,7 @@ namespace JDP { List fileGroups = CUESheet.ScanFolder(_profile._config, e.files); foreach (FileGroupInfo fileGroup in fileGroups) { - TreeNode node = fileSystemTreeView1.NewNode(fileGroup.main, fileGroup.type == FileGroupInfoType.Folder); + TreeNode node = fileSystemTreeView1.NewNode(fileGroup.main); node.Text = fileGroup.ToString(); e.node.Nodes.Add(node); } @@ -1655,7 +1872,7 @@ namespace JDP { private void UpdateActions() { - if (FileBrowserState == FileBrowserStateEnum.DragDrop || FileBrowserState == FileBrowserStateEnum.Checkboxes) + if (FileBrowserState == FileBrowserStateEnum.DragDrop || FileBrowserState == FileBrowserStateEnum.Checkboxes || FileBrowserState == FileBrowserStateEnum.LocalDB) { rbActionCorrectFilenames.Enabled = true; rbActionCreateCUESheet.Enabled = true; @@ -1694,6 +1911,34 @@ namespace JDP { comboBoxScript.Enabled = btnConvert.Enabled && comboBoxScript.Items.Count > 1; } + private void DumpLocalDB(StringBuilder report, TreeNode parent) + { + if (parent is FileSystemTreeNodeLocalDBFolder) + { + foreach (var entry in (parent as FileSystemTreeNodeLocalDBFolder).Group) + if (entry.Path != null) + if (entry.Status == null || entry.OffsetSafeCRC == null) + report.AppendFormat("{0}: never verified\r\n", entry.Path); + else + report.AppendFormat("{0}: CRC {1,8:X}, {2}\r\n", entry.Path, entry.OffsetSafeCRC.Value[0], entry.Status); + } + else + { + foreach (TreeNode node in parent.Nodes) + if (node is FileSystemTreeNodeLocalDBEntry) + { + var entry = (node as FileSystemTreeNodeLocalDBEntry).Item; + if (entry.Path != null) + if (entry.Status == null || entry.OffsetSafeCRC == null) + report.AppendFormat("{0}: never verified\r\n", entry.Path); + else + report.AppendFormat("{0}: CRC {1,8:X}, {2}\r\n", entry.Path, entry.OffsetSafeCRC.Value[0], entry.Status); + } + else + DumpLocalDB(report, node); + } + } + private void fileSystemTreeView1_AfterSelect(object sender, TreeViewEventArgs e) { if (fileSystemTreeView1.SelectedPath != null) @@ -1701,6 +1946,20 @@ namespace JDP { InputPath = fileSystemTreeView1.SelectedPath; txtInputPath.SelectAll(); } + if (FileBrowserState == FileBrowserStateEnum.LocalDB && fileSystemTreeView1.SelectedNode != null) + { + if (fileSystemTreeView1.SelectedNode is FileSystemTreeNodeLocalDBEntry) + { + var entry = (fileSystemTreeView1.SelectedNode as FileSystemTreeNodeLocalDBEntry).Item; + textBatchReport.Text = (entry.Log ?? "").Replace("\r", "").Replace("\n", "\r\n"); + } + else + { + StringBuilder report = new StringBuilder(); + DumpLocalDB(report, fileSystemTreeView1.SelectedNode); + textBatchReport.Text = report.ToString(); + } + } } private void chkRecursive_CheckedChanged(object sender, EventArgs e) @@ -1764,11 +2023,14 @@ namespace JDP { foreach (string folder in folders) { TreeNode node = Directory.Exists(folder) - ? fileSystemTreeView1.NewNode(new DirectoryInfo(folder), true) - : fileSystemTreeView1.NewNode(new FileInfo(folder), false); + ? fileSystemTreeView1.NewNode(new DirectoryInfo(folder)) + : fileSystemTreeView1.NewNode(new FileInfo(folder)); fileSystemTreeView1.Nodes.Add(node); } break; + case FileBrowserStateEnum.LocalDB: + // ??? + break; } fileSystemTreeView1.Focus(); } @@ -1854,8 +2116,8 @@ namespace JDP { case FileBrowserStateEnum.DragDrop: fileSystemTreeView1.Nodes.Clear(); node = Directory.Exists(InputPath) - ? fileSystemTreeView1.NewNode(new DirectoryInfo(InputPath), true) - : fileSystemTreeView1.NewNode(new FileInfo(InputPath), false); + ? fileSystemTreeView1.NewNode(new DirectoryInfo(InputPath)) + : fileSystemTreeView1.NewNode(new FileInfo(InputPath)); fileSystemTreeView1.Nodes.Add(node); break; case FileBrowserStateEnum.Tree: @@ -1877,6 +2139,9 @@ namespace JDP { } fileSystemTreeView1.Select(); break; + case FileBrowserStateEnum.LocalDB: + // ??? + break; } } if (WindowState == FormWindowState.Minimized) @@ -1888,10 +2153,10 @@ namespace JDP { private void setAsMyMusicFolderToolStripMenuItem_Click(object sender, EventArgs e) { - DirectoryInfo dir = (DirectoryInfo)contextMenuStripFileTree.Tag; + var node = (contextMenuStripFileTree.Tag as CUEControls.FileSystemTreeNode); try { - fileSystemTreeView1.IconManager.SetFolderPath(CUEControls.ExtraSpecialFolder.MyMusic, dir.FullName); + fileSystemTreeView1.IconManager.SetFolderPath(CUEControls.ExtraSpecialFolder.MyMusic, node.Path); } catch (Exception ex) { @@ -1905,7 +2170,8 @@ namespace JDP { private void resetToOriginalLocationToolStripMenuItem_Click(object sender, EventArgs e) { - CUEControls.ExtraSpecialFolder dir = (CUEControls.ExtraSpecialFolder)contextMenuStripFileTree.Tag; + var node = (contextMenuStripFileTree.Tag as CUEControls.FileSystemTreeNode); + CUEControls.ExtraSpecialFolder dir = (node as CUEControls.FileSystemTreeNodeSpecialFolder).Folder; try { fileSystemTreeView1.IconManager.SetFolderPath(dir, null); @@ -1920,32 +2186,119 @@ namespace JDP { fileSystemTreeView1.SelectedNode.Expand(); } + private void addFolderToLocalDatabaseToolStripMenuItem_Click(object sender, EventArgs e) + { + var node = contextMenuStripFileTree.Tag as CUEControls.FileSystemTreeNode; + if (node == null || node.Path == null) + return; + SetupControls(true); + backgroundWorkerAddToLocalDB.RunWorkerAsync(node.Path); + } + + private void SaveDatabase() + { + SetStatus(this, new CUEToolsProgressEventArgs() { status = "Saving local database..." }); + try + { + _localDB.Save(); + } + catch (Exception ex) + { + if (this.InvokeRequired) + this.Invoke((MethodInvoker)(() => ShowErrorMessage(ex))); + else + this.ShowErrorMessage(ex); + } + SetStatus(this, new CUEToolsProgressEventArgs()); + } + + private void editMetadataToolStripMenuItem_Click(object sender, EventArgs e) + { + var node = contextMenuStripFileTree.Tag as CUEControls.FileSystemTreeNode; + string path = null; + if (node != null && node is FileSystemTreeNodeLocalDBEntry) + path = node.Path; + if (node != null && node is FileSystemTreeNodeLocalDBCollision) + path = (node as FileSystemTreeNodeLocalDBCollision).Group[0].Path; + if (path == null) + return; + var CueSheet = new CUESheet(_profile._config); + CueSheet.PasswordRequired += new EventHandler(PasswordRequired); + CueSheet.CUEToolsProgress += new EventHandler(SetStatus); + //cueSheet.CUEToolsSelection += new EventHandler(MakeSelection); + try + { + CueSheet.Open(path); + } + catch (Exception ex) + { + ShowErrorMessage(ex); + return; + } + CueSheet.UseLocalDB(_localDB); + frmChoice dlg = new frmChoice(); + dlg.CUE = CueSheet; + dlg.LookupAlbumInfo(true, true, true, node is FileSystemTreeNodeLocalDBEntry); + var dlgRes = dlg.ShowDialog(this); + if (dlgRes == DialogResult.OK && dlg.ChosenRelease != null) + { + if (node is FileSystemTreeNodeLocalDBCollision) + { + var group = (node as FileSystemTreeNodeLocalDBCollision).Group; + foreach (var item in group) + item.Metadata.CopyMetadata(dlg.ChosenRelease.metadata); + } + else if (node is FileSystemTreeNodeLocalDBEntry) + { + var item = (node as FileSystemTreeNodeLocalDBEntry).Item; + item.Metadata.CopyMetadata(dlg.ChosenRelease.metadata); + } + node.Text = node.DisplayName; + _localDB.Dirty = true; + SaveDatabase(); + } + CueSheet.Close(); + } + private void fileSystemTreeView1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { TreeViewHitTestInfo info = fileSystemTreeView1.HitTest(e.Location); - if (info.Node != null) + if (info.Node as CUEControls.FileSystemTreeNode != null) { - contextMenuStripFileTree.Tag = info.Node.Tag; + contextMenuStripFileTree.Tag = info.Node as CUEControls.FileSystemTreeNode; SelectedNodeName.Text = info.Node.Text; SelectedNodeName.Image = m_icon_mgr.ImageList.Images[info.Node.ImageIndex]; - if (info.Node.Tag is DirectoryInfo) + resetToOriginalLocationToolStripMenuItem.Visible = false; + setAsMyMusicFolderToolStripMenuItem.Visible = false; + editMetadataToolStripMenuItem.Visible = false; + addFolderToLocalDatabaseToolStripMenuItem.Visible = false; + removeItemFromDatabaseToolStripMenuItem.Visible = false; + if (info.Node is CUEControls.FileSystemTreeNodeFileSystemInfo && (info.Node as CUEControls.FileSystemTreeNodeFileSystemInfo).File is DirectoryInfo) { - resetToOriginalLocationToolStripMenuItem.Visible = false; setAsMyMusicFolderToolStripMenuItem.Visible = true; setAsMyMusicFolderToolStripMenuItem.Image = m_icon_mgr.ImageList.Images[m_icon_mgr.GetIconIndex(CUEControls.ExtraSpecialFolder.MyMusic, true)]; + addFolderToLocalDatabaseToolStripMenuItem.Visible = true; } - else if (info.Node.Tag is CUEControls.ExtraSpecialFolder && ((CUEControls.ExtraSpecialFolder)info.Node.Tag) == CUEControls.ExtraSpecialFolder.MyMusic) + else if (info.Node is CUEControls.FileSystemTreeNodeSpecialFolder && (info.Node as CUEControls.FileSystemTreeNodeSpecialFolder).Folder == CUEControls.ExtraSpecialFolder.MyMusic) { resetToOriginalLocationToolStripMenuItem.Visible = true; - setAsMyMusicFolderToolStripMenuItem.Visible = false; + } + else if (info.Node is FileSystemTreeNodeLocalDBCollision) + { + editMetadataToolStripMenuItem.Visible = true; + } + else if (info.Node as FileSystemTreeNodeLocalDBEntry != null) + { + editMetadataToolStripMenuItem.Visible = true; + //removeItemFromDatabaseToolStripMenuItem.Visible = true; } else return; fileSystemTreeView1.SelectedNode = info.Node; contextMenuStripFileTree.Show(fileSystemTreeView1, e.Location); - } + } } } @@ -2093,23 +2446,29 @@ namespace JDP { labelEncoderMode.Text = encoder.default_mode; } - private void toolStripButton1_Click(object sender, EventArgs e) - { - FileBrowserState = FileBrowserStateEnum.Tree; - SetupControls(false); - } + //private void toolStripButton1_Click(object sender, EventArgs e) + //{ + // FileBrowserState = FileBrowserStateEnum.Tree; + // SetupControls(false); + //} - private void toolStripButton2_Click(object sender, EventArgs e) - { - FileBrowserState = FileBrowserStateEnum.Checkboxes; - SetupControls(false); - } + //private void toolStripButton2_Click(object sender, EventArgs e) + //{ + // FileBrowserState = FileBrowserStateEnum.Checkboxes; + // SetupControls(false); + //} - private void toolStripButton3_Click(object sender, EventArgs e) - { - FileBrowserState = FileBrowserStateEnum.DragDrop; - SetupControls(false); - } + //private void toolStripButton3_Click(object sender, EventArgs e) + //{ + // FileBrowserState = FileBrowserStateEnum.DragDrop; + // SetupControls(false); + //} + + //private void toolStripButton5_Click(object sender, EventArgs e) + //{ + // FileBrowserState = FileBrowserStateEnum.Hidden; + // SetupControls(false); + //} private void toolStripButton4_Click(object sender, EventArgs e) { @@ -2117,12 +2476,6 @@ namespace JDP { SetupControls(false); } - private void toolStripButton5_Click(object sender, EventArgs e) - { - FileBrowserState = FileBrowserStateEnum.Hidden; - SetupControls(false); - } - private void toolStripButtonHelp_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start("http://www.cuetools.net"); @@ -2196,6 +2549,8 @@ namespace JDP { FileBrowserState = FileBrowserStateEnum.Checkboxes; if (e.ClickedItem == toolStripMenuItemInputBrowserDrag) FileBrowserState = FileBrowserStateEnum.DragDrop; + if (e.ClickedItem == toolStripMenuItemLocalDatabase) + FileBrowserState = FileBrowserStateEnum.LocalDB; if (e.ClickedItem == toolStripMenuItemInputBrowserHide) FileBrowserState = FileBrowserStateEnum.Hidden; SetupControls(false); @@ -2285,5 +2640,317 @@ namespace JDP { { SetupControls(false); } + + private void backgroundWorkerAddToLocalDB_DoWork(object sender, DoWorkEventArgs e) + { + var folder = e.Argument as string; + CUESheet cueSheet = new CUESheet(_profile._config); + cueSheet.CUEToolsProgress += new EventHandler(SetStatus); + cueSheet.UseLocalDB(_localDB); + _workThread = null; + _workClass = cueSheet; + cueSheet.ScanLocalDB(folder); + } + + private void backgroundWorkerAddToLocalDB_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + SetStatus(sender, new CUEToolsProgressEventArgs()); + SetupControls(false); + } + + private void removeItemFromDatabaseToolStripMenuItem_Click(object sender, EventArgs e) + { + var node = contextMenuStripFileTree.Tag as FileSystemTreeNodeLocalDBEntry; + if (node == null || node.Path == null) + return; + + _localDB.Remove(node.Item); + _localDB.Dirty = true; + SaveDatabase(); + node.Remove(); + } + } + + public class FileSystemTreeNodeLocalDBEntry : CUEControls.FileSystemTreeNode + { + private string m_input_path; + + public bool ShowArtist { get; set; } + public bool ShowYear { get; set; } + public CUEToolsLocalDBEntry Item { get; private set; } + public override string Path + { + get + { + return m_input_path ?? Item.Path; + } + } + + public override string DisplayName + { + get + { + if (m_input_path != null && File.Exists(m_input_path)) + return icon_mgr.GetDisplayName(new FileInfo(m_input_path)); + return + (string.IsNullOrEmpty(Item.Metadata.Artist) || !ShowArtist ? "" : Item.Metadata.Artist + " - ") + + Item.Metadata.Title + + (string.IsNullOrEmpty(Item.Metadata.Year) || !ShowYear ? "" : " (" + Item.Metadata.Year + ")") + + (string.IsNullOrEmpty(Item.Metadata.DiscNumberAndTotal) ? "" : " [" + Item.Metadata.DiscNumberAndTotal + "]"); + } + } + + public override int DisplayIcon + { + get + { + return icon_mgr.GetIconIndex(m_input_path ?? (Item.AudioPaths == null || Item.AudioPaths.Count == 0 ? "*.wav" : Item.AudioPaths[0])); + } + } + + public FileSystemTreeNodeLocalDBEntry(CUEControls.IIconManager icon_mgr, CUEToolsLocalDBEntry item, bool showArtist, bool showYear, string inputPath) + : base(icon_mgr, inputPath == null && item.InputPaths != null && item.InputPaths.Count > 1) + { + this.Item = item; + this.m_input_path = inputPath; + this.ShowArtist = showArtist; + this.ShowYear = showYear; + this.SelectedImageIndex = this.ImageIndex = this.DisplayIcon; + this.Text = this.DisplayName; + //// Choose state from m_state_image_list + //if (item.InputPaths.Find(path => Path.GetExtension(path).ToLower() == ".cue") != null) + // album.StateImageKey = "cue"; + //else + // album.StateImageKey = "blank"; + } + + public override void DoExpand() + { + if (Item.InputPaths != null) + foreach (var path in Item.InputPaths) + this.Nodes.Add(new FileSystemTreeNodeLocalDBEntry(icon_mgr, Item, ShowArtist, ShowYear, path)); + } + } + + public abstract class FileSystemTreeNodeLocalDBFolder : CUEControls.FileSystemTreeNode + { + public List Group { get; protected set; } + + public FileSystemTreeNodeLocalDBFolder(CUEControls.IIconManager icon_mgr) + : base(icon_mgr, true) + { + } + } + + public class FileSystemTreeNodeLocalDBCollision : FileSystemTreeNodeLocalDBFolder + { + public enum GroupType + { + Unverified = 0, + Different = 1, + Offsetted = 2, + Equal = 3, + Single = 4 + } + + public bool ShowArtist { get; set; } + public bool ShowYear { get; set; } + public override string Path + { + get + { + return null; + } + } + + public override string DisplayName + { + get + { + var artistItem = Group.Find(i => !string.IsNullOrEmpty(i.Metadata.Artist) && ShowArtist); + var titleItem = Group.Find(i => !string.IsNullOrEmpty(i.Metadata.Title)); + var yearItem = Group.Find(i => !string.IsNullOrEmpty(i.Metadata.Year) && ShowYear); + var discItem = Group.Find(i => !string.IsNullOrEmpty(i.Metadata.DiscNumberAndTotal)); + return + (artistItem == null ? "" : artistItem.Metadata.Artist + " - ") + + (titleItem == null ? "" : titleItem.Metadata.Title) + + (yearItem == null ? "" : " (" + yearItem.Metadata.Year + ")") + + (discItem == null ? "" : " [" + discItem.Metadata.DiscNumberAndTotal + "]"); + } + } + + public override int DisplayIcon + { + get + { + return icon_mgr.GetIconIndex(GroupTypeToIconTag(GetGroupType(Group))); + } + } + + public FileSystemTreeNodeLocalDBCollision(CUEControls.IIconManager icon_mgr, List group, bool showArtist, bool showYear) + : base(icon_mgr) + { + this.Group = group; + this.ShowArtist = showArtist; + this.ShowYear = showYear; + this.SelectedImageIndex = this.ImageIndex = this.DisplayIcon; + this.Text = this.DisplayName; + } + + internal static string GroupTypeToIconTag(GroupType type) + { + return type == GroupType.Equal ? ".#picture" + : type == GroupType.Offsetted ? ".#pictures" + : type == GroupType.Different ? ".#images" + : type == GroupType.Unverified ? ".#images_question" + : ".#puzzle"; + } + + internal static string GroupTypeToDescription(GroupType type) + { + return type == GroupType.Equal ? "Identical clones" + : type == GroupType.Offsetted ? "Offsetted clones" + : type == GroupType.Different ? "Mismatching clones" + : type == GroupType.Unverified ? "Not yet verified clones" + : "Unique"; + } + + internal static GroupType GetGroupType(List group) + { + if (group.Count < 2) + return GroupType.Single; + if (!group.TrueForAll(i => i.OffsetSafeCRC != null)) + return GroupType.Unverified; + if (!group.TrueForAll(i => i.OffsetSafeCRC.DifferByOffset(group[0].OffsetSafeCRC))) + return GroupType.Different; + if (!group.TrueForAll(i => i.OffsetSafeCRC == group[0].OffsetSafeCRC)) + return GroupType.Offsetted; + return GroupType.Equal; + } + + public override void DoExpand() + { + foreach (var item in Group) + this.Nodes.Add(new FileSystemTreeNodeLocalDBEntry(icon_mgr, item, ShowArtist, ShowYear, null)); + } + } + + public class FileSystemTreeNodeLocalDBGroup : FileSystemTreeNodeLocalDBFolder + { + private int m_icon; + private string m_name; + public bool ShowArtist { get; set; } + public bool ShowYear { get; set; } + public override string Path + { + get + { + return null; + } + } + + public override string DisplayName + { + get + { + return m_name; + } + } + + public override int DisplayIcon + { + get + { + return m_icon; + } + } + + public FileSystemTreeNodeLocalDBGroup(CUEControls.IIconManager icon_mgr, List group, bool showArtist, bool showYear, int icon, string name) + : base(icon_mgr) + { + this.Group = group; + this.m_icon = icon; + this.m_name = name; + this.ShowArtist = showArtist; + this.ShowYear = showYear; + this.SelectedImageIndex = this.ImageIndex = this.DisplayIcon; + this.Text = this.DisplayName; + } + + private static int Compare(List a, List b) + { + int diff = FileSystemTreeNodeLocalDBCollision.GetGroupType(a) - FileSystemTreeNodeLocalDBCollision.GetGroupType(b); + return diff != 0 ? diff : + String.Compare( + a[0].Metadata.Artist + " - " + a[0].Metadata.Title + " - " + a[0].Metadata.DiscNumberAndTotal, + b[0].Metadata.Artist + " - " + b[0].Metadata.Title + " - " + b[0].Metadata.DiscNumberAndTotal); + } + + public override void DoExpand() + { + var byDiscId = CUEToolsLocalDB.Group(Group, i => i.DiscID, (a, b) => Compare(a,b)); + foreach (var group in byDiscId) + { + if (group.Count > 1) + this.Nodes.Add(new FileSystemTreeNodeLocalDBCollision(icon_mgr, group, ShowArtist, ShowYear)); + else + this.Nodes.Add(new FileSystemTreeNodeLocalDBEntry(icon_mgr, group[0], ShowArtist, ShowYear, null)); + } + } + } + + public class FileSystemTreeNodeLocalDBCategory : FileSystemTreeNodeLocalDBFolder + { + private Converter m_converter_key; + private Converter m_converter_name; + private Converter m_converter_icon; + private int m_icon; + private string m_name; + public bool ShowArtist { get; set; } + public bool ShowYear { get; set; } + public override string Path + { + get + { + return null; + } + } + + public override string DisplayName + { + get + { + return m_name; + } + } + + public override int DisplayIcon + { + get + { + return m_icon; + } + } + + public FileSystemTreeNodeLocalDBCategory(CUEControls.IIconManager icon_mgr, List group, bool showArtist, bool showYear, int icon, string name, Converter converter_key, Converter converter_name, Converter converter_icon) + : base(icon_mgr) + { + this.Group = group; + this.m_converter_key = converter_key; + this.m_converter_name = converter_name ?? converter_key; + this.m_converter_icon = converter_icon ?? (i => m_icon); + this.m_icon = icon; + this.m_name = name; + this.ShowArtist = showArtist; + this.ShowYear = showYear; + this.SelectedImageIndex = this.ImageIndex = this.DisplayIcon; + this.Text = this.DisplayName; + } + + public override void DoExpand() + { + foreach (var group in CUEToolsLocalDB.Group(Group, m_converter_key, null)) + this.Nodes.Add(new FileSystemTreeNodeLocalDBGroup(icon_mgr, group, ShowArtist, ShowYear, m_converter_icon(group[0]), m_converter_name(group[0]))); + } } } diff --git a/CUETools/frmCUETools.de-DE.resx b/CUETools/frmCUETools.de-DE.resx index 4661ae0..bc03526 100644 --- a/CUETools/frmCUETools.de-DE.resx +++ b/CUETools/frmCUETools.de-DE.resx @@ -280,7 +280,7 @@ &Fortsetzen - + Verwende CUETools-Datenbank diff --git a/CUETools/frmCUETools.resx b/CUETools/frmCUETools.resx index c5e5072..b43f1a6 100644 --- a/CUETools/frmCUETools.resx +++ b/CUETools/frmCUETools.resx @@ -271,7 +271,7 @@ fileSystemTreeView1 - CUEControls.FileSystemTreeView, CUEControls, Version=2.0.9.0, Culture=neutral, PublicKeyToken=null + CUEControls.FileSystemTreeView, CUEControls, Version=2.1.1.0, Culture=neutral, PublicKeyToken=null grpInput @@ -312,6 +312,141 @@ 3 + + 3 + + + True + + + Fill + + + NoControl + + + 99, 3 + + + 42, 29 + + + 2 + + + 153, 8 + + + Skip recently verified + + + checkBoxSkipRecent + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanelVerifyMode + + + 0 + + + True + + + Fill + + + NoControl + + + 51, 3 + + + 42, 29 + + + 1 + + + Use local database + + + checkBoxVerifyUseLocal + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanelVerifyMode + + + 1 + + + True + + + Fill + + + NoControl + + + 3, 3 + + + 42, 29 + + + 0 + + + Use CTDB (CUETools database) + + + checkBoxVerifyUseCDRepair + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanelVerifyMode + + + 2 + + + Fill + + + 3, 17 + + + 2 + + + 144, 110 + + + 2 + + + tableLayoutPanelVerifyMode + + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBoxMode + + + 0 + + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="checkBoxSkipRecent" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="checkBoxVerifyUseLocal" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="checkBoxVerifyUseCDRepair" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,33,33333,Percent,33,33333,Percent,33,33333,Absolute,20" /><Rows Styles="Percent,32,72727,Percent,67,27273" /></TableLayoutSettings> + 3 @@ -336,9 +471,6 @@ 5 - - 153, 8 - Use AccurateRip @@ -571,7 +703,7 @@ groupBoxMode - 0 + 1 <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="checkBoxUseAccurateRip" Row="4" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="checkBoxUseFreeDb" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="rbTracks" Row="2" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="rbEmbedCUE" Row="0" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="rbSingleFile" Row="1" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="checkBoxUseMusicBrainz" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,33,33332,Percent,33,33334,Percent,33,33334" /><Rows Styles="Percent,18,18229,Percent,18,18229,Percent,18,18229,Percent,22,72658,Percent,22,72658" /></TableLayoutSettings> @@ -652,74 +784,8 @@ groupBoxMode - 1 - - 2 - - True - - - Fill - - - NoControl - - - 3, 3 - - - 45, 29 - - - 0 - - - checkBoxVerifyUseCDRepair - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tableLayoutPanelVerifyMode - - - 0 - - - Fill - - - 3, 17 - - - 2 - - - 144, 110 - - - 2 - - - Use CUETools database - - - tableLayoutPanelVerifyMode - - - System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBoxMode - - - 2 - - - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="checkBoxVerifyUseCDRepair" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,36,11111,Percent,63,88889" /><Rows Styles="Percent,32,72727,Percent,67,27273" /></TableLayoutSettings> - Fill @@ -1314,6 +1380,12 @@ Drag'n'drop mode + + 177, 22 + + + Local database + 177, 22 @@ -2359,28 +2431,46 @@ False - 205, 22 + 223, 22 Selected file - 202, 6 + 220, 6 - 205, 22 + 223, 22 Set as My Music folder - 205, 22 + 223, 22 Reset to original location + + 223, 22 + + + Edit metadata + + + 223, 22 + + + Add folder to local database + + + 223, 22 + + + Remove item from database + - 206, 76 + 224, 142 contextMenuStripFileTree @@ -2388,11 +2478,14 @@ System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 845, 8 + True - 29 + 30 6, 13 @@ -2804,7 +2897,7 @@ 700, 538 - CUETools 2.0.9 + CUETools 2.1.1 toolStripStatusLabel1 @@ -2896,6 +2989,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + toolStripMenuItemLocalDatabase + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + toolStripMenuItemInputBrowserHide @@ -3022,6 +3121,30 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + editMetadataToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addFolderToLocalDatabaseToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + removeItemFromDatabaseToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + backgroundWorkerAddToLocalDB + + + System.ComponentModel.BackgroundWorker, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + frmCUETools diff --git a/CUETools/frmChoice.Designer.cs b/CUETools/frmChoice.Designer.cs index 707685a..ffb324f 100644 --- a/CUETools/frmChoice.Designer.cs +++ b/CUETools/frmChoice.Designer.cs @@ -46,6 +46,7 @@ namespace JDP this.columnHeader3 = new System.Windows.Forms.ColumnHeader(); this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); this.tableLayoutPanel1.SuspendLayout(); this.tableLayoutPanel2.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); @@ -181,16 +182,21 @@ namespace JDP this.pictureBox1.TabStop = false; this.pictureBox1.DoubleClick += new System.EventHandler(this.pictureBox1_DoubleClick); // + // backgroundWorker1 + // + this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); + this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted); + // // frmChoice // this.AcceptButton = this.buttonOk; resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.tableLayoutPanel1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.MaximizeBox = false; this.Name = "frmChoice"; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.ShowIcon = false; + this.ShowInTaskbar = false; this.Load += new System.EventHandler(this.frmChoice_Load); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmChoice_FormClosing); this.tableLayoutPanel1.ResumeLayout(false); @@ -219,5 +225,6 @@ namespace JDP private System.Windows.Forms.ColumnHeader columnHeader2; private System.Windows.Forms.ColumnHeader columnHeader3; private System.Windows.Forms.PictureBox pictureBox1; + private System.ComponentModel.BackgroundWorker backgroundWorker1; } } \ No newline at end of file diff --git a/CUETools/frmChoice.cs b/CUETools/frmChoice.cs index 93e42a7..96b414f 100644 --- a/CUETools/frmChoice.cs +++ b/CUETools/frmChoice.cs @@ -20,6 +20,18 @@ namespace JDP public CUESheet CUE; + private bool freedb, musicbrainz; + + public void LookupAlbumInfo(bool freedb, bool musicbrainz, bool cache, bool cue) + { + this.freedb = freedb; + this.musicbrainz = musicbrainz; + var releases = CUE.LookupAlbumInfo(false, false, cache, cue); + this.Choices = releases; + if (freedb || musicbrainz) + backgroundWorker1.RunWorkerAsync(null); + } + private void frmChoice_Load(object sender, EventArgs e) { buttonOk.Select(); @@ -117,7 +129,7 @@ namespace JDP } } - private CUEMetadataEntry ChosenRelease + public CUEMetadataEntry ChosenRelease { get { @@ -136,12 +148,15 @@ namespace JDP private void frmChoice_FormClosing(object sender, FormClosingEventArgs e) { + if (backgroundWorker1.IsBusy) + { + e.Cancel = true; + return; + } CUEMetadataEntry ri = ChosenRelease; if (e.CloseReason != CloseReason.None || DialogResult != DialogResult.OK || ri == null || CUE == null) return; CUE.CopyMetadata(ri.metadata); - if (CUE.Config.advanced.CacheMetadata) - ri.metadata.Save(); } private void AutoResizeTracks() @@ -282,5 +297,16 @@ namespace JDP pictureBox1.SizeMode = pictureBox1.SizeMode == PictureBoxSizeMode.Zoom ? PictureBoxSizeMode.CenterImage : PictureBoxSizeMode.Zoom; } + + private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) + { + e.Result = CUE.LookupAlbumInfo(this.freedb, this.musicbrainz, false, false); + } + + private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + foreach (object i in (e.Result as List)) + AddItem(i); + } } } diff --git a/CUETools/frmChoice.de-DE.resx b/CUETools/frmChoice.de-DE.resx index a70d31d..89d4227 100644 --- a/CUETools/frmChoice.de-DE.resx +++ b/CUETools/frmChoice.de-DE.resx @@ -120,61 +120,6 @@ OK - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAo - CwAAAk1TRnQBSQFMAgEBBAEAAQwBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo - AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA - AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 - AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA - AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm - AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM - AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA - ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz - AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ - AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM - AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA - AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA - AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ - AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ - AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA - AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm - ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ - Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz - AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA - AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM - AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM - ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM - Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA - AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM - AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ - AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz - AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm - AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw - AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8ACgAG6wUA - EAQBAAF6AlELegYABusIAAHvAesB7wTzAe8B6wHvAwAEBAP/AQcB7AP/AewDBAFRAQABEQETAQABDwp6 - AwAB7wHrAe8E8wHvAesB7wUAAusB7wbzAe8C6wIAAwQCBwEEAf8BBwHsAf8BBAHsAf8DBAEAAbwD/wET - AQ8JegIAAusB7wbzAe8C6wMAAe8B6wrzAesB7wEAAwQBBwHsAQQCBwHsAf8CBAH/AwQBAAG8BP8BAAl6 - AQAB7wHrCvMB6wHvAQAB7wHrDPMB6wHvAwQB7AH/AQQB/wEHAewB/wHsAf8BBwMEAVEBDwHrAgcBvAEA - AREEAAERA3oBAAHrDPMB6wEAAesB7wzzAe8B6wQEAuwCBwHsAf8C7AQEAXoBUQEPAgAB/wEAAQ8B9wL/ - AZICEQJ6AesO8wLrAfMDAAHzAQAC8wEAAfMB7wIAAfMB6wYEAgcB7AH/BgQEegEAAf8BAAERBP8BvAEA - AnoB6wHzAesCAAHzAesCAAHrAfMDAAHzAusB8wEAA/MBAALzAQAB8wEAA/MB6xAEBK4BAAH/AgABEwG8 - A/8BAAKuAesB8wEAA/MBAALzAQAB8wEAA/MC6wHzAgAC8wQAAfMBAAPzAesQ/wSuAQAB/wEAARIBDwMA - Af8BAAKuAesB8wEAA/MBAALzAQAB8wIAAvMC6wHzAQAD8wEAAvMBAAHzAQAD8wHrAf8BBAEHAf8BBAL/ - AwQBBwH/AwQB/wSuAQAB/wEPAQABEQISAQAB/wEAAq4B6wHzAQAD8wEAAvMBAAHzAQAD8wLrAe8DAAHz - Ae8CAAHvAfMB7wIAAe8B6wH/AQQBBwH/AQQC/wEEA/8BBwEEAf8BBwH/BK4BAAL/AZIBEQEAAQ8BAAH/ - AQACrgHrAfMB6wIAAfMBAALzAQAB8wMAAfMB6wHvAesM8wHrAe8B/wEEAQcB/wEEAv8BBALsAQQBBwEE - AewCBASuAQABBwP/AbwB6gEAAf8BAAKuAQAB6wzzAesCAAHvAesK8wHrAe8BAAH/AQQB7AH/AgQBBwEE - AQcB7AEEAf8BBAEHAQQBBwSuAREBEwEHBv8BAAKuAQAB7wHrCvMB6wHvAwAC6wHvBvMB7wLrAgAB/wEE - AewB/wMHAf8B7AEHA/8B7AEHAf8FrgERAQABEQGSBP8BAAKuAgAC6wHvBvMB7wLrBQAB7wHrAe8E8wHv - AesB7wMAAf8CBAHsDP8HrgERAQABDwHrAbwB/wEAAq4DAAHvAesB7wTzAe8B6wHvBwAB7wbrAe8EABD/ - AQAJrgEPAQABEwERAa4GAAbrBQABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EA - AfgBHwIAAYABAQH4AR8B4AEHBAAB4AEHAcABAwQAAcABAwGAAQEEAAGAAQEGAAGAAQE2AAGAAQEBgAEB - BAABgAEBAcABAwQAAcABAwHgAQcEAAHgAQcB8AEPAgABgAEBAfgBHws= - - Titel diff --git a/CUETools/frmChoice.resx b/CUETools/frmChoice.resx index 315b585..478231d 100644 --- a/CUETools/frmChoice.resx +++ b/CUETools/frmChoice.resx @@ -126,7 +126,7 @@ 456, 3 - 110, 32 + 110, 28 @@ -157,7 +157,7 @@ 3, 3 - 569, 85 + 569, 114 17, 17 @@ -166,119 +166,115 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAC - GgAAAk1TRnQBSQFMAgEBBgEAAQwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABIAMAAQEBAAEgBgABIB4AAh4BHQEqAj8BNwF3Ah4BHQEq8AACHgEdASkCQgE6AXQC/wHwAf8CQgE6 - AXQCHgEdASnoAAIeAR0BKAJGAT4BcQL/AfAB/wLpAdoD/wHxAf8CRgE+AXECHgEdASggAAI2ATIBWQJA - ATcBdgJAATcBdgIvASwBSwQAAi8BLAFLAkABNwF2AkABNwF2AkABNwF2AkABNwF2Ai8BLAFLBAACLwEs - AUsCQAE3AXYCQAE3AXYCNgEyAVmAAAIeAR0BJwJIAUEBbwL/AfAB/wHrAd0BsQH/AfcBwQE4Af8B7QHf - AbMD/wHyAf8CSAFBAW8CHgEdASccAAJFAT0BcgL5AekB/wLzAeMB/wJzAWUBtQI9ATQBeAKLAX0BwwLz - AeMB/wLzAeMB/wLzAeMB/wLzAeMB/wKLAX0BwwI9ATQBeAJzAWUBtQLzAeMB/wL5AekB/wJFAT0BcoAA - AkkBQQFuAv8B8AH/AukB2gH/AecBqwEiAf8B5wGrASIB/wHnAasBIgH/AeoB2wGwA/8B9AH/AkkBQQFu - Ah4BHQEnGAACSAFBAW8C9AHmAf8C6QHaAf8C7wHgAf8C9AHmAf8C7wHgAf8C6QHaAf8C6QHaAf8C6QHa - Af8C6QHaAf8C7wHgAf8C9AHmAf8C7wHgAf8C6QHaAf8C9AHmAf8CSAFBAW+AAAIeAR0BJwJKAUIBbQL/ - AfEB/wHnAdcBqwH/AdcBlgENAf8B1wGWAQ0B/wHXAZYBDQH/AegB2AGuA/8B9QH/AkoBQgFtAh4BHQEn - FAACSQFCAW4C9gHoAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHe - Af8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C9gHoAf8CSQFCAW6EAAIdARwBJgJKAUMBbAL/AfIB/wHl - AdQBqQH/Ac0BiQEAAf8BzQGJAQAB/wHNAYkBAAH/AegB1wGvA/8B9wH/AkoBQwFsAh0BHAEmEAACSgFD - AW0C9wHsAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHjAf8C7gHj - Af8C7gHjAf8C7gHjAf8C7gHjAf8C9wHsAf8CSgFDAW2IAAIdARwBJgJKAUMBawL/AfQB/wHnAdYBrAH/ - AdEBjgEFAf8B0QGOAQUB/wHRAY4BBQH/AewB2wGzA/8B+AH/AkoBQwFrAh0BHAEmDAACSgFDAWsC+QHv - Af8C8QHoAf8C8QHoAf8C8QHoAf8C8QHoAf8C8QHoAf8DAAH/AVABhQGTAf8BuALLAf8C8QHoAf8C8QHo - Af8C8QHoAf8C8QHoAf8C+QHvAf8CSgFDAWuMAAIdARwBJgJLAUQBawL/AfUB/wHrAdwBswH/Ad8BoQEY - Af8B3wGhARgB/wHfAaEBGAH/AfEB4gG7A/8B+gH/AksBRAFrAx0BJggAAksBRAFqAvoB8wH/AvUB7gH/ - AvUB7gH/AvUB7gH/AvUB7gH/AvUB7gH/AXsBsQHAAf8B2QH0Av8BPgGcAasB/wG1AdMB1AH/AvUB7gH/ - AvUB7gH/AvUB7gH/AvoB8wH/AksBRAFqkAADHQEmAkwBRQFqAv8B9wH/AfIB5AG7Af8B8AG4AS8B/wHw - AbgBLwH/AfABuAEvAf8C+AH0A/8B+wH/AkwBRQFqAh0BHAElBAACTAFFAWkC/AH3Af8C+AHzAf8C+AHz - Af8C+AHzAf8C+AHzAf8C+AHzAf8B1AHmAecB/wFIAbQBwwH/AXgB5gH3Af8BPwGdAa0B/wG2AdUB1wH/ - AvgB8wH/AvgB8wH/AvwB9wH/AkwBRQFplAACHQEcASUCTAFFAWkC/wH4Af8B9wHqAcMB/wH9AckBQAH/ - AfkB7AHHAf8C+wH3Af8C/AH5A/8B/AH/AkwBRQFpAh0BHAElAkwBRQFoAv0B+gH/AvsB9wH/AvsB9wH/ - AvsB9wH/AvsB9wH/AvsB9wH/AvsB9wH/Ab4B5QHoAf8BSQG1AcUB/wF4AeYB9wH/AUABngGuAf8BuQHY - AdsB/wL7AfcB/wL9AfoB/wJMAUUBaJgAAh0BHAElAkwBRQFoAv8B+gH/AvgB9AH/AvsB9wH/AugB3gH/ - AtgByQH/AugB3gP/Af4B/wJMAUUBaAJNAUcBaAL+Af0B/wL9AfsB/wL9AfsB/wL9AfsB/wL9AfsB/wL9 - AfsB/wL9AfsB/wL9AfsB/wHAAeYB6wH/AUoBtQHGAf8BeAHmAfcB/wFAAZ4BrwH/Ab4B2AHcAf8C/gH9 - Af8CTQFHAWicAAIdARwBJQJNAUYBaAL/AfsB/wL8AfkB/wLLAbsB/wQAAssBvAP/Af4B/wJNAUYBaAJO - AUcBZyT/AcEB6AHuAf8BSgG2AccB/wF4AeYB9wH/A5MB/wPVAf8CTgFHAWegAAIdARwBJQJNAUYBZwL/ - AfwB/wLUAcoB/wKvAZ8B/wLUAcsD/wH+Af8CTQFGAWcCOwE3AU0CTgFHAWYCTgFHAWYCTgFHAWYCTgFH - AWYCTgFHAWYCTgFHAWYCTgFHAWYCTgFHAWYCTgFHAWYCTgFHAWYBVQFmAWABjAJeAVgBpwP3Af8CSQFY - AbsCRgFVAXqkAAMcASQCTgFHAWcC/wH+A/8B/gP/Af4F/wJOAUcBZzAAAxsBJAJBAU4BfAKAAv8CJwGM - AcGoAAMcASQCTgFHAWYCTgFHAWYCTgFHAWYCTgFHAWYCOwE4AU00AAImASwBOQItAZUBrwInATQBQIwA - AwIBAwMUARwDMAFMA0QBeQNQAZoDUAGkA1ABmgNEAXkDMAFMAxQBHAMDAQQIAAOWAf8BHgIAAf8BHgIA - Af8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIAAf8BHgIA - Af8BHgIAAf8BHgIAAf8BHgIAAf8EAAFRAcwC/wEeApkB/wEeApkB/wFRAcwC/wFRAcwC/wFRAcwC/wFR - AcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/xAAAwIBAwMUARwDMAFM - A0QBeQNQAZoDUAGkA1ABmgNEAXkDMAFMAxQBHAMDAQQQAAMEAQYDJAE2A1MBsAFjAl4B5QF5AmIB+wGz - AqkB/wF5AmoB+wNgAesDWgHTA1MBrANHAYIDKAE8AwcBCQQAAcwCmQH/AYACAAH/AYACAAH/AYACAAH/ - AYACAAH/A+oB/wPqAf8D6gH/AYACAAH/A+oB/wPqAf8D6gH/AYACAAH/AYACAAH/AVECAAH/AR4CAAH/ - AR4CmQH/AwAB/wMUAf8DOAH/AwAB/wMHAf8BUQHMAv8BUQHMAv8BUQHMAv8BUQHMAv8BUQHMAv8BUQHM - Av8BUQHMAv8BUQHMAv8BUQHMAv8BUQHMAv8IAAMEAQYDJAE2A1MBsAFjAl4B5QF5AmIB+wGzAqkB/wF5 - AmoB+wNgAesDWgHTA1MBrANHAYIDKAE8AwcBCQgAAwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/ - Au4C/wLzAf8DzwH/A18B8wNYAcYDTAGSAygBPAMDAQQBzAKZAf8BgAIAAf8BgAIAAf8BgAIAAf8D8QH/ - AYACAAH/AYACAAH/A/EB/wGAAgAB/wPxAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/AR4CAAH/ - AwAB/wPMDf8DOAH/AwcB/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFR - AcwC/wFRAcwC/wQAAwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/A18B8wNY - AcYDTAGSAygBPAMDAQQEAAMmATgDbQH3AfUCxwL/AtIC/wLYAv8C3QL/AuIC/wLoAv8C9AX/A/UB/wOE - AfsDWAHGA0cBggMUARwBzAKZAf8BmQEAAR4B/wGAAgAB/wGAAgAF/wGAAgAB/wGAAgAF/wGAAgAF/wGA - AgAB/wGAAgAF/wGAAgAB/wGAAgAB/wEeAgAB/wMAAf8DzBH/AwAB/wFRAcwC/wFRAcwC/wFRAcwC/wFR - AcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wQAAyYBOANtAfcB9QLHAv8C0gL/AtgC/wLd - Av8C4gL/AugC/wL0Bf8D9QH/A4QB+wNYAcYDRwGCAxQBHAMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/ - AtgC/wLdAv8C4gL/AvoJ/wP1Af8DXwHzA1MBrAMwAUwBzAKZAf8BmQEAAR4B/wGAAgAB/wGAAgAB/wGA - AgAN/wGAAgAN/wGAAgAB/wGAAgAB/wGAAgAB/wEeAgAB/wEeApkB/wMHAf8DYgH/A8AB/wPAAf8DzAH/ - AwAB/wMUAf8DAAH/AwAB/wMAAf8DAAH/AxQB/wFRAcwC/wFRAcwC/wFRAcwC/wMHAQkDXgHdAfUCzQL/ - As8C/wLNAv8C0gL/AtgC/wLdAv8C4gL/AvoJ/wP1Af8DXwHzA1MBrAMwAUwDPgFqAcYCsQL/AtkC/wLU - Av8CzwL/As0C/wHUAdsC/wHXAeIC/wHkAeoR/wHSAswB/wNaAdMDQwF3AcwCmQH/AZkBAAEeAf8BgAIA - Af8BgAIAAf8BgAIAAf8BgAIAAf8BgAIABf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIA - Af8BHgIAAf8BUQHMAv8BHgKZAf8DBwH/AwAB/wMABf8DAAH/AwcB/wGkAqAJ/wOZAf8DFAH/AxQB/wFR - AcwC/wFRAcwC/wM+AWoBxgKxAv8C2QL/AtQC/wLPAv8CzQL/AdQB2wL/AdcB4gL/AeQB6hH/AdICzAH/ - A1oB0wNDAXcDVgG2Af8C4wH/AQABGQEaAf8BAAEZARoB/wEAARkBGgL/Ad4B5wH/AQABGQEaAv8B0QHz - Af8BAAEZARoC/wH4Av8BWQJfAf8BAAEZARoB/wFZAl8B/wHMApkB/wFcAlUB6gNOAZQBzAKZAf8BmQEA - AR4B/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAB/wGAAgAB/wGA - AgAB/wGAAgAB/wEeAgAB/wFRAcwC/wFRAcwC/wFRAcwC/wFRAcwC/wMABf8DAAH/AxQR/wPMAf8DAAH/ - AVEBzAL/AVEBzAL/A1YBtgH/AuMB/wFZAl8B/wEAARkBGgH/AVkCXwL/Ad4B5wH/AVkCXwH/AQABGQEa - Af8BWQJfAv8B+AL/AQABGQEaAf8BAAEZARoB/wEAARkBGgH/AcwCmQH/AVwCVQHqA04BlANhAeIB/wLn - Af8BAAEZARoC/wLeAv8C4AL/Ae8B/AH/AQABGQEaAv8B4gH8Af8BAAEZARoB/wH8AfAB+QH/AQABGQEa - Af8BzAKZAf8BAAEZARoB/wHMApkB/wFtAmwB9wNRAaEBzAKZAf8BmQEAAR4B/wGAAgAB/wGAAgAB/wGA - AgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGA - AgAB/wEeAgAB/wGZAlEB/wGZAlEB/wGZAlEB/wGZAlEB/wMABf8DAAH/AwAB/wM4Af8DzA3/AwAB/wGZ - AlEB/wGZAlEB/wNhAeIB/wLnAf8BAAEZARoC/wLeAf8BAAEZARoC/wHvAfwB/wEAARkBGgL/AeIB/AH/ - AQABGQEaAf8B/AHwAfkB/wEAARkBGgH/AcwCmQH/AcwCmQH/AcwCmQH/AW0CbAH3A1EBoQGeAowB/wHp - Ar4B/wEAARkBGgH/AQABGQEaAf8B+QLWAv8B6QHzAf8BAAEZARoB/wEAARkBGgH/AQABGQEaAf8B+QHo - AewB/wEAARkBGgH/AeYCugH/AeYCvQH/AeYCwAH/AaYClAH/A04BlDT/A/EB/wPqAf8DgAH/AZkCUQH/ - AZkCUQH/AZkCUQH/AZkCUQH/AwAF/wMAAf8DQAH/AwcB/wMAAf8DAAH/AwAF/wMAAf8BmQJRAf8BmQJR - Af8BngKMAf8B6QK+Af8BAAEZARoB/wHzAsUB/wH5AtYC/wHpAfMB/wEAARkBGgL/AekB8wH/AQABGQEa - Af8B+QHoAewB/wEAARkBGgH/AQABGQEaAf8B5gK9Af8B5gLAAf8BpgKUAf8DTgGUA10B0gHbAqgB/wEA - ARkBGgH/AeoCtwH/AfMCzQL/Ae4B/AH/AQABGQEaAv8B0gH1Af8BAAEZARoC/wH0AfwB/wEAARkBGgL/ - AtgB/wEAARkBGgL/AuIB/wNiAfYDQwF3BP8BmQEAAR4J/wGAAgAN/wGAAgAB/wGAAgAN/wGAAgAB/wGA - AgAB/wOAAf8BmQJRAf8BmQJRAf8BmQJRAf8BmQJRAf8DAAX/AwcB/wMAAf8DFAH/A0AB/wNAAf8DAAX/ - AwAB/wGZAlEB/wGZAlEB/wNdAdIB2wKoAf8BAAEZARoB/wHqArcB/wEAARkBGgL/Ae4B/AH/AQABGQEa - Av8B0gH1Af8BAAEZARoC/wH0AfwB/wEAARkBGgL/AtgC/wLdAv8C4gH/A2IB9gNDAXcDVgGxAdUCogH/ - AQABGQEaAf8BAAEZARoB/wEAARkBGgL/AfYC/wFZAl8B/wEAARkBGgH/AVkCXwL/AeAB5wH/AVkCXwH/ - AQABGQEaAf8BWQJfAv8C3QH/A1oB5AMwAUwE/wGZAQABHgn/AYACAAn/AYACABH/AYACAAH/A/EB/wPq - Af8DgAH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AwAJ/wOZAf8DFAH/AwAB/wMHAf8DAAX/AwAB/wGZ - AlEB/wGZAlEB/wNWAbEB1QKiAf8BWQJfAf8BAAEZARoB/wFZAl8C/wH2Av8BAAEZARoC/wHSAfUB/wEA - ARkBGgL/AeAB5wH/AQABGQEaAf8BAAEZARoB/wEAARkBGgL/At0B/wNaAeQDMAFMAzIBUAHDAr8S/wHs - AfEC/wHbAecC/wHZAd4C/wLUAv8CzwL/As0C/wLSAf8BxgKtAf8DUwGsAxQBGwT/AZkBAAEeCf8BgAIA - Cf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BHgIAAf8BmQJRAf8BmQJR - Af8BmQJRAf8BmQJRAf8DAAH/A8AN/wPMAf8DSgH/AwAF/wMAAf8BmQJRAf8BmQJRAf8DMgFQAcMCvxL/ - AewB8QL/AdsB5wL/AdkB3gL/AtQC/wLPAv8CzQL/AtIB/wHGAq0B/wNTAawDFAEbBAADWgHAA/UK/wL+ - Av8C5wL/AuMC/wLeAv8C2QL/AtQC/wLPAf8B9QLHAf8DXwHjAyMBNAMCAQME/wGZAQABHgH/AYACAAX/ - AYACAAn/AYACAAn/AYACAAX/AYACAAH/A/EB/wPqAf8BHgIAAf8BmQJRAf8BmQJRAf8BmQJRAf8BmQJR - Af8DFAH/AzgB/wPAGf8DAAH/AZkCUQH/AZkCUQH/BAADWgHAA/UK/wL+Av8C5wL/AuMC/wLeAv8C2QL/ - AtQC/wLPAf8B9QLHAf8DXwHjAyMBNAMCAQMEAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/ - AtkB/wH1As0B/wNtAfcDMAFNAwQBBgQABP8BmQIeCf8BgAIAAf8BgAIACf8BgAIAAf8BgAIADf8BgAIA - Af8BgAIAAf8DhgH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AxQB/wMAAf8DFAH/A5kR/wMA - Af8BmQJRAf8BmQJRAf8EAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNt - AfcDMAFNAwQBBgwAAxcBIANaAcADxgL/AvcC/wLyAv8C7AL/AucC/wLjAf8BxgKxAf8DXgHQAyQBNgMC - AQMIAAT/AZkCHi3/A/EB/wPqAf8DhgH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/ - AZkCUQH/AxQB/wMAAf8DBwH/A2IB/wPMBf8DAAH/AZkCUQH/AZkCUQH/CAADFwEgA1oBwAPGAv8C9wL/ - AvIC/wLsAv8C5wL/AuMB/wHGArEB/wNeAdADJAE2AwIBAxgAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANU - AaYDNwFaAwUBBxAACP8BzAKZLf8D8QH/A8AB/wQAAZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/ - AZkCUQH/AZkCUQH/AZkCUQH/AZkCUQH/AwcB/wMAAf8DOAH/AxQB/wGZAlEB/xQAAzIBUANRAaIDXQHS - AYwCiQH/A2AB1ANUAaYDNwFaAwUBBxAAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYA - A/8BAAHjA/8EAAHBA/8EAAGAAf8BCAEQBQABfwcAAT8HAAEfBgABgAEPBgABwAEHBgAB4AEDBgAB8AEB - BgAB+AcAAfwHAAH+AQgGAAH/BwAB/wGAAf8B8AQAAf8BwAH/AfgEAAHgAQMCAAGAAQEB4AEDAcABAQQA - AcABAQGABQABgAEAAYAFAAGAQQABgAUAAYABAAGAAQEEAAGAAQEBwAEDBAABwAEDAfABDwIAAYABAQHw - AQ8L + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAy + GQAAAk1TRnQBSQFMAgEBBgEAAQwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABIAMAAQEBAAEgBgABIB4AAx0BKgJDAUIBdwMdASrwAAMdASkCQgFBAXQC/wHwAf8CQgFBAXQDHQEp + 6AADHAEoA0ABcQL/AfAB/wLpAdoD/wHxAf8DQAFxAxwBKCAAAzYBWQNCAXYDQgF2AzABSwQAAzABSwNC + AXYDQgF2A0IBdgNCAXYDMAFLBAADMAFLA0IBdgNCAXYDNgFZgAADHAEnA0ABbwL/AfAB/wHrAd0BsQH/ + AfcBwQE2Af8B7QHfAbMD/wHyAf8DQAFvAxwBJxwAA0EBcgL5AekB/wLzAeMB/wJeAVsBtQNDAXgCawFn + AcMC8wHjAf8C8wHjAf8C8wHjAf8C8wHjAf8CawFnAcMDQwF4Al4BWwG1AvMB4wH/AvkB6QH/A0EBcoAA + A0ABbgL/AfAB/wLpAdoB/wHnAasBIAH/AecBqwEgAf8B5wGrASAB/wHqAdsBsAP/AfQB/wNAAW4DHAEn + GAADQAFvAvQB5gH/AukB2gH/Au8B4AH/AvQB5gH/Au8B4AH/AukB2gH/AukB2gH/AukB2gH/AukB2gH/ + Au8B4AH/AvQB5gH/Au8B4AH/AukB2gH/AvQB5gH/A0ABb4AAAxwBJwM/AW0C/wHxAf8B5wHXAasB/wHX + AZYBCwH/AdcBlgELAf8B1wGWAQsB/wHoAdgBrgP/AfUB/wM/AW0DHAEnFAADQAFuAvYB6AH/AusB3gH/ + AusB3gH/AusB3gH/AusB3gH/AusB3gH/AusB3gH/AusB3gH/AusB3gH/AusB3gH/AusB3gH/AusB3gH/ + AusB3gH/AvYB6AH/A0ABboQAAxsBJgM/AWwC/wHyAf8B5QHUAakB/wHNAYkBAAH/Ac0BiQEAAf8BzQGJ + AQAB/wHoAdcBrwP/AfcB/wM/AWwDGwEmEAADPwFtAvcB7AH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/ + Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/AvcB7AH/Az8BbYgA + AxsBJgM+AWsC/wH0Af8B5wHWAawB/wHRAY4BAwH/AdEBjgEDAf8B0QGOAQMB/wHsAdsBswP/AfgB/wM+ + AWsDGwEmDAADPgFrAvkB7wH/AvEB6AH/AvEB6AH/AvEB6AH/AvEB6AH/AvEB6AH/AwAB/wFOAYUBkwH/ + AbgCywH/AvEB6AH/AvEB6AH/AvEB6AH/AvEB6AH/AvkB7wH/Az4Ba4wAAxsBJgM+AWsC/wH1Af8B6wHc + AbMB/wHfAaEBFgH/Ad8BoQEWAf8B3wGhARYB/wHxAeIBuwP/AfoB/wM+AWsDGwEmCAADPgFqAvoB8wH/ + AvUB7gH/AvUB7gH/AvUB7gH/AvUB7gH/AvUB7gH/AXkBsQHAAf8B2QH0Av8BPAGcAasB/wG1AdMB1AH/ + AvUB7gH/AvUB7gH/AvUB7gH/AvoB8wH/Az4BapAAAxsBJgM+AWoC/wH3Af8B8gHkAbsB/wHwAbgBLQH/ + AfABuAEtAf8B8AG4AS0B/wL4AfQD/wH7Af8DPgFqAxoBJQQAAz0BaQL8AfcB/wL4AfMB/wL4AfMB/wL4 + AfMB/wL4AfMB/wL4AfMB/wHUAeYB5wH/AUYBtAHDAf8BdgHmAfcB/wE9AZ0BrQH/AbYB1QHXAf8C+AHz + Af8C+AHzAf8C/AH3Af8DPQFplAADGgElAz0BaQL/AfgB/wH3AeoBwwH/Af0ByQE+Af8B+QHsAccB/wL7 + AfcB/wL8AfkD/wH8Af8DPQFpAxoBJQM9AWgC/QH6Af8C+wH3Af8C+wH3Af8C+wH3Af8C+wH3Af8C+wH3 + Af8C+wH3Af8BvgHlAegB/wFHAbUBxQH/AXYB5gH3Af8BPgGeAa4B/wG5AdgB2wH/AvsB9wH/Av0B+gH/ + Az0BaJgAAxoBJQM9AWgC/wH6Af8C+AH0Af8C+wH3Af8C6AHeAf8C2AHJAf8C6AHeA/8B/gH/Az0BaAM9 + AWgC/gH9Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8BwAHmAesB/wFI + AbUBxgH/AXYB5gH3Af8BPgGeAa8B/wG+AdgB3AH/Av4B/QH/Az0BaJwAAxoBJQM9AWgC/wH7Af8C/AH5 + Af8CywG7Af8EAALLAbwD/wH+Af8DPQFoAz0BZyT/AcEB6AHuAf8BSAG2AccB/wF2AeYB9wH/A5MB/wPV + Af8DPQFnoAADGgElAz0BZwL/AfwB/wLUAcoB/wKvAZ8B/wLUAcsD/wH+Af8DPQFnAzEBTQM8AWYDPAFm + AzwBZgM8AWYDPAFmAzwBZgM8AWYDPAFmAzwBZgM8AWYDTAGMAlYBVAGnA/cB/wJUAVgBuwJEAUUBeqQA + AxoBJAM9AWcC/wH+A/8B/gP/Af4F/wM9AWcwAAMaASQCRAFFAXwCgAL/AkgBagHBqAADGgEkAzwBZgM8 + AWYDPAFmAzwBZgMxAU00AAMmATkCSwFjAa8DKgFAjAADAgEDAxQBHAMwAUwDRAF5A1ABmgNQAaQDUAGa + A0QBeQMwAUwDFAEcAwMBBAgAA5YB/wEcAgAB/wEcAgAB/wEcAgAB/wEcAgAB/wEcAgAB/wEcAgAB/wEc + AgAB/wEcAgAB/wEcAgAB/wEcAgAB/wEcAgAB/wEcAgAB/wEcAgAB/wEcAgAB/wEcAgAB/wQAAU8BzAL/ + ARwCmQH/ARwCmQH/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/ + AU8BzAL/AU8BzAL/AU8BzAL/EAADAgEDAxQBHAMwAUwDRAF5A1ABmgNQAaQDUAGaA0QBeQMwAUwDFAEc + AwMBBBAAAwQBBgMkATYDUwGwAWMCXgHlAXMCXwH7AbMCqQH/AXMCZAH7A2AB6wNaAdMDUwGsA0cBggMo + ATwDBwEJBAABzAKZAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8D6gH/A+oB/wPqAf8BgAIAAf8D6gH/ + A+oB/wPqAf8BgAIAAf8BgAIAAf8BTwIAAf8BHAIAAf8BHAKZAf8DAAH/AxIB/wM2Af8DAAH/AwUB/wFP + AcwC/wFPAcwC/wFPAcwC/wFPAcwC/wFPAcwC/wFPAcwC/wFPAcwC/wFPAcwC/wFPAcwC/wFPAcwC/wgA + AwQBBgMkATYDUwGwAWMCXgHlAXMCXwH7AbMCqQH/AXMCZAH7A2AB6wNaAdMDUwGsA0cBggMoATwDBwEJ + CAADAgEDAzEBTwNcAeoBzwK0Av8C3QL/AuIC/wLoAv8C7gL/AvMB/wPPAf8DXwHzA1gBxgNMAZIDKAE8 + AwMBBAHMApkB/wGAAgAB/wGAAgAB/wGAAgAB/wPxAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/A/EB/wGA + AgAB/wGAAgAB/wPxAf8BgAIAAf8BgAIAAf8BHAIAAf8DAAH/A8wN/wM2Af8DBQH/AU8BzAL/AU8BzAL/ + AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/BAADAgEDAzEBTwNcAeoBzwK0 + Av8C3QL/AuIC/wLoAv8C7gL/AvMB/wPPAf8DXwHzA1gBxgNMAZIDKAE8AwMBBAQAAyYBOANtAfcB9QLH + Av8C0gL/AtgC/wLdAv8C4gL/AugC/wL0Bf8D9QH/A4IB+wNYAcYDRwGCAxQBHAHMApkB/wGZAQABHAH/ + AYACAAH/AYACAAX/AYACAAH/AYACAAX/AYACAAX/AYACAAH/AYACAAX/AYACAAH/AYACAAH/ARwCAAH/ + AwAB/wPMEf8DAAH/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/AU8BzAL/ + AU8BzAL/BAADJgE4A20B9wH1AscC/wLSAv8C2AL/At0C/wLiAv8C6AL/AvQF/wP1Af8DggH7A1gBxgNH + AYIDFAEcAwcBCQNeAd0B9QLNAv8CzwL/As0C/wLSAv8C2AL/At0C/wLiAv8C+gn/A/UB/wNfAfMDUwGs + AzABTAHMApkB/wGZAQABHAH/AYACAAH/AYACAAH/AYACAA3/AYACAA3/AYACAAH/AYACAAH/AYACAAH/ + ARwCAAH/ARwCmQH/AwUB/wNgAf8DwAH/A8AB/wPMAf8DAAH/AxIB/wMAAf8DAAH/AwAB/wMAAf8DEgH/ + AU8BzAL/AU8BzAL/AU8BzAL/AwcBCQNeAd0B9QLNAv8CzwL/As0C/wLSAv8C2AL/At0C/wLiAv8C+gn/ + A/UB/wNfAfMDUwGsAzABTAM+AWoBxgKxAv8C2QL/AtQC/wLPAv8CzQL/AdQB2wL/AdcB4gL/AeQB6hH/ + AdICzAH/A1oB0wNDAXcBzAKZAf8BmQEAARwB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAF/wGA + AgAF/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEcAgAB/wFPAcwC/wEcApkB/wMFAf8DAAH/ + AwAF/wMAAf8DBQH/AaQCoAn/A5kB/wMSAf8DEgH/AU8BzAL/AU8BzAL/Az4BagHGArEC/wLZAv8C1AL/ + As8C/wLNAv8B1AHbAv8B1wHiAv8B5AHqEf8B0gLMAf8DWgHTA0MBdwNWAbYB/wLjAf8BAAEXARgB/wEA + ARcBGAH/AQABFwEYAv8B3gHnAf8BAAEXARgC/wHRAfMB/wEAARcBGAL/AfgC/wFXAl0B/wEAARcBGAH/ + AVcCXQH/AcwCmQH/AVwCVQHqA04BlAHMApkB/wGZAQABHAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/ + AYACAAX/AYACAAX/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/ARwCAAH/AU8BzAL/AU8BzAL/ + AU8BzAL/AU8BzAL/AwAF/wMAAf8DEhH/A8wB/wMAAf8BTwHMAv8BTwHMAv8DVgG2Af8C4wH/AVcCXQH/ + AQABFwEYAf8BVwJdAv8B3gHnAf8BVwJdAf8BAAEXARgB/wFXAl0C/wH4Av8BAAEXARgB/wEAARcBGAH/ + AQABFwEYAf8BzAKZAf8BXAJVAeoDTgGUA2EB4gH/AucB/wEAARcBGAL/At4C/wLgAv8B7wH8Af8BAAEX + ARgC/wHiAfwB/wEAARcBGAH/AfwB8AH5Af8BAAEXARgB/wHMApkB/wEAARcBGAH/AcwCmQH/AW0CbAH3 + A1EBoQHMApkB/wGZAQABHAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/ + AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/ARwCAAH/AZkCTwH/AZkCTwH/AZkCTwH/ + AZkCTwH/AwAF/wMAAf8DAAH/AzYB/wPMDf8DAAH/AZkCTwH/AZkCTwH/A2EB4gH/AucB/wEAARcBGAL/ + At4B/wEAARcBGAL/Ae8B/AH/AQABFwEYAv8B4gH8Af8BAAEXARgB/wH8AfAB+QH/AQABFwEYAf8BzAKZ + Af8BzAKZAf8BzAKZAf8BbQJsAfcDUQGhAZ4CjAH/AekCvgH/AQABFwEYAf8BAAEXARgB/wH5AtYC/wHp + AfMB/wEAARcBGAH/AQABFwEYAf8BAAEXARgB/wH5AegB7AH/AQABFwEYAf8B5gK6Af8B5gK9Af8B5gLA + Af8BpgKUAf8DTgGUNP8D8QH/A+oB/wOAAf8BmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8DAAX/AwAB/wM+ + Af8DBQH/AwAB/wMAAf8DAAX/AwAB/wGZAk8B/wGZAk8B/wGeAowB/wHpAr4B/wEAARcBGAH/AfMCxQH/ + AfkC1gL/AekB8wH/AQABFwEYAv8B6QHzAf8BAAEXARgB/wH5AegB7AH/AQABFwEYAf8BAAEXARgB/wHm + Ar0B/wHmAsAB/wGmApQB/wNOAZQDXQHSAdsCqAH/AQABFwEYAf8B6gK3Af8B8wLNAv8B7gH8Af8BAAEX + ARgC/wHSAfUB/wEAARcBGAL/AfQB/AH/AQABFwEYAv8C2AH/AQABFwEYAv8C4gH/A2IB9gNDAXcE/wGZ + AQABHAn/AYACAA3/AYACAAH/AYACAA3/AYACAAH/AYACAAH/A4AB/wGZAk8B/wGZAk8B/wGZAk8B/wGZ + Ak8B/wMABf8DBQH/AwAB/wMSAf8DPgH/Az4B/wMABf8DAAH/AZkCTwH/AZkCTwH/A10B0gHbAqgB/wEA + ARcBGAH/AeoCtwH/AQABFwEYAv8B7gH8Af8BAAEXARgC/wHSAfUB/wEAARcBGAL/AfQB/AH/AQABFwEY + Av8C2AL/At0C/wLiAf8DYgH2A0MBdwNWAbEB1QKiAf8BAAEXARgB/wEAARcBGAH/AQABFwEYAv8B9gL/ + AVcCXQH/AQABFwEYAf8BVwJdAv8B4AHnAf8BVwJdAf8BAAEXARgB/wFXAl0C/wLdAf8DWgHkAzABTAT/ + AZkBAAEcCf8BgAIACf8BgAIAEf8BgAIAAf8D8QH/A+oB/wOAAf8BmQJPAf8BmQJPAf8BmQJPAf8BmQJP + Af8DAAn/A5kB/wMSAf8DAAH/AwUB/wMABf8DAAH/AZkCTwH/AZkCTwH/A1YBsQHVAqIB/wFXAl0B/wEA + ARcBGAH/AVcCXQL/AfYC/wEAARcBGAL/AdIB9QH/AQABFwEYAv8B4AHnAf8BAAEXARgB/wEAARcBGAH/ + AQABFwEYAv8C3QH/A1oB5AMwAUwDMgFQAcMCvxL/AewB8QL/AdsB5wL/AdkB3gL/AtQC/wLPAv8CzQL/ + AtIB/wHGAq0B/wNTAawDFAEbBP8BmQEAARwJ/wGAAgAJ/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAF/wGA + AgAB/wGAAgAB/wGAAgAB/wEcAgAB/wGZAk8B/wGZAk8B/wGZAk8B/wGZAk8B/wMAAf8DwA3/A8wB/wNI + Af8DAAX/AwAB/wGZAk8B/wGZAk8B/wMyAVABwwK/Ev8B7AHxAv8B2wHnAv8B2QHeAv8C1AL/As8C/wLN + Av8C0gH/AcYCrQH/A1MBrAMUARsEAANaAcAD9Qr/Av4C/wLnAv8C4wL/At4C/wLZAv8C1AL/As8B/wH1 + AscB/wNfAeMDIwE0AwIBAwT/AZkBAAEcAf8BgAIABf8BgAIACf8BgAIACf8BgAIABf8BgAIAAf8D8QH/ + A+oB/wEcAgAB/wGZAk8B/wGZAk8B/wGZAk8B/wGZAk8B/wMSAf8DNgH/A8AZ/wMAAf8BmQJPAf8BmQJP + Af8EAANaAcAD9Qr/Av4C/wLnAv8C4wL/At4C/wLZAv8C1AL/As8B/wH1AscB/wNfAeMDIwE0AwIBAwQA + AxcBIANiAe8D9Qb/AvgC/wLsAv8C5wL/AuMC/wLeAv8C2QH/AfUCzQH/A20B9wMwAU0DBAEGBAAE/wGZ + AhwJ/wGAAgAB/wGAAgAJ/wGAAgAB/wGAAgAN/wGAAgAB/wGAAgAB/wOGAf8BmQJPAf8BmQJPAf8BmQJP + Af8BmQJPAf8BmQJPAf8DEgH/AwAB/wMSAf8DmRH/AwAB/wGZAk8B/wGZAk8B/wQAAxcBIANiAe8D9Qb/ + AvgC/wLsAv8C5wL/AuMC/wLeAv8C2QH/AfUCzQH/A20B9wMwAU0DBAEGDAADFwEgA1oBwAPGAv8C9wL/ + AvIC/wLsAv8C5wL/AuMB/wHGArEB/wNeAdADJAE2AwIBAwgABP8BmQIcLf8D8QH/A+oB/wOGAf8BmQJP + Af8BmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8DEgH/AwAB/wMFAf8DYAH/A8wF/wMA + Af8BmQJPAf8BmQJPAf8IAAMXASADWgHAA8YC/wL3Av8C8gL/AuwC/wLnAv8C4wH/AcYCsQH/A14B0AMk + ATYDAgEDGAADMgFQA1EBogNdAdIBjAKJAf8DYAHUA1QBpgM3AVoDBQEHEAAI/wHMApkt/wPxAf8DwAH/ + BAABmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8BmQJPAf8DBQH/ + AwAB/wM2Af8DEgH/AZkCTwH/FAADMgFQA1EBogNdAdIBjAKJAf8DYAHUA1QBpgM3AVoDBQEHEAABQgFN + AT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/wEAAeMD/wQAAcED/wQAAYAB/wEIARAFAAF/ + BwABPwcAAR8GAAGAAQ8GAAHAAQcGAAHgAQMGAAHwAQEGAAH4BwAB/AcAAf4BCAYAAf8HAAH/AYAB/wHw + BAAB/wHAAf8B+AQAAeABAwIAAYABAQHgAQMBwAEBBAABwAEBAYAFAAGAAQABgAUAAYBBAAGABQABgAEA + AYABAQQAAYABAQHAAQMEAAHAAQMB8AEPAgABgAEBAfABDws= @@ -303,7 +299,7 @@ Courier New, 8pt - 3, 94 + 3, 123 True @@ -312,7 +308,7 @@ Vertical - 569, 5 + 569, 3 1 @@ -329,6 +325,33 @@ 2 + + Fill + + + 3, 261 + + + 569, 156 + + + 3 + + + False + + + listTracks + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel1 + + + 3 + 1 @@ -359,69 +382,9 @@ Right - - Fill - - - 3, 250 - - - 569, 163 - - - 3 - - - False - - - listTracks - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tableLayoutPanel1 - - - 3 - 1 - - 1 - - - Value - - - 400 - - - 0 - - - Name - - - 120 - - - Fill - - - 3, 122 - - - 569, 122 - - - 2 - - - False - listMetadata @@ -434,24 +397,6 @@ 0 - - 4 - - - Fill - - - 3, 419 - - - 1 - - - 569, 38 - - - 30 - tableLayoutPanel2 @@ -467,21 +412,6 @@ <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="buttonOk" Row="0" RowSpan="1" Column="3" ColumnSpan="1" /></Controls><Columns Styles="Percent,37,59399,Percent,22,93233,Percent,19,17293,Percent,20,11278" /><Rows Styles="Percent,100" /></TableLayoutSettings> - - Fill - - - 3, 105 - - - 569, 11 - - - Zoom - - - 31 - pictureBox1 @@ -522,8 +452,116 @@ 0 - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="listMetadata" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="tableLayoutPanel2" Row="5" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textBox1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="listTracks" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="listChoices" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="pictureBox1" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,19,85646,Percent,2,392344,Percent,3,827751,Percent,27,7512,Percent,36,60287,Percent,9,035593" /></TableLayoutSettings> + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="listMetadata" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="tableLayoutPanel2" Row="5" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textBox1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="listTracks" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="listChoices" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="pictureBox1" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Absolute,120,Percent,5,Percent,5,Absolute,120,Percent,90,Absolute,40" /></TableLayoutSettings> + + Fill + + + 3, 141 + + + 569, 114 + + + 2 + + + False + + + listMetadata + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel1 + + + 0 + + + 1 + + + Value + + + 400 + + + 0 + + + Name + + + 120 + + + 4 + + + Fill + + + 3, 423 + + + 1 + + + 569, 34 + + + 30 + + + tableLayoutPanel2 + + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel1 + + + 1 + + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="buttonOk" Row="0" RowSpan="1" Column="3" ColumnSpan="1" /></Controls><Columns Styles="Percent,37,59399,Percent,22,93233,Percent,19,17293,Percent,20,11278" /><Rows Styles="Percent,100" /></TableLayoutSettings> + + + Fill + + + 3, 132 + + + 569, 3 + + + Zoom + + + 31 + + + pictureBox1 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel1 + + + 5 + + + 127, 17 + True @@ -536,6 +574,9 @@ 575, 460 + + 591, 496 + CenterParent @@ -590,6 +631,12 @@ System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + backgroundWorker1 + + + System.ComponentModel.BackgroundWorker, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + frmChoice diff --git a/MAC_SDK/Source/MACLib/Assembly/Assembly.obj b/MAC_SDK/Source/MACLib/Assembly/Assembly.obj index 8e054d8eb4a4461caabbd7cac5bd0d7a7d7df174..6603e0e33ebd16758736ce49d4bcd532235d43ff 100644 GIT binary patch delta 17 YcmX@Yc7%OV delta 17 YcmX@Yc7%rHzrny+6x$BgbPF05~TG2><{9 delta 17 YcmaFO`I?g>rHzr{Tfq|VjU10z06rK7(EtDd diff --git a/MAC_SDK/Source/MACLib/NNFilter.cpp b/MAC_SDK/Source/MACLib/NNFilter.cpp index f72b650..0bddc39 100644 --- a/MAC_SDK/Source/MACLib/NNFilter.cpp +++ b/MAC_SDK/Source/MACLib/NNFilter.cpp @@ -85,16 +85,16 @@ int CNNFilter::Decompress(int nInput) int nDotProduct; if (m_bMMXAvailable) + { nDotProduct = CalculateDotProduct(&m_rbInput[-m_nOrder], &m_paryM[0], m_nOrder); - else - nDotProduct = CalculateDotProductNoMMX(&m_rbInput[-m_nOrder], &m_paryM[0], m_nOrder); - - // adapt - if (m_bMMXAvailable) Adapt(&m_paryM[0], &m_rbDeltaM[-m_nOrder], -nInput, m_nOrder); + } else + { + nDotProduct = CalculateDotProductNoMMX(&m_rbInput[-m_nOrder], &m_paryM[0], m_nOrder); AdaptNoMMX(&m_paryM[0], &m_rbDeltaM[-m_nOrder], nInput, m_nOrder); - + } + // store the output value int nOutput = nInput + ((nDotProduct + (1 << (m_nShift - 1))) >> m_nShift); diff --git a/MAC_SDK/Source/MACLib/UnBitArray.cpp b/MAC_SDK/Source/MACLib/UnBitArray.cpp index fca206e..97417e7 100644 --- a/MAC_SDK/Source/MACLib/UnBitArray.cpp +++ b/MAC_SDK/Source/MACLib/UnBitArray.cpp @@ -253,6 +253,15 @@ void CUnBitArray::FlushState(UNBIT_ARRAY_STATE & BitArrayState) void CUnBitArray::FlushBitArray() { + // G.S.C.: Fixing a bug here. There was no check here for the buffer boundary. + // nMod is how much we will skip in AdvanceToByteBoundary + ignoring the first byte. + int nMod = m_nCurrentBitIndex % 8; + if (nMod != 0) { nMod = 8 - nMod; } + nMod += 8; + if ((m_nCurrentBitIndex + nMod) >= m_nBits) + FillBitArray(); + // G.S.C.: end + AdvanceToByteBoundary(); m_nCurrentBitIndex += 8; // ignore the first byte... (slows compression too much to not output this dummy byte) m_RangeCoderInfo.buffer = GetC();