Finalized 2.1.2;

Starting work on 2.1.3 (prioritized metadata lookup, freedb via ctdb)
This commit is contained in:
chudov
2011-06-26 00:02:29 +00:00
parent e3b05e3e7f
commit 78197894f7
18 changed files with 708 additions and 221 deletions

View File

@@ -588,7 +588,7 @@ namespace CUERipper
private CUEMetadataEntry CreateCUESheet(ICDRipper audioSource, CTDBResponseMeta release) private CUEMetadataEntry CreateCUESheet(ICDRipper audioSource, CTDBResponseMeta release)
{ {
CUEMetadataEntry entry = new CUEMetadataEntry(audioSource.TOC, "ctdb"); CUEMetadataEntry entry = new CUEMetadataEntry(audioSource.TOC, release.source);
entry.metadata.FillFromCtdb(release, entry.TOC.FirstAudio - 1); entry.metadata.FillFromCtdb(release, entry.TOC.FirstAudio - 1);
return entry; return entry;
} }
@@ -635,7 +635,7 @@ namespace CUERipper
cueSheet.Action = CUEAction.Encode; cueSheet.Action = CUEAction.Encode;
this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " CTDB..."; }); this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " CTDB..."; });
cueSheet.UseCUEToolsDB("CUERipper " + CUESheet.CUEToolsVersion, selectedDriveInfo.drive.ARName, true, false); cueSheet.UseCUEToolsDB("CUERipper " + CUESheet.CUEToolsVersion, selectedDriveInfo.drive.ARName, false, CTDBPriority.High, CTDBPriority.Medium, CTDBPriority.Low);
cueSheet.CTDB.UploadHelper.onProgress += new EventHandler<Krystalware.UploadHelper.UploadProgressEventArgs>(UploadProgress); cueSheet.CTDB.UploadHelper.onProgress += new EventHandler<Krystalware.UploadHelper.UploadProgressEventArgs>(UploadProgress);
this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " AccurateRip..."; }); this.BeginInvoke((MethodInvoker)delegate() { toolStripStatusLabel1.Text = Properties.Resources.LookingUpVia + " AccurateRip..."; });
cueSheet.UseAccurateRip(); cueSheet.UseAccurateRip();

View File

@@ -188,19 +188,36 @@ namespace CUETools.AccurateRip
return worstTotal == 0xffff ? 0 : worstTotal; return worstTotal == 0xffff ? 0 : worstTotal;
} }
// TODO: Replace min(sum) with sum(min)!!! public uint WorstConfidence(int oi)
public uint WorstConfidence()
{ {
uint worstConfidence = 0xffff; uint worstConfidence = 0xffff;
for (int iTrack = 0; iTrack < _toc.AudioTracks; iTrack++) for (int iTrack = 0; iTrack < _toc.AudioTracks; iTrack++)
{ {
uint sumConfidence = SumConfidence(iTrack); int trno = iTrack + _toc.FirstAudio - 1;
if (worstConfidence > sumConfidence && (Total(iTrack) != 0 || CRC(iTrack) != 0)) uint sum = 0;
worstConfidence = sumConfidence; // sum all matches for this track and this offset
for (int di = 0; di < AccDisks.Count; di++)
if (trno < AccDisks[di].tracks.Count
&& (CRC(iTrack, oi) == AccDisks[di].tracks[trno].CRC
|| oi == 0 && CRCV2(iTrack) == AccDisks[di].tracks[trno].CRC))
sum += AccDisks[di].tracks[iTrack + _toc.FirstAudio - 1].count;
// exclude silent tracks
if (worstConfidence > sum && (Total(iTrack) != 0 || CRC(iTrack, oi) != 0))
worstConfidence = sum;
} }
return worstConfidence; return worstConfidence;
} }
public uint WorstConfidence()
{
if (ARStatus != null)
return 0U;
uint worstConfidence = 0;
for (int oi = -_arOffsetRange; oi <= _arOffsetRange; oi++)
worstConfidence += WorstConfidence(oi);
return worstConfidence;
}
public uint SumConfidence(int iTrack) public uint SumConfidence(int iTrack)
{ {
if (ARStatus != null) if (ARStatus != null)

View File

@@ -34,14 +34,16 @@
this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
this.button1 = new System.Windows.Forms.Button(); this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button();
this.panel1 = new System.Windows.Forms.Panel();
this.panel1.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// progressBar1 // progressBar1
// //
this.progressBar1.Dock = System.Windows.Forms.DockStyle.Top; this.progressBar1.Dock = System.Windows.Forms.DockStyle.Fill;
this.progressBar1.Location = new System.Drawing.Point(10, 198); this.progressBar1.Location = new System.Drawing.Point(5, 5);
this.progressBar1.Name = "progressBar1"; this.progressBar1.Name = "progressBar1";
this.progressBar1.Size = new System.Drawing.Size(587, 23); this.progressBar1.Size = new System.Drawing.Size(587, 25);
this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee; this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
this.progressBar1.TabIndex = 0; this.progressBar1.TabIndex = 0;
// //
@@ -54,14 +56,14 @@
// //
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1}); this.columnHeader1});
this.listView1.Dock = System.Windows.Forms.DockStyle.Top; this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.listView1.FullRowSelect = true; this.listView1.FullRowSelect = true;
this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
this.listView1.HideSelection = false; this.listView1.HideSelection = false;
this.listView1.Location = new System.Drawing.Point(10, 10); this.listView1.Location = new System.Drawing.Point(10, 10);
this.listView1.MultiSelect = false; this.listView1.MultiSelect = false;
this.listView1.Name = "listView1"; this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(587, 188); this.listView1.Size = new System.Drawing.Size(597, 213);
this.listView1.TabIndex = 1; this.listView1.TabIndex = 1;
this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details; this.listView1.View = System.Windows.Forms.View.Details;
@@ -74,9 +76,10 @@
// button1 // button1
// //
this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.button1.Location = new System.Drawing.Point(519, 204); this.button1.Dock = System.Windows.Forms.DockStyle.Right;
this.button1.Location = new System.Drawing.Point(442, 5);
this.button1.Name = "button1"; this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23); this.button1.Size = new System.Drawing.Size(75, 25);
this.button1.TabIndex = 2; this.button1.TabIndex = 2;
this.button1.Text = "Cancel"; this.button1.Text = "Cancel";
this.button1.UseVisualStyleBackColor = true; this.button1.UseVisualStyleBackColor = true;
@@ -85,30 +88,44 @@
// button2 // button2
// //
this.button2.DialogResult = System.Windows.Forms.DialogResult.OK; this.button2.DialogResult = System.Windows.Forms.DialogResult.OK;
this.button2.Location = new System.Drawing.Point(438, 204); this.button2.Dock = System.Windows.Forms.DockStyle.Right;
this.button2.Location = new System.Drawing.Point(517, 5);
this.button2.Name = "button2"; this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23); this.button2.Size = new System.Drawing.Size(75, 25);
this.button2.TabIndex = 3; this.button2.TabIndex = 3;
this.button2.Text = "OK"; this.button2.Text = "OK";
this.button2.UseVisualStyleBackColor = true; this.button2.UseVisualStyleBackColor = true;
this.button2.Visible = false; this.button2.Visible = false;
// //
// panel1
//
this.panel1.Controls.Add(this.button1);
this.panel1.Controls.Add(this.button2);
this.panel1.Controls.Add(this.progressBar1);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(10, 223);
this.panel1.Name = "panel1";
this.panel1.Padding = new System.Windows.Forms.Padding(5);
this.panel1.Size = new System.Drawing.Size(597, 35);
this.panel1.TabIndex = 4;
//
// FormMetadata // FormMetadata
// //
this.AcceptButton = this.button2; this.AcceptButton = this.button2;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.button1; this.CancelButton = this.button1;
this.ClientSize = new System.Drawing.Size(607, 233); this.ClientSize = new System.Drawing.Size(617, 268);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.progressBar1);
this.Controls.Add(this.listView1); this.Controls.Add(this.listView1);
this.Controls.Add(this.panel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
this.MinimumSize = new System.Drawing.Size(500, 300);
this.Name = "FormMetadata"; this.Name = "FormMetadata";
this.Padding = new System.Windows.Forms.Padding(10); this.Padding = new System.Windows.Forms.Padding(10);
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "CTDB Metadata Lookup"; this.Text = "CTDB Metadata Lookup";
this.Load += new System.EventHandler(this.FormMetadata_Load); this.Load += new System.EventHandler(this.FormMetadata_Load);
this.panel1.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
} }
@@ -121,5 +138,6 @@
private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button2;
private System.Windows.Forms.Panel panel1;
} }
} }

View File

@@ -39,7 +39,11 @@ namespace CUETools.CTDB.EACPlugin
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{ {
this.ctdb.ContactDB(null, this.agent, null, true, false);
this.ctdb.ContactDB(null, this.agent, null, false, false,
AudioDataPlugIn.Options.priorityMusicbrainz,
AudioDataPlugIn.Options.priorityFreedb,
AudioDataPlugIn.Options.priorityFreedbFuzzy);
} }
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

View File

@@ -49,7 +49,7 @@ namespace CUETools.CTDB.EACPlugin
this.ctdb.UploadHelper.onProgress += UploadProgress; this.ctdb.UploadHelper.onProgress += UploadProgress;
if (this.agent != null) if (this.agent != null)
{ {
this.ctdb.ContactDB(null, this.agent, this.drivename, false, false); this.ctdb.ContactDB(null, this.agent, this.drivename, true, false, CTDBPriority.None, CTDBPriority.None, CTDBPriority.None);
} }
else else
{ {

View File

@@ -49,33 +49,97 @@ namespace MetadataPlugIn
return false; return false;
int year, disccount, discnumber; int year, disccount, discnumber;
if (meta.year != null && int.TryParse(meta.year, out year)) string extra = meta.extra ?? "";
data.Year = year; if (!string.IsNullOrEmpty(meta.discname))
if (meta.disccount != null && int.TryParse(meta.disccount, out disccount)) extra += "Disc name: " + meta.discname + "\r\n";
data.TotalNumberOfCDs = disccount; if (!string.IsNullOrEmpty(meta.infourl))
if (meta.discnumber != null && int.TryParse(meta.discnumber, out discnumber)) extra += "Info URL: " + meta.infourl + "\r\n";
data.CDNumber = discnumber; if (!string.IsNullOrEmpty(meta.barcode))
if (meta.album != null) extra += "Barcode: " + meta.barcode + "\r\n";
data.AlbumTitle = meta.album; if (!string.IsNullOrEmpty(meta.releasedate))
if (meta.artist != null) extra += "Release date: " + meta.releasedate + "\r\n";
data.AlbumArtist = meta.artist; if (!string.IsNullOrEmpty(meta.country))
extra += "Release country: " + meta.country + "\r\n";
if (meta.label != null)
foreach (var label in meta.label)
{
if (!string.IsNullOrEmpty(label.name))
extra += "Release label: " + label.name + "\r\n";
if (!string.IsNullOrEmpty(label.catno))
extra += "Release catalog#: " + label.catno + "\r\n";
}
data.Year = meta.year != null && int.TryParse(meta.year, out year) ? year : -1;
data.TotalNumberOfCDs = meta.disccount != null && int.TryParse(meta.disccount, out disccount) ? disccount : 1;
data.CDNumber = meta.discnumber != null && int.TryParse(meta.discnumber, out discnumber) ? discnumber : 1;
data.FirstTrackNumber = 1;
data.AlbumTitle = meta.album ?? "";
data.AlbumArtist = meta.artist ?? "";
data.MP3V2Type = meta.genre ?? "";
data.CDDBMusicType = GetFreeDBMusicType(meta);
data.MP3Type = GetMP3MusicType(data.CDDBMusicType);
data.ExtendedDiscInformation = extra;
data.Revision = -1; // TODO: meta.id? rock/ffffffff/16?
if (meta.track != null) if (meta.track != null)
for (int track = 0; track < data.NumberOfTracks; track++) for (int track = 0; track < data.NumberOfTracks; track++)
{ {
if (track < meta.track.Length) if (track < meta.track.Length)
{ {
if (meta.track[track].name != null) data.SetTrackTitle(track, meta.track[track].name ?? "");
data.SetTrackTitle(track, meta.track[track].name); data.SetTrackArtist(track, meta.track[track].artist ?? meta.artist ?? "");
var trackartist = meta.track[track].artist ?? meta.artist; data.SetExtendedTrackInformation(track, meta.track[track].extra ?? "");
if (trackartist != null)
data.SetTrackArtist(track, trackartist);
} }
else if (meta.artist != null) else
data.SetTrackArtist(track, meta.artist); {
data.SetTrackTitle(track, "");
data.SetTrackArtist(track, meta.artist ?? "");
data.SetExtendedTrackInformation(track, "");
}
data.SetTrackComposer(track, "");
} }
return true; return true;
} }
public int GetMP3MusicType(int freedbtype)
{
int[] list = { 17, 29, 34, 95, 53, 77, 90, 113, 117, 129, 95 };
return (freedbtype <= 0 || freedbtype >= list.Length) ? -1 : list[freedbtype];
}
public int GetFreeDBMusicType(CTDBResponseMeta meta)
{
int pos = meta.id.IndexOf('/');
if (meta.source != "freedb" || pos < 0)
return -1;
string freedbtype = meta.id.Substring(0, pos);
switch (freedbtype.ToUpper())
{
case "BLUES":
return 0;
case "CLASSICAL":
return 1;
case "COUNTRY":
return 2;
case "DATA":
return 3;
case "FOLK":
return 4;
case "JAZZ":
return 5;
case "NEWAGE":
return 6;
case "REGGAE":
return 7;
case "ROCK":
return 8;
case "SOUNDTRACK":
return 9;
case "MISC":
return 10;
default:
return -1;
}
}
public string GetPluginGuid() public string GetPluginGuid()
{ {
return ((GuidAttribute)Attribute.GetCustomAttribute(GetType(), typeof(GuidAttribute))).Value; return ((GuidAttribute)Attribute.GetCustomAttribute(GetType(), typeof(GuidAttribute))).Value;

View File

@@ -33,7 +33,28 @@ namespace AudioDataPlugIn
this.label2 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.linkLabel1 = new System.Windows.Forms.LinkLabel();
this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.radioButtonMBHigh = new System.Windows.Forms.RadioButton();
this.radioButtonMBLow = new System.Windows.Forms.RadioButton();
this.radioButtonMBMedium = new System.Windows.Forms.RadioButton();
this.radioButtonMBNone = new System.Windows.Forms.RadioButton();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.radioButtonFDMedium = new System.Windows.Forms.RadioButton();
this.radioButtonFDHigh = new System.Windows.Forms.RadioButton();
this.radioButtonFDLow = new System.Windows.Forms.RadioButton();
this.radioButtonFDNone = new System.Windows.Forms.RadioButton();
this.buttonOk = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.radioButtonFZMedium = new System.Windows.Forms.RadioButton();
this.radioButtonFZHigh = new System.Windows.Forms.RadioButton();
this.radioButtonFZLow = new System.Windows.Forms.RadioButton();
this.radioButtonFZNone = new System.Windows.Forms.RadioButton();
this.buttonCancel = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// label1 // label1
@@ -49,7 +70,7 @@ namespace AudioDataPlugIn
// //
this.label2.Location = new System.Drawing.Point(95, 67); this.label2.Location = new System.Drawing.Point(95, 67);
this.label2.Name = "label2"; this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(230, 74); this.label2.Size = new System.Drawing.Size(230, 34);
this.label2.TabIndex = 1; this.label2.TabIndex = 1;
this.label2.Text = "Copyright (c) 2011 Gregory S. Chudov"; this.label2.Text = "Copyright (c) 2011 Gregory S. Chudov";
// //
@@ -73,11 +94,220 @@ namespace AudioDataPlugIn
this.pictureBox1.TabIndex = 4; this.pictureBox1.TabIndex = 4;
this.pictureBox1.TabStop = false; this.pictureBox1.TabStop = false;
// //
// radioButtonMBHigh
//
this.radioButtonMBHigh.AutoSize = true;
this.radioButtonMBHigh.Location = new System.Drawing.Point(6, 16);
this.radioButtonMBHigh.Name = "radioButtonMBHigh";
this.radioButtonMBHigh.Size = new System.Drawing.Size(47, 17);
this.radioButtonMBHigh.TabIndex = 6;
this.radioButtonMBHigh.TabStop = true;
this.radioButtonMBHigh.Text = "High";
this.radioButtonMBHigh.UseVisualStyleBackColor = true;
//
// radioButtonMBLow
//
this.radioButtonMBLow.AutoSize = true;
this.radioButtonMBLow.Location = new System.Drawing.Point(6, 50);
this.radioButtonMBLow.Name = "radioButtonMBLow";
this.radioButtonMBLow.Size = new System.Drawing.Size(45, 17);
this.radioButtonMBLow.TabIndex = 7;
this.radioButtonMBLow.TabStop = true;
this.radioButtonMBLow.Text = "Low";
this.radioButtonMBLow.UseVisualStyleBackColor = true;
//
// radioButtonMBMedium
//
this.radioButtonMBMedium.AutoSize = true;
this.radioButtonMBMedium.Location = new System.Drawing.Point(6, 33);
this.radioButtonMBMedium.Name = "radioButtonMBMedium";
this.radioButtonMBMedium.Size = new System.Drawing.Size(62, 17);
this.radioButtonMBMedium.TabIndex = 8;
this.radioButtonMBMedium.TabStop = true;
this.radioButtonMBMedium.Text = "Medium";
this.radioButtonMBMedium.UseVisualStyleBackColor = true;
//
// radioButtonMBNone
//
this.radioButtonMBNone.AutoSize = true;
this.radioButtonMBNone.Location = new System.Drawing.Point(6, 67);
this.radioButtonMBNone.Name = "radioButtonMBNone";
this.radioButtonMBNone.Size = new System.Drawing.Size(51, 17);
this.radioButtonMBNone.TabIndex = 9;
this.radioButtonMBNone.TabStop = true;
this.radioButtonMBNone.Text = "None";
this.radioButtonMBNone.UseVisualStyleBackColor = true;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.radioButtonMBMedium);
this.groupBox1.Controls.Add(this.radioButtonMBHigh);
this.groupBox1.Controls.Add(this.radioButtonMBLow);
this.groupBox1.Controls.Add(this.radioButtonMBNone);
this.groupBox1.Location = new System.Drawing.Point(12, 119);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(83, 95);
this.groupBox1.TabIndex = 15;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Musicbrainz";
//
// groupBox2
//
this.groupBox2.Controls.Add(this.radioButtonFDMedium);
this.groupBox2.Controls.Add(this.radioButtonFDHigh);
this.groupBox2.Controls.Add(this.radioButtonFDLow);
this.groupBox2.Controls.Add(this.radioButtonFDNone);
this.groupBox2.Location = new System.Drawing.Point(101, 119);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(83, 95);
this.groupBox2.TabIndex = 16;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Freedb";
//
// radioButtonFDMedium
//
this.radioButtonFDMedium.AutoSize = true;
this.radioButtonFDMedium.Location = new System.Drawing.Point(6, 33);
this.radioButtonFDMedium.Name = "radioButtonFDMedium";
this.radioButtonFDMedium.Size = new System.Drawing.Size(62, 17);
this.radioButtonFDMedium.TabIndex = 8;
this.radioButtonFDMedium.TabStop = true;
this.radioButtonFDMedium.Text = "Medium";
this.radioButtonFDMedium.UseVisualStyleBackColor = true;
//
// radioButtonFDHigh
//
this.radioButtonFDHigh.AutoSize = true;
this.radioButtonFDHigh.Location = new System.Drawing.Point(6, 16);
this.radioButtonFDHigh.Name = "radioButtonFDHigh";
this.radioButtonFDHigh.Size = new System.Drawing.Size(47, 17);
this.radioButtonFDHigh.TabIndex = 6;
this.radioButtonFDHigh.TabStop = true;
this.radioButtonFDHigh.Text = "High";
this.radioButtonFDHigh.UseVisualStyleBackColor = true;
//
// radioButtonFDLow
//
this.radioButtonFDLow.AutoSize = true;
this.radioButtonFDLow.Location = new System.Drawing.Point(6, 50);
this.radioButtonFDLow.Name = "radioButtonFDLow";
this.radioButtonFDLow.Size = new System.Drawing.Size(45, 17);
this.radioButtonFDLow.TabIndex = 7;
this.radioButtonFDLow.TabStop = true;
this.radioButtonFDLow.Text = "Low";
this.radioButtonFDLow.UseVisualStyleBackColor = true;
//
// radioButtonFDNone
//
this.radioButtonFDNone.AutoSize = true;
this.radioButtonFDNone.Location = new System.Drawing.Point(6, 67);
this.radioButtonFDNone.Name = "radioButtonFDNone";
this.radioButtonFDNone.Size = new System.Drawing.Size(51, 17);
this.radioButtonFDNone.TabIndex = 9;
this.radioButtonFDNone.TabStop = true;
this.radioButtonFDNone.Text = "None";
this.radioButtonFDNone.UseVisualStyleBackColor = true;
//
// buttonOk
//
this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK;
this.buttonOk.Location = new System.Drawing.Point(303, 189);
this.buttonOk.Name = "buttonOk";
this.buttonOk.Size = new System.Drawing.Size(75, 25);
this.buttonOk.TabIndex = 17;
this.buttonOk.Text = "OK";
this.buttonOk.UseVisualStyleBackColor = true;
this.buttonOk.Click += new System.EventHandler(this.button2_Click);
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(12, 101);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(134, 13);
this.label3.TabIndex = 18;
this.label3.Text = "Metadata providers priority:";
//
// groupBox3
//
this.groupBox3.Controls.Add(this.radioButtonFZMedium);
this.groupBox3.Controls.Add(this.radioButtonFZHigh);
this.groupBox3.Controls.Add(this.radioButtonFZLow);
this.groupBox3.Controls.Add(this.radioButtonFZNone);
this.groupBox3.Location = new System.Drawing.Point(190, 119);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(83, 95);
this.groupBox3.TabIndex = 17;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Freedb fuzzy";
//
// radioButtonFZMedium
//
this.radioButtonFZMedium.AutoSize = true;
this.radioButtonFZMedium.Location = new System.Drawing.Point(6, 33);
this.radioButtonFZMedium.Name = "radioButtonFZMedium";
this.radioButtonFZMedium.Size = new System.Drawing.Size(62, 17);
this.radioButtonFZMedium.TabIndex = 8;
this.radioButtonFZMedium.TabStop = true;
this.radioButtonFZMedium.Text = "Medium";
this.radioButtonFZMedium.UseVisualStyleBackColor = true;
//
// radioButtonFZHigh
//
this.radioButtonFZHigh.AutoSize = true;
this.radioButtonFZHigh.Location = new System.Drawing.Point(6, 16);
this.radioButtonFZHigh.Name = "radioButtonFZHigh";
this.radioButtonFZHigh.Size = new System.Drawing.Size(47, 17);
this.radioButtonFZHigh.TabIndex = 6;
this.radioButtonFZHigh.TabStop = true;
this.radioButtonFZHigh.Text = "High";
this.radioButtonFZHigh.UseVisualStyleBackColor = true;
//
// radioButtonFZLow
//
this.radioButtonFZLow.AutoSize = true;
this.radioButtonFZLow.Location = new System.Drawing.Point(6, 50);
this.radioButtonFZLow.Name = "radioButtonFZLow";
this.radioButtonFZLow.Size = new System.Drawing.Size(45, 17);
this.radioButtonFZLow.TabIndex = 7;
this.radioButtonFZLow.TabStop = true;
this.radioButtonFZLow.Text = "Low";
this.radioButtonFZLow.UseVisualStyleBackColor = true;
//
// radioButtonFZNone
//
this.radioButtonFZNone.AutoSize = true;
this.radioButtonFZNone.Location = new System.Drawing.Point(6, 67);
this.radioButtonFZNone.Name = "radioButtonFZNone";
this.radioButtonFZNone.Size = new System.Drawing.Size(51, 17);
this.radioButtonFZNone.TabIndex = 9;
this.radioButtonFZNone.TabStop = true;
this.radioButtonFZNone.Text = "None";
this.radioButtonFZNone.UseVisualStyleBackColor = true;
//
// buttonCancel
//
this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.buttonCancel.Location = new System.Drawing.Point(303, 158);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(75, 25);
this.buttonCancel.TabIndex = 19;
this.buttonCancel.Text = "Cancel";
this.buttonCancel.UseVisualStyleBackColor = true;
//
// Options // Options
// //
this.AcceptButton = this.buttonOk;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(332, 158); this.CancelButton = this.buttonCancel;
this.ClientSize = new System.Drawing.Size(390, 227);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.label3);
this.Controls.Add(this.buttonOk);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.pictureBox1); this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.linkLabel1); this.Controls.Add(this.linkLabel1);
this.Controls.Add(this.label2); this.Controls.Add(this.label2);
@@ -90,6 +320,12 @@ namespace AudioDataPlugIn
this.Text = "Options"; this.Text = "Options";
this.Load += new System.EventHandler(this.Options_Load); this.Load += new System.EventHandler(this.Options_Load);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@@ -101,5 +337,23 @@ namespace AudioDataPlugIn
private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label2;
private System.Windows.Forms.LinkLabel linkLabel1; private System.Windows.Forms.LinkLabel linkLabel1;
private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.RadioButton radioButtonMBHigh;
private System.Windows.Forms.RadioButton radioButtonMBLow;
private System.Windows.Forms.RadioButton radioButtonMBMedium;
private System.Windows.Forms.RadioButton radioButtonMBNone;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.RadioButton radioButtonFDMedium;
private System.Windows.Forms.RadioButton radioButtonFDHigh;
private System.Windows.Forms.RadioButton radioButtonFDLow;
private System.Windows.Forms.RadioButton radioButtonFDNone;
private System.Windows.Forms.Button buttonOk;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.RadioButton radioButtonFZMedium;
private System.Windows.Forms.RadioButton radioButtonFZHigh;
private System.Windows.Forms.RadioButton radioButtonFZLow;
private System.Windows.Forms.RadioButton radioButtonFZNone;
private System.Windows.Forms.Button buttonCancel;
} }
} }

View File

@@ -6,11 +6,16 @@ using System.Drawing;
using System.Text; using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
using CUETools.CTDB.EACPlugin.Properties; using CUETools.CTDB.EACPlugin.Properties;
using CUETools.CTDB;
namespace AudioDataPlugIn namespace AudioDataPlugIn
{ {
public partial class Options : Form public partial class Options : Form
{ {
public static CTDBPriority priorityMusicbrainz = CTDBPriority.High;
public static CTDBPriority priorityFreedb = CTDBPriority.Medium;
public static CTDBPriority priorityFreedbFuzzy = CTDBPriority.Low;
public Options() public Options()
{ {
InitializeComponent(); InitializeComponent();
@@ -24,6 +29,34 @@ namespace AudioDataPlugIn
private void Options_Load(object sender, EventArgs e) private void Options_Load(object sender, EventArgs e)
{ {
this.Icon = Resources.ctdb; this.Icon = Resources.ctdb;
this.radioButtonMBHigh.Checked = priorityMusicbrainz == CTDBPriority.High;
this.radioButtonMBMedium.Checked = priorityMusicbrainz == CTDBPriority.Medium;
this.radioButtonMBLow.Checked = priorityMusicbrainz == CTDBPriority.Low;
this.radioButtonMBNone.Checked = priorityMusicbrainz == CTDBPriority.None;
this.radioButtonFDHigh.Checked = priorityFreedb == CTDBPriority.High;
this.radioButtonFDMedium.Checked = priorityFreedb == CTDBPriority.Medium;
this.radioButtonFDLow.Checked = priorityFreedb == CTDBPriority.Low;
this.radioButtonFDNone.Checked = priorityFreedb == CTDBPriority.None;
this.radioButtonFZHigh.Checked = priorityFreedbFuzzy == CTDBPriority.High;
this.radioButtonFZMedium.Checked = priorityFreedbFuzzy == CTDBPriority.Medium;
this.radioButtonFZLow.Checked = priorityFreedbFuzzy == CTDBPriority.Low;
this.radioButtonFZNone.Checked = priorityFreedbFuzzy == CTDBPriority.None;
}
private void button2_Click(object sender, EventArgs e)
{
priorityMusicbrainz = this.radioButtonMBHigh.Checked ? CTDBPriority.High
: this.radioButtonMBMedium.Checked ? CTDBPriority.Medium
: this.radioButtonMBLow.Checked ? CTDBPriority.Low
: CTDBPriority.None;
priorityFreedb = this.radioButtonFDHigh.Checked ? CTDBPriority.High
: this.radioButtonFDMedium.Checked ? CTDBPriority.Medium
: this.radioButtonFDLow.Checked ? CTDBPriority.Low
: CTDBPriority.None;
priorityFreedbFuzzy = this.radioButtonFZHigh.Checked ? CTDBPriority.High
: this.radioButtonFZMedium.Checked ? CTDBPriority.Medium
: this.radioButtonFZLow.Checked ? CTDBPriority.Low
: CTDBPriority.None;
} }
} }
} }

View File

@@ -57,7 +57,7 @@ namespace CUETools.CTDB
} }
} }
public void ContactDB(string server, string userAgent, string driveName, bool musicbrainz, bool fuzzy) public void ContactDB(string server, string userAgent, string driveName, bool ctdb, bool fuzzy, CTDBPriority musicbrainz, CTDBPriority freedb, CTDBPriority freedbFuzzy)
{ {
this.driveName = driveName; this.driveName = driveName;
this.userAgent = userAgent + " (" + Environment.OSVersion.VersionString + ")" + (driveName != null ? " (" + driveName + ")" : ""); this.userAgent = userAgent + " (" + Environment.OSVersion.VersionString + ")" + (driveName != null ? " (" + driveName + ")" : "");
@@ -65,7 +65,10 @@ namespace CUETools.CTDB
this.total = 0; this.total = 0;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlbase HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlbase
+ "/lookup2.php?musicbrainz=" + (musicbrainz ? 1 : 0) + "/lookup2.php"
+ "?ctdb=" + (ctdb ? "1" : "0")
+ "&musicbrainz=" + ((int)musicbrainz).ToString()
+ "&freedb=" + ((int)freedb + 8 * (int)freedbFuzzy).ToString()
+ "&fuzzy=" + (fuzzy ? 1 : 0) + "&fuzzy=" + (fuzzy ? 1 : 0)
+ "&toc=" + toc.ToString()); + "&toc=" + toc.ToString());
req.Method = "GET"; req.Method = "GET";
@@ -419,6 +422,20 @@ namespace CUETools.CTDB
} }
} }
public int Confidence
{
get
{
if (this.QueryExceptionStatus != WebExceptionStatus.Success)
return 0;
int res = 0;
foreach (DBEntry entry in this.Entries)
if (entry.toc.ToString() == this.toc.ToString() && !entry.hasErrors)
res += entry.conf;
return res;
}
}
public DBEntry MatchingEntry public DBEntry MatchingEntry
{ {
get get
@@ -738,6 +755,8 @@ namespace CUETools.CTDB
public string name { get; set; } public string name { get; set; }
[XmlAttribute] [XmlAttribute]
public string artist { get; set; } public string artist { get; set; }
[XmlAttribute]
public string extra { get; set; }
} }
[Serializable] [Serializable]
@@ -753,7 +772,9 @@ namespace CUETools.CTDB
public class CTDBResponseMeta public class CTDBResponseMeta
{ {
[XmlAttribute] [XmlAttribute]
public string release_gid { get; set; } public string source { get; set; }
[XmlAttribute]
public string id { get; set; }
[XmlAttribute] [XmlAttribute]
public string artist { get; set; } public string artist { get; set; }
[XmlAttribute] [XmlAttribute]
@@ -763,6 +784,8 @@ namespace CUETools.CTDB
[XmlAttribute] [XmlAttribute]
public string genre { get; set; } public string genre { get; set; }
[XmlAttribute] [XmlAttribute]
public string extra { get; set; }
[XmlAttribute]
public string country { get; set; } public string country { get; set; }
[XmlAttribute] [XmlAttribute]
public string releasedate { get; set; } public string releasedate { get; set; }
@@ -793,4 +816,12 @@ namespace CUETools.CTDB
[XmlElement] [XmlElement]
public CTDBResponseMeta[] musicbrainz; public CTDBResponseMeta[] musicbrainz;
} }
public enum CTDBPriority
{
None = 0,
High = 1,
Medium = 2,
Low = 3
}
} }

View File

@@ -245,6 +245,7 @@ namespace CUETools.Processor
this.Barcode = cdEntry.barcode ?? ""; this.Barcode = cdEntry.barcode ?? "";
this.ReleaseDate = cdEntry.releasedate ?? ""; this.ReleaseDate = cdEntry.releasedate ?? "";
this.Country = cdEntry.country ?? ""; this.Country = cdEntry.country ?? "";
this.Genre = cdEntry.genre ?? "";
this.Label = ""; this.Label = "";
if (cdEntry.label != null) if (cdEntry.label != null)
foreach (var l in cdEntry.label) foreach (var l in cdEntry.label)

View File

@@ -129,6 +129,10 @@ namespace CUETools.Processor
public DateTime VerificationDate { get; set; } public DateTime VerificationDate { get; set; }
public DateTime CTDBVerificationDate { get; set; }
public int CTDBConfidence { get; set; }
[XmlIgnore] [XmlIgnore]
public string Path public string Path
{ {
@@ -2207,7 +2211,7 @@ return processor.Go();
_localDB.Save(); _localDB.Save();
} }
public List<object> LookupAlbumInfo(bool useFreedb, bool useCTDB, bool useCache, bool useCUE) public List<object> LookupAlbumInfo(bool useCache, bool useCUE, bool useCTDB, CTDBPriority priorityMusicbrainz, CTDBPriority priorityFreedb, CTDBPriority priorityFreedbFuzzy)
{ {
List<object> Releases = new List<object>(); List<object> Releases = new List<object>();
@@ -2264,18 +2268,18 @@ return processor.Go();
{ {
ShowProgress("Looking up album via CTDB...", 0.0, null, null); ShowProgress("Looking up album via CTDB...", 0.0, null, null);
var ctdb = new CUEToolsDB(TOC, proxy); var ctdb = new CUEToolsDB(TOC, proxy);
ctdb.ContactDB(_config.advanced.CTDBServer, "CUETools " + CUEToolsVersion, null, true, true); ctdb.ContactDB(_config.advanced.CTDBServer, "CUETools " + CUEToolsVersion, null, false, false, priorityMusicbrainz, priorityFreedb, priorityFreedbFuzzy);
foreach (var meta in ctdb.Metadata) foreach (var meta in ctdb.Metadata)
{ {
CUEMetadata metadata = new CUEMetadata(TOC.TOCID, (int)TOC.AudioTracks); CUEMetadata metadata = new CUEMetadata(TOC.TOCID, (int)TOC.AudioTracks);
metadata.FillFromCtdb(meta, TOC.FirstAudio - 1); metadata.FillFromCtdb(meta, TOC.FirstAudio - 1);
CDImageLayout toc = TOC; // TocFromCDEntry(meta); CDImageLayout toc = TOC; // TocFromCDEntry(meta);
Releases.Add(new CUEMetadataEntry(metadata, toc, "ctdb")); Releases.Add(new CUEMetadataEntry(metadata, toc, meta.source));
ctdbFound = true; ctdbFound = true;
} }
} }
if (useFreedb) if (!ctdbFound && priorityFreedb != CTDBPriority.None)
{ {
ShowProgress("Looking up album via Freedb...", 0.0, null, null); ShowProgress("Looking up album via Freedb...", 0.0, null, null);
@@ -3192,13 +3196,13 @@ return processor.Go();
// TODO: It should also be set when assigning a DataTrack!!! // TODO: It should also be set when assigning a DataTrack!!!
} }
public void UseCUEToolsDB(string userAgent, string driveName, bool meta, bool fuzzy) public void UseCUEToolsDB(string userAgent, string driveName, bool fuzzy, CTDBPriority musicbrainz, CTDBPriority freedb, CTDBPriority freedbFuzzy)
{ {
ShowProgress((string)"Contacting CUETools database...", 0, null, null); ShowProgress((string)"Contacting CUETools database...", 0, null, null);
_CUEToolsDB = new CUEToolsDB(_toc, proxy); _CUEToolsDB = new CUEToolsDB(_toc, proxy);
_CUEToolsDB.UploadHelper.onProgress += new EventHandler<Krystalware.UploadHelper.UploadProgressEventArgs>(UploadProgress); _CUEToolsDB.UploadHelper.onProgress += new EventHandler<Krystalware.UploadHelper.UploadProgressEventArgs>(UploadProgress);
_CUEToolsDB.ContactDB(_config.advanced.CTDBServer, userAgent, driveName, meta, fuzzy); _CUEToolsDB.ContactDB(_config.advanced.CTDBServer, userAgent, driveName, true, fuzzy, musicbrainz, freedb, freedbFuzzy);
if (!_toc[_toc.TrackCount].IsAudio && DataTrackLength == 0) if (!_toc[_toc.TrackCount].IsAudio && DataTrackLength == 0)
foreach (DBEntry e in _CUEToolsDB.Entries) foreach (DBEntry e in _CUEToolsDB.Entries)
@@ -4133,7 +4137,7 @@ return processor.Go();
} }
} }
public readonly static string CUEToolsVersion = "2.1.2"; public readonly static string CUEToolsVersion = "2.1.2a";
public void GenerateAccurateRipLog(TextWriter sw) public void GenerateAccurateRipLog(TextWriter sw)
{ {
@@ -4192,10 +4196,10 @@ return processor.Go();
FindBestOffset(1, false, out tracksMatch, out bestOffset); FindBestOffset(1, false, out tracksMatch, out bestOffset);
if (bestOffset != 0) if (bestOffset != 0)
prefix += string.Format("offset {0}, ", bestOffset); prefix += string.Format("offset {0}, ", bestOffset);
if (tracksMatch == TrackCount) if (_arVerify.WorstConfidence() > 0)
prefix += string.Format("rip accurate ({0}/{1})", _arVerify.WorstConfidence(), _arVerify.WorstTotal()); prefix += string.Format("rip accurate ({0}/{1})", _arVerify.WorstConfidence(), _arVerify.WorstTotal());
else else
prefix += string.Format("rip not accurate ({0}/{1})", _arVerify.WorstConfidence(), _arVerify.WorstTotal()); prefix += string.Format("rip not accurate ({0}/{1})", 0, _arVerify.WorstTotal());
} }
} }
if (!_useCUEToolsDBFix && _useCUEToolsDB) if (!_useCUEToolsDBFix && _useCUEToolsDB)
@@ -4342,11 +4346,27 @@ return processor.Go();
if (_action == CUEAction.Verify && _useLocalDB) if (_action == CUEAction.Verify && _useLocalDB)
{ {
var now = DateTime.Now;
var entry = OpenLocalDBEntry(); var entry = OpenLocalDBEntry();
entry.Status = this.GenerateAccurateRipStatus(); entry.Status = this.GenerateAccurateRipStatus();
entry.ARConfidence = _arVerify.WorstConfidence(); entry.ARConfidence = _useAccurateRip ? _arVerify.WorstConfidence() : 0;
entry.CTDBConfidence = _useCUEToolsDB && !_useCUEToolsDBFix ? CTDB.Confidence : 0;
entry.Log = AccurateRipLog; entry.Log = AccurateRipLog;
entry.VerificationDate = DateTime.Now; entry.VerificationDate =
_useAccurateRip &&
(_arVerify.ExceptionStatus == WebExceptionStatus.Success ||
(_arVerify.ExceptionStatus == WebExceptionStatus.ProtocolError &&
_arVerify.ResponseStatus == HttpStatusCode.NotFound
)
) ? now : DateTime.MinValue;
entry.CTDBVerificationDate =
_useCUEToolsDB &&
!_useCUEToolsDBFix &&
(CTDB.QueryExceptionStatus == WebExceptionStatus.Success ||
(CTDB.QueryExceptionStatus == WebExceptionStatus.ProtocolError &&
CTDB.QueryResponseStatus == HttpStatusCode.NotFound
)
) ? now : DateTime.MinValue;
entry.OffsetSafeCRC = _arVerify.OffsetSafeCRC; entry.OffsetSafeCRC = _arVerify.OffsetSafeCRC;
} }
@@ -6196,7 +6216,7 @@ return processor.Go();
return ArVerify.ExceptionStatus != WebExceptionStatus.Success ? WriteReport() : Go(); return ArVerify.ExceptionStatus != WebExceptionStatus.Success ? WriteReport() : Go();
case "repair": case "repair":
{ {
UseCUEToolsDB("CUETools " + CUEToolsVersion, null, false, true); UseCUEToolsDB("CUETools " + CUEToolsVersion, null, true, CTDBPriority.None, CTDBPriority.None, CTDBPriority.None);
Action = CUEAction.Verify; Action = CUEAction.Verify;
if (CTDB.DBStatus != null) if (CTDB.DBStatus != null)
return CTDB.DBStatus; return CTDB.DBStatus;

View File

@@ -180,7 +180,7 @@ namespace CUETools.ConsoleRipper
string ArId = AccurateRipVerify.CalculateAccurateRipId(audioSource.TOC); string ArId = AccurateRipVerify.CalculateAccurateRipId(audioSource.TOC);
var ctdb = new CUEToolsDB(audioSource.TOC, null); var ctdb = new CUEToolsDB(audioSource.TOC, null);
ctdb.Init(arVerify); ctdb.Init(arVerify);
ctdb.ContactDB(null, "CUETools.ConsoleRipper 2.1.2", audioSource.ARName, true, false); ctdb.ContactDB(null, "CUETools.ConsoleRipper 2.1.2", audioSource.ARName, true, false, CTDBPriority.High, CTDBPriority.Medium, CTDBPriority.Low);
arVerify.ContactAccurateRip(ArId); arVerify.ContactAccurateRip(ArId);
CTDBResponseMeta meta = null; CTDBResponseMeta meta = null;
foreach (var imeta in ctdb.Metadata) foreach (var imeta in ctdb.Metadata)

View File

@@ -40,6 +40,7 @@ using CUETools.Processor;
using CUETools.CDImage; using CUETools.CDImage;
using CUETools.Compression; using CUETools.Compression;
using CUETools.AccurateRip; using CUETools.AccurateRip;
using CUETools.CTDB;
namespace JDP { namespace JDP {
public partial class frmCUETools : Form { public partial class frmCUETools : Form {
@@ -582,7 +583,7 @@ namespace JDP {
{ {
get get
{ {
return "CUETools 2.1.0"; return "CUETools 2.1.2";
} }
} }
@@ -887,7 +888,7 @@ namespace JDP {
if (useLocalDB) if (useLocalDB)
cueSheet.UseLocalDB(_localDB); cueSheet.UseLocalDB(_localDB);
if (useCUEToolsDB) if (useCUEToolsDB)
cueSheet.UseCUEToolsDB("CUETools " + CUESheet.CUEToolsVersion, null, false, true); cueSheet.UseCUEToolsDB("CUETools " + CUESheet.CUEToolsVersion, null, true, CTDBPriority.None, CTDBPriority.None, CTDBPriority.None);
if (useAR) if (useAR)
cueSheet.UseAccurateRip(); cueSheet.UseAccurateRip();
@@ -920,7 +921,12 @@ namespace JDP {
if (_choiceMaxed) if (_choiceMaxed)
dlg.WindowState = FormWindowState.Maximized; dlg.WindowState = FormWindowState.Maximized;
dlg.CUE = cueSheet; dlg.CUE = cueSheet;
dlg.LookupAlbumInfo(checkBoxUseFreeDb.Checked, checkBoxUseMusicBrainz.Checked, _profile._config.advanced.CacheMetadata, true); dlg.LookupAlbumInfo(_profile._config.advanced.CacheMetadata,
true,
true,
checkBoxUseMusicBrainz.Checked ? CTDBPriority.High : CTDBPriority.None,
checkBoxUseFreeDb.Checked ? CTDBPriority.High : CTDBPriority.None,
checkBoxUseFreeDb.Checked ? CTDBPriority.Low : CTDBPriority.None);
dlgRes = dlg.ShowDialog(this); dlgRes = dlg.ShowDialog(this);
_choiceMaxed = dlg.WindowState == FormWindowState.Maximized; _choiceMaxed = dlg.WindowState == FormWindowState.Maximized;
if (!_choiceMaxed) if (!_choiceMaxed)
@@ -2177,7 +2183,7 @@ namespace JDP {
if (_choiceMaxed) if (_choiceMaxed)
dlg.WindowState = FormWindowState.Maximized; dlg.WindowState = FormWindowState.Maximized;
dlg.CUE = CueSheet; dlg.CUE = CueSheet;
dlg.LookupAlbumInfo(true, true, true, node is FileSystemTreeNodeLocalDBEntry); dlg.LookupAlbumInfo(true, node is FileSystemTreeNodeLocalDBEntry, true, CTDBPriority.High, CTDBPriority.Medium, CTDBPriority.Low);
var dlgRes = dlg.ShowDialog(this); var dlgRes = dlg.ShowDialog(this);
_choiceMaxed = dlg.WindowState == FormWindowState.Maximized; _choiceMaxed = dlg.WindowState == FormWindowState.Maximized;
if (!_choiceMaxed) if (!_choiceMaxed)

View File

@@ -2891,7 +2891,7 @@
<value>700, 538</value> <value>700, 538</value>
</data> </data>
<data name="$this.Text" xml:space="preserve"> <data name="$this.Text" xml:space="preserve">
<value>CUETools 2.1.2</value> <value>CUETools 2.1.2a</value>
</data> </data>
<data name="&gt;&gt;toolStripStatusLabel1.Name" xml:space="preserve"> <data name="&gt;&gt;toolStripStatusLabel1.Name" xml:space="preserve">
<value>toolStripStatusLabel1</value> <value>toolStripStatusLabel1</value>

View File

@@ -143,7 +143,9 @@ namespace JDP
this.listMetadata.Name = "listMetadata"; this.listMetadata.Name = "listMetadata";
this.listMetadata.UseCompatibleStateImageBehavior = false; this.listMetadata.UseCompatibleStateImageBehavior = false;
this.listMetadata.View = System.Windows.Forms.View.Details; this.listMetadata.View = System.Windows.Forms.View.Details;
this.listMetadata.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.listMetadata_AfterLabelEdit);
this.listMetadata.DoubleClick += new System.EventHandler(this.listMetadata_DoubleClick); this.listMetadata.DoubleClick += new System.EventHandler(this.listMetadata_DoubleClick);
this.listMetadata.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listMetadata_KeyDown);
// //
// columnHeaderMetadataValue // columnHeaderMetadataValue
// //
@@ -167,7 +169,11 @@ namespace JDP
this.listTracks.Name = "listTracks"; this.listTracks.Name = "listTracks";
this.listTracks.UseCompatibleStateImageBehavior = false; this.listTracks.UseCompatibleStateImageBehavior = false;
this.listTracks.View = System.Windows.Forms.View.Details; this.listTracks.View = System.Windows.Forms.View.Details;
this.listTracks.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.listTracks_AfterLabelEdit);
this.listTracks.DoubleClick += new System.EventHandler(this.listTracks_DoubleClick); this.listTracks.DoubleClick += new System.EventHandler(this.listTracks_DoubleClick);
this.listTracks.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.listTracks_PreviewKeyDown);
this.listTracks.BeforeLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.listTracks_BeforeLabelEdit);
this.listTracks.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listTracks_KeyDown);
// //
// Title // Title
// //

View File

@@ -8,6 +8,7 @@ using System.IO;
using System.Windows.Forms; using System.Windows.Forms;
using CUETools.CDImage; using CUETools.CDImage;
using CUETools.Processor; using CUETools.Processor;
using CUETools.CTDB;
namespace JDP namespace JDP
{ {
@@ -20,15 +21,18 @@ namespace JDP
public CUESheet CUE; public CUESheet CUE;
private bool freedb, ctdb; private bool ctdb;
private CTDBPriority priorityMusicbrainz, priorityFreedb, priorityFreedbFuzzy;
public void LookupAlbumInfo(bool freedb, bool ctdb, bool cache, bool cue) public void LookupAlbumInfo(bool cache, bool cue, bool ctdb, CTDBPriority priorityMusicbrainz, CTDBPriority priorityFreedb, CTDBPriority priorityFreedbFuzzy)
{ {
this.freedb = freedb;
this.ctdb = ctdb; this.ctdb = ctdb;
var releases = CUE.LookupAlbumInfo(false, false, cache, cue); this.priorityMusicbrainz = priorityMusicbrainz;
this.priorityFreedb = priorityFreedb;
this.priorityFreedbFuzzy = priorityFreedbFuzzy;
var releases = CUE.LookupAlbumInfo(cache, cue, false, CTDBPriority.None, CTDBPriority.None, CTDBPriority.None);
this.Choices = releases; this.Choices = releases;
if (freedb || ctdb) if (ctdb || priorityMusicbrainz != CTDBPriority.None || priorityFreedb != CTDBPriority.None || priorityFreedbFuzzy != CTDBPriority.None)
backgroundWorker1.RunWorkerAsync(null); backgroundWorker1.RunWorkerAsync(null);
} }
@@ -266,8 +270,37 @@ namespace JDP
private void listMetadata_KeyDown(object sender, KeyEventArgs e) private void listMetadata_KeyDown(object sender, KeyEventArgs e)
{ {
CUEMetadataEntry r = ChosenRelease;
if (e.KeyCode == Keys.F2) if (e.KeyCode == Keys.F2)
listMetadata.FocusedItem.BeginEdit(); listMetadata.FocusedItem.BeginEdit();
if (e.KeyCode == Keys.Delete && r != null)
{
foreach (int i in listMetadata.SelectedIndices)
{
switch (i)
{
case 0:
foreach (CUETrackMetadata track in r.metadata.Tracks)
if (track.Artist == r.metadata.Artist)
track.Artist = "";
r.metadata.Artist = "";
break;
case 1: r.metadata.Title = ""; break;
case 2: r.metadata.Year = ""; break;
case 3: r.metadata.Genre = ""; break;
case 4: r.metadata.DiscNumber = ""; break;
case 5: r.metadata.TotalDiscs = ""; break;
case 6: r.metadata.DiscName = ""; break;
case 7: r.metadata.Barcode = ""; break;
case 8: r.metadata.ReleaseDate = ""; break;
case 9: r.metadata.Label = ""; break;
case 10: r.metadata.Country = ""; break;
}
listMetadata.Items[i].Text = "";
}
ListViewItem item = ChosenItem;
item.Text = r.ToString();
}
} }
private void listMetadata_AfterLabelEdit(object sender, LabelEditEventArgs e) private void listMetadata_AfterLabelEdit(object sender, LabelEditEventArgs e)
@@ -307,7 +340,7 @@ namespace JDP
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{ {
e.Result = CUE.LookupAlbumInfo(this.freedb, this.ctdb, false, false); e.Result = CUE.LookupAlbumInfo(false, false, this.ctdb, this.priorityMusicbrainz, this.priorityFreedb, this.priorityFreedbFuzzy);
} }
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

View File

@@ -166,142 +166,142 @@
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB4
HwAAAk1TRnQBSQFMAgEBBwEAAQwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA HwAAAk1TRnQBSQFMAgEBBwEAAQwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABIB4AAx0BKgNDAXcDHQEqeAABKAInATsBWgFUAU4BlAGFAXABWwHOAaIBfgFZ AwABIAMAAQEBAAEgBgABIB4AAx0BKgNDAXcDHQEqeAADJwE7AVIBUAFOAZQBdwFqAVwBzgGYAXoBWQHr
AesBogF+AVkB6wGFAXABWwHOAVoBVAFOAZQCAAHiAf8CAAHiAf9UAAMdASkDQgF0Av8B8AH/A0IBdAMd AZgBegFZAesBdwFqAVwBzgFSAVABTgGUAgAB4gH/AgAB4gH/VAADHQEpA0IBdAL/AfAB/wNCAXQDHQEp
ASlsAAMKAQ0BWgFUAU8BlgGvAYIBVQH6AeEBzQG5Af8B8QHgAc4B/wH5AecB1gH/AfgB5gHUAf8B8AHd bAADCgENAVIBUAFOAZYBrAF/AVMB+gHhAc0BuQH/AfEB4AHOAf8B+QHnAdYB/wH4AeYB1AH/AfAB3QHM
AcwB/wHhAc0BuQH/AgAB4gH/AgAB4gH/AwoBDUwAAxwBKANAAXEC/wHwAf8C6QHaA/8B8QH/A0ABcQMc Af8B4QHNAbkB/wIAAeIB/wIAAeIB/wMKAQ1MAAMcASgDQAFxAv8B8AH/AukB2gP/AfEB/wNAAXEDHAEo
ASggAAM2AVkDQgF2A0IBdgMwAUsEAAMwAUsDQgF2A0IBdgNCAXYDQgF2AzABSwQAAzABSwNCAXYDQgF2 IAADNgFZA0IBdgNCAXYDMAFLBAADMAFLA0IBdgNCAXYDQgF2A0IBdgMwAUsEAAMwAUsDQgF2A0IBdgM2
AzYBWQQAAwoBDQFzAWUBVwG4AdkBvwGlAf8B/gHyAeQC/wHnAc8B/wH8AdsBuwH/AfkB0wGyAf8B9gHQ AVkEAAMKAQ0BZgFfAVcBuAHZAb8BpQH/Af4B8gHkAv8B5wHPAf8B/AHbAbsB/wH5AdMBsgH/AfYB0AGs
AawB/wH0AdEBrgH/AfYB2AG7Af8CAAHiAf8CAAHiAf8BcwFlAVcBuAMKAQ1EAAMcAScDQAFvAv8B8AH/ Af8B9AHRAa4B/wH2AdgBuwH/AgAB4gH/AgAB4gH/AWYBXwFXAbgDCgENRAADHAEnA0ABbwL/AfAB/wHr
AesB3QGxAf8B9wHBATQB/wHtAd8BswP/AfIB/wNAAW8DHAEnHAADQQFyAvkB6QH/AvMB4wH/AlkBVgG1 Ad0BsQH/AfcBwQEzAf8B7QHfAbMD/wHyAf8DQAFvAxwBJxwAA0EBcgL5AekB/wLzAeMB/wJWAVUBtQND
A0MBeANfAcMC8wHjAf8C8wHjAf8C8wHjAf8C8wHjAf8DXwHDA0MBeAJZAVYBtQLzAeMB/wL5AekB/wNB AXgDXQHDAvMB4wH/AvMB4wH/AvMB4wH/AvMB4wH/A10BwwNDAXgCVgFVAbUC8wHjAf8C+QHpAf8DQQFy
AXIEAAFaAVQBTwGWAdkBvwGlAv8B+AHrAv8B6wHRAv8B4QHDAf8B/gHbAboB/wH7AdYBsgH/AgAB4gH/ BAABUgFQAU4BlgHZAb8BpQL/AfgB6wL/AesB0QL/AeEBwwH/Af4B2wG6Af8B+wHWAbIB/wIAAeIB/wIA
AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/QAADQAFuAv8B8AH/AukB2gH/ AeIB/wIAAeIB/wIAAeIB/wIAAeIB/wIAAeIB/wIAAeIB/wIAAeIB/0AAA0ABbgL/AfAB/wLpAdoB/wHn
AecBqwEeAf8B5wGrAR4B/wHnAasBHgH/AeoB2wGwA/8B9AH/A0ABbgMcAScYAANAAW8C9AHmAf8C6QHa AasBHQH/AecBqwEdAf8B5wGrAR0B/wHqAdsBsAP/AfQB/wNAAW4DHAEnGAADQAFvAvQB5gH/AukB2gH/
Af8C7wHgAf8C9AHmAf8C7wHgAf8C6QHaAf8C6QHaAf8C6QHaAf8C6QHaAf8C7wHgAf8C9AHmAf8C7wHg Au8B4AH/AvQB5gH/Au8B4AH/AukB2gH/AukB2gH/AukB2gH/AukB2gH/Au8B4AH/AvQB5gH/Au8B4AH/
Af8C6QHaAf8C9AHmAf8DQAFvAyYBOAG2AYcBVQH9Av4B+gL/AfkB6QL/Ae8B2AL/AecBzQL/AeEBwgH/ AukB2gH/AvQB5gH/A0ABbwMmATgBtQGHAVQB/QL+AfoC/wH5AekC/wHvAdgC/wHnAc0C/wHhAcIB/wH8
AfwB3AG7Af8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf8CAAHiAf9AAAMc AdwBuwH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/AgAB4gH/QAADHAEn
AScDPwFtAv8B8QH/AecB1wGrAf8B1wGWAQkB/wHXAZYBCQH/AdcBlgEJAf8B6AHYAa4D/wH1Af8DPwFt Az8BbQL/AfEB/wHnAdcBqwH/AdcBlgEIAf8B1wGWAQgB/wHXAZYBCAH/AegB2AGuA/8B9QH/Az8BbQMc
AxwBJxQAA0ABbgL2AegB/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wLr AScUAANAAW4C9gHoAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C6wHe
Ad4B/wLrAd4B/wLrAd4B/wLrAd4B/wLrAd4B/wL2AegB/wNAAW4BWgFUAU8BlgHiAc4BugH/AfcB3gHG Af8C6wHeAf8C6wHeAf8C6wHeAf8C6wHeAf8C9gHoAf8DQAFuAVIBUAFOAZYB4gHOAboB/wH3Ad4BxgL/
Av8B6QHRAv8B9gHiAv8B8gHdAv8B8AHdAf8B+AHqAdkB/wH4AeYB1AH/AfsB3wHHAf8B9QHPAasB/wIA AekB0QL/AfYB4gL/AfIB3QL/AfAB3QH/AfgB6gHZAf8B+AHmAdQB/wH7Ad8BxwH/AfUBzwGrAf8CAAHi
AeIB/wIAAeIB/wH4Ad0BwwH/AeIBzgG6Af8BWgFUAU8BlkQAAxsBJgM/AWwC/wHyAf8B5QHUAakB/wHN Af8CAAHiAf8B+AHdAcMB/wHiAc4BugH/AVIBUAFOAZZEAAMbASYDPwFsAv8B8gH/AeUB1AGpAf8BzQGJ
AYkBAAH/Ac0BiQEAAf8BzQGJAQAB/wHoAdcBrwP/AfcB/wM/AWwDGwEmEAADPwFtAvcB7AH/Au4B4wH/ AQAB/wHNAYkBAAH/Ac0BiQEAAf8B6AHXAa8D/wH3Af8DPwFsAxsBJhAAAz8BbQL3AewB/wLuAeMB/wLu
Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/Au4B4wH/ AeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLuAeMB/wLu
Au4B4wH/AvcB7AH/Az8BbQGGAXABWwHQAe8B4AHQAf8B5wG+AZYB/wHnAbwBlAH/AfABzAGpAf8B/gHs AeMB/wL3AewB/wM/AW0BeAFqAVsB0AHvAeAB0AH/AecBvgGWAf8B5wG8AZQB/wHwAcwBqQH/Af4B7AHa
AdoB/wHdAcQBrAH/AZwBfAFcAecBnAF8AVwB5wHdAcMBqgH/AfgB3QHEAf8CAAHiAf8CAAHiAf8B9QHW Af8B3QHEAawB/wGRAXcBXAHnAZEBdwFcAecB3QHDAaoB/wH4Ad0BxAH/AgAB4gH/AgAB4gH/AfUB1gG4
AbgB/wHxAd8BzwH/AYYBcAFbAdBIAAMbASYDPgFrAv8B9AH/AecB1gGsAf8B0QGOAQEB/wHRAY4BAQH/ Af8B8QHfAc8B/wF4AWoBWwHQSAADGwEmAz4BawL/AfQB/wHnAdYBrAH/AdEBjgEAAf8B0QGOAQAB/wHR
AdEBjgEBAf8B7AHbAbMD/wH4Af8DPgFrAxsBJgwAAz4BawL5Ae8B/wLxAegB/wLxAegB/wLxAegB/wLx AY4BAAH/AewB2wGzA/8B+AH/Az4BawMbASYMAAM+AWsC+QHvAf8C8QHoAf8C8QHoAf8C8QHoAf8C8QHo
AegB/wLxAegB/wMAAf8BTAGFAZMB/wG4AssB/wLxAegB/wLxAegB/wLxAegB/wLxAegB/wL5Ae8B/wM+ Af8C8QHoAf8DAAH/AUsBhQGTAf8BuALLAf8C8QHoAf8C8QHoAf8C8QHoAf8C8QHoAf8C+QHvAf8DPgFr
AWsBoQF9AVkB7AH1AeQB1QH/AekBvgGXAf8B6AG8AZYB/wHnAbwBlAH/AfMB3gHKAf8BnAF7AVkB5gMU AZgBegFZAewB9QHkAdUB/wHpAb4BlwH/AegBvAGWAf8B5wG8AZQB/wHzAd4BygH/AZIBdwFZAeYDFAEb
ARsDFAEbAZwBewFZAeYB9gHjAdMB/wIAAeIB/wIAAeIB/wHtAckBpAH/AfYB5AHSAf8BoQF9AVkB7EwA AxQBGwGSAXcBWQHmAfYB4wHTAf8CAAHiAf8CAAHiAf8B7QHJAaQB/wH2AeQB0gH/AZgBegFZAexMAAMb
AxsBJgM+AWsC/wH1Af8B6wHcAbMB/wHfAaEBFAH/Ad8BoQEUAf8B3wGhARQB/wHxAeIBuwP/AfoB/wM+ ASYDPgFrAv8B9QH/AesB3AGzAf8B3wGhARMB/wHfAaEBEwH/Ad8BoQETAf8B8QHiAbsD/wH6Af8DPgFr
AWsDGwEmCAADPgFqAvoB8wH/AvUB7gH/AvUB7gH/AvUB7gH/AvUB7gH/AvUB7gH/AXcBsQHAAf8B2QH0 AxsBJggAAz4BagL6AfMB/wL1Ae4B/wL1Ae4B/wL1Ae4B/wL1Ae4B/wL1Ae4B/wF2AbEBwAH/AdkB9AL/
Av8BOgGcAasB/wG1AdMB1AH/AvUB7gH/AvUB7gH/AvUB7gH/AvoB8wH/Az4BagGhAX0BWQHsAfUB5AHV ATkBnAGrAf8BtQHTAdQB/wL1Ae4B/wL1Ae4B/wL1Ae4B/wL6AfMB/wM+AWoBmAF6AVkB7AH1AeQB1QH/
Af8B6QG/AZkB/wHpAcABmQH/AekBwQGaAf8B8wHdAckB/wGcAXsBWQHmAxQBGwMUARsBnAF7AVkB5gH4 AekBvwGZAf8B6QHAAZkB/wHpAcEBmgH/AfMB3QHJAf8BkgF3AVkB5gMUARsDFAEbAZIBdwFZAeYB+AHo
AegB2QH/AfIB0gGyAf8B8AHMAasB/wHwAcwBqwH/AfYB5AHTAf8BoQF9AVkB7FAAAxsBJgM+AWoC/wH3 AdkB/wHyAdIBsgH/AfABzAGrAf8B8AHMAasB/wH2AeQB0wH/AZgBegFZAexQAAMbASYDPgFqAv8B9wH/
Af8B8gHkAbsB/wHwAbgBKwH/AfABuAErAf8B8AG4ASsB/wL4AfQD/wH7Af8DPgFqAxoBJQQAAz0BaQL8 AfIB5AG7Af8B8AG4ASoB/wHwAbgBKgH/AfABuAEqAf8C+AH0A/8B+wH/Az4BagMaASUEAAM9AWkC/AH3
AfcB/wL4AfMB/wL4AfMB/wL4AfMB/wL4AfMB/wL4AfMB/wHUAeYB5wH/AUQBtAHDAf8BdAHmAfcB/wE7 Af8C+AHzAf8C+AHzAf8C+AHzAf8C+AHzAf8C+AHzAf8B1AHmAecB/wFDAbQBwwH/AXMB5gH3Af8BOgGd
AZ0BrQH/AbYB1QHXAf8C+AHzAf8C+AHzAf8C/AH3Af8DPQFpAYYBcAFbAdAB8AHhAdEB/wHqAcQBoQH/ Aa0B/wG2AdUB1wH/AvgB8wH/AvgB8wH/AvwB9wH/Az0BaQF4AWoBWwHQAfAB4QHRAf8B6gHEAaEB/wHp
AekBwQGbAf8B6QHAAZcB/wHxAc4BsgH/AdwBwwGqAf8BnAF8AVwB5wGcAXwBXAHnAd0BxAGsAv8B/AHz AcEBmwH/AekBwAGXAf8B8QHOAbIB/wHcAcMBqgH/AZEBdwFcAecBkQF3AVwB5wHdAcQBrAL/AfwB8wL/
Av8B9AHlAv8B7gHaAf8B/AHlAdEB/wHxAeEB0QH/AYYBcAFbAdBUAAMaASUDPQFpAv8B+AH/AfcB6gHD AfQB5QL/Ae4B2gH/AfwB5QHRAf8B8QHhAdEB/wF4AWoBWwHQVAADGgElAz0BaQL/AfgB/wH3AeoBwwH/
Af8B/QHJATwB/wH5AewBxwH/AvsB9wH/AvwB+QP/AfwB/wM9AWkDGgElAz0BaAL9AfoB/wL7AfcB/wL7 Af0ByQE7Af8B+QHsAccB/wL7AfcB/wL8AfkD/wH8Af8DPQFpAxoBJQM9AWgC/QH6Af8C+wH3Af8C+wH3
AfcB/wL7AfcB/wL7AfcB/wL7AfcB/wL7AfcB/wG+AeUB6AH/AUUBtQHFAf8BdAHmAfcB/wE8AZ4BrgH/ Af8C+wH3Af8C+wH3Af8C+wH3Af8C+wH3Af8BvgHlAegB/wFEAbUBxQH/AXMB5gH3Af8BOwGeAa4B/wG5
AbkB2AHbAf8C+wH3Af8C/QH6Af8DPQFoAVoBVAFPAZYB4gHOAboB/wHxAdIBtgH/AesBwQGbAf8B6wG/ AdgB2wH/AvsB9wH/Av0B+gH/Az0BaAFSAVABTgGWAeIBzgG6Af8B8QHSAbYB/wHrAcEBmwH/AesBvwGZ
AZkC/wHkAdMC/wHoAdsB/wHzAdoBxwH/AfgB8QHkAv8B+AHtAv8B9wHpAv8B/gHxAv8B/AHvAv8B/AHy Av8B5AHTAv8B6AHbAf8B8wHaAccB/wH4AfEB5AL/AfgB7QL/AfcB6QL/Af4B8QL/AfwB7wL/AfwB8gH/
Af8B4gHOAboB/wFaAVQBTwGWWAADGgElAz0BaAL/AfoB/wL4AfQB/wL7AfcB/wLoAd4B/wLYAckB/wLo AeIBzgG6Af8BUgFQAU4BllgAAxoBJQM9AWgC/wH6Af8C+AH0Af8C+wH3Af8C6AHeAf8C2AHJAf8C6AHe
Ad4D/wH+Af8DPQFoAz0BaAL+Af0B/wL9AfsB/wL9AfsB/wL9AfsB/wL9AfsB/wL9AfsB/wL9AfsB/wL9 A/8B/gH/Az0BaAM9AWgC/gH9Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7Af8C/QH7
AfsB/wHAAeYB6wH/AUYBtQHGAf8BdAHmAfcB/wE8AZ4BrwH/Ab4B2AHcAf8C/gH9Af8DPQFoAyYBOAG2 Af8BwAHmAesB/wFFAbUBxgH/AXMB5gH3Af8BOwGeAa8B/wG+AdgB3AH/Av4B/QH/Az0BaAMmATgBtQGH
AYcBVQH9AfoB7QHhAf8B7AHHAaMC/wHsAdoF/wH3Ac0BtgH/AewBvQGXAv8B9AHcA/8B9wL/AfcB6AP/ AVQB/QH6Ae0B4QH/AewBxwGjAv8B7AHaBf8B9wHNAbYB/wHsAb0BlwL/AfQB3AP/AfcC/wH3AegD/wHz
AfMD/wH5Af8C/gH5Af8BtgGHAVUB/QMmAThcAAMaASUDPQFoAv8B+wH/AvwB+QH/AssBuwH/BAACywG8 A/8B+QH/Av4B+QH/AbUBhwFUAf0DJgE4XAADGgElAz0BaAL/AfsB/wL8AfkB/wLLAbsB/wQAAssBvAP/
A/8B/gH/Az0BaAM9AWck/wHBAegB7gH/AUYBtgHHAf8BdAHmAfcB/wOTAf8D1QH/Az0BZwQAAVoBVAFP Af4B/wM9AWgDPQFnJP8BwQHoAe4B/wFFAbYBxwH/AXMB5gH3Af8DkwH/A9UB/wM9AWcEAAFSAVABTgGW
AZYB2QG/AaUC/wH6AfAG/wH9AfMB/wHwAcEBowH/Ae4BxgGgAf8B/QHwAdED/wH+Av8B/QHwAv8B/QHx AdkBvwGlAv8B+gHwBv8B/QHzAf8B8AHBAaMB/wHuAcYBoAH/Af0B8AHRA/8B/gL/Af0B8AL/Af0B8QX/
Bf8B2QG/AaUB/wFaAVQBTwGWZAADGgElAz0BZwL/AfwB/wLUAcoB/wKvAZ8B/wLUAcsD/wH+Af8DPQFn AdkBvwGlAf8BUgFQAU4BlmQAAxoBJQM9AWcC/wH8Af8C1AHKAf8CrwGfAf8C1AHLA/8B/gH/Az0BZwMx
AzEBTQM8AWYDPAFmAzwBZgM8AWYDPAFmAzwBZgM8AWYDPAFmAzwBZgM8AWYDSgGMA1IBpwP3Af8CVgFY AU0DPAFmAzwBZgM8AWYDPAFmAzwBZgM8AWYDPAFmAzwBZgM8AWYDPAFmA0oBjANSAacD9wH/AlYBWAG7
AbsDRAF6BAADCgENAXMBZQFXAbgB2QG/AaUB/wH+Af0B/AL/AfEB5AH/AfIBygGuAf8B8gHSAa0B/wH5 A0QBegQAAwoBDQFmAV8BVwG4AdkBvwGlAf8B/gH9AfwC/wHxAeQB/wHyAcoBrgH/AfIB0gGtAf8B+QHt
Ae0ByAP/AfcD/wH9Af8B/gH9AfwB/wHZAb8BpQH/AXMBZQFXAbgDCgENaAADGgEkAz0BZwL/Af4D/wH+ AcgD/wH3A/8B/QH/Af4B/QH8Af8B2QG/AaUB/wFmAV8BVwG4AwoBDWgAAxoBJAM9AWcC/wH+A/8B/gP/
A/8B/gX/Az0BZzAAAxoBJAJEAUUBfAKAAv8CUwFdAcEIAAMKAQ0BWgFUAU8BlgGvAYIBVQH6AeEBzQG5 Af4F/wM9AWcwAAMaASQCRAFFAXwCgAL/AlUBWwHBCAADCgENAVIBUAFOAZYBrAF/AVMB+gHhAc0BuQH/
Af8B8QHiAdQB/wH5AewB3wH/AfsB8wHlAf8B9AHtAeQB/wHiAc4BuwH/Aa8BggFVAfoBWgFUAU8BlgMK AfEB4gHUAf8B+QHsAd8B/wH7AfMB5QH/AfQB7QHkAf8B4gHOAbsB/wGsAX8BUwH6AVIBUAFOAZYDCgEN
AQ1wAAMaASQDPAFmAzwBZgM8AWYDPAFmAzEBTTQAAyYBOQJSAVgBrwMqAUAQAAEoAicBOwFaAVQBTgGU cAADGgEkAzwBZgM8AWYDPAFmAzwBZgMxAU00AAMmATkCUwFWAa8DKgFAEAADJwE7AVIBUAFOAZQBdwFq
AYUBcAFbAc4BogF+AVkB6wGjAX8BWAHvAY0BdAFaAdkBWwFUAU8BlwEoAicBO1wAAwIBAwMUARwDMAFM AVwBzgGYAXoBWQHrAZsBewFYAe8BgAFvAVsB2QFTAVABTwGXAycBO1wAAwIBAwMUARwDMAFMA0QBeQNQ
A0QBeQNQAZoDUAGkA1ABmgNEAXkDMAFMAxQBHAMDAQQIAAOWAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIA AZoDUAGkA1ABmgNEAXkDMAFMAxQBHAMDAQQIAAOWAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIA
Af8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIAAf8BGgIA Af8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIAAf8BGQIA
Af8BGgIAAf8EAAFNAcwC/wEaApkB/wEaApkB/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFN Af8EAAFMAcwC/wEZApkB/wEZApkB/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFM
AcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/xAAAwIBAwMUARwDMAFMA0QBeQNQAZoDUAGk AcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/xAAAwIBAwMUARwDMAFMA0QBeQNQAZoDUAGkA1ABmgNE
A1ABmgNEAXkDMAFMAxQBHAMDAQQQAAMEAQYDJAE2A1MBsAFjAl4B5QFtAl8B+wGzAqkB/wFtAmAB+wNg AXkDMAFMAxQBHAMDAQQQAAMEAQYDJAE2A1MBsAFjAl4B5QFqAl8B+wGzAqkB/wFqAl8B+wNgAesDWgHT
AesDWgHTA1MBrANHAYIDKAE8AwcBCQQAAcwCmQH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/A+oB/wPq A1MBrANHAYIDKAE8AwcBCQQAAcwCmQH/AYACAAH/AYACAAH/AYACAAH/AYACAAH/A+oB/wPqAf8D6gH/
Af8D6gH/AYACAAH/A+oB/wPqAf8D6gH/AYACAAH/AYACAAH/AU0CAAH/ARoCAAH/ARoCmQH/AwAB/wMQ AYACAAH/A+oB/wPqAf8D6gH/AYACAAH/AYACAAH/AUwCAAH/ARkCAAH/ARkCmQH/AwAB/wMPAf8DMwH/
Af8DNAH/AwAB/wMDAf8BTQHMAv8BTQHMAv8BTQHMAv8BTQHMAv8BTQHMAv8BTQHMAv8BTQHMAv8BTQHM AwAB/wMCAf8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHMAv8BTAHM
Av8BTQHMAv8BTQHMAv8IAAMEAQYDJAE2A1MBsAFjAl4B5QFtAl8B+wGzAqkB/wFtAmAB+wNgAesDWgHT Av8BTAHMAv8IAAMEAQYDJAE2A1MBsAFjAl4B5QFqAl8B+wGzAqkB/wFqAl8B+wNgAesDWgHTA1MBrANH
A1MBrANHAYIDKAE8AwcBCQgAAwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/ AYIDKAE8AwcBCQgAAwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/A18B8wNY
A18B8wNYAcYDTAGSAygBPAMDAQQBzAKZAf8BgAIAAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/ AcYDTAGSAygBPAMDAQQBzAKZAf8BgAIAAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/A/EB/wGA
A/EB/wGAAgAB/wPxAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/ARoCAAH/AwAB/wPMDf8DNAH/ AgAB/wPxAf8BgAIAAf8BgAIAAf8D8QH/AYACAAH/AYACAAH/ARkCAAH/AwAB/wPMDf8DMwH/AwIB/wFM
AwMB/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wQA AcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wQAAwIBAwMx
AwIBAwMxAU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/A18B8wNYAcYDTAGSAygBPAMD AU8DXAHqAc8CtAL/At0C/wLiAv8C6AL/Au4C/wLzAf8DzwH/A18B8wNYAcYDTAGSAygBPAMDAQQEAAMm
AQQEAAMmATgDbQH3AfUCxwL/AtIC/wLYAv8C3QL/AuIC/wLoAv8C9AX/A/UB/wOAAfsDWAHGA0cBggMU ATgDbQH3AfUCxwL/AtIC/wLYAv8C3QL/AuIC/wLoAv8C9AX/A/UB/wN/AfsDWAHGA0cBggMUARwBzAKZ
ARwBzAKZAf8BmQEAARoB/wGAAgAB/wGAAgAF/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAF/wGA Af8BmQEAARkB/wGAAgAB/wGAAgAF/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAF/wGAAgAB/wGA
AgAB/wGAAgAB/wEaAgAB/wMAAf8DzBH/AwAB/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wFN AgAB/wEZAgAB/wMAAf8DzBH/AwAB/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFMAcwC/wFM
AcwC/wFNAcwC/wFNAcwC/wFNAcwC/wQAAyYBOANtAfcB9QLHAv8C0gL/AtgC/wLdAv8C4gL/AugC/wL0 AcwC/wFMAcwC/wFMAcwC/wQAAyYBOANtAfcB9QLHAv8C0gL/AtgC/wLdAv8C4gL/AugC/wL0Bf8D9QH/
Bf8D9QH/A4AB+wNYAcYDRwGCAxQBHAMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/AtgC/wLdAv8C4gL/ A38B+wNYAcYDRwGCAxQBHAMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/AtgC/wLdAv8C4gL/AvoJ/wP1
AvoJ/wP1Af8DXwHzA1MBrAMwAUwBzAKZAf8BmQEAARoB/wGAAgAB/wGAAgAB/wGAAgAN/wGAAgAN/wGA Af8DXwHzA1MBrAMwAUwBzAKZAf8BmQEAARkB/wGAAgAB/wGAAgAB/wGAAgAN/wGAAgAN/wGAAgAB/wGA
AgAB/wGAAgAB/wGAAgAB/wEaAgAB/wEaApkB/wMDAf8DXgH/A8AB/wPAAf8DzAH/AwAB/wMQAf8DAAH/ AgAB/wGAAgAB/wEZAgAB/wEZApkB/wMCAf8DXQH/A8AB/wPAAf8DzAH/AwAB/wMPAf8DAAH/AwAB/wMA
AwAB/wMAAf8DAAH/AxAB/wFNAcwC/wFNAcwC/wFNAcwC/wMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/ Af8DAAH/Aw8B/wFMAcwC/wFMAcwC/wFMAcwC/wMHAQkDXgHdAfUCzQL/As8C/wLNAv8C0gL/AtgC/wLd
AtgC/wLdAv8C4gL/AvoJ/wP1Af8DXwHzA1MBrAMwAUwDPgFqAcYCsQL/AtkC/wLUAv8CzwL/As0C/wHU Av8C4gL/AvoJ/wP1Af8DXwHzA1MBrAMwAUwDPgFqAcYCsQL/AtkC/wLUAv8CzwL/As0C/wHUAdsC/wHX
AdsC/wHXAeIC/wHkAeoR/wHSAswB/wNaAdMDQwF3AcwCmQH/AZkBAAEaAf8BgAIAAf8BgAIAAf8BgAIA AeIC/wHkAeoR/wHSAswB/wNaAdMDQwF3AcwCmQH/AZkBAAEZAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIA
Af8BgAIAAf8BgAIABf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BGgIAAf8BTQHM Af8BgAIABf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BgAIAAf8BGQIAAf8BTAHMAv8BGQKZ
Av8BGgKZAf8DAwH/AwAB/wMABf8DAAH/AwMB/wGkAqAJ/wOZAf8DEAH/AxAB/wFNAcwC/wFNAcwC/wM+ Af8DAgH/AwAB/wMABf8DAAH/AwIB/wGkAqAJ/wOZAf8DDwH/Aw8B/wFMAcwC/wFMAcwC/wM+AWoBxgKx
AWoBxgKxAv8C2QL/AtQC/wLPAv8CzQL/AdQB2wL/AdcB4gL/AeQB6hH/AdICzAH/A1oB0wNDAXcDVgG2 Av8C2QL/AtQC/wLPAv8CzQL/AdQB2wL/AdcB4gL/AeQB6hH/AdICzAH/A1oB0wNDAXcDVgG2Af8C4wH/
Af8C4wH/AQABFQEWAf8BAAEVARYB/wEAARUBFgL/Ad4B5wH/AQABFQEWAv8B0QHzAf8BAAEVARYC/wH4 AQABFAEVAf8BAAEUARUB/wEAARQBFQL/Ad4B5wH/AQABFAEVAv8B0QHzAf8BAAEUARUC/wH4Av8BVAJa
Av8BVQJbAf8BAAEVARYB/wFVAlsB/wHMApkB/wFcAlUB6gNOAZQBzAKZAf8BmQEAARoB/wGAAgAB/wGA Af8BAAEUARUB/wFUAloB/wHMApkB/wFcAlUB6gNOAZQBzAKZAf8BmQEAARkB/wGAAgAB/wGAAgAB/wGA
AgAB/wGAAgAB/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEa AgAB/wGAAgAB/wGAAgAF/wGAAgAF/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEZAgAB/wFM
AgAB/wFNAcwC/wFNAcwC/wFNAcwC/wFNAcwC/wMABf8DAAH/AxAR/wPMAf8DAAH/AU0BzAL/AU0BzAL/ AcwC/wFMAcwC/wFMAcwC/wFMAcwC/wMABf8DAAH/Aw8R/wPMAf8DAAH/AUwBzAL/AUwBzAL/A1YBtgH/
A1YBtgH/AuMB/wFVAlsB/wEAARUBFgH/AVUCWwL/Ad4B5wH/AVUCWwH/AQABFQEWAf8BVQJbAv8B+AL/ AuMB/wFUAloB/wEAARQBFQH/AVQCWgL/Ad4B5wH/AVQCWgH/AQABFAEVAf8BVAJaAv8B+AL/AQABFAEV
AQABFQEWAf8BAAEVARYB/wEAARUBFgH/AcwCmQH/AVwCVQHqA04BlANhAeIB/wLnAf8BAAEVARYC/wLe Af8BAAEUARUB/wEAARQBFQH/AcwCmQH/AVwCVQHqA04BlANhAeIB/wLnAf8BAAEUARUC/wLeAv8C4AL/
Av8C4AL/Ae8B/AH/AQABFQEWAv8B4gH8Af8BAAEVARYB/wH8AfAB+QH/AQABFQEWAf8BzAKZAf8BAAEV Ae8B/AH/AQABFAEVAv8B4gH8Af8BAAEUARUB/wH8AfAB+QH/AQABFAEVAf8BzAKZAf8BAAEUARUB/wHM
ARYB/wHMApkB/wFtAmwB9wNRAaEBzAKZAf8BmQEAARoB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGA ApkB/wFtAmwB9wNRAaEBzAKZAf8BmQEAARkB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGA
AgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEaAgAB/wGZ AgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wGAAgAB/wEZAgAB/wGZAkwB/wGZ
Ak0B/wGZAk0B/wGZAk0B/wGZAk0B/wMABf8DAAH/AwAB/wM0Af8DzA3/AwAB/wGZAk0B/wGZAk0B/wNh AkwB/wGZAkwB/wGZAkwB/wMABf8DAAH/AwAB/wMzAf8DzA3/AwAB/wGZAkwB/wGZAkwB/wNhAeIB/wLn
AeIB/wLnAf8BAAEVARYC/wLeAf8BAAEVARYC/wHvAfwB/wEAARUBFgL/AeIB/AH/AQABFQEWAf8B/AHw Af8BAAEUARUC/wLeAf8BAAEUARUC/wHvAfwB/wEAARQBFQL/AeIB/AH/AQABFAEVAf8B/AHwAfkB/wEA
AfkB/wEAARUBFgH/AcwCmQH/AcwCmQH/AcwCmQH/AW0CbAH3A1EBoQGeAowB/wHpAr4B/wEAARUBFgH/ ARQBFQH/AcwCmQH/AcwCmQH/AcwCmQH/AW0CbAH3A1EBoQGeAowB/wHpAr4B/wEAARQBFQH/AQABFAEV
AQABFQEWAf8B+QLWAv8B6QHzAf8BAAEVARYB/wEAARUBFgH/AQABFQEWAf8B+QHoAewB/wEAARUBFgH/ Af8B+QLWAv8B6QHzAf8BAAEUARUB/wEAARQBFQH/AQABFAEVAf8B+QHoAewB/wEAARQBFQH/AeYCugH/
AeYCugH/AeYCvQH/AeYCwAH/AaYClAH/A04BlDT/A/EB/wPqAf8DgAH/AZkCTQH/AZkCTQH/AZkCTQH/ AeYCvQH/AeYCwAH/AaYClAH/A04BlDT/A/EB/wPqAf8DgAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/
AZkCTQH/AwAF/wMAAf8DPAH/AwMB/wMAAf8DAAH/AwAF/wMAAf8BmQJNAf8BmQJNAf8BngKMAf8B6QK+ AwAF/wMAAf8DOwH/AwIB/wMAAf8DAAH/AwAF/wMAAf8BmQJMAf8BmQJMAf8BngKMAf8B6QK+Af8BAAEU
Af8BAAEVARYB/wHzAsUB/wH5AtYC/wHpAfMB/wEAARUBFgL/AekB8wH/AQABFQEWAf8B+QHoAewB/wEA ARUB/wHzAsUB/wH5AtYC/wHpAfMB/wEAARQBFQL/AekB8wH/AQABFAEVAf8B+QHoAewB/wEAARQBFQH/
ARUBFgH/AQABFQEWAf8B5gK9Af8B5gLAAf8BpgKUAf8DTgGUA10B0gHbAqgB/wEAARUBFgH/AeoCtwH/ AQABFAEVAf8B5gK9Af8B5gLAAf8BpgKUAf8DTgGUA10B0gHbAqgB/wEAARQBFQH/AeoCtwH/AfMCzQL/
AfMCzQL/Ae4B/AH/AQABFQEWAv8B0gH1Af8BAAEVARYC/wH0AfwB/wEAARUBFgL/AtgB/wEAARUBFgL/ Ae4B/AH/AQABFAEVAv8B0gH1Af8BAAEUARUC/wH0AfwB/wEAARQBFQL/AtgB/wEAARQBFQL/AuIB/wNi
AuIB/wNiAfYDQwF3BP8BmQEAARoJ/wGAAgAN/wGAAgAB/wGAAgAN/wGAAgAB/wGAAgAB/wOAAf8BmQJN AfYDQwF3BP8BmQEAARkJ/wGAAgAN/wGAAgAB/wGAAgAN/wGAAgAB/wGAAgAB/wOAAf8BmQJMAf8BmQJM
Af8BmQJNAf8BmQJNAf8BmQJNAf8DAAX/AwMB/wMAAf8DEAH/AzwB/wM8Af8DAAX/AwAB/wGZAk0B/wGZ Af8BmQJMAf8BmQJMAf8DAAX/AwIB/wMAAf8DDwH/AzsB/wM7Af8DAAX/AwAB/wGZAkwB/wGZAkwB/wNd
Ak0B/wNdAdIB2wKoAf8BAAEVARYB/wHqArcB/wEAARUBFgL/Ae4B/AH/AQABFQEWAv8B0gH1Af8BAAEV AdIB2wKoAf8BAAEUARUB/wHqArcB/wEAARQBFQL/Ae4B/AH/AQABFAEVAv8B0gH1Af8BAAEUARUC/wH0
ARYC/wH0AfwB/wEAARUBFgL/AtgC/wLdAv8C4gH/A2IB9gNDAXcDVgGxAdUCogH/AQABFQEWAf8BAAEV AfwB/wEAARQBFQL/AtgC/wLdAv8C4gH/A2IB9gNDAXcDVgGxAdUCogH/AQABFAEVAf8BAAEUARUB/wEA
ARYB/wEAARUBFgL/AfYC/wFVAlsB/wEAARUBFgH/AVUCWwL/AeAB5wH/AVUCWwH/AQABFQEWAf8BVQJb ARQBFQL/AfYC/wFUAloB/wEAARQBFQH/AVQCWgL/AeAB5wH/AVQCWgH/AQABFAEVAf8BVAJaAv8C3QH/
Av8C3QH/A1oB5AMwAUwE/wGZAQABGgn/AYACAAn/AYACABH/AYACAAH/A/EB/wPqAf8DgAH/AZkCTQH/ A1oB5AMwAUwE/wGZAQABGQn/AYACAAn/AYACABH/AYACAAH/A/EB/wPqAf8DgAH/AZkCTAH/AZkCTAH/
AZkCTQH/AZkCTQH/AZkCTQH/AwAJ/wOZAf8DEAH/AwAB/wMDAf8DAAX/AwAB/wGZAk0B/wGZAk0B/wNW AZkCTAH/AZkCTAH/AwAJ/wOZAf8DDwH/AwAB/wMCAf8DAAX/AwAB/wGZAkwB/wGZAkwB/wNWAbEB1QKi
AbEB1QKiAf8BVQJbAf8BAAEVARYB/wFVAlsC/wH2Av8BAAEVARYC/wHSAfUB/wEAARUBFgL/AeAB5wH/ Af8BVAJaAf8BAAEUARUB/wFUAloC/wH2Av8BAAEUARUC/wHSAfUB/wEAARQBFQL/AeAB5wH/AQABFAEV
AQABFQEWAf8BAAEVARYB/wEAARUBFgL/At0B/wNaAeQDMAFMAzIBUAHDAr8S/wHsAfEC/wHbAecC/wHZ Af8BAAEUARUB/wEAARQBFQL/At0B/wNaAeQDMAFMAzIBUAHDAr8S/wHsAfEC/wHbAecC/wHZAd4C/wLU
Ad4C/wLUAv8CzwL/As0C/wLSAf8BxgKtAf8DUwGsAxQBGwT/AZkBAAEaCf8BgAIACf8BgAIAAf8BgAIA Av8CzwL/As0C/wLSAf8BxgKtAf8DUwGsAxQBGwT/AZkBAAEZCf8BgAIACf8BgAIAAf8BgAIAAf8BgAIA
Af8BgAIAAf8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BGgIAAf8BmQJNAf8BmQJNAf8BmQJNAf8BmQJN Af8BgAIABf8BgAIAAf8BgAIAAf8BgAIAAf8BGQIAAf8BmQJMAf8BmQJMAf8BmQJMAf8BmQJMAf8DAAH/
Af8DAAH/A8AN/wPMAf8DRgH/AwAF/wMAAf8BmQJNAf8BmQJNAf8DMgFQAcMCvxL/AewB8QL/AdsB5wL/ A8AN/wPMAf8DRQH/AwAF/wMAAf8BmQJMAf8BmQJMAf8DMgFQAcMCvxL/AewB8QL/AdsB5wL/AdkB3gL/
AdkB3gL/AtQC/wLPAv8CzQL/AtIB/wHGAq0B/wNTAawDFAEbBAADWgHAA/UK/wL+Av8C5wL/AuMC/wLe AtQC/wLPAv8CzQL/AtIB/wHGAq0B/wNTAawDFAEbBAADWgHAA/UK/wL+Av8C5wL/AuMC/wLeAv8C2QL/
Av8C2QL/AtQC/wLPAf8B9QLHAf8DXwHjAyMBNAMCAQME/wGZAQABGgH/AYACAAX/AYACAAn/AYACAAn/ AtQC/wLPAf8B9QLHAf8DXwHjAyMBNAMCAQME/wGZAQABGQH/AYACAAX/AYACAAn/AYACAAn/AYACAAX/
AYACAAX/AYACAAH/A/EB/wPqAf8BGgIAAf8BmQJNAf8BmQJNAf8BmQJNAf8BmQJNAf8DEAH/AzQB/wPA AYACAAH/A/EB/wPqAf8BGQIAAf8BmQJMAf8BmQJMAf8BmQJMAf8BmQJMAf8DDwH/AzMB/wPAGf8DAAH/
Gf8DAAH/AZkCTQH/AZkCTQH/BAADWgHAA/UK/wL+Av8C5wL/AuMC/wLeAv8C2QL/AtQC/wLPAf8B9QLH AZkCTAH/AZkCTAH/BAADWgHAA/UK/wL+Av8C5wL/AuMC/wLeAv8C2QL/AtQC/wLPAf8B9QLHAf8DXwHj
Af8DXwHjAyMBNAMCAQMEAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNt AyMBNAMCAQMEAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNtAfcDMAFN
AfcDMAFNAwQBBgQABP8BmQIaCf8BgAIAAf8BgAIACf8BgAIAAf8BgAIADf8BgAIAAf8BgAIAAf8DhgH/ AwQBBgQABP8BmQIZCf8BgAIAAf8BgAIACf8BgAIAAf8BgAIADf8BgAIAAf8BgAIAAf8DhgH/AZkCTAH/
AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AxAB/wMAAf8DEAH/A5kR/wMAAf8BmQJNAf8BmQJN AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/Aw8B/wMAAf8DDwH/A5kR/wMAAf8BmQJMAf8BmQJMAf8EAAMX
Af8EAAMXASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNtAfcDMAFNAwQBBgwA ASADYgHvA/UG/wL4Av8C7AL/AucC/wLjAv8C3gL/AtkB/wH1As0B/wNtAfcDMAFNAwQBBgwAAxcBIANa
AxcBIANaAcADxgL/AvcC/wLyAv8C7AL/AucC/wLjAf8BxgKxAf8DXgHQAyQBNgMCAQMIAAT/AZkCGi3/ AcADxgL/AvcC/wLyAv8C7AL/AucC/wLjAf8BxgKxAf8DXgHQAyQBNgMCAQMIAAT/AZkCGS3/A/EB/wPq
A/EB/wPqAf8DhgH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AxAB/wMA Af8DhgH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/Aw8B/wMAAf8DAgH/
Af8DAwH/A14B/wPMBf8DAAH/AZkCTQH/AZkCTQH/CAADFwEgA1oBwAPGAv8C9wL/AvIC/wLsAv8C5wL/ A10B/wPMBf8DAAH/AZkCTAH/AZkCTAH/CAADFwEgA1oBwAPGAv8C9wL/AvIC/wLsAv8C5wL/AuMB/wHG
AuMB/wHGArEB/wNeAdADJAE2AwIBAxgAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANUAaYDNwFaAwUBBxAA ArEB/wNeAdADJAE2AwIBAxgAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANUAaYDNwFaAwUBBxAACP8BzAKZ
CP8BzAKZLf8D8QH/A8AB/wQAAZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/AZkCTQH/ Lf8D8QH/A8AB/wQAAZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/AZkCTAH/
AZkCTQH/AZkCTQH/AwMB/wMAAf8DNAH/AxAB/wGZAk0B/xQAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANU AZkCTAH/AwIB/wMAAf8DMwH/Aw8B/wGZAkwB/xQAAzIBUANRAaIDXQHSAYwCiQH/A2AB1ANUAaYDNwFa
AaYDNwFaAwUBBxAAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAHjA/8B8AEH AwUBBxAAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAHjA/8B8AEHAgABwQP/
AgABwQP/AcABAwIAAYAB/wEIARABgAEBAwABfwIAAYAEAAE/BwABHwYAAYABDwYAAcABBwYAAeABAwYA AcABAwIAAYAB/wEIARABgAEBAwABfwIAAYAEAAE/BwABHwYAAYABDwYAAcABBwYAAeABAwYAAfABAQYA
AfABAQYAAfgHAAH8BwAB/gEIAgABgAEBAgAB/wMAAYABAQIAAf8BgAH/AfABwAEDAgAB/wHAAf8B+AHw AfgHAAH8BwAB/gEIAgABgAEBAgAB/wMAAYABAQIAAf8BgAH/AfABwAEDAgAB/wHAAf8B+AHwAQ8CAAHg
AQ8CAAHgAQMCAAGAAQEB4AEDAcABAQQAAcABAQGABQABgAEAAYAFAAGAQQABgAUAAYABAAGAAQEEAAGA AQMCAAGAAQEB4AEDAcABAQQAAcABAQGABQABgAEAAYAFAAGAQQABgAUAAYABAAGAAQEEAAGAAQEBwAED
AQEBwAEDBAABwAEDAfABDwIAAYABAQHwAQ8L BAABwAEDAfABDwIAAYABAQHwAQ8L
</value> </value>
</data> </data>
<data name="listChoices.TabIndex" type="System.Int32, mscorlib"> <data name="listChoices.TabIndex" type="System.Int32, mscorlib">
@@ -418,24 +418,6 @@
<data name="tableLayoutPanelMeta.ColumnCount" type="System.Int32, mscorlib"> <data name="tableLayoutPanelMeta.ColumnCount" type="System.Int32, mscorlib">
<value>2</value> <value>2</value>
</data> </data>
<data name="columnHeaderMetadataValue.DisplayIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="columnHeaderMetadataValue.Text" xml:space="preserve">
<value>Value</value>
</data>
<data name="columnHeaderMetadataValue.Width" type="System.Int32, mscorlib">
<value>240</value>
</data>
<data name="columnHeaderMetadataName.DisplayIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="columnHeaderMetadataName.Text" xml:space="preserve">
<value>Field</value>
</data>
<data name="columnHeaderMetadataName.Width" type="System.Int32, mscorlib">
<value>120</value>
</data>
<data name="listMetadata.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="listMetadata.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
</data> </data>
@@ -574,6 +556,24 @@
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms"> <data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="tableLayoutPanel2" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="textBox1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="listChoices" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="pictureBox1" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="tableLayoutPanelMeta" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100" /&gt;&lt;Rows Styles="Absolute,150,Percent,5,Percent,5,Percent,90,Absolute,40" /&gt;&lt;/TableLayoutSettings&gt;</value> <value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="tableLayoutPanel2" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="textBox1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="listChoices" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="pictureBox1" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="tableLayoutPanelMeta" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100" /&gt;&lt;Rows Styles="Absolute,150,Percent,5,Percent,5,Percent,90,Absolute,40" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data> </data>
<data name="columnHeaderMetadataValue.DisplayIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="columnHeaderMetadataValue.Text" xml:space="preserve">
<value>Value</value>
</data>
<data name="columnHeaderMetadataValue.Width" type="System.Int32, mscorlib">
<value>240</value>
</data>
<data name="columnHeaderMetadataName.DisplayIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="columnHeaderMetadataName.Text" xml:space="preserve">
<value>Field</value>
</data>
<data name="columnHeaderMetadataName.Width" type="System.Int32, mscorlib">
<value>120</value>
</data>
<metadata name="backgroundWorker1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="backgroundWorker1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>127, 17</value> <value>127, 17</value>
</metadata> </metadata>