2003-06-14 Sebastien Pouliot <spouliot@videotron.ca>
authorSebastien Pouliot <sebastien@ximian.com>
Sat, 14 Jun 2003 21:06:44 +0000 (21:06 -0000)
committerSebastien Pouliot <sebastien@ximian.com>
Sat, 14 Jun 2003 21:06:44 +0000 (21:06 -0000)
* CertificateViewer.cs: New. SFW-based certificate viewer.
* CertificateViewer.resx: New. SWF Resource file.
* CertificateFormatter.cs: New. Not GUI specific.
* certview.exe.config: New. Configuration file for certview.
* certview.glade: New. GUI for GTK#.
* certview.gladep: New. Project file for GLADE.
* gcertview.cs: New. GTK#-based certificate viewer.
* makefile: New. makefile for both SWF and GTK# viewers.
* X509ExtensionsHandler.cs: Configuration file parser.

svn path=/trunk/mcs/; revision=15390

mcs/tools/security/certview/CertificateFormatter.cs [new file with mode: 0644]
mcs/tools/security/certview/CertificateViewer.cs [new file with mode: 0644]
mcs/tools/security/certview/CertificateViewer.resx [new file with mode: 0644]
mcs/tools/security/certview/ChangeLog [new file with mode: 0644]
mcs/tools/security/certview/X509ExtensionsHandler.cs [new file with mode: 0644]
mcs/tools/security/certview/certview.exe.config [new file with mode: 0644]
mcs/tools/security/certview/certview.glade [new file with mode: 0644]
mcs/tools/security/certview/certview.gladep [new file with mode: 0644]
mcs/tools/security/certview/gcertview.cs [new file with mode: 0644]
mcs/tools/security/certview/makefile [new file with mode: 0644]

diff --git a/mcs/tools/security/certview/CertificateFormatter.cs b/mcs/tools/security/certview/CertificateFormatter.cs
new file mode 100644 (file)
index 0000000..8ab4eba
--- /dev/null
@@ -0,0 +1,347 @@
+//
+// CertificateFormatter.cs: Certificate Formatter (not GUI specific)
+//
+// Author:
+//     Sebastien Pouliot (spouliot@motus.com)
+//
+// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+//
+
+using System;
+using System.Collections;
+using System.Configuration;
+using System.IO;
+using System.Reflection;
+using System.Security.Cryptography;
+using System.Text;
+
+using Mono.Security.X509;
+using Mono.Security.X509.Extensions;
+
+namespace Mono.Tools.CertView {
+
+       public class CertificateFormatter {
+
+               public class FieldNames {
+                       public FieldNames () {}
+
+                       public const string Version = "Version";
+                       public const string SerialNumber = "Serial number";
+                       public const string SignatureAlgorithm = "Signature algorithm";
+                       public const string Issuer = "Issuer";
+                       public const string ValidFrom = "Valid from";
+                       public const string ValidUntil = "Valid until";
+                       public const string Subject = "Subject";
+                       public const string PublicKey = "Public key";
+               }
+
+               public class PropertyNames {
+                       public PropertyNames () {}
+
+                       public const string ThumbprintAlgorithm = "Thumbprint algorithm";
+                       public const string Thumbprint = "Thumbprint";
+               }
+
+               public class Help {
+                       public Help () {}
+
+                       public const string IssuedBy = "This is the distinguished name (DN) of the certificate authority (CA) that issued this certificate.";
+                       public const string IssuedTo = "This is the distinguished name (DN) of the entity (individual, device or organization) to whom the certificate was issued.";
+                       public const string ValidFrom = "This certificate isn't valid before the specified date.";
+                       public const string ValidUntil = "This certificate isn't valid after the specified date. This also means that the certificate authority (CA) won't publish the status of the certificate after this date.";
+               }
+
+               private const string untrustedRoot = "This root certificate isn't part of your trusted root store. Please read your documentation carefully before adding a new root certificate in your trusted store.";
+               private const string unknownCriticalExtension = "This certificate contains unknown critical extensions and shouldn't be used by applications that can't process those extensions.";
+               private const string noSignatureCheck = "The signature of the certificate can;t be verified without the issuer certificate.";
+               private const string noValidation = "No CRL, nor an OCSP responder, has been found to validate the status of the certificate.";
+               private const string unsupportedHash = "The {0} algorithm is unsupported by the .NET Framework. The certificate signature cannot be verified.";
+
+               private string thumbprintAlgorithm;
+               private X509Certificate x509;
+               private string status;
+               private string[] subjectAltName;
+
+               private static string defaultThumbprintAlgo;
+               private static Hashtable extensions;
+
+               static CertificateFormatter () 
+               {
+                       IDictionary tb = (IDictionary) ConfigurationSettings.GetConfig ("Thumbprint");
+                       defaultThumbprintAlgo = ((tb != null) ? (string) tb ["Algorithm"] : "SHA1");
+
+                       extensions = new Hashtable ();
+                       IDictionary exts = (IDictionary) ConfigurationSettings.GetConfig ("X509.Extensions");
+                       foreach (DictionaryEntry ext in exts)
+                               extensions.Add (ext.Key, ext.Value);
+               }
+
+               private X509Extension CreateExtensionFromOid (string oid, object[] args) 
+               {
+                       try {
+                               Type algoClass = null;
+                               string algo = (string) extensions [oid];
+                               // do we have an entry
+                               if (algo == null)
+                                       return (X509Extension) args [0];
+                               algoClass = Type.GetType (algo);
+                               // call the constructor for the type
+                               return (X509Extension) Activator.CreateInstance (algoClass, args);
+                       }
+                       catch {
+                               // method doesn't throw any exception
+                               return (X509Extension) args [0];
+                       }
+               }
+
+               public CertificateFormatter (string filename)
+               {
+                       FileStream fs = File.Open (filename, FileMode.Open, FileAccess.Read, FileShare.Read);
+                       byte[] data = new byte [fs.Length];
+                       fs.Read (data, 0, data.Length);
+                       fs.Close ();
+                       Initialize (new X509Certificate (data));
+               }
+
+               public CertificateFormatter (X509Certificate cert)
+               {
+                       Initialize (cert);
+               }
+
+               internal void Initialize (X509Certificate cert) 
+               {
+                       x509 = cert;
+                       thumbprintAlgorithm = defaultThumbprintAlgo;
+                       try {
+                               if (x509.IsSelfSigned) {
+                                       status = untrustedRoot;
+                                       return;
+                               }
+                               // preprocess some informations
+                               foreach (X509Extension xe in x509.Extensions) {
+                                       if ((!extensions.ContainsKey (xe.OID)) && (xe.Critical))
+                                               status = unknownCriticalExtension;
+                                       if (xe.OID == "2.5.29.17") {
+                                               SubjectAltNameExtension san = new SubjectAltNameExtension (xe);
+                                               subjectAltName = san.RFC822;
+                                       }
+                               }
+                       }
+                       catch (Exception e) {
+                               status = e.ToString ();
+                       }
+               }
+
+               public X509Certificate Certificate {
+                       get { return x509; }
+               }
+
+               public string Status {
+                       get { return status; }
+               }
+
+               public X509Extension GetExtension (int i) 
+               {
+                       X509Extension xe = x509.Extensions [i];
+                       object[] extn = new object [1] { xe };
+                       return CreateExtensionFromOid (xe.OID, extn); 
+               }
+
+               public string Extension (int i, bool detailed) 
+               {
+                       X509Extension xe = x509.Extensions [i];
+                       if (!detailed)
+                               return Array2Word (xe.Value.Value);
+                       return Extension2String (x509.Extensions[i].Value.Value);
+               }
+
+               private string DN (string dname, bool detailed) 
+               {
+                       string[] a = dname.Split (',');
+                       StringBuilder sb = new StringBuilder ();
+
+                       if (detailed) {
+                               foreach (string s in a) {
+                                       string s2 = s.Trim () + Environment.NewLine;
+                                       sb.Insert (0, s2.Replace ("=", " = "));
+                               }
+                       }
+                       else {
+                               foreach (string s in a) {
+                                       string s2 = s.Trim ();
+                                       sb.Insert (0, s2.Substring (s2.IndexOf ("=") + 1) + ", ");
+                               }
+                               // must remove last ", "
+                               sb.Remove (sb.Length - 2, 2);
+                       }
+
+                       return sb.ToString();
+               }
+
+               public string Issuer (bool detailed) 
+               {
+                       return DN (x509.IssuerName, detailed);
+               }
+
+               public string PublicKey (bool detailed) 
+               {
+                       if (detailed)
+                               return Array2Word (x509.PublicKey);
+
+                       if (x509.RSA != null)
+                               return "RSA (" + x509.RSA.KeySize + " Bits)";
+                       else if (x509.DSA != null)
+                               return "DSA (" + x509.DSA.KeySize + " Bits)";
+                       return "Unknown key type (unknown key size)";
+               }
+
+               public string SerialNumber (bool detailed) 
+               {
+                       byte[] sn = (byte[]) x509.SerialNumber.Clone ();
+                       Array.Reverse (sn);
+                       return CertificateFormatter.Array2Word (sn);
+               }
+
+               public string Subject (bool detailed) 
+               {
+                       return DN (x509.SubjectName, detailed);
+               }
+
+               public string SubjectAltName (bool detailed) 
+               {
+                       if ((subjectAltName == null) || (subjectAltName.Length < 1))
+                               return String.Empty;
+                       if (!detailed)
+                               return "mailto:" + subjectAltName [0];
+
+                       StringBuilder sb = new StringBuilder ();
+                       foreach (string s in subjectAltName) {
+                               sb.Append (s);
+                               sb.Append (Environment.NewLine);
+                       }
+                       return sb.ToString ();
+               }
+
+               public string SignatureAlgorithm (bool detailed) 
+               {
+                       string result = null;
+
+                       switch (x509.SignatureAlgorithm) {
+                               case "1.2.840.10040.4.3":
+                                       result = "sha1DSA";
+                                       break;
+                               case "1.2.840.113549.1.1.2":
+                                       result = "md2RSA";
+                                       break;
+                               case "1.2.840.113549.1.1.3":
+                                       result = "md4RSA";
+                                       break;
+                               case "1.2.840.113549.1.1.4":
+                                       result = "md5RSA";
+                                       break;
+                               case "1.2.840.113549.1.1.5":
+                                       result = "sha1RSA";
+                                       break;
+                               default:
+                                       result = x509.SignatureAlgorithm;
+                                       if (detailed)
+                                               return "unknown (" + result + ")";
+                                       return result;
+                       }
+                       if (detailed)
+                               result += " (" + x509.SignatureAlgorithm + ")";
+                       return result;
+               }
+
+               public string ThumbprintAlgorithm {
+                       get { return thumbprintAlgorithm.ToLower (); }
+                       set { thumbprintAlgorithm = value; }
+               }
+
+               public byte[] Thumbprint {
+                       get {
+                               HashAlgorithm ha = HashAlgorithm.Create (thumbprintAlgorithm);
+                               return ha.ComputeHash (x509.RawData);
+                       }
+               }
+
+               public string ValidFrom (bool detailed) 
+               {
+                       return x509.ValidFrom.ToString ();
+               }
+
+               public string ValidUntil (bool detailed) 
+               {
+                       return x509.ValidUntil.ToString ();
+               }
+
+               public string Version (bool detailed)
+               {
+                       return "V" + x509.Version;
+               }
+
+               static public string OneLine (string input) 
+               {
+                       // remove tabulation
+                       string oneline = input.Replace ("\t", "");
+                       // remove new lines after :
+                       oneline = oneline.Replace (":" + Environment.NewLine, ":");
+                       // remove ending new line (if present)
+                       if (oneline.EndsWith (Environment.NewLine))
+                               oneline = oneline.Substring (0, oneline.Length - Environment.NewLine.Length);
+                       // replace remaining new lines by comma + space
+                       return oneline.Replace (Environment.NewLine, ", ");
+               }
+
+               static public string Array2Word (byte[] array) 
+               {
+                       StringBuilder sb = new StringBuilder ();
+                       int x = 0;
+                       while (x < array.Length) {
+                               sb.Append (array [x].ToString ("X2"));
+                               if (x % 2 == 1)
+                                       sb.Append (" ");
+                               x++;
+                       }
+                       return sb.ToString ();
+               }
+
+               static private void WriteLine (StringBuilder sb, byte[] extnValue, int n, int pos) 
+               {
+                       int p = pos;
+                       StringBuilder preview = new StringBuilder ();
+                       for (int j=0; j < 8; j++) {
+                               if (j < n) {
+                                       sb.Append (extnValue [p++].ToString ("X2"));
+                                       sb.Append (" ");
+                               }
+                               else
+                                       sb.Append ("   ");
+                       }
+                       sb.Append ("  ");
+                       p = pos;
+                       for (int j=0; j < n; j++) {
+                               byte b = extnValue [p++];
+                               if (b < 0x20)
+                                       sb.Append (".");
+                               else
+                                       sb.Append (Convert.ToChar (b));
+                       }
+                       sb.Append (Environment.NewLine);
+               }
+
+               static public string Extension2String (byte[] extnValue) 
+               {
+                       StringBuilder sb = new StringBuilder ();
+                       int div = (extnValue.Length >> 3);
+                       int rem = (extnValue.Length - (div << 3));
+                       int x = 0;
+                       for (int i=0; i < div; i++) {
+                               WriteLine (sb, extnValue, 8, x);
+                               x += 8;
+                       }
+                       WriteLine (sb, extnValue, rem, x);
+                       return sb.ToString ();
+               }
+       }
+}
diff --git a/mcs/tools/security/certview/CertificateViewer.cs b/mcs/tools/security/certview/CertificateViewer.cs
new file mode 100644 (file)
index 0000000..28084a9
--- /dev/null
@@ -0,0 +1,781 @@
+//
+// CertificateViewer.cs: Certificate Viewer for System.Windows.Forms
+//
+// Author:
+//     Sebastien Pouliot (spouliot@motus.com)
+//
+// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+//
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.IO;
+using System.Reflection;
+using System.Text;
+using System.Windows.Forms;
+
+using Mono.Security.X509;
+
+[assembly: AssemblyTitle("Mono Certificate Viewer")]
+[assembly: AssemblyDescription("X.509 Certificate Viewer for SWF")]
+
+namespace Mono.Tools.CertView {
+
+       public class CertificateViewer : System.Windows.Forms.Form {
+
+               private System.Windows.Forms.TabControl tabControl1;
+               private System.Windows.Forms.TabPage tabPage1;
+               private System.Windows.Forms.TabPage tabPage2;
+               private System.Windows.Forms.TabPage tabPage3;
+               private System.Windows.Forms.Panel panel1;
+               private System.Windows.Forms.Label label1;
+               private System.Windows.Forms.Label label2;
+               private System.Windows.Forms.Label label3;
+               private System.Windows.Forms.Label label4;
+               private System.Windows.Forms.Label label6;
+               private System.Windows.Forms.Label label8;
+               private System.Windows.Forms.Label label9;
+               private System.Windows.Forms.Panel panel2;
+               private System.Windows.Forms.Panel panel3;
+               private System.Windows.Forms.Button issuerStatementButton;
+               private System.Windows.Forms.Label privateKeyLabel;
+               private System.Windows.Forms.RichTextBox keyUsageRichTextBox;
+               private System.Windows.Forms.Label notAfterLabel;
+               private System.Windows.Forms.Label notBeforeLabel;
+               private System.Windows.Forms.ComboBox showComboBox;
+               private System.Windows.Forms.TextBox detailsTextBox;
+               private System.Windows.Forms.ListView fieldListView;
+               private System.Windows.Forms.TextBox certStatusTextBox;
+               private System.Windows.Forms.TreeView certPathTreeView;
+               private System.Windows.Forms.Button okButton;
+               private System.Windows.Forms.Panel panel4;
+               private System.Windows.Forms.Panel panel5;
+               private System.Windows.Forms.LinkLabel issuedByLinkLabel;
+               private System.Windows.Forms.TextBox issuedToTextBox;
+               private System.Windows.Forms.Label certificateLabel;
+               private System.Windows.Forms.TextBox issuedByTextBox;
+               private System.Windows.Forms.ColumnHeader fieldColumnHeader;
+               private System.Windows.Forms.ColumnHeader valueColumnHeader;
+               private System.Windows.Forms.ImageList fieldsImageList;
+               private System.Windows.Forms.HelpProvider helpProvider;
+               private System.Windows.Forms.ToolTip toolTip;
+               private System.Windows.Forms.LinkLabel subjectAltNameLinkLabel;
+               private System.Windows.Forms.ImageList iconImageList;
+               private System.Windows.Forms.PictureBox goodPictureBox;
+               private System.Windows.Forms.PictureBox badPictureBox;
+               private System.ComponentModel.IContainer components;
+
+               public CertificateViewer (string filename)
+               {
+                       //
+                       // Required for Windows Form Designer support
+                       //
+                       InitializeComponent();
+
+                       //
+                       // TODO: Add any constructor code after InitializeComponent call
+                       //
+                       LoadCertificate (filename);
+                       helpProvider.SetHelpString (issuedToTextBox, CertificateFormatter.Help.IssuedTo);
+                       helpProvider.SetHelpString (issuedByTextBox, CertificateFormatter.Help.IssuedBy);
+                       helpProvider.SetHelpString (notBeforeLabel, CertificateFormatter.Help.ValidFrom);
+                       helpProvider.SetHelpString (notAfterLabel, CertificateFormatter.Help.ValidUntil);
+               }
+
+               /// <summary>
+               /// Clean up any resources being used.
+               /// </summary>
+               protected override void Dispose( bool disposing )
+               {
+                       if( disposing )
+                       {
+                               if (components != null) 
+                               {
+                                       components.Dispose();
+                               }
+                       }
+                       base.Dispose( disposing );
+               }
+
+               #region Windows Form Designer generated code
+               /// <summary>
+               /// Required method for Designer support - do not modify
+               /// the contents of this method with the code editor.
+               /// </summary>
+               private void InitializeComponent()
+               {
+                       this.components = new System.ComponentModel.Container();
+                       System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(CertificateViewer));
+                       this.tabControl1 = new System.Windows.Forms.TabControl();
+                       this.tabPage1 = new System.Windows.Forms.TabPage();
+                       this.issuerStatementButton = new System.Windows.Forms.Button();
+                       this.panel1 = new System.Windows.Forms.Panel();
+                       this.badPictureBox = new System.Windows.Forms.PictureBox();
+                       this.goodPictureBox = new System.Windows.Forms.PictureBox();
+                       this.label1 = new System.Windows.Forms.Label();
+                       this.subjectAltNameLinkLabel = new System.Windows.Forms.LinkLabel();
+                       this.keyUsageRichTextBox = new System.Windows.Forms.RichTextBox();
+                       this.issuedByTextBox = new System.Windows.Forms.TextBox();
+                       this.issuedToTextBox = new System.Windows.Forms.TextBox();
+                       this.issuedByLinkLabel = new System.Windows.Forms.LinkLabel();
+                       this.panel4 = new System.Windows.Forms.Panel();
+                       this.panel5 = new System.Windows.Forms.Panel();
+                       this.panel2 = new System.Windows.Forms.Panel();
+                       this.panel3 = new System.Windows.Forms.Panel();
+                       this.privateKeyLabel = new System.Windows.Forms.Label();
+                       this.notAfterLabel = new System.Windows.Forms.Label();
+                       this.label6 = new System.Windows.Forms.Label();
+                       this.notBeforeLabel = new System.Windows.Forms.Label();
+                       this.label4 = new System.Windows.Forms.Label();
+                       this.label3 = new System.Windows.Forms.Label();
+                       this.label2 = new System.Windows.Forms.Label();
+                       this.certificateLabel = new System.Windows.Forms.Label();
+                       this.tabPage2 = new System.Windows.Forms.TabPage();
+                       this.label8 = new System.Windows.Forms.Label();
+                       this.showComboBox = new System.Windows.Forms.ComboBox();
+                       this.detailsTextBox = new System.Windows.Forms.TextBox();
+                       this.fieldListView = new System.Windows.Forms.ListView();
+                       this.fieldColumnHeader = new System.Windows.Forms.ColumnHeader();
+                       this.valueColumnHeader = new System.Windows.Forms.ColumnHeader();
+                       this.fieldsImageList = new System.Windows.Forms.ImageList(this.components);
+                       this.tabPage3 = new System.Windows.Forms.TabPage();
+                       this.label9 = new System.Windows.Forms.Label();
+                       this.certStatusTextBox = new System.Windows.Forms.TextBox();
+                       this.certPathTreeView = new System.Windows.Forms.TreeView();
+                       this.okButton = new System.Windows.Forms.Button();
+                       this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+                       this.helpProvider = new System.Windows.Forms.HelpProvider();
+                       this.iconImageList = new System.Windows.Forms.ImageList(this.components);
+                       this.tabControl1.SuspendLayout();
+                       this.tabPage1.SuspendLayout();
+                       this.panel1.SuspendLayout();
+                       this.panel4.SuspendLayout();
+                       this.panel2.SuspendLayout();
+                       this.tabPage2.SuspendLayout();
+                       this.tabPage3.SuspendLayout();
+                       this.SuspendLayout();
+                       // 
+                       // tabControl1
+                       // 
+                       this.tabControl1.Controls.AddRange(new System.Windows.Forms.Control[] {
+                                                                                                     this.tabPage1,
+                                                                                                     this.tabPage2,
+                                                                                                     this.tabPage3});
+                       this.tabControl1.Location = new System.Drawing.Point(8, 8);
+                       this.tabControl1.Name = "tabControl1";
+                       this.tabControl1.SelectedIndex = 0;
+                       this.tabControl1.Size = new System.Drawing.Size(384, 408);
+                       this.tabControl1.TabIndex = 0;
+                       // 
+                       // tabPage1
+                       // 
+                       this.tabPage1.Controls.AddRange(new System.Windows.Forms.Control[] {
+                                                                                                  this.issuerStatementButton,
+                                                                                                  this.panel1});
+                       this.tabPage1.Location = new System.Drawing.Point(4, 22);
+                       this.tabPage1.Name = "tabPage1";
+                       this.tabPage1.Size = new System.Drawing.Size(376, 382);
+                       this.tabPage1.TabIndex = 0;
+                       this.tabPage1.Text = "General";
+                       // 
+                       // issuerStatementButton
+                       // 
+                       this.issuerStatementButton.Enabled = false;
+                       this.issuerStatementButton.Location = new System.Drawing.Point(264, 344);
+                       this.issuerStatementButton.Name = "issuerStatementButton";
+                       this.issuerStatementButton.Size = new System.Drawing.Size(104, 23);
+                       this.issuerStatementButton.TabIndex = 2;
+                       this.issuerStatementButton.Text = "Issuer Statement";
+                       // 
+                       // panel1
+                       // 
+                       this.panel1.BackColor = System.Drawing.SystemColors.Window;
+                       this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+                       this.panel1.Controls.AddRange(new System.Windows.Forms.Control[] {
+                                                                                                this.badPictureBox,
+                                                                                                this.goodPictureBox,
+                                                                                                this.label1,
+                                                                                                this.subjectAltNameLinkLabel,
+                                                                                                this.keyUsageRichTextBox,
+                                                                                                this.issuedByTextBox,
+                                                                                                this.issuedToTextBox,
+                                                                                                this.issuedByLinkLabel,
+                                                                                                this.panel4,
+                                                                                                this.panel2,
+                                                                                                this.privateKeyLabel,
+                                                                                                this.notAfterLabel,
+                                                                                                this.label6,
+                                                                                                this.notBeforeLabel,
+                                                                                                this.label4,
+                                                                                                this.label3,
+                                                                                                this.label2,
+                                                                                                this.certificateLabel});
+                       this.panel1.Location = new System.Drawing.Point(8, 8);
+                       this.panel1.Name = "panel1";
+                       this.panel1.Size = new System.Drawing.Size(360, 328);
+                       this.panel1.TabIndex = 0;
+                       // 
+                       // badPictureBox
+                       // 
+                       this.badPictureBox.Image = ((System.Drawing.Bitmap)(resources.GetObject("badPictureBox.Image")));
+                       this.badPictureBox.Name = "badPictureBox";
+                       this.badPictureBox.Size = new System.Drawing.Size(64, 64);
+                       this.badPictureBox.TabIndex = 21;
+                       this.badPictureBox.TabStop = false;
+                       // 
+                       // goodPictureBox
+                       // 
+                       this.goodPictureBox.Image = ((System.Drawing.Bitmap)(resources.GetObject("goodPictureBox.Image")));
+                       this.goodPictureBox.Name = "goodPictureBox";
+                       this.goodPictureBox.Size = new System.Drawing.Size(64, 64);
+                       this.goodPictureBox.TabIndex = 20;
+                       this.goodPictureBox.TabStop = false;
+                       this.goodPictureBox.Visible = false;
+                       // 
+                       // label1
+                       // 
+                       this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.label1.Location = new System.Drawing.Point(64, 8);
+                       this.label1.Name = "label1";
+                       this.label1.Size = new System.Drawing.Size(288, 56);
+                       this.label1.TabIndex = 0;
+                       this.label1.Text = "Certificate Information";
+                       // 
+                       // subjectAltNameLinkLabel
+                       // 
+                       this.helpProvider.SetHelpString(this.subjectAltNameLinkLabel, "Subject Alternative Name (e.g. email)");
+                       this.subjectAltNameLinkLabel.Location = new System.Drawing.Point(73, 208);
+                       this.subjectAltNameLinkLabel.Name = "subjectAltNameLinkLabel";
+                       this.helpProvider.SetShowHelp(this.subjectAltNameLinkLabel, true);
+                       this.subjectAltNameLinkLabel.Size = new System.Drawing.Size(272, 16);
+                       this.subjectAltNameLinkLabel.TabIndex = 19;
+                       this.subjectAltNameLinkLabel.TabStop = true;
+                       this.subjectAltNameLinkLabel.Text = "mailto:spouliot@motus.com";
+                       this.subjectAltNameLinkLabel.Visible = false;
+                       this.subjectAltNameLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.subjectAltNameLinkLabel_LinkClicked);
+                       // 
+                       // keyUsageRichTextBox
+                       // 
+                       this.keyUsageRichTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+                       this.keyUsageRichTextBox.Location = new System.Drawing.Point(16, 96);
+                       this.keyUsageRichTextBox.Name = "keyUsageRichTextBox";
+                       this.keyUsageRichTextBox.Size = new System.Drawing.Size(328, 88);
+                       this.keyUsageRichTextBox.TabIndex = 9;
+                       this.keyUsageRichTextBox.TabStop = false;
+                       this.keyUsageRichTextBox.Text = "";
+                       // 
+                       // issuedByTextBox
+                       // 
+                       this.issuedByTextBox.AcceptsReturn = true;
+                       this.issuedByTextBox.BackColor = System.Drawing.SystemColors.Window;
+                       this.issuedByTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+                       this.issuedByTextBox.Location = new System.Drawing.Point(75, 232);
+                       this.issuedByTextBox.Name = "issuedByTextBox";
+                       this.issuedByTextBox.ReadOnly = true;
+                       this.issuedByTextBox.Size = new System.Drawing.Size(269, 14);
+                       this.issuedByTextBox.TabIndex = 18;
+                       this.issuedByTextBox.TabStop = false;
+                       this.issuedByTextBox.Text = "issued by";
+                       // 
+                       // issuedToTextBox
+                       // 
+                       this.issuedToTextBox.AcceptsReturn = true;
+                       this.issuedToTextBox.BackColor = System.Drawing.SystemColors.Window;
+                       this.issuedToTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+                       this.issuedToTextBox.Location = new System.Drawing.Point(75, 192);
+                       this.issuedToTextBox.Name = "issuedToTextBox";
+                       this.issuedToTextBox.ReadOnly = true;
+                       this.issuedToTextBox.Size = new System.Drawing.Size(269, 14);
+                       this.issuedToTextBox.TabIndex = 17;
+                       this.issuedToTextBox.TabStop = false;
+                       this.issuedToTextBox.Text = "issued to";
+                       // 
+                       // issuedByLinkLabel
+                       // 
+                       this.issuedByLinkLabel.Location = new System.Drawing.Point(72, 248);
+                       this.issuedByLinkLabel.Name = "issuedByLinkLabel";
+                       this.issuedByLinkLabel.Size = new System.Drawing.Size(272, 16);
+                       this.issuedByLinkLabel.TabIndex = 15;
+                       this.issuedByLinkLabel.TabStop = true;
+                       this.issuedByLinkLabel.Text = "http://www.go-mono.com/";
+                       this.issuedByLinkLabel.Visible = false;
+                       // 
+                       // panel4
+                       // 
+                       this.panel4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+                       this.panel4.Controls.AddRange(new System.Windows.Forms.Control[] {
+                                                                                                this.panel5});
+                       this.panel4.Location = new System.Drawing.Point(8, 64);
+                       this.panel4.Name = "panel4";
+                       this.panel4.Size = new System.Drawing.Size(336, 1);
+                       this.panel4.TabIndex = 13;
+                       // 
+                       // panel5
+                       // 
+                       this.panel5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+                       this.panel5.Location = new System.Drawing.Point(-1, 0);
+                       this.panel5.Name = "panel5";
+                       this.panel5.Size = new System.Drawing.Size(344, 1);
+                       this.panel5.TabIndex = 13;
+                       // 
+                       // panel2
+                       // 
+                       this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+                       this.panel2.Controls.AddRange(new System.Windows.Forms.Control[] {
+                                                                                                this.panel3});
+                       this.panel2.Location = new System.Drawing.Point(8, 184);
+                       this.panel2.Name = "panel2";
+                       this.panel2.Size = new System.Drawing.Size(336, 1);
+                       this.panel2.TabIndex = 12;
+                       // 
+                       // panel3
+                       // 
+                       this.panel3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+                       this.panel3.Location = new System.Drawing.Point(-1, 0);
+                       this.panel3.Name = "panel3";
+                       this.panel3.Size = new System.Drawing.Size(344, 1);
+                       this.panel3.TabIndex = 13;
+                       // 
+                       // privateKeyLabel
+                       // 
+                       this.privateKeyLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.privateKeyLabel.Location = new System.Drawing.Point(32, 298);
+                       this.privateKeyLabel.Name = "privateKeyLabel";
+                       this.privateKeyLabel.Size = new System.Drawing.Size(312, 16);
+                       this.privateKeyLabel.TabIndex = 11;
+                       this.privateKeyLabel.Text = "You have a private key that match this certificate";
+                       this.privateKeyLabel.Visible = false;
+                       // 
+                       // notAfterLabel
+                       // 
+                       this.notAfterLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.notAfterLabel.Location = new System.Drawing.Point(156, 272);
+                       this.notAfterLabel.Name = "notAfterLabel";
+                       this.notAfterLabel.Size = new System.Drawing.Size(64, 16);
+                       this.notAfterLabel.TabIndex = 8;
+                       this.notAfterLabel.Text = "9999-99-99";
+                       // 
+                       // label6
+                       // 
+                       this.label6.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.label6.Location = new System.Drawing.Point(136, 272);
+                       this.label6.Name = "label6";
+                       this.label6.Size = new System.Drawing.Size(16, 16);
+                       this.label6.TabIndex = 7;
+                       this.label6.Text = "to";
+                       // 
+                       // notBeforeLabel
+                       // 
+                       this.notBeforeLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.notBeforeLabel.Location = new System.Drawing.Point(72, 272);
+                       this.notBeforeLabel.Name = "notBeforeLabel";
+                       this.notBeforeLabel.Size = new System.Drawing.Size(64, 16);
+                       this.notBeforeLabel.TabIndex = 6;
+                       this.notBeforeLabel.Text = "9999-99-99";
+                       // 
+                       // label4
+                       // 
+                       this.label4.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.label4.Location = new System.Drawing.Point(8, 232);
+                       this.label4.Name = "label4";
+                       this.label4.Size = new System.Drawing.Size(64, 16);
+                       this.label4.TabIndex = 3;
+                       this.label4.Text = "Issued by:";
+                       // 
+                       // label3
+                       // 
+                       this.label3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.label3.Location = new System.Drawing.Point(8, 192);
+                       this.label3.Name = "label3";
+                       this.label3.Size = new System.Drawing.Size(64, 16);
+                       this.label3.TabIndex = 2;
+                       this.label3.Text = "Issued to:";
+                       // 
+                       // label2
+                       // 
+                       this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.label2.Location = new System.Drawing.Point(8, 272);
+                       this.label2.Name = "label2";
+                       this.label2.Size = new System.Drawing.Size(64, 16);
+                       this.label2.TabIndex = 1;
+                       this.label2.Text = "Valid from";
+                       // 
+                       // certificateLabel
+                       // 
+                       this.certificateLabel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.certificateLabel.Location = new System.Drawing.Point(8, 72);
+                       this.certificateLabel.Name = "certificateLabel";
+                       this.certificateLabel.Size = new System.Drawing.Size(344, 112);
+                       this.certificateLabel.TabIndex = 10;
+                       this.certificateLabel.Text = "This certificate is intended to:";
+                       // 
+                       // tabPage2
+                       // 
+                       this.tabPage2.Controls.AddRange(new System.Windows.Forms.Control[] {
+                                                                                                  this.label8,
+                                                                                                  this.showComboBox,
+                                                                                                  this.detailsTextBox,
+                                                                                                  this.fieldListView});
+                       this.tabPage2.Location = new System.Drawing.Point(4, 22);
+                       this.tabPage2.Name = "tabPage2";
+                       this.tabPage2.Size = new System.Drawing.Size(376, 382);
+                       this.tabPage2.TabIndex = 1;
+                       this.tabPage2.Text = "Details";
+                       // 
+                       // label8
+                       // 
+                       this.label8.Location = new System.Drawing.Point(8, 12);
+                       this.label8.Name = "label8";
+                       this.label8.Size = new System.Drawing.Size(40, 16);
+                       this.label8.TabIndex = 3;
+                       this.label8.Text = "Show:";
+                       // 
+                       // showComboBox
+                       // 
+                       this.showComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+                       this.showComboBox.Items.AddRange(new object[] {
+                                                                             "<All>",
+                                                                             "Version 1 Fields Only",
+                                                                             "Extensions Only",
+                                                                             "Critical Extensions Only",
+                                                                             "Properties Only"});
+                       this.showComboBox.Location = new System.Drawing.Point(48, 8);
+                       this.showComboBox.MaxDropDownItems = 5;
+                       this.showComboBox.Name = "showComboBox";
+                       this.showComboBox.Size = new System.Drawing.Size(320, 21);
+                       this.showComboBox.TabIndex = 2;
+                       this.showComboBox.SelectedIndexChanged += new System.EventHandler(this.showComboBox_SelectedIndexChanged);
+                       // 
+                       // detailsTextBox
+                       // 
+                       this.detailsTextBox.AcceptsReturn = true;
+                       this.detailsTextBox.BackColor = System.Drawing.SystemColors.Window;
+                       this.detailsTextBox.Location = new System.Drawing.Point(8, 216);
+                       this.detailsTextBox.Multiline = true;
+                       this.detailsTextBox.Name = "detailsTextBox";
+                       this.detailsTextBox.ReadOnly = true;
+                       this.detailsTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+                       this.detailsTextBox.Size = new System.Drawing.Size(360, 120);
+                       this.detailsTextBox.TabIndex = 1;
+                       this.detailsTextBox.Text = "";
+                       // 
+                       // fieldListView
+                       // 
+                       this.fieldListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+                                                                                                           this.fieldColumnHeader,
+                                                                                                           this.valueColumnHeader});
+                       this.fieldListView.FullRowSelect = true;
+                       this.fieldListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+                       this.fieldListView.HideSelection = false;
+                       this.fieldListView.Location = new System.Drawing.Point(8, 40);
+                       this.fieldListView.MultiSelect = false;
+                       this.fieldListView.Name = "fieldListView";
+                       this.fieldListView.Size = new System.Drawing.Size(360, 168);
+                       this.fieldListView.SmallImageList = this.fieldsImageList;
+                       this.fieldListView.TabIndex = 0;
+                       this.fieldListView.View = System.Windows.Forms.View.Details;
+                       this.fieldListView.SelectedIndexChanged += new System.EventHandler(this.fieldListView_SelectedIndexChanged);
+                       // 
+                       // fieldColumnHeader
+                       // 
+                       this.fieldColumnHeader.Text = "Field";
+                       this.fieldColumnHeader.Width = 140;
+                       // 
+                       // valueColumnHeader
+                       // 
+                       this.valueColumnHeader.Text = "Value";
+                       this.valueColumnHeader.Width = 200;
+                       // 
+                       // fieldsImageList
+                       // 
+                       this.fieldsImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+                       this.fieldsImageList.ImageSize = new System.Drawing.Size(16, 16);
+                       this.fieldsImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("fieldsImageList.ImageStream")));
+                       this.fieldsImageList.TransparentColor = System.Drawing.Color.Transparent;
+                       // 
+                       // tabPage3
+                       // 
+                       this.tabPage3.Controls.AddRange(new System.Windows.Forms.Control[] {
+                                                                                                  this.label9,
+                                                                                                  this.certStatusTextBox,
+                                                                                                  this.certPathTreeView});
+                       this.tabPage3.Location = new System.Drawing.Point(4, 22);
+                       this.tabPage3.Name = "tabPage3";
+                       this.tabPage3.Size = new System.Drawing.Size(376, 382);
+                       this.tabPage3.TabIndex = 2;
+                       this.tabPage3.Text = "Certificate Path";
+                       // 
+                       // label9
+                       // 
+                       this.label9.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.label9.Location = new System.Drawing.Point(8, 296);
+                       this.label9.Name = "label9";
+                       this.label9.Size = new System.Drawing.Size(96, 16);
+                       this.label9.TabIndex = 7;
+                       this.label9.Text = "Certificate Status";
+                       // 
+                       // certStatusTextBox
+                       // 
+                       this.certStatusTextBox.AcceptsReturn = true;
+                       this.certStatusTextBox.BackColor = System.Drawing.SystemColors.Window;
+                       this.certStatusTextBox.ForeColor = System.Drawing.SystemColors.WindowText;
+                       this.certStatusTextBox.Location = new System.Drawing.Point(8, 312);
+                       this.certStatusTextBox.Multiline = true;
+                       this.certStatusTextBox.Name = "certStatusTextBox";
+                       this.certStatusTextBox.ReadOnly = true;
+                       this.certStatusTextBox.Size = new System.Drawing.Size(360, 56);
+                       this.certStatusTextBox.TabIndex = 2;
+                       this.certStatusTextBox.Text = "This certificate is OK.";
+                       // 
+                       // certPathTreeView
+                       // 
+                       this.certPathTreeView.ImageIndex = -1;
+                       this.certPathTreeView.Location = new System.Drawing.Point(8, 8);
+                       this.certPathTreeView.Name = "certPathTreeView";
+                       this.certPathTreeView.SelectedImageIndex = -1;
+                       this.certPathTreeView.Size = new System.Drawing.Size(360, 280);
+                       this.certPathTreeView.TabIndex = 0;
+                       // 
+                       // okButton
+                       // 
+                       this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+                       this.okButton.FlatStyle = System.Windows.Forms.FlatStyle.System;
+                       this.okButton.Location = new System.Drawing.Point(317, 424);
+                       this.okButton.Name = "okButton";
+                       this.okButton.TabIndex = 1;
+                       this.okButton.Text = "OK";
+                       this.okButton.Click += new System.EventHandler(this.okButton_Click);
+                       // 
+                       // iconImageList
+                       // 
+                       this.iconImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth24Bit;
+                       this.iconImageList.ImageSize = new System.Drawing.Size(64, 64);
+                       this.iconImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("iconImageList.ImageStream")));
+                       this.iconImageList.TransparentColor = System.Drawing.Color.Black;
+                       // 
+                       // CertificateViewer
+                       // 
+                       this.AcceptButton = this.okButton;
+                       this.AutoScaleBaseSize = new System.Drawing.Size(5, 14);
+                       this.CancelButton = this.okButton;
+                       this.ClientSize = new System.Drawing.Size(400, 453);
+                       this.Controls.AddRange(new System.Windows.Forms.Control[] {
+                                                                                         this.okButton,
+                                                                                         this.tabControl1});
+                       this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+                       this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+                       this.HelpButton = true;
+                       this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+                       this.MaximizeBox = false;
+                       this.MinimizeBox = false;
+                       this.Name = "CertificateViewer";
+                       this.Text = "Mono Certificate Viewer";
+                       this.tabControl1.ResumeLayout(false);
+                       this.tabPage1.ResumeLayout(false);
+                       this.panel1.ResumeLayout(false);
+                       this.panel4.ResumeLayout(false);
+                       this.panel2.ResumeLayout(false);
+                       this.tabPage2.ResumeLayout(false);
+                       this.tabPage3.ResumeLayout(false);
+                       this.ResumeLayout(false);
+
+               }
+               #endregion
+
+               private CertificateFormatter cf;
+               private Font genericFont;
+               private Font monospaceFont;
+
+               private ListViewItem itemVersion;
+               private ListViewItem itemSerial;
+               private ListViewItem itemSignatureAlgorithm;
+               private ListViewItem itemIssuer;
+               private ListViewItem itemValidFrom;
+               private ListViewItem itemValidUntil;
+               private ListViewItem itemSubject;
+               private ListViewItem itemPublicKey;
+               private ListViewItem[] itemExtensions;
+               private ListViewItem itemThumbprintAlgorithm;
+               private ListViewItem itemThumbprint;
+
+               public void LoadCertificate (string filename) 
+               {
+                       cf = new CertificateFormatter (filename);
+
+                       genericFont = detailsTextBox.Font;
+                       monospaceFont = new Font (FontFamily.GenericMonospace, 10);
+
+                       issuedToTextBox.Text = cf.Subject (false);
+                       toolTip.SetToolTip (issuedToTextBox, issuedToTextBox.Text);
+
+                       subjectAltNameLinkLabel.Text = cf.SubjectAltName (false);
+                       subjectAltNameLinkLabel.Visible = (subjectAltNameLinkLabel.Text != String.Empty);
+
+                       issuedByTextBox.Text = cf.Issuer (false);
+                       toolTip.SetToolTip (issuedByTextBox, issuedByTextBox.Text);
+
+                       notBeforeLabel.Text = cf.Certificate.ValidFrom.ToString ("yyyy-MM-dd");
+                       notAfterLabel.Text = cf.Certificate.ValidUntil.ToString ("yyyy-MM-dd");
+
+                       if (cf.Certificate.Version == 1) {
+                               // not in certificate so it's a property
+                               itemVersion = new ListViewItem (CertificateFormatter.FieldNames.Version, 0);
+                               itemVersion.ForeColor = Color.Blue;
+                       }
+                       else
+                               itemVersion = new ListViewItem (CertificateFormatter.FieldNames.Version, 2);
+                       itemVersion.SubItems.Add (cf.Version (false));
+                       itemVersion.SubItems.Add (cf.Version (true));
+
+                       itemSerial = new ListViewItem (CertificateFormatter.FieldNames.SerialNumber, 1);
+                       itemSerial.SubItems.Add (cf.SerialNumber (false));
+                       itemSerial.SubItems.Add (cf.SerialNumber (true));
+                       itemSerial.Tag = monospaceFont;
+
+                       itemSignatureAlgorithm = new ListViewItem (CertificateFormatter.FieldNames.SignatureAlgorithm, 1);
+                       itemSignatureAlgorithm.SubItems.Add (cf.SignatureAlgorithm (false));
+                       itemSignatureAlgorithm.SubItems.Add (cf.SignatureAlgorithm (true));
+
+                       itemIssuer = new ListViewItem (CertificateFormatter.FieldNames.Issuer, 1);
+                       itemIssuer.SubItems.Add (cf.Issuer (false));
+                       itemIssuer.SubItems.Add (cf.Issuer (true));
+
+                       itemValidFrom = new ListViewItem (CertificateFormatter.FieldNames.ValidFrom, 1);
+                       itemValidFrom.SubItems.Add (cf.ValidFrom (false));
+                       itemValidFrom.SubItems.Add (cf.ValidFrom (true));
+
+                       itemValidUntil = new ListViewItem (CertificateFormatter.FieldNames.ValidUntil,1);
+                       itemValidUntil.SubItems.Add (cf.ValidUntil (false));
+                       itemValidUntil.SubItems.Add (cf.ValidUntil (true));
+
+                       itemSubject = new ListViewItem (CertificateFormatter.FieldNames.Subject, 1);
+                       itemSubject.SubItems.Add (cf.Subject (false));
+                       itemSubject.SubItems.Add (cf.Subject (true));
+
+                       itemPublicKey = new ListViewItem (CertificateFormatter.FieldNames.PublicKey, 1);
+                       itemPublicKey.SubItems.Add (cf.PublicKey (false));
+                       itemPublicKey.SubItems.Add (cf.PublicKey (true));
+                       itemPublicKey.Tag = monospaceFont;
+
+                       itemExtensions = new ListViewItem [cf.Certificate.Extensions.Count];
+                       for (int i=0; i < cf.Certificate.Extensions.Count; i++) {
+                               X509Extension xe = cf.GetExtension (i);
+                               int critical = (xe.Critical ? 4 : 3);
+                               string name = xe.Name;
+                               object tag = null;
+                               if (name == xe.OID)
+                                       tag = monospaceFont;
+                               ListViewItem lvi = new ListViewItem (name, critical);
+                               lvi.Tag = tag;
+                               if (critical == 4)
+                                       lvi.ForeColor = Color.Red;
+                               string exts = xe.ToString ();
+                               if (xe.Name == xe.OID)
+                                       lvi.SubItems.Add (cf.Extension (i, false));
+                               else 
+                                       lvi.SubItems.Add (CertificateFormatter.OneLine (exts));
+                               lvi.SubItems.Add (exts);
+                               itemExtensions [i] = lvi;
+                       }
+
+                       // properties (calculated)
+                       itemThumbprintAlgorithm = new ListViewItem (CertificateFormatter.PropertyNames.ThumbprintAlgorithm, 0);
+                       itemThumbprintAlgorithm.SubItems.Add (cf.ThumbprintAlgorithm);
+                       itemThumbprintAlgorithm.SubItems.Add (cf.ThumbprintAlgorithm);
+                       itemThumbprintAlgorithm.ForeColor = Color.Blue;
+
+                       itemThumbprint = new ListViewItem (CertificateFormatter.PropertyNames.Thumbprint, 0);
+                       string tb = CertificateFormatter.Array2Word (cf.Thumbprint);
+                       itemThumbprint.SubItems.Add (tb);
+                       itemThumbprint.SubItems.Add (tb);
+                       itemThumbprint.Tag = monospaceFont;
+                       itemThumbprint.ForeColor = Color.Blue;
+
+                       showComboBox.SelectedIndex = 0;
+
+                       if (cf.Status != null) {
+                               badPictureBox.Visible = true;
+                               keyUsageRichTextBox.Visible = false;
+                               certificateLabel.Text = cf.Status;
+                               certificateLabel.ForeColor = Color.Red;
+                               certStatusTextBox.Text = cf.Status;
+                               certStatusTextBox.ForeColor = Color.Red;
+                       }
+                       else
+                               badPictureBox.Visible = false;
+                       goodPictureBox.Visible = !badPictureBox.Visible;
+
+                       keyUsageRichTextBox.SelectionBullet = true;
+                       keyUsageRichTextBox.Text = "No restrictions";
+               }
+
+               /// <summary>
+               /// The main entry point for the application.
+               /// </summary>
+               [STAThread]
+               static void Main (string[] args) 
+               {
+                       string filename = ((args.Length > 0) ? args[0] : null);
+                       if ((filename != null) && (File.Exists (filename)))
+                               Application.Run (new CertificateViewer (filename));
+               }
+
+               private void okButton_Click (object sender, System.EventArgs e) 
+               {
+                       Application.Exit ();
+               }
+
+               private void fieldListView_SelectedIndexChanged (object sender, System.EventArgs e) 
+               {
+                       if (sender is ListView) {
+                               ListView lv = (sender as ListView);
+                               if (lv.SelectedItems.Count > 0) {
+                                       ListViewItem lvi = lv.SelectedItems [0];
+                                       if (lvi.Tag is Font)
+                                               detailsTextBox.Font = (lvi.Tag as Font);
+                                       else
+                                               detailsTextBox.Font = genericFont;
+                                       detailsTextBox.Text = lvi.SubItems [2].Text;
+                               }
+                       }
+               }
+
+               private void UpdateListView (int filter) 
+               {
+                       fieldListView.Items.Clear ();
+
+                       if ((filter == 0) || ((filter == 4) && (itemVersion.ImageIndex == 0)))
+                               fieldListView.Items.Add (itemVersion);
+
+                       if (filter < 2)
+                               fieldListView.Items.AddRange (new ListViewItem[] {itemSerial, itemSignatureAlgorithm, itemIssuer, itemValidFrom, itemValidUntil, itemSubject, itemPublicKey });
+
+                       if ((filter != 1) && (filter != 4)) {
+                               for (int i=0; i < itemExtensions.Length; i++) {
+                                       if ((filter != 3) || ((filter == 3) && (cf.Certificate.Extensions [i].Critical))) {
+                                               fieldListView.Items.Add (itemExtensions [i]);
+                                       }
+                               }
+                       }
+
+                       if ((filter == 0) || (filter == 4)) {
+                               fieldListView.Items.Add (itemThumbprintAlgorithm);
+                               fieldListView.Items.Add (itemThumbprint);
+                       }
+
+                       detailsTextBox.Text = "";
+               }
+
+               private void showComboBox_SelectedIndexChanged (object sender, System.EventArgs e) 
+               {
+                       UpdateListView ((sender as ComboBox).SelectedIndex);
+               }
+
+               private void subjectAltNameLinkLabel_LinkClicked (object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) 
+               {
+                       System.Diagnostics.Process.Start ((sender as LinkLabel).Text);
+               }
+       }
+}
diff --git a/mcs/tools/security/certview/CertificateViewer.resx b/mcs/tools/security/certview/CertificateViewer.resx
new file mode 100644 (file)
index 0000000..21467ae
--- /dev/null
@@ -0,0 +1,759 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+            Microsoft ResX Schema 
+        
+            Version 1.3
+                
+            The primary goals of this format is to allow a simple XML format 
+            that is mostly human readable. The generation and parsing of the 
+            various data types are done through the TypeConverter classes 
+            associated with the data types.
+        
+            Example:
+        
+                ... ado.net/XML headers & schema ...
+                <resheader name="resmimetype">text/microsoft-resx</resheader>
+                <resheader name="version">1.3</resheader>
+                <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+                <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+                <data name="Name1">this is my long string</data>
+                <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+                <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+                    [base64 mime encoded serialized .NET Framework object]
+                </data>
+                <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+                    [base64 mime encoded string representing a byte array form of the .NET Framework object]
+                </data>
+        
+            There are any number of "resheader" rows that contain simple 
+            name/value pairs.
+            
+            Each data row contains a name, and value. The row also contains a 
+            type or mimetype. Type corresponds to a .NET class that support 
+            text/value conversion through the TypeConverter architecture. 
+            Classes that don't support this are serialized and stored with the 
+            mimetype set.
+                     
+            The mimetype is used for serialized objects, and tells the 
+            ResXResourceReader how to depersist the object. This is currently not 
+            extensible. For a given mimetype the value must be set accordingly:
+        
+            Note - application/x-microsoft.net.object.binary.base64 is the format 
+                   that the ResXResourceWriter will generate, however the reader can 
+                   read any of the formats listed below.
+        
+            mimetype: application/x-microsoft.net.object.binary.base64
+            value   : The object must be serialized with 
+                    : System.Serialization.Formatters.Binary.BinaryFormatter
+                    : and then encoded with base64 encoding.
+        
+            mimetype: application/x-microsoft.net.object.soap.base64
+            value   : The object must be serialized with 
+                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+                    : and then encoded with base64 encoding.
+            mimetype: application/x-microsoft.net.object.bytearray.base64
+            value   : The object must be serialized into a byte array 
+                    : using a System.ComponentModel.TypeConverter
+                    : and then encoded with base64 encoding.
+        -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="badPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        rQAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="goodPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        CL9BkgTHf24AAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="fieldsImageList.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </data>
+  <data name="fieldsImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuMzMw
+        MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT
+        eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA
+        AAC4CAAAAk1TRnQBSQFMAgEBBQEAAQkBAAEEAQABEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQC
+        AAEoAwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB
+        3AHAAQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IB
+        AAM5AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8B
+        MwMAAWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYC
+        AAFmAZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMC
+        AAHMAWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQAB
+        ZgEAATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8B
+        AAEzAWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQAB
+        MwGZAWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQAB
+        MwLMAQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQAB
+        MwEAAWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMB
+        mQEAAWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQAB
+        ZgGZAWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYB
+        zAH/AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMB
+        mQEAAZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgAB
+        mQFmATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwB
+        AAKZAf8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB
+        /wEzAQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQAB
+        mQEAAcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYC
+        AAHMAWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYB
+        AAHMApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8C
+        AAHMAf8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQAB
+        mQEAAcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMB
+        AAHMAmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB
+        /wGZAcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC
+        /wEzAQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC
+        /wFmAQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gB
+        AAHwAfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8AyAAC
+        +QMABvk1AAL5AwAG+TQABPkGAAL5MwAC+QIAAvkFAAL5MwAC+QIAAvkDAAT5MwAC+QIAAvkDAAT5PgAC
+        +T4AAvk6AAb5OgAG+fIAA/8B7AgAAuwyAAT/BgAB7AEHAv8yAAX/AwAB7AX/AewxAAX/AgcG/wLsBAAC
+        /wMABv8FAAL/AwAG/wUAAv8DAAb/AgAM/wHsAQcB/wQAAv8DAAb/BQAC/wMABv8FAAL/AwAG/wIAC/8B
+        BwP/AwAE/wQAAv8GAAT/AgAD/wcABP8GAAL/AgAP/wIAAv8CAAL/AwAC/wUAAv8CAAL/AgAD/wUAAv8C
+        AAL/BQAC/wIADv8BBwIAAv8CAAL/AwAC/wUAAv8CAAL/AwAD/wQAAv8CAAL/AwAE/wIADv8B7AIAAv8C
+        AAL/AwAC/wUAAv8CAAL/BAAD/wMAAv8CAAL/AwAE/wIADf8BBwHsCQAE/xAAAv8OAAL/AgAB7AEAAuwB
+        Bwr/CQAE/wwAAv8CAAL/DgAC/wIAAewCAAHsC/8KAAP/DAAG/woABv8CAAHsAgAL/wHsCwAC/wwABv8K
+        AAb/AgAB7AIAAQcK/zIAAewDAAPsAQcC/wEHAuwzAAHsPwABQgFNAT4HAAE+AwABKAMAAUADAAEwAwAB
+        AQEAAQEFAAGAAQEWAAP//wCYAAs=
+</value>
+  </data>
+  <data name="toolTip.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>143, 17</value>
+  </data>
+  <data name="helpProvider.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>228, 17</value>
+  </data>
+  <data name="iconImageList.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>341, 17</value>
+  </data>
+  <data name="iconImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuMzMw
+        MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT
+        eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA
+        AAAKTwAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABQAEAAUABAAT/ARkBEAj/AUIBTQE2BwABNgMAASgE
+        AAEBAgABQAMAAQEBAAEYBgABwP8A/wD/AP8A/wD/AP8AUQAB1QGqAav/AP8ANgABxgJNwwABvwGAAYIB
+        3gHfAeABqf8A/wA1AAHiAecB6cAAAY0CAQHXAdwB3wHcAeEB4/8A/wAzAAGsAUoBSwHdAeIB5MAAAbAB
+        jgGRAc4B0wHWAdEB1wHZ/wD/ADMAAc4B1AHWAdIB2AHawAABvgHEAccBwwHJAcsBxgHMAc8BkAJR/wD/
+        AC0AAZABQwFEAccBzQHPAcsB0QHTAa0BjQGQugABgQIcAbcBvQHAAbsBwgHEAcABxgHIAcQByAHKEgAB
+        iwEIAQcBrwF6AXMBtwGRAYcBuQGNAYX/AP8ADwABvAHCAcUBwAHGAcgBwwHKAcwByQHPAdEVAAGNARQB
+        EwG8AbABpgG8AbABppwAAZsBjAGOAbABtwG5AbQBuwG9AbkBvwHCAcABxQHIAawBngGfCQABkAFFAUMB
+        twGsAaMBvAGwAaYBvAGwAaYBuwGpAZ//AP8AEgABsQG4AboBtQG7Ab4BuQG/AcEBvgHEAccBwgHIAcoB
+        bgIVBgABfAElASQBtAGpAZ8BtwGsAaEBugGuAaQBvAGwAaacAAGGAlIBoAGnAaoBpQGsAa8BqgGxAbQB
+        rgG1AbcBtQG7Ab4BugHBAcMBpQGbAZQBpAGaAY8BqAGdAZMBqwGgAZYBsAGlAZoBswGoAZ4BsQGgAZb/
+        AP8AFQABqgGxAbQBrgG0AbcBsQG4AboBtwG9AcABugHBAcMBvgHEAccBYwEiASEBpwGcAZMBqgGgAZUB
+        rgGjAZkBsgGnAZwBtAGpAZ8BowF1AW6cAAGSAZABkwGZAaABowGfAaYBqQGjAaoBrQGnAa4BsQGtAbQB
+        twGkAaEBnQGZAY8BhgGfAZQBigGiAZgBjgGlAZoBkQGrAaABlgGtAaIBmQGJASEBH/8A/wASAAGJAWwB
+        bwGjAaoBrQGmAa0BsAGqAbEBtAGvAbYBuQGzAboBvAGyAbUBtwGfAZQBigGiAZcBjgGkAZoBjwGpAZ4B
+        lAGsAaEBlwGuAaMBmZwAAXgBLAEtAY4BlQGYAZEBmQGcAZgBnwGiAZwBpAGnAaABpwGqAacBrwGzAZIB
+        hwF/AZUBiwGBAZkBjwGFAZwBkwGJAaEBlQGMAaUBmQGQAasBoAGW/wD/ABUAAZIBmgGdAZgBnwGiAZsB
+        owGmAZ8BpgGpAaQBqwGuAagBrwGyAZIBhwF/AZYBjAGCAZkBjgGFAZsBkgGIAaEBlQGMAaMBmAGOAZ0B
+        igGAnAABgQGKAY0BgwGLAY4BhgGOAZEBiwGSAZUBjQGWAZkBkgGaAZ0BgwF5AXEBiQF/AXYBjAGCAXkB
+        kgGIAX4BlAGKAYEBmAGNAYQBmwGQAYf/AP8AFQABegFOAVABiwGTAZYBkAGYAZsBlAGcAZ8BmAGfAaIB
+        nAGjAaYBlQGTAZABjAGCAXkBkQGHAX0BkwGJAYABlgGMAYIBmgGQAYcBnQGSAYmcAAGJAgIBeAGAAYQB
+        egGCAYYBfAGEAYcBfQGEAYcBfQGEAYYBgAGHAYkBeAFvAWcBgAF3AW4BhQF7AXMBjAGCAXkBkAGFAXsB
+        kgGIAX8BiAFZAVL/AP8AFQABgAGIAYsBhAGMAY8BiAGQAZMBigGSAZUBjAGUAZcBkQGYAZsBgQF4AW4B
+        hQF7AXMBiwGBAXgBjgGEAXoBkQGHAX0BlQGLAYEBkQF8AXWcAAFzATgBOwFwAXgBfAFxAXkBfAFuAXYB
+        eQFjAWoBbQFfAWUBZwJcAVoBZgFeAVUBcwFpAWEBfAFzAWsBhwF8AXMBiQF/AXcBjwGFAXv/AP8AFQAB
+        cgEbARwBdQF+AYEBeAF/AYMBdgF+AYEBcgF5AXsBbQFzAXYBZQFiAV8BZwFgAVcBcwFpAWABfgF2AWwB
+        hQF6AXEBiAF9AXUBjAGCAXmfAAFfAWgBbAFgAWoBbQFbAWMBZgFMAVIBVQERARIBEwELAQ0BDwERARAB
+        DgE8ATYBMgFTAUsBRQFoAV8BWAF8AXEBaAGBAXcBbgF4AUQBQP8A/wAVAAFqAXMBdwFtAXYBeQFtAXYB
+        egFkAWsBbgFYAV4BYAFJAU4BUAE/ATkBNQFKAUQBPgFcAVMBTQFyAWkBYAF8AXEBagGBAXgBbgF3AUUB
+        QpwAAVoBOQE6AVYBXwFjAVMBWwFeAUQBSgFNAQ4BEAERAQIBBAELAQIBBwERAQABBAEJAQ0BDAELATgB
+        MwEvAVQBTQFHAXEBZwFfAX0BcwFpAYQCBf8A/wAVAAFeAWcBawFfAWgBbAFaAWIBZQEvATMBNQECAQMB
+        BgECAQcBEgEBAQQBCgMHAS4BKgEmAVYBTgFIAWkBYAFYAXUBbAFknAABcAIKAUUBTwFSAUUBTAFQATEB
+        NwE5AQQBBgEMAQ0BGAE7ARIBIQFIARMBIQFJAQ4BGgE7AQQBCQEWAQQCBQEzAS0BKgFdAVUBTgFtAhL/
+        AP8AGAABVQFeAWIBUwFbAV8BSAFPAVIBAwEFAQoBCAERASgBCwEWATMBBgENASABBAEKARYCBAEGAT4B
+        OAEzAVgBTwFJAWoBYQFZewABBQEEAQsBBAELARsBBQELAR0BBAEGARABCgEBAQMSAAE/ASoBLwE4AUEB
+        RAEzAToBPQEIAQwBFgENARoBPQESASQBUQEVAScBWgEWASkBWgEUASYBVAEJARQBMAECAQgBFAEQAQ4B
+        DAFNATsBNv8A/wAYAAFcAiUBSgFSAVYBRAFMAU8BJQEpASoBCwEVATQBEgEgAUcBEgEiAUoBEQEeAUQB
+        CQEUAS4BAwEIARUBGwEYARYBQwE9ATgBVQE4ATN4AAEHAQkBGAEOARoBQAEQAR4BSQEPAR8BSgENARoB
+        QQEJARQBMQICAQgPAAEqATABMgEnASwBLwEZAR0BHgEPARwBRAETASYBVwEWASkBXwEWASsBYAEWASoB
+        XgEXASoBXAESASABSwEHARABJQIAAQEBQwETARL/APkAARYBAQECAQQBBwEUAQUBDAEfAQQBCQEYAQIB
+        BQENDwABOQFCAUUBMgE6AT0BGwEfASEBBQEKARoBFAEnAVYBFQEpAV0BFgEpAVoBFgEpAVwBFQEmAVcB
+        DgEbAT8CAAECARgBFgEUeAABCAEPASYBEwEmAVwBFQEpAWYBFwErAWkBGAEvAW8BGQEvAW0BGAEsAWsB
+        EQEiAVABCwEWATQBAwEGAREGAAFQAQMBBwEEAQUBBwEBAQMBCgEMARkBPQEWASoBYwEZAS0BaQEaAS4B
+        aAEbATABawEZAS4BaQEZAS4BZwEXASsBYAESASIBTwEEAQoBGf8A+QABGgEAAQIBCgEUATIBDgEcAUQB
+        EAEfAUsBDwEeAUkBDQEbAUEBBQENASEBDAEBAQMGAAE/AgQBKQEvATEBGwEfASEBBAEHAQ0BEQEhAUwB
+        FgErAWMBGAErAWQBGAEtAWQBFwEsAWIBFwEqAV4BFAEmAVkBAwEHARMBBAEDAQZ1AAIHARIBDwEgAVAB
+        FgEsAWoBGAEuAW8BFwEwAXIBGgEyAXUBGQEwAXcBGgEyAXUBGQEwAXMBFQEoAWABDwEgAUwBWgEDAQoD
+        AAE8ARABKAEFAQwBIQEMARgBOwERASIBVgEZAS4BawEZATABbgEaATABbgEbATEBcgEcATIBcwEaATEB
+        bQEZAS8BaQEWASwBYgELARYBOAEHAQEBA/8A9gABCgEVATcBEAEgAU8BFAEnAV4BFwEsAWYBFwEsAWcB
+        FwErAWQBEQEhAVABDQEYATsBBQELAR8DAAEUARABEQEUARcBGAECAQYBEgEPARwBRgEVASkBYAEZAS4B
+        aQEaAS8BagEbATABawEZAS8BagEZATABagEWASsBYgEHAQ8BJwEEAQkBGXIAARYBAgEHARABIAFRARgB
+        LAFwARkBMwF5ARoBNAF8ARoBMwF+AR0BNQF+AR8BNwGCAR0BNwGEASIBPQGMASMBQgGRASQBQQGMAVwB
+        DQEeAwABVwFUAZ8BRQFzAdQBVQF/AdcBUwF5AcsBLAFMAZoBHQE1AXwBGwEzAXcBGwEzAXgBHAE0AXgB
+        HAEzAXUBGQEwAW4BGAEuAWkBEAEfAUgBAgEAAQL/APMAAQMBBAENAREBJQFaARcBKwFsARcBLwFuARoB
+        MgFzARkBMgF3ARkBMQF4ARoBMgF2ARgBLgFtARQBJQFYAQkBFAE0AQUBCwEeAQQBCwEeAREBIQFOARYB
+        KgFjARkBLwFtARsBMQFxARsBMQFyARwBMgF0ARwBMwF1ARwBMQFwARkBMAFtARABIAFLAQkBEwEyAgEB
+        BG8AAQ8BHQFMARcBLwF3ARoBNQGDAR0BOAGIARwBOQGHASMBQwGVAV0BhwHgAYMBqQHyAZYBvQH4AWYB
+        kAHYAUEBcAHBARABSgGXAVYBBAELAwABCQEWATwBAgEHAR0BAQEFARkBAAEMASYBHgE4AXYBYAGJAdcB
+        lAG3AfcBXgGBAc4BPAFWAagBJAE9AYYBHAE0AXoBGwEyAXYBGAEuAW4BCAERATABBAEDAQn/AO0AAQ8B
+        AwEHARIBJAFYARgBLwF1ARkBNAF5ARsBNAF7AR0BNQF+AR4BNwGCASIBPAGJATEBUQGlATYBXAG6AVkB
+        gwHbAUUBcQHUAUUBcwHSAUUBcwHTAXEBlwHmAV0BhgHaAUIBawHDASMBQwGQARsBMwF5ARwBNAF7AR4B
+        NwF+AR0BNQF8ARsBMwF4ARcBLQFpARUBJgFbAQcBEAEnbAABCwEFAQ0BFgErAXUBGAE0AYEBHAE3AYgB
+        HwE8AZABMQFbAb8BQwF1Ad8BLQFpAdEBFgE4AXgBCQEkAVEBDwEVAT8BEgEdAVABGAEsAXIGAAEFAQ4B
+        TwEDAQ8BSQEDARIBTQEDARMBSwECAQ8BMwIAAQsBAgEjAWEBgwGpAfMB9wL/AYwBpwHkASABOQGDARwB
+        NAF6ARoBMQF1AQ4BHAFJAQMBCQEa/wDqAAFKAQABAQEMARgBPgEXASwBcQEaATYBgQEcATYBhAEdATYB
+        hAEiAT0BjwFIAW4BxwGIAa4B8gGDAagB8AF1AZ0B5gE0AXABxAEJASQBVwEFARkBQwECAREBNwEDARgB
+        SgEQAUMBlwE0AV4BuAF9AaMB6gGlAcQB+QFvAZQB3wFDAVwBqAEoAUEBigEdATUBfQEaATIBdgEYAS4B
+        bwEPAR4BSwECAQMBCmYAAR4BAAEDAQ8BHgFQARgBMwGFARsBNgGGAR0BOAGNAT4BbQHaATgBbQHbAQoB
+        OwGdAQIBBgEnAQIBCgE/AQQBDgFVAQMBDgFZAQUBEAFWAQUBEQFVBgABDQFSAcYBCQFFAbMBBgExAYoB
+        BAEVAVYBAwENAUQBBAEZAVcBAgEVAUUBAwEMASYBYwGTAd8BvAHYAf8BLwFLAZwBHQE1AX8BGwEzAXwB
+        FAEoAWEBBgERAS8BCQEAAQL/AOcAAQsBEwE1ARUBKwF0ARgBMwGAAR0BNwGJAR4BOgGNATMBXQHDATwB
+        cAHYARcBUwG5AQUBFAE7AQUBCwE4AQgBEwFXAQcBEgFXAQgBFwFhAQUBEgFTAQQBDwFJAQMBEQFNAQQB
+        FQFQAQQBGgFZAQEBCwEoAQEBBAETAQYBLwF4AboB1gH5AckB4gH8AT0BWQGrAR0BNQF+ARsBMwF7ARcB
+        LQFvAQYBEAEsAQgBAAEEYwABDAEYAUIBFwEtAXwBGwE2AY0BLAFRAbgBOQFnAdYBAgEmAXYBAgEHATgB
+        AwEOAVkBBAEOAWMBBgEuAZoBEAFTAcwBGwFpAeMBGAFhAd0BGAFhAdkGAAEUAVcBzAESAVMBwwERAVEB
+        wQERAVEBxQERAVgB0AEKAUYBtAEDARMBVgEEARcBWgEDARUBRgEAAQ8BNQFzAZ4B7gE9AWIBtAEdATYB
+        ggEaATEBdwERASQBWgEEAQsBIf8A5wABFAEoAWcBGQEzAYABGwE2AYUBIAE8AZMBPQFsAdcBPAFuAdkB
+        AQEIASoBAgEHASwBAwENAU8BBAEPAVsBBAESAWEBBgEeAXIBCQE+AaUBCgFIAbkBCgFIAbcBBwE1AZAB
+        BQEcAWQBAwEQAUsBAwENAUUBBAEbAV4BAwEWAUYBBAEWATwBSQF4Ac8BpAHGAf0BIAE7AYcBHAE0AX8B
+        GgExAXoBDgEeAU4BAwEIARpgAAEQAQIBCgEYATQBigEcATsBmQEmAVEBtwE4AW0B3AEPAUQBrQEDAQsB
+        SAEDAQ8BYQEEARQBawEZAV8B2gEcAWYB4QEaAWIB3QEZAV4B1wEYAVkB0gEYAVkB0QMAAVYBCAEVARcB
+        WAHPARUBVAHIARQBUQHFARIBUAHCARIBUgHEARIBVgHMAREBWAHPAQQBFgFcAQMBEgFSAQMBGAFOARMB
+        NgGHAZ8BwwH6AUEBZAG8ARsBMwF9ARgBLgFwAQsBGAFC/wDkAAENAQYBEAEWAS8BeQEZATcBiAEcATYB
+        iwE3AWgB0wExAWMBzQEDARQBTAEEAQ0BWAEEAQ4BXwEEARABaQELAVABzQEaAWcB4AEYAWEB3QEXAV4B
+        2QEVAVwB0QEUAVcBzgETAVcBzAESAVUBzAESAVcBzAEIATwBowEDAQ8BTgEDARABTAEEARoBWAEAAQQB
+        EgEcAUgBogFtAZMB5gEjAT4BjgEbATQBgAEXASwBawEKARYBPAECAQQBD1oAAZcBAQECAREBIgFfAR4B
+        OgGdASIBQAGlATkBcQHgARMBRAGqAQIBBwFCAQMBDgFfAQYBHwF7ARUBXQHbARkBXwHXARoBXwHaARsB
+        XgHbARoBYAHYARkBXQHXARkBXQHWAwABQgEiAVABGgFdAdYBGAFZAdABFgFWAcoBFAFSAcgBEgFRAcUB
+        EgFRAcUBEQFTAcoBEAFbAdcBBQEhAXgBBAERAVMBAAEJASYBLgFnAccBsQHQAf8BGgE0AYEBGAEwAXcB
+        DwEfAVACAQEG/wDeAAEOAQEBBQETAScBagEcATkBkwEfAT0BmQE3AWcB1QEHAToBnwECAQgBOQEDAQ4B
+        XwEGASEBgQEaAWEB3QEcAWYB4QEYAV8B2wEYAV4B1wEYAV0B1AEYAVoB0AEXAVgBzgEWAVUBzAEUAVIB
+        xgESAVABwwESAU8BvwEQAVEBxgESAVYB0gESAVwB1wEDAREBVQEEARQBWAEEARsBXQEoAWEBvwGuAc4B
+        /QE3AVkBtQEaATIBfgEVASkBZwEJARMBNmAAAS0BOgGZAToBaQHaAQ0BMwGUAQQBDgFtAQQBEAFuAREB
+        TgHLARsBWQHUARsBWQHRAR0BXwHYAR4BYwHfAR8BZwHkAQwBOwGhARsBYgHfAR8BVAHBAwABMwFOAaUB
+        KQFzAeUBHgFiAdsBGgFcAdYBGAFaAdQBGQFcAdIBGQFeAdIBGQFdAdIBEQFTAcwBEgFYAdQBCwFDAbUB
+        BAEZAWMBAgENATIBGAE6AYkBdgGKAcsBOwEbAUcBawEHARL/AOEAAQsBFgFBARgBNAGMAR4BPgGfATMB
+        ZAHRATMBZgHZAQIBCQFEAQMBDgFfAQQBDwFhARoBXQHXARkBXgHWARsBYAHaARsBXwHcARwBYgHbARsB
+        XAHZARoBXQHWARoBXQHWARgBWwHUARcBVwHMARUBUwHJARQBUgHJARMBUwHIARIBVAHLAREBVAHMAQ8B
+        WAHVAQQBFgFjAQMBEwFXAQEBBgEdASMBSwGnAZABtwH6ARsBNQGGARkBMAF7ARMBJAFdAgQBDWAAAUkB
+        XAG9AQMBDgFyAQQBEgGEAQQBIAGOARsBWgHWARwBWwHVAR0BXAHYASABYQHeASEBZAHkASgBdQHuARQB
+        KgGHAUABlAHrATUBaAG9AwABJgFSAb0BKQFvAeQBIAFkAdsBHAFeAdgBGwFdAdcBFwFZAdEBKgF3AeEB
+        LwF/AecBEgFVAc4BEQFTAcoBEQFZAdcBCwEKAUYBMAELASYBRAEAAQEDAAEwARoBRAETASQBXQECAQMB
+        DP8A2wABEgEBAQUBFwEwAYABHwE8AaIBLwFXAcEBOgFuAeMBBAEgAXEBBAEPAWYBBAETAWwBFAFXAdAB
+        GgFaAdMBHAFeAdkBHAFhAdoBHAFiAd8BBgEuAY4BGwFhAd4BHQFhAd0BHAFhAdoBHAFfAdcBGgFcAdQB
+        GAFaAdQBFgFWAcwBFwFaAdEBGAFdAdIBEgFVAcwBEQFUAc0BEgFaAdkBBQEYAWoBBAEgAWoBAQEEARYB
+        WgF/AdoBOAFYAbkBGwEzAYUBFwEuAXQBBAELASMBCQEAAQFXAAEOAQABBAYAAQUBEwGSAQUBEwGOARYB
+        WgHZAR0BXAHaAR4BWgHaAQcBNgGgARwBXwHiASQBZwHlASgBcQHvARwBeQH8AQMBEQFVASUBRwGkAwAB
+        HAFVAcsBHwFgAd4BHgFfAdwBGwFdAdcBGwFbAdUBGAFXAdABFgFZAdABHAFgAdIBJQEqAW4BPAEXATgB
+        SgEBAQMDAAE3AQABAQFSAWMBqAE4AVgBuQEbATMBhQEXAS4BdAEEAQsBI/8A2AABBwEKAR4BFgEqAXkB
+        HgE9AacBIgFCAbEBPwFzAecBBgEyAZwBBQERAXkBBAEUAXsBGgFYAdQBHAFaAdcBHQFdAdkBHwFgAdwB
+        IQFkAeIBLgF8AfIBGAFsAegBCAEeAWoBIgFoAeIBLAFzAekBKAFvAeMBHQFeAdYBGwFeAdgBGQFbAdQB
+        GAFbAdIBIAFnAdoBJwF2AeIBEQFUAcwBEQFTAcsBEgFbAdgBAwEMAVEBBgEnAYMBAQEHAR8BkwG6AfwB
+        KQFFAaQBGwE0AYYBEQEiAVsBBAELASRXAAFJARcBQgEeAT0BpwEpATkBnAMAAVIBDwEqASABZwHpASEB
+        YwHiASIBYgHkASYBbQHwAVQBngHpAQEBGQFuAQ8BPgGnASkBcwHxAQ0BWwHjAScBAwEdAYEBAgIFARcB
+        VAEHAT4BrQEdAVkB1wEvAUEBnQFMARkBPQwAASEBNwGHARIBWwHYAQMBDAFRAQYBJwGDAQEBBwEfAZMB
+        ugH8ASkBRQGkARsBNAGGAREBIgFbAQQBCwEk/wDSAAEGAQsBIAEVASoBeAEbATkBoAEiAUMBsgEpAUwB
+        twEuAWoB4wEEAREBewEEARQBjgERAVUB2AEeAWAB3gEeAVsB2AEGATMBnAEJAUcBxAEhAWUB4gEnAXAB
+        7AFGAZUB/AEIATcBswERAU8BxgEgAWIB3wEgAV8B3QEcAV0B2gEbAVoB1gEbAVsB1gEZAVcBzwEUAVIB
+        zAEEAR4BbwEGATABkAERAVIBygERAVMBzAEHATUBoQEDAQ8BWAEEASABbQFxAZcB5QF6AZ8B8wEcATcB
+        jQEXAS0BdgEKARcBQwEbAQABAUsAARMBAAEEAVABEAEtBgABIgFDAbIBKQFMAbcBPAFTAbEDAAFkARIB
+        KAEpAV0BzQEiAWQB6gExAXoB9AEzAX8B9gEzAYMB/AEOATwBoAESAU8BzQExAXkB9gFFATABcgGZAgEB
+        YwEyAWQBZgEAAQ0BcgsAAUUBCQEWAQoBGQFhAQYBMAGQAREBUgHKAREBUwHMAQcBNQGhAQMBDwFYAQQB
+        IAFtAXEBlwHlAXoBnwHzARwBNwGNARcBLQF2AQoBFwFD/wDPAAE0AQABAgEUASsBdQEZATUBlQEcATwB
+        pQEmAUUBtgEqAVUBwgEGATEBoAEEARMBkQEFARUBkgEdAWIB4AEfAWEB4QEgAV8B3gEfAV8B3gEEARMB
+        YQEFARsBZAEZAVwB3QElAWsB6gErAXQB9gEBAQcBMwEMAUcBvwEdAV8B2wEcAV0B2QEdAVsB1wEaAVgB
+        1gEOAU0BygECAQsBSAEMAVIBzQEWAV0BzwESAVMBzwERAVIBywEQAVkB2gEEARABZAEGAScBhgEfAUkB
+        nAGgAcMB/QEiAT8BnwEYATEBggERASIBXAIDAQ1IAAEIAQMBDAEPAR8BXgEdATUBmQkAAW0BCgEWAQYB
+        MQGgAQQBEwGRAXoBAgEQAwABewESASkBMAFhAdgBTgE/AY0BaQE2AWIBcwE2AVYGAAGkAgEPAAE1ASYB
+        YAEOAU0BygECAQsBSAEMAVIBzQEWAV0BzwESAVMBzwERAVIBywEQAVkB2gEEARABZAEGAScBhgEfAUkB
+        nAGgAcMB/QEiAT8BnwEYATEBggERASIBXAICAQz/AMwAAQ0BHQFVARkBNgGYARwBOwGkAR8BPQGpARwB
+        OwGgATEBZAHcAQMBDwF5AQQBEgGOAQcBLQGqAR8BZwHoASIBaQHpASMBawHqAS4BdwHyAWoBtAH8AS8B
+        egH3ASQBdAHxAQMBDgFQASIBXQHcAU4BngH8AQcBJgGXAQUBMQGaAR4BWQHVAR0BVwHVAQUBJAGEAQYB
+        LQGXARgBVwHTARoBWAHVASQBbgHiARYBWAHVARQBVAHTARIBVQHXAQoBSAHHAQMBDQFdAQEBBAEhAWEB
+        hwHkAVUBdwHfARoBNQGMARYBLQF5AQYBDwE0ARkBAAECQgABCAEUATsBFAEuAYEBGAE2AZoBHgE+AagB
+        IgFAAa0BJQFLAbQBRwENAR0MAAGeAQUBDBsAAWEBCAEhAQ4BKwGHAR4BWQHVAR0BVwHVAQUBJAGEAQYB
+        LQGXARgBVwHTARoBWAHVASQBbgHiARYBWAHVARQBVAHTARIBVQHXAQoBSAHHAQMBDQFdAQEBBAEhAWEB
+        hwHkAVUBdwHfARoBNQGMARYBLQF5AQYBDwE0AREBAAEB/wDGAAFIAQABAwEUASsBegEbATcBoAEbAToB
+        owEcAToBoAEXATIBiwEwAWUB3AEEARABfgEEARABggEXAVcB2QElAWkB7AEkAWsB7gElAXIB9AEnAWsB
+        8AEnAWwB7gEpAW0B8AFEAZAB+gEGASsBuAENAUkBwwEGASsBnAEEARUBegEcAVMB0AEgAVwB1gEeAVsB
+        1wEDAQ4BawEcAVgB1AEbAVoB2AEbAVgB1gEYAVcB1gEnAXEB5QEVAVUB1AESAVMB0gETAVoB3gEEAQ4B
+        ZwECAQcBNQE4AV4BwQFWAX0B4QEbATYBkAEYATABhQEMARgBSAEHAQQBDEIAARQBKwF7ARkBNQGYARsB
+        OgGiASABPgGqAR0BOwGjASoBWQHLAQgBJwGVAQgBEQGDAUgBBgEXIQABcwEFARQBBAEVAXoBHAFTAdAB
+        IAFcAdYBHgFbAdcBAwEOAWsBHAFYAdQBGwFaAdgBGwFYAdYBGAFXAdYBJwFxAeUBFQFVAdQBEgFTAdIB
+        EwFaAd4BBAEOAWcBAgEHATUBOAFeAcEBVgF9AeEBGwE2AZABGAEwAYUBDAEYAUgCAwEL/wDGAAEzAQIB
+        CgEWATABjgEbATgBoQEcATkBoQEaATcBmwEYATYBkQExAWMB3QEDAQ0BdAEDAQ8BdwEaAVYB1QEkAWoB
+        7AEqAXMB9AEnAXQB9wErAXUB9gEvAXUB9gEtAXMB9AEtAXMB9AEJATsB0AEDARgBaQEDARABdQEKAU0B
+        0QEjAWEB4AEiAV8B3AEhAWIB4QEFARsBigEaAVQBzwEbAVwB3AEaAVkB2AEXAVkB2AEhAWYB4gEUAVgB
+        1wERAVIB0gESAVYB2QEEAQ8BcwEDAQsBVgEbAT8BmgFfAYkB7QEcATcBlQEZATEBiQEPASABWAEDAQkB
+        HEIAARcBMQGQARsBNwGfARsBOgGjAR0BOgGhARcBMwGOATEBYwHXAQMBEQF6AQQBEQGMARkBWQHaASYB
+        TgGuAVABBAELGwABDgENAWgBCgFNAdEBIwFhAeABIgFfAdwBIQFiAeEBBQEbAYoBGgFUAc8BGwFcAdwB
+        GgFZAdgBFwFZAdgBIQFmAeIBFAFYAdcBEQFSAdIBEgFWAdkBBAEPAXMBAwELAVYBGwE/AZoBXwGJAe0B
+        HAE3AZUBGQExAYkBDwEgAVgBAwEJARz/AMYAATUBAQEHARYBMQGVARsBOQGnARwBNgGcARoBNAGZARkB
+        NQGMASMBVgHTAQMBDQFsAQIBCwFbAR4BVAHVAScBaAHqASkBcQHzAS4BfgH6ATUBfwH7ATUBfgH7ATAB
+        eAH4ASABZgHsAQcBMAG/AQUBFAGjAQQBEgF+AQwBSQHKAScBZwHoASYBZAHkASQBYgHlAQUBHQGYARgB
+        UgHSARIBVQHbAQkBSAHKARkBWwHbARcBXAHcARgBXQHdARIBUwHVARABUgHSAQUBJAGTAQMBDQFiAQQB
+        KwGEAVQBhwHvARsBOAGYARkBMwGPAREBJAFnAQcBEQEwATkBAAEBPAABIQEIARsBGgE5AaYBHAE5AaQB
+        GwE4AZ4BGgE0AZQBHAE7AZgBLAFgAdkBAwENAXUBAwERAXsBIwFjAeYBJQFqAewBJQFtAfABJQFzAfIB
+        MgE/AY0BNgE1AXcBMQFfAcsBSAF9AdMBDgEeAZEBKwFuAeoBKgF9AfcBcQEAAQEBBAESAX4BDAFJAcoB
+        JwFnAegBJgFkAeQBJAFiAeUBBQEdAZgBGAFSAdIBEgFVAdsBCQFIAcoBGQFbAdsBFwFcAdwBGAFdAd0B
+        EgFTAdUBEAFSAdIBBQEkAZMBAwENAWIBBAErAYQBVAGHAe8BGwE4AZgBGQEzAY8BEQEkAWcBBwERATD/
+        AMYAAVQBAQEFARYBMQGUAR4BPAGrAR4BOwGmARkBNAGYARYBMAGGAR0BVQHPAQMBDAFpAQIBDAFYAR4B
+        WgHYASQBYwHlAS4BdAH0ATgBgAH6ATYBfwH7ATgBfQH7AQ8BXwHqAQYBHgGHASABfwH5ARcBRAHsAQQB
+        EgGOAQIBCAFHAQEBBwE6AQ4BTgHSAQgBRAHJAQMBDwF8AQQBKQGLAQIBCwFiAQIBCAFBARUBVAHUARgB
+        WgHfARgBWgHbARIBUgHSARABUAHRAQYBKQGcAQMBDQFmAQUBKwGHAUQBdQHoARsBNwGYARgBMwGQARIB
+        JgFtAQgBEgE4AS0BAAECPAABHwEKASIBHAE6AakBHAE5AaYBHAE2AZsBFwEuAYoBHwFDAaUBHAFMAcUB
+        AwENAW8BAwEcAYIBIQFhAeYBJQFrAewBKwF2AfYBLQF5AfoBLAF2AfYBLwF0AfYBLQFyAfMBMAF3AfYB
+        BAEqAbQBEAFLAcUBQQEDASEDAAEEARIBjgECAQgBRwEBAQcBOgEOAU4B0gEIAUQByQEDAQ8BfAEEASkB
+        iwECAQsBYgECAQgBQQEVAVQB1AEYAVoB3wEYAVoB2wESAVIB0gEQAVAB0QEGASkBnAEDAQ0BZgEFASsB
+        hwFEAXUB6AEbATcBmAEYATMBkAESASYBbQEIARIBOAEiAQABA/8AxgABFQEwAZABHQE6Aa4BGwE4AaMB
+        GAE0AZUBGAEvAYUBIgFWAdQBAgELAWIBAgEJAU4BIAFUAdMBKAFlAeUBLQFxAfIBNQF+AfkBPgGEAfsB
+        CAE8AcUBDAFCAcwBWAGeAf4BWAGcAf4BSAGUAf4BCQEcAbcBBQEUAZ4BBAERAYwBAgELAVYBAwEMAWgB
+        BAEQAYMBAwENAW8BAwEQAYkBBAEQAYIBCQE9AbcBGQFcAeABGQFdAeABEgFTAdQBEgFSAdUBBQEnAZ0B
+        AwENAWQBBQEtAZEBQgFzAekBHgE6AZ8BGQE0AZMBEQEnAW8BCQETATwBMAEAAQI8AAEdAQsBJwEdATsB
+        rQEeATwBqgEbATgBnwEUASsBgAEjAUcBsgEPAToBqgEDAQwBagEHASoBlAEiAWAB4wEnAWkB6wErAXUB
+        9QEvAXsB+wEzAXsB+gE0AXsB+QEzAXgB+AE2AXoB9wEFATQBxgEEAQwBaAYAAQkBHAG3AQUBFAGeAQQB
+        EQGMAQIBCwFWAQMBDAFoAQQBEAGDAQMBDQFvAQMBEAGJAQQBEAGCAQkBPQG3ARkBXAHgARkBXQHgARIB
+        UwHUARIBUgHVAQUBJwGdAQMBDQFkAQUBLQGRAUIBcwHpAR4BOgGfARkBNAGTAREBJwFvAQkBEwE8ASQB
+        AAEC/wDGAAERASIBZgEdATsBtAEbATkBpwEZATQBnAEUASgBdwEtAV8B3AECAQsBXgEBAQgBRgEeAU4B
+        wQFLAYUB6QE9AYAB8gFSAZkB+wENAVcB5AEjAXIB9gF/AbsB/gF7AbYB/wF8AbcB/gGYAdAB/gFdAaMB
+        /gEqAYwB+QEHARgBqwEEARMBmwEEARIBlwEEARIBkQEEARIBlQEJAUgB3AELAVcB5gEcAWAB5QEdAWAB
+        6AEeAWMB5wEUAVQB2gESAVEB1QEEAREBegEDAQwBZAETATkBogE9AW8B5AEcATkBngEYATQBlAEQASMB
+        agEHARABMgFVAQABATwAARoBCgEgAR0BPAGyAR0BPAGuARoBOAGgARIBJwF2ASgBUQHFAQcBLgGgAQMB
+        CwFfAQsBOQGwASIBXwHgASkBbQHtATIBdQH1ATUBgAH8ATwBgwH9AS4BdAH2AQMBEgFwAQIBIgGTARsB
+        UgHQAUsBAwEZBgABXQGjAf4BKgGMAfkBBwEYAasBBAETAZsBBAESAZcBBAESAZEBBAESAZUBCQFIAdwB
+        CwFXAeYBHAFgAeUBHQFgAegBHgFjAecBFAFUAdoBEgFRAdUBBAERAXoBAwEMAWQBEwE5AaIBPQFvAeQB
+        HAE5AZ4BGAE0AZQBEAEjAWoBBwEQATL/AMkAAQ8BFQFEASABPwG9AR4BOwGxARkBNQGeARIBJgFyATAB
+        YgHfAQMBCwFgAQIBCQFPARsBSQG8AUUBeQHiAT8BfAHuAUcBjAH4AQkBPwHYAU4BiwH2AZkB0gH/AcwB
+        8gH/AcMB7AH/AZABxwH/AZ4B1AH+AWkBqwH+AUMBlAH+AQwBWAHpARABYAHvAQcBKQHKAQcBPAHCASQB
+        aQHwASMBagHzAR4BZQHuAR4BaAHsASEBaQHuARUBVgHcARIBUgHZAQMBDQFzAQIBCwFhAR0BQAGlAS0B
+        WQHOARwBOQGfARcBMwGUAQ8BIQFkAQQBCgEgPwABJgEHARkBHwE9AboBHAE7Aa0BGwE3AaIBEwEoAXgB
+        KgFYAdABBAEvAaIBAgELAVsBCAE6AasBNQFyAeQBLwFxAe8BNQF+AfUBRgGOAfsBJgFvAfEBBgEcAZEB
+        RwGOAfwBTgGWAf8BWQGeAf0JAAGYAaUBxgFpAasB/gFDAZQB/gEMAVgB6QEQAWAB7wEHASkBygEHATwB
+        wgEkAWkB8AEjAWoB8wEeAWUB7gEeAWgB7AEhAWkB7gEVAVYB3AESAVIB2QEDAQ0BcwECAQsBYQEdAUAB
+        pQEtAVkBzgEcATkBnwEXATMBlAEPASEBZAEEAQoBIP8AyQABGQENASoBIQFBAcABIAE9AbUBHAE3AaYB
+        DwEhAWgBLgFcAdkBAwENAWYBAgEKAVgBBAEmAYMBWQGLAeMBRgF+Ae4BQAGBAfYBDQFcAe4BYAGaAfoB
+        2AH4Af8B5wH9Af8B5AH8Af8BywHwAf8BiwHCAf8BfgG9Af4BTgGQAfsBMgF5AfkBLwF4AfgBCQEcAckB
+        IQFfAekBJAFoAfEBIwFqAfIBHwFoAfEBHwFrAfIBJgF1AfMBFQFWAd8BCwFRAdkBAwENAW8BAgELAV4B
+        KAFSAcMBLgFSAcYBGwE3AZ4BGAEzAZQBDQEdAVsBCwEEAQw/AAE0AQUBFQEdAT0BugEgAT4BuAEaATcB
+        pAESAScBdwEuAV0B2gEDAS8BpAECAQkBUgELASsBhQFVAY4B5gE4AXoB8AFGAYoB+AFAAYcB+QEIASUB
+        uwFGAY4B/QGdAdUB/gGNAckB/gGWAdMB/wwAAX4BvQH+AU4BkAH7ATIBeQH5AS8BeAH4AQkBHAHJASEB
+        XwHpASQBaAHxASMBagHyAR8BaAHxAR8BawHyASYBdQHzARUBVgHfAQsBUQHZAQMBDQFvAQIBCwFeASgB
+        UgHDAS4BUgHGARsBNwGeARgBMwGUAQ0BHQFbAQcBAwEN/wDJAAFHAQMBBwEiAUMBxQEhAT8BvAEdAToB
+        rQEUASoBgAEkAUgBtwEEARkBhgEDAREBagECAQcBPwEvAWIB0wFvAZwB5AFEAXsB7gFHAY4B+wEFASUB
+        kgG5AeYB/wHxAf4B/wHsAf4B/wHeAfsB/wGGAcUB/wGhAdcB/wFSAZEB/AE8AXwB9wELATQBzgESAVwB
+        5gElAW0B9QElAWkB8wEjAWkB8wEhAWkB9AEiAXAB9wEdAWgB8QEVAVgB5AEEARkBkAEDAQwBbwEOAToB
+        rQEwAWQB3wEiAUEBsQEcAToBogEWAS8BjgEKARUBRgE+AQABAT8AAUIBAQEHASIBQgHEASIBQAG+ARsB
+        OAGnAREBJAFwAScBUAHGAREBOgG1AQIBCgFbAQIBHgFyAUoBfQHfAUYBfQHrAT4BgwH3ARoBWQHoATEB
+        ZgHfAZYB0QH/AcQB7QH/AbUB4gH/AYMBvQH/AXIBVAFhEgABRAEWAVwBEgFcAeYBJQFtAfUBJQFpAfMB
+        IwFpAfMBIQFpAfQBIgFwAfcBHQFoAfEBFQFYAeQBBAEZAZABAwEMAW8BDgE6Aa0BMAFkAd8BIgFBAbEB
+        HAE6AaIBFgEvAY4BCgEVAUYBLQEAAQH/AMkAAW8BAAECASMBQwHEASgBSwHOAR8BPAGyARcBMAGVARQB
+        KgF3ASMBWwHgAQQBFwF7AQQBDQFiASkBXAHMAVQBgQHhAWkBmgHjAVsBnQH1AQsBVAHoAWEBngH7AfIB
+        /gH/AfEB/gH/AWkBtAH/AQkBKAGEAXcBtAH/AVYBmAH+AU4BkwH+AQsBNAHUASQBZwHvASkBbwH3ASQB
+        awH1ASMBaQH0ASABaQH0ASABaQH0ARsBZAHwAQkBTwHdAQMBDQF5AQMBDAFvASABRgG1ASwBVwHSATsB
+        WAHLAR4BOwGmARUBLgGMAQcBEQE5QgABUwEBAQUBIAFBAcABIQE/AbwBHQE6Aa4BFAEpAX4BJgFNAcEB
+        JwFfAeUBAwEOAWMBAQEMAUYBLgFgAdQBVgGKAegBPgF7AfMBJAF2AfkBQwF7AewB1QH3Af8B5AH8Af8B
+        4gH7Af8ByQHwAf8BcwGIAbYVAAEkAWcB7wEpAW8B9wEkAWsB9QEjAWkB9AEgAWkB9AEgAWkB9AEbAWQB
+        8AEJAU8B3QEDAQ0BeQEDAQwBbwEgAUYBtQEsAVcB0gE7AVgBywEeATsBpgEVAS4BjAEHAREBOf8AzwAB
+        HwE/AboBMQFVAd0BHwFAAb0BGAEzAZ0BDwEhAWUBNQFqAesBBQElAZgBBgERAXMBAgEQAUkBKgFaAcwB
+        jwG3AeMBVQGOAekBOAF+AfABCAFAAcEB1wH4AfwB4QH7Af0BZQGrAf0BGAFQAeQBCAEfAYkBBAEMAVIB
+        CAEbAaUBJQFoAe4BKwFzAfkBKAFvAfgBIwFrAfUBIgFoAfQBIAFmAfQBHwFmAfMBGgFiAfABAwEOAYgB
+        AwEOAX8BAgENAXABLAFXAdIBHgE9Aa8BMAFOAb0BHAE5AaYBFgEuAY0BBwENAS1CAAFxAQABAgEkAUUB
+        ygEnAUoBzQEeATsBsAEWAS4BjgEYATMBjAExAWYB5wEEARMBcQECAQkBSAEwAWIB0wFvAZwB5AFEAXsB
+        7wFCAYkB+gEHAUEBuwHLAfEB/wHlAfwB/wHpAf0B/wHZAfgB/wGQAcgB/wFjAgISAAErAXMB+QEoAW8B
+        +AEjAWsB9QEiAWgB9AEgAWYB9AEfAWYB8wEaAWIB8AEDAQ4BiAEDAQ4BfwECAQ0BcAEsAVcB0gEeAT0B
+        rwE+ATQBfgE0ASYBbgE9ARgBTgFgAQQBDgF+AQUBDgF/ARABMAEcAQwBLf8AxgABGAExAZMBLQFPAdgB
+        KQFJAcoBGgE3AasBGQEyAZYBKwFPAcABMwFoAegBBQEbAYgBDwEfAXUBAwETAVABIAFOAcMBeAGkAeQB
+        NQFwAeMBKwFqAeMBnQHPAe8B3AHzAfYBvAHrAfYBkQHQAfoBUAGaAfsBSgGWAfwBLwF8AfwBLAFyAfoB
+        KgFyAfkBJQFuAfcBIgFpAfUBHwFlAfEBHAFhAe0BGAFcAeoBBwE2AcABAwEOAYABAgEMAXcBIgFJAcEB
+        IAFHAb8BHAE5AacBKQFFAbMBGQE2AaMBFQEuAY4BBgEQATdFAAEpAUsBzgEnAUkB0AEgAUEBvgEZATMB
+        mwEPASEBaAE2AWUB4wEDAR0BiQEGAQ8BbQEWAUIBrQFIAXgB2QFzAaAB5AFbAZ0B9AEJAUwB2gF5AbQB
+        /wH3Av8B8AH+Af8BbwG7AfsBLAF8AewBdAFrAYEVAAFMATEBZh4AAV4BAQEEAToBQwGhAR8BQAGxATYB
+        UgHBAR0BOgGnARcBMwGdAQsBGQFXAQoBAQEG/wDDAAETAR8BXgEsAUwB1wFBAWMB7QEdATsBtAEZATUB
+        oAENAR0BWQE7AWkB4wEnAV0B4QEOASsBiAEQAR4BdQECAREBTgFEAXcB1QFVAYYB5AExAW4B4wEfAV8B
+        1gGvAdsB4gGoAdkB6AF+Ab8B8AFrAa0B7wFCAYgB8gEzAXUB8gEsAXIB9gEkAWkB9AEiAWgB8gEfAV8B
+        7AEaAV0B5wEZAVkB5AEGATUBtQECAQsBcAECAQwBeAENAUQBxwEoAVoB2AEWATMBngEhAT8BrQErAUgB
+        uAEbATcBpgEVAS0BjwEIARMBPgFGAQABAUIAASQBQwG9ATABUQHbASQBQwHDARoBNQGjARABIQFlAS8B
+        VQHDAQwBMAGqAQkBHAGDAQABFAFXAR8BTwHHAY8BtgHkAVEBiwHmASUBcQHyASoBZgHcAdgB+QH9AdwB
+        +wH+AUABkAH/AQgBHAF9ASoBTgGyDwABnwExATkBXgGHAeIBQgGDAfkBDQE3AcsSAAFNARkBPgEaAREB
+        bAILAXIBAgENAXYBLQFeAd0BGAE1AaEBLwFLAboBHgE6AagBGQE0AaEBDgEhAWkBBAEKASP/AMMAATMB
+        BAEPAS4BTgHLAT4BYQH1AS0BTgHOAR4BOgGxASABOAGXARUBJAFjAT0BaQHhARsBVwHdAQsBMgGcASAB
+        OAF1AQIBBgExAREBPwG1AToBbwHfAU0BigHfAXoBtgHfAYcBxAHfAVUBlgHfAU0BkAHfATsBfAHfASoB
+        ZQHeAR4BWQHeARsBVQHcARoBUwHaARgBUgHaAREBTAHVAQEBCAFRAQIBCQFiAQIBCwFoASYBVQHTASsB
+        WwHcARUBLwGVARcBNQGnAR0BOwGtARwBOwGsARkBNQGjARQBLQGPAQgBFAFEATkBAAEBQgABIgE/AbAB
+        PgFgAe4BKAFJAc8BGwE4AawBGgE0AZkBDQEdAVgBNAFnAegBBQEtAaYBEgEiAXgBAgEQAUsBHwFMAcIB
+        ZAGUAeQBLQFsAeEBEQFaAd0BzgHuAfMB1gH0AfgBigHMAfwBPAGHAfsBNQGBAfwBWAEHARIGAAF/AR0B
+        OgYAAVYBXwGiATEBaQHXARABOQHnAS4BVQG8AwABOgEsAWkBJAFcAdkBHgFiAfABGwFgAewBEwFWAeQB
+        AwEOAYMBAgEMAXkBEwFIAckBIQFHAb4BFwEzAZ8BIwFBAbEBGgE3AacBGQE1AaIBEQEmAXsBCQEVAUgB
+        NwEBAQT/AMMAARMBIgFjAVUBeQH+ATkBWgHlASsBTAHLAR8BOgGoAS4BQwGWARABHgFVAToBcQHqARoB
+        WQHcARABKQF/AScBQQF1AQYBDwFKAQcBJwF6AXMBrwHfAXMBsgHfAXUBswHfAVwBnQHfAT4BfAHfATgB
+        eAHeASABXQHeAR8BWAHcARoBUgHbARgBTwHXAQQBKAGVAQEBBwFLAQIBCQFeAQIBCQFkAQYBOQG7AScB
+        VgHYARYBMgGZARMBLQGPARcBNAGkARkBNwGqARoBOQGuARUBMwGgARMBKwGNAQgBFAFFAUIBAAEBQgAB
+        FAEnAW4BRgFpAfsBPQFfAewBIgFAAbsBGwE4AacBIQE2AYYBTAF2AeYBJgFfAeIBEAEtAYYBEgEhAXEB
+        AwEcAWoBUQF+AdgBPAFyAeQBKwFqAeEBgQG6AeABvgHkAeoBrAHgAe8BbAGxAfYBawGzAfkBRwFNAZQD
+        AAGGAQEBAgEuAW4B3gFcAQ4BIgYAAQkBMgGnARcBWQHlAScBbQH0ASgBcAH5ASQBawH2ASEBZgHzARsB
+        XgHsARkBWgHlAQMBJQGWAQIBCwF0AQEBGAGBASUBUgHOARUBMAGXARcBNAGmASABPgGxARkBOgGtARYB
+        MwGfARIBJwGCAQkBGAFQASUBAQEF/wDDAAE6AQEBCQExAVEBzgFTAXcB/wE9AV0B6QEjAT8BugEiAT4B
+        qQE4AU4BkwEsAUUBnQE6AW4B7AE2AW4B5gEYAS4BdwEgAToBdQEUASYBdQECAQcBOgEJASYBfgEfAWoB
+        2AE7AYYB3AE1AXkB3AEjAWMB3AEXAVYB2wEPAUoB1QEEASMBiAEBAQYBRQECAQkBXAECAQkBZwECAQ4B
+        ZgEZAUkBzQEmAVQB0QETAS0BkAERASgBgAEUAS8BlAEYATYBqAEaATcBrgEYATUBqgEVATIBoAESASgB
+        gwEGAQ8BNkUAAR8BCgEjAUYBaAHuAVcBfAH/ASwBTQHMAR8BPAGyASEBOwGhARYBKgFwAT4BcAHuAQUB
+        KwGgARkBMQF6ARIBIwFpAQ4BNAGgATMBZwHbAT0BewHgAUIBfQHfAZIBzAHfAX4BuwHfAV8BoAHlAUQB
+        hwHqAUgBUAGTAwABVgEqAVQBJAFhAd4BHwFZAd4BOgEaAUQDAAFEAVgBoQEzAX8B+wEtAXUB+QEjAWkB
+        9QEiAWcB8QEcAV0B6AEXAVQB3wEIATUBsQECAQgBWgECAQkBZwEdAU0BzAEmAVgB2QETAS0BjgEWATIB
+        nwEZATgBrAEYATYBrAEVATMBoQESAScBgQEJARkBVgEjAQABA/8AxgABSQEBAQcBRgFoAfEBWgF/Af4B
+        RwFoAfYBKwFKAcoBJwFFAbYBQAFZAaMBJQEzAXEBPAFaAbgBPAF2Ae0BLwFvAecBDQE0AZ0BDQEfAXcB
+        CwEcAXUBBwEWAXUBBQESAXUBAwENAXMBAgEMAXMBAwEOAXUBAgELAXEBAgEKAW8BAgEKAWsBAgEOAXEB
+        FwFPAdYBJQFZAdgBIQFKAcYBDgEhAW0BEgEpAYUBFAEtAZEBFgEyAaABFwE0AacBGAE3Aa0BFwE2AasB
+        EwEsAZIBDQEhAXABJQEBAQVIAAEWASEBYQFLAXAB/QFUAXUB+AE2AVkB3AEiAT4BtAE1AUsBkwEaASsB
+        aQE3AW4B6wERAUcBvAEbAS4BcQEWASgBaAEAAQ4BVAFCAY0B2AF3AbUB3wFyAbAB3wFiAaQB3wFTAZUB
+        3wE6AXsB4AMAAVkBAQEMAQEBBQFGAQEBCwFOAQEBBQFEAQEBDAFOAQEBBQFDAUIBDgEZASwBawHmASMB
+        YAHhARsBVQHcARoBUwHbARgBUgHaAQIBGQF2AQEBCQFWAQIBCQFdARwBTQHOASYBVgHYAREBJwGBARQB
+        LwGUARcBNAGkARgBNwGsARkBNgGtARUBMQGfARABJgF9AQYBDQEx/wDMAAESARkBRQFZAXwB8gFyAZgB
+        /wFoAYwB/wE6AVkB3gEqAUcBtQE4AVQBqwEvAUMBjwErAUkBtQFFAXoB7wE8AXwB8AE4AXgB6wEMAVYB
+        1QEKATkBrwEEARIBggEEARABewEDARABfgEDAQ4BfAEEASIBngEGATgBvwEpAVwB4gEoAVkB3wElAVgB
+        3gERASoBhQEMARwBXwEQASUBdwEVAS4BkwEWATEBnAEWATQBpQEYATcBsAEWATYBrgEWATMBpQEQAScB
+        gQEIARIBQ0sAAUwBAQEEATABSQG1AVcBegH+AUkBaQH7AS8BTwHQASoBRgGxAT0BUwGOATcBWwHIAT4B
+        dQHrAR8BXgHWAR0BNAFyARgBLQF4AQMBCgFJAR8BQgGQAUcBkgHkAU0BlQHhAUMBhQHeATsBUwGZAwAB
+        EQEHAV8BAwENAXUBAgENAXUBAgELAXABAgEKAW0BAgELAWwBGwEEATQDAAFRAQcBFQEmAUQBtwEaAU4B
+        1AEHASwBmgEBAQkBWwECAQgBXwEDARoBfgEnAVUB1AEXATQBmQERASYBfwEVATABmQEWATIBogEYATYB
+        rAEXATYBrQEWATEBowEMASABbgEZAQIBC/8AzwABGQEVATUBkQG2AfgBewGhAf4BfwGlAf8BTQFvAfgB
+        NgFWAdABLQFKAbgBJwE8AY8BEgEmAW0BFgEwAY0BOQFtAfABPAF5AfQBOAF5AfMBOgF0AfIBMwF1AfAB
+        NwFyAfABNAFvAe8BMwFrAe8BLAFkAe4BKAFUAdgBFwEzAZkBDAEeAWcBDwEkAXYBEQEoAYgBFAEtAZEB
+        FgEwAZ0BFwEzAaUBGAE1AasBFwE1AawBFgEyAacBFAEtAZcBCAESAT8BMgEAAQJOAAEgAQgBGgFrAY8B
+        /wFxAZYB/wFCAWUB8AEoAUYBvAEsAUkBrAEpATcBdQE+AV4BvwFPAYYB8AEbAVMBwQEQAScBegESASYB
+        dQEJARcBZwEAAQMBRgECARIBawEJATgBsQFMAQcBDwMAASoBbgHvARYBXgHpAQwBQQHIAQUBMQG0AQYB
+        LQGrAQUBKgGiAQ4BQwHIAScBQgGlCQABcAEAAQ4BGwEIAVcBBQErAaEBJAFUAdMBFwE2AZ4BDQEgAWoB
+        EwEqAYcBFgEyAZ8BFwE1AakBFwE1Aa0BFgEzAagBFAEvAZkBCgEMASv/ANUAAT0BAQEEATEBPwFuAYwB
+        sAHtAZ0BxAH+AX8BpQH/AWoBjgH/AT8BYwHkATEBUwHPASwBTgHHASMBQAG1AR4BNwGfARIBKAGGAREB
+        KAGBARIBJwF9ARABJQF8ARABJQF+ARABJgGCAREBKAGHARQBLQGaARQBLwGfARQBLwGaARUBMQGeARYB
+        MAGiARYBMgGlARgBNAGrARYBMwGsARcBNQGwARUBMQGfAREBKAGJAQkBFQFLVwABIgEUATIBcQGRAdsB
+        hgGsAf4BYwGIAfkBRwFoAesBMAFOAboBOwFWAa0BGAEqAXQBOwFqAd0BPgF8AfEBOwF4Ae0BBwE9AbUB
+        BgEfAYoBBQESAXgBEQEMAV4DAAFHAQwBKAEQASYBhAEVAS8BmgEdAUMBtgEgAUwBzAEkAU4BywEhAUgB
+        xgEZAToBpQERAScBfAEMAR8BaBIAAbUBAwEJAW0BFQFFAS0BKAF/ARcBMwGnARYBNgGvARYBMwGqARQB
+        LgGaAQwBIQFx/wDeAAEuAQoBGgF4AZcBxwGrAc8B+gGoAc0B/gGIAasB/wFmAYsB/wFWAX0B/wE1AVoB
+        4AErAU0B1AElAUUBzAEcAT4BvQEdATwBvAEZATgBuAEYAToBuAEbATwBugEaAToBuAEYATgBswEXATUB
+        swEXATcBswEXATUBsgEXATQBsQEYATQBrwEXATUBsgEWATQBsQEWATIBqgEQASgBhwEIAQ8BNwFPAQAB
+        AloAASUBEQEnAXEBjQHWAZIBuAH/AXEBlgH/AUgBagHtATYBVQHNATYBUgG2ARYBKAF4ASEBOwGfATYB
+        ZwHrAT4BfAH2AS8BdQHyAR0BaQHuAT0BJAFdAwABIwE4Aa8BGAE3AbIBFwE0AakBFAEuAZkBEQEnAYQB
+        DwEjAXcBDwEkAXsBDwEkAXwBEAEmAX4BEQEnAYYBKQEhAW8bAAGKARQBRAEhAS4BmAEQASYBgwEMAQoB
+        Iv8A5AABGgEWAS0BXgF1AaABmQG+AfkBjwG0Af0BhwGuAf8BbQGUAf8BTwF2Af8BTgFyAf8BOQFdAe8B
+        KAFNAdkBJAFHAdYBJAFHAdQBHAFBAcUBHQFBAcUBGwFBAcwBGgE+AcoBGAE5Ab8BGAE4AbwBGAE1AbgB
+        GAE4AbwBFgEyAa4BFgExAaoBEAEnAYoCCAEeYwABOAEBAQoBgAGhAdcBrAHRAf4BewGfAf8BVAF2Af8B
+        OgFdAd0BLAFMAcABKQFEAbIBEgEmAXUBEAEoAX8BJgFOAcIBLQFhAd8BdAEHAREBagEfAUwBKAFMAdkB
+        IgFEAc4BHAE/AcEBGwE9Ab4BGQE2AbIBFwE3Aa8BFwEzAawBFQEwAZ4BFQEwAZwBFQEuAZsBFwExAZ4B
+        HAEuAZoBoQEDAQobAAG/AQMBCf8A7QABjQEBAQQBUAEEARABJwEQAS0BKAE1AXYBPwFSAagBQAFeAdcB
+        JwFFAcQBKQFGAccBKAFGAcYBGwE7AcIBHgE/AcoBGgFAAc8BHQFAAdcBGwE9AdUBHAE/AdQBGQE7AcgB
+        FwE4AcEBFgEzAbMBCwEdAWMBCgEQATYBUQEAAQFsAAEoAQ8BIwGUAbYB4QGxAdgB/gGeAcMB/wFuAZQB
+        /wFXAX4B/wE0AVkB3wEmAUgBzAEcAT0BvQEgAToBsQGgAQABAQEXASQBZAErAUUBvQEmAUoB3QEjAUgB
+        3QEiAUgB2AEfAUUB0QEbAUIBzgEZATsBxQEXATgBuQEXATUBtQEXATQBsQEXATUBrwEYATUBrgEWATQB
+        rQG4AQQBD/8A/wAkAAGFAQABAwFdAQEBBwEvAQQBEgEMAREBSAENAR8BdAEOASABhAEOASEBgwEMARwB
+        bwELARIBPngAAUMBAQEIAS0BMgFhAYMBogHdAYwBsgH+AX4BpQH/AWkBkAH/AUoBcAH6AS8BUgHfAUMB
+        OgGnCQABLAECARABCwEXAVMBGAE7Ab4BHwFBAdgBHQFAAdIBHQE/AdMBGQE7AcgBGQE5AcEBGAE3AboB
+        FgE2AbUBFwE1AbUBFgEzAa4BFgEsAZwBvgEDAQv/AP8AMAABkgEAAQEBjAEAAQIBo30AAdAFAAFWAQUB
+        EAE8AUIBcgFcAXoBzAFeAYAB8gFgAYUB/wE/AWQB+wGXAScBWw8AAU4BAAEEAQoBHgFxARQBNgHBARkB
+        PwHSARkBPAHMARgBOwHGARcBNwG8ARUBMwGvARQBMAGnARIBKgGTAQwBHgFpAQUBDAEsAasBAAEB/wD/
+        AMAAAbcCAAF1AQABAQFJAQEBBQHOGgABWAEAAQsBFQEIATMBEwEUAVIBCAEVAUkBDAECAQoBHwEEAREB
+        VAEAAQH/AP8A/wD/AP8A/wD/AMwAAUIBTQE+BwABPgMAASgEAAEBAgABQAMAAQEBAAEBBgABCBYAA/8B
+        ABD/EAAQ/xAADf8BfwL/EAAE/wH7B/8B/gE/Av8QAAT/AfsH/wH8AX8C/xAABP8B8wf/AfwBfwL/EAAE
+        /wHzB/8B/AE/Av8QAAT/AeEH/wH4AT8BDwH/EAAE/wHhAfwBfwX/AfgBHAEfAf8QAAT/AeABYAb/AfAB
+        AAE/Af8QAAT/AeABAAb/AfABAAE/Af8QAAT/AcABAQb/AeABAAF/Af8QAAT/AcABAQb/AeABAAL/EAAE
+        /wGAAQMG/wHAAQAC/xAABP8BgAEDBv8BwAEBAv8QAAT/AQABBwb/AcABAQL/EAAE/wEAAQcG/wGAAQEC
+        /xAABP8BAAEPBv8BAAEDAv8QAAT/AQABDwT/AfgBPwEAAQcC/xAAA/8B/gEAAQ8E/wHwAR8BAAEHAv8Q
+        AAL/AfgBPgEAAR8E/wHgAQYBAAEPAv8QAAL/AfABDAEAAR8E/wHAAQIBAAEHAv8QAAL/AfABBAEAAR8E
+        /wGAAQIBAAEHAv8QAAL/AeACAAEPBP8BgAECAQABAwL/EAAC/wHAAgABDwT/AQABBgEAAQMC/xAAAv8B
+        gAIAAQcD/wH+AQABBgEAAQEC/xAAAv8BgAIAAQMD/wH+AQABBgEAAQEC/xAAAv8BgAIAAQMD/wH8AQAB
+        BAEAAQEC/xAAAv8DAAEBA/8B+AEAAQQCAAL/EAAB/wH+AwABAQP/Af4BAAEEAQABAQL/EAAB/wH+BAAE
+        /wEAAQQBAAEIAv8QAAH/AfwEAAF/Av8B/QGAAQQBAAFAAv8QAAH/AfgEAAF/Av8B/AFAAQABHgEAAX8B
+        /xAAAf8B8AQAAT8C/wHmASABAAFwAQABfwH/EAAB/wHgBAABPwL/AccBCAE3AcABAAE/Af8QAAH/AeAE
+        AAEfAv8BgAH3AfwCAAEfAf8QAAH/AcAEAAEfAv8BgAE/AfgCAAEfAf8QAAH/AcAEAAEfAv8BgAEPAfgC
+        AAEfAf8QAAH/AcAEAAEPAv8FAAEfAf8QAAH/AcAEAAEPAv8CAAEIAgABDwH/EAAB/wHgBAABDwL/AgAB
+        GAIAAQ8B/xAAAf8B4AQAAQ8C/wIAARgCAAEfAf8QAAH/AeAEAAEfAv8CAAE4AgABHwH/EAAB/wHgBAAB
+        HwL/AgABPAIAAR8B/xAAAf8B4AQAAR8C/wIAAR8BgAEAAR8B/xAAAf8B4AQAAT8C/wIAAR8BwAEAAT8B
+        /xAAAf8B8AQAAT8C/wIAAQ8BwAEAAQcB/xAAAf8B8AQAAT8C/wGAAQABDwHvAfwBAwH/EAAB/wHwBAAB
+        HwL/AYABAAEPAYcB4AEDAf8QAAH/AfAEAAEfAv8BgAEAAQYBwgEAAQEB/xAAAf8B+AQAAR8C/wGAAQAB
+        BAFgAQABAQH/EAAB/wH4BAABPwL/AYABAAEEASABAAEBAf8QAAH/AfwEAAE/Av8BwAEAAQgCAAEDAf8Q
+        AAH/Af4EAAF/Av8BwAEAAggBAAEDAf8QAAL/BAABfwL/AeABAAEIAQcBAAEHAf8QAAL/AYACAAEBA/8B
+        8AEAARABAwHwAQ8B/xAAAv8B4AIAAQED/wH4AQABEAEBAf8BDwH/EAAC/wH4AgABBwP/AfwDAAF/Ad8B
+        /xAAAv8B/gIAAQ8E/wMAAT8C/xAABP8BAAF/BP8BgAE4AQABHwL/EAAE/wH4Bf8BoAE+AQABDwL/EAAK
+        /wH8AT8BwAF/Av8QABD/EAAQ/yYACw==
+</value>
+  </data>
+  <data name="$this.Name">
+    <value>CertificateViewer</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAEBAQAAAAAAAoAQAAJgAAACAgEAAAAAAA6AIAAE4BAAAoAAAAEAAAACAAAAABAAQAAAAAAIAA
+        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AP/3AAAAAHcA//8AAAB4/wD///AAf///cP//+I////dw////////
+        ePD///////j/8P/////////w/////////4D/////////cP////////hwcHeP//////BwB///////8HAP
+        //////9wcAj//////wBwAHd4/4dwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8A////////////////////////////////////////////////////////
+        //////////////////////////////////f39/h49/f4eP/////////wgICAcIDwgHCP////////8HBw
+        cIBwcHCAj/////////d3d/cH93f3B4///////////////////////////////3AAAAAAAAAAj///////
+        ///3AAAAAHcAAH///////////wAAAHj/AAB////////////wAH///3AAf///////////+I////dwAH//
+        //////////////948AB////////////////4//AAf//////////////////wAH//////////////////
+        gAB//////////////////3AAf/////////////////hwAH////////9wd4//////8AB/////////cAf/
+        //////AAf////////3AP//////9wAH////////9wCP//////AAB/////////cAB3eP+HcAAAf///////
+        /3AAAAAAAAAAAH/////////wAAAAAAAAAACP////////////////////////////////////////////
+        //////////////////////////////////////////////////////////////////8AAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/mcs/tools/security/certview/ChangeLog b/mcs/tools/security/certview/ChangeLog
new file mode 100644 (file)
index 0000000..2fd18d1
--- /dev/null
@@ -0,0 +1,19 @@
+2003-06-14  Sebastien Pouliot  <spouliot@videotron.ca>
+
+       * CertificateViewer.cs: New. SFW-based certificate viewer.
+       * CertificateViewer.resx: New. SWF Resource file.
+       * CertificateFormatter.cs: New. Not GUI specific.
+       * certview.exe.config: New. Configuration file for certview.
+       * certview.glade: New. GUI for GTK#.
+       * certview.gladep: New. Project file for GLADE.
+       * gcertview.cs: New. GTK#-based certificate viewer.
+       * makefile: New. makefile for both SWF and GTK# viewers.
+       * mono.bmp: New. 16x16 bitmap for Mono::
+       * mono.ico: New. 32x32 windows icon for Mono::
+       * v1.bmp: New. 16x16 bitmap for X.509 v1 properties/extensions.
+       * v2.bmp: New. 16x16 bitmap for X.509 v2 properties/extensions.
+       * v3.bmp: New. 16x16 bitmap for X.509 v3 properties/extensions.
+       * v3critical.bmp: New. 16x16 bitmap for X.509 v3 critical extensions.
+       * wax-seal.png: New. Bitmap for valid certificate.
+       * wax-seal-broken.png: Bitmap for invalid certificate.
+       * X509ExtensionsHandler.cs: Configuration file parser.
diff --git a/mcs/tools/security/certview/X509ExtensionsHandler.cs b/mcs/tools/security/certview/X509ExtensionsHandler.cs
new file mode 100644 (file)
index 0000000..fc60454
--- /dev/null
@@ -0,0 +1,37 @@
+//
+// ExtensionsHandler.cs: Extensions Configuration Handler (not GUI specific)
+//
+// Author:
+//     Sebastien Pouliot (spouliot@motus.com)
+//
+// (C) 2003 Motus Technologies Inc. (http://www.motus.com)
+//
+
+using System;
+using System.Collections;
+using System.Configuration;
+using System.Xml;
+
+namespace Mono.Tools.CertView {
+
+       public class X509ExtensionsHandler : DictionarySectionHandler {
+
+               public X509ExtensionsHandler () : base () {}
+
+               public override object Create (object parent, object context, XmlNode section) 
+               {
+                       XmlNodeList xnl = section.SelectNodes ("/X509.Extensions/Extension");
+                       if (xnl == null)
+                               return null;
+
+                       Hashtable ht = new Hashtable ();
+                       foreach (XmlNode xn in xnl) {
+                               XmlAttribute xaOid = xn.Attributes ["OID"];
+                               XmlAttribute xaClass = xn.Attributes ["Class"];
+                               if ((xaOid != null) && (xaClass != null))
+                                       ht.Add (xaOid.InnerText, xaClass.InnerText);
+                       }
+                       return ht;
+               }
+       }
+}
diff --git a/mcs/tools/security/certview/certview.exe.config b/mcs/tools/security/certview/certview.exe.config
new file mode 100644 (file)
index 0000000..2a243b3
--- /dev/null
@@ -0,0 +1,21 @@
+<configuration>
+       <configSections>
+               <section name="Thumbprint" type="System.Configuration.SingleTagSectionHandler" />
+               <section name="X509.Extensions" type="Mono.Tools.CertView.X509ExtensionsHandler, certview, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+       </configSections>
+
+       <Thumbprint Algorithm="SHA1" />
+
+       <X509.Extensions>
+               <Extension OID="2.5.29.14" Class="Mono.Security.X509.Extensions.SubjectKeyIdentifierExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+               <Extension OID="2.5.29.15" Class="Mono.Security.X509.Extensions.KeyUsageExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+               <Extension OID="2.5.29.16" Class="Mono.Security.X509.Extensions.PrivateKeyUsagePeriodExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+               <Extension OID="2.5.29.17" Class="Mono.Security.X509.Extensions.SubjectAltNameExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+               <Extension OID="2.5.29.19" Class="Mono.Security.X509.Extensions.BasicConstraintsExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+               <Extension OID="2.5.29.31" Class="Mono.Security.X509.Extensions.CRLDistributionPointsExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+               <Extension OID="2.5.29.32" Class="Mono.Security.X509.Extensions.CertificatePoliciesExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+               <Extension OID="2.5.29.35" Class="Mono.Security.X509.Extensions.AuthorityKeyIdentifierExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+               <Extension OID="2.5.29.37" Class="Mono.Security.X509.Extensions.ExtendedKeyUsageExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+               <Extension OID="2.16.840.1.113730.1.1" Class="Mono.Security.X509.Extensions.NetscapeCertTypeExtension, Mono.Security, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
+       </X509.Extensions>
+</configuration>
\ No newline at end of file
diff --git a/mcs/tools/security/certview/certview.glade b/mcs/tools/security/certview/certview.glade
new file mode 100644 (file)
index 0000000..3d2f789
--- /dev/null
@@ -0,0 +1,1007 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="CertificateViewer">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Mono Certificate Viewer</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <signal name="delete_event" handler="OnWindowDeleteEvent" last_modification_time="Wed, 30 Apr 2003 02:22:24 GMT"/>
+
+  <child>
+    <widget class="GtkVBox" id="vbox1">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child>
+       <widget class="GtkNotebook" id="viewerNotebook">
+         <property name="border_width">4</property>
+         <property name="visible">True</property>
+         <property name="can_focus">True</property>
+         <property name="show_tabs">True</property>
+         <property name="show_border">True</property>
+         <property name="tab_pos">GTK_POS_TOP</property>
+         <property name="scrollable">False</property>
+         <property name="enable_popup">False</property>
+
+         <child>
+           <widget class="GtkVBox" id="vbox4">
+             <property name="visible">True</property>
+             <property name="homogeneous">False</property>
+             <property name="spacing">0</property>
+
+             <child>
+               <widget class="GtkVBox" id="vbox5">
+                 <property name="border_width">4</property>
+                 <property name="visible">True</property>
+                 <property name="homogeneous">False</property>
+                 <property name="spacing">0</property>
+
+                 <child>
+                   <widget class="GtkHBox" id="hbox5">
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">0</property>
+
+                     <child>
+                       <widget class="GtkImage" id="brokenSealImage">
+                         <property name="visible">True</property>
+                         <property name="pixbuf">wax-seal-broken.png</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkImage" id="sealImage">
+                         <property name="visible">True</property>
+                         <property name="pixbuf">wax-seal.png</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="certInfoLabel">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">&lt;b&gt;Certificate Information&lt;/b&gt;</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">True</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkHSeparator" id="hseparator2">
+                     <property name="visible">True</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">2</property>
+                     <property name="expand">False</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkScrolledWindow" id="scrolledwindow5">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+                     <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                     <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                     <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                     <child>
+                       <widget class="GtkTextView" id="certInfoTextview">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="editable">False</property>
+                         <property name="justification">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap_mode">GTK_WRAP_WORD</property>
+                         <property name="cursor_visible">True</property>
+                         <property name="pixels_above_lines">1</property>
+                         <property name="pixels_below_lines">1</property>
+                         <property name="pixels_inside_wrap">0</property>
+                         <property name="left_margin">2</property>
+                         <property name="right_margin">2</property>
+                         <property name="indent">0</property>
+                         <property name="text" translatable="yes"></property>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">2</property>
+                     <property name="expand">True</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkHSeparator" id="hseparator1">
+                     <property name="visible">True</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">4</property>
+                     <property name="expand">False</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkVBox" id="vbox6">
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">0</property>
+
+                     <child>
+                       <widget class="GtkTable" id="table1">
+                         <property name="visible">True</property>
+                         <property name="n_rows">5</property>
+                         <property name="n_columns">2</property>
+                         <property name="homogeneous">False</property>
+                         <property name="row_spacing">0</property>
+                         <property name="column_spacing">0</property>
+
+                         <child>
+                           <widget class="GtkLabel" id="validFromLabel">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">&lt;b&gt;Valid from&lt;/b&gt;</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">True</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">0</property>
+                             <property name="right_attach">1</property>
+                             <property name="top_attach">4</property>
+                             <property name="bottom_attach">5</property>
+                             <property name="x_options">fill</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkHBox" id="hbox11">
+                             <property name="visible">True</property>
+                             <property name="homogeneous">False</property>
+                             <property name="spacing">0</property>
+
+                             <child>
+                               <widget class="GtkEntry" id="notBeforeEntry">
+                                 <property name="width_request">77</property>
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">False</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">False</property>
+                                 <property name="invisible_char" translatable="yes">*</property>
+                                 <property name="activates_default">False</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">4</property>
+                                 <property name="expand">True</property>
+                                 <property name="fill">True</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="validUntilLabel">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">&lt;b&gt;to&lt;/b&gt;</property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">True</property>
+                                 <property name="justify">GTK_JUSTIFY_CENTER</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0.5</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkEntry" id="notAfterEntry">
+                                 <property name="width_request">77</property>
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">False</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">False</property>
+                                 <property name="invisible_char" translatable="yes">*</property>
+                                 <property name="activates_default">False</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">4</property>
+                                 <property name="expand">True</property>
+                                 <property name="fill">True</property>
+                               </packing>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">1</property>
+                             <property name="right_attach">2</property>
+                             <property name="top_attach">4</property>
+                             <property name="bottom_attach">5</property>
+                             <property name="x_options">fill</property>
+                             <property name="y_options">fill</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="issuedByLabel">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">&lt;b&gt;Issued by:&lt;/b&gt;</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">True</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">0</property>
+                             <property name="right_attach">1</property>
+                             <property name="top_attach">2</property>
+                             <property name="bottom_attach">3</property>
+                             <property name="x_options">fill</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="issuedToLabel">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">&lt;b&gt;Issued to:&lt;/b&gt;</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">True</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">0</property>
+                             <property name="right_attach">1</property>
+                             <property name="top_attach">0</property>
+                             <property name="bottom_attach">1</property>
+                             <property name="x_options">fill</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkEntry" id="issuedToEntry">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="editable">False</property>
+                             <property name="visibility">True</property>
+                             <property name="max_length">0</property>
+                             <property name="text" translatable="yes"></property>
+                             <property name="has_frame">False</property>
+                             <property name="invisible_char" translatable="yes">*</property>
+                             <property name="activates_default">False</property>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">1</property>
+                             <property name="right_attach">2</property>
+                             <property name="top_attach">0</property>
+                             <property name="bottom_attach">1</property>
+                             <property name="x_padding">4</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="subjectAltNameLabel">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes"></property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">1</property>
+                             <property name="right_attach">2</property>
+                             <property name="top_attach">1</property>
+                             <property name="bottom_attach">2</property>
+                             <property name="x_padding">4</property>
+                             <property name="y_padding">2</property>
+                             <property name="x_options">fill</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkEntry" id="issuedByEntry">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="editable">False</property>
+                             <property name="visibility">True</property>
+                             <property name="max_length">0</property>
+                             <property name="text" translatable="yes"></property>
+                             <property name="has_frame">False</property>
+                             <property name="invisible_char" translatable="yes">*</property>
+                             <property name="activates_default">False</property>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">1</property>
+                             <property name="right_attach">2</property>
+                             <property name="top_attach">2</property>
+                             <property name="bottom_attach">3</property>
+                             <property name="x_padding">4</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="issuerAltNameLabel">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes"></property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="left_attach">1</property>
+                             <property name="right_attach">2</property>
+                             <property name="top_attach">3</property>
+                             <property name="bottom_attach">4</property>
+                             <property name="x_padding">4</property>
+                             <property name="y_padding">2</property>
+                             <property name="x_options">fill</property>
+                             <property name="y_options"></property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">True</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">0</property>
+                 <property name="expand">True</property>
+                 <property name="fill">True</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkHBox" id="hbox3">
+                 <property name="visible">True</property>
+                 <property name="homogeneous">False</property>
+                 <property name="spacing">0</property>
+
+                 <child>
+                   <placeholder/>
+                 </child>
+
+                 <child>
+                   <widget class="GtkButton" id="issuerStatementButton">
+                     <property name="border_width">4</property>
+                     <property name="visible">True</property>
+                     <property name="sensitive">False</property>
+                     <property name="can_focus">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <signal name="clicked" handler="OnIssuerStatementButtonClicked" last_modification_time="Wed, 30 Apr 2003 02:23:07 GMT"/>
+
+                     <child>
+                       <widget class="GtkAlignment" id="alignment1">
+                         <property name="visible">True</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xscale">0</property>
+                         <property name="yscale">0</property>
+
+                         <child>
+                           <widget class="GtkHBox" id="hbox4">
+                             <property name="visible">True</property>
+                             <property name="homogeneous">False</property>
+                             <property name="spacing">2</property>
+
+                             <child>
+                               <widget class="GtkImage" id="image1">
+                                 <property name="visible">True</property>
+                                 <property name="stock">gtk-dialog-info</property>
+                                 <property name="icon_size">4</property>
+                                 <property name="xalign">0.5</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="label7">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">Issuer Statement</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0.5</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+                           </widget>
+                         </child>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                     <property name="pack_type">GTK_PACK_END</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">0</property>
+                 <property name="expand">False</property>
+                 <property name="fill">False</property>
+                 <property name="pack_type">GTK_PACK_END</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkHBox" id="hbox12">
+                 <property name="visible">True</property>
+                 <property name="homogeneous">False</property>
+                 <property name="spacing">0</property>
+
+                 <child>
+                   <widget class="GtkImage" id="keyImage">
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">4</property>
+                     <property name="expand">True</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="privateKeyLabel">
+                     <property name="label" translatable="yes">The private key associated with this certificate is available.</property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">5</property>
+                     <property name="expand">True</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">0</property>
+                 <property name="expand">False</property>
+                 <property name="fill">True</property>
+                 <property name="pack_type">GTK_PACK_END</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="tab_expand">False</property>
+             <property name="tab_fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="generalLabel">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">General</property>
+             <property name="use_underline">False</property>
+             <property name="use_markup">False</property>
+             <property name="justify">GTK_JUSTIFY_LEFT</property>
+             <property name="wrap">False</property>
+             <property name="selectable">False</property>
+             <property name="xalign">0.5</property>
+             <property name="yalign">0.5</property>
+             <property name="xpad">0</property>
+             <property name="ypad">0</property>
+           </widget>
+           <packing>
+             <property name="type">tab</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkVBox" id="vbox2">
+             <property name="visible">True</property>
+             <property name="homogeneous">False</property>
+             <property name="spacing">0</property>
+
+             <child>
+               <widget class="GtkHBox" id="hbox1">
+                 <property name="border_width">5</property>
+                 <property name="visible">True</property>
+                 <property name="homogeneous">False</property>
+                 <property name="spacing">0</property>
+
+                 <child>
+                   <widget class="GtkLabel" id="showLabel">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">Show:</property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">1</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkCombo" id="showCombo">
+                     <property name="visible">True</property>
+                     <property name="value_in_list">True</property>
+                     <property name="allow_empty">False</property>
+                     <property name="case_sensitive">False</property>
+                     <property name="enable_arrow_keys">True</property>
+                     <property name="enable_arrows_always">False</property>
+
+                     <child internal-child="entry">
+                       <widget class="GtkEntry" id="showComboEntry">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="editable">False</property>
+                         <property name="visibility">True</property>
+                         <property name="max_length">0</property>
+                         <property name="text" translatable="yes"></property>
+                         <property name="has_frame">True</property>
+                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="activates_default">False</property>
+                         <signal name="changed" handler="OnShowComboChanged" last_modification_time="Sat, 03 May 2003 17:48:19 GMT"/>
+                       </widget>
+                     </child>
+
+                     <child internal-child="list">
+                       <widget class="GtkList" id="showComboList">
+                         <property name="visible">True</property>
+                         <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+
+                         <child>
+                           <widget class="GtkListItem" id="listitem186">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">&lt;All&gt;</property>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="listitem187">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Version 1 Fields Only</property>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="listitem188">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Extensions Only</property>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="listitem189">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Critical Extensions Only</property>
+                           </widget>
+                         </child>
+
+                         <child>
+                           <widget class="GtkListItem" id="listitem190">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Properties Only</property>
+                           </widget>
+                         </child>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">True</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">0</property>
+                 <property name="expand">False</property>
+                 <property name="fill">False</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkVPaned" id="detailsVPaned">
+                 <property name="visible">True</property>
+                 <property name="can_focus">True</property>
+                 <property name="position">200</property>
+
+                 <child>
+                   <widget class="GtkScrolledWindow" id="scrolledwindow2">
+                     <property name="border_width">4</property>
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
+                     <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+                     <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                     <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                     <child>
+                       <widget class="GtkTreeView" id="detailsTreeview">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="headers_visible">True</property>
+                         <property name="rules_hint">False</property>
+                         <property name="reorderable">False</property>
+                         <property name="enable_search">False</property>
+                         <signal name="cursor_changed" handler="OnCursorChanged" last_modification_time="Sat, 03 May 2003 01:02:31 GMT"/>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="shrink">True</property>
+                     <property name="resize">False</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkScrolledWindow" id="scrolledwindow1">
+                     <property name="border_width">4</property>
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                     <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                     <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                     <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                     <child>
+                       <widget class="GtkTextView" id="detailsTextview">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="editable">False</property>
+                         <property name="justification">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap_mode">GTK_WRAP_WORD</property>
+                         <property name="cursor_visible">True</property>
+                         <property name="pixels_above_lines">1</property>
+                         <property name="pixels_below_lines">1</property>
+                         <property name="pixels_inside_wrap">0</property>
+                         <property name="left_margin">2</property>
+                         <property name="right_margin">2</property>
+                         <property name="indent">0</property>
+                         <property name="text" translatable="yes"></property>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="shrink">True</property>
+                     <property name="resize">True</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="padding">0</property>
+                 <property name="expand">True</property>
+                 <property name="fill">True</property>
+                 <property name="pack_type">GTK_PACK_END</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="tab_expand">False</property>
+             <property name="tab_fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="detailsLabel">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">Details</property>
+             <property name="use_underline">False</property>
+             <property name="use_markup">False</property>
+             <property name="justify">GTK_JUSTIFY_LEFT</property>
+             <property name="wrap">False</property>
+             <property name="selectable">False</property>
+             <property name="xalign">0.5</property>
+             <property name="yalign">0.5</property>
+             <property name="xpad">0</property>
+             <property name="ypad">0</property>
+           </widget>
+           <packing>
+             <property name="type">tab</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkVPaned" id="vpaned1">
+             <property name="visible">True</property>
+             <property name="can_focus">True</property>
+             <property name="position">200</property>
+
+             <child>
+               <widget class="GtkScrolledWindow" id="scrolledwindow4">
+                 <property name="border_width">4</property>
+                 <property name="visible">True</property>
+                 <property name="can_focus">True</property>
+                 <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
+                 <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+                 <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                 <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                 <child>
+                   <widget class="GtkTreeView" id="certPathTreeview">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="headers_visible">False</property>
+                     <property name="rules_hint">False</property>
+                     <property name="reorderable">False</property>
+                     <property name="enable_search">False</property>
+                   </widget>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="shrink">False</property>
+                 <property name="resize">False</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkVBox" id="vbox3">
+                 <property name="visible">True</property>
+                 <property name="homogeneous">False</property>
+                 <property name="spacing">0</property>
+
+                 <child>
+                   <widget class="GtkLabel" id="certStatuslabel">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">Certificate Status</property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                     <property name="mnemonic_widget">certStatusTextview</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkScrolledWindow" id="scrolledwindow3">
+                     <property name="border_width">4</property>
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                     <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                     <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                     <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                     <child>
+                       <widget class="GtkTextView" id="certStatusTextview">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="editable">False</property>
+                         <property name="justification">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap_mode">GTK_WRAP_WORD</property>
+                         <property name="cursor_visible">True</property>
+                         <property name="pixels_above_lines">1</property>
+                         <property name="pixels_below_lines">1</property>
+                         <property name="pixels_inside_wrap">0</property>
+                         <property name="left_margin">2</property>
+                         <property name="right_margin">2</property>
+                         <property name="indent">0</property>
+                         <property name="text" translatable="yes">unknown</property>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">True</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="shrink">True</property>
+                 <property name="resize">True</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="tab_expand">False</property>
+             <property name="tab_fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="certPathlabel">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">Certificate Path</property>
+             <property name="use_underline">False</property>
+             <property name="use_markup">False</property>
+             <property name="justify">GTK_JUSTIFY_LEFT</property>
+             <property name="wrap">False</property>
+             <property name="selectable">False</property>
+             <property name="xalign">0.5</property>
+             <property name="yalign">0.5</property>
+             <property name="xpad">0</property>
+             <property name="ypad">0</property>
+           </widget>
+           <packing>
+             <property name="type">tab</property>
+           </packing>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">True</property>
+         <property name="fill">True</property>
+       </packing>
+      </child>
+
+      <child>
+       <widget class="GtkHBox" id="hbox2">
+         <property name="visible">True</property>
+         <property name="homogeneous">False</property>
+         <property name="spacing">0</property>
+
+         <child>
+           <widget class="GtkButton" id="okButton">
+             <property name="border_width">4</property>
+             <property name="visible">True</property>
+             <property name="can_focus">True</property>
+             <property name="has_focus">True</property>
+             <property name="label">gtk-ok</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <signal name="clicked" handler="OnOkButtonClicked" last_modification_time="Thu, 01 May 2003 19:52:34 GMT"/>
+           </widget>
+           <packing>
+             <property name="padding">0</property>
+             <property name="expand">False</property>
+             <property name="fill">True</property>
+             <property name="pack_type">GTK_PACK_END</property>
+           </packing>
+         </child>
+
+         <child>
+           <placeholder/>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">False</property>
+         <property name="fill">False</property>
+         <property name="pack_type">GTK_PACK_END</property>
+       </packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>
diff --git a/mcs/tools/security/certview/certview.gladep b/mcs/tools/security/certview/certview.gladep
new file mode 100644 (file)
index 0000000..a011a86
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+  <name>certview</name>
+  <program_name>certview</program_name>
+</glade-project>
diff --git a/mcs/tools/security/certview/gcertview.cs b/mcs/tools/security/certview/gcertview.cs
new file mode 100644 (file)
index 0000000..6dea7dd
--- /dev/null
@@ -0,0 +1,268 @@
+using System;
+using System.IO;
+using System.Reflection;
+
+using Mono.Security.X509;
+
+using Gdk;
+using Gtk;
+using Glade;
+using GLib;
+using GtkSharp;
+
+[assembly: AssemblyTitle("Mono Certificate Viewer")]
+[assembly: AssemblyDescription("X.509 Certificate Viewer for GTK#")]
+
+namespace Mono.Tools.CertView {
+
+        public class GtkCertificateViewer {
+
+               public static void Main (string[] args)
+               {
+                       string filename = ((args.Length > 0) ? args[0] : null);
+                       if ((filename != null) && (File.Exists (filename)))
+                               new GtkCertificateViewer (filename);
+                       else {
+                               Console.WriteLine ("Usage: gcertview.exe certificate.cer");
+                       }
+               }
+
+               [Glade.Widget] Button issuerStatementButton;
+               [Glade.Widget] Gtk.Image brokenSealImage;
+               [Glade.Widget] Gtk.Image sealImage;
+               [Glade.Widget] Entry issuedToEntry;
+               [Glade.Widget] Entry issuedByEntry;
+               [Glade.Widget] Label subjectAltNameLabel;
+               [Glade.Widget] TextView certInfoTextview;
+               [Glade.Widget] TextView certStatusTextview;
+               [Glade.Widget] Entry notBeforeEntry;
+               [Glade.Widget] Entry notAfterEntry;
+               [Glade.Widget] TreeView detailsTreeview;
+               [Glade.Widget] TextView detailsTextview;
+               [Glade.Widget] Entry showComboEntry;
+
+               // non widget stuff
+               private static Pixbuf[] version;
+               private static TreeCellDataFunc dataFunc = null;
+               private ListStore allStore;
+               private ListStore v1Store;
+               private ListStore extensionsStore;
+               private ListStore criticalStore;
+               private ListStore propertiesStore;
+               private ListStore emptyStore;
+
+               // non-glade stuff
+               private CertificateFormatter cf;
+
+               public GtkCertificateViewer (string filename) 
+               {
+                       Application.Init();
+
+                       Glade.XML gxml = new Glade.XML ("certview.glade", "CertificateViewer", null);
+                       gxml.Autoconnect (this);
+
+                       cf = new CertificateFormatter (filename);
+
+                       // init UI
+                       Tooltips tt = new Tooltips ();
+                       issuedToEntry.Text = cf.Issuer (false);
+                       tt.SetTip (issuedToEntry, issuedToEntry.Text, issuedToEntry.Text);
+                       issuedByEntry.Text = cf.Subject (false);
+                       tt.SetTip (issuedByEntry, issuedByEntry.Text, issuedByEntry.Text);
+
+                       subjectAltNameLabel.Text = cf.SubjectAltName (false);
+//                     subjectAltNameLabel.Visible = (subjectAltNameLabel.Text != String.Empty);
+
+                       notBeforeEntry.Text = cf.Certificate.ValidFrom.ToString ("yyyy-MM-dd");
+                       notAfterEntry.Text = cf.Certificate.ValidUntil.ToString ("yyyy-MM-dd");
+
+                       TextBuffer tb = new TextBuffer (null);
+                       if (cf.Status != null)
+                               tb.SetText (cf.Status);
+                       certStatusTextview.Buffer = tb;
+                       if (cf.Status != null) {
+                               certInfoTextview.Buffer = tb;
+                               certInfoTextview.ModifyText (StateType.Normal, new Gdk.Color (0xff, 0x00, 0x00));
+                       }
+
+                       sealImage.Visible = (cf.Status == null);
+                       brokenSealImage.Visible = !sealImage.Visible;
+
+                       allStore = new ListStore ((int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeInt);
+                       v1Store = new ListStore ((int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeInt);
+                       extensionsStore = new ListStore ((int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeInt);
+                       criticalStore = new ListStore ((int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeInt);
+                       propertiesStore = new ListStore ((int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeInt);
+                       emptyStore = new ListStore ((int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeString, (int)TypeFundamentals.TypeInt);
+
+                       AddToStores (CertificateFormatter.FieldNames.Version, cf.Version (false), cf.Version (true), 1);
+                       AddToStores (CertificateFormatter.FieldNames.SerialNumber, cf.SerialNumber (false), cf.SerialNumber (true), 0);
+                       AddToStores (CertificateFormatter.FieldNames.SignatureAlgorithm, cf.SignatureAlgorithm (false), cf.SignatureAlgorithm (true), 0);
+                       AddToStores (CertificateFormatter.FieldNames.Issuer, cf.Issuer (false), cf.Issuer (true), 0);
+                       AddToStores (CertificateFormatter.FieldNames.ValidFrom, cf.ValidFrom (false), cf.ValidFrom (true), 0);
+                       AddToStores (CertificateFormatter.FieldNames.ValidUntil, cf.ValidUntil (false), cf.ValidUntil (true), 0);
+                       AddToStores (CertificateFormatter.FieldNames.Subject, cf.Subject (false), cf.Subject (true), 0);
+                       AddToStores (CertificateFormatter.FieldNames.PublicKey, cf.PublicKey (false), cf.PublicKey (true), 0);
+                       for (int i=0; i < cf.Certificate.Extensions.Count; i++) {
+                               X509Extension xe = cf.GetExtension (i);
+                               string name = xe.Name;
+                               int icon = 2;
+                               if (xe.Critical)
+                                       icon = 3;
+                               string exts = xe.ToString ();
+                               string details;
+                               if (xe.Name == xe.OID) {
+                                       exts = cf.Extension (i, false);
+                                       details = cf.Extension (i, true);
+                               }
+                               else {
+                                       details = xe.ToString ();
+                                       exts = CertificateFormatter.OneLine (details);
+                               }
+
+                               AddToStores (name, exts, details, icon);
+                       }
+                       AddToStores (CertificateFormatter.PropertyNames.ThumbprintAlgorithm, cf.ThumbprintAlgorithm, cf.ThumbprintAlgorithm, 4);
+                       string ftb = CertificateFormatter.Array2Word (cf.Thumbprint);
+                       AddToStores (CertificateFormatter.PropertyNames.Thumbprint, ftb, ftb, 4);
+
+                       // select appropriate store to show
+                       OnShowComboChanged (null, null);
+
+                       TreeViewColumn fieldColumn = new TreeViewColumn ();
+                       CellRendererPixbuf pr = new CellRendererPixbuf ();
+                       CellRenderer fieldRenderer = new CellRendererText ();
+                       fieldColumn.PackStart (pr, false);
+                       fieldColumn.SetCellDataFunc (pr, CellDataFunc, IntPtr.Zero, null);
+                       fieldColumn.Title = "Field";
+                       fieldColumn.PackStart (fieldRenderer, false);
+                       fieldColumn.AddAttribute (fieldRenderer, "text", 0);
+                       detailsTreeview.AppendColumn (fieldColumn);
+
+                       TreeViewColumn valueColumn = new TreeViewColumn ();
+                       CellRenderer valueRenderer = new CellRendererText ();
+                       valueColumn.Title = "Value";
+                       valueColumn.PackStart (valueRenderer, true);
+                       valueColumn.AddAttribute (valueRenderer, "text", 1);
+                       detailsTreeview.AppendColumn (valueColumn);
+
+//                     detailsTreeview.ModifyText (StateType.Selected, new Gdk.Color (0x33, 0xff, 0x33));
+
+                       Application.Run();
+               }
+
+               static void SetCellData (TreeViewColumn col, CellRenderer cell, TreeModel model, TreeIter iter)
+               {
+                       GLib.Value icon;
+                       model.GetValue (iter, 3, out icon);
+                       CellRendererPixbuf cr = (CellRendererPixbuf) cell;
+                       cr.Pixbuf = version [(int)icon];
+               }
+
+               public static Gtk.TreeCellDataFunc CellDataFunc {
+                       get {
+                               if (dataFunc == null) {
+                                       dataFunc = new TreeCellDataFunc (SetCellData);
+                                       version = new Pixbuf [5];
+                                       version [0] = new Pixbuf ("v1.bmp");
+                                       version [1] = new Pixbuf ("v2.bmp");
+                                       version [2] = new Pixbuf ("v3.bmp");
+                                       version [3] = new Pixbuf ("v3critical.bmp");
+                                       version [4] = new Pixbuf ("app.ico");
+                               }
+
+                               return dataFunc;
+                       }
+               }
+
+               private void AddToStores (string fieldName, string fieldValue, string detailedValue, int iconValue) 
+               {
+                       GLib.Value fv = new GLib.Value (fieldName);
+                       GLib.Value vv = new GLib.Value (fieldValue);
+                       GLib.Value dv = new GLib.Value (detailedValue);
+                       GLib.Value iv = new GLib.Value (iconValue);
+                       TreeIter iter = new TreeIter ();
+                       switch (iconValue) {
+                               case 0: // X.509 version 1 fields
+                                       AddToStore (v1Store, iter, fv, vv, dv, iv);
+                                       break;
+                               case 2: // extensions
+                                       AddToStore (extensionsStore, iter, fv, vv, dv, iv);
+                                       break;
+                               case 3: // critical extensions
+                                       AddToStore (extensionsStore, iter, fv, vv, dv, iv);
+                                       AddToStore (criticalStore, iter, fv, vv, dv, iv);
+                                       break;
+                               case 4: // properties
+                                       AddToStore (propertiesStore, iter, fv, vv, dv, iv);
+                                       break;
+                       }
+                       // and we always add to allStore
+                       AddToStore (allStore, iter, fv, vv, dv, iv);
+               }
+
+               private void AddToStore (ListStore store, TreeIter iter, GLib.Value field, GLib.Value value, GLib.Value details, GLib.Value icon)
+               {
+                       store.Append (out iter);
+                       store.SetValue (iter, 0, field);
+                       store.SetValue (iter, 1, value);
+                       store.SetValue (iter, 2, details);
+                       store.SetValue (iter, 3, icon);
+               }
+
+               private void OnCursorChanged (object o, EventArgs args)
+               {
+                       TreeModel model;
+                       TreeIter iter = new TreeIter ();
+                       TreeSelection ts = detailsTreeview.Selection;
+                       ts.GetSelected (out model, ref iter);
+                       GLib.Value val = new GLib.Value ();
+                       detailsTreeview.Model.GetValue (iter, 2, out val);
+
+                       TextBuffer tb = new TextBuffer (null);
+                       tb.SetText ((string)val);
+                       detailsTextview.Buffer = tb;
+               }
+
+               private void OnShowComboChanged (object o, EventArgs e) 
+               {
+                       // FIXME: yuck - how can I get an index ?
+                       switch (showComboEntry.Text) {
+                               case "<All>":
+                                       detailsTreeview.Model = allStore;
+                                       break;
+                               case "Version 1 Fields Only":
+                                       detailsTreeview.Model = v1Store;
+                                       break;
+                               case "Extensions Only":
+                                       detailsTreeview.Model = extensionsStore;
+                                       break;
+                               case "Critical Extensions Only":
+                                       detailsTreeview.Model = criticalStore;
+                                       break;
+                               case "Properties Only":
+                                       detailsTreeview.Model = propertiesStore;
+                                       break;
+                               default:
+                                       detailsTreeview.Model = emptyStore;
+                                       break;
+                       }
+               }
+
+               public void OnWindowDeleteEvent (object o, DeleteEventArgs args) 
+               {
+                       Application.Quit ();
+                       args.RetVal = true;
+               }
+
+               public void OnOkButtonClicked (object o, EventArgs e) 
+               {
+                       Application.Quit ();
+               }
+    
+               public void OnIssuerStatementButtonClicked (object o, EventArgs e) 
+               {
+                       // TODO
+               }
+       }
+}
diff --git a/mcs/tools/security/certview/makefile b/mcs/tools/security/certview/makefile
new file mode 100644 (file)
index 0000000..3e2006f
--- /dev/null
@@ -0,0 +1,28 @@
+RUNTIME=mono
+CSC = $(RUNTIME) ../../../mcs/mcs.exe
+CSCFLAGS=/win32icon:mono.ico /target:winexe /nologo /debug+ /debug:full /out:$@ /r:Mono.Security.dll /r:System.XML.dll
+WINFLAGS=/res:Mono.Tools.CertView.CertificateViewer.resources /r:System.Windows.Forms.dll /r:System.Drawing.dll
+LNXFLAGS=/unsafe /r:gdk-sharp.dll /r:glib-sharp.dll /r:glade-sharp.dll /r:gtk-sharp.dll
+
+windows: certview.exe 
+
+linux: gcertview.exe
+
+certview.exe: CertificateViewer.cs CertificateFormatter.cs X509ExtensionsHandler.cs ..\AssemblyInfo.cs
+       cp ../AssemblyInfo.cs AssemblyInfo.cs
+       cp ../../../class/lib/Mono.Security.dll Mono.Security.dll
+       resgen CertificateViewer.resx Mono.Tools.CertView.CertificateViewer.resources
+       $(CSC) $(CSCFLAGS) $(WINFLAGS) CertificateViewer.cs CertificateFormatter.cs X509ExtensionsHandler.cs AssemblyInfo.cs
+
+gcertview.exe: gcertview.cs CertificateFormatter.cs X509ExtensionsHandler.cs ..\AssemblyInfo.cs
+       cp ../AssemblyInfo.cs AssemblyInfo.cs
+       cp ../../../class/lib/Mono.Security.dll Mono.Security.dll
+       $(CSC) $(CSCFLAGS) $(LNXFLAGS) gcertview.cs CertificateFormatter.cs X509ExtensionsHandler.cs AssemblyInfo.cs
+       cp certview.exe.config gcertview.exe.config
+
+clean:
+       rm -f *.exe *.pdb *.dbg *.dll *.resources
+       rm AssemblyInfo.cs gcertview.exe.config
+
+dummy:
+