[Pkg-cli-apps-commits] [SCM] keepass2 branch, upstream, updated. upstream/2.18-1-g5bfd54b
Julian Taylor
jtaylor.debian at googlemail.com
Wed May 2 17:24:06 UTC 2012
The following commit has been merged in the upstream branch:
commit 5bfd54b82952a57089600f42109d637d1be310fd
Author: Julian Taylor <jtaylor.debian at googlemail.com>
Date: Wed May 2 19:03:21 2012 +0200
Imported Upstream version 2.19
diff --git a/Build/KeePassLibSD_Distrib/KeePassLibSD.dll b/Build/KeePassLibSD_Distrib/KeePassLibSD.dll
index 543aa5b..e122702 100644
Binary files a/Build/KeePassLibSD_Distrib/KeePassLibSD.dll and b/Build/KeePassLibSD_Distrib/KeePassLibSD.dll differ
diff --git a/Build/KeePassLib_Distrib/KeePassLib.dll b/Build/KeePassLib_Distrib/KeePassLib.dll
index 3cd1848..ad1ae13 100644
Binary files a/Build/KeePassLib_Distrib/KeePassLib.dll and b/Build/KeePassLib_Distrib/KeePassLib.dll differ
diff --git a/Build/KeePassLib_Distrib/KeePassLib.xml b/Build/KeePassLib_Distrib/KeePassLib.xml
index 744d618..ead4795 100644
--- a/Build/KeePassLib_Distrib/KeePassLib.xml
+++ b/Build/KeePassLib_Distrib/KeePassLib.xml
@@ -1234,7 +1234,6 @@
<param name="strTree">Tree string.</param>
<param name="vSeparators">Separators that delimit groups in the
<c>strTree</c> parameter.</param>
- <returns></returns>
</member>
<member name="M:KeePassLib.PwGroup.GetLevel">
<summary>
@@ -2290,6 +2289,17 @@
Character stream class.
</summary>
</member>
+ <member name="P:KeePassLib.Utility.StrEncodingInfo.CodePointSize">
+ <summary>
+ Size of a character in bytes.
+ </summary>
+ </member>
+ <member name="P:KeePassLib.Utility.StrEncodingInfo.StartSignature">
+ <summary>
+ Start signature of the text (byte order mark).
+ May be <c>null</c> or empty, if no signature is known.
+ </summary>
+ </member>
<member name="T:KeePassLib.Utility.StrUtil">
<summary>
A class containing various string helper methods.
@@ -2743,7 +2753,16 @@
<member name="F:KeePassLib.PwDefs.Version32">
<summary>
Version, encoded as 32-bit unsigned integer.
- 2.00 = 0x02000000, 2.01 = 0x02000100, 2.15 = 0x02010500, etc.
+ 2.00 = 0x02000000, 2.01 = 0x02000100, ..., 2.18 = 0x02010800.
+ As of 2.19, the version is encoded component-wise per byte,
+ e.g. 2.19 = 0x02130000.
+ It is highly recommended to use <c>FileVersion64</c> instead.
+ </summary>
+ </member>
+ <member name="F:KeePassLib.PwDefs.FileVersion64">
+ <summary>
+ Version, encoded as 64-bit unsigned integer
+ (component-wise, 16 bits per component).
</summary>
</member>
<member name="F:KeePassLib.PwDefs.VersionString">
diff --git a/Docs/Chm/default.css b/Docs/Chm/default.css
index 07410e7..98cd2fd 100644
--- a/Docs/Chm/default.css
+++ b/Docs/Chm/default.css
@@ -146,12 +146,13 @@ div.menubox a:visited, div.menubox a:active, div.menubox a:link {
div.menubox a:hover {
border: 1px solid #0A246A;
- border-radius: 2px;
-moz-border-radius: 2px;
+ border-radius: 2px;
background-color: #B6BDD2;
- background-image: linear-gradient(top, #D9E5F9, #B8BED8);
background-image: -moz-linear-gradient(top, #D9E5F9, #B8BED8);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#D9E5F9), to(#B8BED8));
+ background-image: -webkit-linear-gradient(top, #D9E5F9, #B8BED8);
+ background-image: -ms-linear-gradient(top, #D9E5F9, #B8BED8);
+ background-image: linear-gradient(top, #D9E5F9, #B8BED8);
}
/* --------------------------------------------------------------------- */
@@ -243,15 +244,18 @@ div.tooltipex {
background-color: #FFFFE0;
padding: 1px 1px 1px 1px;
filter: alpha(opacity=90);
- opacity: 0.9;
-moz-opacity: 0.9;
+ opacity: 0.9;
border: 1px solid #000000;
}
/* --------------------------------------------------------------------- */
div.specificbox {
- border: 1px dashed #808080;
+ border: 1px solid #808080;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
display: block;
background-color: #EEF0FF;
padding-top: 1px;
@@ -275,7 +279,10 @@ div.specificbox div.specifictitle {
table.sectionsummary {
width: 100%;
- border: thin dashed #808080;
+ border: thin solid #808080;
+ -moz-box-shadow: 1px 1px 5px #808080;
+ -webkit-box-shadow: 1px 1px 5px #808080;
+ box-shadow: 1px 1px 5px #808080;
background-color: #F0F8FF;
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
diff --git a/Docs/Chm/help/base/autotype.html b/Docs/Chm/help/base/autotype.html
index 5c466e8..26fba39 100644
--- a/Docs/Chm/help/base/autotype.html
+++ b/Docs/Chm/help/base/autotype.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -215,7 +214,12 @@ Any associations specified will be used in addition to the KeePass entry
title to determine a match.
-<br /><br />
+<p>Auto-Type window definitions, entry titles and URLs are Spr-compiled, i.e.
+<a href="placeholders.html">placeholders</a>,
+<a href="placeholders.html#envvars">environment variables</a>,
+<a href="fieldrefs.html">field references</a>, etc. can be used.</p>
+
+<br />
<a name="autoseq"></a>
<h2 class="sectiontitle"><img src="../images/b16x16_ktouch.png"
diff --git a/Docs/Chm/help/base/autourl.html b/Docs/Chm/help/base/autourl.html
index f39ce63..2fa0079 100644
--- a/Docs/Chm/help/base/autourl.html
+++ b/Docs/Chm/help/base/autourl.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/cmdline.html b/Docs/Chm/help/base/cmdline.html
index c35639e..00b30cf 100644
--- a/Docs/Chm/help/base/cmdline.html
+++ b/Docs/Chm/help/base/cmdline.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/configuration.html b/Docs/Chm/help/base/configuration.html
index f85df6e..346a73c 100644
--- a/Docs/Chm/help/base/configuration.html
+++ b/Docs/Chm/help/base/configuration.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -70,7 +69,7 @@ Configuration files are stored in XML format.<br /><br />
</tr>
<tr>
<td>Global (Virtualized)</td>
-<td>Windows Vista/7 Virtual Store</td>
+<td>Windows Vista/7/8 Virtual Store</td>
<td>C:\Users\<i>User Name</i>\AppData\Local\VirtualStore\Program Files\KeePass Password Safe\KeePass.config.xml</td>
</tr>
<tr>
diff --git a/Docs/Chm/help/base/credits.html b/Docs/Chm/help/base/credits.html
index 1db2491..e7c20f4 100644
--- a/Docs/Chm/help/base/credits.html
+++ b/Docs/Chm/help/base/credits.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/credits_icons_license.html b/Docs/Chm/help/base/credits_icons_license.html
index badd000..b51d2ae 100644
--- a/Docs/Chm/help/base/credits_icons_license.html
+++ b/Docs/Chm/help/base/credits_icons_license.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/disclaimer.html b/Docs/Chm/help/base/disclaimer.html
index db7e167..42bc029 100644
--- a/Docs/Chm/help/base/disclaimer.html
+++ b/Docs/Chm/help/base/disclaimer.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/faq.html b/Docs/Chm/help/base/faq.html
index 63916bb..97064c7 100644
--- a/Docs/Chm/help/base/faq.html
+++ b/Docs/Chm/help/base/faq.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/faq_tech.html b/Docs/Chm/help/base/faq_tech.html
index 7076086..a840fb8 100644
--- a/Docs/Chm/help/base/faq_tech.html
+++ b/Docs/Chm/help/base/faq_tech.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -72,6 +71,7 @@ startup?</a></li>
+<li><a href="#internet">Why does KeePass try to connect to the Internet?</a></li>
</ul>
Security:
@@ -89,6 +89,7 @@ Usage:
<ul>
<li><a href="#editattach">Can I directly edit file attachments?</a></li>
<li><a href="#rtftext">How to store and work with large amounts of (formatted) text?</a></li>
+<li><a href="#email">Can an e-mail address field be added?</a></li>
</ul>
<br />
@@ -356,6 +357,25 @@ manually print the document in the application that just opened the file.</p>
<br />
+<a name="internet"></a>
+<h2 class="sectiontitle">
+<img src="../images/b16x16_help.png" class="singleimg" alt="Info" /> Why
+does KeePass try to connect to the Internet?</h2>
+
+<p>KeePass has an option to automatically check for updates on each program start.
+In order to check for updates, KeePass downloads a small version information
+file and compares the available version with the installed version.
+No personal information is sent to the KeePass web server.</p>
+
+<p>Automatic update checks are performed unintrusively in the background.
+A notification is only displayed when an update is available. Updates are not
+downloaded or installed automatically.</p>
+
+<p>The option is disabled by default. You can enable/disable it in
+'Tools' -> 'Options' -> tab 'Advanced'.</p>
+
+<br />
+
<a name="autotypelog"></a>
<h2 class="sectiontitle">
<img src="../images/b16x16_ktouch.png" class="singleimg" alt="Info" /> Is
@@ -595,7 +615,8 @@ to store and work with large amounts of (formatted) text?</h2>
KeePass has a built-in editor that allows working conveniently with
large amounts of (formatted) texts.<br />
<br />
-To add a large text to an entry, import the file as attachment.
+To add a large text to an entry, import the file as attachment
+(or click 'Attach' -> 'Create Empty Attachment').
The built-in editor supports *.TXT (simple text) and *.RTF (formatted text) files.<br />
<br />
In order to edit an attachment, right-click onto the entry in the main window,
@@ -617,5 +638,75 @@ alt="Editor screenshot" /></a>
</td></tr></table>
+<br /><br />
+
+<a name="email"></a>
+<h2 class="sectiontitle">
+<img src="../images/b16x16_help.png" class="singleimg" alt="Info" /> Can
+an e-mail address field be added?</h2>
+
+<p>A few times it has been requested that a standard entry field for e-mail addresses
+is added (on the main tab page in the entry editing dialog).
+The short answer: an e-mail address field will not be added
+due to usability reasons. Now the long answer.</p>
+
+<p>First of all, let's assume that most of the entries stored in KeePass
+contain information for logging in to websites.
+When you register an account for a website, you often have to specify a
+user name as well as an e-mail address. When you regularly
+log in later, you usually only need to provide either user name + password
+or e-mail + password (never user name + e-mail + password).
+Here the first part (which is either user name or e-mail) serves as
+identification: you tell the website who you are.
+The second part (password) provides authentication: you prove to the
+website that you're really the one who you claim to be.</p>
+
+<p>There are various methods how KeePass can transfer data to
+other applications. All of these methods by default assume that the content
+of the user name field is used for identification. For example,
+the default <a href="autotype.html#autoseq">auto-type sequence</a> of
+an entry is
+<code>{USERNAME}{TAB}{PASSWORD}{ENTER}</code>, the default
+<a href="http://keepass.info/plugins.html#formfiller" target="_blank">KeeForm</a>
+configuration uses the user name, etc.
+Now on the one hand some websites require an e-mail address instead
+of a user name. On the other hand we want the default data transfer configuration
+to work for most websites (such that the work that the user has to put
+into the configuration is kept minimal and only needed for
+websites using special login forms).</p>
+
+<p>The solution is simple: instead of interpreting the 'User Name' field
+strictly as a field containing a user name, users should rather interpret
+it as a field in which the data required for identification is stored.
+This data can consist of a user name, an e-mail address or something else
+(e.g. an account number for an online banking website).
+By handling it like this, the default data transfer configuration will work for most
+websites, i.e. zero amount of work needs to be put into
+the configuration.
+If you had to provide both a user name and an e-mail address at
+registration time, the other information (which isn't required
+on a regular basis) can be stored e.g. in
+the notes field or a custom string field of the KeePass entry.</p>
+
+<p>Now assume a separate e-mail field would be added.
+When users store both a user name and an e-mail address,
+KeePass cannot know which of the two is required for identification.
+So, in order to setup data transfer for the entry, users would be forced
+to choose which of the two fields should be used.</p>
+
+<p>So, adding an e-mail field would be a step back in usability,
+because it forces users to put additional time into data transfer configuration.
+The current system ('User Name' containing identification information,
+without a separate e-mail field) doesn't require this, and thus is
+the better solution.</p>
+
+<p>For users that are willing to manually configure the data transfer for each
+entry, there are multiple ways to get a separate e-mail address field.
+After switching to the 'Advanced' tab in the entry editing dialog,
+an e-mail address field can be added as custom string.
+If the field should appear on the main tab page of the dialog, the
+<a href="http://keepass.info/plugins.html#kpentrytemplates"
+target="_blank">KPEntryTemplates</a> plugin can be used.</p>
+
</body></html>
diff --git a/Docs/Chm/help/base/fieldrefs.html b/Docs/Chm/help/base/fieldrefs.html
index c5183d1..700c361 100644
--- a/Docs/Chm/help/base/fieldrefs.html
+++ b/Docs/Chm/help/base/fieldrefs.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/firststeps.html b/Docs/Chm/help/base/firststeps.html
index ebfe048..053f7e3 100644
--- a/Docs/Chm/help/base/firststeps.html
+++ b/Docs/Chm/help/base/firststeps.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/importexport.html b/Docs/Chm/help/base/importexport.html
index 250b28e..bb16f6a 100644
--- a/Docs/Chm/help/base/importexport.html
+++ b/Docs/Chm/help/base/importexport.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -235,16 +234,21 @@ time in form HH:mm:ss.</li>
<img src="../images/b16x16_dataexchange.png" class="singleimg" alt="Text" /> Generic
CSV Importer</h2>
-<p>KeePass 2.x ships with a generic
-CSV importer. This tool can import almost all CSV formats out there. The CSV
+<p>KeePass 2.x features a generic CSV importer.
+This tool can import almost all CSV formats. The CSV
files are loaded and you can manually specify the encoding / character set, assign columns
-to data fields, and
-specify how the low-level structure looks like (usage of quotes, etc.).</p>
+to data fields, and specify how the low-level structure looks like (usage of quotes, etc.).</p>
<p>To start the generic CSV file importer, click <i>'File' -> 'Import'</i> and
choose <i>'Generic CSV Importer'</i>.</p>
-<br />
+<center>
+<a href="http://keepass.info/screenshots/keepass_2x/gencsvimp_big.png"
+target="_blank"><img src="../../screenshots/keepass_2x/gencsvimp.png"
+alt="Generic CSV Importer" /></a>
+</center>
+
+<br /><br />
<a name="imp_cwallet"></a>
<h2 class="sectiontitle">
diff --git a/Docs/Chm/help/base/index.html b/Docs/Chm/help/base/index.html
index 5cbd208..0d75efd 100644
--- a/Docs/Chm/help/base/index.html
+++ b/Docs/Chm/help/base/index.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/integration.html b/Docs/Chm/help/base/integration.html
index 735616e..f7972d1 100644
--- a/Docs/Chm/help/base/integration.html
+++ b/Docs/Chm/help/base/integration.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/keys.html b/Docs/Chm/help/base/keys.html
index 0ef657b..80d98e1 100644
--- a/Docs/Chm/help/base/keys.html
+++ b/Docs/Chm/help/base/keys.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/license_lgpl.html b/Docs/Chm/help/base/license_lgpl.html
index 0e75706..cd54dfa 100644
--- a/Docs/Chm/help/base/license_lgpl.html
+++ b/Docs/Chm/help/base/license_lgpl.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/multiuser.html b/Docs/Chm/help/base/multiuser.html
index 5228d63..9c0fd6d 100644
--- a/Docs/Chm/help/base/multiuser.html
+++ b/Docs/Chm/help/base/multiuser.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/placeholders.html b/Docs/Chm/help/base/placeholders.html
index c7d376b..9b409e1 100644
--- a/Docs/Chm/help/base/placeholders.html
+++ b/Docs/Chm/help/base/placeholders.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -126,7 +125,8 @@ class="singleimg" alt="Placeholder" /> Paths and Date/Time Placeholde
<tr><td width="50%">{INTERNETEXPLORER}</td><td width="50%">Path of Internet Explorer, if installed.</td></tr>
<tr><td width="50%">{FIREFOX}</td><td width="50%">Path of Mozilla Firefox, if installed.</td></tr>
<tr><td width="50%">{OPERA}</td><td width="50%">Path of Opera, if installed.</td></tr>
-<tr><td width="50%">{GOOGLECHROME}</td><td width="50%">Path of Google Chrome, if installed.</td></tr>
+<tr><td width="50%">{GOOGLECHROME}</td><td width="50%">Path of Google Chrome (or Chromium
+on Unix-like systems), if installed.</td></tr>
<tr><td width="50%">{SAFARI}</td><td width="50%">Path of Safari, if installed.</td></tr>
</table>
@@ -150,6 +150,8 @@ class="singleimg" alt="Placeholder" /> Paths and Date/Time Placeholde
<tr><td width="50%">{DB_BASENAME}</td><td width="50%">File name (excluding extension) of the current database.</td></tr>
<tr><td width="50%">{DB_EXT}</td><td width="50%">File name extension of the current database.</td></tr>
<tr><td width="50%">{ENV_DIRSEP}</td><td width="50%">Directory separator ('\' on Windows, '/' on Unix).</td></tr>
+<tr><td width="50%">{ENV_PROGRAMFILES_X86}</td><td width="50%">This is
+<code>%ProgramFiles(x86)%</code>, if it exists, otherwise <code>%ProgramFiles%</code>.</td></tr>
<tr><td width="50%">{DT_SIMPLE}</td><td width="50%">Current local date/time as a simple, sortable string.</td></tr>
<tr><td width="50%">{DT_YEAR}</td><td width="50%">Year component of the current local date/time.</td></tr>
<tr><td width="50%">{DT_MONTH}</td><td width="50%">Month component of the current local date/time.</td></tr>
diff --git a/Docs/Chm/help/base/pwgenerator.html b/Docs/Chm/help/base/pwgenerator.html
index b6194d2..a5ebca8 100644
--- a/Docs/Chm/help/base/pwgenerator.html
+++ b/Docs/Chm/help/base/pwgenerator.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -122,18 +121,6 @@ are supported:</p>
<td>Upper-Case Alphanumeric</td>
<td>ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789</td></tr>
-<tr><td><code>c</code></td>
-<td>Lower-Case Consonant</td>
-<td>bcdfghjklmnpqrstvwxyz</td></tr>
-
-<tr><td><code>C</code></td>
-<td>Mixed-Case Consonant</td>
-<td>BCDFGHJKLMNPQRSTVWXYZ bcdfghjklmnpqrstvwxyz</td></tr>
-
-<tr><td><code>z</code></td>
-<td>Upper-Case Consonant</td>
-<td>BCDFGHJKLMNPQRSTVWXYZ</td></tr>
-
<tr><td><code>d</code></td>
<td>Digit</td>
<td>0123456789</td></tr>
@@ -158,6 +145,30 @@ are supported:</p>
<td>Upper-Case Letter</td>
<td>ABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
+<tr><td><code>v</code></td>
+<td>Lower-Case Vowel</td>
+<td>aeiou</td></tr>
+
+<tr><td><code>V</code></td>
+<td>Mixed-Case Vowel</td>
+<td>AEIOU aeiou</td></tr>
+
+<tr><td><code>Z</code></td>
+<td>Upper-Case Vowel</td>
+<td>AEIOU</td></tr>
+
+<tr><td><code>c</code></td>
+<td>Lower-Case Consonant</td>
+<td>bcdfghjklmnpqrstvwxyz</td></tr>
+
+<tr><td><code>C</code></td>
+<td>Mixed-Case Consonant</td>
+<td>BCDFGHJKLMNPQRSTVWXYZ bcdfghjklmnpqrstvwxyz</td></tr>
+
+<tr><td><code>z</code></td>
+<td>Upper-Case Consonant</td>
+<td>BCDFGHJKLMNPQRSTVWXYZ</td></tr>
+
<tr><td><code>p</code></td>
<td>Punctuation</td>
<td>,.;:</td></tr>
@@ -168,39 +179,27 @@ are supported:</p>
<tr><td><code>s</code></td>
<td>Printable 7-Bit Special Character</td>
-<td>!"#$%&'()*+,-./:;<=>?[\]^_{|}~</td></tr>
+<td>!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~</td></tr>
<tr><td><code>S</code></td>
<td>Printable 7-Bit ASCII</td>
-<td>A-Z, a-z, 0-9, !"#$%&'()*+,-./:;<=>?[\]^_{|}~</td></tr>
-
-<tr><td><code>v</code></td>
-<td>Lower-Case Vowel</td>
-<td>aeiou</td></tr>
-
-<tr><td><code>V</code></td>
-<td>Mixed-Case Vowel</td>
-<td>AEIOU aeiou</td></tr>
-
-<tr><td><code>Z</code></td>
-<td>Upper-Case Vowel</td>
-<td>AEIOU</td></tr>
+<td>A-Z, a-z, 0-9, !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~</td></tr>
<tr><td><code>x</code></td>
<td>High ANSI</td>
-<td>From '~' to U255 (excluding U255)</td></tr>
+<td>From '~' to U255 (excluding U255).</td></tr>
<tr><td><code>\</code></td>
<td>Escape (Fixed Char)</td>
-<td>Use following character as is</td></tr>
+<td>Use following character as is.</td></tr>
<tr><td><code>{<i>n</i>}</code></td>
<td>Escape (Repeat)</td>
-<td>Repeat the previous character <i>n</i> times</td></tr>
+<td>Repeat the previous character <i>n</i> times.</td></tr>
<tr><td><code>[<i>...</i>]</code></td>
<td>Custom Char Set</td>
-<td>Define a custom character set</td></tr>
+<td>Define a custom character set.</td></tr>
</table>
diff --git a/Docs/Chm/help/base/repair.html b/Docs/Chm/help/base/repair.html
index a6a64de..75c5846 100644
--- a/Docs/Chm/help/base/repair.html
+++ b/Docs/Chm/help/base/repair.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/secedits.html b/Docs/Chm/help/base/secedits.html
index 84a7be6..cfa5592 100644
--- a/Docs/Chm/help/base/secedits.html
+++ b/Docs/Chm/help/base/secedits.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/security.html b/Docs/Chm/help/base/security.html
index 08b2427..39b1b68 100644
--- a/Docs/Chm/help/base/security.html
+++ b/Docs/Chm/help/base/security.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/tans.html b/Docs/Chm/help/base/tans.html
index 313d479..128ee48 100644
--- a/Docs/Chm/help/base/tans.html
+++ b/Docs/Chm/help/base/tans.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/base/usingpws.html b/Docs/Chm/help/base/usingpws.html
index 61d4679..404a0a5 100644
--- a/Docs/Chm/help/base/usingpws.html
+++ b/Docs/Chm/help/base/usingpws.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -107,10 +106,9 @@ other applications.</p>
and other Plugins</h2>
<p>There are a lot of plugins available integrating KeePass directly with
-other applications. <i>KeeForm</i>
+other applications. For example, <i>KeeForm</i>
(for Internet Explorer und Mozilla Firefox)
-allows completely automatic filling of
-webforms for example.</p>
+allows completely automatic filling of webforms.</p>
<p>You can find these integration plugins on the
<a href="http://keepass.info/plugins.html">KeePass Plugins</a> page.</p>
diff --git a/Docs/Chm/help/v2/autotype_obfuscation.html b/Docs/Chm/help/v2/autotype_obfuscation.html
index 860a1ac..a23c77c 100644
--- a/Docs/Chm/help/v2/autotype_obfuscation.html
+++ b/Docs/Chm/help/v2/autotype_obfuscation.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/dbsettings.html b/Docs/Chm/help/v2/dbsettings.html
index 959ea2a..6b93201 100644
--- a/Docs/Chm/help/v2/dbsettings.html
+++ b/Docs/Chm/help/v2/dbsettings.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/entry.html b/Docs/Chm/help/v2/entry.html
index 47b5b33..9835ecd 100644
--- a/Docs/Chm/help/v2/entry.html
+++ b/Docs/Chm/help/v2/entry.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/guioptions.html b/Docs/Chm/help/v2/guioptions.html
index c0cfc9e..60794ac 100644
--- a/Docs/Chm/help/v2/guioptions.html
+++ b/Docs/Chm/help/v2/guioptions.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/ioconnect.html b/Docs/Chm/help/v2/ioconnect.html
index f31e084..3c66a9d 100644
--- a/Docs/Chm/help/v2/ioconnect.html
+++ b/Docs/Chm/help/v2/ioconnect.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/license.html b/Docs/Chm/help/v2/license.html
index 6bb900b..a4f1685 100644
--- a/Docs/Chm/help/v2/license.html
+++ b/Docs/Chm/help/v2/license.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/plugins.html b/Docs/Chm/help/v2/plugins.html
index 6dc2056..ba1f751 100644
--- a/Docs/Chm/help/v2/plugins.html
+++ b/Docs/Chm/help/v2/plugins.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/policy.html b/Docs/Chm/help/v2/policy.html
index 22d54ef..a7f9f34 100644
--- a/Docs/Chm/help/v2/policy.html
+++ b/Docs/Chm/help/v2/policy.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/setup.html b/Docs/Chm/help/v2/setup.html
index 086a744..8be268d 100644
--- a/Docs/Chm/help/v2/setup.html
+++ b/Docs/Chm/help/v2/setup.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -184,8 +183,27 @@ your system.</p>
KeePass under Mono (Linux, Mac OS X, BSD, ...)</h2>
<p>In addition to Windows, KeePass 2.x runs fine under Mono, i.e. Linux, Mac OS X,
-BSD, etc. In order to run KeePass, follow these steps:</p>
+BSD, etc.</p>
+<p>Links to all supported packages can be found on the KeePass downloads page:
+<a href="http://keepass.info/download.html"
+target="_blank">http://keepass.info/download.html</a>.</p>
+
+<ul>
+<li><strong>Debian/Ubuntu Linux:</strong><br />
+Install the <em>keepass2</em> /
+<em>KeePass 2.x for Debian/Ubuntu Linux</em> package (e.g. using APT).
+A link to a page with more information about this package can be found on the
+downloads page.<br />
+<br /></li>
+
+<li><strong>Mac OS X:</strong><br />
+Install the <em>KeePass 2.x for Mac OS X</em> package
+(link on the downloads page).<br />
+<br /></li>
+
+<li><strong>Other Unix-like systems:</strong><br />
+In order to run KeePass, follow these steps:
<ol>
<li>Install <a href="http://www.mono-project.com/"
target="_blank">Mono ≥ 2.6</a> (older versions will not work and are
@@ -270,6 +288,8 @@ must be 2.20100818.3004 or higher! If your distribution only offers an
older version, you can download and install the latest version of the
package manually, see the <a href="http://www.semicomplete.com/projects/xdotool/"
target="_blank" rel="nofollow"><code>xdotool</code> website</a>.</p>
+</li>
+</ul>
<!-- <br />
<a name="wine"></a>
diff --git a/Docs/Chm/help/v2/sync.html b/Docs/Chm/help/v2/sync.html
index 831c62d..02df7c3 100644
--- a/Docs/Chm/help/v2/sync.html
+++ b/Docs/Chm/help/v2/sync.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/translation.html b/Docs/Chm/help/v2/translation.html
index e010b06..2e780a1 100644
--- a/Docs/Chm/help/v2/translation.html
+++ b/Docs/Chm/help/v2/translation.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2/triggers.html b/Docs/Chm/help/v2/triggers.html
index 9594cd2..5278a81 100644
--- a/Docs/Chm/help/v2/triggers.html
+++ b/Docs/Chm/help/v2/triggers.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -137,6 +136,22 @@ This event occurs right after a database file has been saved successfully.
<li><i>Parameters:</i> See 'Opened database file' event.<br /><br /></li>
</ul></li>
+<li><b>Closing database file (before saving):</b><br />
+This event occurs right before a database file is closed.
+It occurs before KeePass saves the database automatically or asks the
+user whether to save unsaved changes.
+<ul>
+<li><i>Parameters:</i> See 'Opened database file' event.<br /><br /></li>
+</ul></li>
+
+<li><b>Closing database file (after saving):</b><br />
+This event occurs right before a database file is closed.
+The database file already was saved automatically or unsaved changes were
+saved/discarded depending on the user's choice.
+<ul>
+<li><i>Parameters:</i> See 'Opened database file' event.<br /><br /></li>
+</ul></li>
+
<li><b>Copied entry data to clipboard:</b><br />
This event occurs when entry data (user name, password, ...) is copied
to the Windows clipboard.
@@ -223,8 +238,9 @@ see: <a href="../base/autourl.html#builtin">Executing Built-In Shell Commands</a
<ul>
<li><i>File/URL:</i> The string to be executed by the shell.</li>
<li><i>Arguments:</i> Optional. If <i>'File/URL'</i> points to an executable
-file, this string is sent to the executable as command line argument(s).
-<br /><br /></li>
+file, this string is sent to the executable as command line argument(s).</li>
+<li><i>Wait for exit:</i> If this option is checked, KeePass waits indefinitely
+for the started process to exit.<br /><br /></li>
</ul></li>
<li><b>Change trigger on/off state:</b><br />
diff --git a/Docs/Chm/help/v2/version.html b/Docs/Chm/help/v2/version.html
index 33f4433..11ed683 100644
--- a/Docs/Chm/help/v2/version.html
+++ b/Docs/Chm/help/v2/version.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2_dev/customize.html b/Docs/Chm/help/v2_dev/customize.html
index 4990026..f63147e 100644
--- a/Docs/Chm/help/v2_dev/customize.html
+++ b/Docs/Chm/help/v2_dev/customize.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2_dev/plg_index.html b/Docs/Chm/help/v2_dev/plg_index.html
index f680139..e5a590f 100644
--- a/Docs/Chm/help/v2_dev/plg_index.html
+++ b/Docs/Chm/help/v2_dev/plg_index.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -269,11 +268,11 @@ of your plugin.</li>
the quotes).</li>
<li><b>Copyright:</b> Not used by KeePass; freely assignable by the plugin.</li>
<li><b>Trademarks:</b> Not used by KeePass; freely assignable by the plugin.</li>
-<li><b>Assembly Version:</b> Should be set to the recommended KeePass version (i.e.
-the KeePass version your plugin is built for).</li>
+<li><b>Assembly Version:</b> Should be set to the version of your plugin.</li>
<li><b>File Version:</b> Should be set to the version of your plugin. It is up
to you how you are versioning your plugin builds, but it should be a scheme that
-allows version comparisons (based on string comparisons).</li>
+allows version comparisons (by comparing the version components).
+Do <i>not</i> use asterisks for creating a version number at build time.</li>
<li><b>GUID:</b> Not used by KeePass; freely assignable by the plugin.</li>
</ul>
diff --git a/Docs/Chm/help/v2_dev/scr_index.html b/Docs/Chm/help/v2_dev/scr_index.html
index f248dd2..d24e840 100644
--- a/Docs/Chm/help/v2_dev/scr_index.html
+++ b/Docs/Chm/help/v2_dev/scr_index.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2_dev/scr_kps_index.html b/Docs/Chm/help/v2_dev/scr_kps_index.html
index 384392b..d859b6e 100644
--- a/Docs/Chm/help/v2_dev/scr_kps_index.html
+++ b/Docs/Chm/help/v2_dev/scr_kps_index.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
diff --git a/Docs/Chm/help/v2_dev/scr_sc_index.html b/Docs/Chm/help/v2_dev/scr_sc_index.html
index 51c0610..dced094 100644
--- a/Docs/Chm/help/v2_dev/scr_sc_index.html
+++ b/Docs/Chm/help/v2_dev/scr_sc_index.html
@@ -9,7 +9,6 @@
<meta name="keywords" content="KeePass, Password, Safe, Security, Database, Encryption, Secure, Manager, Open, Source, Free, Code, Key, Master, Disk, Dominik, Reichl" />
<meta name="robots" content="index" />
- <meta name="revisit-after" content="14 days" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache" />
@@ -37,6 +36,7 @@
+
<table class="sectionsummary"><tr><td width="68px">
<img src="../images/b64x64_konsole.png" width="64px" height="64px"
class="singleimg" align="left" alt="Console" />
@@ -94,13 +94,17 @@ next release of KPScript.</p>
<ul>
<li>ListGroups</li>
<li>ListEntries</li>
+<li>GetEntryString</li>
<li>AddEntry</li>
<li>EditEntry</li>
+<li>MoveEntry</li>
<li>DeleteEntry</li>
+<li>DeleteAllEntries</li>
<li>Export</li>
<li>Sync</li>
<li>ChangeMasterKey</li>
<li>DetachBins</li>
+<li>GenPw</li>
</ul>
<hr />
@@ -124,6 +128,21 @@ Opens the MyDb.kdbx database using 'MyPassword' as password and the MyDb.key fil
It will output a list of all entries contained in the MyDb.kdbx database file.</p>
<hr />
+<p><b>Command: GetEntryString</b></p>
+
+<p>Retrieves the value of an entry string field. The entry identification
+syntax is exactly the same as in the <code>EditEntry</code> command.
+The field name can be specified using the '<code>-Field</code>' parameter (supported
+field names are e.g. Title, UserName, Password, URL, Notes, etc.).
+Usage example:</p>
+
+<p><code>KPScript -c:GetEntryString "C:\KeePass\MyDb.kdbx" -pw:MyPassword
+-Field:UserName -ref-Title:"Demo Account"</code><br />
+Opens the MyDb.kdbx database using 'MyPassword' as password.
+It outputs the user names of all entries that have the title
+"Demo Account".</p>
+
+<hr />
<p><b>Command: AddEntry</b></p>
<p>This command adds an entry to the database. To specify the entry details, use the
@@ -148,12 +167,21 @@ the entry will be created in the root group. Example:</p>
<hr />
<p><b>Command: EditEntry</b></p>
-<p>This command edits existing entries. To identify the entries to be edited,
-specify string fields to be compared. The syntax is
+<p>This command edits existing entries.</p>
+
+<p>To identify the entries to be edited,
+string fields can be compared. The syntax is
<code>-ref-<i>FIELDNAME</i>:<i>FIELDVALUE</i></code>.
-To specify one or more new entry string values, use the following syntax:
-<code>-set-<i>FIELDNAME</i>:<i>FIELDVALUE</i></code>.
-Usage examples:</p>
+Additionally to comparing string fields, some other entry fields
+can be compared.
+<code>-refx-UUID:</code> can be used to specify the UUID.
+<code>-refx-Tags:</code> can be used to specify tags
+(multiple tags must be separated using commas '<code>,</code>').</p>
+
+<p>To specify one or more new entry string values, use the following syntax:
+<code>-set-<i>FIELDNAME</i>:<i>FIELDVALUE</i></code>.</p>
+
+<p>Usage examples:</p>
<p><code>KPScript -c:EditEntry "C:\KeePass\MyDb.kdbx" -pw:MyPw -ref-Title:"Existing
entry title" -set-UserName:"New user name"</code></p>
@@ -165,12 +193,28 @@ entry title" -set-UserName:"New user name"</code></p>
first create backups of entries before modifying them.</p>
<hr />
+<p><b>Command: MoveEntry</b></p>
+
+<p>This command moves one or more existing entries. The entry identification
+syntax is exactly the same as in the <code>EditEntry</code> command.</p>
+
+<p>The target group can be specified using the <code>GroupTree</code>
+parameter. '<code>/</code>' must be used as separator
+(e.g. <code>-GroupTree:Internet/eMail</code> moves the specified entries
+to the subgroup 'eMail' of the subgroup 'Internet').</p>
+
+<hr />
<p><b>Command: DeleteEntry</b></p>
<p>This command deletes one or more existing entries. The entry identification
syntax is exactly the same as in the <code>EditEntry</code> command.</p>
<hr />
+<p><b>Command: DeleteAllEntries</b></p>
+
+<p>This command deletes all entries (in all subgroups).</p>
+
+<hr />
<p><b>Command: Export</b></p>
<p>This command exports the complete database. The format is specified by
@@ -208,5 +252,22 @@ Usage example:</p>
<p><code>KPScript -c:DetachBins -guikeyprompt "C:\KeePass\MyDb.kdbx"</code></p>
+<hr />
+<p><b>Command: GenPw</b></p>
+
+<p>Generates passwords. The number of passwords can be specified using the
+optional <code>-count:</code> parameter.
+A password generator profile can be specified using the optional
+<code>-profile:</code> parameter
+(the names of all available profiles can be found in the password generator
+dialog).
+Usage examples:</p>
+
+<p><code>KPScript -c:GenPw</code><br />
+Generates one password using the default generator profile.</p>
+
+<p><code>KPScript -c:GenPw -count:5 -profile:"128-Bit Hex Key (built-in)"</code><br />
+Generates five 128-bit hex passwords (when no translation is used).</p>
+
</body></html>
diff --git a/Docs/Chm/screenshots/keepass_2x/gencsvimp.png b/Docs/Chm/screenshots/keepass_2x/gencsvimp.png
new file mode 100644
index 0000000..b427c17
Binary files /dev/null and b/Docs/Chm/screenshots/keepass_2x/gencsvimp.png differ
diff --git a/Docs/History.txt b/Docs/History.txt
index 213a2ae..8c46690 100644
--- a/Docs/History.txt
+++ b/Docs/History.txt
@@ -1,3 +1,142 @@
+2012-05-01: 2.19
+- New generic CSV importer (now supports multi-line fields, '\'
+ as escape character, field & record separators and the text
+ qualifier can be specified, white space characters can be
+ removed from the beginning/end of fields, the fields and
+ their order can be defined, supported fields now are group
+ name & standard fields like e.g. title & custom strings &
+ times & ignore column, the first row can be ignored, KeePass
+ initially tries to guess the fields and their order based on
+ the first row)
+- Native master key transformations are now computed in two
+ threads on 64-bit systems, too; on dual/multi core processors
+ this results in almost twice the performance as before (by
+ doubling the amount of rounds you'll get the same waiting
+ time as in 2.18, but the protection against dictionary and
+ guessing attacks is doubled)
+- New XML configuration and translation deserializer to improve
+ the startup performance
+- Added option to require a password repetition only when
+ hiding using asterisks is enabled (enabled by default)
+- Entry attachments can now be renamed using in-place label
+ editing (click on an already selected item to show an edit
+ box)
+- Empty entry attachments can now be created using 'Attach' ->
+ 'Create Empty Attachment'
+- Sizes of entry attachments are now shown in a column of the
+ attachments list in the entry editing dialog
+- Added {ENV_PROGRAMFILES_X86} placeholder (this is
+ %ProgramFiles(x86)%, if it exists, otherwise %ProgramFiles%)
+- Added auto-type option 'An entry matches if one of its tags
+ is contained in the target window title'
+- URLs in HTML exports are now linkified
+- Import modules may now specify multiple default/equivalent
+ file extensions (like e.g. 'htm' and 'html')
+- Added support for reading texts encoded using UTF-32 Big
+ Endian
+- Enhanced text encoding detection (now detects UTF-32 LE/BE
+ and UTF-16 LE/BE by zeros, improved UTF-8 detection, ...)
+- Added zoom function for images in internal data viewer
+- Drop-down image buttons in the entry editing dialog are now
+ marked using small black triangle overlays
+- Added support for loading key files from URLs
+- Controls in the options dialog are now disabled when the
+ options are enforced (using an enforced configuration file)
+- If KeePass is started with the '-debug' command line option,
+ KeePass now shows a developer-friendly error message when
+ opening a database file fails
+- Added 'Wait for exit' property in the 'Execute command line /
+ URL' trigger action
+- The 'File exists' trigger condition now also supports URLs
+- Added two file closing trigger events (one raised before and
+ one after saving the database file)
+- Plugins: added file closing events
+- Plugins: added events (AutoType.Sequence*) that allow plugins
+ to provide auto-type sequence suggestions
+- Added workaround to support loading data from version
+ information files even when they have incorrectly been
+ decompressed by a web filter
+- Added workarounds for '°', '|' and '£' .NET SendKeys issues
+- Added workaround for topmost window .NET/Windows issue (the
+ 'Always on Top' option now works even when switching to a
+ different window while KeePass is starting up)
+- Added workaround for Mono dialog event ordering bug
+- Added workaround for Mono clipboard bugs on Mac OS X
+- KPScript: added 'MoveEntry', 'GetEntryString' and 'GenPw'
+ commands
+- KPScript: added '-refx-UUID' and '-refx-Tags' entry
+ identification parameters
+
+- When only deleting history entries (without changing any data
+ field of an entry), no backup entry is created anymore
+- Unified text encoding handling for internal data viewer and
+ editor, generic CSV importer and text encoding selection
+ dialog
+- Improved font sizing in HTML exports/printouts
+- Improved encoding of group names in HTML exports/printouts
+- If an entry doesn't expire, 'Never expires' is now shown in
+ the 'Expiry Time' column in HTML exports/printouts
+- The expiry edit control now accepts incomplete edits and the
+ 'Expires' checkbox is checked immediately
+- The time component of the default expiry suggestion is now
+ 00:00:00
+- The last selected/focused item in the attachments list of the
+ entry editing dialog is now selected/focused after editing an
+ attachment
+- Improved field to standard field mapping function
+- Enhanced RoboForm importer to concatenate values of fields
+ with conflicting names
+- Updated Spamex.com importer
+- Removed KeePass 1.x CSV importer; users should use the new
+ generic CSV importer (which can import more data than the old
+ specialized 1.x CSV importer)
+- When trying to open another database while a dialog is
+ displayed, KeePass now just brings itself to the foreground
+ without attempting to open the second database
+- More list views use the Vista Explorer style
+- Modifier keys without another key aren't registered as global
+ hot key anymore
+- Improved default suggestions for custom sequences in the
+ auto-type sequence editing dialog
+- Improved default focus in the auto-type sequence editing
+ dialog
+- Added {C:Comment} placeholder in the auto-type sequence
+ editing dialog
+- On Unix-like systems, the {GOOGLECHROME} placeholder now
+ first searches for Google Chrome and then (if not found) for
+ Chromium
+- Versions displayed in the update checking dialog now consist
+ of at least two components
+- Added '@' and '`' to the printable 7-bit ASCII character set
+- Merged simple and extended special character spaces to one
+ special character space
+- Reduced control character space from 60 to 32
+- The first sample entry's URL now points to the KeePass
+ website
+- Improved key transformation delay calculation
+- Improved key file loading performance
+- The main menu now isn't a tab stop anymore
+- Some configuration nodes are now allocated only on demand
+- Improved UI update when moving/copying entries to the
+ currently active group or a subgroup of it using drag&drop
+- Improved behavior when closing an inactive database having
+ unsaved changes
+- Changed versioning scheme in file version information blocks
+ from digit- to component-based
+- Development snapshots don't ask anymore whether to enable the
+ automatic update check (only stable releases do)
+- Improved PLGX cache directory naming
+- The PLGX cache directory by default is now located in the
+ local application data folder instead of the roaming one
+- Improved support for PLGX plugins that are using LINQ
+- Various UI improvements
+- Various code optimizations
+- Minor other improvements
+
+- Fixed sorting of items in the most recently used files list
+- Fixed tab order in the 'Advanced' tab of the entry editing
+ dialog
+
2012-01-05: 2.18
- The update check now also checks for plugin updates (if
plugin developers provide version information files)
diff --git a/KeePass/Forms/ImportCsvForm.Designer.cs b/Ext/DeprecatedSources/ImportCsvForm_120218.Designer.cs
similarity index 100%
rename from KeePass/Forms/ImportCsvForm.Designer.cs
rename to Ext/DeprecatedSources/ImportCsvForm_120218.Designer.cs
diff --git a/KeePass/Forms/ImportCsvForm.cs b/Ext/DeprecatedSources/ImportCsvForm_120218.cs
similarity index 100%
rename from KeePass/Forms/ImportCsvForm.cs
rename to Ext/DeprecatedSources/ImportCsvForm_120218.cs
diff --git a/KeePass/Forms/ImportCsvForm.resx b/Ext/DeprecatedSources/ImportCsvForm_120218.resx
similarity index 100%
rename from KeePass/Forms/ImportCsvForm.resx
rename to Ext/DeprecatedSources/ImportCsvForm_120218.resx
diff --git a/KeePass/DataExchange/Formats/KeePassCsv1x.cs b/Ext/DeprecatedSources/KeePassCsv1x_120221.cs
similarity index 100%
rename from KeePass/DataExchange/Formats/KeePassCsv1x.cs
rename to Ext/DeprecatedSources/KeePassCsv1x_120221.cs
diff --git a/Ext/KeePass.exe.config b/Ext/KeePass.exe.config
index 62795ed..9635f44 100644
--- a/Ext/KeePass.exe.config
+++ b/Ext/KeePass.exe.config
@@ -9,8 +9,8 @@
<assemblyIdentity name="KeePass"
publicKeyToken="fed2ed7716aecf5c"
culture="neutral" />
- <bindingRedirect oldVersion="2.0.9.0-2.1.8.0"
- newVersion="2.1.8.18961" />
+ <bindingRedirect oldVersion="2.0.9.0-2.19.0.0"
+ newVersion="2.19.0.18206" />
</dependentAssembly>
</assemblyBinding>
<enforceFIPSPolicy enabled="false" />
diff --git a/Ext/KeePass.iss b/Ext/KeePass.iss
index 1ceb617..a2c3407 100644
--- a/Ext/KeePass.iss
+++ b/Ext/KeePass.iss
@@ -8,10 +8,10 @@
#define MyAppNameEx "KeePass Password Safe 2"
#define MyAppPublisher "Dominik Reichl"
-#define KeeVersionStr "2.18"
-#define KeeVersionStrWithMinor "2.18"
-#define KeeVersionStrWithMinorPath "2.18"
-#define KeeVersionWin "2.1.8.0"
+#define KeeVersionStr "2.19"
+#define KeeVersionStrWithMinor "2.19"
+#define KeeVersionStrWithMinorPath "2.19"
+#define KeeVersionWin "2.19.0.0"
#define MyAppURL "http://keepass.info/"
#define MyAppExeName "KeePass.exe"
diff --git a/Ext/KeePassMsi/KeePassMsi.vdproj b/Ext/KeePassMsi/KeePassMsi.vdproj
index c7521a6..9f4db7d 100644
--- a/Ext/KeePassMsi/KeePassMsi.vdproj
+++ b/Ext/KeePassMsi/KeePassMsi.vdproj
@@ -118,7 +118,7 @@
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
- "OwnerKey" = "8:_838987B3C51D42C3C7B9BDA1339A5500"
+ "OwnerKey" = "8:_8C05ADB649434D7892E36709EBDED4CC"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -130,7 +130,7 @@
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
- "OwnerKey" = "8:_8C05ADB649434D7892E36709EBDED4CC"
+ "OwnerKey" = "8:_838987B3C51D42C3C7B9BDA1339A5500"
"MsmSig" = "8:_UNDEFINED"
}
}
@@ -382,7 +382,7 @@
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
- "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.8.18961, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
+ "AssemblyAsmDisplayName" = "8:KeePass, Version=2.19.0.18206, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_838987B3C51D42C3C7B9BDA1339A5500"
@@ -413,7 +413,7 @@
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
- "AssemblyAsmDisplayName" = "8:KeePass.XmlSerializers, Version=2.1.8.18961, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
+ "AssemblyAsmDisplayName" = "8:KeePass.XmlSerializers, Version=2.19.0.18206, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_8C05ADB649434D7892E36709EBDED4CC"
@@ -564,7 +564,7 @@
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
- "AssemblyAsmDisplayName" = "8:KeePass, Version=2.1.8.18961, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
+ "AssemblyAsmDisplayName" = "8:KeePass, Version=2.19.0.18206, Culture=neutral, PublicKeyToken=fed2ed7716aecf5c, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_C4F8814F844C43EE8C9F5B662182B11A"
@@ -712,14 +712,14 @@
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:KeePass"
- "ProductCode" = "8:{3560D137-75F3-4E06-BE84-FB80CABF40AC}"
- "PackageCode" = "8:{38E032C9-1409-4F5F-BF01-43B99210854B}"
+ "ProductCode" = "8:{E75AF9CE-09D4-46F2-BF44-9E7D2B4763D9}"
+ "PackageCode" = "8:{3707808B-0F74-4AD0-B136-D80EB2DE377C}"
"UpgradeCode" = "8:{F2F19898-4F86-4940-9BFA-426574CE03E1}"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:TRUE"
- "ProductVersion" = "8:2.1.8"
+ "ProductVersion" = "8:2.19.0"
"Manufacturer" = "8:Dominik Reichl"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:http://keepass.info/"
diff --git a/KeePass/App/AppDefs.cs b/KeePass/App/AppDefs.cs
index cac2e4d..2cbabbf 100644
--- a/KeePass/App/AppDefs.cs
+++ b/KeePass/App/AppDefs.cs
@@ -48,7 +48,7 @@ namespace KeePass.App
// public const string MruNameValueSplitter = @"/::/";
/// <summary>
- /// Hot key IDs (used in WM_HOTKEY window messages).
+ /// Hot key IDs (used in <c>WM_HOTKEY</c> window messages).
/// </summary>
public static class GlobalHotKeyId
{
@@ -154,9 +154,10 @@ namespace KeePass.App
public const string PlgxBuildPost = "plgx-build-post";
public const string Debug = "debug";
+ public const string DebugThrowException = "debug-throwexcp";
public const string SavePluginCompileRes = "saveplgxcr";
public const string ShowAssemblyInfo = "showasminfo";
- public const string DebugThrowException = "debug-throwexcp";
+ public const string MakeXmlSerializerEx = "makexmlserializerex";
#if (DEBUG && !KeePassLibSD)
public const string MakePopularPasswordTable = "makepopularpasswordtable";
diff --git a/KeePass/App/Configuration/AceApplication.cs b/KeePass/App/Configuration/AceApplication.cs
index 8f5757c..0a672cc 100644
--- a/KeePass/App/Configuration/AceApplication.cs
+++ b/KeePass/App/Configuration/AceApplication.cs
@@ -68,10 +68,14 @@ namespace KeePass.App.Configuration
}
}
- private IOConnectionInfo m_ioLastDb = new IOConnectionInfo();
+ private IOConnectionInfo m_ioLastDb = null;
public IOConnectionInfo LastUsedFile
{
- get { return m_ioLastDb; }
+ get
+ {
+ if(m_ioLastDb == null) m_ioLastDb = new IOConnectionInfo();
+ return m_ioLastDb;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
@@ -79,10 +83,14 @@ namespace KeePass.App.Configuration
}
}
- private AceMru m_mru = new AceMru();
+ private AceMru m_mru = null;
public AceMru MostRecentlyUsed
{
- get { return m_mru; }
+ get
+ {
+ if(m_mru == null) m_mru = new AceMru();
+ return m_mru;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
@@ -90,10 +98,14 @@ namespace KeePass.App.Configuration
}
}
- private AceStartUp m_su = new AceStartUp();
+ private AceStartUp m_su = null;
public AceStartUp Start
{
- get { return m_su; }
+ get
+ {
+ if(m_su == null) m_su = new AceStartUp();
+ return m_su;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
@@ -101,10 +113,14 @@ namespace KeePass.App.Configuration
}
}
- private AceOpenDb m_fo = new AceOpenDb();
+ private AceOpenDb m_fo = null;
public AceOpenDb FileOpening
{
- get { return m_fo; }
+ get
+ {
+ if(m_fo == null) m_fo = new AceOpenDb();
+ return m_fo;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
diff --git a/KeePass/App/Configuration/AceIntegration.cs b/KeePass/App/Configuration/AceIntegration.cs
index e92e395..83f1134 100644
--- a/KeePass/App/Configuration/AceIntegration.cs
+++ b/KeePass/App/Configuration/AceIntegration.cs
@@ -132,6 +132,14 @@ namespace KeePass.App.Configuration
set { m_bMatchByUrlHostInTitle = value; }
}
+ private bool m_bMatchByTagInTitle = false;
+ [DefaultValue(false)]
+ public bool AutoTypeMatchByTagInTitle
+ {
+ get { return m_bMatchByTagInTitle; }
+ set { m_bMatchByTagInTitle = value; }
+ }
+
private bool m_bPrependInitSeqIE = true;
[DefaultValue(true)]
public bool AutoTypePrependInitSequenceForIE
diff --git a/KeePass/App/Configuration/AceMainWindow.cs b/KeePass/App/Configuration/AceMainWindow.cs
index 9b78385..bf5e96c 100644
--- a/KeePass/App/Configuration/AceMainWindow.cs
+++ b/KeePass/App/Configuration/AceMainWindow.cs
@@ -336,10 +336,14 @@ namespace KeePass.App.Configuration
// set { m_bGridLines = value; }
// }
- private ListSorter m_pListSorter = new ListSorter();
+ private ListSorter m_pListSorter = null;
public ListSorter ListSorting
{
- get { return m_pListSorter; }
+ get
+ {
+ if(m_pListSorter == null) m_pListSorter = new ListSorter();
+ return m_pListSorter;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
diff --git a/KeePass/App/Configuration/AceUI.cs b/KeePass/App/Configuration/AceUI.cs
index 3ef27a7..f7f2efd 100644
--- a/KeePass/App/Configuration/AceUI.cs
+++ b/KeePass/App/Configuration/AceUI.cs
@@ -103,6 +103,14 @@ namespace KeePass.App.Configuration
}
}
+ private bool m_bRepeatPwOnlyWhenHidden = true;
+ [DefaultValue(true)]
+ public bool RepeatPasswordOnlyWhenHidden
+ {
+ get { return m_bRepeatPwOnlyWhenHidden; }
+ set { m_bRepeatPwOnlyWhenHidden = value; }
+ }
+
private AceFont m_font = new AceFont();
public AceFont StandardFont
{
diff --git a/KeePass/App/Configuration/AppConfigEx.cs b/KeePass/App/Configuration/AppConfigEx.cs
index e53fe2c..cd49ef7 100644
--- a/KeePass/App/Configuration/AppConfigEx.cs
+++ b/KeePass/App/Configuration/AppConfigEx.cs
@@ -20,10 +20,14 @@
using System;
using System.Collections.Generic;
using System.Text;
+using System.Reflection;
+using System.Xml;
using System.Xml.Serialization;
using System.Diagnostics;
+using KeePass.UI;
using KeePass.Util;
+using KeePass.Util.XmlSerialization;
using KeePassLib.Serialization;
using KeePassLib.Utility;
@@ -59,10 +63,14 @@ namespace KeePass.App.Configuration
}
}
- private AceLogging m_aceLogging = new AceLogging();
+ private AceLogging m_aceLogging = null;
public AceLogging Logging
{
- get { return m_aceLogging; }
+ get
+ {
+ if(m_aceLogging == null) m_aceLogging = new AceLogging();
+ return m_aceLogging;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
@@ -81,10 +89,14 @@ namespace KeePass.App.Configuration
}
}
- private AceUI m_aceUI = new AceUI();
+ private AceUI m_aceUI = null;
public AceUI UI
{
- get { return m_aceUI; }
+ get
+ {
+ if(m_aceUI == null) m_aceUI = new AceUI();
+ return m_aceUI;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
@@ -92,10 +104,14 @@ namespace KeePass.App.Configuration
}
}
- private AceSecurity m_sec = new AceSecurity();
+ private AceSecurity m_sec = null;
public AceSecurity Security
{
- get { return m_sec; }
+ get
+ {
+ if(m_sec == null) m_sec = new AceSecurity();
+ return m_sec;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
@@ -103,10 +119,14 @@ namespace KeePass.App.Configuration
}
}
- private AceNative m_native = new AceNative();
+ private AceNative m_native = null;
public AceNative Native
{
- get { return m_native; }
+ get
+ {
+ if(m_native == null) m_native = new AceNative();
+ return m_native;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
@@ -114,10 +134,14 @@ namespace KeePass.App.Configuration
}
}
- private AcePasswordGenerator m_pwGen = new AcePasswordGenerator();
+ private AcePasswordGenerator m_pwGen = null;
public AcePasswordGenerator PasswordGenerator
{
- get { return m_pwGen; }
+ get
+ {
+ if(m_pwGen == null) m_pwGen = new AcePasswordGenerator();
+ return m_pwGen;
+ }
set
{
if(value == null) throw new ArgumentNullException("value");
@@ -290,6 +314,55 @@ namespace KeePass.App.Configuration
if(bObf) m_int.ProxyPassword = StrUtil.Obfuscate(m_int.ProxyPassword);
else m_int.ProxyPassword = StrUtil.Deobfuscate(m_int.ProxyPassword);
}
+
+ private static Dictionary<object, string> m_dictXmlPathCache =
+ new Dictionary<object, string>();
+ public static bool IsOptionEnforced(object pContainer, PropertyInfo pi)
+ {
+ if(pContainer == null) { Debug.Assert(false); return false; }
+ if(pi == null) { Debug.Assert(false); return false; }
+
+ XmlDocument xdEnforced = AppConfigSerializer.EnforcedConfigXml;
+ if(xdEnforced == null) return false;
+
+ string strObjPath;
+ if(!m_dictXmlPathCache.TryGetValue(pContainer, out strObjPath))
+ {
+ strObjPath = XmlUtil.GetObjectXmlPath(Program.Config, pContainer);
+ if(string.IsNullOrEmpty(strObjPath)) { Debug.Assert(false); return false; }
+
+ m_dictXmlPathCache[pContainer] = strObjPath;
+ }
+
+ string strProp = XmlSerializerEx.GetXmlName(pi);
+ if(string.IsNullOrEmpty(strProp)) { Debug.Assert(false); return false; }
+
+ string strPre = strObjPath;
+ if(!strPre.EndsWith("/")) strPre += "/";
+ string strXPath = strPre + strProp;
+
+ XmlNode xn = xdEnforced.SelectSingleNode(strXPath);
+ return (xn != null);
+ }
+
+ public static bool IsOptionEnforced(object pContainer, string strPropertyName)
+ {
+ if(pContainer == null) { Debug.Assert(false); return false; }
+ if(string.IsNullOrEmpty(strPropertyName)) { Debug.Assert(false); return false; }
+
+ // To improve performance (avoid type queries), check here, too
+ XmlDocument xdEnforced = AppConfigSerializer.EnforcedConfigXml;
+ if(xdEnforced == null) return false;
+
+ Type tContainer = pContainer.GetType();
+ PropertyInfo pi = tContainer.GetProperty(strPropertyName);
+ return IsOptionEnforced(pContainer, pi);
+ }
+
+ public static void ClearXmlPathCache()
+ {
+ m_dictXmlPathCache.Clear();
+ }
}
public sealed class AceMeta
diff --git a/KeePass/App/Configuration/AppConfigSerializer.cs b/KeePass/App/Configuration/AppConfigSerializer.cs
index b59861e..70a9d11 100644
--- a/KeePass/App/Configuration/AppConfigSerializer.cs
+++ b/KeePass/App/Configuration/AppConfigSerializer.cs
@@ -23,11 +23,11 @@ using System.Text;
using System.Reflection;
using System.Diagnostics;
using System.Xml;
-using System.Xml.Serialization;
using System.IO;
using KeePass.Resources;
using KeePass.Util;
+using KeePass.Util.XmlSerialization;
using KeePassLib;
using KeePassLib.Serialization;
@@ -84,6 +84,12 @@ namespace KeePass.App.Configuration
}
}
+ private static XmlDocument m_xdEnforced = null;
+ public static XmlDocument EnforcedConfigXml
+ {
+ get { return m_xdEnforced; }
+ }
+
private static void GetConfigPaths()
{
if(m_strGlobalConfigFile == null)
@@ -175,9 +181,11 @@ namespace KeePass.App.Configuration
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(m_strEnforcedConfigFile);
+
+ m_xdEnforced = xmlDoc;
return xmlDoc;
}
- catch(Exception) { }
+ catch(Exception) { m_xdEnforced = null; }
return null;
}
@@ -188,7 +196,7 @@ namespace KeePass.App.Configuration
if(string.IsNullOrEmpty(strFilePath)) return null;
AppConfigEx tConfig = null;
- XmlSerializer xmlSerial = new XmlSerializer(typeof(AppConfigEx));
+ XmlSerializerEx xmlSerial = new XmlSerializerEx(typeof(AppConfigEx));
if(xdEnforced == null)
{
@@ -249,7 +257,7 @@ namespace KeePass.App.Configuration
{
if(xdEnforced != null)
{
- XmlSerializer xmlSerial = new XmlSerializer(typeof(AppConfigEx));
+ XmlSerializerEx xmlSerial = new XmlSerializerEx(typeof(AppConfigEx));
try
{
MemoryStream msEnf = new MemoryStream();
@@ -284,7 +292,7 @@ namespace KeePass.App.Configuration
{
tConfig.OnSavePre();
- XmlSerializer xmlSerial = new XmlSerializer(typeof(AppConfigEx));
+ XmlSerializerEx xmlSerial = new XmlSerializerEx(typeof(AppConfigEx));
bool bResult = true;
// FileStream fs = null;
@@ -297,7 +305,7 @@ namespace KeePass.App.Configuration
if(bRemoveConfigPref) tConfig.Meta.PreferUserConfiguration = false;
XmlWriterSettings xws = new XmlWriterSettings();
- xws.Encoding = new UTF8Encoding(false);
+ xws.Encoding = StrUtil.Utf8;
xws.Indent = true;
xws.IndentChars = "\t";
diff --git a/KeePass/DataExchange/CsvStreamReaderEx.cs b/KeePass/DataExchange/CsvStreamReaderEx.cs
new file mode 100644
index 0000000..b5b526f
--- /dev/null
+++ b/KeePass/DataExchange/CsvStreamReaderEx.cs
@@ -0,0 +1,201 @@
+/*
+ KeePass Password Safe - The Open-Source Password Manager
+ Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Diagnostics;
+
+using KeePassLib.Utility;
+
+namespace KeePass.DataExchange
+{
+ public sealed class CsvOptions
+ {
+ private char m_chFieldSep = ',';
+ public char FieldSeparator
+ {
+ get { return m_chFieldSep; }
+ set { m_chFieldSep = value; }
+ }
+
+ private char m_chRecSep = '\n';
+ public char RecordSeparator
+ {
+ get { return m_chRecSep; }
+ set { m_chRecSep = value; }
+ }
+
+ private char m_chTextQual = '\"';
+ public char TextQualifier
+ {
+ get { return m_chTextQual; }
+ set { m_chTextQual = value; }
+ }
+
+ private bool m_bBackEscape = true;
+ public bool BackslashIsEscape
+ {
+ get { return m_bBackEscape; }
+ set { m_bBackEscape = value; }
+ }
+
+ private bool m_bTrimFields = true;
+ public bool TrimFields
+ {
+ get { return m_bTrimFields; }
+ set { m_bTrimFields = value; }
+ }
+
+ private string m_strNewLineSeq = "\r\n";
+ public string NewLineSequence
+ {
+ get { return m_strNewLineSeq; }
+ set
+ {
+ if(value == null) throw new ArgumentNullException("value");
+ m_strNewLineSeq = value;
+ }
+ }
+ }
+
+ public sealed class CsvStreamReaderEx
+ {
+ private CharStream m_sChars;
+ private CsvOptions m_opt;
+
+ public CsvStreamReaderEx(string strData)
+ {
+ Init(strData, null);
+ }
+
+ public CsvStreamReaderEx(string strData, CsvOptions opt)
+ {
+ Init(strData, opt);
+ }
+
+ private void Init(string strData, CsvOptions opt)
+ {
+ if(strData == null) throw new ArgumentNullException("strData");
+
+ m_opt = (opt ?? new CsvOptions());
+
+ string strInput = strData;
+
+ // Normalize to Unix "\n" right now; the new lines are
+ // converted back in the <c>AddField</c> method
+ strInput = StrUtil.NormalizeNewLines(strInput, false);
+
+ strInput = strInput.Trim(new char[] { (char)0 });
+
+ m_sChars = new CharStream(strInput);
+ }
+
+ public string[] ReadLine()
+ {
+ char chFirst = m_sChars.PeekChar();
+ if(chFirst == char.MinValue) return null;
+
+ List<string> v = new List<string>();
+ StringBuilder sb = new StringBuilder();
+ bool bInText = false;
+
+ char chFS = m_opt.FieldSeparator, chRS = m_opt.RecordSeparator;
+ char chTQ = m_opt.TextQualifier;
+
+ while(true)
+ {
+ char ch = m_sChars.ReadChar();
+ if(ch == char.MinValue) break;
+
+ Debug.Assert(ch != '\r'); // Was normalized to Unix "\n"
+
+ if((ch == '\\') && m_opt.BackslashIsEscape)
+ {
+ char chEsc = m_sChars.ReadChar();
+ if(chEsc == char.MinValue) break;
+
+ if(chEsc == 'n') sb.Append('\n');
+ else if(chEsc == 'r') sb.Append('\r');
+ else if(chEsc == 't') sb.Append('\t');
+ else if(chEsc == 'u')
+ {
+ char chNum1 = m_sChars.ReadChar();
+ char chNum2 = m_sChars.ReadChar();
+ char chNum3 = m_sChars.ReadChar();
+ char chNum4 = m_sChars.ReadChar();
+ if(chNum4 != char.MinValue) // Implies the others
+ {
+ StringBuilder sbNum = new StringBuilder();
+ sbNum.Append(chNum3); sbNum.Append(chNum4); // Little
+ sbNum.Append(chNum1); sbNum.Append(chNum2); // Endian
+
+ byte[] pbNum = MemUtil.HexStringToByteArray(sbNum.ToString());
+ ushort usNum = MemUtil.BytesToUInt16(pbNum);
+
+ sb.Append((char)usNum);
+ }
+ }
+ else sb.Append(chEsc);
+ }
+ else if(ch == chTQ)
+ {
+ if(!bInText) bInText = true;
+ else // bInText
+ {
+ char chNext = m_sChars.PeekChar();
+ if(chNext == chTQ)
+ {
+ m_sChars.ReadChar();
+ sb.Append(chTQ);
+ }
+ else bInText = false;
+ }
+ }
+ else if((ch == chRS) && !bInText) break;
+ else if(bInText) sb.Append(ch);
+ else if(ch == chFS)
+ {
+ AddField(v, sb.ToString());
+ if(sb.Length > 0) sb.Remove(0, sb.Length);
+ }
+ else sb.Append(ch);
+ }
+ // Debug.Assert(!bInText);
+ AddField(v, sb.ToString());
+
+ return v.ToArray();
+ }
+
+ private void AddField(List<string> v, string strField)
+ {
+ // Escape characters might have been used to insert
+ // new lines that might not conform to Unix "\n"
+ strField = StrUtil.NormalizeNewLines(strField, false);
+
+ // Transform to final form of new lines
+ strField = strField.Replace("\n", m_opt.NewLineSequence);
+
+ if(m_opt.TrimFields) strField = strField.Trim();
+
+ v.Add(strField);
+ }
+ }
+}
diff --git a/KeePass/DataExchange/FileFormatPool.cs b/KeePass/DataExchange/FileFormatPool.cs
index 1ee310a..83ebfb5 100644
--- a/KeePass/DataExchange/FileFormatPool.cs
+++ b/KeePass/DataExchange/FileFormatPool.cs
@@ -98,7 +98,7 @@ namespace KeePass.DataExchange
Debug.Assert(m_vFormats == null);
m_vFormats = new List<FileFormatProvider>();
- m_vFormats.Add(new KeePassCsv1x());
+ // m_vFormats.Add(new KeePassCsv1x());
m_vFormats.Add(new KeePassKdb1x());
m_vFormats.Add(new KeePassKdb2x());
m_vFormats.Add(new KeePassKdb2xRepair());
diff --git a/KeePass/DataExchange/FileFormatProvider.cs b/KeePass/DataExchange/FileFormatProvider.cs
index 0eaae9b..eb74574 100644
--- a/KeePass/DataExchange/FileFormatProvider.cs
+++ b/KeePass/DataExchange/FileFormatProvider.cs
@@ -43,6 +43,9 @@ namespace KeePass.DataExchange
/// <summary>
/// Default file name extension, without leading dot.
+ /// If there are multiple default/equivalent extensions
+ /// (like e.g. "html" and "htm"), specify all of them
+ /// separated by a '|' (e.g. "html|htm").
/// </summary>
public virtual string DefaultExtension
{
diff --git a/KeePass/DataExchange/Formats/AmpXml250.cs b/KeePass/DataExchange/Formats/AmpXml250.cs
index 0170fe5..73d73ef 100644
--- a/KeePass/DataExchange/Formats/AmpXml250.cs
+++ b/KeePass/DataExchange/Formats/AmpXml250.cs
@@ -145,6 +145,7 @@ namespace KeePass.DataExchange.Formats
{
DateTime dt = DateTime.Parse(strInner);
pe.ExpiryTime = dt;
+ pe.Expires = true;
}
catch(Exception) { }
}
diff --git a/KeePass/DataExchange/Formats/GenericCsv.cs b/KeePass/DataExchange/Formats/GenericCsv.cs
index 06f3dec..440dfd9 100644
--- a/KeePass/DataExchange/Formats/GenericCsv.cs
+++ b/KeePass/DataExchange/Formats/GenericCsv.cs
@@ -42,7 +42,7 @@ namespace KeePass.DataExchange.Formats
public override string DefaultExtension { get { return @"*"; } }
public override string ApplicationGroup { get { return KPRes.General; } }
- public override bool ImportAppendsToRootGroupOnly { get { return true; } }
+ public override bool ImportAppendsToRootGroupOnly { get { return false; } }
public override Image SmallIcon
{
@@ -56,9 +56,9 @@ namespace KeePass.DataExchange.Formats
byte[] pbData = br.ReadBytes((int)sInput.Length);
br.Close();
- ImportCsvForm csv = new ImportCsvForm();
- csv.InitEx(pwStorage, pbData);
- UIUtil.ShowDialogAndDestroy(csv);
+ CsvImportForm dlg = new CsvImportForm();
+ dlg.InitEx(pwStorage, pbData);
+ UIUtil.ShowDialogAndDestroy(dlg);
}
}
}
diff --git a/KeePass/DataExchange/Formats/KeePassHtml2x.cs b/KeePass/DataExchange/Formats/KeePassHtml2x.cs
index 8a106db..7d9ffd0 100644
--- a/KeePass/DataExchange/Formats/KeePassHtml2x.cs
+++ b/KeePass/DataExchange/Formats/KeePassHtml2x.cs
@@ -40,7 +40,7 @@ namespace KeePass.DataExchange.Formats
public override bool SupportsExport { get { return true; } }
public override string FormatName { get { return KPRes.CustomizableHtml; } }
- public override string DefaultExtension { get { return "html"; } }
+ public override string DefaultExtension { get { return @"html|htm"; } }
public override string ApplicationGroup { get { return KPRes.General; } }
public override Image SmallIcon
diff --git a/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs b/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs
index e47064f..e6ca8f4 100644
--- a/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs
+++ b/KeePass/DataExchange/Formats/MozillaBookmarksHtml100.cs
@@ -41,7 +41,7 @@ namespace KeePass.DataExchange.Formats
public override bool SupportsExport { get { return false; } }
public override string FormatName { get { return "Mozilla Bookmarks HTML"; } }
- public override string DefaultExtension { get { return "html"; } }
+ public override string DefaultExtension { get { return @"html|htm"; } }
public override string ApplicationGroup { get { return KPRes.Browser; } }
public override bool ImportAppendsToRootGroupOnly { get { return true; } }
diff --git a/KeePass/DataExchange/Formats/PpKeeperHtml270.cs b/KeePass/DataExchange/Formats/PpKeeperHtml270.cs
index b77478d..7f3e40e 100644
--- a/KeePass/DataExchange/Formats/PpKeeperHtml270.cs
+++ b/KeePass/DataExchange/Formats/PpKeeperHtml270.cs
@@ -41,7 +41,7 @@ namespace KeePass.DataExchange.Formats
public override bool SupportsExport { get { return false; } }
public override string FormatName { get { return "Passphrase Keeper HTML"; } }
- public override string DefaultExtension { get { return "html"; } }
+ public override string DefaultExtension { get { return @"html|htm"; } }
public override string ApplicationGroup { get { return KPRes.PasswordManagers; } }
public override bool ImportAppendsToRootGroupOnly { get { return true; } }
diff --git a/KeePass/DataExchange/Formats/RoboFormHtml69.cs b/KeePass/DataExchange/Formats/RoboFormHtml69.cs
index 1eb1eee..c9bc77b 100644
--- a/KeePass/DataExchange/Formats/RoboFormHtml69.cs
+++ b/KeePass/DataExchange/Formats/RoboFormHtml69.cs
@@ -33,14 +33,14 @@ using KeePassLib.Utility;
namespace KeePass.DataExchange.Formats
{
- // 6.9.82
+ // 6.9.82-7.7.0+
internal sealed class RoboFormHtml69 : FileFormatProvider
{
public override bool SupportsImport { get { return true; } }
public override bool SupportsExport { get { return false; } }
public override string FormatName { get { return "RoboForm HTML (PassCards)"; } }
- public override string DefaultExtension { get { return "html"; } }
+ public override string DefaultExtension { get { return @"html|htm"; } }
public override string ApplicationGroup { get { return KPRes.PasswordManagers; } }
public override bool ImportAppendsToRootGroupOnly { get { return false; } }
@@ -127,13 +127,13 @@ namespace KeePass.DataExchange.Formats
string strKeyMapped = ImportUtil.MapNameToStandardField(strKey, true);
if((strKeyMapped == PwDefs.TitleField) ||
(strKeyMapped == PwDefs.UrlField) ||
- (strKeyMapped.Length == 0) ||
- (pe.Strings.ReadSafe(strKeyMapped).Length > 0))
+ (strKeyMapped.Length == 0))
strKeyMapped = strKey;
- pe.Strings.Set(strKeyMapped, new ProtectedString(
- pwStorage.MemoryProtection.GetProtection(strKeyMapped),
- strValue));
+ // pe.Strings.Set(strKeyMapped, new ProtectedString(
+ // pwStorage.MemoryProtection.GetProtection(strKeyMapped),
+ // strValue));
+ ImportUtil.AppendToField(pe, strKeyMapped, strValue, pwStorage);
nOffset = nValueTD + 1;
}
diff --git a/KeePass/DataExchange/Formats/Spamex20070328.cs b/KeePass/DataExchange/Formats/Spamex20070328.cs
index 1dfb9a9..5e8686a 100644
--- a/KeePass/DataExchange/Formats/Spamex20070328.cs
+++ b/KeePass/DataExchange/Formats/Spamex20070328.cs
@@ -40,7 +40,7 @@ using KeePassLib.Utility;
namespace KeePass.DataExchange.Formats
{
- // 2007-03-28
+ // Originally written on 2007-03-28, updated on 2012-04-15
internal sealed class Spamex20070328 : FileFormatProvider
{
public override bool SupportsImport { get { return true; } }
@@ -201,7 +201,7 @@ namespace KeePass.DataExchange.Formats
pe.Strings.Set(PwDefs.PasswordField, new ProtectedString(
pwStorage.MemoryProtection.ProtectPassword, str));
- str = StrUtil.GetStringBetween(strPage, 0, "Site URL : <b>", "</b>");
+ str = StrUtil.GetStringBetween(strPage, 0, "Site Domain : <b>", "</b>");
if(str.StartsWith("<b>")) str = str.Substring(3, str.Length - 3);
pe.Strings.Set(PwDefs.UrlField, new ProtectedString(
pwStorage.MemoryProtection.ProtectUrl, str));
diff --git a/KeePass/DataExchange/ImportUtil.cs b/KeePass/DataExchange/ImportUtil.cs
index b1386ab..61e5128 100644
--- a/KeePass/DataExchange/ImportUtil.cs
+++ b/KeePass/DataExchange/ImportUtil.cs
@@ -360,16 +360,18 @@ namespace KeePass.DataExchange
"service", "servicename", "service name",
"head", "heading", "card", "product", "provider", "bank",
+ // Non-English names
"seite"
};
private static readonly string[] m_vUserNames = {
- "user", "name", "user name", "username",
+ "user", "name", "user name", "username", "login name",
"email", "e-mail", "id", "userid", "user id",
"login", "form_loginname", "wpname", "mail",
- "loginid", "login id", "first name", "last name",
- "card#",
+ "loginid", "login id", "log",
+ "first name", "last name", "card#",
+ // Non-English names
"nom"
};
@@ -379,7 +381,7 @@ namespace KeePass.DataExchange
"secret", "secret word",
"key", "keyword", "key word", "keyphrase", "key phrase",
"form_pw", "wppassword", "pin", "pwd", "pw", "pword",
- "serial", "serial#",
+ "p", "serial", @"serial#"
};
private static readonly string[] m_vUrls = {
@@ -387,6 +389,7 @@ namespace KeePass.DataExchange
"host", "address", "hyper ref", "href",
"web", "website", "web site", "site",
+ // Non-English names
"ort"
};
diff --git a/KeePass/DataExchange/Kdb3Manager.cs b/KeePass/DataExchange/Kdb3Manager.cs
index bc5e597..408ea0c 100644
--- a/KeePass/DataExchange/Kdb3Manager.cs
+++ b/KeePass/DataExchange/Kdb3Manager.cs
@@ -492,7 +492,7 @@ namespace KeePass.DataExchange
}
/// <summary>
- /// Manager class for Kdb3 files. It can load/save databases, add/change/delete
+ /// Manager class for KDB3 files. It can load/save databases, add/change/delete
/// groups and entries, check for KeePassLibC library existence and version, etc.
/// </summary>
public sealed class Kdb3Manager
@@ -518,8 +518,6 @@ namespace KeePass.DataExchange
private static extern UInt32 GetKeePassVersion64();
/// <summary>
/// Get the KeePass version, which the KeePassLibC library supports.
- /// Examples: KeePass version 1.05 is encoded as 0x01000501, version
- /// 1.06 is 0x01000601.
/// </summary>
public static UInt32 KeePassVersion
{
diff --git a/KeePass/Ecas/EcasDefaultActionProvider.cs b/KeePass/Ecas/EcasDefaultActionProvider.cs
index a9b07c8..65d36c0 100644
--- a/KeePass/Ecas/EcasDefaultActionProvider.cs
+++ b/KeePass/Ecas/EcasDefaultActionProvider.cs
@@ -51,7 +51,8 @@ namespace KeePass.Ecas
0x9E, 0xEF, 0x2E, 0xBA, 0xCB, 0x6E, 0xE4, 0xC7 }),
KPRes.ExecuteCmdLineUrl, PwIcon.Console, new EcasParameter[] {
new EcasParameter(KPRes.FileOrUrl, EcasValueType.String, null),
- new EcasParameter(KPRes.Arguments, EcasValueType.String, null) },
+ new EcasParameter(KPRes.Arguments, EcasValueType.String, null),
+ new EcasParameter(KPRes.WaitForExit, EcasValueType.Bool, null) },
ExecuteShellCmd));
m_actions.Add(new EcasActionType(new PwUuid(new byte[] {
@@ -145,13 +146,28 @@ namespace KeePass.Ecas
{
string strCmd = EcasUtil.GetParamString(a.Parameters, 0, true, true);
string strArgs = EcasUtil.GetParamString(a.Parameters, 1, true, true);
+ bool bWait = StrUtil.StringToBool(EcasUtil.GetParamString(a.Parameters,
+ 2, string.Empty));
if(string.IsNullOrEmpty(strCmd)) return;
try
{
- if(string.IsNullOrEmpty(strArgs)) Process.Start(strCmd);
- else Process.Start(strCmd, strArgs);
+ Process p;
+ if(string.IsNullOrEmpty(strArgs)) p = Process.Start(strCmd);
+ else p = Process.Start(strCmd, strArgs);
+
+ if((p != null) && bWait)
+ {
+ Program.MainForm.UIBlockInteraction(true);
+ MessageService.ExternalIncrementMessageCount();
+
+ try { p.WaitForExit(); }
+ catch(Exception) { Debug.Assert(false); }
+
+ MessageService.ExternalDecrementMessageCount();
+ Program.MainForm.UIBlockInteraction(false);
+ }
}
catch(Exception e)
{
diff --git a/KeePass/Ecas/EcasDefaultConditionProvider.cs b/KeePass/Ecas/EcasDefaultConditionProvider.cs
index ed7d571..43dc23e 100644
--- a/KeePass/Ecas/EcasDefaultConditionProvider.cs
+++ b/KeePass/Ecas/EcasDefaultConditionProvider.cs
@@ -27,6 +27,7 @@ using System.Net.NetworkInformation;
using KeePass.Resources;
using KeePassLib;
+using KeePassLib.Serialization;
namespace KeePass.Ecas
{
@@ -58,8 +59,8 @@ namespace KeePass.Ecas
0xCB, 0x4A, 0x9E, 0x34, 0x56, 0x8C, 0x4C, 0x95,
0xAD, 0x67, 0x4D, 0x1C, 0xA1, 0x04, 0x19, 0xBC }),
KPRes.FileExists, PwIcon.PaperReady, new EcasParameter[] {
- new EcasParameter(KPRes.File, EcasValueType.String, null) },
- IsMatchFile));
+ new EcasParameter(KPRes.FileOrUrl, EcasValueType.String, null) },
+ IsMatchFileExists));
m_conditions.Add(new EcasConditionType(new PwUuid(new byte[] {
0x2A, 0x22, 0x83, 0xA8, 0x9D, 0x13, 0x41, 0xE8,
@@ -109,12 +110,18 @@ namespace KeePass.Ecas
return EcasUtil.CompareStrings(str, strValue, uCompareType);
}
- private static bool IsMatchFile(EcasCondition c, EcasContext ctx)
+ private static bool IsMatchFileExists(EcasCondition c, EcasContext ctx)
{
string strFile = EcasUtil.GetParamString(c.Parameters, 0, true);
if(string.IsNullOrEmpty(strFile)) return true;
- try { return File.Exists(strFile); }
+ try
+ {
+ // return File.Exists(strFile);
+
+ IOConnectionInfo ioc = IOConnectionInfo.FromPath(strFile);
+ return IOConnection.FileExists(ioc);
+ }
catch(Exception) { }
return false;
diff --git a/KeePass/Ecas/EcasDefaultEventProvider.cs b/KeePass/Ecas/EcasDefaultEventProvider.cs
index 01194ed..30455bc 100644
--- a/KeePass/Ecas/EcasDefaultEventProvider.cs
+++ b/KeePass/Ecas/EcasDefaultEventProvider.cs
@@ -43,6 +43,14 @@ namespace KeePass.Ecas
0xB3, 0xA8, 0xFD, 0xFE, 0x78, 0x13, 0x4A, 0x6A,
0x9C, 0x5D, 0xD5, 0xBA, 0x84, 0x3A, 0x9B, 0x8E
});
+ public static readonly PwUuid ClosingDatabaseFilePre = new PwUuid(new byte[] {
+ 0x8C, 0xEA, 0xDE, 0x9A, 0xA8, 0x17, 0x49, 0x19,
+ 0xA3, 0x2F, 0xF4, 0x1E, 0x3B, 0x1D, 0xEC, 0x49
+ });
+ public static readonly PwUuid ClosingDatabaseFilePost = new PwUuid(new byte[] {
+ 0x94, 0xFA, 0x70, 0xE5, 0xB1, 0x3F, 0x41, 0x26,
+ 0xA6, 0x4E, 0x06, 0x4F, 0xD8, 0xC3, 0x6C, 0x95
+ });
public static readonly PwUuid CopiedEntryInfo = new PwUuid(new byte[] {
0x3F, 0x7E, 0x5E, 0xC6, 0x2A, 0x54, 0x4C, 0x58,
0x95, 0x44, 0x85, 0xFB, 0xF2, 0x6F, 0x56, 0xDC
@@ -99,6 +107,12 @@ namespace KeePass.Ecas
m_events.Add(new EcasEventType(EcasEventIDs.SavedDatabaseFile,
KPRes.SavedDatabaseFile, PwIcon.Disk, epFileFilter,
IsMatchTextEvent));
+ m_events.Add(new EcasEventType(EcasEventIDs.ClosingDatabaseFilePre,
+ KPRes.ClosingDatabaseFile + " (" + KPRes.SavingPre + ")",
+ PwIcon.PaperQ, epFileFilter, IsMatchTextEvent));
+ m_events.Add(new EcasEventType(EcasEventIDs.ClosingDatabaseFilePost,
+ KPRes.ClosingDatabaseFile + " (" + KPRes.SavingPost + ")",
+ PwIcon.PaperQ, epFileFilter, IsMatchTextEvent));
m_events.Add(new EcasEventType(EcasEventIDs.CopiedEntryInfo,
KPRes.CopiedEntryData, PwIcon.ClipboardReady, epValueFilter,
IsMatchTextEvent));
diff --git a/KeePass/Forms/AboutForm.cs b/KeePass/Forms/AboutForm.cs
index 60fc343..67ba82f 100644
--- a/KeePass/Forms/AboutForm.cs
+++ b/KeePass/Forms/AboutForm.cs
@@ -73,7 +73,7 @@ namespace KeePass.Forms
m_lvComponents.Columns[0].Width = nWidth;
m_lvComponents.Columns[1].Width = nWidth + nMod;
- UIUtil.SetExplorerTheme(m_lvComponents.Handle);
+ UIUtil.SetExplorerTheme(m_lvComponents, false);
}
private void OnFormClosed(object sender, FormClosedEventArgs e)
diff --git a/KeePass/Forms/AutoTypeCtxForm.cs b/KeePass/Forms/AutoTypeCtxForm.cs
index 79a2eb2..ed572f0 100644
--- a/KeePass/Forms/AutoTypeCtxForm.cs
+++ b/KeePass/Forms/AutoTypeCtxForm.cs
@@ -78,9 +78,7 @@ namespace KeePass.Forms
this.MinimumSize = new Size(550, 300);
- UIUtil.SetExplorerTheme(m_lvItems.Handle);
- if(UISystemFonts.ListFont != null)
- m_lvItems.Font = UISystemFonts.ListFont;
+ UIUtil.SetExplorerTheme(m_lvItems, true);
if(m_ilIcons != null) m_lvItems.SmallImageList = m_ilIcons;
else { Debug.Assert(false); m_ilIcons = new ImageList(); }
diff --git a/KeePass/Forms/ColumnsForm.cs b/KeePass/Forms/ColumnsForm.cs
index e6aefc3..b8ea3ee 100644
--- a/KeePass/Forms/ColumnsForm.cs
+++ b/KeePass/Forms/ColumnsForm.cs
@@ -66,7 +66,7 @@ namespace KeePass.Forms
m_lvColumns.Columns.Add(KPRes.Asterisks + " ***", nWidth);
m_lvColumns.Columns.Add(KPRes.Toggle + " ***", nWidth);
- UIUtil.SetExplorerTheme(m_lvColumns.Handle);
+ UIUtil.SetExplorerTheme(m_lvColumns, false);
ThreadPool.QueueUserWorkItem(new WaitCallback(FillColumnsList));
diff --git a/KeePass/Forms/CsvImportForm.Designer.cs b/KeePass/Forms/CsvImportForm.Designer.cs
new file mode 100644
index 0000000..29c899c
--- /dev/null
+++ b/KeePass/Forms/CsvImportForm.Designer.cs
@@ -0,0 +1,564 @@
+namespace KeePass.Forms
+{
+ partial class CsvImportForm
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if(disposing && (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.m_tabMain = new System.Windows.Forms.TabControl();
+ this.m_tabEnc = new System.Windows.Forms.TabPage();
+ this.m_rtbEncPreview = new System.Windows.Forms.RichTextBox();
+ this.m_lblEncPreview = new System.Windows.Forms.Label();
+ this.m_cmbEnc = new System.Windows.Forms.ComboBox();
+ this.m_lblEnc = new System.Windows.Forms.Label();
+ this.m_tabStructure = new System.Windows.Forms.TabPage();
+ this.m_grpSem = new System.Windows.Forms.GroupBox();
+ this.m_grpFieldAdd = new System.Windows.Forms.GroupBox();
+ this.m_btnFieldAdd = new System.Windows.Forms.Button();
+ this.m_linkFieldFormat = new System.Windows.Forms.LinkLabel();
+ this.m_cmbFieldFormat = new System.Windows.Forms.ComboBox();
+ this.m_lblFieldFormat = new System.Windows.Forms.Label();
+ this.m_tbFieldName = new System.Windows.Forms.TextBox();
+ this.m_lblFieldName = new System.Windows.Forms.Label();
+ this.m_cmbFieldType = new System.Windows.Forms.ComboBox();
+ this.m_lblFieldType = new System.Windows.Forms.Label();
+ this.m_btnFieldMoveDown = new System.Windows.Forms.Button();
+ this.m_btnFieldMoveUp = new System.Windows.Forms.Button();
+ this.m_btnFieldDel = new System.Windows.Forms.Button();
+ this.m_lblFields = new System.Windows.Forms.Label();
+ this.m_lvFields = new KeePass.UI.CustomListViewEx();
+ this.m_grpSyntax = new System.Windows.Forms.GroupBox();
+ this.m_cbIgnoreFirst = new System.Windows.Forms.CheckBox();
+ this.m_cbTrim = new System.Windows.Forms.CheckBox();
+ this.m_cmbTextQual = new System.Windows.Forms.ComboBox();
+ this.m_lblTextQual = new System.Windows.Forms.Label();
+ this.m_cbBackEscape = new System.Windows.Forms.CheckBox();
+ this.m_lblFieldSep = new System.Windows.Forms.Label();
+ this.m_cmbFieldSep = new System.Windows.Forms.ComboBox();
+ this.m_cmbRecSep = new System.Windows.Forms.ComboBox();
+ this.m_lblRecSep = new System.Windows.Forms.Label();
+ this.m_tabPreview = new System.Windows.Forms.TabPage();
+ this.m_lvImportPreview = new KeePass.UI.CustomListViewEx();
+ this.m_btnOK = new System.Windows.Forms.Button();
+ this.m_btnCancel = new System.Windows.Forms.Button();
+ this.m_btnTabBack = new System.Windows.Forms.Button();
+ this.m_btnTabNext = new System.Windows.Forms.Button();
+ this.m_tabMain.SuspendLayout();
+ this.m_tabEnc.SuspendLayout();
+ this.m_tabStructure.SuspendLayout();
+ this.m_grpSem.SuspendLayout();
+ this.m_grpFieldAdd.SuspendLayout();
+ this.m_grpSyntax.SuspendLayout();
+ this.m_tabPreview.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // m_tabMain
+ //
+ this.m_tabMain.Controls.Add(this.m_tabEnc);
+ this.m_tabMain.Controls.Add(this.m_tabStructure);
+ this.m_tabMain.Controls.Add(this.m_tabPreview);
+ this.m_tabMain.Location = new System.Drawing.Point(12, 12);
+ this.m_tabMain.Name = "m_tabMain";
+ this.m_tabMain.SelectedIndex = 0;
+ this.m_tabMain.Size = new System.Drawing.Size(684, 462);
+ this.m_tabMain.TabIndex = 2;
+ this.m_tabMain.SelectedIndexChanged += new System.EventHandler(this.OnTabMainSelectedIndexChanged);
+ //
+ // m_tabEnc
+ //
+ this.m_tabEnc.Controls.Add(this.m_rtbEncPreview);
+ this.m_tabEnc.Controls.Add(this.m_lblEncPreview);
+ this.m_tabEnc.Controls.Add(this.m_cmbEnc);
+ this.m_tabEnc.Controls.Add(this.m_lblEnc);
+ this.m_tabEnc.Location = new System.Drawing.Point(4, 22);
+ this.m_tabEnc.Name = "m_tabEnc";
+ this.m_tabEnc.Padding = new System.Windows.Forms.Padding(3);
+ this.m_tabEnc.Size = new System.Drawing.Size(676, 436);
+ this.m_tabEnc.TabIndex = 0;
+ this.m_tabEnc.Text = "Encoding";
+ this.m_tabEnc.UseVisualStyleBackColor = true;
+ //
+ // m_rtbEncPreview
+ //
+ this.m_rtbEncPreview.AcceptsTab = true;
+ this.m_rtbEncPreview.DetectUrls = false;
+ this.m_rtbEncPreview.Location = new System.Drawing.Point(9, 60);
+ this.m_rtbEncPreview.Name = "m_rtbEncPreview";
+ this.m_rtbEncPreview.ReadOnly = true;
+ this.m_rtbEncPreview.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical;
+ this.m_rtbEncPreview.Size = new System.Drawing.Size(657, 366);
+ this.m_rtbEncPreview.TabIndex = 3;
+ this.m_rtbEncPreview.Text = "";
+ //
+ // m_lblEncPreview
+ //
+ this.m_lblEncPreview.AutoSize = true;
+ this.m_lblEncPreview.Location = new System.Drawing.Point(6, 44);
+ this.m_lblEncPreview.Name = "m_lblEncPreview";
+ this.m_lblEncPreview.Size = new System.Drawing.Size(71, 13);
+ this.m_lblEncPreview.TabIndex = 2;
+ this.m_lblEncPreview.Text = "Text preview:";
+ //
+ // m_cmbEnc
+ //
+ this.m_cmbEnc.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.m_cmbEnc.FormattingEnabled = true;
+ this.m_cmbEnc.Location = new System.Drawing.Point(91, 13);
+ this.m_cmbEnc.Name = "m_cmbEnc";
+ this.m_cmbEnc.Size = new System.Drawing.Size(298, 21);
+ this.m_cmbEnc.TabIndex = 1;
+ this.m_cmbEnc.SelectedIndexChanged += new System.EventHandler(this.OnEncSelectedIndexChanged);
+ //
+ // m_lblEnc
+ //
+ this.m_lblEnc.AutoSize = true;
+ this.m_lblEnc.Location = new System.Drawing.Point(6, 16);
+ this.m_lblEnc.Name = "m_lblEnc";
+ this.m_lblEnc.Size = new System.Drawing.Size(78, 13);
+ this.m_lblEnc.TabIndex = 0;
+ this.m_lblEnc.Text = "Text encoding:";
+ //
+ // m_tabStructure
+ //
+ this.m_tabStructure.Controls.Add(this.m_grpSem);
+ this.m_tabStructure.Controls.Add(this.m_grpSyntax);
+ this.m_tabStructure.Location = new System.Drawing.Point(4, 22);
+ this.m_tabStructure.Name = "m_tabStructure";
+ this.m_tabStructure.Padding = new System.Windows.Forms.Padding(3);
+ this.m_tabStructure.Size = new System.Drawing.Size(676, 436);
+ this.m_tabStructure.TabIndex = 1;
+ this.m_tabStructure.Text = "Structure";
+ this.m_tabStructure.UseVisualStyleBackColor = true;
+ //
+ // m_grpSem
+ //
+ this.m_grpSem.Controls.Add(this.m_grpFieldAdd);
+ this.m_grpSem.Controls.Add(this.m_btnFieldMoveDown);
+ this.m_grpSem.Controls.Add(this.m_btnFieldMoveUp);
+ this.m_grpSem.Controls.Add(this.m_btnFieldDel);
+ this.m_grpSem.Controls.Add(this.m_lblFields);
+ this.m_grpSem.Controls.Add(this.m_lvFields);
+ this.m_grpSem.Location = new System.Drawing.Point(6, 140);
+ this.m_grpSem.Name = "m_grpSem";
+ this.m_grpSem.Size = new System.Drawing.Size(662, 290);
+ this.m_grpSem.TabIndex = 1;
+ this.m_grpSem.TabStop = false;
+ this.m_grpSem.Text = "Semantics";
+ //
+ // m_grpFieldAdd
+ //
+ this.m_grpFieldAdd.Controls.Add(this.m_btnFieldAdd);
+ this.m_grpFieldAdd.Controls.Add(this.m_linkFieldFormat);
+ this.m_grpFieldAdd.Controls.Add(this.m_cmbFieldFormat);
+ this.m_grpFieldAdd.Controls.Add(this.m_lblFieldFormat);
+ this.m_grpFieldAdd.Controls.Add(this.m_tbFieldName);
+ this.m_grpFieldAdd.Controls.Add(this.m_lblFieldName);
+ this.m_grpFieldAdd.Controls.Add(this.m_cmbFieldType);
+ this.m_grpFieldAdd.Controls.Add(this.m_lblFieldType);
+ this.m_grpFieldAdd.Location = new System.Drawing.Point(380, 143);
+ this.m_grpFieldAdd.Name = "m_grpFieldAdd";
+ this.m_grpFieldAdd.Size = new System.Drawing.Size(272, 137);
+ this.m_grpFieldAdd.TabIndex = 5;
+ this.m_grpFieldAdd.TabStop = false;
+ this.m_grpFieldAdd.Text = "Add field";
+ //
+ // m_btnFieldAdd
+ //
+ this.m_btnFieldAdd.Location = new System.Drawing.Point(188, 103);
+ this.m_btnFieldAdd.Name = "m_btnFieldAdd";
+ this.m_btnFieldAdd.Size = new System.Drawing.Size(75, 23);
+ this.m_btnFieldAdd.TabIndex = 7;
+ this.m_btnFieldAdd.Text = "&Add";
+ this.m_btnFieldAdd.UseVisualStyleBackColor = true;
+ this.m_btnFieldAdd.Click += new System.EventHandler(this.OnBtnFieldAdd);
+ //
+ // m_linkFieldFormat
+ //
+ this.m_linkFieldFormat.AutoSize = true;
+ this.m_linkFieldFormat.Location = new System.Drawing.Point(234, 75);
+ this.m_linkFieldFormat.Name = "m_linkFieldFormat";
+ this.m_linkFieldFormat.Size = new System.Drawing.Size(29, 13);
+ this.m_linkFieldFormat.TabIndex = 6;
+ this.m_linkFieldFormat.TabStop = true;
+ this.m_linkFieldFormat.Text = "Help";
+ this.m_linkFieldFormat.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OnFieldFormatLinkClicked);
+ //
+ // m_cmbFieldFormat
+ //
+ this.m_cmbFieldFormat.FormattingEnabled = true;
+ this.m_cmbFieldFormat.Location = new System.Drawing.Point(74, 72);
+ this.m_cmbFieldFormat.Name = "m_cmbFieldFormat";
+ this.m_cmbFieldFormat.Size = new System.Drawing.Size(154, 21);
+ this.m_cmbFieldFormat.TabIndex = 5;
+ //
+ // m_lblFieldFormat
+ //
+ this.m_lblFieldFormat.AutoSize = true;
+ this.m_lblFieldFormat.Location = new System.Drawing.Point(6, 75);
+ this.m_lblFieldFormat.Name = "m_lblFieldFormat";
+ this.m_lblFieldFormat.Size = new System.Drawing.Size(42, 13);
+ this.m_lblFieldFormat.TabIndex = 4;
+ this.m_lblFieldFormat.Text = "Format:";
+ //
+ // m_tbFieldName
+ //
+ this.m_tbFieldName.Location = new System.Drawing.Point(74, 46);
+ this.m_tbFieldName.Name = "m_tbFieldName";
+ this.m_tbFieldName.Size = new System.Drawing.Size(189, 20);
+ this.m_tbFieldName.TabIndex = 3;
+ //
+ // m_lblFieldName
+ //
+ this.m_lblFieldName.AutoSize = true;
+ this.m_lblFieldName.Location = new System.Drawing.Point(6, 49);
+ this.m_lblFieldName.Name = "m_lblFieldName";
+ this.m_lblFieldName.Size = new System.Drawing.Size(38, 13);
+ this.m_lblFieldName.TabIndex = 2;
+ this.m_lblFieldName.Text = "Name:";
+ //
+ // m_cmbFieldType
+ //
+ this.m_cmbFieldType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.m_cmbFieldType.FormattingEnabled = true;
+ this.m_cmbFieldType.Location = new System.Drawing.Point(74, 19);
+ this.m_cmbFieldType.Name = "m_cmbFieldType";
+ this.m_cmbFieldType.Size = new System.Drawing.Size(189, 21);
+ this.m_cmbFieldType.TabIndex = 1;
+ this.m_cmbFieldType.SelectedIndexChanged += new System.EventHandler(this.OnFieldTypeSelectedIndexChanged);
+ //
+ // m_lblFieldType
+ //
+ this.m_lblFieldType.AutoSize = true;
+ this.m_lblFieldType.Location = new System.Drawing.Point(6, 22);
+ this.m_lblFieldType.Name = "m_lblFieldType";
+ this.m_lblFieldType.Size = new System.Drawing.Size(34, 13);
+ this.m_lblFieldType.TabIndex = 0;
+ this.m_lblFieldType.Text = "Type:";
+ //
+ // m_btnFieldMoveDown
+ //
+ this.m_btnFieldMoveDown.Image = global::KeePass.Properties.Resources.B16x16_1DownArrow;
+ this.m_btnFieldMoveDown.Location = new System.Drawing.Point(380, 96);
+ this.m_btnFieldMoveDown.Name = "m_btnFieldMoveDown";
+ this.m_btnFieldMoveDown.Size = new System.Drawing.Size(75, 23);
+ this.m_btnFieldMoveDown.TabIndex = 4;
+ this.m_btnFieldMoveDown.UseVisualStyleBackColor = true;
+ this.m_btnFieldMoveDown.Click += new System.EventHandler(this.OnBtnFieldMoveDown);
+ //
+ // m_btnFieldMoveUp
+ //
+ this.m_btnFieldMoveUp.Image = global::KeePass.Properties.Resources.B16x16_1UpArrow;
+ this.m_btnFieldMoveUp.Location = new System.Drawing.Point(380, 67);
+ this.m_btnFieldMoveUp.Name = "m_btnFieldMoveUp";
+ this.m_btnFieldMoveUp.Size = new System.Drawing.Size(75, 23);
+ this.m_btnFieldMoveUp.TabIndex = 3;
+ this.m_btnFieldMoveUp.UseVisualStyleBackColor = true;
+ this.m_btnFieldMoveUp.Click += new System.EventHandler(this.OnBtnFieldMoveUp);
+ //
+ // m_btnFieldDel
+ //
+ this.m_btnFieldDel.Location = new System.Drawing.Point(380, 38);
+ this.m_btnFieldDel.Name = "m_btnFieldDel";
+ this.m_btnFieldDel.Size = new System.Drawing.Size(75, 23);
+ this.m_btnFieldDel.TabIndex = 2;
+ this.m_btnFieldDel.Text = "&Delete";
+ this.m_btnFieldDel.UseVisualStyleBackColor = true;
+ this.m_btnFieldDel.Click += new System.EventHandler(this.OnBtnFieldDel);
+ //
+ // m_lblFields
+ //
+ this.m_lblFields.AutoSize = true;
+ this.m_lblFields.Location = new System.Drawing.Point(6, 22);
+ this.m_lblFields.Name = "m_lblFields";
+ this.m_lblFields.Size = new System.Drawing.Size(268, 13);
+ this.m_lblFields.TabIndex = 0;
+ this.m_lblFields.Text = "Specify the layout (fields and their order) of the CSV file:";
+ //
+ // m_lvFields
+ //
+ this.m_lvFields.FullRowSelect = true;
+ this.m_lvFields.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.m_lvFields.HideSelection = false;
+ this.m_lvFields.Location = new System.Drawing.Point(9, 38);
+ this.m_lvFields.Name = "m_lvFields";
+ this.m_lvFields.ShowItemToolTips = true;
+ this.m_lvFields.Size = new System.Drawing.Size(365, 242);
+ this.m_lvFields.TabIndex = 1;
+ this.m_lvFields.UseCompatibleStateImageBehavior = false;
+ this.m_lvFields.View = System.Windows.Forms.View.Details;
+ this.m_lvFields.SelectedIndexChanged += new System.EventHandler(this.OnFieldsSelectedIndexChanged);
+ //
+ // m_grpSyntax
+ //
+ this.m_grpSyntax.Controls.Add(this.m_cbIgnoreFirst);
+ this.m_grpSyntax.Controls.Add(this.m_cbTrim);
+ this.m_grpSyntax.Controls.Add(this.m_cmbTextQual);
+ this.m_grpSyntax.Controls.Add(this.m_lblTextQual);
+ this.m_grpSyntax.Controls.Add(this.m_cbBackEscape);
+ this.m_grpSyntax.Controls.Add(this.m_lblFieldSep);
+ this.m_grpSyntax.Controls.Add(this.m_cmbFieldSep);
+ this.m_grpSyntax.Controls.Add(this.m_cmbRecSep);
+ this.m_grpSyntax.Controls.Add(this.m_lblRecSep);
+ this.m_grpSyntax.Location = new System.Drawing.Point(6, 13);
+ this.m_grpSyntax.Name = "m_grpSyntax";
+ this.m_grpSyntax.Size = new System.Drawing.Size(662, 121);
+ this.m_grpSyntax.TabIndex = 0;
+ this.m_grpSyntax.TabStop = false;
+ this.m_grpSyntax.Text = "Syntax";
+ //
+ // m_cbIgnoreFirst
+ //
+ this.m_cbIgnoreFirst.AutoSize = true;
+ this.m_cbIgnoreFirst.Location = new System.Drawing.Point(9, 73);
+ this.m_cbIgnoreFirst.Name = "m_cbIgnoreFirst";
+ this.m_cbIgnoreFirst.Size = new System.Drawing.Size(95, 17);
+ this.m_cbIgnoreFirst.TabIndex = 7;
+ this.m_cbIgnoreFirst.Text = "Ignore first row";
+ this.m_cbIgnoreFirst.UseVisualStyleBackColor = true;
+ //
+ // m_cbTrim
+ //
+ this.m_cbTrim.AutoSize = true;
+ this.m_cbTrim.Checked = true;
+ this.m_cbTrim.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.m_cbTrim.Location = new System.Drawing.Point(9, 96);
+ this.m_cbTrim.Name = "m_cbTrim";
+ this.m_cbTrim.Size = new System.Drawing.Size(331, 17);
+ this.m_cbTrim.TabIndex = 8;
+ this.m_cbTrim.Text = "Remove white space characters from the beginning/end of fields";
+ this.m_cbTrim.UseVisualStyleBackColor = true;
+ //
+ // m_cmbTextQual
+ //
+ this.m_cmbTextQual.FormattingEnabled = true;
+ this.m_cmbTextQual.Location = new System.Drawing.Point(91, 46);
+ this.m_cmbTextQual.Name = "m_cmbTextQual";
+ this.m_cmbTextQual.Size = new System.Drawing.Size(112, 21);
+ this.m_cmbTextQual.TabIndex = 5;
+ this.m_cmbTextQual.SelectedIndexChanged += new System.EventHandler(this.OnTextQualSelectedIndexChanged);
+ this.m_cmbTextQual.TextUpdate += new System.EventHandler(this.OnTextQualTextUpdate);
+ //
+ // m_lblTextQual
+ //
+ this.m_lblTextQual.AutoSize = true;
+ this.m_lblTextQual.Location = new System.Drawing.Point(6, 49);
+ this.m_lblTextQual.Name = "m_lblTextQual";
+ this.m_lblTextQual.Size = new System.Drawing.Size(70, 13);
+ this.m_lblTextQual.TabIndex = 4;
+ this.m_lblTextQual.Text = "Text qualifier:";
+ //
+ // m_cbBackEscape
+ //
+ this.m_cbBackEscape.AutoSize = true;
+ this.m_cbBackEscape.Checked = true;
+ this.m_cbBackEscape.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.m_cbBackEscape.Location = new System.Drawing.Point(248, 48);
+ this.m_cbBackEscape.Name = "m_cbBackEscape";
+ this.m_cbBackEscape.Size = new System.Drawing.Size(192, 17);
+ this.m_cbBackEscape.TabIndex = 6;
+ this.m_cbBackEscape.Text = "Interpret \'\\\' as an escape character";
+ this.m_cbBackEscape.UseVisualStyleBackColor = true;
+ //
+ // m_lblFieldSep
+ //
+ this.m_lblFieldSep.AutoSize = true;
+ this.m_lblFieldSep.Location = new System.Drawing.Point(6, 22);
+ this.m_lblFieldSep.Name = "m_lblFieldSep";
+ this.m_lblFieldSep.Size = new System.Drawing.Size(79, 13);
+ this.m_lblFieldSep.TabIndex = 0;
+ this.m_lblFieldSep.Text = "Field separator:";
+ //
+ // m_cmbFieldSep
+ //
+ this.m_cmbFieldSep.FormattingEnabled = true;
+ this.m_cmbFieldSep.Location = new System.Drawing.Point(91, 19);
+ this.m_cmbFieldSep.Name = "m_cmbFieldSep";
+ this.m_cmbFieldSep.Size = new System.Drawing.Size(112, 21);
+ this.m_cmbFieldSep.TabIndex = 1;
+ this.m_cmbFieldSep.SelectedIndexChanged += new System.EventHandler(this.OnFieldSepSelectedIndexChanged);
+ this.m_cmbFieldSep.TextUpdate += new System.EventHandler(this.OnFieldSepTextUpdate);
+ //
+ // m_cmbRecSep
+ //
+ this.m_cmbRecSep.FormattingEnabled = true;
+ this.m_cmbRecSep.Location = new System.Drawing.Point(343, 19);
+ this.m_cmbRecSep.Name = "m_cmbRecSep";
+ this.m_cmbRecSep.Size = new System.Drawing.Size(112, 21);
+ this.m_cmbRecSep.TabIndex = 3;
+ this.m_cmbRecSep.SelectedIndexChanged += new System.EventHandler(this.OnRecSepSelectedIndexChanged);
+ this.m_cmbRecSep.TextUpdate += new System.EventHandler(this.OnRecSepTextUpdate);
+ //
+ // m_lblRecSep
+ //
+ this.m_lblRecSep.AutoSize = true;
+ this.m_lblRecSep.Location = new System.Drawing.Point(245, 22);
+ this.m_lblRecSep.Name = "m_lblRecSep";
+ this.m_lblRecSep.Size = new System.Drawing.Size(92, 13);
+ this.m_lblRecSep.TabIndex = 2;
+ this.m_lblRecSep.Text = "Record separator:";
+ //
+ // m_tabPreview
+ //
+ this.m_tabPreview.Controls.Add(this.m_lvImportPreview);
+ this.m_tabPreview.Location = new System.Drawing.Point(4, 22);
+ this.m_tabPreview.Name = "m_tabPreview";
+ this.m_tabPreview.Size = new System.Drawing.Size(676, 436);
+ this.m_tabPreview.TabIndex = 2;
+ this.m_tabPreview.Text = "Preview";
+ this.m_tabPreview.UseVisualStyleBackColor = true;
+ //
+ // m_lvImportPreview
+ //
+ this.m_lvImportPreview.FullRowSelect = true;
+ this.m_lvImportPreview.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ this.m_lvImportPreview.HideSelection = false;
+ this.m_lvImportPreview.Location = new System.Drawing.Point(6, 13);
+ this.m_lvImportPreview.Name = "m_lvImportPreview";
+ this.m_lvImportPreview.ShowItemToolTips = true;
+ this.m_lvImportPreview.Size = new System.Drawing.Size(662, 416);
+ this.m_lvImportPreview.TabIndex = 0;
+ this.m_lvImportPreview.UseCompatibleStateImageBehavior = false;
+ this.m_lvImportPreview.View = System.Windows.Forms.View.Details;
+ //
+ // m_btnOK
+ //
+ this.m_btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.m_btnOK.Location = new System.Drawing.Point(540, 480);
+ this.m_btnOK.Name = "m_btnOK";
+ this.m_btnOK.Size = new System.Drawing.Size(75, 23);
+ this.m_btnOK.TabIndex = 0;
+ this.m_btnOK.Text = "&Finish";
+ this.m_btnOK.UseVisualStyleBackColor = true;
+ this.m_btnOK.Click += new System.EventHandler(this.OnBtnOK);
+ //
+ // m_btnCancel
+ //
+ this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.m_btnCancel.Location = new System.Drawing.Point(621, 480);
+ this.m_btnCancel.Name = "m_btnCancel";
+ this.m_btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.m_btnCancel.TabIndex = 1;
+ this.m_btnCancel.Text = "&Cancel";
+ this.m_btnCancel.UseVisualStyleBackColor = true;
+ //
+ // m_btnTabBack
+ //
+ this.m_btnTabBack.Location = new System.Drawing.Point(384, 480);
+ this.m_btnTabBack.Name = "m_btnTabBack";
+ this.m_btnTabBack.Size = new System.Drawing.Size(75, 23);
+ this.m_btnTabBack.TabIndex = 3;
+ this.m_btnTabBack.Text = "< &Back";
+ this.m_btnTabBack.UseVisualStyleBackColor = true;
+ this.m_btnTabBack.Click += new System.EventHandler(this.OnBtnTabBack);
+ //
+ // m_btnTabNext
+ //
+ this.m_btnTabNext.Location = new System.Drawing.Point(459, 480);
+ this.m_btnTabNext.Name = "m_btnTabNext";
+ this.m_btnTabNext.Size = new System.Drawing.Size(75, 23);
+ this.m_btnTabNext.TabIndex = 4;
+ this.m_btnTabNext.Text = "&Next >";
+ this.m_btnTabNext.UseVisualStyleBackColor = true;
+ this.m_btnTabNext.Click += new System.EventHandler(this.OnBtnTabNext);
+ //
+ // CsvImportForm
+ //
+ this.AcceptButton = this.m_btnOK;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.m_btnCancel;
+ this.ClientSize = new System.Drawing.Size(708, 515);
+ this.Controls.Add(this.m_btnTabNext);
+ this.Controls.Add(this.m_btnTabBack);
+ this.Controls.Add(this.m_btnCancel);
+ this.Controls.Add(this.m_btnOK);
+ this.Controls.Add(this.m_tabMain);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "CsvImportForm";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "<>";
+ this.Load += new System.EventHandler(this.OnFormLoad);
+ this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed);
+ this.m_tabMain.ResumeLayout(false);
+ this.m_tabEnc.ResumeLayout(false);
+ this.m_tabEnc.PerformLayout();
+ this.m_tabStructure.ResumeLayout(false);
+ this.m_grpSem.ResumeLayout(false);
+ this.m_grpSem.PerformLayout();
+ this.m_grpFieldAdd.ResumeLayout(false);
+ this.m_grpFieldAdd.PerformLayout();
+ this.m_grpSyntax.ResumeLayout(false);
+ this.m_grpSyntax.PerformLayout();
+ this.m_tabPreview.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TabControl m_tabMain;
+ private System.Windows.Forms.TabPage m_tabEnc;
+ private System.Windows.Forms.TabPage m_tabStructure;
+ private System.Windows.Forms.Button m_btnOK;
+ private System.Windows.Forms.Button m_btnCancel;
+ private System.Windows.Forms.TabPage m_tabPreview;
+ private System.Windows.Forms.ComboBox m_cmbEnc;
+ private System.Windows.Forms.Label m_lblEnc;
+ private System.Windows.Forms.RichTextBox m_rtbEncPreview;
+ private System.Windows.Forms.Label m_lblEncPreview;
+ private System.Windows.Forms.ComboBox m_cmbRecSep;
+ private System.Windows.Forms.Label m_lblRecSep;
+ private System.Windows.Forms.Label m_lblFieldSep;
+ private System.Windows.Forms.ComboBox m_cmbFieldSep;
+ private System.Windows.Forms.GroupBox m_grpSyntax;
+ private System.Windows.Forms.GroupBox m_grpSem;
+ private System.Windows.Forms.Button m_btnFieldDel;
+ private System.Windows.Forms.Label m_lblFields;
+ private KeePass.UI.CustomListViewEx m_lvFields;
+ private System.Windows.Forms.GroupBox m_grpFieldAdd;
+ private System.Windows.Forms.Label m_lblFieldFormat;
+ private System.Windows.Forms.TextBox m_tbFieldName;
+ private System.Windows.Forms.Label m_lblFieldName;
+ private System.Windows.Forms.ComboBox m_cmbFieldType;
+ private System.Windows.Forms.Label m_lblFieldType;
+ private System.Windows.Forms.Button m_btnFieldMoveDown;
+ private System.Windows.Forms.Button m_btnFieldMoveUp;
+ private System.Windows.Forms.Button m_btnFieldAdd;
+ private System.Windows.Forms.LinkLabel m_linkFieldFormat;
+ private System.Windows.Forms.ComboBox m_cmbFieldFormat;
+ private KeePass.UI.CustomListViewEx m_lvImportPreview;
+ private System.Windows.Forms.CheckBox m_cbBackEscape;
+ private System.Windows.Forms.ComboBox m_cmbTextQual;
+ private System.Windows.Forms.Label m_lblTextQual;
+ private System.Windows.Forms.CheckBox m_cbTrim;
+ private System.Windows.Forms.Button m_btnTabBack;
+ private System.Windows.Forms.Button m_btnTabNext;
+ private System.Windows.Forms.CheckBox m_cbIgnoreFirst;
+ }
+}
\ No newline at end of file
diff --git a/KeePass/Forms/CsvImportForm.cs b/KeePass/Forms/CsvImportForm.cs
new file mode 100644
index 0000000..e73ff20
--- /dev/null
+++ b/KeePass/Forms/CsvImportForm.cs
@@ -0,0 +1,776 @@
+/*
+ KeePass Password Safe - The Open-Source Password Manager
+ Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Globalization;
+using System.Diagnostics;
+
+using KeePass.App;
+using KeePass.DataExchange;
+using KeePass.Resources;
+using KeePass.UI;
+using KeePass.Util;
+
+using KeePassLib;
+using KeePassLib.Utility;
+
+namespace KeePass.Forms
+{
+ public partial class CsvImportForm : Form
+ {
+ private byte[] m_pbData = null;
+ private PwDatabase m_pwDatabase = null;
+
+ private bool m_bInitializing = false;
+ private uint m_uStartOffset = 0;
+
+ private readonly string StrCharTab = @"{Tab}";
+ private readonly string StrCharNewLine = @"{" + KPRes.NewLine + @"}";
+
+ private enum CsvFieldType
+ {
+ Ignore = 0,
+ GroupName,
+ Title,
+ UserName,
+ Password,
+ Url,
+ Notes,
+ CustomString,
+ CreationTime,
+ LastAccessTime,
+ LastModTime,
+ ExpiryTime,
+
+ Count, // Last enum item + 1
+ First = 0
+ }
+
+ private sealed class CsvFieldInfo
+ {
+ private readonly CsvFieldType m_t;
+ public CsvFieldType Type { get { return m_t; } }
+
+ private readonly string m_strName;
+ public string Name { get { return m_strName; } }
+
+ private readonly string m_strFormat;
+ public string Format { get { return m_strFormat; } }
+
+ public CsvFieldInfo(CsvFieldType t, string strName, string strFormat)
+ {
+ m_t = t;
+ m_strName = strName; // May be null
+ m_strFormat = strFormat; // May be null
+ }
+ }
+
+ public void InitEx(PwDatabase pwStorage, byte[] pbInData)
+ {
+ m_pwDatabase = pwStorage;
+ m_pbData = pbInData;
+ }
+
+ public CsvImportForm()
+ {
+ InitializeComponent();
+ Program.Translation.ApplyTo(this);
+ }
+
+ private void OnFormLoad(object sender, EventArgs e)
+ {
+ if((m_pbData == null) || (m_pwDatabase == null))
+ throw new InvalidOperationException();
+
+ m_bInitializing = true;
+
+ GlobalWindowManager.AddWindow(this);
+
+ this.Icon = Properties.Resources.KeePass;
+ this.Text = KPRes.GenericCsvImporter + " - " + PwDefs.ShortProductName;
+
+ // FontUtil.AssignDefaultBold(m_grpSyntax);
+ // FontUtil.AssignDefaultBold(m_grpSem);
+
+ UIUtil.SetExplorerTheme(m_lvFields, false);
+ UIUtil.SetExplorerTheme(m_lvImportPreview, false);
+
+ foreach(StrEncodingInfo seiEnum in StrUtil.Encodings)
+ {
+ m_cmbEnc.Items.Add(seiEnum.Name);
+ }
+
+ StrEncodingInfo seiGuess = BinaryDataClassifier.GetStringEncoding(
+ m_pbData, out m_uStartOffset);
+
+ int iSel = 0;
+ if(seiGuess != null)
+ iSel = Math.Max(m_cmbEnc.FindStringExact(seiGuess.Name), 0);
+ m_cmbEnc.SelectedIndex = iSel;
+
+ string[] vChars = new string[] { ",", ";", ".", ":", "\"", @"'",
+ StrCharTab, StrCharNewLine };
+ foreach(string strChar in vChars)
+ {
+ m_cmbFieldSep.Items.Add(strChar);
+ m_cmbRecSep.Items.Add(strChar);
+ m_cmbTextQual.Items.Add(strChar);
+ }
+ m_cmbFieldSep.SelectedIndex = 0;
+ m_cmbRecSep.SelectedIndex = 7;
+ m_cmbTextQual.SelectedIndex = 4;
+
+ m_lvFields.Columns.Add(KPRes.Field);
+
+ AddCsvField(CsvFieldType.Title, null, null);
+ AddCsvField(CsvFieldType.UserName, null, null);
+ AddCsvField(CsvFieldType.Password, null, null);
+ AddCsvField(CsvFieldType.Url, null, null);
+ AddCsvField(CsvFieldType.Notes, null, null);
+
+ for(int i = (int)CsvFieldType.First; i < (int)CsvFieldType.Count; ++i)
+ m_cmbFieldType.Items.Add(CsvFieldToString((CsvFieldType)i));
+ m_cmbFieldType.SelectedIndex = (int)CsvFieldType.GroupName;
+
+ string[] vFormats = new string[] { @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzz",
+ @"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", @"yyyy'-'MM'-'dd'T'HH':'mm':'ss",
+ @"yyyy'-'MM'-'dd HH':'mm':'ss'Z'",
+ @"yyyy/MM/dd HH:mm:ss",
+ @"yyyy/MM/dd", @"MM/dd/yy", @"MMMM dd, yyyy", @"MM/dd/yy H:mm:ss zzz"
+ };
+ foreach(string strFormat in vFormats)
+ {
+ m_cmbFieldFormat.Items.Add(strFormat);
+ }
+ m_cmbFieldFormat.Text = string.Empty;
+
+ m_bInitializing = false;
+
+ UpdateTextPreview();
+ UpdateImportPreview();
+ GuessFieldTypes();
+
+ ProcessResize();
+ EnableControlsEx();
+
+ UIUtil.SetFocus(m_btnTabNext, this);
+ }
+
+ private void OnFormClosed(object sender, FormClosedEventArgs e)
+ {
+ GlobalWindowManager.RemoveWindow(this);
+ }
+
+ private void EnableControlsEx()
+ {
+ if(m_bInitializing) return;
+
+ bool bSelField = (m_lvFields.SelectedIndices.Count >= 1);
+ bool bSel1Field = (m_lvFields.SelectedIndices.Count == 1);
+ m_btnFieldDel.Enabled = bSelField;
+ m_btnFieldMoveUp.Enabled = bSel1Field;
+ m_btnFieldMoveDown.Enabled = bSel1Field;
+
+ bool bFieldName, bFieldFormat;
+ GetCsvFieldType(out bFieldName, out bFieldFormat);
+ m_lblFieldName.Enabled = bFieldName;
+ m_tbFieldName.Enabled = bFieldName;
+ m_lblFieldFormat.Enabled = bFieldFormat;
+ m_cmbFieldFormat.Enabled = bFieldFormat;
+ m_linkFieldFormat.Enabled = bFieldFormat;
+
+ int iTab = m_tabMain.SelectedIndex, nTabs = m_tabMain.TabCount;
+ m_btnTabBack.Enabled = (iTab > 0);
+ m_btnTabNext.Enabled = (iTab < (nTabs - 1));
+
+ bool bValidFieldSep = (GetCharFromDef(m_cmbFieldSep.Text) != char.MinValue);
+ bool bValidRecSep = (GetCharFromDef(m_cmbRecSep.Text) != char.MinValue);
+ bool bValidTextQual = (GetCharFromDef(m_cmbTextQual.Text) != char.MinValue);
+
+ if(bValidFieldSep) m_cmbFieldSep.ResetBackColor();
+ else m_cmbFieldSep.BackColor = AppDefs.ColorEditError;
+ if(bValidRecSep) m_cmbRecSep.ResetBackColor();
+ else m_cmbRecSep.BackColor = AppDefs.ColorEditError;
+ if(bValidTextQual) m_cmbTextQual.ResetBackColor();
+ else m_cmbTextQual.BackColor = AppDefs.ColorEditError;
+
+ bool bOK = true;
+ bOK &= (iTab == (nTabs - 1));
+ bOK &= (bValidFieldSep && bValidRecSep && bValidTextQual);
+ m_btnOK.Enabled = bOK;
+ }
+
+ private string GetDecodedText()
+ {
+ StrEncodingInfo sei = StrUtil.GetEncoding(m_cmbEnc.Text);
+ try
+ {
+ return (sei.Encoding.GetString(m_pbData, (int)m_uStartOffset,
+ m_pbData.Length - (int)m_uStartOffset) ?? string.Empty);
+ }
+ catch(Exception) { }
+
+ return string.Empty;
+ }
+
+ private void UpdateTextPreview()
+ {
+ if(m_bInitializing) return;
+
+ m_rtbEncPreview.Clear(); // Clear formatting
+ m_rtbEncPreview.Text = GetDecodedText();
+ }
+
+ private void UpdateImportPreview()
+ {
+ if(m_bInitializing) return;
+
+ PerformImport(new PwGroup(true, true), true);
+ }
+
+ private void ProcessResize()
+ {
+ if(m_bInitializing) return;
+
+ int dx = m_lvFields.ClientRectangle.Width;
+ m_lvFields.Columns[0].Width = dx -
+ UIUtil.GetVScrollBarWidth(); // Add some space for usability
+
+ dx = m_lvImportPreview.ClientRectangle.Width;
+ int nCols = m_lvImportPreview.Columns.Count;
+ for(int c = 0; c < nCols; ++c)
+ m_lvImportPreview.Columns[c].Width = dx / nCols;
+ }
+
+ private static string CsvFieldToString(CsvFieldType t)
+ {
+ string strText;
+ if(t == CsvFieldType.Ignore) strText = "(" + KPRes.Ignore + ")";
+ else if(t == CsvFieldType.GroupName) strText = KPRes.Group;
+ else if(t == CsvFieldType.Title) strText = KPRes.Title;
+ else if(t == CsvFieldType.UserName) strText = KPRes.UserName;
+ else if(t == CsvFieldType.Password) strText = KPRes.Password;
+ else if(t == CsvFieldType.Url) strText = KPRes.Url;
+ else if(t == CsvFieldType.Notes) strText = KPRes.Notes;
+ else if(t == CsvFieldType.CustomString)
+ strText = KPRes.String;
+ else if(t == CsvFieldType.CreationTime)
+ strText = KPRes.CreationTime;
+ else if(t == CsvFieldType.LastAccessTime)
+ strText = KPRes.LastAccessTime;
+ else if(t == CsvFieldType.LastModTime)
+ strText = KPRes.LastModificationTime;
+ else if(t == CsvFieldType.ExpiryTime)
+ strText = KPRes.ExpiryTime;
+ else { Debug.Assert(false); strText = KPRes.Unknown; }
+
+ return strText;
+ }
+
+ private void AddCsvField(CsvFieldType t, string strName, string strFormat)
+ {
+ string strText = CsvFieldToString(t);
+
+ string strSub = string.Empty;
+ if(strName != null) strSub += strName;
+ if(!string.IsNullOrEmpty(strFormat))
+ {
+ if(strSub.Length > 0) strSub += ", ";
+ strSub += strFormat;
+ }
+
+ if(strSub.Length > 0) strText += " (" + strSub + ")";
+
+ ListViewItem lvi = m_lvFields.Items.Add(strText);
+ lvi.Tag = new CsvFieldInfo(t, strName, strFormat);
+ }
+
+ private CsvFieldType GetCsvFieldType(out bool bName, out bool bFormat)
+ {
+ int i = m_cmbFieldType.SelectedIndex;
+ if((i < (int)CsvFieldType.First) || (i >= (int)CsvFieldType.Count))
+ {
+ Debug.Assert(false);
+ bName = false;
+ bFormat = false;
+ return CsvFieldType.Ignore;
+ }
+
+ CsvFieldType t = (CsvFieldType)i;
+ bName = (t == CsvFieldType.CustomString);
+ bFormat = ((t == CsvFieldType.CreationTime) || (t == CsvFieldType.LastAccessTime) ||
+ (t == CsvFieldType.LastModTime) || (t == CsvFieldType.ExpiryTime));
+ return t;
+ }
+
+ private char GetCharFromDef(string strDef)
+ {
+ if(strDef.Equals(StrCharTab, StrUtil.CaseIgnoreCmp))
+ return '\t';
+ if(strDef.Equals(StrCharNewLine, StrUtil.CaseIgnoreCmp))
+ return '\n';
+ if(strDef.Length == 1) return strDef[0];
+ return char.MinValue;
+ }
+
+ private void OnEncSelectedIndexChanged(object sender, EventArgs e)
+ {
+ UpdateTextPreview();
+ }
+
+ private void OnFieldSepTextUpdate(object sender, EventArgs e)
+ {
+ EnableControlsEx();
+ }
+
+ private void OnRecSepTextUpdate(object sender, EventArgs e)
+ {
+ EnableControlsEx();
+ }
+
+ private void OnTextQualTextUpdate(object sender, EventArgs e)
+ {
+ EnableControlsEx();
+ }
+
+ private void OnBtnFieldDel(object sender, EventArgs e)
+ {
+ ListView.SelectedIndexCollection lvsic = m_lvFields.SelectedIndices;
+ for(int i = lvsic.Count - 1; i >= 0; --i)
+ m_lvFields.Items.RemoveAt(lvsic[i]);
+
+ EnableControlsEx();
+ }
+
+ private void OnFieldsSelectedIndexChanged(object sender, EventArgs e)
+ {
+ EnableControlsEx();
+ }
+
+ private void OnBtnFieldMoveUp(object sender, EventArgs e)
+ {
+ ListView.SelectedIndexCollection lvsic = m_lvFields.SelectedIndices;
+ if(lvsic.Count != 1) { Debug.Assert(false); return; }
+
+ int iPos = lvsic[0];
+ if(iPos == 0) return;
+
+ ListViewItem lviMove = m_lvFields.Items[iPos];
+ m_lvFields.Items.RemoveAt(iPos);
+ m_lvFields.Items.Insert(iPos - 1, lviMove);
+ }
+
+ private void OnBtnFieldMoveDown(object sender, EventArgs e)
+ {
+ ListView.SelectedIndexCollection lvsic = m_lvFields.SelectedIndices;
+ if(lvsic.Count != 1) { Debug.Assert(false); return; }
+
+ int iPos = lvsic[0];
+ if(iPos == (m_lvFields.Items.Count - 1)) return;
+
+ ListViewItem lviMove = m_lvFields.Items[iPos];
+ m_lvFields.Items.RemoveAt(iPos);
+ m_lvFields.Items.Insert(iPos + 1, lviMove);
+ }
+
+ private void OnFieldTypeSelectedIndexChanged(object sender, EventArgs e)
+ {
+ EnableControlsEx();
+ }
+
+ private void OnFieldFormatLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+ {
+ string strUrl = @"http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx";
+ try { Process.Start(strUrl); }
+ catch(Exception ex) { MessageService.ShowWarning(strUrl, ex.Message); }
+ }
+
+ private void OnBtnFieldAdd(object sender, EventArgs e)
+ {
+ bool bName, bFormat;
+ CsvFieldType t = GetCsvFieldType(out bName, out bFormat);
+ string strName = (bName ? m_tbFieldName.Text : null);
+ string strFormat = (bFormat ? m_cmbFieldFormat.Text : null);
+
+ AddCsvField(t, strName, strFormat);
+ ProcessResize();
+ for(int i = 0; i < (m_lvFields.Items.Count - 1); ++i)
+ m_lvFields.Items[i].Selected = false;
+ m_lvFields.EnsureVisible(m_lvFields.Items.Count - 1);
+ UIUtil.SetFocusedItem(m_lvFields, m_lvFields.Items[
+ m_lvFields.Items.Count - 1], true);
+ }
+
+ private void OnTabMainSelectedIndexChanged(object sender, EventArgs e)
+ {
+ if(m_tabMain.SelectedTab == m_tabPreview)
+ UpdateImportPreview();
+
+ EnableControlsEx();
+ }
+
+ private CsvOptions GetCsvOptions()
+ {
+ CsvOptions opt = new CsvOptions();
+ opt.FieldSeparator = GetCharFromDef(m_cmbFieldSep.Text);
+ opt.RecordSeparator = GetCharFromDef(m_cmbRecSep.Text);
+ opt.TextQualifier = GetCharFromDef(m_cmbTextQual.Text);
+ if((opt.FieldSeparator == char.MinValue) || (opt.RecordSeparator == char.MinValue) ||
+ (opt.TextQualifier == char.MinValue))
+ return null;
+ opt.BackslashIsEscape = m_cbBackEscape.Checked;
+ opt.TrimFields = m_cbTrim.Checked;
+
+ return opt;
+ }
+
+ private void PerformImport(PwGroup pgStorage, bool bCreatePreview)
+ {
+ List<CsvFieldInfo> lFields = new List<CsvFieldInfo>();
+ for(int i = 0; i < m_lvFields.Items.Count; ++i)
+ {
+ CsvFieldInfo cfi = (m_lvFields.Items[i].Tag as CsvFieldInfo);
+ if(cfi == null) { Debug.Assert(false); continue; }
+ lFields.Add(cfi);
+ }
+
+ if(bCreatePreview)
+ {
+ int dx = m_lvImportPreview.ClientRectangle.Width; // Before clearing
+
+ m_lvImportPreview.Items.Clear();
+ m_lvImportPreview.Columns.Clear();
+
+ foreach(CsvFieldInfo cfi in lFields)
+ {
+ string strCol = CsvFieldToString(cfi.Type);
+ if(cfi.Type == CsvFieldType.CustomString)
+ strCol = (cfi.Name ?? string.Empty);
+ m_lvImportPreview.Columns.Add(strCol, dx / lFields.Count);
+ }
+ }
+
+ CsvOptions opt = GetCsvOptions();
+ if(opt == null) { Debug.Assert(bCreatePreview); return; }
+
+ string strData = GetDecodedText();
+ CsvStreamReaderEx csr = new CsvStreamReaderEx(strData, opt);
+
+ Dictionary<string, PwGroup> dGroups = new Dictionary<string, PwGroup>();
+ dGroups[string.Empty] = pgStorage;
+
+ if(bCreatePreview) m_lvImportPreview.BeginUpdate();
+
+ DateTime dtNow = DateTime.Now;
+ DateTime dtNoExpire = Kdb3Time.NeverExpireTime.ToDateTime();
+ bool bIgnoreFirstRow = m_cbIgnoreFirst.Checked;
+ bool bIsFirstRow = true;
+
+ while(true)
+ {
+ string[] v = csr.ReadLine();
+ if(v == null) break;
+ if(v.Length == 0) continue;
+ if((v.Length == 1) && (v[0].Length == 0)) continue;
+
+ if(bIsFirstRow && bIgnoreFirstRow)
+ {
+ bIsFirstRow = false;
+ continue;
+ }
+ bIsFirstRow = false;
+
+ PwGroup pgParent = pgStorage;
+ PwEntry pe = new PwEntry(true, true);
+
+ ListViewItem lvi = null;
+ for(int i = 0; i < Math.Min(v.Length, lFields.Count); ++i)
+ {
+ string strField = v[i];
+ CsvFieldInfo cfi = lFields[i];
+
+ if(cfi.Type == CsvFieldType.Ignore) { }
+ else if(cfi.Type == CsvFieldType.GroupName)
+ {
+ if(!dGroups.ContainsKey(strField))
+ {
+ PwGroup pgNew = new PwGroup(true, true);
+ pgNew.Name = strField;
+ pgStorage.AddGroup(pgNew, true);
+ dGroups[strField] = pgNew;
+ }
+
+ pgParent = dGroups[strField];
+ }
+ else if(cfi.Type == CsvFieldType.Title)
+ ImportUtil.AppendToField(pe, PwDefs.TitleField,
+ strField, m_pwDatabase);
+ else if(cfi.Type == CsvFieldType.UserName)
+ ImportUtil.AppendToField(pe, PwDefs.UserNameField,
+ strField, m_pwDatabase);
+ else if(cfi.Type == CsvFieldType.Password)
+ ImportUtil.AppendToField(pe, PwDefs.PasswordField,
+ strField, m_pwDatabase);
+ else if(cfi.Type == CsvFieldType.Url)
+ ImportUtil.AppendToField(pe, PwDefs.UrlField,
+ strField, m_pwDatabase);
+ else if(cfi.Type == CsvFieldType.Notes)
+ ImportUtil.AppendToField(pe, PwDefs.NotesField,
+ strField, m_pwDatabase);
+ else if(cfi.Type == CsvFieldType.CustomString)
+ ImportUtil.AppendToField(pe, (string.IsNullOrEmpty(cfi.Name) ?
+ PwDefs.NotesField : cfi.Name), strField, m_pwDatabase);
+ else if(cfi.Type == CsvFieldType.CreationTime)
+ pe.CreationTime = ParseDateTime(ref strField, cfi, dtNow);
+ else if(cfi.Type == CsvFieldType.LastAccessTime)
+ pe.LastAccessTime = ParseDateTime(ref strField, cfi, dtNow);
+ else if(cfi.Type == CsvFieldType.LastModTime)
+ pe.LastModificationTime = ParseDateTime(ref strField, cfi, dtNow);
+ else if(cfi.Type == CsvFieldType.ExpiryTime)
+ {
+ bool bParseSuccess;
+ pe.ExpiryTime = ParseDateTime(ref strField, cfi, dtNow,
+ out bParseSuccess);
+ pe.Expires = (bParseSuccess && (pe.ExpiryTime != dtNoExpire));
+ }
+ else { Debug.Assert(false); }
+
+ if(bCreatePreview)
+ {
+ strField = StrUtil.MultiToSingleLine(strField);
+
+ if(lvi != null) lvi.SubItems.Add(strField);
+ else lvi = m_lvImportPreview.Items.Add(strField);
+ }
+ }
+
+ if(bCreatePreview)
+ {
+ // Create remaining subitems
+ for(int r = v.Length; r < lFields.Count; ++r)
+ {
+ if(lvi != null) lvi.SubItems.Add(string.Empty);
+ else lvi = m_lvImportPreview.Items.Add(string.Empty);
+ }
+ }
+
+ pgParent.AddEntry(pe, true);
+ }
+
+ if(bCreatePreview)
+ {
+ m_lvImportPreview.EndUpdate();
+ ProcessResize();
+ }
+ }
+
+ private DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi,
+ DateTime dtDefault)
+ {
+ bool bDummy;
+ return ParseDateTime(ref strData, cfi, dtDefault, out bDummy);
+ }
+
+ private DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi,
+ DateTime dtDefault, out bool bSuccess)
+ {
+ DateTime? odt = null;
+
+ if(!string.IsNullOrEmpty(cfi.Format))
+ {
+ const DateTimeStyles dts = (DateTimeStyles.AllowWhiteSpaces |
+ DateTimeStyles.AssumeLocal);
+
+ DateTime dtExact;
+ if(DateTime.TryParseExact(strData, cfi.Format, null, dts,
+ out dtExact))
+ odt = dtExact;
+ }
+
+ if(!odt.HasValue)
+ {
+ DateTime dtStd;
+ if(DateTime.TryParse(strData, out dtStd))
+ odt = dtStd;
+ }
+
+ if(odt.HasValue)
+ {
+ strData = TimeUtil.ToDisplayString(odt.Value);
+ bSuccess = true;
+ }
+ else
+ {
+ strData = string.Empty;
+ bSuccess = false;
+
+ odt = dtDefault;
+ }
+
+ return odt.Value;
+ }
+
+ private void OnBtnTabBack(object sender, EventArgs e)
+ {
+ int i = m_tabMain.SelectedIndex;
+ if(i > 0) m_tabMain.SelectedIndex = i - 1;
+ }
+
+ private void OnBtnTabNext(object sender, EventArgs e)
+ {
+ int i = m_tabMain.SelectedIndex;
+ if(i < (m_tabMain.TabCount - 1)) m_tabMain.SelectedIndex = i + 1;
+ }
+
+ private void OnBtnOK(object sender, EventArgs e)
+ {
+ PerformImport(m_pwDatabase.RootGroup, false);
+ }
+
+ private void OnFieldSepSelectedIndexChanged(object sender, EventArgs e)
+ {
+ EnableControlsEx();
+ }
+
+ private void OnRecSepSelectedIndexChanged(object sender, EventArgs e)
+ {
+ EnableControlsEx();
+ }
+
+ private void OnTextQualSelectedIndexChanged(object sender, EventArgs e)
+ {
+ EnableControlsEx();
+ }
+
+ private void GuessFieldTypes()
+ {
+ CsvOptions opt = GetCsvOptions();
+ if(opt == null) { Debug.Assert(false); return; }
+
+ string str = GetDecodedText();
+ CsvStreamReaderEx csv = new CsvStreamReaderEx(str, opt);
+
+ string[] v;
+ while(true)
+ {
+ v = csv.ReadLine();
+ if(v == null) return;
+ if(v.Length == 0) continue;
+ if((v.Length == 1) && (v[0].Length == 0)) continue;
+ break;
+ }
+ if(v.Length <= 3) return;
+
+ CsvFieldInfo[] vFields = new CsvFieldInfo[v.Length];
+ int nDetermined = 0;
+ for(int i = 0; i < v.Length; ++i)
+ {
+ CsvFieldInfo fi = GuessFieldType(v[i]);
+ if(fi != null) ++nDetermined;
+ else fi = new CsvFieldInfo(CsvFieldType.Ignore, null, null);
+
+ vFields[i] = fi;
+ }
+
+ // Accept the guesses only if at least half of them are
+ // probably correct
+ if(nDetermined < (v.Length + 1) / 2) return;
+
+ m_lvFields.Items.Clear();
+ foreach(CsvFieldInfo fi in vFields)
+ AddCsvField(fi.Type, fi.Name, fi.Format);
+ }
+
+ private static CsvFieldInfo GuessFieldType(string strRawName)
+ {
+ if(strRawName == null) return null;
+ string strName = strRawName.Trim();
+ if(strName.Length == 0) return null;
+
+ string str = ImportUtil.MapNameToStandardField(strName, false);
+ if(str == PwDefs.TitleField)
+ return new CsvFieldInfo(CsvFieldType.Title, null, null);
+ if(str == PwDefs.UserNameField)
+ return new CsvFieldInfo(CsvFieldType.UserName, null, null);
+ if(str == PwDefs.PasswordField)
+ return new CsvFieldInfo(CsvFieldType.Password, null, null);
+ if(str == PwDefs.UrlField)
+ return new CsvFieldInfo(CsvFieldType.Url, null, null);
+ if(str == PwDefs.NotesField)
+ return new CsvFieldInfo(CsvFieldType.Notes, null, null);
+
+ string[] vGroupNames = new string[] {
+ "Password Groups", "Group", "Groups"
+ };
+ foreach(string strGroupName in vGroupNames)
+ {
+ if(strName.Equals(strGroupName, StrUtil.CaseIgnoreCmp))
+ return new CsvFieldInfo(CsvFieldType.GroupName, null, null);
+ }
+
+ string[] vCreationNames = new string[] {
+ "Creation", "Creation Time",
+ KPRes.CreationTime
+ };
+ foreach(string strCreation in vCreationNames)
+ {
+ if(strName.Equals(strCreation, StrUtil.CaseIgnoreCmp))
+ return new CsvFieldInfo(CsvFieldType.CreationTime, null, null);
+ }
+
+ string[] vLastAccess = new string[] {
+ "Last Access", "Last Access Time",
+ KPRes.LastAccessTime
+ };
+ foreach(string strLastAccess in vLastAccess)
+ {
+ if(strName.Equals(strLastAccess, StrUtil.CaseIgnoreCmp))
+ return new CsvFieldInfo(CsvFieldType.LastAccessTime, null, null);
+ }
+
+ string[] vLastMod = new string[] {
+ "Last Modification", "Last Mod", "Last Modification Time",
+ "Last Mod Time",
+ KPRes.LastModificationTime
+ };
+ foreach(string strLastMod in vLastMod)
+ {
+ if(strName.Equals(strLastMod, StrUtil.CaseIgnoreCmp))
+ return new CsvFieldInfo(CsvFieldType.LastModTime, null, null);
+ }
+
+ string[] vExpiry = new string[] {
+ "Expires", "Expire", "Expiry", "Expiry Time",
+ KPRes.ExpiryTime, KPRes.ExpiryTimeDateOnly
+ };
+ foreach(string strExpire in vExpiry)
+ {
+ if(strName.Equals(strExpire, StrUtil.CaseIgnoreCmp))
+ return new CsvFieldInfo(CsvFieldType.ExpiryTime, null, null);
+ }
+
+ return null;
+ }
+ }
+}
diff --git a/KeePass/Forms/AboutForm.resx b/KeePass/Forms/CsvImportForm.resx
similarity index 100%
copy from KeePass/Forms/AboutForm.resx
copy to KeePass/Forms/CsvImportForm.resx
diff --git a/KeePass/Forms/DataEditorForm.cs b/KeePass/Forms/DataEditorForm.cs
index a5274e7..a2f880f 100644
--- a/KeePass/Forms/DataEditorForm.cs
+++ b/KeePass/Forms/DataEditorForm.cs
@@ -100,11 +100,16 @@ namespace KeePass.Forms
m_strInitialFormRect = UIUtil.GetWindowScreenRect(this);
m_bdc = BinaryDataClassifier.Classify(m_strDataDesc, m_pbData);
- string strEncodingName;
uint uStartOffset;
- Encoding enc = BinaryDataClassifier.GetStringEncoding(m_pbData,
- false, out strEncodingName, out uStartOffset);
- string strData = enc.GetString(m_pbData);
+ StrEncodingInfo seiGuess = BinaryDataClassifier.GetStringEncoding(
+ m_pbData, out uStartOffset);
+ string strData;
+ try
+ {
+ strData = (seiGuess.Encoding.GetString(m_pbData, (int)uStartOffset,
+ m_pbData.Length - (int)uStartOffset) ?? string.Empty);
+ }
+ catch(Exception) { Debug.Assert(false); strData = string.Empty; }
BlockUIEvents(true);
@@ -140,7 +145,13 @@ namespace KeePass.Forms
bool bSimpleText = true;
if(m_bdc == BinaryDataClass.RichText)
{
- try { m_rtbText.Rtf = strData; bSimpleText = false; }
+ try
+ {
+ if(strData.Length > 0) m_rtbText.Rtf = strData;
+ else m_rtbText.Text = string.Empty;
+
+ bSimpleText = false;
+ }
catch(Exception) { } // Show as simple text
}
@@ -542,8 +553,7 @@ namespace KeePass.Forms
try
{
string strText = enc.GetString(pbData);
- UTF8Encoding utf8 = new UTF8Encoding(false);
- return utf8.GetBytes(strText);
+ return StrUtil.Utf8.GetBytes(strText);
}
catch(Exception) { Debug.Assert(false); }
}
diff --git a/KeePass/Forms/DataViewerForm.Designer.cs b/KeePass/Forms/DataViewerForm.Designer.cs
index 9fe3481..cf27a36 100644
--- a/KeePass/Forms/DataViewerForm.Designer.cs
+++ b/KeePass/Forms/DataViewerForm.Designer.cs
@@ -28,37 +28,28 @@
/// </summary>
private void InitializeComponent()
{
- this.m_rtbText = new KeePass.UI.CustomRichTextBoxEx();
this.m_picBox = new System.Windows.Forms.PictureBox();
this.m_webBrowser = new System.Windows.Forms.WebBrowser();
+ this.m_pnlImageViewer = new System.Windows.Forms.Panel();
+ this.m_statusMain = new System.Windows.Forms.StatusStrip();
+ this.m_tssStatusMain = new System.Windows.Forms.ToolStripStatusLabel();
+ this.m_rtbText = new KeePass.UI.CustomRichTextBoxEx();
this.m_toolMain = new KeePass.UI.CustomToolStripEx();
this.m_tslViewer = new System.Windows.Forms.ToolStripLabel();
this.m_tscViewers = new System.Windows.Forms.ToolStripComboBox();
this.m_tssSeparator0 = new System.Windows.Forms.ToolStripSeparator();
this.m_tslEncoding = new System.Windows.Forms.ToolStripLabel();
this.m_tscEncoding = new System.Windows.Forms.ToolStripComboBox();
- this.m_pnlImageViewer = new System.Windows.Forms.Panel();
- this.m_statusMain = new System.Windows.Forms.StatusStrip();
- this.m_tssStatusMain = new System.Windows.Forms.ToolStripStatusLabel();
+ this.m_tslZoom = new System.Windows.Forms.ToolStripLabel();
+ this.m_tscZoom = new System.Windows.Forms.ToolStripComboBox();
((System.ComponentModel.ISupportInitialize)(this.m_picBox)).BeginInit();
- this.m_toolMain.SuspendLayout();
this.m_pnlImageViewer.SuspendLayout();
this.m_statusMain.SuspendLayout();
+ this.m_toolMain.SuspendLayout();
this.SuspendLayout();
//
- // m_rtbText
- //
- this.m_rtbText.Location = new System.Drawing.Point(23, 40);
- this.m_rtbText.Name = "m_rtbText";
- this.m_rtbText.ReadOnly = true;
- this.m_rtbText.Size = new System.Drawing.Size(190, 114);
- this.m_rtbText.TabIndex = 0;
- this.m_rtbText.Text = "";
- this.m_rtbText.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnRichTextBoxLinkClicked);
- //
// m_picBox
//
- this.m_picBox.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.m_picBox.Location = new System.Drawing.Point(31, 26);
this.m_picBox.Name = "m_picBox";
this.m_picBox.Size = new System.Drawing.Size(174, 130);
@@ -74,6 +65,43 @@
this.m_webBrowser.Size = new System.Drawing.Size(193, 158);
this.m_webBrowser.TabIndex = 2;
//
+ // m_pnlImageViewer
+ //
+ this.m_pnlImageViewer.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.m_pnlImageViewer.Controls.Add(this.m_picBox);
+ this.m_pnlImageViewer.Location = new System.Drawing.Point(234, 70);
+ this.m_pnlImageViewer.Name = "m_pnlImageViewer";
+ this.m_pnlImageViewer.Size = new System.Drawing.Size(264, 212);
+ this.m_pnlImageViewer.TabIndex = 1;
+ //
+ // m_statusMain
+ //
+ this.m_statusMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.m_tssStatusMain});
+ this.m_statusMain.Location = new System.Drawing.Point(0, 366);
+ this.m_statusMain.Name = "m_statusMain";
+ this.m_statusMain.Size = new System.Drawing.Size(524, 22);
+ this.m_statusMain.TabIndex = 4;
+ //
+ // m_tssStatusMain
+ //
+ this.m_tssStatusMain.Name = "m_tssStatusMain";
+ this.m_tssStatusMain.Size = new System.Drawing.Size(509, 17);
+ this.m_tssStatusMain.Spring = true;
+ this.m_tssStatusMain.Text = "<>";
+ this.m_tssStatusMain.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // m_rtbText
+ //
+ this.m_rtbText.Location = new System.Drawing.Point(23, 40);
+ this.m_rtbText.Name = "m_rtbText";
+ this.m_rtbText.ReadOnly = true;
+ this.m_rtbText.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedBoth;
+ this.m_rtbText.Size = new System.Drawing.Size(190, 114);
+ this.m_rtbText.TabIndex = 0;
+ this.m_rtbText.Text = "";
+ this.m_rtbText.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnRichTextBoxLinkClicked);
+ //
// m_toolMain
//
this.m_toolMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
@@ -81,7 +109,9 @@
this.m_tscViewers,
this.m_tssSeparator0,
this.m_tslEncoding,
- this.m_tscEncoding});
+ this.m_tscEncoding,
+ this.m_tslZoom,
+ this.m_tscZoom});
this.m_toolMain.Location = new System.Drawing.Point(0, 0);
this.m_toolMain.Name = "m_toolMain";
this.m_toolMain.Size = new System.Drawing.Size(524, 25);
@@ -91,7 +121,7 @@
// m_tslViewer
//
this.m_tslViewer.Name = "m_tslViewer";
- this.m_tslViewer.Size = new System.Drawing.Size(19, 22);
+ this.m_tslViewer.Size = new System.Drawing.Size(21, 22);
this.m_tslViewer.Text = "<>";
//
// m_tscViewers
@@ -109,40 +139,28 @@
// m_tslEncoding
//
this.m_tslEncoding.Name = "m_tslEncoding";
- this.m_tslEncoding.Size = new System.Drawing.Size(19, 22);
+ this.m_tslEncoding.Size = new System.Drawing.Size(21, 22);
this.m_tslEncoding.Text = "<>";
//
// m_tscEncoding
//
this.m_tscEncoding.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.m_tscEncoding.Name = "m_tscEncoding";
- this.m_tscEncoding.Size = new System.Drawing.Size(150, 25);
+ this.m_tscEncoding.Size = new System.Drawing.Size(200, 25);
this.m_tscEncoding.SelectedIndexChanged += new System.EventHandler(this.OnEncodingSelectedIndexChanged);
//
- // m_pnlImageViewer
- //
- this.m_pnlImageViewer.Controls.Add(this.m_picBox);
- this.m_pnlImageViewer.Location = new System.Drawing.Point(234, 70);
- this.m_pnlImageViewer.Name = "m_pnlImageViewer";
- this.m_pnlImageViewer.Size = new System.Drawing.Size(264, 212);
- this.m_pnlImageViewer.TabIndex = 1;
- //
- // m_statusMain
+ // m_tslZoom
//
- this.m_statusMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.m_tssStatusMain});
- this.m_statusMain.Location = new System.Drawing.Point(0, 366);
- this.m_statusMain.Name = "m_statusMain";
- this.m_statusMain.Size = new System.Drawing.Size(524, 22);
- this.m_statusMain.TabIndex = 4;
+ this.m_tslZoom.Name = "m_tslZoom";
+ this.m_tslZoom.Size = new System.Drawing.Size(21, 22);
+ this.m_tslZoom.Text = "<>";
//
- // m_tssStatusMain
+ // m_tscZoom
//
- this.m_tssStatusMain.Name = "m_tssStatusMain";
- this.m_tssStatusMain.Size = new System.Drawing.Size(509, 17);
- this.m_tssStatusMain.Spring = true;
- this.m_tssStatusMain.Text = "<>";
- this.m_tssStatusMain.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.m_tscZoom.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.m_tscZoom.Name = "m_tscZoom";
+ this.m_tscZoom.Size = new System.Drawing.Size(75, 25);
+ this.m_tscZoom.SelectedIndexChanged += new System.EventHandler(this.OnZoomSelectedIndexChanged);
//
// DataViewerForm
//
@@ -163,11 +181,11 @@
this.SizeChanged += new System.EventHandler(this.OnFormSizeChanged);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnFormClosing);
((System.ComponentModel.ISupportInitialize)(this.m_picBox)).EndInit();
- this.m_toolMain.ResumeLayout(false);
- this.m_toolMain.PerformLayout();
this.m_pnlImageViewer.ResumeLayout(false);
this.m_statusMain.ResumeLayout(false);
this.m_statusMain.PerformLayout();
+ this.m_toolMain.ResumeLayout(false);
+ this.m_toolMain.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@@ -187,5 +205,7 @@
private System.Windows.Forms.Panel m_pnlImageViewer;
private System.Windows.Forms.StatusStrip m_statusMain;
private System.Windows.Forms.ToolStripStatusLabel m_tssStatusMain;
+ private System.Windows.Forms.ToolStripLabel m_tslZoom;
+ private System.Windows.Forms.ToolStripComboBox m_tscZoom;
}
}
\ No newline at end of file
diff --git a/KeePass/Forms/DataViewerForm.cs b/KeePass/Forms/DataViewerForm.cs
index 685a73b..e95ab06 100644
--- a/KeePass/Forms/DataViewerForm.cs
+++ b/KeePass/Forms/DataViewerForm.cs
@@ -21,6 +21,8 @@ using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
@@ -47,9 +49,12 @@ namespace KeePass.Forms
private RichTextBoxContextMenu m_ctxText = new RichTextBoxContextMenu();
- public event EventHandler<DvfContextEventArgs> Initializing;
- public event EventHandler<DvfContextEventArgs> UpdatingDataView;
- public event EventHandler<DvfContextEventArgs> Uninitializing;
+ private Image m_img = null;
+ private Image m_imgResized = null;
+
+ public event EventHandler<DvfContextEventArgs> DvfInit;
+ public event EventHandler<DvfContextEventArgs> DvfUpdating;
+ public event EventHandler<DvfContextEventArgs> DvfRelease;
public void InitEx(string strDataDesc, byte[] pbData)
{
@@ -73,53 +78,44 @@ namespace KeePass.Forms
this.Icon = Properties.Resources.KeePass;
- m_tslViewer.Text = KPRes.ShowIn + ":";
- m_tslEncoding.Text = KPRes.Encoding + ":";
-
if(m_strDataDesc.Length > 0)
this.Text = m_strDataDesc + " - " + this.Text;
this.DoubleBuffered = true;
- m_tssStatusMain.Text = KPRes.Ready;
-
- m_ctxText.Attach(m_rtbText, this);
-
m_bInitializing = true;
+ m_tssStatusMain.Text = KPRes.Ready;
+ m_ctxText.Attach(m_rtbText, this);
m_rtbText.Dock = DockStyle.Fill;
m_webBrowser.Dock = DockStyle.Fill;
m_pnlImageViewer.Dock = DockStyle.Fill;
m_picBox.Dock = DockStyle.Fill;
- m_tscEncoding.Items.Add(BinaryDataClassifier.BdeAnsi + " (" +
- KPRes.SystemCodePage + ")");
- m_tscEncoding.Items.Add(BinaryDataClassifier.BdeAscii);
- m_tscEncoding.Items.Add(BinaryDataClassifier.BdeUtf7);
- m_tscEncoding.Items.Add(BinaryDataClassifier.BdeUtf8);
- m_tscEncoding.Items.Add(BinaryDataClassifier.BdeUtf32);
- m_tscEncoding.Items.Add(BinaryDataClassifier.BdeUnicodeLE);
- m_tscEncoding.Items.Add(BinaryDataClassifier.BdeUnicodeBE);
-
- string strEnc;
- Encoding enc = BinaryDataClassifier.GetStringEncoding(m_pbData,
- false, out strEnc, out m_uStartOffset);
-
- if(strEnc == BinaryDataClassifier.BdeAnsi)
- m_tscEncoding.SelectedIndex = 0;
- else if(strEnc == BinaryDataClassifier.BdeAscii)
- m_tscEncoding.SelectedIndex = 1;
- else if(strEnc == BinaryDataClassifier.BdeUtf7)
- m_tscEncoding.SelectedIndex = 2;
- else if(strEnc == BinaryDataClassifier.BdeUtf8)
- m_tscEncoding.SelectedIndex = 3;
- else if(strEnc == BinaryDataClassifier.BdeUtf32)
- m_tscEncoding.SelectedIndex = 4;
- else if(strEnc == BinaryDataClassifier.BdeUnicodeLE)
- m_tscEncoding.SelectedIndex = 5;
- else if(strEnc == BinaryDataClassifier.BdeUnicodeBE)
- m_tscEncoding.SelectedIndex = 6;
- else m_tscEncoding.SelectedIndex = 0;
+ m_tslEncoding.Text = KPRes.Encoding + ":";
+
+ foreach(StrEncodingInfo seiEnum in StrUtil.Encodings)
+ {
+ m_tscEncoding.Items.Add(seiEnum.Name);
+ }
+
+ StrEncodingInfo seiGuess = BinaryDataClassifier.GetStringEncoding(
+ m_pbData, out m_uStartOffset);
+
+ int iSel = 0;
+ if(seiGuess != null)
+ iSel = Math.Max(m_tscEncoding.FindStringExact(seiGuess.Name), 0);
+ m_tscEncoding.SelectedIndex = iSel;
+
+ m_tslZoom.Text = KPRes.Zoom + ":";
+
+ m_tscZoom.Items.Add(KPRes.Auto);
+ int[] vZooms = new int[] { 10, 25, 50, 75, 100, 125, 150, 200, 400 };
+ foreach(int iZoom in vZooms)
+ m_tscZoom.Items.Add(iZoom.ToString() + @"%");
+ m_tscZoom.SelectedIndex = 0;
+
+ m_tslViewer.Text = KPRes.ShowIn + ":";
m_tscViewers.Items.Add(KPRes.TextViewer);
m_tscViewers.Items.Add(KPRes.ImageViewer);
@@ -133,12 +129,12 @@ namespace KeePass.Forms
else if(m_bdc == BinaryDataClass.WebDocument) m_tscViewers.SelectedIndex = 2;
else m_tscViewers.SelectedIndex = 0;
- if(this.Initializing != null)
- this.Initializing(this, new DvfContextEventArgs(this,
- m_pbData, m_strDataDesc, m_tscViewers));
+ if(this.DvfInit != null)
+ this.DvfInit(this, new DvfContextEventArgs(this, m_pbData,
+ m_strDataDesc, m_tscViewers));
m_bInitializing = false;
- UpdateDataView(enc);
+ UpdateDataView();
}
private void OnRichTextBoxLinkClicked(object sender, LinkClickedEventArgs e)
@@ -146,37 +142,22 @@ namespace KeePass.Forms
WinUtil.OpenUrl(e.LinkText, null);
}
- private string BinaryDataToString(Encoding enc)
+ private string BinaryDataToString()
{
- if(enc == null)
- {
- string strEnc = m_tscEncoding.Text;
+ string strEnc = m_tscEncoding.Text;
+ StrEncodingInfo sei = StrUtil.GetEncoding(strEnc);
- if(strEnc == (BinaryDataClassifier.BdeAnsi + " (" +
- KPRes.SystemCodePage + ")"))
- {
- enc = Encoding.Default;
- }
- else if(strEnc == BinaryDataClassifier.BdeAscii)
- enc = Encoding.ASCII;
- else if(strEnc == BinaryDataClassifier.BdeUtf7)
- enc = Encoding.UTF7;
- else if(strEnc == BinaryDataClassifier.BdeUtf8)
- enc = new UTF8Encoding(false);
- else if(strEnc == BinaryDataClassifier.BdeUtf32)
- enc = Encoding.UTF32;
- else if(strEnc == BinaryDataClassifier.BdeUnicodeLE)
- enc = Encoding.Unicode;
- else if(strEnc == BinaryDataClassifier.BdeUnicodeBE)
- enc = Encoding.BigEndianUnicode;
- else enc = Encoding.Default;
+ try
+ {
+ return (sei.Encoding.GetString(m_pbData, (int)m_uStartOffset,
+ m_pbData.Length - (int)m_uStartOffset) ?? string.Empty);
}
+ catch(Exception) { }
- return enc.GetString(m_pbData, (int)m_uStartOffset,
- m_pbData.Length - (int)m_uStartOffset);
+ return string.Empty;
}
- private void UpdateDataView(Encoding enc)
+ private void UpdateDataView()
{
if(m_bInitializing) return;
@@ -187,23 +168,29 @@ namespace KeePass.Forms
string strViewer = m_tscViewers.Text;
- m_tssSeparator0.Visible = m_tslEncoding.Visible =
- m_tscEncoding.Visible = !(strViewer == KPRes.ImageViewer);
+ bool bText = ((strViewer == KPRes.TextViewer) ||
+ (strViewer == KPRes.WebBrowser));
+ bool bImage = (strViewer == KPRes.ImageViewer);
+
+ m_tssSeparator0.Visible = (bText || bImage);
+ m_tslEncoding.Visible = m_tscEncoding.Visible = bText;
+ m_tslZoom.Visible = m_tscZoom.Visible = bImage;
try
{
- if(this.UpdatingDataView != null)
+ if(this.DvfUpdating != null)
{
DvfContextEventArgs args = new DvfContextEventArgs(this,
m_pbData, m_strDataDesc, m_tscViewers);
- this.UpdatingDataView(this, args);
+ this.DvfUpdating(this, args);
if(args.Cancel) return;
}
if(strViewer == KPRes.TextViewer)
{
- string strData = BinaryDataToString(enc);
+ string strData = BinaryDataToString();
+ m_rtbText.Clear(); // Clear formatting
if(m_bdc == BinaryDataClass.RichText) m_rtbText.Rtf = strData;
else m_rtbText.Text = strData;
@@ -211,17 +198,17 @@ namespace KeePass.Forms
}
else if(strViewer == KPRes.ImageViewer)
{
- Image img = UIUtil.LoadImage(m_pbData);
- m_picBox.Image = img;
+ if(m_img == null) m_img = UIUtil.LoadImage(m_pbData);
+ // m_picBox.Image = m_img;
m_pnlImageViewer.Visible = true;
m_picBox.Visible = true;
- OnFormSizeChanged(null, null);
+ UpdateImageView();
}
else if(strViewer == KPRes.WebBrowser)
{
- string strData = BinaryDataToString(enc);
+ string strData = BinaryDataToString();
UIUtil.SetWebBrowserDocument(m_webBrowser, strData);
@@ -233,35 +220,124 @@ namespace KeePass.Forms
private void OnViewersSelectedIndexChanged(object sender, EventArgs e)
{
- UpdateDataView(null);
+ UpdateDataView();
}
private void OnEncodingSelectedIndexChanged(object sender, EventArgs e)
{
- UpdateDataView(null);
+ UpdateDataView();
}
private void OnFormSizeChanged(object sender, EventArgs e)
{
- Image img = m_picBox.Image;
- if(img != null)
+ UpdateImageView();
+ }
+
+ private void UpdateImageView()
+ {
+ if(m_img == null) return;
+
+ string strZoom = m_tscZoom.Text;
+ if(string.IsNullOrEmpty(strZoom) || (strZoom == KPRes.Auto))
{
- if((img.Width > m_picBox.ClientSize.Width) ||
- (img.Height > m_picBox.ClientSize.Height))
+ m_pnlImageViewer.AutoScroll = false;
+ m_picBox.Dock = DockStyle.Fill;
+ m_picBox.Image = m_img;
+
+ if((m_img.Width > m_picBox.ClientSize.Width) ||
+ (m_img.Height > m_picBox.ClientSize.Height))
{
m_picBox.SizeMode = PictureBoxSizeMode.Zoom;
}
else m_picBox.SizeMode = PictureBoxSizeMode.CenterImage;
+
+ return;
+ }
+
+ if(!strZoom.EndsWith(@"%")) { Debug.Assert(false); return; }
+
+ int iZoom;
+ if(!int.TryParse(strZoom.Substring(0, strZoom.Length - 1), out iZoom))
+ {
+ Debug.Assert(false);
+ return;
+ }
+
+ int cliW = m_pnlImageViewer.ClientRectangle.Width;
+ int cliH = m_pnlImageViewer.ClientRectangle.Height;
+
+ int dx = (m_img.Width * iZoom) / 100;
+ int dy = (m_img.Height * iZoom) / 100;
+
+ float fScrollX = 0.5f, fScrollY = 0.5f;
+ if(m_pnlImageViewer.AutoScroll)
+ {
+ Point ptOffset = m_pnlImageViewer.AutoScrollPosition;
+ Size sz = m_picBox.ClientSize;
+
+ if(sz.Width > cliW)
+ {
+ fScrollX = Math.Abs((float)ptOffset.X / (float)(sz.Width - cliW));
+ if(fScrollX < 0.0f) { Debug.Assert(false); fScrollX = 0.0f; }
+ if(fScrollX > 1.0f) { Debug.Assert(false); fScrollX = 1.0f; }
+ }
+
+ if(sz.Height > cliH)
+ {
+ fScrollY = Math.Abs((float)ptOffset.Y / (float)(sz.Height - cliH));
+ if(fScrollY < 0.0f) { Debug.Assert(false); fScrollY = 0.0f; }
+ if(fScrollY > 1.0f) { Debug.Assert(false); fScrollY = 1.0f; }
+ }
}
+ m_pnlImageViewer.AutoScroll = false;
+
+ m_picBox.Dock = DockStyle.None;
+ m_picBox.SizeMode = PictureBoxSizeMode.AutoSize;
+
+ int x = 0, y = 0;
+ if(dx < cliW) x = (cliW - dx) / 2;
+ if(dy < cliH) y = (cliH - dy) / 2;
+
+ m_picBox.Location = new Point(x, y);
+
+ if((dx == m_img.Width) && (dy == m_img.Height))
+ m_picBox.Image = m_img;
+ else if((m_imgResized != null) && (m_imgResized.Width == dx) &&
+ (m_imgResized.Height == dy))
+ m_picBox.Image = m_imgResized;
+ else
+ {
+ Image imgToDispose = m_imgResized;
+
+ Image img = new Bitmap(dx, dy, PixelFormat.Format32bppArgb);
+ using(Graphics g = Graphics.FromImage(img))
+ {
+ g.InterpolationMode = InterpolationMode.High;
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.DrawImage(m_img, 0, 0, img.Width, img.Height);
+ }
+ m_imgResized = img;
+ m_picBox.Image = m_imgResized;
+
+ if(imgToDispose != null) imgToDispose.Dispose();
+ }
+
+ m_pnlImageViewer.AutoScroll = true;
+
+ int sx = 0, sy = 0;
+ if(dx > cliW) sx = (int)(fScrollX * (float)(dx - cliW));
+ if(dy > cliH) sy = (int)(fScrollY * (float)(dy - cliH));
+ try { m_pnlImageViewer.AutoScrollPosition = new Point(sx, sy); }
+ catch(Exception) { Debug.Assert(false); }
}
private void OnFormClosing(object sender, FormClosingEventArgs e)
{
- if(this.Uninitializing != null)
+ if(this.DvfRelease != null)
{
DvfContextEventArgs args = new DvfContextEventArgs(this,
m_pbData, m_strDataDesc, m_tscViewers);
- this.Uninitializing(sender, args);
+ this.DvfRelease(sender, args);
if(args.Cancel)
{
e.Cancel = true;
@@ -269,6 +345,10 @@ namespace KeePass.Forms
}
}
+ m_picBox.Image = null;
+ if(m_img != null) { m_img.Dispose(); m_img = null; }
+ if(m_imgResized != null) { m_imgResized.Dispose(); m_imgResized = null; }
+
m_ctxText.Detach();
GlobalWindowManager.RemoveWindow(this);
}
@@ -287,9 +367,14 @@ namespace KeePass.Forms
return base.ProcessCmdKey(ref msg, keyData);
}
+
+ private void OnZoomSelectedIndexChanged(object sender, EventArgs e)
+ {
+ UpdateImageView();
+ }
}
- public sealed class DvfContextEventArgs : CancelEventArgs
+ public sealed class DvfContextEventArgs : CancellableOperationEventArgs
{
private DataViewerForm m_form;
public DataViewerForm Form { get { return m_form; } }
@@ -304,8 +389,7 @@ namespace KeePass.Forms
public ToolStripComboBox ViewersComboBox { get { return m_tscViewers; } }
public DvfContextEventArgs(DataViewerForm form, byte[] pbData,
- string strDataDesc, ToolStripComboBox cbViewers) :
- base(false)
+ string strDataDesc, ToolStripComboBox cbViewers)
{
m_form = form;
m_pbData = pbData;
diff --git a/KeePass/Forms/DataViewerForm.resx b/KeePass/Forms/DataViewerForm.resx
index 0443815..8bceb6a 100644
--- a/KeePass/Forms/DataViewerForm.resx
+++ b/KeePass/Forms/DataViewerForm.resx
@@ -117,10 +117,10 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
- <metadata name="m_toolMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
- <value>17, 17</value>
- </metadata>
<metadata name="m_statusMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>126, 17</value>
</metadata>
+ <metadata name="m_toolMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
</root>
\ No newline at end of file
diff --git a/KeePass/Forms/EditAutoTypeItemForm.Designer.cs b/KeePass/Forms/EditAutoTypeItemForm.Designer.cs
index 5f5f9d5..47eea65 100644
--- a/KeePass/Forms/EditAutoTypeItemForm.Designer.cs
+++ b/KeePass/Forms/EditAutoTypeItemForm.Designer.cs
@@ -98,7 +98,7 @@
// m_lblKeySeqInsertInfo
//
this.m_lblKeySeqInsertInfo.AutoSize = true;
- this.m_lblKeySeqInsertInfo.Location = new System.Drawing.Point(119, 213);
+ this.m_lblKeySeqInsertInfo.Location = new System.Drawing.Point(29, 213);
this.m_lblKeySeqInsertInfo.Name = "m_lblKeySeqInsertInfo";
this.m_lblKeySeqInsertInfo.Size = new System.Drawing.Size(94, 13);
this.m_lblKeySeqInsertInfo.TabIndex = 6;
@@ -117,10 +117,10 @@
this.m_rbKeySeq.DetectUrls = false;
this.m_rbKeySeq.Font = new System.Drawing.Font("Courier New", 8.25F);
this.m_rbKeySeq.HideSelection = false;
- this.m_rbKeySeq.Location = new System.Drawing.Point(122, 187);
+ this.m_rbKeySeq.Location = new System.Drawing.Point(32, 187);
this.m_rbKeySeq.Multiline = false;
this.m_rbKeySeq.Name = "m_rbKeySeq";
- this.m_rbKeySeq.Size = new System.Drawing.Size(377, 20);
+ this.m_rbKeySeq.Size = new System.Drawing.Size(467, 20);
this.m_rbKeySeq.TabIndex = 5;
this.m_rbKeySeq.Text = "";
this.m_rbKeySeq.TextChanged += new System.EventHandler(this.OnTextChangedKeySeq);
@@ -128,21 +128,26 @@
// m_rtbPlaceholders
//
this.m_rtbPlaceholders.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
- this.m_rtbPlaceholders.Location = new System.Drawing.Point(122, 229);
+ this.m_rtbPlaceholders.Location = new System.Drawing.Point(32, 229);
this.m_rtbPlaceholders.Name = "m_rtbPlaceholders";
this.m_rtbPlaceholders.ReadOnly = true;
this.m_rtbPlaceholders.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical;
- this.m_rtbPlaceholders.Size = new System.Drawing.Size(377, 136);
+ this.m_rtbPlaceholders.Size = new System.Drawing.Size(467, 136);
this.m_rtbPlaceholders.TabIndex = 7;
this.m_rtbPlaceholders.Text = "";
this.m_rtbPlaceholders.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnPlaceholdersLinkClicked);
//
// m_cmbWindow
//
+ this.m_cmbWindow.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
+ this.m_cmbWindow.DropDownHeight = 218;
this.m_cmbWindow.FormattingEnabled = true;
- this.m_cmbWindow.Location = new System.Drawing.Point(123, 72);
+ this.m_cmbWindow.IntegralHeight = false;
+ this.m_cmbWindow.Location = new System.Drawing.Point(95, 72);
+ this.m_cmbWindow.MaxDropDownItems = 12;
this.m_cmbWindow.Name = "m_cmbWindow";
- this.m_cmbWindow.Size = new System.Drawing.Size(376, 21);
+ this.m_cmbWindow.OrderedImageList = null;
+ this.m_cmbWindow.Size = new System.Drawing.Size(404, 21);
this.m_cmbWindow.TabIndex = 0;
this.m_cmbWindow.SelectedIndexChanged += new System.EventHandler(this.OnWindowSelectedIndexChanged);
this.m_cmbWindow.TextUpdate += new System.EventHandler(this.OnWindowTextUpdate);
@@ -150,7 +155,7 @@
// m_lblOpenHint
//
this.m_lblOpenHint.AutoSize = true;
- this.m_lblOpenHint.Location = new System.Drawing.Point(120, 99);
+ this.m_lblOpenHint.Location = new System.Drawing.Point(92, 99);
this.m_lblOpenHint.Name = "m_lblOpenHint";
this.m_lblOpenHint.Size = new System.Drawing.Size(351, 13);
this.m_lblOpenHint.TabIndex = 1;
@@ -159,7 +164,7 @@
// m_lnkWildcardRegexHint
//
this.m_lnkWildcardRegexHint.AutoSize = true;
- this.m_lnkWildcardRegexHint.Location = new System.Drawing.Point(120, 116);
+ this.m_lnkWildcardRegexHint.Location = new System.Drawing.Point(92, 116);
this.m_lnkWildcardRegexHint.Name = "m_lnkWildcardRegexHint";
this.m_lnkWildcardRegexHint.Size = new System.Drawing.Size(270, 13);
this.m_lnkWildcardRegexHint.TabIndex = 2;
diff --git a/KeePass/Forms/EditAutoTypeItemForm.cs b/KeePass/Forms/EditAutoTypeItemForm.cs
index a6efb36..453e5fd 100644
--- a/KeePass/Forms/EditAutoTypeItemForm.cs
+++ b/KeePass/Forms/EditAutoTypeItemForm.cs
@@ -43,9 +43,10 @@ namespace KeePass.Forms
public partial class EditAutoTypeItemForm : Form
{
private AutoTypeConfig m_atConfig = null;
- private ProtectedStringDictionary m_vStringDict = null;
- private int m_iOrgIndex = -1;
+ private int m_iAssocIndex = -1;
private bool m_bEditSequenceOnly = false;
+ private string m_strDefaultSeq = string.Empty;
+ private ProtectedStringDictionary m_vStringDict = null;
// private Color m_clrOriginalForeground = Color.Black;
// private Color m_clrOriginalBackground = Color.White;
@@ -55,53 +56,28 @@ namespace KeePass.Forms
private RichTextBoxContextMenu m_ctxKeyCodes = new RichTextBoxContextMenu();
private bool m_bBlockUpdates = false;
- private const string VkcBreak = @"<break />";
-
- private static string[] SpecialKeyCodes = new string[] {
- "TAB", "ENTER", "UP", "DOWN", "LEFT", "RIGHT",
- "HOME", "END", "PGUP", "PGDN",
- "INSERT", "DELETE", VkcBreak,
- "BACKSPACE", "BREAK", "CAPSLOCK",
- "ESC", "HELP", "NUMLOCK", "PRTSC", "SCROLLLOCK", VkcBreak,
- "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12",
- "F13", "F14", "F15", "F16", VkcBreak,
- "ADD", "SUBTRACT", "MULTIPLY", "DIVIDE"
- };
-
- private static string[] SpecialPlaceholders = new string[] {
- "GROUP", "GROUPPATH", "PASSWORD_ENC", "URL:RMVSCM", VkcBreak,
- "DELAY 1000", "DELAY=200", "VKEY 65",
- "PICKCHARS", "PICKCHARS:Password:C=3",
- "NEWPASSWORD", "HMACOTP", "CLEARFIELD", VkcBreak,
- "APPDIR", "DB_PATH", "DB_DIR", "DB_NAME", "DB_BASENAME", "DB_EXT",
- "ENV_DIRSEP", VkcBreak,
- "DT_SIMPLE", "DT_YEAR", "DT_MONTH", "DT_DAY", "DT_HOUR", "DT_MINUTE",
- "DT_SECOND", "DT_UTC_SIMPLE", "DT_UTC_YEAR", "DT_UTC_MONTH",
- "DT_UTC_DAY", "DT_UTC_HOUR", "DT_UTC_MINUTE", "DT_UTC_SECOND"
- };
-
public EditAutoTypeItemForm()
{
InitializeComponent();
Program.Translation.ApplyTo(this);
}
- public void InitEx(AutoTypeConfig atConfig, ProtectedStringDictionary vStringDict,
- int iOrgIndex, bool bEditSequenceOnly)
+ public void InitEx(AutoTypeConfig atConfig, int iAssocIndex, bool bEditSequenceOnly,
+ string strDefaultSeq, ProtectedStringDictionary vStringDict)
{
- Debug.Assert(vStringDict != null); if(vStringDict == null) throw new ArgumentNullException("vStringDict");
Debug.Assert(atConfig != null); if(atConfig == null) throw new ArgumentNullException("atConfig");
m_atConfig = atConfig;
- m_vStringDict = vStringDict;
- m_iOrgIndex = iOrgIndex;
+ m_iAssocIndex = iAssocIndex;
m_bEditSequenceOnly = bEditSequenceOnly;
+ m_strDefaultSeq = (strDefaultSeq ?? string.Empty);
+ m_vStringDict = (vStringDict ?? new ProtectedStringDictionary());
}
private void OnFormLoad(object sender, EventArgs e)
{
- Debug.Assert(m_vStringDict != null); if(m_vStringDict == null) throw new InvalidOperationException();
Debug.Assert(m_atConfig != null); if(m_atConfig == null) throw new InvalidOperationException();
+ Debug.Assert(m_vStringDict != null); if(m_vStringDict == null) throw new InvalidOperationException();
GlobalWindowManager.AddWindow(this);
@@ -123,12 +99,81 @@ namespace KeePass.Forms
this.Icon = Properties.Resources.KeePass;
+ // FontUtil.AssignDefaultBold(m_lblTargetWindow);
+ // FontUtil.AssignDefaultBold(m_rbSeqDefault);
+ // FontUtil.AssignDefaultBold(m_rbSeqCustom);
+
UIUtil.EnableAutoCompletion(m_cmbWindow, false);
// m_clrOriginalForeground = m_lblOpenHint.ForeColor;
// m_clrOriginalBackground = m_cmbWindow.BackColor;
// m_strOriginalWindowHint = m_lblTargetWindowInfo.Text;
+ InitPlaceholdersBox();
+
+ string strInitSeq = m_atConfig.DefaultSequence;
+ if(m_iAssocIndex >= 0)
+ {
+ AutoTypeAssociation asInit = m_atConfig.GetAt(m_iAssocIndex);
+ m_cmbWindow.Text = asInit.WindowName;
+
+ if(!m_bEditSequenceOnly) strInitSeq = asInit.Sequence;
+ }
+ else if(m_bEditSequenceOnly)
+ m_cmbWindow.Text = "(" + KPRes.Default + ")";
+ else strInitSeq = string.Empty;
+
+ bool bSetDefault = false;
+ m_bBlockUpdates = true;
+ if(strInitSeq.Length > 0) m_rbSeqCustom.Checked = true;
+ else
+ {
+ m_rbSeqDefault.Checked = true;
+ bSetDefault = true;
+ }
+ m_bBlockUpdates = false;
+
+ if(bSetDefault) m_rbKeySeq.Text = m_strDefaultSeq;
+ else m_rbKeySeq.Text = strInitSeq;
+
+ try
+ {
+ if(NativeLib.IsUnix()) PopulateWindowsListUnix();
+ else PopulateWindowsListWin();
+ }
+ catch(Exception) { Debug.Assert(false); }
+
+ EnableControlsEx();
+ }
+
+ private void InitPlaceholdersBox()
+ {
+ const string VkcBreak = @"<break />";
+
+ string[] vSpecialKeyCodes = new string[] {
+ "TAB", "ENTER", "UP", "DOWN", "LEFT", "RIGHT",
+ "HOME", "END", "PGUP", "PGDN",
+ "INSERT", "DELETE", VkcBreak,
+ "BACKSPACE", "BREAK", "CAPSLOCK",
+ "ESC", "HELP", "NUMLOCK", "PRTSC", "SCROLLLOCK", VkcBreak,
+ "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12",
+ "F13", "F14", "F15", "F16", VkcBreak,
+ "ADD", "SUBTRACT", "MULTIPLY", "DIVIDE"
+ };
+
+ string[] vSpecialPlaceholders = new string[] {
+ "GROUP", "GROUPPATH", "PASSWORD_ENC", "URL:RMVSCM",
+ "C:Comment", VkcBreak,
+ "DELAY 1000", "DELAY=200", "VKEY 65",
+ "PICKCHARS", "PICKCHARS:Password:C=3",
+ "NEWPASSWORD", "HMACOTP", "CLEARFIELD", VkcBreak,
+ "APPDIR", "DB_PATH", "DB_DIR", "DB_NAME", "DB_BASENAME", "DB_EXT",
+ "ENV_DIRSEP", VkcBreak,
+ "DT_SIMPLE", "DT_YEAR", "DT_MONTH", "DT_DAY", "DT_HOUR", "DT_MINUTE",
+ "DT_SECOND", "DT_UTC_SIMPLE", "DT_UTC_YEAR", "DT_UTC_MONTH",
+ "DT_UTC_DAY", "DT_UTC_HOUR", "DT_UTC_MINUTE", "DT_UTC_SECOND"
+ };
+
RichTextBuilder rb = new RichTextBuilder();
rb.AppendLine(KPRes.StandardFields, FontStyle.Bold, null, null, ":", null);
@@ -168,7 +213,7 @@ namespace KeePass.Forms
rb.AppendLine();
rb.AppendLine(KPRes.SpecialKeys, FontStyle.Bold, null, null, ":", null);
bFirst = true;
- foreach(string strNav in SpecialKeyCodes)
+ foreach(string strNav in vSpecialKeyCodes)
{
if(strNav == VkcBreak) { rb.AppendLine(); rb.AppendLine(); bFirst = true; }
else
@@ -183,7 +228,7 @@ namespace KeePass.Forms
rb.AppendLine();
rb.AppendLine(KPRes.OtherPlaceholders, FontStyle.Bold, null, null, ":", null);
bFirst = true;
- foreach(string strPH in SpecialPlaceholders)
+ foreach(string strPH in vSpecialPlaceholders)
{
if(strPH == VkcBreak) { rb.AppendLine(); rb.AppendLine(); bFirst = true; }
else
@@ -197,38 +242,16 @@ namespace KeePass.Forms
rb.Build(m_rtbPlaceholders);
LinkifyRtf(m_rtbPlaceholders);
-
- if(m_iOrgIndex >= 0)
- {
- AutoTypeAssociation asInit = m_atConfig.GetAt(m_iOrgIndex);
- m_cmbWindow.Text = asInit.WindowName;
-
- if(!m_bEditSequenceOnly)
- m_rbKeySeq.Text = asInit.Sequence;
- else
- m_rbKeySeq.Text = m_atConfig.DefaultSequence;
- }
- else if(m_bEditSequenceOnly)
- m_cmbWindow.Text = "(" + KPRes.Default + ")";
-
- m_bBlockUpdates = true;
- if(m_rbKeySeq.Text.Length > 0) m_rbSeqCustom.Checked = true;
- else m_rbSeqDefault.Checked = true;
- m_bBlockUpdates = false;
-
- try
- {
- if(NativeLib.IsUnix()) PopulateWindowsListUnix();
- else PopulateWindowsListWin();
- }
- catch(Exception) { Debug.Assert(false); }
-
- EnableControlsEx();
}
private void OnFormShown(object sender, EventArgs e)
{
- UIUtil.SetFocus(m_cmbWindow, this); // Doesn't work in OnFormLoad
+ // Focusing doesn't work in OnFormLoad
+ if(m_cmbWindow.Enabled)
+ UIUtil.SetFocus(m_cmbWindow, this);
+ else if(m_rbKeySeq.Enabled)
+ UIUtil.SetFocus(m_rbKeySeq, this);
+ else UIUtil.SetFocus(m_btnOK, this);
}
private void CleanUpEx()
@@ -254,7 +277,7 @@ namespace KeePass.Forms
if(!m_bEditSequenceOnly)
{
AutoTypeAssociation atAssoc;
- if(m_iOrgIndex >= 0) atAssoc = m_atConfig.GetAt(m_iOrgIndex);
+ if(m_iAssocIndex >= 0) atAssoc = m_atConfig.GetAt(m_iAssocIndex);
else
{
atAssoc = new AutoTypeAssociation();
@@ -316,13 +339,18 @@ namespace KeePass.Forms
// m_btnOK.Enabled = false;
// }
- if(m_bEditSequenceOnly)
- {
- m_cmbWindow.Enabled = false;
- // m_lblTargetWindowInfo.Enabled = false;
- }
+ m_lblTargetWindow.Enabled = !m_bEditSequenceOnly;
+ m_cmbWindow.Enabled = !m_bEditSequenceOnly;
+ m_lblOpenHint.Enabled = !m_bEditSequenceOnly;
+ m_lnkWildcardRegexHint.Enabled = !m_bEditSequenceOnly;
+
+ // Workaround for disabled link render bug (gray too dark)
+ m_lnkWildcardRegexHint.Visible = !m_bEditSequenceOnly;
- m_rbKeySeq.Enabled = m_rbSeqCustom.Checked;
+ bool bCustom = m_rbSeqCustom.Checked;
+ m_rbKeySeq.Enabled = bCustom;
+ m_lblKeySeqInsertInfo.Enabled = bCustom;
+ m_rtbPlaceholders.Enabled = bCustom;
m_bBlockUpdates = false;
}
diff --git a/KeePass/Forms/EditStringForm.cs b/KeePass/Forms/EditStringForm.cs
index 0e0f7a1..8e7face 100644
--- a/KeePass/Forms/EditStringForm.cs
+++ b/KeePass/Forms/EditStringForm.cs
@@ -186,20 +186,17 @@ namespace KeePass.Forms
if(m_strStringName == null) // Add string field
{
- Debug.Assert(m_vStringDict.Exists(strName) == false);
-
- ProtectedString ps = new ProtectedString(m_cbProtect.Checked, m_richStringValue.Text);
- m_vStringDict.Set(strName, ps);
+ Debug.Assert(!m_vStringDict.Exists(strName));
}
else // Edit string field
{
if(!m_strStringName.Equals(strName))
m_vStringDict.Remove(m_strStringName);
-
- ProtectedString ps = new ProtectedString(m_cbProtect.Checked,
- m_richStringValue.Text);
- m_vStringDict.Set(strName, ps);
}
+
+ ProtectedString ps = new ProtectedString(m_cbProtect.Checked,
+ m_richStringValue.Text);
+ m_vStringDict.Set(strName, ps);
}
private void OnBtnCancel(object sender, EventArgs e)
diff --git a/KeePass/Forms/ExchangeDataForm.cs b/KeePass/Forms/ExchangeDataForm.cs
index 0f5b68b..1b9fd84 100644
--- a/KeePass/Forms/ExchangeDataForm.cs
+++ b/KeePass/Forms/ExchangeDataForm.cs
@@ -195,19 +195,19 @@ namespace KeePass.Forms
if(!m_fmtCur.RequiresFile) return; // Break on double-click
string strFormat = m_fmtCur.FormatName;
- if((strFormat == null) || (strFormat.Length == 0))
- strFormat = KPRes.Data;
+ if(string.IsNullOrEmpty(strFormat)) strFormat = KPRes.Data;
- string strExt = m_fmtCur.DefaultExtension;
- if((strExt == null) || (strExt.Length == 0))
- strExt = "export";
+ string strExts = m_fmtCur.DefaultExtension;
+ if(string.IsNullOrEmpty(strExts)) strExts = "export";
+ string strPriExt = UIUtil.GetPrimaryFileTypeExt(strExts);
+ if(strPriExt.Length == 0) strPriExt = "export"; // In case of "|"
- string strFilter = UIUtil.CreateFileTypeFilter(strExt, strFormat, true);
+ string strFilter = UIUtil.CreateFileTypeFilter(strExts, strFormat, true);
if(m_bExport == false) // Import
{
OpenFileDialog ofd = UIUtil.CreateOpenFileDialog(KPRes.Import + ": " +
- strFormat, strFilter, 1, strExt, true, true);
+ strFormat, strFilter, 1, strPriExt, true, true);
if(ofd.ShowDialog() != DialogResult.OK) return;
@@ -230,7 +230,7 @@ namespace KeePass.Forms
else // Export
{
SaveFileDialog sfd = UIUtil.CreateSaveFileDialog(KPRes.Export + ": " +
- strFormat, null, strFilter, 1, strExt, false);
+ strFormat, null, strFilter, 1, strPriExt, false);
string strSuggestion;
if((m_pwDatabaseInfo != null) &&
@@ -241,15 +241,9 @@ namespace KeePass.Forms
}
else strSuggestion = KPRes.Database;
- if((m_fmtCur != null) && (m_fmtCur.DefaultExtension != null) &&
- (m_fmtCur.DefaultExtension.Length > 0))
- {
- strSuggestion += "." + m_fmtCur.DefaultExtension;
- }
- else strSuggestion += ".export";
+ strSuggestion += "." + strPriExt;
sfd.FileName = strSuggestion;
-
if(sfd.ShowDialog() != DialogResult.OK) return;
m_tbFile.Text = sfd.FileName;
diff --git a/KeePass/Forms/FieldRefForm.cs b/KeePass/Forms/FieldRefForm.cs
index 4e791fd..56c7f2e 100644
--- a/KeePass/Forms/FieldRefForm.cs
+++ b/KeePass/Forms/FieldRefForm.cs
@@ -70,9 +70,7 @@ namespace KeePass.Forms
this.Icon = Properties.Resources.KeePass;
- UIUtil.SetExplorerTheme(m_lvEntries.Handle);
- if(UISystemFonts.ListFont != null)
- m_lvEntries.Font = UISystemFonts.ListFont;
+ UIUtil.SetExplorerTheme(m_lvEntries, true);
m_vColumns.Add(new KeyValuePair<string, string>(PwDefs.TitleField, KPRes.Title));
m_vColumns.Add(new KeyValuePair<string, string>(PwDefs.UserNameField, KPRes.UserName));
diff --git a/KeePass/Forms/FileBrowserForm.cs b/KeePass/Forms/FileBrowserForm.cs
index 757452f..c1a8be4 100644
--- a/KeePass/Forms/FileBrowserForm.cs
+++ b/KeePass/Forms/FileBrowserForm.cs
@@ -102,13 +102,8 @@ namespace KeePass.Forms
{
m_tvFolders.ShowLines = false;
- UIUtil.SetExplorerTheme(m_tvFolders.Handle);
- UIUtil.SetExplorerTheme(m_lvFiles.Handle);
- }
- if(UISystemFonts.ListFont != null)
- {
- m_tvFolders.Font = UISystemFonts.ListFont;
- m_lvFiles.Font = UISystemFonts.ListFont;
+ UIUtil.SetExplorerTheme(m_tvFolders, true);
+ UIUtil.SetExplorerTheme(m_lvFiles, true);
}
m_btnOK.Text = (m_bSaveMode ? KPRes.SaveCmd : KPRes.OpenCmd);
diff --git a/KeePass/Forms/GroupForm.Designer.cs b/KeePass/Forms/GroupForm.Designer.cs
index f2a90ab..d7728f5 100644
--- a/KeePass/Forms/GroupForm.Designer.cs
+++ b/KeePass/Forms/GroupForm.Designer.cs
@@ -160,7 +160,6 @@
this.m_dtExpires.Name = "m_dtExpires";
this.m_dtExpires.Size = new System.Drawing.Size(259, 20);
this.m_dtExpires.TabIndex = 5;
- this.m_dtExpires.ValueChanged += new System.EventHandler(this.OnExpiresValueChanged);
//
// m_cbExpires
//
@@ -267,7 +266,7 @@
//
// m_btnAutoTypeEdit
//
- this.m_btnAutoTypeEdit.Location = new System.Drawing.Point(318, 57);
+ this.m_btnAutoTypeEdit.Location = new System.Drawing.Point(315, 54);
this.m_btnAutoTypeEdit.Name = "m_btnAutoTypeEdit";
this.m_btnAutoTypeEdit.Size = new System.Drawing.Size(32, 23);
this.m_btnAutoTypeEdit.TabIndex = 3;
@@ -299,7 +298,7 @@
//
// m_lblAutoTypeDesc
//
- this.m_lblAutoTypeDesc.Location = new System.Drawing.Point(29, 82);
+ this.m_lblAutoTypeDesc.Location = new System.Drawing.Point(26, 79);
this.m_lblAutoTypeDesc.Name = "m_lblAutoTypeDesc";
this.m_lblAutoTypeDesc.Size = new System.Drawing.Size(321, 27);
this.m_lblAutoTypeDesc.TabIndex = 4;
@@ -308,7 +307,7 @@
//
// m_tbDefaultAutoTypeSeq
//
- this.m_tbDefaultAutoTypeSeq.Location = new System.Drawing.Point(32, 59);
+ this.m_tbDefaultAutoTypeSeq.Location = new System.Drawing.Point(29, 56);
this.m_tbDefaultAutoTypeSeq.Name = "m_tbDefaultAutoTypeSeq";
this.m_tbDefaultAutoTypeSeq.Size = new System.Drawing.Size(280, 20);
this.m_tbDefaultAutoTypeSeq.TabIndex = 2;
diff --git a/KeePass/Forms/GroupForm.cs b/KeePass/Forms/GroupForm.cs
index d78454d..3a0f7b5 100644
--- a/KeePass/Forms/GroupForm.cs
+++ b/KeePass/Forms/GroupForm.cs
@@ -43,6 +43,8 @@ namespace KeePass.Forms
private PwIcon m_pwIconIndex = 0;
private PwUuid m_pwCustomIconID = PwUuid.Zero;
+ private ExpiryControlGroup m_cgExpiry = new ExpiryControlGroup();
+
public void InitEx(PwGroup pg, ImageList ilClientIcons, PwDatabase pwDatabase)
{
m_pwGroup = pg;
@@ -71,9 +73,6 @@ namespace KeePass.Forms
UIUtil.SetButtonImage(m_btnAutoTypeEdit,
Properties.Resources.B16x16_Wizard, true);
- m_dtExpires.CustomFormat = DateTimeFormatInfo.CurrentInfo.ShortDatePattern +
- " " + DateTimeFormatInfo.CurrentInfo.LongTimePattern;
-
m_pwIconIndex = m_pwGroup.IconId;
m_pwCustomIconID = m_pwGroup.CustomIconUuid;
@@ -94,9 +93,10 @@ namespace KeePass.Forms
}
else // Does not expire
{
- m_dtExpires.Value = DateTime.Now;
+ m_dtExpires.Value = DateTime.Now.Date;
m_cbExpires.Checked = false;
}
+ m_cgExpiry.Attach(m_cbExpires, m_dtExpires);
UIUtil.MakeInheritableBoolComboBox(m_cmbEnableAutoType,
m_pwGroup.EnableAutoType, m_pwGroup.GetAutoTypeEnabledInherited());
@@ -137,8 +137,8 @@ namespace KeePass.Forms
m_pwGroup.IconId = m_pwIconIndex;
m_pwGroup.CustomIconUuid = m_pwCustomIconID;
- m_pwGroup.Expires = m_cbExpires.Checked;
- m_pwGroup.ExpiryTime = m_dtExpires.Value;
+ m_pwGroup.Expires = m_cgExpiry.Checked;
+ m_pwGroup.ExpiryTime = m_cgExpiry.Value;
m_pwGroup.EnableAutoType = UIUtil.GetInheritableBoolComboBoxValue(m_cmbEnableAutoType);
m_pwGroup.EnableSearching = UIUtil.GetInheritableBoolComboBoxValue(m_cmbEnableSearching);
@@ -152,6 +152,11 @@ namespace KeePass.Forms
{
}
+ private void CleanUpEx()
+ {
+ m_cgExpiry.Release();
+ }
+
private void OnBtnIcon(object sender, EventArgs e)
{
IconPickerForm ipf = new IconPickerForm();
@@ -176,11 +181,6 @@ namespace KeePass.Forms
UIUtil.DestroyForm(ipf);
}
- private void OnExpiresValueChanged(object sender, EventArgs e)
- {
- m_cbExpires.Checked = true;
- }
-
private void OnAutoTypeInheritCheckedChanged(object sender, EventArgs e)
{
EnableControlsEx();
@@ -194,7 +194,7 @@ namespace KeePass.Forms
atConfig.DefaultSequence = m_tbDefaultAutoTypeSeq.Text;
EditAutoTypeItemForm dlg = new EditAutoTypeItemForm();
- dlg.InitEx(atConfig, new ProtectedStringDictionary(), -1, true);
+ dlg.InitEx(atConfig, -1, true, atConfig.DefaultSequence, null);
if(dlg.ShowDialog() == DialogResult.OK)
m_tbDefaultAutoTypeSeq.Text = atConfig.DefaultSequence;
@@ -205,6 +205,7 @@ namespace KeePass.Forms
private void OnFormClosed(object sender, FormClosedEventArgs e)
{
+ CleanUpEx();
GlobalWindowManager.RemoveWindow(this);
}
}
diff --git a/KeePass/Forms/IconPickerForm.cs b/KeePass/Forms/IconPickerForm.cs
index 8d88515..50a0469 100644
--- a/KeePass/Forms/IconPickerForm.cs
+++ b/KeePass/Forms/IconPickerForm.cs
@@ -240,7 +240,7 @@ namespace KeePass.Forms
try
{
- if(File.Exists(strFile) == false)
+ if(!File.Exists(strFile))
throw new FileNotFoundException();
// Image img = Image.FromFile(strFile);
diff --git a/KeePass/Forms/KeyPromptForm.cs b/KeePass/Forms/KeyPromptForm.cs
index 383784a..1510269 100644
--- a/KeePass/Forms/KeyPromptForm.cs
+++ b/KeePass/Forms/KeyPromptForm.cs
@@ -235,8 +235,8 @@ namespace KeePass.Forms
Debug.Assert(strKeyFile != null); if(strKeyFile == null) strKeyFile = string.Empty;
bool bIsProvKey = Program.KeyProviderPool.IsKeyProvider(strKeyFile);
- if(m_cbKeyFile.Checked && (!strKeyFile.Equals(KPRes.NoKeyFileSpecifiedMeta)) &&
- (bIsProvKey == false))
+ if(m_cbKeyFile.Checked && !strKeyFile.Equals(KPRes.NoKeyFileSpecifiedMeta) &&
+ !bIsProvKey)
{
if(ValidateKeyFileLocation() == false) return false;
@@ -247,8 +247,8 @@ namespace KeePass.Forms
return false;
}
}
- else if(m_cbKeyFile.Checked && (!strKeyFile.Equals(KPRes.NoKeyFileSpecifiedMeta)) &&
- (bIsProvKey == true))
+ else if(m_cbKeyFile.Checked && !strKeyFile.Equals(KPRes.NoKeyFileSpecifiedMeta) &&
+ bIsProvKey)
{
KeyProvider kp = Program.KeyProviderPool.Get(strKeyFile);
if((kp != null) && m_bSecureDesktop)
@@ -304,13 +304,14 @@ namespace KeePass.Forms
bool bSuccess = true;
- if(File.Exists(strKeyFile) == false)
+ IOConnectionInfo ioc = IOConnectionInfo.FromPath(strKeyFile);
+ if(!IOConnection.FileExists(ioc))
{
MessageService.ShowWarning(strKeyFile, KPRes.FileNotFoundError);
bSuccess = false;
}
- if(bSuccess == false)
+ if(!bSuccess)
{
int nPos = m_cmbKeyFile.Items.IndexOf(strKeyFile);
if(nPos >= 0) m_cmbKeyFile.Items.RemoveAt(nPos);
diff --git a/KeePass/Forms/LanguageForm.cs b/KeePass/Forms/LanguageForm.cs
index 20fafab..d7fb07a 100644
--- a/KeePass/Forms/LanguageForm.cs
+++ b/KeePass/Forms/LanguageForm.cs
@@ -30,6 +30,7 @@ using KeePass.App.Configuration;
using KeePass.UI;
using KeePass.Resources;
using KeePass.Util;
+using KeePass.Util.XmlSerialization;
using KeePassLib;
using KeePassLib.Translation;
@@ -88,7 +89,8 @@ namespace KeePass.Forms
{
string strFullName = fi.FullName;
- if(strFullName.ToLower().EndsWith("." + KPTranslation.FileExtension))
+ if(strFullName.EndsWith("." + KPTranslation.FileExtension,
+ StrUtil.CaseIgnoreCmp))
{
string strFileName = UrlUtil.GetFileName(strFullName);
@@ -105,7 +107,9 @@ namespace KeePass.Forms
try
{
- KPTranslation kpTrl = KPTranslation.LoadFromFile(strFullName);
+ XmlSerializerEx xs = new XmlSerializerEx(typeof(KPTranslation));
+ KPTranslation kpTrl = KPTranslation.LoadFromFile(
+ strFullName, xs);
ListViewItem lvi = m_lvLanguages.Items.Add(
kpTrl.Properties.NameEnglish, 0);
diff --git a/KeePass/Forms/MainForm.Designer.cs b/KeePass/Forms/MainForm.Designer.cs
index f8b714d..ae47290 100644
--- a/KeePass/Forms/MainForm.Designer.cs
+++ b/KeePass/Forms/MainForm.Designer.cs
@@ -207,8 +207,9 @@
this.m_ctxTray = new System.Windows.Forms.ContextMenuStrip(this.components);
this.m_ctxTrayTray = new System.Windows.Forms.ToolStripMenuItem();
this.m_ctxTraySep0 = new System.Windows.Forms.ToolStripSeparator();
- this.m_ctxTrayLock = new System.Windows.Forms.ToolStripMenuItem();
+ this.m_ctxTrayOptions = new System.Windows.Forms.ToolStripMenuItem();
this.m_ctxTraySep1 = new System.Windows.Forms.ToolStripSeparator();
+ this.m_ctxTrayLock = new System.Windows.Forms.ToolStripMenuItem();
this.m_ctxTrayFileExit = new System.Windows.Forms.ToolStripMenuItem();
this.m_timerMain = new System.Windows.Forms.Timer(this.components);
this.m_tabMain = new System.Windows.Forms.TabControl();
@@ -217,7 +218,6 @@
this.m_tvGroups = new KeePass.UI.CustomTreeViewEx();
this.m_lvEntries = new KeePass.UI.CustomListViewEx();
this.m_richEntryView = new KeePass.UI.CustomRichTextBoxEx();
- this.m_ctxTrayOptions = new System.Windows.Forms.ToolStripMenuItem();
this.m_ctxGroupList.SuspendLayout();
this.m_ctxPwList.SuspendLayout();
this.m_menuMain.SuspendLayout();
@@ -248,27 +248,27 @@
this.m_ctxGroupSep3,
this.m_ctxGroupRearrange});
this.m_ctxGroupList.Name = "m_ctxGroupList";
- this.m_ctxGroupList.Size = new System.Drawing.Size(166, 204);
+ this.m_ctxGroupList.Size = new System.Drawing.Size(180, 204);
this.m_ctxGroupList.Opening += new System.ComponentModel.CancelEventHandler(this.OnCtxGroupListOpening);
//
// m_ctxGroupAdd
//
this.m_ctxGroupAdd.Image = global::KeePass.Properties.Resources.B16x16_Folder_Sent_Mail;
this.m_ctxGroupAdd.Name = "m_ctxGroupAdd";
- this.m_ctxGroupAdd.Size = new System.Drawing.Size(165, 22);
+ this.m_ctxGroupAdd.Size = new System.Drawing.Size(179, 22);
this.m_ctxGroupAdd.Text = "Add &Group";
this.m_ctxGroupAdd.Click += new System.EventHandler(this.OnGroupsAdd);
//
// m_ctxGroupSep0
//
this.m_ctxGroupSep0.Name = "m_ctxGroupSep0";
- this.m_ctxGroupSep0.Size = new System.Drawing.Size(162, 6);
+ this.m_ctxGroupSep0.Size = new System.Drawing.Size(176, 6);
//
// m_ctxGroupEdit
//
this.m_ctxGroupEdit.Image = global::KeePass.Properties.Resources.B16x16_Folder_Txt;
this.m_ctxGroupEdit.Name = "m_ctxGroupEdit";
- this.m_ctxGroupEdit.Size = new System.Drawing.Size(165, 22);
+ this.m_ctxGroupEdit.Size = new System.Drawing.Size(179, 22);
this.m_ctxGroupEdit.Text = "Ed&it Group";
this.m_ctxGroupEdit.Click += new System.EventHandler(this.OnGroupsEdit);
//
@@ -276,7 +276,7 @@
//
this.m_ctxGroupDelete.Image = global::KeePass.Properties.Resources.B16x16_Folder_Locked;
this.m_ctxGroupDelete.Name = "m_ctxGroupDelete";
- this.m_ctxGroupDelete.Size = new System.Drawing.Size(165, 22);
+ this.m_ctxGroupDelete.Size = new System.Drawing.Size(179, 22);
this.m_ctxGroupDelete.Text = "Dele&te Group";
this.m_ctxGroupDelete.Click += new System.EventHandler(this.OnGroupsDelete);
//
@@ -284,33 +284,33 @@
//
this.m_ctxGroupEmpty.Image = global::KeePass.Properties.Resources.B16x16_Trashcan_Full;
this.m_ctxGroupEmpty.Name = "m_ctxGroupEmpty";
- this.m_ctxGroupEmpty.Size = new System.Drawing.Size(165, 22);
+ this.m_ctxGroupEmpty.Size = new System.Drawing.Size(179, 22);
this.m_ctxGroupEmpty.Text = "&Empty Recycle Bin";
this.m_ctxGroupEmpty.Click += new System.EventHandler(this.OnGroupsEmpty);
//
// m_ctxGroupSep1
//
this.m_ctxGroupSep1.Name = "m_ctxGroupSep1";
- this.m_ctxGroupSep1.Size = new System.Drawing.Size(162, 6);
+ this.m_ctxGroupSep1.Size = new System.Drawing.Size(176, 6);
//
// m_ctxGroupFind
//
this.m_ctxGroupFind.Image = global::KeePass.Properties.Resources.B16x16_XMag;
this.m_ctxGroupFind.Name = "m_ctxGroupFind";
- this.m_ctxGroupFind.Size = new System.Drawing.Size(165, 22);
+ this.m_ctxGroupFind.Size = new System.Drawing.Size(179, 22);
this.m_ctxGroupFind.Text = "&Find in this Group...";
this.m_ctxGroupFind.Click += new System.EventHandler(this.OnGroupsFind);
//
// m_ctxGroupSep2
//
this.m_ctxGroupSep2.Name = "m_ctxGroupSep2";
- this.m_ctxGroupSep2.Size = new System.Drawing.Size(162, 6);
+ this.m_ctxGroupSep2.Size = new System.Drawing.Size(176, 6);
//
// m_ctxGroupPrint
//
this.m_ctxGroupPrint.Image = global::KeePass.Properties.Resources.B16x16_FilePrint;
this.m_ctxGroupPrint.Name = "m_ctxGroupPrint";
- this.m_ctxGroupPrint.Size = new System.Drawing.Size(165, 22);
+ this.m_ctxGroupPrint.Size = new System.Drawing.Size(179, 22);
this.m_ctxGroupPrint.Text = "&Print Group...";
this.m_ctxGroupPrint.Click += new System.EventHandler(this.OnGroupsPrint);
//
@@ -318,14 +318,14 @@
//
this.m_ctxGroupExport.Image = global::KeePass.Properties.Resources.B16x16_Folder_Outbox;
this.m_ctxGroupExport.Name = "m_ctxGroupExport";
- this.m_ctxGroupExport.Size = new System.Drawing.Size(165, 22);
+ this.m_ctxGroupExport.Size = new System.Drawing.Size(179, 22);
this.m_ctxGroupExport.Text = "E&xport...";
this.m_ctxGroupExport.Click += new System.EventHandler(this.OnGroupsExport);
//
// m_ctxGroupSep3
//
this.m_ctxGroupSep3.Name = "m_ctxGroupSep3";
- this.m_ctxGroupSep3.Size = new System.Drawing.Size(162, 6);
+ this.m_ctxGroupSep3.Size = new System.Drawing.Size(176, 6);
//
// m_ctxGroupRearrange
//
@@ -338,14 +338,14 @@
this.m_ctxGroupSort,
this.m_ctxGroupSortRec});
this.m_ctxGroupRearrange.Name = "m_ctxGroupRearrange";
- this.m_ctxGroupRearrange.Size = new System.Drawing.Size(165, 22);
+ this.m_ctxGroupRearrange.Size = new System.Drawing.Size(179, 22);
this.m_ctxGroupRearrange.Text = "&Rearrange";
//
// m_ctxGroupMoveToTop
//
this.m_ctxGroupMoveToTop.Image = global::KeePass.Properties.Resources.B16x16_2UpArrow;
this.m_ctxGroupMoveToTop.Name = "m_ctxGroupMoveToTop";
- this.m_ctxGroupMoveToTop.Size = new System.Drawing.Size(187, 22);
+ this.m_ctxGroupMoveToTop.Size = new System.Drawing.Size(202, 22);
this.m_ctxGroupMoveToTop.Text = "Move Group to &Top";
this.m_ctxGroupMoveToTop.Click += new System.EventHandler(this.OnGroupsMoveToTop);
//
@@ -353,7 +353,7 @@
//
this.m_ctxGroupMoveOneUp.Image = global::KeePass.Properties.Resources.B16x16_1UpArrow;
this.m_ctxGroupMoveOneUp.Name = "m_ctxGroupMoveOneUp";
- this.m_ctxGroupMoveOneUp.Size = new System.Drawing.Size(187, 22);
+ this.m_ctxGroupMoveOneUp.Size = new System.Drawing.Size(202, 22);
this.m_ctxGroupMoveOneUp.Text = "Move Group &One Up";
this.m_ctxGroupMoveOneUp.Click += new System.EventHandler(this.OnGroupsMoveOneUp);
//
@@ -361,7 +361,7 @@
//
this.m_ctxGroupMoveOneDown.Image = global::KeePass.Properties.Resources.B16x16_1DownArrow;
this.m_ctxGroupMoveOneDown.Name = "m_ctxGroupMoveOneDown";
- this.m_ctxGroupMoveOneDown.Size = new System.Drawing.Size(187, 22);
+ this.m_ctxGroupMoveOneDown.Size = new System.Drawing.Size(202, 22);
this.m_ctxGroupMoveOneDown.Text = "Mo&ve Group One Down";
this.m_ctxGroupMoveOneDown.Click += new System.EventHandler(this.OnGroupsMoveOneDown);
//
@@ -369,20 +369,20 @@
//
this.m_ctxGroupMoveToBottom.Image = global::KeePass.Properties.Resources.B16x16_2DownArrow;
this.m_ctxGroupMoveToBottom.Name = "m_ctxGroupMoveToBottom";
- this.m_ctxGroupMoveToBottom.Size = new System.Drawing.Size(187, 22);
+ this.m_ctxGroupMoveToBottom.Size = new System.Drawing.Size(202, 22);
this.m_ctxGroupMoveToBottom.Text = "Move Group to &Bottom";
this.m_ctxGroupMoveToBottom.Click += new System.EventHandler(this.OnGroupsMoveToBottom);
//
// m_ctxGroupRearrSep0
//
this.m_ctxGroupRearrSep0.Name = "m_ctxGroupRearrSep0";
- this.m_ctxGroupRearrSep0.Size = new System.Drawing.Size(184, 6);
+ this.m_ctxGroupRearrSep0.Size = new System.Drawing.Size(199, 6);
//
// m_ctxGroupSort
//
this.m_ctxGroupSort.Image = global::KeePass.Properties.Resources.B16x16_KaboodleLoop;
this.m_ctxGroupSort.Name = "m_ctxGroupSort";
- this.m_ctxGroupSort.Size = new System.Drawing.Size(187, 22);
+ this.m_ctxGroupSort.Size = new System.Drawing.Size(202, 22);
this.m_ctxGroupSort.Text = "&Sort Direct Subgroups";
this.m_ctxGroupSort.Click += new System.EventHandler(this.OnGroupsSort);
//
@@ -390,7 +390,7 @@
//
this.m_ctxGroupSortRec.Image = global::KeePass.Properties.Resources.B16x16_KaboodleLoop;
this.m_ctxGroupSortRec.Name = "m_ctxGroupSortRec";
- this.m_ctxGroupSortRec.Size = new System.Drawing.Size(187, 22);
+ this.m_ctxGroupSortRec.Size = new System.Drawing.Size(202, 22);
this.m_ctxGroupSortRec.Text = "So&rt Subgroup Tree";
this.m_ctxGroupSortRec.Click += new System.EventHandler(this.OnGroupsSortRec);
//
@@ -490,14 +490,14 @@
this.m_ctxEntryClipboard,
this.m_ctxEntryRearrangePopup});
this.m_ctxPwList.Name = "m_ctxPwList";
- this.m_ctxPwList.Size = new System.Drawing.Size(201, 352);
+ this.m_ctxPwList.Size = new System.Drawing.Size(215, 352);
this.m_ctxPwList.Opening += new System.ComponentModel.CancelEventHandler(this.OnCtxPwListOpening);
//
// m_ctxEntryCopyUserName
//
this.m_ctxEntryCopyUserName.Image = global::KeePass.Properties.Resources.B16x16_Personal;
this.m_ctxEntryCopyUserName.Name = "m_ctxEntryCopyUserName";
- this.m_ctxEntryCopyUserName.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryCopyUserName.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryCopyUserName.Text = "Copy User &Name";
this.m_ctxEntryCopyUserName.Click += new System.EventHandler(this.OnEntryCopyUserName);
//
@@ -505,7 +505,7 @@
//
this.m_ctxEntryCopyPassword.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Info;
this.m_ctxEntryCopyPassword.Name = "m_ctxEntryCopyPassword";
- this.m_ctxEntryCopyPassword.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryCopyPassword.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryCopyPassword.Text = "<COPYPW>";
this.m_ctxEntryCopyPassword.Click += new System.EventHandler(this.OnEntryCopyPassword);
//
@@ -517,14 +517,14 @@
this.m_ctxEntryUrlSep0,
this.m_ctxEntryUrlOpenInInternal});
this.m_ctxEntryUrl.Name = "m_ctxEntryUrl";
- this.m_ctxEntryUrl.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryUrl.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryUrl.Text = "&URL(s)";
//
// m_ctxEntryOpenUrl
//
this.m_ctxEntryOpenUrl.Image = global::KeePass.Properties.Resources.B16x16_FTP;
this.m_ctxEntryOpenUrl.Name = "m_ctxEntryOpenUrl";
- this.m_ctxEntryOpenUrl.Size = new System.Drawing.Size(190, 22);
+ this.m_ctxEntryOpenUrl.Size = new System.Drawing.Size(209, 22);
this.m_ctxEntryOpenUrl.Text = "<>";
this.m_ctxEntryOpenUrl.Click += new System.EventHandler(this.OnEntryOpenUrl);
//
@@ -532,21 +532,21 @@
//
this.m_ctxEntryCopyUrl.Image = global::KeePass.Properties.Resources.B16x16_EditCopy;
this.m_ctxEntryCopyUrl.Name = "m_ctxEntryCopyUrl";
- this.m_ctxEntryCopyUrl.Size = new System.Drawing.Size(190, 22);
+ this.m_ctxEntryCopyUrl.Size = new System.Drawing.Size(209, 22);
this.m_ctxEntryCopyUrl.Text = "&Copy to Clipboard";
this.m_ctxEntryCopyUrl.Click += new System.EventHandler(this.OnEntryCopyURL);
//
// m_ctxEntryUrlSep0
//
this.m_ctxEntryUrlSep0.Name = "m_ctxEntryUrlSep0";
- this.m_ctxEntryUrlSep0.Size = new System.Drawing.Size(187, 6);
+ this.m_ctxEntryUrlSep0.Size = new System.Drawing.Size(206, 6);
this.m_ctxEntryUrlSep0.Visible = false;
//
// m_ctxEntryUrlOpenInInternal
//
this.m_ctxEntryUrlOpenInInternal.Image = global::KeePass.Properties.Resources.B16x16_Browser;
this.m_ctxEntryUrlOpenInInternal.Name = "m_ctxEntryUrlOpenInInternal";
- this.m_ctxEntryUrlOpenInInternal.Size = new System.Drawing.Size(190, 22);
+ this.m_ctxEntryUrlOpenInInternal.Size = new System.Drawing.Size(209, 22);
this.m_ctxEntryUrlOpenInInternal.Text = "Open in Internal Browser";
this.m_ctxEntryUrlOpenInInternal.Visible = false;
this.m_ctxEntryUrlOpenInInternal.Click += new System.EventHandler(this.OnEntryUrlOpenInInternal);
@@ -554,46 +554,46 @@
// m_ctxEntryCopyCustomString
//
this.m_ctxEntryCopyCustomString.Name = "m_ctxEntryCopyCustomString";
- this.m_ctxEntryCopyCustomString.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryCopyCustomString.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryCopyCustomString.Text = "Copy Custom &String";
//
// m_ctxEntryAttachments
//
this.m_ctxEntryAttachments.Name = "m_ctxEntryAttachments";
- this.m_ctxEntryAttachments.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryAttachments.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryAttachments.Text = "Attach&ments";
//
// m_ctxEntrySaveAttachedFiles
//
this.m_ctxEntrySaveAttachedFiles.Image = global::KeePass.Properties.Resources.B16x16_Attach;
this.m_ctxEntrySaveAttachedFiles.Name = "m_ctxEntrySaveAttachedFiles";
- this.m_ctxEntrySaveAttachedFiles.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntrySaveAttachedFiles.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntrySaveAttachedFiles.Text = "Save Attached &File(s) To...";
this.m_ctxEntrySaveAttachedFiles.Click += new System.EventHandler(this.OnEntrySaveAttachments);
//
// m_ctxEntrySep0
//
this.m_ctxEntrySep0.Name = "m_ctxEntrySep0";
- this.m_ctxEntrySep0.Size = new System.Drawing.Size(197, 6);
+ this.m_ctxEntrySep0.Size = new System.Drawing.Size(211, 6);
//
// m_ctxEntryPerformAutoType
//
this.m_ctxEntryPerformAutoType.Image = global::KeePass.Properties.Resources.B16x16_KRec_Record;
this.m_ctxEntryPerformAutoType.Name = "m_ctxEntryPerformAutoType";
- this.m_ctxEntryPerformAutoType.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryPerformAutoType.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryPerformAutoType.Text = "&Perform Auto-Type";
this.m_ctxEntryPerformAutoType.Click += new System.EventHandler(this.OnEntryPerformAutoType);
//
// m_ctxEntrySep1
//
this.m_ctxEntrySep1.Name = "m_ctxEntrySep1";
- this.m_ctxEntrySep1.Size = new System.Drawing.Size(197, 6);
+ this.m_ctxEntrySep1.Size = new System.Drawing.Size(211, 6);
//
// m_ctxEntryAdd
//
this.m_ctxEntryAdd.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Import;
this.m_ctxEntryAdd.Name = "m_ctxEntryAdd";
- this.m_ctxEntryAdd.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryAdd.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryAdd.Text = "&Add Entry...";
this.m_ctxEntryAdd.Click += new System.EventHandler(this.OnEntryAdd);
//
@@ -601,7 +601,7 @@
//
this.m_ctxEntryEdit.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Sign;
this.m_ctxEntryEdit.Name = "m_ctxEntryEdit";
- this.m_ctxEntryEdit.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryEdit.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryEdit.Text = "&Edit/View Entry...";
this.m_ctxEntryEdit.Click += new System.EventHandler(this.OnEntryEdit);
//
@@ -609,7 +609,7 @@
//
this.m_ctxEntryDuplicate.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Key2;
this.m_ctxEntryDuplicate.Name = "m_ctxEntryDuplicate";
- this.m_ctxEntryDuplicate.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryDuplicate.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryDuplicate.Text = "Dupli&cate Entry";
this.m_ctxEntryDuplicate.Click += new System.EventHandler(this.OnEntryDuplicate);
//
@@ -617,7 +617,7 @@
//
this.m_ctxEntryDelete.Image = global::KeePass.Properties.Resources.B16x16_DeleteEntry;
this.m_ctxEntryDelete.Name = "m_ctxEntryDelete";
- this.m_ctxEntryDelete.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryDelete.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryDelete.Text = "&Delete Entry";
this.m_ctxEntryDelete.Click += new System.EventHandler(this.OnEntryDelete);
//
@@ -633,7 +633,7 @@
this.m_ctxEntrySelectedPrint,
this.m_ctxEntrySelectedExport});
this.m_ctxEntryMassModify.Name = "m_ctxEntryMassModify";
- this.m_ctxEntryMassModify.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryMassModify.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryMassModify.Text = "Selected Entr&ies";
//
// m_ctxEntrySetColor
@@ -648,58 +648,58 @@
this.m_ctxEntryColorSep1,
this.m_ctxEntryColorCustom});
this.m_ctxEntrySetColor.Name = "m_ctxEntrySetColor";
- this.m_ctxEntrySetColor.Size = new System.Drawing.Size(136, 22);
+ this.m_ctxEntrySetColor.Size = new System.Drawing.Size(144, 22);
this.m_ctxEntrySetColor.Text = "Set &Color";
//
// m_ctxEntryColorStandard
//
this.m_ctxEntryColorStandard.Name = "m_ctxEntryColorStandard";
- this.m_ctxEntryColorStandard.Size = new System.Drawing.Size(184, 22);
+ this.m_ctxEntryColorStandard.Size = new System.Drawing.Size(202, 22);
this.m_ctxEntryColorStandard.Text = "&Standard";
this.m_ctxEntryColorStandard.Click += new System.EventHandler(this.OnEntryColorStandard);
//
// m_ctxEntryColorSep0
//
this.m_ctxEntryColorSep0.Name = "m_ctxEntryColorSep0";
- this.m_ctxEntryColorSep0.Size = new System.Drawing.Size(181, 6);
+ this.m_ctxEntryColorSep0.Size = new System.Drawing.Size(199, 6);
//
// m_ctxEntryColorLightRed
//
this.m_ctxEntryColorLightRed.Name = "m_ctxEntryColorLightRed";
- this.m_ctxEntryColorLightRed.Size = new System.Drawing.Size(184, 22);
+ this.m_ctxEntryColorLightRed.Size = new System.Drawing.Size(202, 22);
this.m_ctxEntryColorLightRed.Text = "Light &Red";
this.m_ctxEntryColorLightRed.Click += new System.EventHandler(this.OnEntryColorLightRed);
//
// m_ctxEntryColorLightGreen
//
this.m_ctxEntryColorLightGreen.Name = "m_ctxEntryColorLightGreen";
- this.m_ctxEntryColorLightGreen.Size = new System.Drawing.Size(184, 22);
+ this.m_ctxEntryColorLightGreen.Size = new System.Drawing.Size(202, 22);
this.m_ctxEntryColorLightGreen.Text = "Light &Green";
this.m_ctxEntryColorLightGreen.Click += new System.EventHandler(this.OnEntryColorLightGreen);
//
// m_ctxEntryColorLightBlue
//
this.m_ctxEntryColorLightBlue.Name = "m_ctxEntryColorLightBlue";
- this.m_ctxEntryColorLightBlue.Size = new System.Drawing.Size(184, 22);
+ this.m_ctxEntryColorLightBlue.Size = new System.Drawing.Size(202, 22);
this.m_ctxEntryColorLightBlue.Text = "Light &Blue";
this.m_ctxEntryColorLightBlue.Click += new System.EventHandler(this.OnEntryColorLightBlue);
//
// m_ctxEntryColorLightYellow
//
this.m_ctxEntryColorLightYellow.Name = "m_ctxEntryColorLightYellow";
- this.m_ctxEntryColorLightYellow.Size = new System.Drawing.Size(184, 22);
+ this.m_ctxEntryColorLightYellow.Size = new System.Drawing.Size(202, 22);
this.m_ctxEntryColorLightYellow.Text = "Light &Yellow";
this.m_ctxEntryColorLightYellow.Click += new System.EventHandler(this.OnEntryColorLightYellow);
//
// m_ctxEntryColorSep1
//
this.m_ctxEntryColorSep1.Name = "m_ctxEntryColorSep1";
- this.m_ctxEntryColorSep1.Size = new System.Drawing.Size(181, 6);
+ this.m_ctxEntryColorSep1.Size = new System.Drawing.Size(199, 6);
//
// m_ctxEntryColorCustom
//
this.m_ctxEntryColorCustom.Name = "m_ctxEntryColorCustom";
- this.m_ctxEntryColorCustom.Size = new System.Drawing.Size(184, 22);
+ this.m_ctxEntryColorCustom.Size = new System.Drawing.Size(202, 22);
this.m_ctxEntryColorCustom.Text = "&Choose Custom Color...";
this.m_ctxEntryColorCustom.Click += new System.EventHandler(this.OnEntryColorCustom);
//
@@ -707,21 +707,21 @@
//
this.m_ctxEntryMassSetIcon.Image = global::KeePass.Properties.Resources.B16x16_Spreadsheet;
this.m_ctxEntryMassSetIcon.Name = "m_ctxEntryMassSetIcon";
- this.m_ctxEntryMassSetIcon.Size = new System.Drawing.Size(136, 22);
+ this.m_ctxEntryMassSetIcon.Size = new System.Drawing.Size(144, 22);
this.m_ctxEntryMassSetIcon.Text = "Set &Icons...";
this.m_ctxEntryMassSetIcon.Click += new System.EventHandler(this.OnEntryMassSetIcon);
//
// m_ctxEntrySelectedSep0
//
this.m_ctxEntrySelectedSep0.Name = "m_ctxEntrySelectedSep0";
- this.m_ctxEntrySelectedSep0.Size = new System.Drawing.Size(133, 6);
+ this.m_ctxEntrySelectedSep0.Size = new System.Drawing.Size(141, 6);
//
// m_ctxEntrySelectedAddTag
//
this.m_ctxEntrySelectedAddTag.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.m_ctxEntrySelectedNewTag});
this.m_ctxEntrySelectedAddTag.Name = "m_ctxEntrySelectedAddTag";
- this.m_ctxEntrySelectedAddTag.Size = new System.Drawing.Size(136, 22);
+ this.m_ctxEntrySelectedAddTag.Size = new System.Drawing.Size(144, 22);
this.m_ctxEntrySelectedAddTag.Text = "Add &Tag";
this.m_ctxEntrySelectedAddTag.DropDownOpening += new System.EventHandler(this.OnEntrySelectedAddTagOpening);
//
@@ -729,27 +729,27 @@
//
this.m_ctxEntrySelectedNewTag.Image = global::KeePass.Properties.Resources.B16x16_KNotes;
this.m_ctxEntrySelectedNewTag.Name = "m_ctxEntrySelectedNewTag";
- this.m_ctxEntrySelectedNewTag.Size = new System.Drawing.Size(127, 22);
+ this.m_ctxEntrySelectedNewTag.Size = new System.Drawing.Size(132, 22);
this.m_ctxEntrySelectedNewTag.Text = "&New Tag...";
this.m_ctxEntrySelectedNewTag.Click += new System.EventHandler(this.OnEntrySelectedNewTag);
//
// m_ctxEntrySelectedRemoveTag
//
this.m_ctxEntrySelectedRemoveTag.Name = "m_ctxEntrySelectedRemoveTag";
- this.m_ctxEntrySelectedRemoveTag.Size = new System.Drawing.Size(136, 22);
+ this.m_ctxEntrySelectedRemoveTag.Size = new System.Drawing.Size(144, 22);
this.m_ctxEntrySelectedRemoveTag.Text = "&Remove Tag";
this.m_ctxEntrySelectedRemoveTag.DropDownOpening += new System.EventHandler(this.OnEntrySelectedRemoveTagOpening);
//
// m_ctxEntrySelectedSep1
//
this.m_ctxEntrySelectedSep1.Name = "m_ctxEntrySelectedSep1";
- this.m_ctxEntrySelectedSep1.Size = new System.Drawing.Size(133, 6);
+ this.m_ctxEntrySelectedSep1.Size = new System.Drawing.Size(141, 6);
//
// m_ctxEntrySelectedPrint
//
this.m_ctxEntrySelectedPrint.Image = global::KeePass.Properties.Resources.B16x16_FilePrint;
this.m_ctxEntrySelectedPrint.Name = "m_ctxEntrySelectedPrint";
- this.m_ctxEntrySelectedPrint.Size = new System.Drawing.Size(136, 22);
+ this.m_ctxEntrySelectedPrint.Size = new System.Drawing.Size(144, 22);
this.m_ctxEntrySelectedPrint.Text = "&Print...";
this.m_ctxEntrySelectedPrint.Click += new System.EventHandler(this.OnEntrySelectedPrint);
//
@@ -757,21 +757,21 @@
//
this.m_ctxEntrySelectedExport.Image = global::KeePass.Properties.Resources.B16x16_Folder_Outbox;
this.m_ctxEntrySelectedExport.Name = "m_ctxEntrySelectedExport";
- this.m_ctxEntrySelectedExport.Size = new System.Drawing.Size(136, 22);
+ this.m_ctxEntrySelectedExport.Size = new System.Drawing.Size(144, 22);
this.m_ctxEntrySelectedExport.Text = "E&xport...";
this.m_ctxEntrySelectedExport.Click += new System.EventHandler(this.OnEntrySelectedExport);
//
// m_ctxEntrySelectAll
//
this.m_ctxEntrySelectAll.Name = "m_ctxEntrySelectAll";
- this.m_ctxEntrySelectAll.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntrySelectAll.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntrySelectAll.Text = "Se&lect All";
this.m_ctxEntrySelectAll.Click += new System.EventHandler(this.OnEntrySelectAll);
//
// m_ctxEntrySep2
//
this.m_ctxEntrySep2.Name = "m_ctxEntrySep2";
- this.m_ctxEntrySep2.Size = new System.Drawing.Size(197, 6);
+ this.m_ctxEntrySep2.Size = new System.Drawing.Size(211, 6);
//
// m_ctxEntryClipboard
//
@@ -779,7 +779,7 @@
this.m_ctxEntryClipCopy,
this.m_ctxEntryClipPaste});
this.m_ctxEntryClipboard.Name = "m_ctxEntryClipboard";
- this.m_ctxEntryClipboard.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryClipboard.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryClipboard.Text = "Clip&board";
this.m_ctxEntryClipboard.DropDownOpening += new System.EventHandler(this.OnCtxEntryClipboardOpening);
//
@@ -787,7 +787,7 @@
//
this.m_ctxEntryClipCopy.Image = global::KeePass.Properties.Resources.B16x16_EditCopy;
this.m_ctxEntryClipCopy.Name = "m_ctxEntryClipCopy";
- this.m_ctxEntryClipCopy.Size = new System.Drawing.Size(136, 22);
+ this.m_ctxEntryClipCopy.Size = new System.Drawing.Size(146, 22);
this.m_ctxEntryClipCopy.Text = "&Copy Entries";
this.m_ctxEntryClipCopy.Click += new System.EventHandler(this.OnEntryClipCopy);
//
@@ -795,7 +795,7 @@
//
this.m_ctxEntryClipPaste.Image = global::KeePass.Properties.Resources.B16x16_EditPaste;
this.m_ctxEntryClipPaste.Name = "m_ctxEntryClipPaste";
- this.m_ctxEntryClipPaste.Size = new System.Drawing.Size(136, 22);
+ this.m_ctxEntryClipPaste.Size = new System.Drawing.Size(146, 22);
this.m_ctxEntryClipPaste.Text = "&Paste Entries";
this.m_ctxEntryClipPaste.Click += new System.EventHandler(this.OnEntryClipPaste);
//
@@ -807,14 +807,14 @@
this.m_ctxEntryMoveOneDown,
this.m_ctxEntryMoveToBottom});
this.m_ctxEntryRearrangePopup.Name = "m_ctxEntryRearrangePopup";
- this.m_ctxEntryRearrangePopup.Size = new System.Drawing.Size(200, 22);
+ this.m_ctxEntryRearrangePopup.Size = new System.Drawing.Size(214, 22);
this.m_ctxEntryRearrangePopup.Text = "&Rearrange";
//
// m_ctxEntryMoveToTop
//
this.m_ctxEntryMoveToTop.Image = global::KeePass.Properties.Resources.B16x16_2UpArrow;
this.m_ctxEntryMoveToTop.Name = "m_ctxEntryMoveToTop";
- this.m_ctxEntryMoveToTop.Size = new System.Drawing.Size(182, 22);
+ this.m_ctxEntryMoveToTop.Size = new System.Drawing.Size(195, 22);
this.m_ctxEntryMoveToTop.Text = "Move Entry to &Top";
this.m_ctxEntryMoveToTop.Click += new System.EventHandler(this.OnEntryMoveToTop);
//
@@ -822,7 +822,7 @@
//
this.m_ctxEntryMoveOneUp.Image = global::KeePass.Properties.Resources.B16x16_1UpArrow;
this.m_ctxEntryMoveOneUp.Name = "m_ctxEntryMoveOneUp";
- this.m_ctxEntryMoveOneUp.Size = new System.Drawing.Size(182, 22);
+ this.m_ctxEntryMoveOneUp.Size = new System.Drawing.Size(195, 22);
this.m_ctxEntryMoveOneUp.Text = "Move Entry &One Up";
this.m_ctxEntryMoveOneUp.Click += new System.EventHandler(this.OnEntryMoveOneUp);
//
@@ -830,7 +830,7 @@
//
this.m_ctxEntryMoveOneDown.Image = global::KeePass.Properties.Resources.B16x16_1DownArrow;
this.m_ctxEntryMoveOneDown.Name = "m_ctxEntryMoveOneDown";
- this.m_ctxEntryMoveOneDown.Size = new System.Drawing.Size(182, 22);
+ this.m_ctxEntryMoveOneDown.Size = new System.Drawing.Size(195, 22);
this.m_ctxEntryMoveOneDown.Text = "Mo&ve Entry One Down";
this.m_ctxEntryMoveOneDown.Click += new System.EventHandler(this.OnEntryMoveOneDown);
//
@@ -838,7 +838,7 @@
//
this.m_ctxEntryMoveToBottom.Image = global::KeePass.Properties.Resources.B16x16_2DownArrow;
this.m_ctxEntryMoveToBottom.Name = "m_ctxEntryMoveToBottom";
- this.m_ctxEntryMoveToBottom.Size = new System.Drawing.Size(182, 22);
+ this.m_ctxEntryMoveToBottom.Size = new System.Drawing.Size(195, 22);
this.m_ctxEntryMoveToBottom.Text = "Move Entry to &Bottom";
this.m_ctxEntryMoveToBottom.Click += new System.EventHandler(this.OnEntryMoveToBottom);
//
@@ -854,7 +854,6 @@
this.m_menuMain.Name = "m_menuMain";
this.m_menuMain.Size = new System.Drawing.Size(654, 24);
this.m_menuMain.TabIndex = 0;
- this.m_menuMain.TabStop = true;
//
// m_menuFile
//
@@ -879,14 +878,14 @@
this.m_menuFileLock,
this.m_menuFileExit});
this.m_menuFile.Name = "m_menuFile";
- this.m_menuFile.Size = new System.Drawing.Size(35, 20);
+ this.m_menuFile.Size = new System.Drawing.Size(39, 20);
this.m_menuFile.Text = "&File";
//
// m_menuFileNew
//
this.m_menuFileNew.Image = global::KeePass.Properties.Resources.B16x16_FileNew;
this.m_menuFileNew.Name = "m_menuFileNew";
- this.m_menuFileNew.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileNew.Size = new System.Drawing.Size(190, 22);
this.m_menuFileNew.Text = "&New...";
this.m_menuFileNew.Click += new System.EventHandler(this.OnFileNew);
//
@@ -896,14 +895,14 @@
this.m_menuFileOpenLocal,
this.m_menuFileOpenUrl});
this.m_menuFileOpen.Name = "m_menuFileOpen";
- this.m_menuFileOpen.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileOpen.Size = new System.Drawing.Size(190, 22);
this.m_menuFileOpen.Text = "&Open";
//
// m_menuFileOpenLocal
//
this.m_menuFileOpenLocal.Image = global::KeePass.Properties.Resources.B16x16_Folder_Yellow_Open;
this.m_menuFileOpenLocal.Name = "m_menuFileOpenLocal";
- this.m_menuFileOpenLocal.Size = new System.Drawing.Size(134, 22);
+ this.m_menuFileOpenLocal.Size = new System.Drawing.Size(141, 22);
this.m_menuFileOpenLocal.Text = "Open File...";
this.m_menuFileOpenLocal.Click += new System.EventHandler(this.OnFileOpen);
//
@@ -911,34 +910,34 @@
//
this.m_menuFileOpenUrl.Image = global::KeePass.Properties.Resources.B16x16_Browser;
this.m_menuFileOpenUrl.Name = "m_menuFileOpenUrl";
- this.m_menuFileOpenUrl.Size = new System.Drawing.Size(134, 22);
+ this.m_menuFileOpenUrl.Size = new System.Drawing.Size(141, 22);
this.m_menuFileOpenUrl.Text = "Open URL...";
this.m_menuFileOpenUrl.Click += new System.EventHandler(this.OnFileOpenUrl);
//
// m_menuFileRecent
//
this.m_menuFileRecent.Name = "m_menuFileRecent";
- this.m_menuFileRecent.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileRecent.Size = new System.Drawing.Size(190, 22);
this.m_menuFileRecent.Text = "Open &Recent";
//
// m_menuFileClose
//
this.m_menuFileClose.Image = global::KeePass.Properties.Resources.B16x16_File_Close;
this.m_menuFileClose.Name = "m_menuFileClose";
- this.m_menuFileClose.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileClose.Size = new System.Drawing.Size(190, 22);
this.m_menuFileClose.Text = "&Close";
this.m_menuFileClose.Click += new System.EventHandler(this.OnFileClose);
//
// m_menuFileSep0
//
this.m_menuFileSep0.Name = "m_menuFileSep0";
- this.m_menuFileSep0.Size = new System.Drawing.Size(173, 6);
+ this.m_menuFileSep0.Size = new System.Drawing.Size(187, 6);
//
// m_menuFileSave
//
this.m_menuFileSave.Image = global::KeePass.Properties.Resources.B16x16_FileSave;
this.m_menuFileSave.Name = "m_menuFileSave";
- this.m_menuFileSave.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileSave.Size = new System.Drawing.Size(190, 22);
this.m_menuFileSave.Text = "&Save";
this.m_menuFileSave.Click += new System.EventHandler(this.OnFileSave);
//
@@ -950,14 +949,14 @@
this.m_menuFileSaveAsSep0,
this.m_menuFileSaveAsCopy});
this.m_menuFileSaveAs.Name = "m_menuFileSaveAs";
- this.m_menuFileSaveAs.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileSaveAs.Size = new System.Drawing.Size(190, 22);
this.m_menuFileSaveAs.Text = "Save &As";
//
// m_menuFileSaveAsLocal
//
this.m_menuFileSaveAsLocal.Image = global::KeePass.Properties.Resources.B16x16_FileSaveAs;
this.m_menuFileSaveAsLocal.Name = "m_menuFileSaveAsLocal";
- this.m_menuFileSaveAsLocal.Size = new System.Drawing.Size(166, 22);
+ this.m_menuFileSaveAsLocal.Size = new System.Drawing.Size(176, 22);
this.m_menuFileSaveAsLocal.Text = "Save to &File...";
this.m_menuFileSaveAsLocal.Click += new System.EventHandler(this.OnFileSaveAs);
//
@@ -965,33 +964,33 @@
//
this.m_menuFileSaveAsUrl.Image = global::KeePass.Properties.Resources.B16x16_Browser;
this.m_menuFileSaveAsUrl.Name = "m_menuFileSaveAsUrl";
- this.m_menuFileSaveAsUrl.Size = new System.Drawing.Size(166, 22);
+ this.m_menuFileSaveAsUrl.Size = new System.Drawing.Size(176, 22);
this.m_menuFileSaveAsUrl.Text = "Save to &URL...";
this.m_menuFileSaveAsUrl.Click += new System.EventHandler(this.OnFileSaveAsUrl);
//
// m_menuFileSaveAsSep0
//
this.m_menuFileSaveAsSep0.Name = "m_menuFileSaveAsSep0";
- this.m_menuFileSaveAsSep0.Size = new System.Drawing.Size(163, 6);
+ this.m_menuFileSaveAsSep0.Size = new System.Drawing.Size(173, 6);
//
// m_menuFileSaveAsCopy
//
this.m_menuFileSaveAsCopy.Image = global::KeePass.Properties.Resources.B16x16_FileSaveAs;
this.m_menuFileSaveAsCopy.Name = "m_menuFileSaveAsCopy";
- this.m_menuFileSaveAsCopy.Size = new System.Drawing.Size(166, 22);
+ this.m_menuFileSaveAsCopy.Size = new System.Drawing.Size(176, 22);
this.m_menuFileSaveAsCopy.Text = "Save &Copy to File...";
this.m_menuFileSaveAsCopy.Click += new System.EventHandler(this.OnFileSaveAsCopy);
//
// m_menuFileSep1
//
this.m_menuFileSep1.Name = "m_menuFileSep1";
- this.m_menuFileSep1.Size = new System.Drawing.Size(173, 6);
+ this.m_menuFileSep1.Size = new System.Drawing.Size(187, 6);
//
// m_menuFileDbSettings
//
this.m_menuFileDbSettings.Image = global::KeePass.Properties.Resources.B16x16_Package_Development;
this.m_menuFileDbSettings.Name = "m_menuFileDbSettings";
- this.m_menuFileDbSettings.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileDbSettings.Size = new System.Drawing.Size(190, 22);
this.m_menuFileDbSettings.Text = "&Database Settings...";
this.m_menuFileDbSettings.Click += new System.EventHandler(this.OnFileDbSettings);
//
@@ -999,33 +998,33 @@
//
this.m_menuFileChangeMasterKey.Image = global::KeePass.Properties.Resources.B16x16_File_Locked;
this.m_menuFileChangeMasterKey.Name = "m_menuFileChangeMasterKey";
- this.m_menuFileChangeMasterKey.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileChangeMasterKey.Size = new System.Drawing.Size(190, 22);
this.m_menuFileChangeMasterKey.Text = "Change &Master Key...";
this.m_menuFileChangeMasterKey.Click += new System.EventHandler(this.OnFileChangeMasterKey);
//
// m_menuFileSep2
//
this.m_menuFileSep2.Name = "m_menuFileSep2";
- this.m_menuFileSep2.Size = new System.Drawing.Size(173, 6);
+ this.m_menuFileSep2.Size = new System.Drawing.Size(187, 6);
//
// m_menuFilePrint
//
this.m_menuFilePrint.Image = global::KeePass.Properties.Resources.B16x16_FilePrint;
this.m_menuFilePrint.Name = "m_menuFilePrint";
- this.m_menuFilePrint.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFilePrint.Size = new System.Drawing.Size(190, 22);
this.m_menuFilePrint.Text = "&Print...";
this.m_menuFilePrint.Click += new System.EventHandler(this.OnFilePrint);
//
// m_menuFileSep3
//
this.m_menuFileSep3.Name = "m_menuFileSep3";
- this.m_menuFileSep3.Size = new System.Drawing.Size(173, 6);
+ this.m_menuFileSep3.Size = new System.Drawing.Size(187, 6);
//
// m_menuFileImport
//
this.m_menuFileImport.Image = global::KeePass.Properties.Resources.B16x16_Folder_Inbox;
this.m_menuFileImport.Name = "m_menuFileImport";
- this.m_menuFileImport.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileImport.Size = new System.Drawing.Size(190, 22);
this.m_menuFileImport.Text = "&Import...";
this.m_menuFileImport.Click += new System.EventHandler(this.OnFileImport);
//
@@ -1033,7 +1032,7 @@
//
this.m_menuFileExport.Image = global::KeePass.Properties.Resources.B16x16_Folder_Outbox;
this.m_menuFileExport.Name = "m_menuFileExport";
- this.m_menuFileExport.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileExport.Size = new System.Drawing.Size(190, 22);
this.m_menuFileExport.Text = "&Export...";
this.m_menuFileExport.Click += new System.EventHandler(this.OnFileExport);
//
@@ -1045,14 +1044,14 @@
this.m_menuFileSyncSep0,
this.m_menuFileSyncRecent});
this.m_menuFileSync.Name = "m_menuFileSync";
- this.m_menuFileSync.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileSync.Size = new System.Drawing.Size(190, 22);
this.m_menuFileSync.Text = "S&ynchronize";
//
// m_menuFileSyncFile
//
this.m_menuFileSyncFile.Image = global::KeePass.Properties.Resources.B16x16_Reload_Page;
this.m_menuFileSyncFile.Name = "m_menuFileSyncFile";
- this.m_menuFileSyncFile.Size = new System.Drawing.Size(188, 22);
+ this.m_menuFileSyncFile.Size = new System.Drawing.Size(203, 22);
this.m_menuFileSyncFile.Text = "Synchronize with &File...";
this.m_menuFileSyncFile.Click += new System.EventHandler(this.OnFileSynchronize);
//
@@ -1060,31 +1059,31 @@
//
this.m_menuFileSyncUrl.Image = global::KeePass.Properties.Resources.B16x16_Reload_Page;
this.m_menuFileSyncUrl.Name = "m_menuFileSyncUrl";
- this.m_menuFileSyncUrl.Size = new System.Drawing.Size(188, 22);
+ this.m_menuFileSyncUrl.Size = new System.Drawing.Size(203, 22);
this.m_menuFileSyncUrl.Text = "Synchronize with &URL...";
this.m_menuFileSyncUrl.Click += new System.EventHandler(this.OnFileSynchronizeUrl);
//
// m_menuFileSyncSep0
//
this.m_menuFileSyncSep0.Name = "m_menuFileSyncSep0";
- this.m_menuFileSyncSep0.Size = new System.Drawing.Size(185, 6);
+ this.m_menuFileSyncSep0.Size = new System.Drawing.Size(200, 6);
//
// m_menuFileSyncRecent
//
this.m_menuFileSyncRecent.Name = "m_menuFileSyncRecent";
- this.m_menuFileSyncRecent.Size = new System.Drawing.Size(188, 22);
+ this.m_menuFileSyncRecent.Size = new System.Drawing.Size(203, 22);
this.m_menuFileSyncRecent.Text = "&Recent Files";
//
// m_menuFileSep4
//
this.m_menuFileSep4.Name = "m_menuFileSep4";
- this.m_menuFileSep4.Size = new System.Drawing.Size(173, 6);
+ this.m_menuFileSep4.Size = new System.Drawing.Size(187, 6);
//
// m_menuFileLock
//
this.m_menuFileLock.Image = global::KeePass.Properties.Resources.B16x16_LockWorkspace;
this.m_menuFileLock.Name = "m_menuFileLock";
- this.m_menuFileLock.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileLock.Size = new System.Drawing.Size(190, 22);
this.m_menuFileLock.Text = "&Lock Workspace";
this.m_menuFileLock.Click += new System.EventHandler(this.OnFileLock);
//
@@ -1092,7 +1091,7 @@
//
this.m_menuFileExit.Image = global::KeePass.Properties.Resources.B16x16_Exit;
this.m_menuFileExit.Name = "m_menuFileExit";
- this.m_menuFileExit.Size = new System.Drawing.Size(176, 22);
+ this.m_menuFileExit.Size = new System.Drawing.Size(190, 22);
this.m_menuFileExit.Text = "E&xit";
this.m_menuFileExit.Click += new System.EventHandler(this.OnFileExit);
//
@@ -1105,7 +1104,7 @@
this.m_menuEditSep0,
this.m_menuEditFind});
this.m_menuEdit.Name = "m_menuEdit";
- this.m_menuEdit.Size = new System.Drawing.Size(37, 20);
+ this.m_menuEdit.Size = new System.Drawing.Size(40, 20);
this.m_menuEdit.Text = "&Edit";
this.m_menuEdit.DropDownOpening += new System.EventHandler(this.OnMenuEditOpening);
//
@@ -1113,7 +1112,7 @@
//
this.m_menuEditShowAllEntries.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Key3;
this.m_menuEditShowAllEntries.Name = "m_menuEditShowAllEntries";
- this.m_menuEditShowAllEntries.Size = new System.Drawing.Size(188, 22);
+ this.m_menuEditShowAllEntries.Size = new System.Drawing.Size(207, 22);
this.m_menuEditShowAllEntries.Text = "&Show All Entries";
this.m_menuEditShowAllEntries.Click += new System.EventHandler(this.OnShowAllEntries);
//
@@ -1121,27 +1120,27 @@
//
this.m_menuEditShowExpired.Image = global::KeePass.Properties.Resources.B16x16_History_Clear;
this.m_menuEditShowExpired.Name = "m_menuEditShowExpired";
- this.m_menuEditShowExpired.Size = new System.Drawing.Size(188, 22);
+ this.m_menuEditShowExpired.Size = new System.Drawing.Size(207, 22);
this.m_menuEditShowExpired.Text = "Show All E&xpired Entries";
this.m_menuEditShowExpired.Click += new System.EventHandler(this.OnToolsShowExpired);
//
// m_menuEditShowByTag
//
this.m_menuEditShowByTag.Name = "m_menuEditShowByTag";
- this.m_menuEditShowByTag.Size = new System.Drawing.Size(188, 22);
+ this.m_menuEditShowByTag.Size = new System.Drawing.Size(207, 22);
this.m_menuEditShowByTag.Text = "Show Entries &by Tag";
this.m_menuEditShowByTag.DropDownOpening += new System.EventHandler(this.OnEditShowByTagOpening);
//
// m_menuEditSep0
//
this.m_menuEditSep0.Name = "m_menuEditSep0";
- this.m_menuEditSep0.Size = new System.Drawing.Size(185, 6);
+ this.m_menuEditSep0.Size = new System.Drawing.Size(204, 6);
//
// m_menuEditFind
//
this.m_menuEditFind.Image = global::KeePass.Properties.Resources.B16x16_XMag;
this.m_menuEditFind.Name = "m_menuEditFind";
- this.m_menuEditFind.Size = new System.Drawing.Size(188, 22);
+ this.m_menuEditFind.Size = new System.Drawing.Size(207, 22);
this.m_menuEditFind.Text = "&Find...";
this.m_menuEditFind.Click += new System.EventHandler(this.OnPwListFind);
//
@@ -1162,27 +1161,27 @@
this.m_menuViewSep3,
this.m_menuViewShowEntriesOfSubGroups});
this.m_menuView.Name = "m_menuView";
- this.m_menuView.Size = new System.Drawing.Size(42, 20);
+ this.m_menuView.Size = new System.Drawing.Size(45, 20);
this.m_menuView.Text = "&View";
//
// m_menuChangeLanguage
//
this.m_menuChangeLanguage.Image = global::KeePass.Properties.Resources.B16x16_Keyboard_Layout;
this.m_menuChangeLanguage.Name = "m_menuChangeLanguage";
- this.m_menuChangeLanguage.Size = new System.Drawing.Size(202, 22);
+ this.m_menuChangeLanguage.Size = new System.Drawing.Size(222, 22);
this.m_menuChangeLanguage.Text = "Change &Language...";
this.m_menuChangeLanguage.Click += new System.EventHandler(this.OnMenuChangeLanguage);
//
// m_menuViewSep0
//
this.m_menuViewSep0.Name = "m_menuViewSep0";
- this.m_menuViewSep0.Size = new System.Drawing.Size(199, 6);
+ this.m_menuViewSep0.Size = new System.Drawing.Size(219, 6);
//
// m_menuViewShowToolBar
//
this.m_menuViewShowToolBar.CheckOnClick = true;
this.m_menuViewShowToolBar.Name = "m_menuViewShowToolBar";
- this.m_menuViewShowToolBar.Size = new System.Drawing.Size(202, 22);
+ this.m_menuViewShowToolBar.Size = new System.Drawing.Size(222, 22);
this.m_menuViewShowToolBar.Text = "Show &Toolbar";
this.m_menuViewShowToolBar.Click += new System.EventHandler(this.OnViewShowToolBar);
//
@@ -1190,7 +1189,7 @@
//
this.m_menuViewShowEntryView.CheckOnClick = true;
this.m_menuViewShowEntryView.Name = "m_menuViewShowEntryView";
- this.m_menuViewShowEntryView.Size = new System.Drawing.Size(202, 22);
+ this.m_menuViewShowEntryView.Size = new System.Drawing.Size(222, 22);
this.m_menuViewShowEntryView.Text = "&Show Entry View";
this.m_menuViewShowEntryView.Click += new System.EventHandler(this.OnViewShowEntryView);
//
@@ -1200,14 +1199,14 @@
this.m_menuViewWindowsStacked,
this.m_menuViewWindowsSideBySide});
this.m_menuViewWindowLayout.Name = "m_menuViewWindowLayout";
- this.m_menuViewWindowLayout.Size = new System.Drawing.Size(202, 22);
+ this.m_menuViewWindowLayout.Size = new System.Drawing.Size(222, 22);
this.m_menuViewWindowLayout.Text = "&Window Layout";
//
// m_menuViewWindowsStacked
//
this.m_menuViewWindowsStacked.Image = global::KeePass.Properties.Resources.B16x16_Window_2Horz1Vert;
this.m_menuViewWindowsStacked.Name = "m_menuViewWindowsStacked";
- this.m_menuViewWindowsStacked.Size = new System.Drawing.Size(133, 22);
+ this.m_menuViewWindowsStacked.Size = new System.Drawing.Size(142, 22);
this.m_menuViewWindowsStacked.Text = "Stacked";
this.m_menuViewWindowsStacked.Click += new System.EventHandler(this.OnViewWindowsStacked);
//
@@ -1215,40 +1214,40 @@
//
this.m_menuViewWindowsSideBySide.Image = global::KeePass.Properties.Resources.B16x16_Window_3Horz;
this.m_menuViewWindowsSideBySide.Name = "m_menuViewWindowsSideBySide";
- this.m_menuViewWindowsSideBySide.Size = new System.Drawing.Size(133, 22);
+ this.m_menuViewWindowsSideBySide.Size = new System.Drawing.Size(142, 22);
this.m_menuViewWindowsSideBySide.Text = "Side by Side";
this.m_menuViewWindowsSideBySide.Click += new System.EventHandler(this.OnViewWindowsSideBySide);
//
// m_menuViewSep1
//
this.m_menuViewSep1.Name = "m_menuViewSep1";
- this.m_menuViewSep1.Size = new System.Drawing.Size(199, 6);
+ this.m_menuViewSep1.Size = new System.Drawing.Size(219, 6);
//
// m_menuViewAlwaysOnTop
//
this.m_menuViewAlwaysOnTop.CheckOnClick = true;
this.m_menuViewAlwaysOnTop.Name = "m_menuViewAlwaysOnTop";
- this.m_menuViewAlwaysOnTop.Size = new System.Drawing.Size(202, 22);
+ this.m_menuViewAlwaysOnTop.Size = new System.Drawing.Size(222, 22);
this.m_menuViewAlwaysOnTop.Text = "&Always on Top";
this.m_menuViewAlwaysOnTop.Click += new System.EventHandler(this.OnViewAlwaysOnTop);
//
// m_menuViewSep2
//
this.m_menuViewSep2.Name = "m_menuViewSep2";
- this.m_menuViewSep2.Size = new System.Drawing.Size(199, 6);
+ this.m_menuViewSep2.Size = new System.Drawing.Size(219, 6);
//
// m_menuViewConfigColumns
//
this.m_menuViewConfigColumns.Image = global::KeePass.Properties.Resources.B16x16_View_Detailed;
this.m_menuViewConfigColumns.Name = "m_menuViewConfigColumns";
- this.m_menuViewConfigColumns.Size = new System.Drawing.Size(202, 22);
+ this.m_menuViewConfigColumns.Size = new System.Drawing.Size(222, 22);
this.m_menuViewConfigColumns.Text = "Configure &Columns...";
this.m_menuViewConfigColumns.Click += new System.EventHandler(this.OnViewConfigColumns);
//
// m_menuViewSortBy
//
this.m_menuViewSortBy.Name = "m_menuViewSortBy";
- this.m_menuViewSortBy.Size = new System.Drawing.Size(202, 22);
+ this.m_menuViewSortBy.Size = new System.Drawing.Size(222, 22);
this.m_menuViewSortBy.Text = "S&ort By";
//
// m_menuViewTanOptions
@@ -1257,14 +1256,14 @@
this.m_menuViewTanSimpleList,
this.m_menuViewTanIndices});
this.m_menuViewTanOptions.Name = "m_menuViewTanOptions";
- this.m_menuViewTanOptions.Size = new System.Drawing.Size(202, 22);
+ this.m_menuViewTanOptions.Size = new System.Drawing.Size(222, 22);
this.m_menuViewTanOptions.Text = "TAN &View Options";
//
// m_menuViewTanSimpleList
//
this.m_menuViewTanSimpleList.CheckOnClick = true;
this.m_menuViewTanSimpleList.Name = "m_menuViewTanSimpleList";
- this.m_menuViewTanSimpleList.Size = new System.Drawing.Size(273, 22);
+ this.m_menuViewTanSimpleList.Size = new System.Drawing.Size(303, 22);
this.m_menuViewTanSimpleList.Text = "Use &Simple List View for TAN-Only Groups";
this.m_menuViewTanSimpleList.Click += new System.EventHandler(this.OnViewTanSimpleListClick);
//
@@ -1272,20 +1271,20 @@
//
this.m_menuViewTanIndices.CheckOnClick = true;
this.m_menuViewTanIndices.Name = "m_menuViewTanIndices";
- this.m_menuViewTanIndices.Size = new System.Drawing.Size(273, 22);
+ this.m_menuViewTanIndices.Size = new System.Drawing.Size(303, 22);
this.m_menuViewTanIndices.Text = "Show TAN &Indices in Entry Titles";
this.m_menuViewTanIndices.Click += new System.EventHandler(this.OnViewTanIndicesClick);
//
// m_menuViewSep3
//
this.m_menuViewSep3.Name = "m_menuViewSep3";
- this.m_menuViewSep3.Size = new System.Drawing.Size(199, 6);
+ this.m_menuViewSep3.Size = new System.Drawing.Size(219, 6);
//
// m_menuViewShowEntriesOfSubGroups
//
this.m_menuViewShowEntriesOfSubGroups.CheckOnClick = true;
this.m_menuViewShowEntriesOfSubGroups.Name = "m_menuViewShowEntriesOfSubGroups";
- this.m_menuViewShowEntriesOfSubGroups.Size = new System.Drawing.Size(202, 22);
+ this.m_menuViewShowEntriesOfSubGroups.Size = new System.Drawing.Size(222, 22);
this.m_menuViewShowEntriesOfSubGroups.Text = "Show Entries of Su&bgroups";
this.m_menuViewShowEntriesOfSubGroups.Click += new System.EventHandler(this.OnViewShowEntriesOfSubGroups);
//
@@ -1303,14 +1302,14 @@
this.m_menuToolsSep2,
this.m_menuToolsOptions});
this.m_menuTools.Name = "m_menuTools";
- this.m_menuTools.Size = new System.Drawing.Size(45, 20);
+ this.m_menuTools.Size = new System.Drawing.Size(49, 20);
this.m_menuTools.Text = "&Tools";
//
// m_menuToolsPwGenerator
//
- this.m_menuToolsPwGenerator.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Gen;
+ this.m_menuToolsPwGenerator.Image = global::KeePass.Properties.Resources.B16x16_Key_New;
this.m_menuToolsPwGenerator.Name = "m_menuToolsPwGenerator";
- this.m_menuToolsPwGenerator.Size = new System.Drawing.Size(195, 22);
+ this.m_menuToolsPwGenerator.Size = new System.Drawing.Size(213, 22);
this.m_menuToolsPwGenerator.Text = "&Generate Password...";
this.m_menuToolsPwGenerator.Click += new System.EventHandler(this.OnToolsPwGenerator);
//
@@ -1318,20 +1317,20 @@
//
this.m_menuToolsGeneratePwList.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Gen;
this.m_menuToolsGeneratePwList.Name = "m_menuToolsGeneratePwList";
- this.m_menuToolsGeneratePwList.Size = new System.Drawing.Size(195, 22);
+ this.m_menuToolsGeneratePwList.Size = new System.Drawing.Size(213, 22);
this.m_menuToolsGeneratePwList.Text = "Generate Password &List...";
this.m_menuToolsGeneratePwList.Click += new System.EventHandler(this.OnToolsGeneratePasswordList);
//
// m_menuToolsSep0
//
this.m_menuToolsSep0.Name = "m_menuToolsSep0";
- this.m_menuToolsSep0.Size = new System.Drawing.Size(192, 6);
+ this.m_menuToolsSep0.Size = new System.Drawing.Size(210, 6);
//
// m_menuToolsTanWizard
//
this.m_menuToolsTanWizard.Image = global::KeePass.Properties.Resources.B16x16_Wizard;
this.m_menuToolsTanWizard.Name = "m_menuToolsTanWizard";
- this.m_menuToolsTanWizard.Size = new System.Drawing.Size(195, 22);
+ this.m_menuToolsTanWizard.Size = new System.Drawing.Size(213, 22);
this.m_menuToolsTanWizard.Text = "&TAN Wizard...";
this.m_menuToolsTanWizard.Click += new System.EventHandler(this.OnToolsTanWizard);
//
@@ -1344,27 +1343,27 @@
this.m_menuToolsDbDelEmptyGroups,
this.m_menuToolsDbDelUnusedIcons});
this.m_menuToolsDb.Name = "m_menuToolsDb";
- this.m_menuToolsDb.Size = new System.Drawing.Size(195, 22);
+ this.m_menuToolsDb.Size = new System.Drawing.Size(213, 22);
this.m_menuToolsDb.Text = "&Database Tools";
//
// m_menuToolsDbMaintenance
//
this.m_menuToolsDbMaintenance.Image = global::KeePass.Properties.Resources.B16x16_Package_Settings;
this.m_menuToolsDbMaintenance.Name = "m_menuToolsDbMaintenance";
- this.m_menuToolsDbMaintenance.Size = new System.Drawing.Size(212, 22);
+ this.m_menuToolsDbMaintenance.Size = new System.Drawing.Size(233, 22);
this.m_menuToolsDbMaintenance.Text = "Database &Maintenance...";
this.m_menuToolsDbMaintenance.Click += new System.EventHandler(this.OnToolsDbMaintenance);
//
// m_menuToolsDbSep0
//
this.m_menuToolsDbSep0.Name = "m_menuToolsDbSep0";
- this.m_menuToolsDbSep0.Size = new System.Drawing.Size(209, 6);
+ this.m_menuToolsDbSep0.Size = new System.Drawing.Size(230, 6);
//
// m_menuToolsDbDelDupEntries
//
this.m_menuToolsDbDelDupEntries.Image = global::KeePass.Properties.Resources.B16x16_DeleteEntry;
this.m_menuToolsDbDelDupEntries.Name = "m_menuToolsDbDelDupEntries";
- this.m_menuToolsDbDelDupEntries.Size = new System.Drawing.Size(212, 22);
+ this.m_menuToolsDbDelDupEntries.Size = new System.Drawing.Size(233, 22);
this.m_menuToolsDbDelDupEntries.Text = "Delete &Duplicate Entries";
this.m_menuToolsDbDelDupEntries.Click += new System.EventHandler(this.OnToolsDelDupEntries);
//
@@ -1372,7 +1371,7 @@
//
this.m_menuToolsDbDelEmptyGroups.Image = global::KeePass.Properties.Resources.B16x16_Folder_Locked;
this.m_menuToolsDbDelEmptyGroups.Name = "m_menuToolsDbDelEmptyGroups";
- this.m_menuToolsDbDelEmptyGroups.Size = new System.Drawing.Size(212, 22);
+ this.m_menuToolsDbDelEmptyGroups.Size = new System.Drawing.Size(233, 22);
this.m_menuToolsDbDelEmptyGroups.Text = "Delete Empty &Groups";
this.m_menuToolsDbDelEmptyGroups.Click += new System.EventHandler(this.OnToolsDelEmptyGroups);
//
@@ -1380,20 +1379,20 @@
//
this.m_menuToolsDbDelUnusedIcons.Image = global::KeePass.Properties.Resources.B16x16_Trashcan_Full;
this.m_menuToolsDbDelUnusedIcons.Name = "m_menuToolsDbDelUnusedIcons";
- this.m_menuToolsDbDelUnusedIcons.Size = new System.Drawing.Size(212, 22);
+ this.m_menuToolsDbDelUnusedIcons.Size = new System.Drawing.Size(233, 22);
this.m_menuToolsDbDelUnusedIcons.Text = "Delete Unused Custom &Icons";
this.m_menuToolsDbDelUnusedIcons.Click += new System.EventHandler(this.OnToolsDelUnusedIcons);
//
// m_menuToolsSep1
//
this.m_menuToolsSep1.Name = "m_menuToolsSep1";
- this.m_menuToolsSep1.Size = new System.Drawing.Size(192, 6);
+ this.m_menuToolsSep1.Size = new System.Drawing.Size(210, 6);
//
// m_menuToolsTriggers
//
this.m_menuToolsTriggers.Image = global::KeePass.Properties.Resources.B16x16_Make_KDevelop;
this.m_menuToolsTriggers.Name = "m_menuToolsTriggers";
- this.m_menuToolsTriggers.Size = new System.Drawing.Size(195, 22);
+ this.m_menuToolsTriggers.Size = new System.Drawing.Size(213, 22);
this.m_menuToolsTriggers.Text = "T&riggers...";
this.m_menuToolsTriggers.Click += new System.EventHandler(this.OnToolsTriggers);
//
@@ -1401,20 +1400,20 @@
//
this.m_menuToolsPlugins.Image = global::KeePass.Properties.Resources.B16x16_BlockDevice;
this.m_menuToolsPlugins.Name = "m_menuToolsPlugins";
- this.m_menuToolsPlugins.Size = new System.Drawing.Size(195, 22);
+ this.m_menuToolsPlugins.Size = new System.Drawing.Size(213, 22);
this.m_menuToolsPlugins.Text = "&Plugins...";
this.m_menuToolsPlugins.Click += new System.EventHandler(this.OnToolsPlugins);
//
// m_menuToolsSep2
//
this.m_menuToolsSep2.Name = "m_menuToolsSep2";
- this.m_menuToolsSep2.Size = new System.Drawing.Size(192, 6);
+ this.m_menuToolsSep2.Size = new System.Drawing.Size(210, 6);
//
// m_menuToolsOptions
//
this.m_menuToolsOptions.Image = global::KeePass.Properties.Resources.B16x16_Misc;
this.m_menuToolsOptions.Name = "m_menuToolsOptions";
- this.m_menuToolsOptions.Size = new System.Drawing.Size(195, 22);
+ this.m_menuToolsOptions.Size = new System.Drawing.Size(213, 22);
this.m_menuToolsOptions.Text = "&Options...";
this.m_menuToolsOptions.Click += new System.EventHandler(this.OnToolsOptions);
//
@@ -1431,14 +1430,14 @@
this.m_menuHelpSep2,
this.m_menuHelpAbout});
this.m_menuHelp.Name = "m_menuHelp";
- this.m_menuHelp.Size = new System.Drawing.Size(41, 20);
+ this.m_menuHelp.Size = new System.Drawing.Size(45, 20);
this.m_menuHelp.Text = "&Help";
//
// m_menuHelpContents
//
this.m_menuHelpContents.Image = global::KeePass.Properties.Resources.B16x16_Toggle_Log;
this.m_menuHelpContents.Name = "m_menuHelpContents";
- this.m_menuHelpContents.Size = new System.Drawing.Size(158, 22);
+ this.m_menuHelpContents.Size = new System.Drawing.Size(170, 22);
this.m_menuHelpContents.Text = "&Help Contents";
this.m_menuHelpContents.Click += new System.EventHandler(this.OnHelpContents);
//
@@ -1446,20 +1445,20 @@
//
this.m_menuHelpSelectSource.Image = global::KeePass.Properties.Resources.B16x16_KOrganizer;
this.m_menuHelpSelectSource.Name = "m_menuHelpSelectSource";
- this.m_menuHelpSelectSource.Size = new System.Drawing.Size(158, 22);
+ this.m_menuHelpSelectSource.Size = new System.Drawing.Size(170, 22);
this.m_menuHelpSelectSource.Text = "Help &Source...";
this.m_menuHelpSelectSource.Click += new System.EventHandler(this.OnHelpSelectSource);
//
// m_menuHelpSep0
//
this.m_menuHelpSep0.Name = "m_menuHelpSep0";
- this.m_menuHelpSep0.Size = new System.Drawing.Size(155, 6);
+ this.m_menuHelpSep0.Size = new System.Drawing.Size(167, 6);
//
// m_menuHelpWebsite
//
this.m_menuHelpWebsite.Image = global::KeePass.Properties.Resources.B16x16_Folder_Home;
this.m_menuHelpWebsite.Name = "m_menuHelpWebsite";
- this.m_menuHelpWebsite.Size = new System.Drawing.Size(158, 22);
+ this.m_menuHelpWebsite.Size = new System.Drawing.Size(170, 22);
this.m_menuHelpWebsite.Text = "KeePass &Website";
this.m_menuHelpWebsite.Click += new System.EventHandler(this.OnHelpHomepage);
//
@@ -1467,33 +1466,33 @@
//
this.m_menuHelpDonate.Image = global::KeePass.Properties.Resources.B16x16_Identity;
this.m_menuHelpDonate.Name = "m_menuHelpDonate";
- this.m_menuHelpDonate.Size = new System.Drawing.Size(158, 22);
+ this.m_menuHelpDonate.Size = new System.Drawing.Size(170, 22);
this.m_menuHelpDonate.Text = "&Donate...";
this.m_menuHelpDonate.Click += new System.EventHandler(this.OnHelpDonate);
//
// m_menuHelpSep1
//
this.m_menuHelpSep1.Name = "m_menuHelpSep1";
- this.m_menuHelpSep1.Size = new System.Drawing.Size(155, 6);
+ this.m_menuHelpSep1.Size = new System.Drawing.Size(167, 6);
//
// m_menuHelpCheckForUpdate
//
this.m_menuHelpCheckForUpdate.Image = global::KeePass.Properties.Resources.B16x16_FTP;
this.m_menuHelpCheckForUpdate.Name = "m_menuHelpCheckForUpdate";
- this.m_menuHelpCheckForUpdate.Size = new System.Drawing.Size(158, 22);
+ this.m_menuHelpCheckForUpdate.Size = new System.Drawing.Size(170, 22);
this.m_menuHelpCheckForUpdate.Text = "&Check for Update";
this.m_menuHelpCheckForUpdate.Click += new System.EventHandler(this.OnHelpCheckForUpdate);
//
// m_menuHelpSep2
//
this.m_menuHelpSep2.Name = "m_menuHelpSep2";
- this.m_menuHelpSep2.Size = new System.Drawing.Size(155, 6);
+ this.m_menuHelpSep2.Size = new System.Drawing.Size(167, 6);
//
// m_menuHelpAbout
//
this.m_menuHelpAbout.Image = global::KeePass.Properties.Resources.B16x16_Help;
this.m_menuHelpAbout.Name = "m_menuHelpAbout";
- this.m_menuHelpAbout.Size = new System.Drawing.Size(158, 22);
+ this.m_menuHelpAbout.Size = new System.Drawing.Size(170, 22);
this.m_menuHelpAbout.Text = "&About KeePass...";
this.m_menuHelpAbout.Click += new System.EventHandler(this.OnHelpAbout);
//
@@ -1579,7 +1578,7 @@
//
this.m_tbAddEntryDefault.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Import;
this.m_tbAddEntryDefault.Name = "m_tbAddEntryDefault";
- this.m_tbAddEntryDefault.Size = new System.Drawing.Size(86, 22);
+ this.m_tbAddEntryDefault.Size = new System.Drawing.Size(88, 22);
this.m_tbAddEntryDefault.Text = "<>";
this.m_tbAddEntryDefault.Click += new System.EventHandler(this.OnEntryAdd);
//
@@ -1736,40 +1735,48 @@
this.m_ctxTrayLock,
this.m_ctxTrayFileExit});
this.m_ctxTray.Name = "m_ctxTray";
- this.m_ctxTray.Size = new System.Drawing.Size(153, 126);
+ this.m_ctxTray.Size = new System.Drawing.Size(142, 104);
this.m_ctxTray.Opening += new System.ComponentModel.CancelEventHandler(this.OnCtxTrayOpening);
//
// m_ctxTrayTray
//
this.m_ctxTrayTray.Image = global::KeePass.Properties.Resources.B16x16_View_Detailed;
this.m_ctxTrayTray.Name = "m_ctxTrayTray";
- this.m_ctxTrayTray.Size = new System.Drawing.Size(152, 22);
+ this.m_ctxTrayTray.Size = new System.Drawing.Size(141, 22);
this.m_ctxTrayTray.Text = "&Tray / Untray";
this.m_ctxTrayTray.Click += new System.EventHandler(this.OnTrayTray);
//
// m_ctxTraySep0
//
this.m_ctxTraySep0.Name = "m_ctxTraySep0";
- this.m_ctxTraySep0.Size = new System.Drawing.Size(149, 6);
+ this.m_ctxTraySep0.Size = new System.Drawing.Size(138, 6);
+ //
+ // m_ctxTrayOptions
+ //
+ this.m_ctxTrayOptions.Image = global::KeePass.Properties.Resources.B16x16_Misc;
+ this.m_ctxTrayOptions.Name = "m_ctxTrayOptions";
+ this.m_ctxTrayOptions.Size = new System.Drawing.Size(141, 22);
+ this.m_ctxTrayOptions.Text = "&Options...";
+ this.m_ctxTrayOptions.Click += new System.EventHandler(this.OnTrayOptions);
+ //
+ // m_ctxTraySep1
+ //
+ this.m_ctxTraySep1.Name = "m_ctxTraySep1";
+ this.m_ctxTraySep1.Size = new System.Drawing.Size(138, 6);
//
// m_ctxTrayLock
//
this.m_ctxTrayLock.Image = global::KeePass.Properties.Resources.B16x16_LockWorkspace;
this.m_ctxTrayLock.Name = "m_ctxTrayLock";
- this.m_ctxTrayLock.Size = new System.Drawing.Size(152, 22);
+ this.m_ctxTrayLock.Size = new System.Drawing.Size(141, 22);
this.m_ctxTrayLock.Text = "<>";
this.m_ctxTrayLock.Click += new System.EventHandler(this.OnTrayLock);
//
- // m_ctxTraySep1
- //
- this.m_ctxTraySep1.Name = "m_ctxTraySep1";
- this.m_ctxTraySep1.Size = new System.Drawing.Size(149, 6);
- //
// m_ctxTrayFileExit
//
this.m_ctxTrayFileExit.Image = global::KeePass.Properties.Resources.B16x16_Exit;
this.m_ctxTrayFileExit.Name = "m_ctxTrayFileExit";
- this.m_ctxTrayFileExit.Size = new System.Drawing.Size(152, 22);
+ this.m_ctxTrayFileExit.Size = new System.Drawing.Size(141, 22);
this.m_ctxTrayFileExit.Text = "E&xit";
this.m_ctxTrayFileExit.Click += new System.EventHandler(this.OnTrayExit);
//
@@ -1890,14 +1897,6 @@
this.m_richEntryView.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.OnEntryViewLinkClicked);
this.m_richEntryView.KeyUp += new System.Windows.Forms.KeyEventHandler(this.OnEntryViewKeyUp);
//
- // m_ctxTrayOptions
- //
- this.m_ctxTrayOptions.Image = global::KeePass.Properties.Resources.B16x16_Misc;
- this.m_ctxTrayOptions.Name = "m_ctxTrayOptions";
- this.m_ctxTrayOptions.Size = new System.Drawing.Size(152, 22);
- this.m_ctxTrayOptions.Text = "&Options...";
- this.m_ctxTrayOptions.Click += new System.EventHandler(this.OnTrayOptions);
- //
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
diff --git a/KeePass/Forms/MainForm.cs b/KeePass/Forms/MainForm.cs
index 45099b8..c85db50 100644
--- a/KeePass/Forms/MainForm.cs
+++ b/KeePass/Forms/MainForm.cs
@@ -338,7 +338,9 @@ namespace KeePass.Forms
UIUtil.SetCueBanner(m_tbQuickFind, strSearchTr);
#if DEBUG
- Program.Config.CustomConfig.SetBool("TestItem", true);
+ Program.Config.CustomConfig.SetBool("TestItem1", true);
+ Program.Config.CustomConfig.SetULong("TestItem2", 13);
+ Program.Config.CustomConfig.SetString("TestItem3", "TestValue");
Program.KeyProviderPool.Add(new KeePassLib.Keys.SampleKeyProvider());
#endif
@@ -499,7 +501,7 @@ namespace KeePass.Forms
pe.Strings.Set(PwDefs.UserNameField, new ProtectedString(pd.MemoryProtection.ProtectUserName,
KPRes.UserName));
pe.Strings.Set(PwDefs.UrlField, new ProtectedString(pd.MemoryProtection.ProtectUrl,
- @"http://www.somesite.com/"));
+ PwDefs.HomepageUrl));
pe.Strings.Set(PwDefs.PasswordField, new ProtectedString(pd.MemoryProtection.ProtectPassword,
KPRes.Password));
pe.Strings.Set(PwDefs.NotesField, new ProtectedString(pd.MemoryProtection.ProtectNotes,
@@ -564,7 +566,7 @@ namespace KeePass.Forms
private void OnFileClose(object sender, EventArgs e)
{
- CloseDocument(null, false, false);
+ CloseDocument(false, false);
}
private void OnFileSave(object sender, EventArgs e)
@@ -1268,7 +1270,8 @@ namespace KeePass.Forms
private void OnGroupsListDragDrop(object sender, DragEventArgs e)
{
- TreeViewHitTestInfo tvhi = m_tvGroups.HitTest(m_tvGroups.PointToClient(new Point(e.X, e.Y)));
+ TreeViewHitTestInfo tvhi = m_tvGroups.HitTest(m_tvGroups.PointToClient(
+ new Point(e.X, e.Y)));
if(tvhi.Node == null) return;
PwGroup pgSelected = (tvhi.Node.Tag as PwGroup);
@@ -1279,6 +1282,8 @@ namespace KeePass.Forms
PwEntry[] vSelected = GetSelectedEntries();
if((vSelected == null) || (vSelected.Length == 0)) return;
+ PwGroup pgSafeView = (m_pgActiveAtDragStart ?? new PwGroup());
+ bool bFullUpdateView = false;
List<PwEntry> vNowInvisible = new List<PwEntry>();
if(e.Effect == DragDropEffects.Move)
@@ -1295,7 +1300,8 @@ namespace KeePass.Forms
pgSelected.AddEntry(pe, true, true);
- vNowInvisible.Add(pe);
+ if(pe.IsContainedIn(pgSafeView)) bFullUpdateView = true;
+ else vNowInvisible.Add(pe);
}
}
else if(e.Effect == DragDropEffects.Copy)
@@ -1306,12 +1312,19 @@ namespace KeePass.Forms
peCopy.SetUuid(new PwUuid(true), true); // Create new UUID
pgSelected.AddEntry(peCopy, true, true);
+
+ if(peCopy.IsContainedIn(pgSafeView)) bFullUpdateView = true;
}
}
else { Debug.Assert(false); }
- RemoveEntriesFromList(vNowInvisible, true);
- UpdateUI(false, null, true, m_pgActiveAtDragStart, false, null, true);
+ if(!bFullUpdateView)
+ {
+ RemoveEntriesFromList(vNowInvisible, true);
+ UpdateUI(false, null, true, m_pgActiveAtDragStart, false, null, true);
+ }
+ else UpdateUI(false, null, true, m_pgActiveAtDragStart, true, null, true);
+
m_pgActiveAtDragStart = null;
}
else if(e.Data.GetDataPresent(typeof(PwGroup)))
@@ -1346,7 +1359,6 @@ namespace KeePass.Forms
else { Debug.Assert(false); }
pgSelected.AddGroup(pgDragged, true, true);
-
pgSelected.IsExpanded = true;
UpdateUI(false, null, true, pgDragged, true, null, true);
@@ -1450,7 +1462,7 @@ namespace KeePass.Forms
bool bTop = m_menuViewAlwaysOnTop.Checked;
Program.Config.MainWindow.AlwaysOnTop = bTop;
- this.TopMost = bTop;
+ EnsureAlwaysOnTopOpt();
}
private void OnGroupsPrint(object sender, EventArgs e)
@@ -2333,6 +2345,7 @@ namespace KeePass.Forms
if(f != null) f.Activate();
// SystemSounds.Beep.Play(); // Do not beep!
}
+ // else EnsureAlwaysOnTopOpt();
}
private void OnToolsTriggers(object sender, EventArgs e)
@@ -2352,7 +2365,9 @@ namespace KeePass.Forms
{
PwDocument pd = (m_tabMain.TabPages[i].Tag as PwDocument);
if(pd == null) { Debug.Assert(false); return; }
- CloseDocument(pd, false, false);
+
+ m_docMgr.ActiveDocument = pd;
+ CloseDocument(false, false);
break;
}
}
diff --git a/KeePass/Forms/MainForm.resx b/KeePass/Forms/MainForm.resx
index 2aa416d..695b671 100644
--- a/KeePass/Forms/MainForm.resx
+++ b/KeePass/Forms/MainForm.resx
@@ -127,1445 +127,1437 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD0
- UAEAAk1TRnQBSQFMAgEBRQEAAUwBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
- AwABIAEBAgABAQEAASAGAAEgAQEhAAGFAVYBSgH/AUkBFgEFAf8BSQEWAQUB/wFJARYBBQH/AUkBFgEF
- Af8BSQEWAQUB/wGFAVYBSgH/4AABlgFuAWQB/wFjAUMBOAH/AWQBTwFJAf8BZgFVAVAB/wOHAf8BbwFh
- AVwB/wFvAV4BWAH/AWUBRAE6Af8BnAF0AWoB/9wAAW8BTAFBAf8BRwErASMB/wFFASQBGgH/AUUBJAEa
- Af8BUAEzASkB/wFQATMBKQH/AVABMwEpAf8BUAEzASkB/wFvAUwBQQH/3AABbwFMAUEB/wFgAUEBNwH/
- AWYBRwE9Af8BZgFHAT0B/wFmAUkBPwH/AWYBSQE/Af8BZgFJAT8B/wFmAUgBPwH/AW8BTAFBAf/cAAFv
- AUwBQQH/AWABQQE4Af8BZgFHAT0B/wFqAUoBQQH/AY4BYgFYAf8BagFMAUIB/wFmAUkBPwH/AWYBSQE/
- Af8BbwFMAUEB/9wAAW8BTAFBAf8BSwFHARoB/wFpAZEBRwH/AXIBUQE+Af8B6wH1AfgB/wGBAkkB/wFR
- ATMBkAH/AUcBIQFMAf8BbwFMAUEB/9wAAW8BTAFBAf8CaAFJAf8BmQGyAZQB/wHGAb0BugH/AcgBtgGx
- Af8BxgG9AboB/wGZAZQBxgH/AWgBUAFyAf8BbwFMAUEB/9wAAW8BTAFBAf8BMAEWAREB/wEoAhgB/wE5
- AR4BOAH/AT8CMwH/AUoCPgH/ASwCHAH/ATABFgERAf8BbwFMAUEB/9wAAW8BTAFBAf8BxwG8AbgB/wHw
- AeEB3QH/AfgB+QH6Af8B8AHiAd8B/wP4Af8B8AHkAeEB/wG+AbMBrwH/AW8BTAFBAf/cAAFvAUwBQQH/
- AccBuQG1Af8B2AG2Aa0B/wH1AvMB/wHZAbsBswH/AfIB7gHtAf8B4AHBAbgB/wG5Aa4BqgH/AW8BTAFB
- Af/cAAFvAUwBQQH/AcABtAG5Af8BYQFSAdwB/wHsAfsC/wGBAd0C/wHjAfIB3wH/AYABuwFnAf8BuQGu
- AaoB/wFvAUwBQQH/3AABbwFMAUEB/wG/AboBuwH/AWoBwAL/AfUC8wH/AdkBuwGzAf8B+AHvAe0B/wHg
- AcEBuQH/AbkBrgGqAf8BbwFMAUEB/9wAAW8BTAFBAf8BxAG8AbsB/wG5AeIC/wHzAfgB+gH/AewB4QHf
- Af8B9QH3AfgB/wHuAeMB4QH/Ab8BswGvAf8BbwFMAUEB/9wAAW8BTAFBAf8BMAEWAREB/wEnAhYB/wE/
- AjIB/wFJAj0B/wFEAjcB/wEnAhYB/wEwARYBEQH/AW8BTAFBAf/cAAGEAVYBSwH/AUsBGgEJAf8BgAFU
- AUoB/wG2Aa0BqgH/A8wB/wG2Aa0BqgH/AYABVAFKAf8BSwEaAQkB/wGKAV0BUQH/3AAB0gHFAcEB/wFJ
- ARYBBQH/AUkBFgEFAf8BSQEWAQUB/wFJARYBBQH/AUkBFgEFAf8BPgEcAV8B/wFGARUBDQH/AdIBxQHB
- Af/kAAPHAf8DSQH/A2IB/wOwAf8DcAH/A0MB/wOJAf9sAAGFAb4BhQH/ATEBlwExAf9sAAOuAf8DTgH/
- A04B/wNNAf8DTQH/A00B/wNNAf8DTQH/A1IB/2gAAYUBvgGFAf8BMQGXATEB/2wAA1oB/wNcAf8DWgH/
- A1cB/wNSAf8DTgH/A00B/wNNAf8DTQH/A18B/xwAA+8B/wPhAf8MAAPXAf8D/AH/HAABvwHdAb8B/wFp
- AbUBaQH/ATEBlwExAf8BGgGLARoB/wEaAYsBGgH/AQABbQEAAf8BGgGLARoB/wExAZcBMQH/AbEB1QGx
- Af9cAANzAf8DZwH/A2cB/wNmAf8DYgH/A10B/wNXAf8DUAH/A00B/wNNAf8DTQH/A8oB/xgAA1IB/wMH
- Af8D8gH/BAADwQH/AwAB/wOvAf8cAAExAZcBMQH/AQABbQEAAf8BhQG+AYUB/wHmAfEB5gH/AYUBvgGF
- Af8BMQGXATEB/wG/Ad0BvwH/ARoBiwEaAf8BAAFtAQAB/wGUAcYBlAH/DAABxQHrAcUB/wG2AecBtgH/
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ
+ TwEAAk1TRnQBSQFMAgEBRQEAAWwBAAEkAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ AwABIAEBAgABAQEAASAGAAEgAQEhAAGFAVIBRgH/AUUBEgEBAf8BRQESAQEB/wFFARIBAQH/AUUBEgEB
+ Af8BRQESAQEB/wGFAVIBRgH/4AABlgFqAWAB/wFfAT8BNAH/AWABSwFFAf8BYgFRAUwB/wOHAf8BawFd
+ AVgB/wFrAVoBVAH/AWEBQAE2Af8BnAFwAWYB/9wAAWsBSAE9Af8BQwEnAR8B/wFBASABFgH/AUEBIAEW
+ Af8BTAEvASUB/wFMAS8BJQH/AUwBLwElAf8BTAEvASUB/wFrAUgBPQH/3AABawFIAT0B/wFcAT0BMwH/
+ AWIBQwE5Af8BYgFDATkB/wFiAUUBOwH/AWIBRQE7Af8BYgFFATsB/wFiAUQBOwH/AWsBSAE9Af/cAAFr
+ AUgBPQH/AVwBPQE0Af8BYgFDATkB/wFmAUYBPQH/AY4BXgFUAf8BZgFIAT4B/wFiAUUBOwH/AWIBRQE7
+ Af8BawFIAT0B/9wAAWsBSAE9Af8BRwFDARYB/wFlAZEBQwH/AW4BTQE6Af8B6wH1AfgB/wGBAkUB/wFN
+ AS8BkAH/AUMBHQFIAf8BawFIAT0B/9wAAWsBSAE9Af8CZAFFAf8BmQGyAZQB/wHGAb0BugH/AcgBtgGx
+ Af8BxgG9AboB/wGZAZQBxgH/AWQBTAFuAf8BawFIAT0B/9wAAWsBSAE9Af8BLAESAQ0B/wEkAhQB/wE1
+ ARoBNAH/ATsCLwH/AUYCOgH/ASgCGAH/ASwBEgENAf8BawFIAT0B/9wAAWsBSAE9Af8BxwG8AbgB/wHw
+ AeEB3QH/AfgB+QH6Af8B8AHiAd8B/wP4Af8B8AHkAeEB/wG+AbMBrwH/AWsBSAE9Af/cAAFrAUgBPQH/
+ AccBuQG1Af8B2AG2Aa0B/wH1AvMB/wHZAbsBswH/AfIB7gHtAf8B4AHBAbgB/wG5Aa4BqgH/AWsBSAE9
+ Af/cAAFrAUgBPQH/AcABtAG5Af8BXQFOAdwB/wHsAfsC/wGBAd0C/wHjAfIB3wH/AYABuwFjAf8BuQGu
+ AaoB/wFrAUgBPQH/3AABawFIAT0B/wG/AboBuwH/AWYBwAL/AfUC8wH/AdkBuwGzAf8B+AHvAe0B/wHg
+ AcEBuQH/AbkBrgGqAf8BawFIAT0B/9wAAWsBSAE9Af8BxAG8AbsB/wG5AeIC/wHzAfgB+gH/AewB4QHf
+ Af8B9QH3AfgB/wHuAeMB4QH/Ab8BswGvAf8BawFIAT0B/9wAAWsBSAE9Af8BLAESAQ0B/wEjAhIB/wE7
+ Ai4B/wFFAjkB/wFAAjMB/wEjAhIB/wEsARIBDQH/AWsBSAE9Af/cAAGEAVIBRwH/AUcBFgEFAf8BgAFQ
+ AUYB/wG2Aa0BqgH/A8wB/wG2Aa0BqgH/AYABUAFGAf8BRwEWAQUB/wGKAVkBTQH/3AAB0gHFAcEB/wFF
+ ARIBAQH/AUUBEgEBAf8BRQESAQEB/wFFARIBAQH/AUUBEgEBAf8BOgEYAVsB/wFCAREBCQH/AdIBxQHB
+ Af/kAAPHAf8DRQH/A14B/wOwAf8DbAH/Az8B/wOJAf9sAAGFAb4BhQH/AS0BlwEtAf9sAAOuAf8DSgH/
+ A0oB/wNJAf8DSQH/A0kB/wNJAf8DSQH/A04B/2gAAYUBvgGFAf8BLQGXAS0B/2wAA1YB/wNYAf8DVgH/
+ A1MB/wNOAf8DSgH/A0kB/wNJAf8DSQH/A1sB/xwAA+8B/wPhAf8MAAPXAf8D/AH/HAABvwHdAb8B/wFl
+ AbUBZQH/AS0BlwEtAf8BFgGLARYB/wEWAYsBFgH/AQABaQEAAf8BFgGLARYB/wEtAZcBLQH/AbEB1QGx
+ Af9cAANvAf8DYwH/A2MB/wNiAf8DXgH/A1kB/wNTAf8DTAH/A0kB/wNJAf8DSQH/A8oB/xgAA04B/wMD
+ Af8D8gH/BAADwQH/AwAB/wOvAf8cAAEtAZcBLQH/AQABaQEAAf8BhQG+AYUB/wHmAfEB5gH/AYUBvgGF
+ Af8BLQGXAS0B/wG/Ad0BvwH/ARYBiwEWAf8BAAFpAQAB/wGUAcYBlAH/DAABxQHrAcUB/wG2AecBtgH/
AbQB5gG0Af8BtAHlAbQB/wG1AeYBswH/AbMB5QGyAf8BsQHlAbIB/wGxAeUBsgH/AbAB5AGvAf8BrwHj
- Aa4B/wGxAeQBrgH/AawB4gGqAf8BqgHiAacB/wGpAeEBpgH/AacB4AGmAf8B2AHuAdcB/wwAA3EB/wOA
- Af8DgAH/A3EB/wNuAf8DZwH/A2EB/wNYAf8DUAH/A00B/wNNAf8DTgH/FAAD3wH/AwAB/wMAAf8DiAH/
- BAADOwH/AwAB/wNAAf8cAAExAZcBMQH/AUYBogFGAf8IAAGFAb4BhQH/ATEBlwExAf8EAAGFAb4BhQH/
- AQABbQEAAf8BGgGLARoB/wwAAZoB4QGbAf8BogHkAaYB/wG4AesBvAH/AboB6wG9Af8BuQHsAbwB/wG7
+ Aa4B/wGxAeQBrgH/AawB4gGqAf8BqgHiAacB/wGpAeEBpgH/AacB4AGmAf8B2AHuAdcB/wwAA20B/wOA
+ Af8DgAH/A20B/wNqAf8DYwH/A10B/wNUAf8DTAH/A0kB/wNJAf8DSgH/FAAD3wH/AwAB/wMAAf8DiAH/
+ BAADNwH/AwAB/wM8Af8cAAEtAZcBLQH/AUIBogFCAf8IAAGFAb4BhQH/AS0BlwEtAf8EAAGFAb4BhQH/
+ AQABaQEAAf8BFgGLARYB/wwAAZoB4QGbAf8BogHkAaYB/wG4AesBvAH/AboB6wG9Af8BuQHsAbwB/wG7
AewBwAH/AboB6wG/Af8BugHrAb0B/wG7AesBvgH/AbkB6gG8Af8BuQHqAbwB/wG4AeoBvAH/AbcB6gG5
- Af8BtAHpAbcB/wFxAdsBggH/AcUB5gHEAf8IAAO1Af8DiQH/A4sB/wOLAf8DiAH/A4MB/wNxAf8DaQH/
- A2EB/wNXAf8DTgH/A00B/wNNAf8UAANhAf8DAAH/AzkB/wMpAf8DvAH/AwAB/wMAAf8DKgH/A+EB/xgA
- AZQBxgGUAf8BvwHdAb8B/wgAAYUBvgGFAf8BMQGXATEB/wQAAUYBogFGAf8BAAFtAQAB/wEAAW0BAAH/
+ Af8BtAHpAbcB/wFtAdsBggH/AcUB5gHEAf8IAAO1Af8DiQH/A4sB/wOLAf8DiAH/A4MB/wNtAf8DZQH/
+ A10B/wNTAf8DSgH/A0kB/wNJAf8UAANdAf8DAAH/AzUB/wMlAf8DvAH/AwAB/wMAAf8DJgH/A+EB/xgA
+ AZQBxgGUAf8BvwHdAb8B/wgAAYUBvgGFAf8BLQGXAS0B/wQAAUIBogFCAf8BAAFpAQAB/wEAAWkBAAH/
AdkB6gHZAf8IAAGYAeABmwH/AcoB7wHRAf8B+gL+Af8B+gL+Af8B+gL+Af8B/QH/Af4F/wHLAc4B7gH/
- AW4BhAHQAf8BvQHCAd4B/wFzAYoB1wH/AagBrAHXAf8B+AH+AfwB/wH1Af4B+gH/AY8B3wGVAf8BwwHl
- AcMB/wgAA4YB/wOTAf8DmAH/A5gB/wOTAf8DjQH/A4UB/wNwAf8DZgH/A1wB/wNSAf8DTQH/A00B/wOn
- Af8MAAPoAf8DAAH/AwAB/wPFAf8DkQH/AwYB/wMAAf8DVAH/A6wB/wN0Af8oAAFpAbUBaQH/ARoBiwEa
- Af8BMQGXATEB/wEAAW0BAAH/AQABbQEAAf8BGgGLARoB/wwAAZwB4gGfAf8BxwHvAdAB/wHxAf4B/AH/
- AfEB/gH8Af8B8QH+AfwB/wH6Af8B/gX/AeoB7QH8Af8BAQE5AfgB/wGbAasB3QH/AREBSAH4Af8BaAGL
+ AWoBhAHQAf8BvQHCAd4B/wFvAYoB1wH/AagBrAHXAf8B+AH+AfwB/wH1Af4B+gH/AY8B3wGVAf8BwwHl
+ AcMB/wgAA4YB/wOTAf8DmAH/A5gB/wOTAf8DjQH/A4UB/wNsAf8DYgH/A1gB/wNOAf8DSQH/A0kB/wOn
+ Af8MAAPoAf8DAAH/AwAB/wPFAf8DkQH/AwIB/wMAAf8DUAH/A6wB/wNwAf8oAAFlAbUBZQH/ARYBiwEW
+ Af8BLQGXAS0B/wEAAWkBAAH/AQABaQEAAf8BFgGLARYB/wwAAZwB4gGfAf8BxwHvAdAB/wHxAf4B/AH/
+ AfEB/gH8Af8B8QH+AfwB/wH6Af8B/gX/AeoB7QH8Af8BAAE1AfgB/wGbAasB3QH/AQ0BRAH4Af8BZAGL
AeMB/wHrAf0B9wH/AecB/QH0Af8BjgHfAZcB/wHBAeYBwgH/CAADlQH/A58B/wOkAf8DpAH/A50B/wOV
- Af8DiwH/A4EB/wNrAf8DYQH/A1UB/wNNAf8DTQH/A2YB/wwAA2sB/wMAAf8DMgH/BAADywH/AwAB/wMA
- Af8D2AH/BAADKgH/A/wB/xgAAeYB8QHmAf8BWAGsAVgB/wEaAYsBGgH/AQABbQEAAf8BAAFtAQAB/wEA
- AW0BAAH/AQABbQEAAf8BAAFtAQAB/wFGAaIBRgH/DAABnAHiAZ8B/wHFAe4BzgH/Ae0B+wH4Af8B7QH7
- AfkB/wHsAfsB+QH/AfUB/gH9Af8B9wH+Af0B/wH8Av4B/wFXAXMB9AH/AQ4BLgHXAf8BBAEjAdEB/wHh
+ Af8DiwH/A4EB/wNnAf8DXQH/A1EB/wNJAf8DSQH/A2IB/wwAA2cB/wMAAf8DLgH/BAADywH/AwAB/wMA
+ Af8D2AH/BAADJgH/A/wB/xgAAeYB8QHmAf8BVAGsAVQB/wEWAYsBFgH/AQABaQEAAf8BAAFpAQAB/wEA
+ AWkBAAH/AQABaQEAAf8BAAFpAQAB/wFCAaIBQgH/DAABnAHiAZ8B/wHFAe4BzgH/Ae0B+wH4Af8B7QH7
+ AfkB/wHsAfsB+QH/AfUB/gH9Af8B9wH+Af0B/wH8Av4B/wFTAW8B9AH/AQoBKgHXAf8BAAEfAdEB/wHh
AeMB7QH/Af0C/gH/AfwB/gH9Af8BjwHgAZgB/wG/AeUBwAH/CAADmgH/A6YB/wOuAf8DrgH/A6QB/wOa
- Af8DjgH/A4MB/wNsAf8DYgH/A1cB/wNNAf8DTQH/A1UB/wgAA/AB/wMFAf8DAAH/A7YB/wQAA1IB/wMA
- Af8DSQH/CAADagH/A7IB/xQAAdkB6gHZAf8BGgGLARoB/wEAAW0BAAH/AQABbQEAAf8BAAFtAQAB/wEA
- AW0BAAH/AQABbQEAAf8BAAFtAQAB/wFGAaIBRgH/EAABnAHiAaAB/wG1Ad8BvgH/AdAB2wHZAf8BzgHa
- AdgB/wHKAdYB1AH/Ad4B6wHoAf8B8QH+AfwB/wH7Av4B/wEoAVUB8wH/AQABHAHGAf8BAAEXAc0B/wG3
- AbkB3QX/A/4B/wGTAeABnAH/AbwB4wG9Af8IAAOVAf8DpAH/A6wB/wOsAf8DogH/A40B/wNxAf8DgAH/
- A2wB/wNhAf8DVwH/A00B/wNNAf8DhQH/CAADhQH/AwAB/wMnAf8EAAPiAf8DAAH/AwAB/wMiAf8D+wH/
- BAAD1gH/A0UB/xQAAVgBrAFYAf8BAAFtAQAB/wEAAW0BAAH/AQABbQEAAf8BGgGLARoB/wEaAYsBGgH/
+ Af8DjgH/A4MB/wNoAf8DXgH/A1MB/wNJAf8DSQH/A1EB/wgAA/AB/wMBAf8DAAH/A7YB/wQAA04B/wMA
+ Af8DRQH/CAADZgH/A7IB/xQAAdkB6gHZAf8BFgGLARYB/wEAAWkBAAH/AQABaQEAAf8BAAFpAQAB/wEA
+ AWkBAAH/AQABaQEAAf8BAAFpAQAB/wFCAaIBQgH/EAABnAHiAaAB/wG1Ad8BvgH/AdAB2wHZAf8BzgHa
+ AdgB/wHKAdYB1AH/Ad4B6wHoAf8B8QH+AfwB/wH7Av4B/wEkAVEB8wH/AQABGAHGAf8BAAETAc0B/wG3
+ AbkB3QX/A/4B/wGTAeABnAH/AbwB4wG9Af8IAAOVAf8DpAH/A6wB/wOsAf8DogH/A40B/wNtAf8DgAH/
+ A2gB/wNdAf8DUwH/A0kB/wNJAf8DhQH/CAADhQH/AwAB/wMjAf8EAAPiAf8DAAH/AwAB/wMeAf8D+wH/
+ BAAD1gH/A0EB/xQAAVQBrAFUAf8BAAFpAQAB/wEAAWkBAAH/AQABaQEAAf8BFgGLARYB/wEWAYsBFgH/
AYUBvgGFAf8B2QHqAdkB/xQAAZ8B4wGiAf8BswHeAb0B/wHNAdoB1wH/AcwB2QHXAf8ByQHUAdMB/wHS
- Ad4B3QH/AfEB/gH8Af8B+QL+Af8BhAGsAfoB/wEVAUUB4AH/ATcBUwHjAf8B+AH7AfoB/wH7Af4B/QH/
- AfoB/gH8Af8BkwHhAZwB/wG7AeQBvAH/CAADsQH/A5wB/wOhAf8DkwH/A4gB/wOYAf8DWAH/A4gB/wNi
- Af8DWAH/A1MB/wNNAf8DSwH/CAAD9AH/AwoB/wMAAf8DqAH/BAADZAH/AwAB/wM6Af8DgQH/A5sB/wgA
- AzYB/wPlAf8QAAExAZcBMQH/AQABbQEAAf8BAAFtAQAB/wGUAcYBlAH/AWkBtQFpAf8BMQGXATEB/wgA
+ Ad4B3QH/AfEB/gH8Af8B+QL+Af8BhAGsAfoB/wERAUEB4AH/ATMBTwHjAf8B+AH7AfoB/wH7Af4B/QH/
+ AfoB/gH8Af8BkwHhAZwB/wG7AeQBvAH/CAADsQH/A5wB/wOhAf8DkwH/A4gB/wOYAf8DVAH/A4gB/wNe
+ Af8DVAH/A08B/wNJAf8DRwH/CAAD9AH/AwYB/wMAAf8DqAH/BAADYAH/AwAB/wM2Af8DgQH/A5sB/wgA
+ AzIB/wPlAf8QAAEtAZcBLQH/AQABaQEAAf8BAAFpAQAB/wGUAcYBlAH/AWUBtQFlAf8BLQGXAS0B/wgA
AdkB6gHZAf8QAAGfAeMBowH/AcAB7gHKAf8B4wHyAe8B/wHSAeAB3QH/Ac8B3gHbAf8B0wHhAd0B/wHV
AeEB3gH/AdQB4AHdAf8B0AHdAdoB/wHRAd4B2wH/Ac4B3AHYAf8BzQHcAdQB/wHLAd8B1QH/AdkB9AHn
- Af8BjwHgAZgB/wG8AeQBvQH/DAADygH/A5gB/wOGAf8DjgH/A4EB/wNEAf8DcAH/A2YB/wNaAf8DUAH/
- A1cB/wwAA5AB/wMAAf8DDgH/BAAD6AH/AwAB/wMAAf8DuAH/A+4B/wMhAf8D8wH/BAADiwH/A2kB/xAA
- AUYBogFGAf8BAAFtAQAB/wExAZcBMQH/BAABhQG+AYUB/wExAZcBMQH/CAABMQGXATEB/wGFAb4BhQH/
+ Af8BjwHgAZgB/wG8AeQBvQH/DAADygH/A5gB/wOGAf8DjgH/A4EB/wNAAf8DbAH/A2IB/wNWAf8DTAH/
+ A1MB/wwAA5AB/wMAAf8DCgH/BAAD6AH/AwAB/wMAAf8DuAH/A+4B/wMdAf8D8wH/BAADiwH/A2UB/xAA
+ AUIBogFCAf8BAAFpAQAB/wEtAZcBLQH/BAABhQG+AYUB/wEtAZcBLQH/CAABLQGXAS0B/wGFAb4BhQH/
DAABnQHhAaEB/wG+Ae0ByAH/AeoB/AH4Af8B1wHnAeIB/wHJAdkB0wH/AcgB2AHTAf8ByQHYAdMB/wHT
AeIB3QH/AckB2AHUAf8BwAHTAcwB/wHEAdQBzgH/AcIB1AHKAf8B3AH1AekB/wHgAfwB7wH/AYsB3gGX
- Af8BugHiAbsB/xgAA5MB/wNfAf8DSwH/A9MB/wPJAf8D2QH/EAADYwH/AwAB/wMAAf8DAgH/A8UB/wMh
- Af8DAAH/AwAB/wM+Af8DSQH/AwEB/wMjAf8DxAH/AxQB/wMAAf8DWAH/DAABvwHdAb8B/wEAAW0BAAH/
- ARoBiwEaAf8BzAHkAcwB/wGFAb4BhQH/ATEBlwExAf8EAAGUAcYBlAH/AQABbQEAAf8BhQG+AYUB/wwA
+ Af8BugHiAbsB/xgAA5MB/wNbAf8DRwH/A9MB/wPJAf8D2QH/EAADXwH/AwAB/wMAAf8DAAH/A8UB/wMd
+ Af8DAAH/AwAB/wM6Af8DRQH/AwAB/wMfAf8DxAH/AxAB/wMAAf8DVAH/DAABvwHdAb8B/wEAAWkBAAH/
+ ARYBiwEWAf8BzAHkAcwB/wGFAb4BhQH/AS0BlwEtAf8EAAGUAcYBlAH/AQABaQEAAf8BhQG+AYUB/wwA
AaAB4wGjAf8BnQHkAaIB/wG0AesBuwH/AaUB3QGrAf8BnwHWAaQB/wGeAdUBogH/AaIB2wGnAf8BowHa
- AagB/wGgAdoBpQH/AZsB1wGiAf8BnAHaAaEB/wGcAdoBoQH/AaIB5AGpAf8BnQHjAaQB/wFpAdcBcQH/
- AbcB4QG4Af8IAAPAAf8DjgH/A6IB/wOQAf8DkAH/A9EB/wPZAf9sAAGxAdUBsQH/ATEBlwExAf8BGgGL
- ARoB/wEaAYsBGgH/ARoBiwEaAf8BGgGLARoB/wEaAYsBGgH/AUYBogFGAf8BvwHdAb8B/wwAAcgB6wHI
+ AagB/wGgAdoBpQH/AZsB1wGiAf8BnAHaAaEB/wGcAdoBoQH/AaIB5AGpAf8BnQHjAaQB/wFlAdcBbQH/
+ AbcB4QG4Af8IAAPAAf8DjgH/A6IB/wOQAf8DkAH/A9EB/wPZAf9sAAGxAdUBsQH/AS0BlwEtAf8BFgGL
+ ARYB/wEWAYsBFgH/ARYBiwEWAf8BFgGLARYB/wEWAYsBFgH/AUIBogFCAf8BvwHdAb8B/wwAAcgB6wHI
Af8BtAHmAbMB/wG1AeYBtAH/AbYB5wG2Af8BtQHnAbYB/wG1AeYBtAH/AbcB5wG4Af8BtwHmAbUB/wG1
AeUBtAH/AbYB5QG1Af8BtwHmAbYB/wG1AeMBtAH/AbIB4wGyAf8BtAHjAbQB/wGyAeEBsQH/AdkB7gHZ
- Af8EAANiAf8DXwH/A3EB/wNuAf8DjgH/DAAD2QH/cAAB5gHxAeYB/wFpAbUBaQH/ATEBlwExAf8B2QHq
- AdkB/2AAA+UB/wPqAf8UAAPwAf90AAGFAb4BhQH/ATEBlwExAf9wAAMgAS4DTgGZA1MBqgM8AWgDGAEh
- IAADGAEhA1QBqwNFAX8YAAM5AV8DVgG2AykBPxQAAY8BygHkAf8BZAG5AdkB/wFeAbYB2AH/AWYBuQHZ
- Af8BlgHNAeUB/wGYAdAB6AH/AWYBugHZAf8BXgG2AdgB/wFkAbkB2QH/AY0BxwHgAf8MAALsAfMB/0gA
- AycBOgNVAbEBOAFIAWIB9gGWAa8B1QH/AZgBpQHMAf8BRgFNAYwB/QFPAVEBVAHuA1cBwgNEAXoDIQEx
- AwEBAhAAA0ABcQEoAWoB4wH/AR4BQAGWAf0DVAGuAxABFgwAA0wBkwEnAV8BlQH7AR8BSwGpAf8DPAFn
- EAABxwHqAfoB/wExAbUB6QH/AS8BtgHsAf8BLwG2AewB/wEvAbYB7AH/ASwBrQHhAf8BKwGrAd4B/wEv
- AbYB7AH/AS8BtgHsAf8BLwG2AewB/wEwAbMB5wH/AcUB6QH4Af8IAALpAfMB/wKNAccB/zwAAxEBFwNV
- AbQBMQFYAVwB+AEAAXIBKQH/AVoBrQFwAf8B8wf/AfwD/wHVAdsB8gH/AZoBqQHPAf8BVwFjAX8B/gFB
- AUMBUgH0A1sB0AMvAUoMAAIhASIBMQFUAW0BugH7AY0B7wL/ARoBWAG/Af8CWwFeAdoDJwE6AxYBHwNZ
- AcwBOAGQAdYB/wGUAfAC/wJMAW0B8wMWAR8UAAENAR4BJgH/AQ8BRgFeAf8BKAFqAZIB/wEtAWEBgwH/
- ARsBJwEtAf8BGwEnASwB/wEtAWEBgwH/ASYBaAGQAf8BDwFGAV4B/wELAR0BJAH/EAAC0wHsAf8CVAHI
- Af8C1AH+Af80AAM/AW0BfAGLAcMB/gFEAdUBiQH/AQABqQEJAf8BTQGbAV4B/wHVAfQC/wHyAf0B/gH/
- Ad0B8wH5Af8B6wP/Ae8D/wHRAfsC/wGiAeIB+wH/ATsBYQG3Af8DTAGTEAACWgFdAdMBjwHpAf4B/wGI
- AfEC/wEtAZEB3wH/AUEBSAFZAfIBRQFTAWkB8QFEAbUB8wH/AZcB/QL/AWoBvQHuAf8DWQHDEAADbwH/
- A4IB/wMAAf8DhwH/A/4R/wP9Af8DbwH/AwAB/wNqAf8DggH/CAAC+AH+Af8CLwHXAf8CSwHYAf8CmgL/
- AuUC/ywAA0ABcQF/AZ8BzAH+AUQB0AGGAf8BAAGfAR4B/wFEAY8BZQH/AcsB7wL/AdsB8QH4Af8BoQGg
- AYwB/wHAAdIBxgH/AcgB9gL/AZgBzQH0Af8BiQHSAf4B/wE/AYIBygH/A0wBkxAAAksBTAGPAU0BswHx
- Af8BYgHiAv8BYAHiAv8BNwG0AfgB/wFCAcUB/AH/AWMB4QL/AWEB4wL/AUIBfwGuAf4DQQFzEwAB/wMA
- Af8DBwH/A/wZ/wP3Af8DAAH/AwAB/wMAAf8MAAKPAfoB/wJUAeMB/wJMAdoB/wKCAv8CwQL/KAADQAFw
- AXsBkQHHAf4BOwHLAYoB/wEAAbEBCgH/ATUBkQFIAf8BvwHkAv8B0wHuAfkB/wHMAbIBiwH/AcwBywGp
- Af8BmgHdAv8BmwGqAa4B/wGuAboBtAH/AR8BYQHJAf8DTAGTEAADIwEzAUEBagGmAfkBNQHYAv8BLwHK
- Av8BNgHVAv8BNAHRAv8BLQHLAv8BOwHRAf4B/wFKAVEBZwHyAxIBGRAAAxQB/wMAAf8DKyH/AxwB/wMA
- Af8DLAH/DAACzgH8Af8CUwH0Af8CWQHmAf8CRQHUAf8CgAL/AqcC/yQAA0ACcAGNAcsB/gE+AbwBgAH/
- AQ8BkAEVAf8BUAGZAZIB/wGvAeIC/wHWAfEB+gH/AcEBjgFFAf8BuwGwAYsB/wGAAdMC/wGlAZ4BgwH/
- AcoBpQFLAf8BEwFbAccB/wNNAZYQAANAAXEBIwFfAZ0B+wEPAdEC/wEFAcQC/wEHAcQC/wEHAcQC/wEC
- AccC/wEZAccB/QH/ASUBPwFqAfoDSAGEAwEBAgwAA1IB/wMAAf8DKiH/AxsB/wMAAf8DawH/EAAChQHz
- Af8CgAL/AmIB7gH/Aj8B0AH/AnQB/gH/ApYC/wLuAv8cAAM8AWcBYAGIAc8B/gFrAcYB6wH/AWwBvAHm
- Af8BgwHIAfwB/wGUAdYC/wGLAdkB/AH/AVEBpgHQAf8BSgGmAeAB/wFLAbkC/wFNAY4BwAH/AVkBiAGh
- Af8BDgFYAcUB/wNOAZQDAQECCAACUAFSAaQBJwFeAbYB/QEhAdAB+QH/ASIB1AL/ASQB0QL/ASUB0QL/
- ASUB0QL/ASQB0QL/ASIB1wL/AR8BwAHuAf8BEwFLAX8B/gNWAbsDFAEbCAADtAH/AwAB/wMKHf8D+wH/
- AwAB/wMAAf8DzQH/FAACmQL/AoAC/wJpAfUB/wI/AdIB/wJzAf0B/wKKAv8C4QL/FAADMgFQA1cBvwFL
- AZYB2gH/AWUBxAL/AWMBvQL/AW8ByQL/AVkBnwH4Af8BGwE5AdwB/wEhAVAB5AH/ARYBTgHjAf8BFAFT
- AeMB/wEOAV4B8gH/AQMBYwH8Af8BBQFDAcgB/wJJAVIB7wNUAa8CIQEiATEBWQFaAV4B2QExAakB6gH/
- AVwB9gL/AWkB6wL/AWsB5gL/AWkB5QL/AWYB5AL/AWYB5AL/AWoB5QL/AWoB5wL/AWYB8AL/AVMB7AL/
- ASEBgwG1Af8DWAHjAzUBVwgAAxsB/wMAAf8DzRn/A78B/wMAAf8DMgH/HAAClAL/AoAC/wJuAfkB/wJB
- AdcB/wJxAfwB/wKEAv8C1wL/EAACUwFjAesCAAGhAf8BOgGGAegB/wFUAbsC/wFXAbcC/wFcAbsB/gH/
- AS8BSAHtAf8BFAEWAdYB/wEZAR4B0wH/ARgBHAHSAf8BGAEcAdIB/wEeASQB1QH/ASIBKwHZAf8BIgEv
- AdkB/wElASoBzgH/AloBXAHcAVUBWQFwAewBXgHbAv8BigP/AZkB9QL/AZYB8wH+Af8BkwH1Av8BmQHy
- Av8BpwHwAv8BpAHvAv8BlAHyAv8BlQH0Av8BlwHyAf4B/wGXAfgC/wGDA/8BTgGyAd0B/wJVAVwB5wgA
- A7oB/wMAAf8DPgH/AfsC/AH/Ac8B7QH6Af8BpAHdAfYB/wGoAd8B9wH/AdsB8gH7Af8D+QH/AzIB/wMB
- Af8DzgH/IAAClQL/AoAC/wJyAfwB/wJFAdsB/wJwAfsB/wKCAv8C1gL/DAADTgGUAQYBAAG9Af8BIwFa
- AegB/wFIAbgC/wFLAbYC/wE7AYAB9gH/ARsBJAHiAf8BGwEuAd0B/wEaASwB3gH/ARoBLQHfAf8BGAEr
- Ad4B/wEYASkB3gH/ARcBKAHeAf8BGQEnAecB/wEoASkBgQH5AysBQwNZAccBWAFhAWwB5gJbAWcB4QJb
- AWYB4QJXAWIB3wFOAVkBgwHyAZMB2wH0Af8B0gH9Av8ByQH+Av8BaAGyAdoB/wFTAVQBawHuAV0BXwFl
- AeACWwFjAeEBXAFdAWMB4gJeAWoB5QNRAaIMAANzAf8DAAH/AS8BiwGvAf8BJQGlAdgB/wEjAaEB0wH/
- ASMBogHUAf8BJwGoAdsB/wEtAWsBkQH/AwAB/wO5Af8oAAKaAv8CgAL/AnQB/gH/AkoB4QH/Am8B+wH/
- AocC/wLlAv8IAAMEAQYCWgFhAdwBCwEYAbkB/wEyAZkB9QH/ATkBowL/ASMBNgHiAf8BHAEpAdgB/wEc
- ASwB2gH/ARsBKwHbAf8BGgEpAdoB/wEaASkB2wH/ARkBKQHZAf8BGwErAeQB/wESARsBvAH/A04BmRgA
- AjABMQFNAXABhAHHAf4B7wP/AdoB/AL/AUgBTQF7AfoDJAE1IAADzgH/AwAB/wEjAW4BmQH/AScBkQG7
- Af8BMAG0AekB/wEuAa4B4QH/ATABmgHDAf8BEwFNAWYB/wMAAf8D8wH/LAACqQL/AoAC/wKAAv8CUQHl
- Af8ChQH6Af8CrgL/AvgC/wgAAy0BRgIhAXwB+wENAToBvQH/ASgBXwHwAf8BIQEmAdYB/wEfASsB0wH/
- AR8BKwHVAf8BHQErAdkB/wEdASgB1AH/ARwBKAHUAf8BHAEpAdgB/wEcASYB3AH/AVoBWwFfAeADBwEK
- GAADCgEOAVUBXAFtAeoB9AP/Ac4B5QH8Af8CWwFcAdwDBAEGJwAB/wM2Af8DLAH/A04B/wJWAVcB/wNO
- Af8DCwH/AyUB/zQAAsYC/wKFAv8CgAL/AlkB6wH/AoMB+gH/Ar4C/wwAAlIBVAGmAhEBoAH/ASwBOQHm
- Af8BJAE0AeQB/wEhATAB4AH/ASEBMwHoAf8BHgExAegB/wEeAS0B4QH/ARwBLQHjAf8BHgEvAewB/wEg
- ASQBeQH8Ay0BRSAAAlUBVgG0AdwB6gH8Af8BqQG7AeIB/wNQAZ0oAAMvAf8DAAH/A6QB/wMXAf8DMgH/
- A5IB/wMAAf8DkAH/OAAC7wL/AqwC/wKBAv8CawH3Af8CkQL/AuQC/wgAAwwBEAJYAWUB5QEpAS0BmQH+
- ASgBKwGHAfwBJwErAYMB/AEhASMBkQH7ASEBIwGRAfsBJQEpAYEB+gIhAZEB+wEkASYBfgH6A04BlyQA
- AzoBYgGsAbIB7gH/AXUBewGbAf4DLwFKKAADywH/AwIB/wMAAf8DAAH/AwAB/wMAAf8DMAH/A/kB/0AA
- AuoC/wKwAv8ChAL/AqIC/1gAAwwBEAJbAWUB4QJcAV4BzgMEAQYsAAPbAf8DXQH/AxkB/wMnAf8DggH/
- A/UB/0wAAvUC/wLWAv8MAAMUARsDUQGhA0wBkwMkATUDAwEEaAADEAEWA1sB0ANYAcYDCQEMBAADGQEj
- AygBPAMtAUYDLQFGAykBPgMfASwDBgEINAADDwEUA1EBogNWAb4DMQFPEAADWQHJAUIBrQE8Af8BPgGE
- ATYB/wE+AUoBQAH1A1wBzgNFAX0DHwEsGAABYgJYAd0BmgFcASEB+wGcAU0BIgH6AZ0BTQEiAfoBnQFN
- ASEB+gGdAU0BIAH6AZ0BTQEgAfoBnQFNAR8B+gGdAU0BHgH6AZ4BTQEdAfoBngFNAR0B+gGeAU0BHQH6
- AZ4BTQEdAfoBngFNAR0B+gGaAUgBFgH7AWMBWwFYAeEEAAMSARkDXAHUAQABpAHiAf8BDAFYAZgB/wNZ
- AcMDVwHCAWQBUQFJAfEBeAE+ATkB+AF8AU0BKQH6AXwBTQEpAfoBdwE+ATkB+AFfAUoBPwHzAVsCWAHZ
- AzwBZzAAA1YBuQEOAUEBlgH/ARIBPwGSAf8BRwFMAVMB8QM2AVkIAANKAYwBJwGQAUcB/wFcAbEBpwH/
- Ad8B8wHPAf8BtQHhAakB/wFhAasBVQH/ATABdQEyAf4BRwFTAUkB8QNXAb8DLwFKEAABgwFfAUsB8wHu
- AaMBYAH/AewBsAGHAf8B7AGtAYEB/wHrAaoBcwH/AeoBqQFwAf8B6gGnAW4B/wHqAaQBawH/AekBogFo
- Af8B6QGgAWUB/wHpAZ4BYQH/AegBnAFeAf8B5wGaAVwB/wHkAZsBYAH/Ae0BiwE8Af8BhAFMATsB8wQA
- AisBLAFDAQsBVgGrAf0BAAH3Av8BFAHBAeoB/wFsATkBPwH/AfIBkQE4Av8BtQFZAv8BvgFhAf8B7QGt
- AWkB/wH0AbQBYgL/Ab0BYAL/AbMBWAH/AegBiAE9Af8BaQEtASYB+QM5AV8oAAM/AW0BOQFPAaEB/QFD
- AZgB3wH/AQoBYgHeAf8BCgFLAb4B/wNWAb4EAAMzAVIBLQF1AUUB+gGLAW4BuwH/Ae0BywH7Av8B+wHt
- Av8B+QH2Af8B+AH3AecB/wHaAeIBsgH/AZ4BxgFqAf8BRAGcATwB/wFJAU4BSQHvAykBPgwAAX4BWAFM
- AfEB7AHEAawN/wH2AfkC/wH3AfsC/wH9A/8B+wH+Av8B9wH6Av8B9AH2Af0B/wHwAfIB+QH/Ae8B7QH1
- Af8B5gHuAf0B/wHmAbwBqAH/AYABUwFFAfEEAAMBAQIBUQFYAWIB6QEAAdsB/gH/ARUBxAHnAf8BngGF
- AW8C/wHMAW0C/wHNAYMB/wHbAbABlgH/ASABHQHWAf8BQAEyAasB/wHzAcIBhgL/AcgBhgL/AdIBhAH/
- Ad0BcwE+Af8DVgG7JAADDQESAVgBWwFlAeUBUQGiAeMB/wG2Ad8B/QH/Ab4B3wL/AUsBcwGkAf4DRQF/
- Aw8BFAFYAWEBWAHmAS0ByQFeAf8BsQHpAecC/wHvAeQB/wHxAeUB2AH/AfMB4wHUAf8B9gHhAc0C/wHj
- AcgB/wH7AdEBrQH/AdEBvAGBAf8BVgGTAT8B/wNYAcsDBAEGCAABfgFYAUwB8QH1Ac0BsgH/AccByAHM
- Af8BhgGAAYEB/wG7ArcF/wHfAt0B/wGSAowB/wGPAYcBiAH/AZEBiQGKAf8BjwKIAf8BjgGGAYcB/wGG
- AnMB/wKvAbYB/wHvAcIBpgH/AX4BUwFFAfEEAAM2AVkBFgFfAZMB+wEAAeMC/wEUAb8B4gH/AZUBhAGG
- Av8B1AGXAv8B2QGiAf8B2AG8AbAB/wEhASUB6AH/ATgBNAHUAf8B8AHSAagB/wH4AckBigL/AcUBhgH/
- AfEBpwFnAf8DWwHIJAADRgGBAS4BawG9Af8BlwHQAf0B/wHdAfwC/wG0Ab4BzwH/A1QBqwQAA1gBxgFT
- AZ4BXAH/AdAB2gGqAf8B/QHxAeEB/wHxAeQB1gH/AfAB5AHVAf8B8QHgAcwB/wH0AdcBuAH/AfIBzwGp
- Af8B1QGzAYoB/wH3AccBnAH/AckB1QGbAf8BNgFqASsB/gNKAYsIAAF+AVgBTwHxAfIBygGvAf8B5gHp
- AewB/wHJAcgByQH/AeAC3wH/A/4B/wHvAu0B/wHOAswB/wHMAskB/wHMAscB/wHKAsUB/wHJAsMB/wHE
- Ar0B/wHSAdMB2gH/Ae4BvwGjAf8BfgFTAUUB8QQAAzQBVAELAVgBqAH9AQAB5QL/ARMBvwHhAf8BkwGE
- AY8C/wHhAbUC/wHqAccB/wHmAdYBzAH/AkAB4AH/AWMBWwHVAf8B/AHsAcUB/wHeAdQBnwH/Af0B1QGl
- Af8B7wGoAYIB/wNWAbYgAAMSARkBUwFZAWQB7AFvAb4B9wH/AccB8wL/AZUBuQHYAf8DVgG7CAABWQFl
- AVkB5QFJAYMBnAH/AfAB6wH7Av8B/gH7Af8B+wHsAeQB/wHzAeQB1AH/AfIB2wHCAf8B9wHYAbcB/wHc
- AcABnQH/AeQBvQGRAf8B+gHOAaEB/wH+AegBzAH/AZkBzAGLAf8BPwFIAT0B9AMtAUUEAAF+AVcBTwHx
- Ae8ByAGtDf8B/AL6Hf8B+AH5Av8B6wG+AaIB/wF+AVMBRQHxBAADLQFFAQsBWAGJAfwBAAHhAv8BEwHA
- AeEB/wGYAY8BogL/AekBzAL/AfsB7AH/AvIB7QH/AUYBRAHZAf8BaQFlAdUD/wHwAv8B9wHtAv8B6wHT
- Af8BvQF/AW0B/gM8AWggAANWAb4BRwGYAdsB/wGtAecC/wFnAagB1wH/A1kBwwMBAQIIAAMQARYBPAE9
- ATwBaAFZAVwBWQHPAXwBmQF/AfsB0QHpAdEB/wH2AfQB5gL/AekB0gH/AeIBxwGrAf8B2wG9AZkB/wH3
- AdEBpgH/AfMB0gGtAf8B/QHgAckB/wHzAfoB5wH/AVwBqQFXAf8DWgHTAw8BFAF7AVgBUQHxAfQBzgG0
- Af8C0wHWAf8BoAKcAf8ByQLHAf8D/gH/AegC5QH/AaoCpQH/AagCoQH/AagCogH/AacCoAH/AaUCnwH/
- AZ8ClgH/AcEBwwHJAf8B9AHIAawB/wF+AVMBRQHxBAADUQGgAQABkwHTAf8BAAHrAv8BEwG9AeAB/wGN
- AV0BbwL/Ad8BygL/AfEB3gH/AeEBzQG8Af8BJgEqAbsB/wFJAUYBsAH/AfoB2AGvAv8B6gHZAv8B1QHJ
- Af8BXQJZAdIDBgEIBAADFAEbAy4BSAMJAQwMAANOAZgBKgFvAaMB/gGbAeEC/wFxAbUB4wH/A1kBzAMG
- AQgYAAMYASEDSwGOAl4BWgHYAXsBmAFvAfoB2AHKAagB/wH4AdQBsQH/AfIB0wGxAf8B8wHcAcIB/wHx
- Ad4ByAL/AfQB7wH/AdcB9AHYAf8BNwF4ATEB/gNOAZcBewFXAVMB8QHzAc4BtAH/Ad4B4QHlAf8BuAG2
- AbcB/wHYAtYF/wHuAu0B/wHAAr4B/wG+ArsB/wG/ArwB/wG+ArkB/wG9ArkB/wG3ArIB/wHPAdMB2QH/
- AfMByQGtAf8BfgFTAUUB8QMSARkBSwFSAWIB7QEAAckB/QH/AQAB4gH9Af8BGgHJAeoB/wFBASoBQQH5
- AZ0BSQE5AfwBswKiAf8BWQGdAcAB/wFAAZYBxgH/ATIBjAG+Af8BUAGIAZ8B/wHDAY4BcgH/AWcBXgFd
- AeUDGwEmBAADIAEuA1gB4wI9ATwB/ANPAZwIAANOAZcBJAFmAZoB/gFzAc0C/wGfAdsB/gH/AUwBVAFi
- Ae8DHQEqKAABKwEsASsBQwFnAXIBXQHwAf4B8AHYAf8B9QHbAcQB/wHyAeEB0AH/AfMB5gHYAv8B8AHt
- Af8BrQHaAa0B/wEqAaQBLwH/A1EBpwF7AVYBUwHxAfABzAGzDv8C/iH/AfABxwGsAf8BewFTAUUB8QNS
- AagBAAFhAcIB/wEAAeIC/wEAAdkB9QH/AR4B3QH3Af8BHgGXAccB/wE1AUgBdwH+AWABngHHAf8BiAHX
- Af0B/wGNAdQB9QH/AXMBywHuAf8BSAGxAeIB/wEqAWQBnwH/A1IBqAgAA1kB1wHWAc8BzQH/AbgBtAGy
- Af8DPgH4AzoBYQNOAZcBHwFnAZ8B/gFfAcIC/wGoAeYC/wFNAXwBlwH+A0IBdjAAAzoBYgGbAbcBkQH8
- Af8B+AHwAf8B8gHjAdQC/wHvAesB/wHLAeIBxwH/ATUBugFFAf8DWAHjAxUBHQF3AVYBUwHxAfQB0AG4
- Af8C3QHeAf8BtgKyAf8B1gLTBf8B7gLtAf8BvgK7Af8BvQK5Af8BvwK6Af8BvgK5Af8BvQK4Af8BuQKy
- Af8B1AHWAdoB/wH2AcwBsAH/AXsBUwFFAfEBVAFYAWEB5AEAAb0C/wEAAeUC/wEAAesB+AH/ATEB+wH9
- Af8BhgP/AU8BmwHMAf8BhAG5AeIB/wGlAeMC/wGcAdoB/gH/AZYB1wH6Af8BjgHSAfMB/wFRAbcB6QH/
- AVMBWAFgAesDFAEbBAADZAHsAdcB0gHTAf8BywHJAcoB/wGOAY8BjgH/AUQBQQE1AfsBbgFvAXUB/gFI
- AZUByQH/AYAB0wL/AWsBsgHgAf8DWQHEOAABVQFWAVUBsQHkAfQB5QL/AfQB8QH/AekB6AHbAf8BWwHW
- AW8B/wFBAW4BQQH5AzABTQQAAXcBVgFTAfEB9gHTAbwB/wHTAdcB2wH/AaABnwGgAf8DyQX/A+oB/wGr
- AqoB/wGpAacBqAH/AasBqQGqAf8BqgKpAf8BqwKoAf8BowGhAaIB/wHJAc8B1QH/AfkB0QG0Af8BewFT
- AUcB8QE7AUwBdwHzAQABxQL/AQAB4gL/AQAB/QL/ATED/wGUA/8BawGwAdAB/wGFAaYBzgH/AcIB7QL/
- AbcB5QL/AaYB3gL/AZgB2AH6Af8BhQHTAf0B/wE2AVoBbgH2Ax0BKgQAAycBOgNYAcsDiAH9AqwBqwH/
- AaoBqQGnAf8BvgG3AbEB/wG2AbABqgH/AWcBnQG9Af8BUgFVAVwB6gMYASE4AAMPARQBZAFrAWQB5wHz
- AfoB9QH/AZAB5QGfAf8BNQG0AUMB/wNIAYcIAAF3AVUBUwHxAe0BxwGuAf8B+AHxAe4B/wH4AfAB7QH/
- AfcB8QHuAf8B9wHyAe8B/wH4AfEB7wH/AfgB8QHuAf8B+AHxAe4B/wH4AfEB7wH/AfgB8QHvAf8B+AHx
- Ae8B/wH3AfEB7wH/AfcB8wHxAf8B8QHGAaoB/wF7AVMBRwHxARYBUQGUAfsBAAHHAv8BAAHiAv8BBAH7
- Av8BMgP/AY8D/wFrAbMB1AH/AZ4BsQHQAf8B5wH7Av8B1gHvAv8BugHkAv8BogHgAv8BjAHZAv8CWwFh
- AeEDBgEIDAADUwGtAaQBowGgAf8BzAHKAccB/wHFAcEBvwH/Ac0BxgHDAf8BbwFnAWUB/wNQAaMIAAMD
- AQQDDwEUAwkBDCwAAzUBVwFnAboBiAH9AVgB5gGCAf8DWAHGDAABdwFhAVMB8QHsAZ0BVQH/AeQBjQFH
- Af8B5AGPAUoB/wHkAY0BSAH/AeQBjAFHAf8B5AGMAUYB/wHkAYwBRQH/AeQBiwFEAf8B5AGKAUMB/wHk
- AYkBQQH/AeQBiQFAAf8B5AGIAUAB/wHjAYgBQQH/AewBiwE2Af8BewFTAUkB8QFLAVUBagHtAQABygL/
- AQABxQHwAf8BIgFLAV8B+wEwAYMBqQH+AXQD/wFCAYYBtwH/AaABsQHOBf8B8QP/AcwB9AL/Aa4B7gL/
- AVsBgwGuAf4DQAFwEAADHQEqA2QB8QHRAc8BzQH/AeYB4wHhAf8BswGxAbAB/wFkAWMBYQH/AkUBRAH5
- A1gB5ANaAdsDVwHoA10B5QMuAUgwAAFSAVMBUgGoAVcBXAFXAd8DGAEhDAABfgJfAfMB/wHhAaEC/wHH
- AYIC/wHEAXMC/wHBAW0C/wG+AWcC/wG6AWEC/wG2AVsC/wGyAVUC/wGuAU4C/wGqAUcC/wGmAUIC/wGj
- ATwC/wGeATQC/wGpAToB/wF7AVkBSgHyAlkBXAHJAQABwQH9Af8BAAHPAfYB/wELAUABUwH9AQkBiQG1
- Af8BYgP/AUEBRwFqAfkDVgHBAYUBjAGcAfkBvQHVAeEB/wGfAckB3QH/AUsBZwF7AfYDSwGPGAADLQFG
- A1wB5wHCAcABvQH/AdYB0wHRAf8BrAKpAf8BqAGnAaYB/wGvAa0BrAH/AbsBuQG4Af8ChAGDAf4DVgG4
- AwkBDEgAAV0CWQHXAY4BXAFTAfsBfQJNAfoBfQJNAfoBfQJNAfoBfQJNAfoBfQFNAUoB+gF9AU0BRgH6
- AX0BTQFCAfoBfQFNAT8B+gF9AU0BMQH6AX0BTQEuAfoBfQFNASsB+gF9AU0BKQH6AY4BRAElAfsBYAFa
- AVgB3gJGAUcBgQEeAU0BjAH6AR4BZAGYAfoBIwFlAYwB+QEsAVwBjgH4AToBZAGHAfcDVAGvBAADKQE/
- AkgBSQGHAkUBRgF/ASECIgExIAADEgEZA04BmANlAeUBhwKGAfkBfwJ9AfwBcQJuAfYDXgHZA0ABcRAA
+ Af8EAANeAf8DWwH/A20B/wNqAf8DjgH/DAAD2QH/cAAB5gHxAeYB/wFlAbUBZQH/AS0BlwEtAf8B2QHq
+ AdkB/2AAA+UB/wPqAf8UAAPwAf90AAGFAb4BhQH/AS0BlwEtAf9wAAMgAS4DTgGZA1MBqgM8AWgDGAEh
+ IAADGAEhA1QBqwNFAX8YAAM5AV8DVgG2AykBPxQAAY8BygHkAf8BYAG5AdkB/wFaAbYB2AH/AWIBuQHZ
+ Af8BlgHNAeUB/wGYAdAB6AH/AWIBugHZAf8BWgG2AdgB/wFgAbkB2QH/AY0BxwHgAf8MAALsAfMB/0gA
+ AycBOgNVAbEBPwFIAWIB9gGWAa8B1QH/AZgBpQHMAf8BQgFJAYwB/QNUAe4DVwHCA0QBegMhATEDAQEC
+ EAADQAFxASQBZgHjAf8BIgFAAZYB/QNUAa4DEAEWDAADTAGTAScBXwGRAfsBGwFHAakB/wM8AWcQAAHH
+ AeoB+gH/AS0BtQHpAf8BKwG2AewB/wErAbYB7AH/ASsBtgHsAf8BKAGtAeEB/wEnAasB3gH/ASsBtgHs
+ Af8BKwG2AewB/wErAbYB7AH/ASwBswHnAf8BxQHpAfgB/wgAAukB8wH/Ao0BxwH/PAADEQEXA1UBtAE6
+ AlwB+AEAAW4BJQH/AVYBrQFsAf8B8wf/AfwD/wHVAdsB8gH/AZoBqQHPAf8BVwFjAX8B/gFFAUgBUgH0
+ A1sB0AMvAUoMAAIhASIBMQFUAWIBqgH7AY0B7wL/ARYBVAG/Af8DXgHaAycBOgMWAR8DWQHMATQBkAHW
+ Af8BlAHwAv8CTAFoAfMDFgEfFAABCQEaASIB/wELAUIBWgH/ASQBZgGSAf8BKQFdAYMB/wEXASMBKQH/
+ ARcBIwEoAf8BKQFdAYMB/wEiAWQBkAH/AQsBQgFaAf8BBwEZASAB/xAAAtMB7AH/AlAByAH/AtQB/gH/
+ NAADPwFtAXwBgwG7Af4BQAHVAYkB/wEAAakBBQH/AUkBmwFaAf8B1QH0Av8B8gH9Af4B/wHdAfMB+QH/
+ AesD/wHvA/8B0QH7Av8BogHiAfsB/wE3AV0BtwH/A0wBkxAAAloBXQHTAY8B6QH+Af8BiAHxAv8BKQGR
+ Ad8B/wFJAUwBWQHyAU8BUwFkAfEBQAG1AfMB/wGXAf0C/wFmAb0B7gH/A1kBwxAAA2sB/wOCAf8DAAH/
+ A4cB/wP+Ef8D/QH/A2sB/wMAAf8DZgH/A4IB/wgAAvgB/gH/AisB1wH/AkcB2AH/ApoC/wLlAv8sAANA
+ AXEBfwGXAcQB/gFAAdABhgH/AQABnwEaAf8BQAGPAWEB/wHLAe8C/wHbAfEB+AH/AaEBoAGMAf8BwAHS
+ AcYB/wHIAfYC/wGYAc0B9AH/AYkB0gH+Af8BOwGCAcoB/wNMAZMQAAJLAUwBjwFJAbMB8QH/AV4B4gL/
+ AVwB4gL/ATMBtAH4Af8BPgHFAfwB/wFfAeEC/wFdAeMC/wFCAX8BpgH+A0EBcxMAAf8DAAH/AwMB/wP8
+ Gf8D9wH/AwAB/wMAAf8DAAH/DAACjwH6Af8CUAHjAf8CSAHaAf8CggL/AsEC/ygAA0ABcAF7AYkBvwH+
+ ATcBywGKAf8BAAGxAQYB/wExAZEBRAH/Ab8B5AL/AdMB7gH5Af8BzAGyAYsB/wHMAcsBqQH/AZoB3QL/
+ AZsBqgGuAf8BrgG6AbQB/wEbAV0ByQH/A0wBkxAAAyMBMwFBAWoBlgH5ATEB2AL/ASsBygL/ATIB1QL/
+ ATAB0QL/ASkBywL/ATcB0QH+Af8BTgFXAWcB8gMSARkQAAMQAf8DAAH/Aych/wMYAf8DAAH/AygB/wwA
+ As4B/AH/Ak8B9AH/AlUB5gH/AkEB1AH/AoAC/wKnAv8kAANAAnABhQHDAf4BOgG8AYAB/wELAZABEQH/
+ AUwBmQGSAf8BrwHiAv8B1gHxAfoB/wHBAY4BQQH/AbsBsAGLAf8BgAHTAv8BpQGeAYMB/wHKAaUBRwH/
+ AQ8BVwHHAf8DTQGWEAADQAFxASMBXwGWAfsBCwHRAv8BAQHEAv8BAwHEAv8BAwHEAv8BAAHHAv8BFQHH
+ Af0B/wEpAUMBZgH6A0gBhAMBAQIMAANOAf8DAAH/AyYh/wMXAf8DAAH/A2cB/xAAAoUB8wH/AoAC/wJe
+ Ae4B/wI7AdAB/wJwAf4B/wKWAv8C7gL/HAADPAFnAWABgAHHAf4BZwHGAesB/wFoAbwB5gH/AYMByAH8
+ Af8BlAHWAv8BiwHZAfwB/wFNAaYB0AH/AUYBpgHgAf8BRwG5Av8BSQGOAcAB/wFVAYgBoQH/AQoBVAHF
+ Af8DTgGUAwEBAggAAlABUgGkASsBVgGyAf0BHQHQAfkB/wEeAdQC/wEgAdEC/wEhAdEC/wEhAdEC/wEg
+ AdEC/wEeAdcC/wEbAcAB7gH/ARMBSwF/Af4DVgG7AxQBGwgAA7QB/wMAAf8DBh3/A/sB/wMAAf8DAAH/
+ A80B/xQAApkC/wKAAv8CZQH1Af8COwHSAf8CbwH9Af8CigL/AuEC/xQAAzIBUANXAb8BRwGWAdoB/wFh
+ AcQC/wFfAb0C/wFrAckC/wFVAZ8B+AH/ARcBNQHcAf8BHQFMAeQB/wESAUoB4wH/ARABTwHjAf8BCgFa
+ AfIB/wEAAV8B/AH/AQEBPwHIAf8CTQFXAe8DVAGvAiEBIgExAlsBXgHZAS0BqQHqAf8BWAH2Av8BZQHr
+ Av8BZwHmAv8BZQHlAv8BYgHkAv8BYgHkAv8BZgHlAv8BZgHnAv8BYgHwAv8BTwHsAv8BHQGDAbUB/wNY
+ AeMDNQFXCAADFwH/AwAB/wPNGf8DvwH/AwAB/wMuAf8cAAKUAv8CgAL/AmoB+QH/Aj0B1wH/Am0B/AH/
+ AoQC/wLXAv8QAAJYAWAB6wIAAaEB/wE2AYYB6AH/AVABuwL/AVMBtwL/AVgBuwH+Af8BKwFEAe0B/wEQ
+ ARIB1gH/ARUBGgHTAf8BFAEYAdIB/wEUARgB0gH/ARoBIAHVAf8BHgEnAdkB/wEeASsB2QH/ASEBJgHO
+ Af8DXAHcAlkBaAHsAVoB2wL/AYoD/wGZAfUC/wGWAfMB/gH/AZMB9QL/AZkB8gL/AacB8AL/AaQB7wL/
+ AZQB8gL/AZUB9AL/AZcB8gH+Af8BlwH4Av8BgwP/AUoBsgHdAf8DXAHnCAADugH/AwAB/wM6Af8B+wL8
+ Af8BzwHtAfoB/wGkAd0B9gH/AagB3wH3Af8B2wHyAfsB/wP5Af8DLgH/AwAB/wPOAf8gAAKVAv8CgAL/
+ Am4B/AH/AkEB2wH/AmwB+wH/AoIC/wLWAv8MAANOAZQBAgEAAb0B/wEfAVYB6AH/AUQBuAL/AUcBtgL/
+ ATcBgAH2Af8BFwEgAeIB/wEXASoB3QH/ARYBKAHeAf8BFgEpAd8B/wEUAScB3gH/ARQBJQHeAf8BEwEk
+ Ad4B/wEVASMB5wH/AS0BLwF6AfkDKwFDA1kBxwFYAWEBZwHmAlsBYQHhAlsBYQHhAlcBXgHfAVUBWQF5
+ AfIBkwHbAfQB/wHSAf0C/wHJAf4C/wFkAbIB2gH/AlQBYwHuAl8BYQHgAlsBYQHhAl0BYQHiAl4BZQHl
+ A1EBogwAA28B/wMAAf8BKwGLAa8B/wEhAaUB2AH/AR8BoQHTAf8BHwGiAdQB/wEjAagB2wH/ASkBZwGR
+ Af8DAAH/A7kB/ygAApoC/wKAAv8CcAH+Af8CRgHhAf8CawH7Af8ChwL/AuUC/wgAAwQBBgJcAWEB3AEH
+ ARQBuQH/AS4BmQH1Af8BNQGjAv8BHwEyAeIB/wEYASUB2AH/ARgBKAHaAf8BFwEnAdsB/wEWASUB2gH/
+ ARYBJQHbAf8BFQElAdkB/wEXAScB5AH/AQ4BFwG8Af8DTgGZGAACMAExAU0BcAF/Ab8B/gHvA/8B2gH8
+ Av8BTAFNAXcB+gMkATUgAAPOAf8DAAH/AR8BagGZAf8BIwGRAbsB/wEsAbQB6QH/ASoBrgHhAf8BLAGa
+ AcMB/wEPAUkBYgH/AwAB/wPzAf8sAAKpAv8CgAL/AoAC/wJNAeUB/wKFAfoB/wKuAv8C+AL/CAADLQFG
+ AiEBcAH7AQkBNgG9Af8BJAFbAfAB/wEdASIB1gH/ARsBJwHTAf8BGwEnAdUB/wEZAScB2QH/ARkBJAHU
+ Af8BGAEkAdQB/wEYASUB2AH/ARgBIgHcAf8BXgJfAeADBwEKGAADCgEOAVUBXAFlAeoB9AP/Ac4B5QH8
+ Af8DXAHcAwQBBicAAf8DMgH/AygB/wNKAf8CUgFTAf8DSgH/AwcB/wMhAf80AALGAv8ChQL/AoAC/wJV
+ AesB/wKDAfoB/wK+Av8MAAJSAVQBpgINAaAB/wEoATUB5gH/ASABMAHkAf8BHQEsAeAB/wEdAS8B6AH/
+ ARoBLQHoAf8BGgEpAeEB/wEYASkB4wH/ARoBKwHsAf8BJAEoAXUB/AMtAUUgAAJVAVYBtAHcAeoB/AH/
+ AakBuwHiAf8DUAGdKAADKwH/AwAB/wOkAf8DEwH/Ay4B/wOSAf8DAAH/A5AB/zgAAu8C/wKsAv8CgQL/
+ AmcB9wH/ApEC/wLkAv8IAAMMARACXgFlAeUBKQEtAZEB/gIrAX0B/AIrAXwB/AEhASMBjQH7ASEBIwGN
+ AfsCKQF7AfoCIQGNAfsBKAEpAXoB+gNOAZckAAM6AWIBrAGyAe4B/wF1AXsBkwH+Ay8BSigAA8sB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AywB/wP5Af9AAALqAv8CsAL/AoQC/wKiAv9YAAMMARACWwFhAeECXAFe
+ Ac4DBAEGLAAD2wH/A1kB/wMVAf8DIwH/A4IB/wP1Af9MAAL1Av8C1gL/DAADFAEbA1EBoQNMAZMDJAE1
+ AwMBBGgAAxABFgNbAdADWAHGAwkBDAQAAxkBIwMoATwDLQFGAy0BRgMpAT4DHwEsAwYBCDQAAw8BFANR
+ AaIDVgG+AzEBTxAAA1kByQE+Aa0BOAH/AToBhAEyAf8BQgFKAUIB9QNcAc4DRQF9Ax8BLBgAAV4CWAHd
+ AZQBXAEhAfsBkgFNASYB+gGTAU0BJgH6AZMBTQElAfoBkwFNASQB+gGTAU0BJAH6AZMBTQEjAfoBkwFN
+ ASIB+gGVAU0BIQH6AZUBTQEhAfoBlQFNASEB+gGVAU0BIQH6AZUBTQEhAfoBlAFIAR4B+wFhAlsB4QQA
+ AxIBGQNcAdQBAAGkAeIB/wEIAVQBmAH/A1kBwwNXAcIBZAJTAfEBdAE+AT0B+AF4AU0BKQH6AXgBTQEp
+ AfoBcwE+AT0B+AFfAUwBSgHzA1sB2QM8AWcwAANWAbkBCgE9AZYB/wEOATsBkgH/AVECUwHxAzYBWQgA
+ A0oBjAEjAZABQwH/AVgBsQGnAf8B3wHzAc8B/wG1AeEBqQH/AV0BqwFRAf8BMAF1ATIB/gFRAlMB8QNX
+ Ab8DLwFKEAABeAFfAUwB8wHuAaMBXAH/AewBsAGHAf8B7AGtAYEB/wHrAaoBbwH/AeoBqQFsAf8B6gGn
+ AWoB/wHqAaQBZwH/AekBogFkAf8B6QGgAWEB/wHpAZ4BXQH/AegBnAFaAf8B5wGaAVgB/wHkAZsBXAH/
+ Ae0BiwE4Af8BewFMAUQB8wQAAisBLAFDAQ8BUQGoAf0BAAH3Av8BEAHBAeoB/wFoATUBOwH/AfIBkQE0
+ Av8BtQFVAv8BvgFdAf8B7QGtAWUB/wH0AbQBXgL/Ab0BXAL/AbMBVAH/AegBiAE5Af8BaQE1ASoB+QM5
+ AV8oAAM/AW0BPQFLAaEB/QE/AZgB3wH/AQYBXgHeAf8BBgFHAb4B/wNWAb4EAAMzAVIBLQFxAUkB+gGL
+ AWoBuwH/Ae0BywH7Av8B+wHtAv8B+QH2Af8B+AH3AecB/wHaAeIBsgH/AZ4BxgFmAf8BQAGcATgB/wFN
+ AVQBTQHvAykBPgwAAXIBWAFTAfEB7AHEAawN/wH2AfkC/wH3AfsC/wH9A/8B+wH+Av8B9wH6Av8B9AH2
+ Af0B/wHwAfIB+QH/Ae8B7QH1Af8B5gHuAf0B/wHmAbwBqAH/AXQBUwFPAfEEAAMBAQICWAFiAekBAAHb
+ Af4B/wERAcQB5wH/AZ4BhQFrAv8BzAFpAv8BzQGDAf8B2wGwAZYB/wEcARkB1gH/ATwBLgGrAf8B8wHC
+ AYYC/wHIAYYC/wHSAYQB/wHdAW8BOgH/A1YBuyQAAw0BEgJeAWUB5QFNAaIB4wH/AbYB3wH9Af8BvgHf
+ Av8BSwFzAZwB/gNFAX8DDwEUAVgBYQFYAeYBKQHJAVoB/wGxAekB5wL/Ae8B5AH/AfEB5QHYAf8B8wHj
+ AdQB/wH2AeEBzQL/AeMByAH/AfsB0QGtAf8B0QG8AYEB/wFSAZMBOwH/A1gBywMEAQYIAAFyAVgBUwHx
+ AfUBzQGyAf8BxwHIAcwB/wGGAYABgQH/AbsCtwX/Ad8C3QH/AZICjAH/AY8BhwGIAf8BkQGJAYoB/wGP
+ AogB/wGOAYYBhwH/AYYCbwH/Aq8BtgH/Ae8BwgGmAf8BcgFTAU8B8QQAAzYBWQEeAV8BjwH7AQAB4wL/
+ ARABvwHiAf8BlQGEAYYC/wHUAZcC/wHZAaIB/wHYAbwBsAH/AR0BIQHoAf8BNAEwAdQB/wHwAdIBqAH/
+ AfgByQGKAv8BxQGGAf8B8QGnAWMB/wNbAcgkAANGAYEBKgFnAb0B/wGXAdAB/QH/Ad0B/AL/AbQBvgHP
+ Af8DVAGrBAADWAHGAU8BngFYAf8B0AHaAaoB/wH9AfEB4QH/AfEB5AHWAf8B8AHkAdUB/wHxAeABzAH/
+ AfQB1wG4Af8B8gHPAakB/wHVAbMBigH/AfcBxwGcAf8ByQHVAZsB/wE2AWoBKwH+A0oBiwgAAXIBWAFT
+ AfEB8gHKAa8B/wHmAekB7AH/AckByAHJAf8B4ALfAf8D/gH/Ae8C7QH/Ac4CzAH/AcwCyQH/AcwCxwH/
+ AcoCxQH/AckCwwH/AcQCvQH/AdIB0wHaAf8B7gG/AaMB/wFyAVMBTwHxBAADNAFUAQ8BUgGoAf0BAAHl
+ Av8BDwG/AeEB/wGTAYQBjwL/AeEBtQL/AeoBxwH/AeYB1gHMAf8CPAHgAf8BXwFXAdUB/wH8AewBxQH/
+ Ad4B1AGfAf8B/QHVAaUB/wHvAagBggH/A1YBtiAAAxIBGQJZAWQB7AFrAb4B9wH/AccB8wL/AZUBuQHY
+ Af8DVgG7CAABXgFlAV4B5QFFAYMBnAH/AfAB6wH7Av8B/gH7Af8B+wHsAeQB/wHzAeQB1AH/AfIB2wHC
+ Af8B9wHYAbcB/wHcAcABnQH/AeQBvQGRAf8B+gHOAaEB/wH+AegBzAH/AZkBzAGLAf8BQwFQAUEB9AMt
+ AUUEAAFyAVcBUwHxAe8ByAGtDf8B/AL6Hf8B+AH5Av8B6wG+AaIB/wFyAVMBTwHxBAADLQFFAQ8BUwF+
+ AfwBAAHhAv8BDwHAAeEB/wGYAY8BogL/AekBzAL/AfsB7AH/AvIB7QH/AUIBQAHZAf8BZQFhAdUD/wHw
+ Av8B9wHtAv8B6wHTAf8BtQF/AW0B/gM8AWggAANWAb4BQwGYAdsB/wGtAecC/wFjAagB1wH/A1kBwwMB
+ AQIIAAMQARYBPAE9ATwBaAFZAVwBWQHPAXABlAFzAfsB0QHpAdEB/wH2AfQB5gL/AekB0gH/AeIBxwGr
+ Af8B2wG9AZkB/wH3AdEBpgH/AfMB0gGtAf8B/QHgAckB/wHzAfoB5wH/AVgBqQFTAf8DWgHTAw8BFAFw
+ AVgBUwHxAfQBzgG0Af8C0wHWAf8BoAKcAf8ByQLHAf8D/gH/AegC5QH/AaoCpQH/AagCoQH/AagCogH/
+ AacCoAH/AaUCnwH/AZ8ClgH/AcEBwwHJAf8B9AHIAawB/wFyAVMBTwHxBAADUQGgAQABkwHTAf8BAAHr
+ Av8BDwG9AeAB/wGNAVkBawL/Ad8BygL/AfEB3gH/AeEBzQG8Af8BIgEmAbsB/wFFAUIBsAH/AfoB2AGv
+ Av8B6gHZAv8B1QHJAf8BXQJZAdIDBgEIBAADFAEbAy4BSAMJAQwMAANOAZgBKgFvAZsB/gGbAeEC/wFt
+ AbUB4wH/A1kBzAMGAQgYAAMYASEDSwGOAl4BWgHYAXcBjAFrAfoB2AHKAagB/wH4AdQBsQH/AfIB0wGx
+ Af8B8wHcAcIB/wHxAd4ByAL/AfQB7wH/AdcB9AHYAf8BNwF4ATEB/gNOAZcBcAFXAVMB8QHzAc4BtAH/
+ Ad4B4QHlAf8BuAG2AbcB/wHYAtYF/wHuAu0B/wHAAr4B/wG+ArsB/wG/ArwB/wG+ArkB/wG9ArkB/wG3
+ ArIB/wHPAdMB2QH/AfMByQGtAf8BcgFTAU8B8QMSARkBUgFWAV4B7QEAAckB/QH/AQAB4gH9Af8BFgHJ
+ AeoB/wFBATEBQQH5AZEBQQE1AfwBswKiAf8BVQGdAcAB/wE8AZYBxgH/AS4BjAG+Af8BTAGIAZ8B/wHD
+ AY4BbgH/AWUCXgHlAxsBJgQAAyABLgNYAeMCOQE4AfwDTwGcCAADTgGXASQBZgGSAf4BbwHNAv8BnwHb
+ Af4B/wFQAVgBYgHvAx0BKigAASsBLAErAUMBYQFpAV0B8AH+AfAB2AH/AfUB2wHEAf8B8gHhAdAB/wHz
+ AeYB2AL/AfAB7QH/Aa0B2gGtAf8BJgGkASsB/wNRAacBcAFWAVMB8QHwAcwBsw7/Av4h/wHwAccBrAH/
+ AXABUwFPAfEDUgGoAQABXQHCAf8BAAHiAv8BAAHZAfUB/wEaAd0B9wH/ARoBlwHHAf8BNQFIAXcB/gFc
+ AZ4BxwH/AYgB1wH9Af8BjQHUAfUB/wFvAcsB7gH/AUQBsQHiAf8BJgFgAZ8B/wNSAagIAANZAdcB1gHP
+ Ac0B/wG4AbQBsgH/Az4B+AM6AWEDTgGXAR8BZwGXAf4BWwHCAv8BqAHmAv8BTQF8AY8B/gNCAXYwAAM6
+ AWIBjwGvAYUB/AH/AfgB8AH/AfIB4wHUAv8B7wHrAf8BywHiAccB/wExAboBQQH/A1gB4wMVAR0BbwFW
+ AVMB8QH0AdABuAH/At0B3gH/AbYCsgH/AdYC0wX/Ae4C7QH/Ab4CuwH/Ab0CuQH/Ab8CugH/Ab4CuQH/
+ Ab0CuAH/AbkCsgH/AdQB1gHaAf8B9gHMAbAB/wFwAVMBTwHxAVkBWgFhAeQBAAG9Av8BAAHlAv8BAAHr
+ AfgB/wEtAfsB/QH/AYYD/wFLAZsBzAH/AYQBuQHiAf8BpQHjAv8BnAHaAf4B/wGWAdcB+gH/AY4B0gHz
+ Af8BTQG3AekB/wFYAVkBYAHrAxQBGwQAA2QB7AHXAdIB0wH/AcsByQHKAf8BjgGPAY4B/wFEAUEBMgH7
+ AW4BbwF1Af4BRAGVAckB/wGAAdMC/wFnAbIB4AH/A1kBxDgAAVUBVgFVAbEB5AH0AeUC/wH0AfEB/wHp
+ AegB2wH/AVcB1gFrAf8BQQFqAUEB+QMwAU0EAAFvAVYBUwHxAfYB0wG8Af8B0wHXAdsB/wGgAZ8BoAH/
+ A8kF/wPqAf8BqwKqAf8BqQGnAagB/wGrAakBqgH/AaoCqQH/AasCqAH/AaMBoQGiAf8ByQHPAdUB/wH5
+ AdEBtAH/AXABUwFRAfEBRAFMAW8B8wEAAcUC/wEAAeIC/wEAAf0C/wEtA/8BlAP/AWcBsAHQAf8BhQGm
+ Ac4B/wHCAe0C/wG3AeUC/wGmAd4C/wGYAdgB+gH/AYUB0wH9Af8BOwFaAWIB9gMdASoEAAMnAToDWAHL
+ A4gB/QKsAasB/wGqAakBpwH/Ab4BtwGxAf8BtgGwAaoB/wFjAZ0BvQH/AlUBXAHqAxgBITgAAw8BFANk
+ AecB8wH6AfUB/wGQAeUBnwH/ATEBtAE/Af8DSAGHCAABbwFVAVMB8QHtAccBrgH/AfgB8QHuAf8B+AHw
+ Ae0B/wH3AfEB7gH/AfcB8gHvAf8B+AHxAe8B/wH4AfEB7gH/AfgB8QHuAf8B+AHxAe8B/wH4AfEB7wH/
+ AfgB8QHvAf8B9wHxAe8B/wH3AfMB8QH/AfEBxgGqAf8BcAFTAVEB8QEeAVEBkAH7AQABxwL/AQAB4gL/
+ AQAB+wL/AS4D/wGPA/8BZwGzAdQB/wGeAbEB0AH/AecB+wL/AdYB7wL/AboB5AL/AaIB4AL/AYwB2QL/
+ AlsBYQHhAwYBCAwAA1MBrQGkAaMBoAH/AcwBygHHAf8BxQHBAb8B/wHNAcYBwwH/AWsBYwFhAf8DUAGj
+ CAADAwEEAw8BFAMJAQwsAAM1AVcBXwG2AYgB/QFUAeYBggH/A1gBxgwAAW8BYQFTAfEB7AGdAVEB/wHk
+ AY0BQwH/AeQBjwFGAf8B5AGNAUQB/wHkAYwBQwH/AeQBjAFCAf8B5AGMAUEB/wHkAYsBQAH/AeQBigE/
+ Af8B5AGJAT0B/wHkAYkBPAH/AeQBiAE8Af8B4wGIAT0B/wHsAYsBMgH/AXACUwHxAVIBWQFmAe0BAAHK
+ Av8BAAHFAfAB/wEiAUsBXwH7ATABfwGhAf4BcAP/AT4BhgG3Af8BoAGxAc4F/wHxA/8BzAH0Av8BrgHu
+ Av8BWwF/AaYB/gNAAXAQAAMdASoDZAHxAdEBzwHNAf8B5gHjAeEB/wGzAbEBsAH/AWABXwFdAf8CRQFE
+ AfkDWgHkA1oB2wNXAegDXgHlAy4BSDAAAVIBUwFSAagBVwFcAVcB3wMYASEMAAFxAl8B8wH/AeEBoQL/
+ AccBggL/AcQBbwL/AcEBaQL/Ab4BYwL/AboBXQL/AbYBVwL/AbIBUQL/Aa4BSgL/AaoBQwL/AaYBPgL/
+ AaMBOAL/AZ4BMAL/AakBNgH/AXIBWQFOAfICWQFcAckBAAHBAf0B/wEAAc8B9gH/AQ8BQAFPAf0BBQGJ
+ AbUB/wFeA/8BQQFHAWoB+QNWAcEBgQGIAZAB+QG9AdUB4QH/AZ8ByQHdAf8BSQFiAXMB9gNLAY8YAAMt
+ AUYDXAHnAcIBwAG9Af8B1gHTAdEB/wGsAqkB/wGoAacBpgH/Aa8BrQGsAf8BuwG5AbgB/wN/Af4DVgG4
+ AwkBDEgAAV0CWQHXAYoBXAFTAfsBeQJNAfoBeQJNAfoBeQJNAfoBeQJNAfoBeQJNAfoBeQFNAUoB+gF5
+ AU0BRgH6AXkBTQFDAfoBeQFNATEB+gF5AU0BLgH6AXkBTQErAfoBeQFNASkB+gGKAUQBJQH7AWACWgHe
+ AkYBRwGBASIBTQGAAfoBIgFcAYwB+gEnAWUBiAH5ATgBXAGCAfgBPgFkAYMB9wNUAa8EAAMpAT8CSAFJ
+ AYcCRQFGAX8BIQIiATEgAAMSARkDTgGYA2UB5QGDAoIB+QF7AnkB/AFlAmIB9gNeAdkDQAFxEAADOgFh
+ A1kBxwNZAcwDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1wBzgNZAcMDNAFV
+ RAADVwHCA0QBezgAA2EB4gNwAfEDZwHuA2cB7gNnAe4DZQHuA2UB7gNlAe4DZQHuA2UB7gNlAe4DZQHu
+ A2gB8ANlAeUEAANhAe4D4gH/A90B/wPaAf8C2wHaAf8D2QH/A9gB/wPYAf8D1wH/A9YB/wPVAf8D1AH/
+ A9MB/wPgAf8DmQH/A1cBvQwAA0gBhgJNATIB+gNDAXcsAANcAdQBBwEjATgB/wNJAYkDEwEaMAABogKj
+ Bf8B9gLwAf8B9gLvAf8B9gLvAf8B9ALvAf8B9ALtAf8B9ALtAf8B9ALtAf8B8gLrAf8B8wLrAf8B8gLo
+ Av8C+wH/AaICoQH/BAADhAH3BP8C9AHzAf8B/QH4AfUC/wH2AfMB/wH9AfQB8QH/AfwB8wHwAf8B+wHw
+ Ae0B/wH5AfAB7QH/AfgB7wHsAf8B9wHtAeoB/wHyAe0B6gH/AecB5gHnAf8D9QH/A8YB/wNZAcMIAAMO
+ ARMDXwHgATABxAFLAf8BRwFqAUEB+QM4AV4oAAMpAT8BRAFSAWkB9wFhAZoBrgH/A1sB0ANCAXUDBgEI
+ KAADnwH9AfoC8wH/AeoC4gH/AekC4QH/AekC4QH/AegC3wH/AecC3gH/AeYC3gH/AeYC3QH/AeQC2wH/
+ AeQC2gH/AeIC1wH/AfUC6wH/AZ4CnAH9BAADcwH2AfwC+wH/Ae4B7AHqAf8BuwHMAdoB/wGTAbMBywH/
+ AZgBtQHLAf8BlgG1AcsB/wGVAbQBygH/AZUBswHJAf8BlAGzAckB/wGOAa4BxwH/AakBugHIAf8B3gLc
+ Af8B7gLtAf8DvQH/A1YBwQgAA0ABcQE7AZoBNgH/AUkB6QGSAf8BPQHSAWUB/wFMAV8BTAHzAy4BRygA
+ A1EBogFuAcQB3wH/AZsB5AHyAf8BIgGKAa0B/wNMAZEDAgEDJAABnwKeAv0C9gH/AfUC7QH/AfMC7AH/
+ AfMC7AH/AfIC6gH/AfEC6QH/AfEC6QH/AfAC6AH/Ae8C5gH/Ae8C5QH/Ae0C4wH/AfgC7gH/A5wB/QQA
+ A3MB9gL/Af4B/wHtAeQB5wH/AUkBswHYAf8BAQHLAesB/wEPAdAB7QH/ARIB0QHuAf8BEgHUAfEB/wET
+ AdIB7gH/ARUB0gHuAf8BDAHPAe4B/wE2AaQBzAH/AdUBzwHTAf8B9gHyAfAB/wPAAf8DVgHBBAADBQEH
+ AVYBWAFWAbwBTAHPAWsB/wFtAegBqwH/AV4B6AGjAf8BQgHOAWUB/wFZAWABWQHrAyQBNSQAAzEBTgEO
+ AW4BpQH/AZcB5gH5Af8BhgHoAfUB/wFAAVUBjwH9AyIBMiQAA6AB/QH7AvcB/wHeAtoB/wHeAtkB/wHf
+ AtoB/wHeAtkB/wHdAtkB/wHdAtkB/wHdAtgB/wHcAtYB/wHbAtYB/wHaAtQB/wH4AvEB/wGeAp0B/QQA
+ A3UB9gT/AeoB5AHmAf8BTgG7AeEB/wEhAdwC/wEmAd0C/wEOAdMB/QH/AQkB0AH3Af8BDAHUAfwB/wEM
+ Ad0C/wEFAd0C/wE0Aa4B2AH/AdUBzwHTAf8B9wHzAfEB/wPBAf8DVgHBBAADLgFIAUMBfwE8Af4BiQHu
+ AbUB/wGWAfMBxQH/AYoB6wG4Af8BagHsAa8B/wFBAcwBYwH/AVcBXAFXAd8DGgEkIAADCAELA1MBrQEf
+ AaEBzAH/AZ0B0wHdAf8BqgHiAfAB/wNUAaskAAOoAf0B0gLRAf8BHwIeAf8CEwESAf8BFwEWARUB/wET
+ ARIBEwH/ARYCFQH/ARgCFQH/AxgB/wEWAhcB/wEPARIBEwH/AxsB/wHLAsoB/wOoAf0EAAN1AfYE/wHp
+ AecB6QH/AV0BtwHhAf8BXAHQAf4B/wFcAdUC/wE7AakB3AH/AUABXgGHAf8BEwGfAdoB/wEAAcEC/wEA
+ AbwC/wExAaUB1wH/AdgB1AHWAf8B+AH0AfIB/wLCAcMB/wNWAcEDAgEDA1ABmgFdAc4BggH/AaEB+gHR
+ Af8BTQHNAWcB/wFpAeYBpQH/AZUB8wHIAf8BbQHyAbgB/wFAAcgBXgH/AVsBXgFbAdADFAEcIAADEgEY
+ A1YBswFhAcYB4QH/AfAD/wGOAZoBogH/AzMBUgMPARQcAAOoAf0BxgLIAf8DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AbwCvQH/A6gB/QQAA3UB9gT/AekB6AHrAf8BYAG5AeEB/wFq
+ AdUB/gH/AWwB3QL/AWIBrAHKAf8BXAFJAUUB/wEzAZ0ByQH/AQABuAL/AQABrwL/ATIBogHXAf8B2gHV
+ AdYB/wH6AfYB9AH/AcQCxQH/A1YBwQMcAScBUQF9AUYB9wGYAfwByQH/AV4BqgFzAf4BWgFhAVoB5AFC
+ AWwBQgH1AV0B4wGYAf8BkQH5AcwB/wFtAfcBwQH/ATwBwwFVAf8BVQFXAVUBtwMKAQ0gAAMKAQ4DTwGl
+ AY0BvgHPAf8BmAHHAeAB/wFCAVwBbwH1AVgCXAHRAxoBJRgAA6gB/QHKAc8B0AH/AQcBDwEQAf8DAAH/
+ ATQBNwEwAf8BvQG2AZYB/wESASQBIAH/ARsBIQEYAf8BIgEeARMB/wMAAf8BXgEsAQsB/wMAAf8BwgK/
+ Af8DqAH9BAADdQH2BP8B5gHnAesB/wFmAbsB4gH/AZcB5AL/AZYB6AL/AZABxwHdAf8BiwGSAZMB/wFd
+ AbwB3gH/ARgBxQL/ARABwAL/ATgBpgHYAf8B1wHUAdcB/wH7AfcB9QH/A8YB/wNWAcEDRwGCAUsB0AFr
+ Af8BUAHVAXAB/wFYAVoBWAHAAwABAQMtAUUBXQFhAV0B4gFCAcsBXgH/AYEB+QHGAf8BawH+AcoB/wE1
+ AcABTgH/A1IBqQMEAQUgAAMKAQ4DVwHFAUMBlAG7Af8BQQGYAbsB/wEiAScBLAH/A1ABnwMAAQEUAAOo
+ Af0B0QLMAf8BuAGYAVsB/wFhAWIBTAH/AbYCuAX/AUoCVAH/AVoBUwE4Af8BYAFfAUcB/wEzAScBEgH/
+ Ac4BYwEiAf8BPwEXAQMB/wHJAb4BvQH/A6gB/QQAA3cB9gT/AfEB8AHxAf8BgwG5AdoB/wFeAbcB3gH/
+ AWIBuAHeAf8BYgG/AecB/wFwAcsB8wH/AVMBuwHoAf8BPgGuAeAB/wE0AaoB3AH/AVsBqgHRAf8B4QHf
+ AeAB/wH6AfcB9gH/A8gB/wNWAcEBWAFiAVgB6QE1AdABUwH/AVkBWwFZAcQDDQESCAADHAEoAVQBVgFU
+ AasBKwG0ATcB/wFfAfIBswH/AWMB/wHQAf8BMAG7AUQB/wNLAY4kAAI+AT8BbAGAAXABbQH/AZMBGQEP
+ Af8BFAIAAf8BIwEBAQAB/wNAAXAUAAGmAqgB/QHRAcwBygH/AdcBrwFpAf8B/AHhAa4B/wH2AvcB/wH7
+ Af4C/wHkAdcBxQH/AcsBrwFtAf8BjwFrAUkB/wHMAZIBPQL/AZEBLwH/AckBPQEFAf8BygG9AbsB/wGl
+ AqgB/QQAA3cB9gT/AfsB+gH5Af8B5gHqAe4B/wGfAacBsQH/AaIBpwGuAf8BnwGnAa8B/wHAAcwB1wH/
+ AbABtQG9Af8BrgGtAbMB/wGfAaEBqAH/Ad4B3wHjAf8B7gLtAf8D9QH/A8kB/wNWAcEBPwFrATkB9gFZ
+ AVwBWQHPAxQBGxAAAwQBBQE9AT4BPQFqAT8BbgE7AfYBSgHoAZYB/wFaAf8B0gH/ASkBuAE6Af8BRQFG
+ AUUBfiAAAwEBAgNHAYIBvgFXAT0B/wFpARABDAH/AQ8CAAH/AUcBKwEmAfkBLAIrAUMQAAGnAqgB/QHQ
+ AcoByQH/Ac0BoQFbAv8B3AGdAf8B/QHlAcEB/wH2AeMBzQH/Af4B4AGuAv8B2gGaAf8B+QHAAWcB/wH8
+ AacBRAL/AYABJAH/AdABOgEAAf8ByQG8AboB/wGkAqgB/QQAA3cB9gT/A/cD/wH+Af8B2wHWAdQB/wG7
+ AbUBsgH/AckBwgHAAf8BuwG1AbIB/wHMAccBxAH/AbsBtQGyAf8B0AHLAcgB/wH3AfUB9AH/AuoB6QH/
+ A/YB/wPLAf8DVgHBAxgBIQMRARccAAMkATYBWgFeAVoB1QEzAdQBXwH/AVYB/AG+Af8BJQG3ATcB/wM8
+ AWYgAAMCAQMDUwGqAcYBZgFMAf8BRQEFAQIB/wEWAgAB/wFdAlkB1wMYASEMAAGnAqgB/QHPAcoByAH/
+ Ac0BlwFJAv8BywGFAv8BzgGOAv8BzwGQAv8BzQGNAv8BxAFvAv8BtgFUAf8B/AGWATcB/wH6AWABGAH/
+ AcgBKwEAAf8ByAG6AbkB/wGlAqgB/QQAA3cB9gT/A/kB/wP6Af8B+QL6Af8DywH/AbgCtgH/AcECvwH/
+ AbgCtgH/A8QB/wHwAvEB/wHuAu8B/wPrAf8D+QH/A80B/wNWAcEoAAMQARUBTwFQAU8BmwEgAb4BOAH/
+ AUwB9QGkAf8BOgGoAUAB/QMxAU4gAAMQARYBXAJZAcwBuQFZATsB/wEmAgAB/wEqAQMBAAH/AVECUAGf
+ DAABpwKoAf0BzQHFAcQB/wHQAYIBKgL/AbkBTwL/Ab8BYAL/AcEBYwL/AbwBWgL/AbABSQL/AZgBMwH/
+ Af0BaQEcAv8BRAEAAf8BzQEWAQAB/wHGAbYBtQH/AaUCqAH9BAADeQH2BP8D+wH/A/kB/wP6Af8B+gL7
+ Af8D5QH/A9UB/wPhAf8D9AH/A/EB/wPtAf8D6wH/A/cB/wPPAf8DVwHCMAABOQE6ATkBYAFYAV8BWAHj
+ ATUB3QFaAf8BVAFoAVUB7SQAAx0BKgFiAlgB6QGfAUQBIgH/ARECAAH/AUYBBAEAAf8DNwFbCAADqAH9
+ AdQCywH/AZgBTgEnAf8BtAFtATYB/wGzAYMBPwH/AbQBhgFAAf8BswGCAT0B/wGzAWkBNQH/AbMBWwEt
+ Af8BswFJASEB/wG1ATQBEQH/AZcBIAEPAf8BywG/Ab4B/wGnAqgB/QQAA4gB+CD/A/0B/wP8Af8D+gH/
+ A/kF/wPTAf8DVwHCNAADHQEpAVcBWgFXAcUBTQFmAU0B7ygAAyoBQAF5AUkBSAH2AYABMQEUAf8BDgIA
+ Af8BYAFYAVcB6wgAAaMCpAX/AdsB3AHgAf8C2AHeAf8C2QHdAf8B2AHZAd0B/wHYAdkB3gH/AdgB2QHe
+ Af8B2AHaAd4B/wHYAdsB3wH/AdcB3AHgAf8B2QHcAd8C/wL8Af8DogH/BAADWwHLA6UB/gOxAf0DsQH9
+ A7EB/QOxAf0DsQH9A7EB/QOxAf0DsQH9A7EB/QOxAf0DsgH9A60B/gNqAfUDOwFlbAADOwFkAXUBSAE/
+ AfYBWQFCAT4B9QFSAlEBpwgAA14B3QNlAe8DZwHtA2cB7QNnAe0DZwHtA2cB7QFmAmcB7QNmAe0DZgHt
+ A2YB7QNjAe4DZAHvA18B4JMAAQEDBAEFAxABFgMpAT8DPgFsA0YBgANEAXsDOAFcAyABLgMKAQ0DAQEC
+ DAABWgJdAdMBTAFyAYAB8wFXAWYBbgHvAVcBZgFuAe8BVwFmAW4B7wFXAWYBbgHvAVcBZgFuAe8BVwFm
+ AW4B7wFXAWYBbgHvAVcBZgFuAe8BVwFmAW4B7wFXAWYBbgHvAVcBcgF7AfIBWwJeAdkLAAEBAwYBCAMK
+ AQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DBwEKAwMBBAsAAQEDBgEIAwoBDQMK
+ AQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DBwEKAwMBBBMAAQEDBwEJAxUBHQM5AV8DUwGwAlgBYQHm
+ AV8BjAGUAfsBUwGoAbEB/QFOAV0BXwHwA1kB0gNSAakDRgGAAyQBNgMEAQYIAAEvAaAB0gH/ASUB+wL/
+ ARsB8QL/AR4B8AL/AR8B8AL/AR8B8QL/AR8B8QL/AR8B8QL/AR8B8QL/AR8B8AL/AR8B8AL/AR0B8AL/
+ ASMB+wL/ATMBrAHYAf8EAAMEAQUDJAE2A0QBeQNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGL
+ A0oBiwNKAYsDRwGCAzMBUgMLAQ8DBAEFAyQBNgNEAXkDSgGLA0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGL
+ A0oBiwNFAX8DKQE/AwMBBAgAAwQBBQMkATYDRAF6Al4BYQHaAVkBdgGDAfwBrwHVAeMB/wHEAfIB/QH/
+ AbcB8AL/AaoB/gL/AZ8B/QH+Af8BiAHaAeUB/wFaAX8BmwH+AUUBUgFlAfQDVgG5AzUBVwMLAQ8EAAEs
+ AXkBqwH8ARUB4gL/AQwB2QL/AQ4B2AL/AQ0B1wL/AQ8B3wL/ARAB5QL/ARAB5QL/ARAB4AL/AQ4B2QL/
+ AQ8B2QL/AQwB2QL/ARMB4wL/AS4BfAGvAfwEAAMdASoBtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3
+ AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/
+ AbUBNwEAAf8BtQE3AQAB/wNSAakDNQFYAx0BKgG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/
+ AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DSwGO
+ AxQBGwMAAQEEAAMdASoBtQE3AQAB/wHzAU8BAAH/AZUBvwHTAf8B7wP/AdQB+wL/AakB5gL/AZIB2QL/
+ AY4B6wL/AY0B8wL/AZ0B/QL/AasD/wFlAcQB1wH/AVsBGgEAAf8DUwGtAzUBWAQAAS4BeQGrAfwBLwHg
+ Av8BIgHVAv8BFgHTAv8BCwHQAv8BAAGeAfYB/wEAAYkB5gH/AQABigHlAf8BAAGaAfMB/wEFAckC/wEG
+ AcwC/wEDAckC/wEJAdQC/wEsAXsBrwH8BAABtQE3AQAC/wFlAQMB/wG1ATcBAAL/AagBTwL/AacBTgL/
+ AaYBTAL/AaQBSQL/AaIBRQL/AaABQQL/AZ0BPAL/AZsBOAL/AZsBOAH/AeUBPgEUAv8BmwE4Af8BtQE3
+ AQAB/wNIAYgBtQE3AQAB/wG1ATcBAAL/AWsBCAL/Aa8BWwL/AaUBSgL/AaQBSAL/AaMBRgL/AaABQgL/
+ AZ8BQAL/AZ0BPAL/AZsBOAH/AbUBNwEAAf8DVAGvAzYBWQMbASYEAAG1ATcBAAL/AWUBAwH/AfsBaQEI
+ Af8BmAHDAdgB/wHZA/8BqwHmAv8BhgHTAv8BZQHKAv8BagHdAv8BZwHiAv8BgQHoAv8BkQH3Av8BXQHC
+ AdsB/wFmATgBEgH/AekBSwEAAf8DSAGIBAABLgF4AawB/AFBAeAC/wE0AdYC/wElAdQC/wEXAdsC/wEA
+ AYAB4wH/AgABaQH/AgABYwH/AQABXwHcAf8BAAHHAv8BAAG+Av8BAAG7Av8BAAHGAv8BKwF6Aa8B/AQA
+ AbUBNwEAAv8BbwERAf8BtQE3AQAC/wGyAWIC/wGxAWEC/wGxAWAC/wGvAVwC/wGrAVYC/wGoAVAC/wGn
+ AU0C/wGkAUgC/wGiAUQB/wHlAUEBGQL/AaIBRAH/AbUBNwEAAf8DSwGQAbUBNwEAAv8BZgEBAf8BtQE3
+ AQAB/wG1ATcBAAL/Aa8BWwL/Aa4BWQL/Aa0BVwL/AaoBUgL/AagBTgL/AaUBSgL/AaMBRgH/AeUBQgEb
+ Af8BtQE3AQAB/wNMAZEDFAEbBAABtQE3AQAC/wFvAREB/wH7AWkBCAH/AYkBvwHbAf8BuQHwAv8BjAHW
+ Av8BVwHEAv8BSAG8Av8BVAHPAv8BUQHTAv8BXAHaAv8BawHnAv8BTAG4Ad0B/wFmATsBFwH/AekBSwEA
+ Af8DSwGQBAABLgF4AawB/AFMAd8C/wFEAdgC/wEzAdMC/wEnAdwC/wEIAa8B8wH/AQABAwFSAf8CAAFH
+ Af8BAAGVAeoB/wEAAbsC/wEAAbAC/wEAAa4C/wEAAbkC/wErAXkBrwH8BAABtQE3AQAC/wGIASMB/wG1
+ ATcBAAL/Ab4BhwL/Ab4BhgL/AbwBgwL/AboBbwL/AbcBagL/AbMBYwL/AbABXQL/Aa0BWAL/AaoBUwH/
+ AeUBRQEgAv8BqQFQAf8BtQE3AQAB/wNLAZABtQE3AQAC/wGSASsC/wFwAQ4B/wG1ATcBAAL/AboBbwL/
+ AbgBagL/AbYBaAL/AbQBZAL/AbABXQL/Aa8BWwL/Aa0BVwH/AeUBRwEkAf8BtQE3AQAB/wNUAa8DNQFY
+ AwMBBAG1ATcBAAL/AYgBIwH/AfsBaQEIAf8BZQG3Ad4B/wGXAd8C/wFaAcUC/wEvAbAC/wEwAa8C/wFH
+ AcQC/wEzAcAC/wFDAcoC/wFTAdcC/wE8AbAB4AH/AWYBPwEdAf8B6QFLAQAB/wNLAZAEAAEwAXgBrAH8
+ AWAB4wL/AVgB3AL/AUcB2QL/ATYB4AL/AQABZwG3Af8CAAEQAf8CAAEMAf8BAAFUAaoB/wEAAb0C/wEA
+ AbMC/wEAAbAC/wECAbsC/wErAXoBrwH8BAABtQE3AQAC/wGVATcB/wG1ATcBAAL/AcgBmgL/AcgBmAL/
+ AcYBlgL/AcQBkAL/AcABiwL/Ab0BhAL/AbkBbgL/AbYBZwL/AbIBYgH/AeUBSQEnAv8BsAFdAf8BtQE3
+ AQAB/wNLAZABtQE3AQAC/wGfAUAC/wGfAUAC/wFnAQIB/wG1ATcBAAL/AcMBjgL/AcABiQL/Ab4BhAL/
+ AboBbwL/AbgBagL/AbUBZgH/AeUBSQEnAv8BsAFdAf8BtQE3AQAB/wNMAZEDEwEaAbUBNwEAAv8BlQE3
+ Af8B/AFqAQgB/wFOAa4B4AH/AWUBzQL/AUgBvAL/AUkBvgL/AVcByAL/AWsB1QL/AVcBywL/AUABwgL/
+ ATsBxgL/ASYBpgHiAf8BbAFGASUB/wHrAUwBAAH/A0sBkAQAATQBeQGtAfwBigHqAv8BgAHiAv8BXwHe
+ Av8BUQHlAv8BEwGZAc8B/wEAAQsBIAH/AQABBgEaAf8BAAGJAcMB/wEXAcUC/wEYAbsC/wEUAbkC/wEb
+ AcMC/wExAXsBsAH8BAABtQE3AQAC/wGhAUwB/wG1ATcBAAL/AdMBrAL/AdMBrQL/AdEBqQL/Ac4BpAL/
+ AcsBngL/AccBlQL/AcQBkAL/AcABigL/Ab0BhAH/AeUBTgEvAv8BugFvAf8BtQE3AQAB/wNLAY8BtQE3
+ AQAC/wGrAVQC/wGrAVQC/wGTAS0B/wG1ATcBAAL/Ac4BoAL/AcwBnAL/AckBlwL/AcUBkgL/AcIBiwL/
+ Ab8BhwH/AeUBUAE0Av8BugFvAf8BtQE3AQAB/wNUAa8DNQFYAbUBNwEAAv8BoQFMAf8B/gFrAQgB/wFJ
+ AaoB4QH/AZQB3gL/AZkB4wL/AZAB4gH+Af8BYAHJAfsB/wFnAdAB+wH/AYsB3QH9Af8BmgHiAv8BjQHd
+ Av8BOwGoAeIB/wGmAWoBQwH/AfEBTgEAAf8DSwGPBAABPwGgAdIB/wGjAfgC/wGZAe4C/wGGAeoC/wFq
+ AegC/wFXAecC/wEwAcYB7gH/ASQBwgHsAf8BMQHdAv8BOgHQAv8BMwHIAv8BMwHJAv8BQwHYAv8BPAGn
+ AdgB/wQAAbUBNwEAAv8BrgFiAf8BtQE3AQAC/wHcAb4C/wHcAb4C/wHaAbkC/wHYAbUC/wHVAa8C/wHR
+ AakC/wHOAaIC/wHKAZoC/wHIAZcB/wHlAVMBOgL/AcMBjgH/AbUBNwEAAf8DRAF8AbUBNwEAAv8BuAFq
+ Av8BuAFqAv8BuAFqAv8BiAEbAf8BtQE3AQAC/wHVAa0C/wHSAagC/wHQAaMC/wHNAZ4C/wHKAZkB/wHl
+ AVYBPQL/AcUBkgL/AcUBkgH/AbUBNwEAAf8DQgF1AbUBNwEAAv8BrgFiAv8BawEIAf8BbAGjAbwB/wE+
+ AZ0BzgH/AVwBvQHoAf8BlwHaAfgB/wGPAcoB7QH/AZYB0wH0Af8BkQHUAfUB/wFZAboB5wH/ATQBlgHK
+ Af8BPgFZAY0B/wHsAbQBgwH/AfUBUAEAAf8DRAF8BAABWQJcAcwBXAF+AZYB+AFPAW8BfgHzAUwBbwF+
+ AfMBTAFvAX4B8wFNAW8BfgHzAU8BcAF+AfMBTQFwAX4B8wFTAW4BdwHxAVEBgAGMAfcBUgGqAdQB/wFY
+ AYgBtQH+AVcBfQGWAfgBWQJdAdIEAAG1ATcBAAL/AbsBiAH/AbUBNwEALf8BtQE3AQAB/wMlATcBtQE3
+ AQAC/wHEAZAC/wHEAZAC/wHEAZAC/wGqAVIB/wG1ATcBAAL/AfYB7B3/AbUBNwEAAf8DLgFHAbUBNwEA
+ Av8BuwGIAv8BawEIBf8D/gH/Ab4B2AHrAf8BUQGnAdUB/wFTAbAB3AH/AVYBtAHeAf8BQAGYAccB/wGZ
+ AbkB0AH/AfAB8QHyAf8D/AH/A/4B/wH2AVABAAH/AyUBNwQAAxABFQMcASgDGgEkAxkBIwMaASUDGwEm
+ AxsBJgMbASYDEgEYA0gBhQG7AacBqAH/A2UB5QMuAUcDDQERBAABtQE3AQAC/wHJAZ8C/wGyAWcB/wG1
+ ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEA
+ Af8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DKgFAAwQBBQG1ATcBAAL/AdIBqAL/Ac4BoAL/AdIBqAL/
+ AdIBqAL/AZkBNgH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/
+ AbUBNwEAAf8BtQE3AQAB/wNAAXEDBwEKAbUBNwEAAv8ByQGfAv8BsgFnAv8BawEIAv8BawEIAv8BawEI
+ Af8B/gFrAQgB/wH+AWsBCAH/AfwBagEIAf8B/QFqAQgB/wH+AWsBCAL/AWsBCAL/AWsBCAL/AWsBCAH/
+ AyoBQAMEAQUoAANIAYQB0wHAAb0B/wNhAdoDFQEdCAABtQE3AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHW
+ AbUC/wHVAbMC/wHVAbMV/wG1ATcBAAH/AyoBQAMEAQUEAAG1ATcBAAL/Ad4BvgL/Ad4BvgL/Ad0BuwL/
+ Ad4BvgL/Ad0BuwL/Ad0BuxH/AbUBNwEAAf8DKwFCAwcBCgMAAQEEAAG1ATcBAAL/AdUBtQL/AdUBtQL/
+ AdUBtAL/AdYBtQL/AdUBswL/AdUBsxX/AbUBNwEAAf8DKgFAAwQBBRAAA0ABbgNYAbwDTgGYAxMBGggA
+ AwgBCwNaAcUB3wHPAdAB/wNYAbwMAAG1ATcBAAL/AeABxwL/AeABxwL/AeABxwL/AeABxwL/AeABxwX/
+ AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wMdASoDBAEFAwIBAwQAAbUBNwEA
+ Av8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNBf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8BtQE3
+ AQAB/wMdASoDBAEFDAABtQE3AQAC/wHgAccC/wHgAccC/wHgAccC/wHgAccC/wHgAccF/wG1ATcBAAH/
+ AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DHQEqAwQBBQMCAQMQAAM2AVgBjQKFAfsBuAKk
+ Af8DVgG2AyABLwMdASoDUgGnAc4BvgG/Af8BkgKDAfwDNwFaDAABtQE3AQAV/wG1ATcBAAH/AysBQgMH
+ AQoDAwEEAwMBBAMCAQMDAAEBDAABtQE3AQAV/wG1ATcBAAH/AysBQgMHAQoDAwEEAwIBAwMAAQEQAAG1
+ ATcBABX/AbUBNwEAAf8DKwFCAwcBCgMDAQQDAwEEAwIBAwMAAQEcAANGAX8BsgKlAf8BxwK2Af8BhwJ/
+ Af4BpAKWAf0B1ALEAf8BwwK5Af8DTAGPEAADAQECAbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEA
+ Af8BtQE3AQAB/wMdASoDBAEFAwIBAxwAAwEBAgG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/
+ AbUBNwEAAf8DHQEqAwQBBSAAAwEBAgG1ATcBAAH/AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEA
+ Af8DHQEqAwQBBQMCAQMvAAEBAzcBWgNbAcsBcAJuAfEBcgJvAfIDXgHQAzsBZQMBAQIQAAMKAQ4DHwEs
+ AyUBNwMtAUYDOQFfA0IBdANIAYgDTgGXA1IBpgNWAbMDVwG9A0EBcxQAAx0BKQJaAVwBzQJBAY4B+QM9
+ AWkYAAM3AVsCQgGAAfUCXgFhAdoDJQE3EAADCAELAzcBWgFcAlkByQFwAUoBQQH0AYkBSAEnAfoBhwFF
+ AScB+gFvAUIBQAH1AV0CWgHTAT8CPgFsAw0BEigAAwoBDgM2AVkDVQGxA1QBrgM0AVUDDAEQDAACWQFd
+ AdIBNwFiAXEB9gE9AWsBfwH4ASIBbQGSAfsBJAF/AakB/gEbAZ0B0wH/ASABpgHeAf8BIwGxAecB/wEk
+ AboB7QH/ASIBxgH1Af8BHwGsAfQB/wEjATIBeQH8A1QBrwMRARcIAAMeASsCWQFcAcwCHwHxAf8CCwH7
+ Af8CJQGXAfsDPgFrEAADNwFbAj8BfQH2AkAB9wH/AlIB9QH/AlkBXQHXAyYBOAgAAxkBIwNWAbMBvQE+
+ AREB/wHQAVMBEQH/AcsBRAEAAf8BwQE2AQAB/wG+ATsBAAH/AcIBQgEAAf8BwQE+AQAB/wGyASkBAAH/
+ A1sByAMgAS8cAAMdASoDSAGIA1gB3QF9ATUBRwH8AeQBagGPAf8BzAFvAYIB/wFsAk0B+gNTAaoMAAFB
+ AY0BrQH5AaED/wGlA/8BngP/AZkD/wGMA/8BbAP/AVoD/wFHAfwC/wExAfkC/wEnAd8B/QH/ARgBqwL/
+ AQABRAHOAf8DWgHYAyoBQQQAAlwBYAHUAicB8wH/AgAB+gH/AgAB7AH/AgEB8QH/AiEBmQH7Az4BawgA
+ AzYBWQI7AX0B9gIrAe8B/wIsAewB/wI9AfYB/wJiAfcB/wJXAV4B3wQAAxgBIgFgAlsB1gHXAV0BIAH/
+ AdgBVgELAf8BwAE4AQAB/wHIAVQBGgH/AdgBkAFVAf8BugFCAQkB/wGnASkBAAH/AaoBMAEAAf8BuAE7
+ AQAB/wHCATwBAAH/AWUBXgFdAeUDIwEzDAADBgEIAzsBZANXAcIBXwJMAfMBuAFCAVkB/wHkAWUBjwH/
+ Ae0BjwGpAf8B9wGJAaEC/wGgAaYB/wH3AaQBqAH/A1oB3gwAAVQBZwFyAe4BxAP/AcQD/wGzA/8BqQP/
+ AZwD/wGKAfsC/wFoAfYC/wFWAfEC/wFEAfAC/wExAdsB9wH/ARYBrgH7Af8BAAGpAv8BAAFtAecB/wNa
+ AdMDCQEMAlUBcgHyAiEC/wIAAfgB/wIAAesB/wIAAecB/wIAAesB/wI6AZEB+AI5AToBYAMyAVECQgF7
+ AfQCGgHpAf8CIAHmAf8CLQHqAf8CNwH0Af8CaAL/AlEBigH3AwcBCgFVAlMBrQHcAWQBJgH/AdoBVgEH
+ Af8BxAE3AQAB/wHEATgBAAH/AesBywGzAf8B+AH/Af4B/wHjAa0BjAH/Aa4BJAEAAf8BrAEuAQAB/wGl
+ ASoBAAH/Aa8BMwEAAf8BwQE7AQAB/wFcAloBzQMPARQEAAMJAQwDWQHHAYEBRgFWAf4BzQFTAWcB/wHk
+ AYMBmAH/AecBpwG1Af8B4AHHAcsB/wHaAckBzAH/AeoBhQGaAv8BkwGaAf8B9wGcAaAB/wNbAdkMAAFc
+ AWQBaQHnAcID/wHHA/8BtwP/Aa4D/wGkA/8BmQH+Av8BiAH7Av8BZgH2Av8BVAHxAv8BQgHtAv8BLwHk
+ Av8BHAHsAv8BHAHcAv8CWQFkAewDFgEfAzEBTgJVAXUB8gIWAfoB/wIAAfEB/wIAAeUB/wIAAd8B/wIA
+ AeMB/wIZAbIB/QIhAZQB+wIHAeMB/wISAd8B/wIfAeQB/wItAe4B/wJRAfkB/wJSAXwB9AM4AV4DLQFF
+ AcQBTgEdAf8B6AFmARcB/wHPAUABAAH/AcsBQAEAAf8BxgE5AQAB/wHfAZ8BaQH/Ae8B3wHQAf8B1QGF
+ AUcB/wG0ASwBAAH/AbEBMgEAAf8BrAEvAQAB/wGlASoBAAH/AbcBOgEAAf8BsgEpAQAB/wE+Aj0BagQA
+ Ax0BKgGBAVEBUgH3AeYBlQGkAf8B5QG/AcUB/wHlAdoB2wH/AeQB4wHhAf8B5QHkAeEB/wHhAdIB1QH/
+ AesBhQGZAv8BlQGbAf8B9QGXAZwB/wNbAdkMAAFaAmAB3gHIA/8B0gP/AcED/wG4A/8BrgP/AaUD/wGZ
+ A/8BiAH7Av8BZgH2Av8BVAHxAv8BQwHuAv8BMAHvAv8BIwHiAv8BSwFMAWwB8wMhATEEAAMvAUoCUwFy
+ AfECDwH1Af8CAAHqAf8CAAHfAf8CAAHXAf8CAAHbAf8CAAHcAf8CBAHXAf8CEwHeAf8CIAHnAf8CPwH0
+ Af8CSAF9AfYDNgFZBAADVAGvAeYBbgErAf8B4gFRAQAB/wHVAUUBAAH/AdIBRgEAAf8ByAE1AQAB/wHO
+ AVcBGgH/AeUBsAGJAf8BvgEzAQAB/wG5ATUBAAH/AbUBNQEAAf8BsgEyAQAB/wGsAS4BAAH/AaoBLwEA
+ Af8BwAE9AQAB/wFdAlkB0gQAAxoBJQFsAUcBWQH1Ae0B0wHXAf8B9AH6AfcB/wH1AfQB8wH/AfgC9QH/
+ AvoB+QH/AfMB5gHqAf8B6wGEAZgB/wH+AZQBmgH/AfYBlgGbAf8DWwHZDAABWQJdAdIBzAP/AdoD/wHJ
+ A/8BwQP/AbgD/wGvA/8BpAP/AZkD/wGIAfsC/wFmAfYC/wFVAfEC/wFCAfAC/wEzAe4C/wE8AVwBfgH4
+ Ay4BSAgAAzABTAJPAXUB8gIJAfAB/wIAAeAB/wIAAdUB/wIAAcwB/wIAAcwB/wIAAdQB/wIRAd8B/wIu
+ Ae4B/wJHAX0B9gM3AVsIAAFkAlcB6AHzAYMBJwH/AeABSQEAAf8B2QFIAQAB/wHVAUIBAAH/Ac8BOAEA
+ Af8B2QGFAUgB/wH0Ae8B6QH/AckBUQEVAf8BvgEyAQAB/wG7ATcBAAH/AbQBNAEAAf8BsQEyAQAB/wGq
+ AS0BAAH/AcABQAEAAf8BcQE/ATUB9gQAAxoBJQFsAUcBWQL1AdwB4BH/AfkB6wHwAf8B6QGCAZYB/wH+
+ AZMBmQH/AfYBlQGZAf8DWwHZDAABWQJbAcQBzgH8Af4B/wHhA/8B0QP/AcoD/wHBA/8BtwP/Aa4D/wGk
+ A/8BmAP/AYgB+wL/AWcB9QL/AVUB8wL/AUIB9wL/ASsBaQGOAfwDOgFhDAADKgFAAj8BhwH3AgAB5wH/
+ AhsB6AH/AjMB6gH/AjMB6gH/AigB5wH/AhoB5wH/AikBlQH6AjABMQFNDAABeQFSAUYB9AH4AYQBIgH/
+ AeIBRwEAAf8B3wFKAQAB/wHhAWYBJAH/AeEBbwE0Af8B3wGZAWAB/wH3AfgB9gH/AfQB7gHoAf8B3wGm
+ AYMB/wHLAUkBCwH/AcQBPwEAAf8BtgE2AQAB/wGtAS8BAAH/Ab8BPwEAAf8BiQFEASYB+gQAAxoBJQFs
+ AUcBWQH1AfcB3gHiEf8B+QHsAfAB/wHnAYIBlQH/Af0BkwGZAf8B9gGVAZkB/wNbAdkMAANWAbYB0QH4
+ Av8B8gP/AdoD/wHRA/8BygP/AcAD/wG4A/8BrgP/AaQD/wGYAf4C/wGIAfsC/wFnAfcC/wFUAf4C/wEn
+ AX8BqgH+A0YBgAwAAzIBUAIvAYsB+QIzAfQB/wKFAv8CjwL/Ao4C/wKHAf4B/wJIAfUB/wIrAaMB/AM4
+ AV0MAAF5AVIBRgH0AfsBggEeAf8B6AFQAQAB/wHuAZcBUQH/Ae8BqQFvAf8B6wGbAV0B/wHeAY0BTgH/
+ AeIBsAGTAf8B8AHjAdwB/wH8A/8B3gGmAYUB/wHPAUoBDQH/AcoBRgEKAf8BtQEzAQAB/wHBAUIBAAH/
+ AYkBRwEnAfoEAAMaASUBawFFAUwB9QH2Ad4B4RH/AfcB4gHoAf8B6wGBAZMC/wGYAZ4B/wH3AZUBmQH/
+ A1oB2AwAAVICVAGmAdkB+AH7Af8B9gH6AfIB/wHtAf8B/QH/Ad4D/wHQA/8BygP/AcED/wG3A/8BrQP/
+ AaQD/wGYAf4C/wGIAfsC/wFnA/8BIQGoAdoB/wNOAZgIAAM3AVsCPgGHAfcCPAH6Af8CkwL/AqAC/wKW
+ Af0B/wKVAf0B/wKfAv8ClgH+Af8CWwH7Af8CLQGXAfsDPgFrCAABZAJYAeYB/AGSATUB/wH4AaYBXwH/
+ AfYBuwGXAf8B8gGtAYEB/wHqAZsBXAH/AeMBiQFHAf8B4AFuATYB/wHWAXABPwH/AfUB7QHnAf8B8gHk
+ AdoB/wHPAVoBJAH/AdMBUQEWAf8BxwFEAQcB/wHNAU0BBwH/AXABSgFBAfQEAAMaASUBawFGAUwB9QH2
+ Ad8B4wX/Af0B+gH7Af8B+AHgAeMB/wHvAa4BtgH/AeABbAGPAf8B4AFiAYQB/wH9AZIBlgH/AfcBkwGY
+ Af8DWgHVDAACTwFRAZwBNgFLAdsB/wEhASMBwQH/AVcBYgHBAf8B1wLtAf8B3gP/AdID/wHKA/8BwAP/
+ AbcD/wGuA/8BpAP/AZoD/wGMA/8BMAG/AecB/wNUAasEAAM2AVkCQQF7AfYCTQH8Af8CqgL/ArQC/wKw
+ Af0B/wIuAewB/wInAeoB/wKrAf0B/wKzAv8CrAL/AoEB/QH/AjIBmQH7Az4BawQAAVMCUgGoAe8BqQFm
+ Av8B1QGzAf8B+wHAAZgB/wHxAawBgAH/Ad8BpAGCAf8B3QGpAYwB/wHlAZQBVgH/Ad8BhAFAAf8B7AHR
+ AcIB/wH2AfAB7AH/AdIBaAE0Af8B0gFZAR8B/wHYAVYBGgH/AeMBVgEUAf8BXgJcAc4EAAMaASUBawFH
+ AVkB9QHtAcsBzwH/Ae8BxgHIAf8B4AGLAZIB/wHNAVgBZwH/AaoBRAFgAf8BZgE7AWUB/wE+AS8BXwH/
+ AZMBPgFXAf8B6AFgAWwB/wFnAU4BUQHyAzkBXwMGAQgEAAJYAV8B4wERARAB8wH/AgAB4wH/AgABwgH/
+ AWQBbwHEAf8B7AH9AfsB/wHfA/8B1wP/AdED/wHJA/8BwgP/AbkD/wGuA/8BpQP/AUMB2QHyAf8DWAHA
+ AzcBWgJMAXcB9AJYAf0B/wK7Av8CyAL/AsQC/wI+AfQB/wIfAZIB+wI0AYQB+AI9AfEB/wLBAv8CxgL/
+ Ar8C/wKUAf4B/wJEAZIB+AI9AT4BagMpAT4BygFpATsC/wHZAbQC/wHLAaYB/wHpAaUBawH/AekBzwHB
+ Af8B9gH1AfQB/wHWAYgBTQH/AdsBiAFMAf8B9wHxAe0B/wHnAcoBuQH/AdMBYgErAf8B1wFlAS8B/wHu
+ AWsBKQH/Ac8BQgEOAf8DOwFjBAADGgElAWcCUgH0Ac0BWwFhAf8BrwFHAVcB/wGBAT8BYQH/AT4BPQGB
+ Af8BEQE3AYUB/wEAATUBhgH/AQgBRwGWAf8BMAGGAbYB/wGYAaoBvwH/AccBhwGeAf8BXwEvAUYB+wNA
+ AXAEAAIrAbEB/AEjASQB8gH/AjUB6wH/AgAB3gH/AToBPgHKAf8B9AH/AfQB/wHsA/8B0QP/AbgD/wGZ
+ AfUC/wFrAeoB/AH/AVAB2gH2Af8BQAGzAcUB/QEyAZIBswH7ATsBaAGJAfYDSgGLAkgBcwH2Al8C/wLU
+ Av8C3wL/AtMC/wJOAfcB/wJAAXcB9AMzAVMDLQFFAkoBdQHyAlMB9AH/AtIC/wLZAv8C1gL/AqoC/wJD
+ AZUB+wMGAQgBUgJQAaMB6AGoAWsC/wHcAbgB/wH1Ab4BlQH/Ad4BqwGOAf8B8AHmAeMB/wHlAcoBuwH/
+ AewB2QHRAf8B6gHaAdIB/wHUAYcBTwH/Ad0BgQE/Af8B7QGKAUEB/wHsAWcBJwH/AVsCWQHDAw0BEQQA
+ AxoBJQFZAUQBWQH1AUQBPAFkAf8BFQFAAW4B/wEAAUsBpAH/AQABTgGqAf8BDgFsAbwB/wEzAacB2gH/
+ AVQB0wH1Af8BagHyAv8BgQH7Av8BjwHtAv8CXAF9AfgDLwFKBAACJgGPAfoCCAHuAf8BHwEeAfgB/wEK
+ AQcB6gH/AUABQwGzAf0BZQF3AYMB9AFZAWYBcAHsAV0BYQFiAeIBWQJcAcwDVgGzA1ABnQNFAX0DOQFf
+ AzABSwMgAS4EAAJZAVwByQJMAe0B/wLJAv8C7QL/AloB+wH/AjYBeQH2AzYBWQgAAy8BSgJRAXIB8QJl
+ AfgB/wLrAv8C3gL/AosB8wH/AloBXgHVBAADFgEeAVsCWAHLAekBqAFsAv8B3gG4Af8B9gHBAZoB/wHg
+ AaUBgwH/AeYBuwGkAf8B4gGvAZQB/wHaAY4BVQH/AewBmQFYAf8B+QGgAVkB/wHsAYEBNwH/AWACWgHe
+ Ax8BLQgAA0UBfQFWAZYB0AH+ASIBmgHXAf8BAQFmAcEB/wERAZwB4AH/ATIBvgHuAf8BUQHgAf4B/wFk
+ AfAC/wFpAekC/wFsAakB0gH+AVgBZAFwAe8BVgJYAbkDLwFKCAACTwFQAZsCHgGMAfwBJwElAbkB/gJc
+ AWEB3AEwAjEBTQMYASEDEQEXAwkBDCAAAxYBHwJZAVsBwwJLAesB/wJZAv8COwF3AfYDNwFbEAADMAFM
+ AlMBcgHxAocB/QH/AoQB8gH/AlkBXAHMAx4BKwgAAxYBHgFVAlMBrQHOAW4BPwH/AfQBvAGRAv8ByAGb
+ Af8B/QG9AY4B/wH9AbUBhQL/AbMBgAH/AfQBnQFZAf8B0AFaASkB/wFYAlYBvAMcASgMAAFZAWABbQHr
+ AZYD/wGDAfoC/wEwAWQBoAH6AT4BdAGZAfgBVgHpAv8BTgHFAfYB/wFGAWwBhAH1AlkBWwHEA0ABcQMR
+ ARdUAAMWAR8CWQFbAcMCRQFzAfQCNQE2AVgYAAMwAUsCTgFyAfICWQFcAc8DHQEpEAADBwEJAy8BSgNW
+ AbYBaAFYAVIB7wGYAVEBSgH6AZYBTgFHAfoBcgJTAfEBWwJZAcQDNgFZAwoBDhAAA0MBdwFZAlwBzwFS
+ AYEBnwH3AkgBSQGHAzsBZAFZAl0B1wNLAY4DIQEwUAADOAFeAVgBWQFrAesCVQFXAboDOgFhA1kBxwNZ
+ AcwDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1wBzgNZAcMDNAFVDAADHAEo
+ A1QBqwMzAVI0AAMRARcDOAFdA04BmQNWAbMDVgG8A1YBuwNVAbIDTgGUAzQBVAMMARA8AAM0AVQBTAFY
+ AW4B7wErAdEC/wFTAWsBewHxA2EB7gPiAf8D3QH/A9oB/wPaAf8D2AH/AtsB2gH/At8B2gH/At0B2gH/
+ AtgB1wH/A9UB/wPUAf8D0wH/A+AB/wOZAf8DVwG9CAADGAEhA1sB4QENAYABMgH/AVIBVwFUAe0DKwFD
+ KAADAQECA0MBdwFlAl4B5QGoAWEBRgH9AdEBZAEaAf8B4AFrARsB/wHoAW8BHQH/AegBbQEeAf8B2wFn
+ AR4B/wG6AVIBFAH/AW8BSQElAfoDWwHZAzgBXRQAAyMBMwNHAYIDIAEuAwEBAgMGAQgDDAEQAwMBBAQA
+ AzIBUQFMAVgBcAHvASkBzQL/AUEBhgGeAfkCPAE9AWgDhAH3BP8D9AH/A/MB/wLxAfMB/wL4AfMB/wLx
+ AegB/wLeAd8B/wPeAf8C6QHhAf8C8QHoAf8C7gHqAf8C5gHnAf8D9QH/A8YB/wNZAcMEAAMSARkDWwHh
+ ASEBSwEAAf8BIQGAAVEB/wEAAaYBqAH/AVIBVgFUAe0DLQFGJAABUAJPAZsBrwF/AVIC/gHjAcIC/wHS
+ AaUB/wHoAWQBAAH/AecBbgEbAf8B8AGGASgB/wH2AZIBPwH/AfUBmgFOAf8B8AGYAU8B/wHyAZUBQgH/
+ AdMBXAEMAf8BUgE/ATcB9wM7AWQMAAMEAQYDVwG6AegBuAG6Af8DYQHkA1QBrgNcAckDYAHeA1kBvgM/
+ AW8BWgJcAc0BbAHoAv8BPgF/AZwB+AM9AWkEAANzAfYD+wH/A+oB/wLqAesB/wLxAewB/wLUAdwB/wJE
+ AdQB/wIiAecB/wJAAeQB/wJlAdcB/wKkAc0B/wPQAf8C5QHfAf8D7QH/A70B/wNWAcEDFAEbA1sB2QEj
+ AVABAwH/ATgBTQEMAf8BKgE4AQAB/wETAWsBVAH/AQABngGnAf8BUQJUAe4DLQFGIAABngF2AU0B+gH4
+ AcgBkQH/AfYB2gG5Af8B7wHDAZgB/wHVAWUBEwH/AdYBkwFOAf8B3gGdAVwB/wHgAZoBWQH/AdIBjAFM
+ Af8B4AGTAU8B/wHtAaABWwH/AfUBjwEvAf8BzgFQAQAB/wNWAbsMAAMzAVIBowKNAfsB9gL6Af8BwAG5
+ AboB/wHIAb0BswH/AeoB4QHRAf8B8AHnAdYB/wHaAdIBwwH/AZUBkAGHAf8BoQGeAZAB/wNfAdsDOwFj
+ CAADdQH2A/wB/wLsAe0B/wPuAf8C+AHoAf8CbgHaAf8CAAH5Af8CAAL/AgAC/wISAv8CQQH2Af8CbwHY
+ Af8CxAHOAf8C9QHvAf8DwAH/A1YBwQNYAd0BEAE+AQAB/wE5AUQBCgH/ATwBSwEQAf8BOgFOASgB/wFV
+ AWEBKAH/ASABhQFaAf8BAAGbAawB/wFSAVYBVAHtAy0BRhwAAcUBkQF/Af4B8wHOAaoB/wH0AdsBvgH/
+ AewBxAGfAf8BzgFwAS0B/wHaAaEBYAH/AdwBqQGBAf8B3AGmAXAB/wHZAZcBVQH/Ad0BjQFCAf8B3wGT
+ AUkB/wHfAY0BNwH/AdEBWQEAAf8DWAHACAADAQECA1UBsAH1Ad4B4AH/AcQBxQHGAf8BzQHHAboC/wH2
+ AdwC/wHzAdsC/wHyAdsC/wH4AeEB/wH5Ae0B1gH/AZkBlAGBAf8DRAF6DAADdQH2A/0B/wLtAe4B/wL1
+ AfEB/wLrAeIB/wI/AeEB/wIAAf4B/wIAAv8CAAL/AgAC/wICAv8CNQH9Af8CcAHWAf8D5AH/AscBxAH/
+ A1YBwQNaAdsBIwFAAQAB/wE0ATkBAAH/AToBQAEjAf8CRQFOAf8BVwJlAf8BUQFiASQB/wETAW0BVQH/
+ AQABlAGqAf8BTAFSAU8B7wMuAUgYAAG/AYgBdQH+Af0B6wHZAf8B/QHuAd4B/wHyAdABrQH/AdsBlgFF
+ Af8B2wGmAWUB/wHWAaUBawH/AeIBrwGFAf8B4gGlAWAB/wHcAZABQAH/Ad4BlQFEAf8B2wGLASoB/wHN
+ AVUBAAH/A1YBvggAAzABTAGEAm8B9QHvAeIB5QH/AcIBugG1Af8B+QHnAcoC/wHoAckC/wHhAb8C/wHg
+ Ab8C/wHkAcUC/wH0AdcB/wHQAccBrgH/A1oB2AE2AjUBWAMQARUEAAN1AfYC/gH9Af8C8gHwAf8C+AHy
+ Af8C6AHjAf8CPgHkAf8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CMAHpAf8CywHfAf8CzgHEAf8DVgHB
+ AxABFgNbAdYBLAFNAQkB/wFlAWEBUQH/AU8BTAFPAf8CSQFOAf8BVAFiAWMB/wFKAWEBHwH/ASIBhgFg
+ Af8BAAGMAZ8B/wFRAVQBUwHuAysBQxQAAbsBpwFZAf0B/wHtAdgB/wH8AesB2wH/Af4B5AHJAf8B7wG7
+ AYgB/wHsAbYBgAH/AdQBowFjAf8B1gGsAYMB/wHnAbQBgQH/AfEBqgFVAf8B5gGgAUsB/wHbAY0BLQH/
+ Ac0BVgEAAf8DVgG+BAADBwEKA1UBrQH5AdYB0wH/AecB1QHWAf8B1AHGAbsC/wHfAbYC/wHTAaQC/wHQ
+ AZ4C/wHOAZ0C/wHPAaEC/wHhAbgB/wHkAdABsQH/AZMBhAFwAf8BzAGRAYkB/wFbAlgBywMpAT4DdQH2
+ A/0B/wLtAe8B/wL3AfMB/wLxAeoB/wJjAeUB/wIAAf0B/wIAAv8CAAL/AgAB+wH/AgAB+AH/AgAB9QH/
+ AkMB3wH/A+oB/wLKAcYB/wNWAcEEAAMPARQDWgHVATQBWgEVAf8BZwFoAVIB/wFfAVsBXwH/AVwBWgFk
+ Af8BVwFiAV0B/wEzAVsBAAH/ARYBgAEmAf8BAAGbAWYB/wFSAVcBVQHtAy4BSBAAAbsBpwFYAf0B/wHr
+ AdYB/wH9AewB2gH/Af0B5wHQAf8B4QG7AZMB/wHnAbwBjwH/Ad4BsQGDAf8B0gGyAZIB/wHYAa0BgAH/
+ AeQBmwFEAf8B4AGXAUEB/wHfAYYBHAH/Ac8BVwEAAf8DVgG+BAADLgFHAY4BgQGAAfcB/wHqAd4B/wHn
+ Ac8BzAH/AdIBvwG2Av8BzwGeAf8B/gHLAZgB/wH+Ac0BoAL/AdEBowL/Ac4BnAL/AdUBnwH/Ad0BtwGO
+ Af8BjwGNAYoB/wH6A/8B6gGoAaQB/wFAAj8BbwN3AfYC5wH8Af8CmwHdAf8C2AHpA/8B8QH/Ap0B5gH/
+ Ai8B/AH/AhMC/wIMAfIB/wJrAeEB/wKhAd8B/wKsAd4B/wLfAeEB/wL5AfQB/wPGAf8DVgHBCAADCgEO
+ A1sB1gEwAV0BDgH/AWwBbQFWAf8BaQFmAWgB/wEzAVYBFwH/ATUBYgEVAf8BVAGHASQB/wEkAaQBYQH/
+ AQABpwGrAf8BUgFXAVQB7QMtAUUMAAG7AagBWAH9Af8B6wHUAf8B/AHrAdsC/wHrAdMB/wHyAdYBtAH/
+ AeIBwgGfAf8B5wHCAZsB/wHYAbMBiwH/Ad0BqgFmAf8B4wGcAUUB/wHhAZoBRAH/AeABbgELAf8B0QFV
+ AQAB/wNWAb4EAANXAboB3AGwAagB/wHbAbIBqAH/AcsBoQGeAf8BtwGoAacB/wHzAcQBowL/AdIBqgH/
+ AfwB2AG8Av8B3gHBAv8B5AG/Av8B1wGkAf8BtAGPAWIB/wGgAaMBpQL/AfEB8AH/AWACXAHUAxgBIgN3
+ AfYC+QL/AsQB6AH/Ar4B2gH/AtgB6gH/AocB8AH/Ak4C/wIlAfsB/wKCAeIB/wL+AecB/wL9AesB/wL3
+ AeoB/wLrAegB/wP0Af8DyAH/A1YBwQwAAw8BFANZAdcBNAFjARIB/wE+AWEBGAH/ATMBXgEYAf8BWwJd
+ Af8BYQGAAYEB/wFPAYkBIwH/ARABmAFQAf8BAAGeAakB/wFSAVYBVQHtAysBQwgAAbQBfgFmAfwB/wHq
+ AdAB/wH9AesB2AL/AeYBywH/Af4B1QGpAf8B8QHDAZsB/wHpAbUBiQH/AeIBnAFOAf8B9AGmAU8B/wH4
+ AakBTgH/AecBnwFGAf8B3wFwAQ4B/wHQAVYBAAH/A1YBvgQAA2EB5AHHAZ4BmwH/AeQByAHHAf8B8wLm
+ Af8B1AHVAdcB/wHEAbQBrAH/AfIByQGtAv8B3wHIAv8B3gHLAf8B+wHaAbwB/wHMAaYBiwH/AY4BgwGB
+ Af8B5AHjAeUB/wG+AqgB/QNAAXAEAAN3AfYG/wH5Af8C2wHlAf8CjQHSAf8ChgH2Af8CWgL/AikB9gH/
+ AqsB5wH/AvwB7QH/AuwB7QH/AuoB6wH/A+gB/wP2Af8DyQH/A1YBwRAAAwoBDgNaAdgBHgFlAQAB/wFr
+ AYgBVAH/AWsBYgFsAf8BUAFOAVUB/wFSAWQBYQH/AUYBiAEeAf8BFAGZAVcB/wEAAZUBqwH/AVIBVwFV
+ Ae0DNAFVBAABtAGAAWkB/AH/AeoBzwH/AfkBzgGnAf8B+AHKAaQB/wHrAbwBmAH/AeUBuwGeAf8B6wHE
+ AaoB/wHuAcEBoQH/AeoBsgGLAf8B7wGoAWcB/wHvAZIBPQH/Ae0BgAEKAf8B0QFZAQAB/wNWAb4EAAMt
+ AUYDUwGqAZIBfQF3AfkB7wHDAcAC/wHpAecB/wHVAdQB1QH/Ab8BtAGvAf8BzgGyAaUB/wHQAa0BoAH/
+ AbYBlgGLAf8BnQGRAZAB/wHVAckBywL/Ae0B6wH/AV0BWgFZAdIDEgEYBAADdwH2BP8D+AP/AfsB/wLG
+ AeIB/wKKAdsB/wKOAfYB/wKSAfAB/wLiAe4B/wL0Ae8B/wPtAf8D6wH/A+oB/wP3Af8DywH/A1YBwRQA
+ AwoBDgNbAdYBNwGIARkB/wFsAYcBVgH/AVUBUQFUAf8BQwFAAUsB/wFLAlcB/wEyAYUBAgH/ARgBoAFD
+ Af8BCgGVATEB/wNTAaoEAAG1AYIBaAH8Af8BwQGJAf8BzwGJAUEB/wPfAf8BzwHVAdsB/wHBAcYByQH/
+ AeAB5AHoAf8B1QHcAeIB/wHBAcwB1QH/AdEB2wHgAf8B2AHAAbIB/wHZAWQBIwH/AeIBYgEHAf8DVwG/
+ CAADBwEJAyYBOQNQAZ4BawJiAe8B6wG3AbQB/wHrAdYB1QH/AdsB1wHWAf8B0gLXAf8BygGwAbMB/wHn
+ Ab8BugL/AfIB6wH/AeoBsAGrAf8DRAF6CAADdwH2BP8D+QH/AvkB+AH/Av0B+gH/AssB4AH/AscB3AH/
+ AvsB8gH/AvYB8wH/Au8B8AH/A+8B/wPtAf8D6wH/A/kB/wPNAf8DVgHBGAADEQEXAVkBXQFZAdcBNAGM
+ ARUB/wFhAW0BSgH/AUgBPwFKAf8BRAFaATcB/wFNAaUBJgH/ASEBnwEAAf8DWwHhAx0BKgQAAbcBfAFJ
+ AfwB7AGUATcB/wGtAWEBLgH/AcUBuwG0Af8BzwHLAcgB/wHeAeYB6gH/AdwB4wHoAf8BuwHAAcQB/wGe
+ AYIBZAH/AagBgAFfAf8BogFvAWMB/wGbATcBEwH/AekBZwEcAf8DVgG+FAADIwE0A0wBkwNfAdsB5gGw
+ Aa0B/wH6AeYB5AL/Ae0B7gH/AfwBwwG9Av8B3QHPAf8CXgFaAd0DEwEaCAADeQH2BP8D+wH/A/kB/wL6
+ AfkB/wL8AfsB/wKsAc8B/wK6AdQB/wL5AfYB/wPxAf8D7wH/A+0B/wPrAf8D9wH/A88B/wNXAcIcAAMH
+ AQoDWwHWATEBjQEUAf8BSgGAAScB/wFeAa0BPAH/AT0BsAEmAf8DWwHhAxUBHQgAAV8BXgFYAd0B9QGx
+ AWAB/wHeAYoBMgH/AdIBXwENAf8BvwFfASEB/wHKAbEBoAH/AcgBtQGoAf8BqwFnAUMB/wGfAS0BAAH/
+ AZsBHQEAAf8BlwEdAQAB/wHNAVEBGAH/AbEBbgEtAf4DQQFzHAADHQEpAUcCRgGAA2EB2gHgAagBpwH/
+ Af0BzgHMAf8B5wGdAZYB/wNAAXAMAAOIAfgU/wL4AfwB/wLzAfoD/wH+Af8D/QH/A/wB/wP6Af8D+QX/
+ A9MB/wNXAcIgAAMPARQBWgFeAVoB1QEjAZwBBQH/ASEBlgESAf8DWwHZAxYBHwwAAyUBNwFiAl8B4AHz
+ AaoBUgH/AfMBnwFDAf8B6QGJASkB/wHVAW0BJgH/AcsBYgEhAf8BywFVAQ4B/wHKAVgBGAH/AdEBXwEg
+ Af8B2wFrASgB/wGSAVwBPgH4A0wBkygAAxoBJAFAAj8BbwNeAdkBXAJZAcwDEwEaDAADWwHLA6UB/gOx
+ Af0DsQH9A7EB/QOxAf0DsQH9A7EB/QOxAf0DsQH9A7EB/QOxAf0DsgH9A60B/gNqAfUDOwFlJAADDQES
+ AVwBYQFcAdwDXAHcAxABFhQAAw0BEgNDAXcCWwFZAcQBZgFkAVwB5wF/AWUBUgH0AZkBdAFCAfgBhQFi
+ AUgB9gFuAWEBVAHuAmABWwHWAVECTwGcAycBOhAAAyMBMwNWAbkDVAGrAxEBFwMQARYDIAEuAwEBAiMA
+ AQEDBAQFAQcDDAEQAx0BKgMrAUMDLwFJAyUBNwMWAR4DEgEZAyABLgMtAUUDMgFQAzIBUQMuAUgDIgEy
+ DAADBgEIA1ABpANZAc8DXAHOAlcBYAHoAUsBWQFsAfIDWwHhA1kBzANbAdADSAGEGAADBAEGAzQBVANW
+ AbMBaQFkAVwB5wFzAWIBWAHvAXMBYgFYAe8BaAFfAVcB6AFXAlYBuAM2AVkDBwEJEAADXQHSAbUCmgH/
+ AW4CWQH/A1ABngNaAdsDXgHlAx8BLCAAAwMBBAMKAQ0DEQEXAUACPwFuAWECXAHcAWECWgHkA1kBwwNC
+ AXUDNQFWA0QBfAFdAlkB1wGOAW0BUQH3AZcBbgFBAfgBZQJeAeUDVAGrA0ABcQwAAxgBIQGGAoEB+gHe
+ Ac4ByAH/Aa0BsQHOAf8BUAHCAfkB/wFfAeAC/wGHAakB4AH/AeQBzgHDAf8ByQLCAf8DVQGyFAADEgEY
+ AVMCUgGoAfYBigFSAf8B8AG/AasB/wHjAcYBwAH/AdUBwAG+Af8B0wG/Ab0B/wHkAcYBwAH/Ae8BwAGt
+ Af8B9gGPAVcB/wNVAbIDGAEhDAADWQHHAcgBswGyAf8BoAGHAYYB/QFfAVYBVAH7AWgCZQH/AV8CWQH+
+ A1cB3wNZAckDWgHNA1oBzQNaAc0DWwHQA1kByQNFAX0DBgEIAyIBMQMwAUwDMQFNAlwBWgHNAf4BxgGm
+ Af8B7AHQAcUB/wHOAX8BSwH+A1IBqQNKAYwBbAFhAVQB7gH2AcIBpQH/AdcCxgH/AdUBxQHGAf8B7wHI
+ AbQB/wGiAW8BTQH6A04BmQgAAwQBBgMQARYDPgFrA0QBeQNCAXQBXwFvAXsB8wFtAaUBygH/A1cBxQM/
+ AW0DRQF9AyEBMAMJAQwDBgEICAADEgEYAVsCWQHDAfMBqQGFAf8BzQG2Aa4B/wHGAbwBvwH/AfIB6gHt
+ Af8BywHGAcgB/wHGAcIBwwH/AfQB7AHuAf8BxwG+AcIB/wHIAbIBrgH/AfQBsAGNAf8BWwJYAcsDFQEd
+ CAADDwEUA0gBhANWAbsBegF8AX8B/gFuAZMBoAH/AW8BowGvAf8BqAGfAa0B/wHBAY4BmgH/Ac4BbAGD
+ Af8B1gFiAWgB/wHhAW4BcAH/AeABawFvAf8B4AFrAYEB/wFXAkAB/QNEAXoDGgElAycBOwMnATsDSAGE
+ AekBmwFcAf8ByAHFAdAB/wHqAbsBpAH/AV4CXAHOAVYCVQGxAfEBrwGJAf8BxgHBAcoB/wHcAbwBrgH/
+ AeEBuwGpAf8BxAG8AcQB/wHrAb8BqgH/AVwCWAHRBAABSQJIAYgDXAHnAVsCWAHpAVwCVwHfAWECXAHc
+ A1sB2QGPAYkBiAH7AbgBogGeAf8DXQHtA1sB2QFeAlgB3QNaAeQDYAHrA1sB4QM6AWIDCAELAVQCUgGm
+ AfYBpQFlAf8B1gG9AcMB/wG0AbAB1gH/AtwB2QL/Af4B/AH/AfcC9QH/AvUB9AL/Af0B/AH/A90B/wHa
+ AdMB1wH/AeAByAHFAf8B8wGlAWwB/wNVAbIDCgENBAADUgGoAWACZAHsAYYBkAGTAfsBtAHiAesB/wG0
+ AfMC/wGrAf4C/wGUAfcB+gH/AZEB2wHkAf8BjgGzAcAB/wGGAYEBkwH/AWQBNAE3AfwBYgJXAe8B0AJS
+ Af8B3gFvAXAB/wNWAbMHAAEBAwcBCQMPARQBXAJaAc0B4gHDAbYB/wHSAcoB0QH/AaIBcAFNAfoBagFU
+ AVEB7gHhAcIBtQH/Ac8BxgHMAf8BxAF/AUwB/gG7AVQBPAH9AdcBxgHFAf8B2gHFAcIB/wF7AWcBTwHy
+ BAABjAKIAvkC+AH/AeEC3wH/AdwC2gH/AdkC1wH/AcoCxwH/Ad8C3gH/Ae0C6wH/AfcC9AH/AfUC8gH/
+ AfYB8wH0Af8B7gHwAewB/wHMAewB0AH/AdEBzwHLAf8DVgG7AzABSwG9AVMBQAH9Ac0BoQGKAf8B2AHU
+ AdUB/wLWAfsB/wLQAfoD/wH9Cf8B/gL9Av8C/gH/Af4C/AH/AdkB1gHaAf8BygGhAY4B/wHnAWgBNwH/
+ ATYCNQFYBAABdAGMAZsC+gP/AdoD/wGvAfMC/wGMAeAC/wGJAeoC/wGHAfYC/wGTAf0C/wGeA/8BkwHz
+ Af4B/wNXAd8DKQE+AZECWgH7Ad8BaQFoAf8DVQGyAwABAQMKAQ0DHAEoAzIBUAFMAksBkAHCAX8BWgH+
+ AdMBzgHWAf8B4AG6AaYB/wHhAV0BFQH/AdsBwQG3Af8B1wHLAc8B/wGBAWIBSAH2AXcBWwFTAfEB4AHI
+ AcMB/wHYAsgB/wGaAWoBQQH5BAABpgKdAfwB7ALvAf8B1QLWAf8D2QH/AdcC2AH/AcsCzAH/AeEC4gH/
+ AewC7QH/AuoB6wH/AeoC7AH/AewC7QH/AegB6gHpAf8B5gHvAegB/wHhAt4B/wNVAboDUgGpAesBkQFM
+ Af8BywG2AbMB/wHaAd0B3gL/Av4B/wHFAcYB/AH/AtIB+hL/Av4B/wHdAd8B4QH/AcoBuAG3Af8B7QGV
+ AVEB/wFYAlYBuQQAAW4BhwGMAfcB3AP/AaIB6wL/AYAB3AL/AVYB0QL/AV4B3QL/AVoB5AL/AWUB6AL/
+ AYUB9QL/AYwB+QL/A1sB4QMgAS4BjwJNAfoB3QFpAWoB/wNVAbEDBgEIAzcBWgFgAlwB1AF8AV8BTAHz
+ AXsBXwFMAfMBuQFhARkB/gHgAbkBpgH/AdQBzwHVAf8B7wGZAVUB/wHgAbsBqgH/AdYBzwHVAf8BxQF/
+ AUsB/gG5AVABNQH9Ad0BzAHKAf8B3gHLAcgB/wF+AV8BTAHzBAABjQKLAfkB7gLwAf8C5gHlAf8D5gH/
+ A+YB/wHoAukB/wHmAuUB/wHsAekB5gH/Ae8B7AHmAf8C6QHmAf8D4wH/AeMC4gH/Au8B8AH/AdkB1AHV
+ Af8DVAGvAWECWwHhAegBlgFVAf8B8wHsAe8B/wH+Af0E/wH+Af8C9wL/ArkB+wH/AtwO/wP+Av8C/gH/
+ AfQB7QHyAf8B5wGYAVsB/wFmAlcB6AQAAV8BcQF8AfMBsAH2Av8BawHaAv8BRAHMAv8BKwHBAv8BTAHT
+ Av8BOQHUAv8BQwHYAv8BVQHjAv8BXgHsAv8DXgHlAykBPgGPAk0B+gHdAmkB/wNVAbEDKgFAAYABWQFC
+ AfUB4wHEAbYB/wHeAdcB3AH/Ad4B1gHbAf8B4AG4AaEB/wHjAZgBWAH/AdYBzwHTAf8B5wG/Aa0B/wHv
+ AbUBlQH/AdMB0AHYAf8B5AHBAbEB/wHoAbwBpgH/AdQB0AHWAf8B6gHDAa8B/wFeAlwBzgQAA2UB5QT/
+ AfwD/wH5Af0B/gH/AfQB+wH9Af8B8wH8Af4B/wHrAekB6wH/AcABxwHaAf8BrAG0Ac8B/wHJAcQBzwH/
+ AuMB4AH/Ad0C3gH/AeYC6AH/AbMCrQH/A0gBhwFsAlQB7gHZAYUBRAH/AcUBwwHJAf8B8gHzAfQJ/wL0
+ Av8BsAGqAcgB/wGxAacBowH/AeYB4gHfAf8B+gL5Bf8B9gH1AfYB/wHHAcgBzgH/AdkBjAFQAf8BbgFY
+ AU4B7wQAAVkBbwF7AfIBiQHrAv8BTQHQAv8BQAHLAv8BRgHOAv8BYAHZAv8BVgHbAv8BQwHWAv8BQAHY
+ Av8BRAHlAv8BWAFZAWAB6wEsAisBQwGPAk0B+gHcAWkBagH/A1UBsQNVAbUB3wGzAZkB/wHaAdcB4AH/
+ AdsBsQGbAf8B3AG2AaEB/wHXAdYB3wH/AeoBtQGYAf8B6QG7AaUB/wHXAdMB2gH/AfMBqgGAAf8B6gG8
+ AaQB/wHeAdcB2wH/Ad4B2AHdAf8B6QHOAcIB/wGlAV8BQAH7AzgBXAQAA1cBugHrAeAB3AH/AeEBxwG+
+ Af8B1wHKAcgB/wHcAcIBugH/AdEBowGZAf8BXgGjAdwB/wE4AbYB7QH/ARwBxwHqAf8BFwGDAcwB/wGs
+ AagBvAH/AdkB0gHNAf8B2gLXAf8BcwJwAfwDLwFKAWsCVAHuAdsBhQFCAf8ByQHIAcwB/wH2AvcF/wHv
+ AuwB/wHNAcIBvgH/AbsBsAGrAf8BkwGKAasB/wG0AagBtgH/AcUBuQG1Af8B0gLLAf8D8QH/Ac4BzwHV
+ Af8B3AGMAU4B/wFrAVgBTwHvBAABVQFhAWUB6gGGAd0B/gH/AYkB4AL/AYUB2wH7Af8BaAHKAfEB/wFR
+ AbgB6wH/AW8B0AHyAf8BhgHbAv8BhQHjAv8BWQHgAv8CWgFfAdsDJAE1AY8BTQFOAfoB3AFpAWoB/wNV
+ AbEBYwJYAekB3gHJAcIB/wHhAdYB1wH/AbMBSwEwAf0BtwFUAUAB/QHgAdoB3QH/AeMBxgG6Af8B9wGe
+ AVoB/wHdAdYB2gH/AeYByAG7Af8BxgFvASsB/gF5AWcBVQHyAXsBZwFXAfIBXAJZAc8DNQFXAwcBCQQA
+ A0gBhgG8AaABnAH/AeMBcAEwAf8B3wGjAWoB/wHrAZ8BZQH/AdMBMgEIAf8BRwGEAbYB/wFXAd0C/wFS
+ A/8BHAHLAfsB/wFfAYABtwH/AeEBywHEAf8B2gHIAckB/wFiAlcB8QMVAR0BXQJXAd8B6QGQAUcB/wH0
+ AesB7gH/AvkB+gH/AdICygH/AboCrAH/AdYBzwHOAf8B+wH5AfgB/wHqAewC/wHsAe0B/QH/Ae8B6wHo
+ Af8B3wLZAf8B+QH4AfkB/wH1Ae4B8gH/AecBkgFOAf8BZQJXAegEAAM1AVcDVQG1AV0BZwFtAe0BhgGl
+ AbMB/wFrAYsBmAH/AWEBgwGUAf8BXAGTAakB/wFOAX8BlAH+AU4BZQFtAfQCWgFdAcoDLwFKAx8BLAGD
+ Ak0B+gHiAWwBbQH/A1UBtAF8AV8BTAHzAeMB0wHPAf8B5wHXAdUB/wF3AV0BTAHzAXsBYgFIAfQB5gLb
+ Af8B4wHRAcsB/wHgAWIBHwH/AeQBtwGfAf8B4AHhAeoB/wHEAX8BbQH+A1MBqgM2AVkDFQEdAwMBBAgA
+ AzQBVAGIAX8BgQH+AewBmQFQAv8BzAGOAv8B3QG3Af8B8wFZAScB/wGOAVkBYwH/AT8BxAH+Af8BRwH4
+ Af0B/wEZAeEB+gH/AS0BbQHXAf8B4AHKAc0B/wHMArgB/wNYAd0DBgEIAVICUAGjAeoBjAFBAf8BzwGv
+ AacB/wG6AbQBuAH/AcwCwgH/AfMC8Rn/AdsB3wHiAf8ByAGvAagB/wHrAY8BQgH/A1UBtQwAAzYBWQF/
+ AX4BdwH+AYIBbwFtAf8BnAGNAYYB/wHFAaYBoQH/AX8BdgF7Af4BYgJZAfUBZAJcAecDWgHYA1kB1wGd
+ AWoBaAH+AeECgQH/A1ABnQFnAWEBWAHmAecB1AHOAf8B5gHeAeAB/wG1AXABNwH+AbcBeQFCAf4B5gHg
+ AeQB/wHpAdMBygH/AWkBVAFTAe4BgQFiAUgB9gHmAeAB4gH/AekB1AHMAf8BZAJcAecDOgFhAyMBMwMI
+ AQsIAAMaASUBbAFqAWwB9QHVAaMBjAH/Af0BtgFbAv8B5QGsAf8B+QGDATQB/wHCAVoBQQH/AVoBrwHK
+ Af8BVgG1AZgB/wFTAbgBkAH/ATwBcAGLAf8BxQG3AbwB/wG4AqEB/wNWAbgEAAMtAUUBnQFfAUUB+wHT
+ AZEBXQH/AdQBygHQCf8B/gL9Cf8D/QL/Av0B/wH+AvwB/wHaAdYB3AH/AdABlQFkAf8B2QFvATsB/wMz
+ AVMMAAM1AVUBdAFzAXIB/gFaAlwB/wFoAmQB/wG7AZ0BlwH/AfcBxQG8Af8B+wHEAb0B/wH5AcIBuwH/
+ AfEBsQGrAf8B6gGfAZkB/wHqAZMBkAH/AWACWQHrAxwBKAFTAlIBqAHnAb8BpwH/AucB7gH/AecByQG6
+ Af8B5wHKAb0B/wHnAegB7wH/AegBvAGgAf8BUQJQAZ8DTgGYAecBvQGlAf8B5wHrAfUB/wHiAakBhwH/
+ AVICUAGkAygBPAMMARAIAAMGAQgDXgHdAbgBogGjAf8BawFTAZ8B/wGWAXABnwH/AZQBYgGbAf8BTwE1
+ Aa8B/wFUAYMBSQH/AUMBwwFUAf8BlgH2AbMB/wFWAckBWQH/AWwBiAFWAf8DfwH+Az8BbQQAAwcBCQNQ
+ AZ4B6wGjAWEB/wHnAbcBowH/AdcBzgHSAf8B1gHYAdoB/wH+AvwB/wH1AvQB/wH0AvMC/wH9Af4B/wHa
+ AdwB3QH/AdYBzwHSAf8B5QG3AaYB/wHsAaYBZAH/A1MBqgMJAQwMAAMfASwDagH5AWsCagH/AVEBUwFU
+ Af8DUgH0A1EBogNWAbQDXAHJA2AB3gFqAWUBZAHtAVsCWQHEAx0BKgQAAx0BKgFnAWEBWAHmAegBzgG8
+ Af8B6ALjAf8B6AHiAeMB/wHoAcoBuAH/AWQBXAFVAeoDJQE3AxgBIgF+AV8BTAHzAekB2AHPAf8B6gHO
+ AbsB/wFdAlkB0gMcAScDBwEKDAADKgFBAk8BTgGXAlcBZgHoAWcBagH5Af8BnQGmAf4B/wEoASkB9gH/
+ ASEBIwEyAfsBOgG9AU4B/wGiAf8BzgH/AYwB/wGwAf8BIQFgARkB/wNTAaoMAAMMARABVwJVAboB7AGw
+ AYAB/wHRAaUBkAH/AcgBsgGxAf8B8gHmAegB/wHKAcIBxAH/AcUBvQG/Af8B8wHoAeoB/wHKArYB/wHN
+ AaMBkQH/Ae4BtAGFAf8BWQJXAcIDEAEVFAADWwHLA9cB/wOTAf8DUAGjEAADBgEIEAADJAE2AVsCWQHE
+ AZABagFHAfkBkgFrAVgB+AFaAlcBxQMpAT4DBgEIAwABAQM9AWkBXAFaAVkBzAFcAlkBzAM7AWMDBwEK
+ AwEBAhQAA0MBdwFmAWgC/wHLAcwC/wFdAVsC/wEQARQBXAH9ASkBcQEqAfoBYwGaAX8B+QFhAXMBYwHu
+ AUABgAFGAfcDRwGDEAADDQESAlABTwGbAd8BnAFZAf8B7AG+AZwB/wHnAcIBrwH/AdkBtQGpAf8B1wGz
+ AagB/wHnAcIBrwH/AewBvgGdAf8B4QGgAV4B/wJSAVABowMTARoYAAMnAToDcAHxA14B2QMUARtwAAMQ
+ ARYCWgFgAd4CqAHRAf0CTQGvAfoCWgFeAdUDOwFkAyYBOAMSARkDKAE8AxYBHxgAAy0BRgNRAaIBXgFc
+ AVcB3wFuAWMBXgHuAW4BYwFfAe4CYQFbAeECUwFSAagDMAFMAwIBA7gAAyMBMwNZAewDVgG+AxIBGQgA
+ AxEBFwNTAaoBXwFcAVUB6gFqAWYBVwHyAWIBXQFaAe0DWQHHAyoBQQQAAwkBDBwAA0YBgQNWAbsDVQG1
+ A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1YBtgNWAbsDPAFoDAACOQE6AWACQQFu
+ AfUCWQFdAdcDSgGLAy4BSAMYASEDBwEKQAADJgE5A1gB6QHyAucB/wHaAtAB/wNXAcIDEgEZAxEBFwJe
+ AVsB2QH3AdgBqwL/Ad4BrQL/Ad0BrgL/AewBwgH/AegBzgGqAf8BYgFYAVcB7wNZAdIDWwHhA1kBwwNQ
+ AZ0DPwFuAyABLgwAAbcBXQFAAf0B8AGKASUB/wHtAW8BGgH/Ae4BbgEZAf8B7gFrARUB/wHuAWgBEAH/
+ Ae0BYwEGAf8B7QFeAQAB/wHtAV8BAAH/Ae0BWwEAAf8B7QFYAQAB/wHtAVUBAAH/AfIBUwEAAf8B4wFR
+ AQAB/wNZAcQMAAJRAVIBpwImAd4B/wIbAdUB/wIKAboB/wIAAaMB/wJRAWEB7gJVAVYBtANAAXEDMgFR
+ AxQBHDAAAycBOwNcAecB6gLfAf8B7ALiAf8B5gLZAf8B3ALVAf8DWQHEA1QBrgH6AbwBgAL/AdsBoQL/
+ AcUBhgH/Af0BwgGEAf8B+AHCAYgC/wHdAakB/wHqAbUBhwH/Ab0BogGXAf8B4AHdAeAB/wHnAeIB4wH/
+ AdMBzAHNAf8BlAGMAY0B/gNlAfQDWQHHAzEBTwQAAb4BfwFGAf4B9gG3AYoB/wH0AboBlAH/AfIBtwGP
+ Af8B8gG2AY8B/wHyAbUBjQH/AfMBtAGIAf8B8wGxAYUB/wHxAa4BgAH/AfABqgFtAf8B8AGqAWwB/wHv
+ AakBawH/AfMBrAFuAf8B7wFtAR4B/wNWAcEIAAMKAQ0CXAFeAc4CNAHzAf8CJQHsAf8CGQHmAf8CDAHe
+ Af8CAAHPAf8BlwGRAcUB/wG0AasBsAH/AWYBYAGWAf8CWwFeAdkCVQFWAbEDQAFxJAADJAE2A1kB7AHp
+ AtwB/wH1Au0B/wHhAtgB/wHkAtkB/wH8AvcB/wFaAlgB7gFzAV8BTAHzAa4BVgEaAf8B5gGcAUMC/wG+
+ AVsB/wHtAaQBRwH/Aa4BUQETAf8B5QGhAU0B/wHeAZYBRgH/Ac0BnwFvAf8BzQHCAcEB/wHsAdwB2AH/
+ Ae8B2QHXAf8B8AHeAdwC/wH9AfwB/wHgAtQB/wNWAbgEAAGzAX0BSwH+Af8B8QHzAf8BmQHgAbAB/wE0
+ AccBTgH/ATMBwQFIAf8BIQG1ATAB/wGsAd0BuAH/Af0B7wH2Af8B+QG2AYcB/wH7AbMBgwH/AfoBqwFq
+ Af8B9QGsAYAB/wHpAecB7gH/AeMBjwFRAf8DWAHACAADLAFEAkMBfQH2AjwB9wH/AisB6gH/Ah8B5QH/
+ Ag4B4AH/ARkBGAHdAf8B3QHUAeAB/wH3Ae0B3gH/AekB3gHYAf8B3QHSAcwB/wHMAcIBvAH/Ak0BbwH6
+ IAADJAE1AVwCWQHsAesC5AH/AfUC7QH/AeoC4gH/AfsC+AH/AfYC9AH/AV8CWwHsAyYBOAF/AVgBKwH8
+ AYQBMQEAAf8B2wGWAUEB/wHyAbkBZQH/AbcBawEtAf8BZAEhAQAB/wGVAUABAgH/AckBiAE0Af8BzwGc
+ AWMB/wHkAcwBxAL/Ae0B3wL/AeIB0QH/AfkB1QHGAf8B2AHAAbsB/wFhAl8B6AMpAT8EAAG0AX8BTwH+
+ Af8B7wHwAf8BhQHdAZoB/wEXAc8BNQH/ARABwQEmAf8BAAGpAQAB/wGXAdMBmwL/AucB/wH9AbABZAL/
+ AbEBaAL/AaEBTwH/AfwBnAFNAf8B7QHgAd4B/wHkAZABTwH/A1gBwAgAAjwBPQFnAisB4QH/AjoB+QH/
+ Ai8B7QH/AicB6AH/AhAB4gH/AUcBRAHeAf8B8wHsAd8B/wHoAd8B2wH/AeIB2AHaAf8B6AHdAdsB/wHs
+ AeEB3AH/AloBXQHTHAADJAE2AV8CVwHoAesC5gX/AfgC9gH/AfoC9gH/AfIC7wH/AWQCYgHnAycBOwQA
+ AXkBZQFMAfQB4AGnAVgC/wHfAbMB/wHHAaYBhgH/AZ8BawFLAf8BngFqAUcB/wGEAUUBGgH/AW4BMgEA
+ Af8BqAFmAUMB/wNlAfQDYgHpAY4BfwF9AfgBZgFiAWEB7QFQAk8BmwMKAQ4IAAGyAX8BUwH+Af8B7wHu
+ Af8BhwHhAaEB/wEgAd4BTAH/ARoB0gE9Af8BAAG4AREB/wGXAdYBnwL/AeoB6QH/Af4BtgFuAv8BvAGJ
+ Af8B/gGsAWAB/wH8AaIBVgH/AfAB5AHiAf8B5AGTAVIB/wNYAcAEAAMEAQYDUQGiAoMB9AH/AVIBUQH5
+ Af8BLgEtAfIB/wEdAR4B7AH/AQoBCwHmAf8BkgGPAeIB/wH6AfEB4QH/AeQB2wHcAf8B4wHZAdoB/wHv
+ AeQB3gH/AcIBuAHGAf8DSAGFEAADGgElAyoBQQM4AVwDXgHlAe4C6A3/AfEC7gH/AWICYAHpAyYBOQgA
+ A1YBswHvAcoBoQL/AfsB9AH/AfkB9AHuAf8B7AHZAcYB/wHtAdgBwAH/AecB0gG6Af8BzQGRAU4B/wFy
+ AVABPAH+A0QBegMDAQQDEQEXFAABrwF/AVcB/gH/Ae8B6wH/AbwB7gHHAf8BigHmAZQB/wGJAeMBjwH/
+ AWkB2QFsAf8BxgHpAccC/wHxAfAC/wHPAZkC/wHRAZwC/wHKAZMB/wH9AccBlAH/AfQC6wH/AeMBkQFT
+ Af8DWAHABAADFAEbAV0BXAFhAeEC+QH4Af8B6AHkAfEB/wHGAcAB7wH/AZABjQHsAf8CQAHoAf8BywHF
+ AeUC/wH3AeIB/wHzAeoB4AH/Ae0B4wHdAf8B9wHsAeMB/wGYAZABsAH/AywBRAgAAxYBHwNUAasDZAHn
+ AWMCXwHwAWsCagH5AeAC1g3/Ae8C6wH/AWQCYwHsAyMBMwwAAxEBFwJhAVwB3AH4AeYB0wb/AfYB6wH/
+ AfsB7QHcAf8B9wHbAb4B/wHjAb8BpwH/AasBpwGvAf8CYgFmAfUDXAHqA1sB2QNZAcMDUgGmAzcBWgMD
+ AQQEAAGuAX8BWgH+Af8B9gHmAf8ByAHHAfMB/wGUAYsB3gH/AZcBjgHeAf8BlAGKAdkB/wHYAdMB7gH/
+ AfUB9gH7Af8BmAGtAf4B/wGPAacB+wH/AYwBoQH6Af8BlgGmAfoB/wHvAfAB9wH/AekBlQFOAf8DWAHA
+ BAADJgE5ApYBzwP/AfwB/wH5AfYB8gH/AfwB9wHvA/8B6wH/AdkB1AHoAf8BNgE1AeYB/wFcAVgB4gH/
+ AaABmgHgAf8ByQHCAdwB/wHvAekB4gH/AWIBXgFkAewDFgEfBAADFQEdA1oB0wHHArgB/wHxAuUB/wH5
+ AvEB/wH7AvQB/wHsAuUB/wHsAuUF/wHyAu0B/wNgAesDJQE3FAADCQEMA1ABngFmAWIBXQHqAeQBzQG/
+ Af8B4gG/AakB/wG+AVcBGgH/AcYBhAE9Af8B1QGsAW0B/wHLAawBiwH/AdEBuQGiAf8B3QHHAbgB/wHY
+ AckBwgH/AdEBwwHFAf8DXQHiAwwBEAQAAa8BfwFfAf4B/wH+AeoB/wFeAWMB3gH/AgABwwH/AgABtwH/
+ AgABnwH/AZkBmAHTAf8B7gHwAv8BFwFXAfwB/wEFAVQB/QH/AQABOAH8Af8BDQE5AfwB/wHpAesB+QH/
+ Ae4BnQFRAf8DWAHABAADQwF4AsgB5gP/Af0B/wH2AvMB/wHzAe4B8QL/AfsB7QH/AawBpwHsAf8BFgEX
+ AeoB/wIOAeQB/wEAAQEB3wH/AgkB3AH/AS0BKgHWAf8DVAGvAwcBCQQAA1ABmgG8Aq8B/wHpAtoB/wHp
+ At0B/wH0AuoB/wHzAu4B/wH2AvQB/wHuAucB/wHmAt8B/wNfAeADJwE7IAADLgFIAZEBiwGPAfwB1AG1
+ AagB/wGyAS0BAAH/AcwBTgEAAf8BzwFdAQAB/wHSAWgBAAH/Ac8BaAEDAf8BzQFgAQEB/wG+AVQBEQH/
+ AdABuAGvAf8DWgHVAwMBBAQAAa0BfwFkAf4B/wH+AegB/wFiAWcB6AH/AgAB3wH/AgAB0gH/AgABuAH/
+ AZwBmwHaAf8B7gHwAv8BKwGFAf0B/wEfAYwB/QH/ARMBXgH8Af8BHgFSAf0B/wHqAewB/AH/AewBnQFU
+ Af8DWAHABAADWQHHAvoB/QL/Af0B+wH/AfgB9AH1Af8B9wHzAfIC/wH8Ae8B/wFwAW4B8AH/AScBKAHu
+ Af8CKAHoAf8CFwHhAf8CBQHhAf8CAAHFAf8CPwFAAW4IAANhAe4B3ALJAf8B3QLNAf8BvQKvAf8BnwKV
+ Af8B3wLUAf8B8wLvAf8B+wL2Af8BZwJlAfQDNAFUJAABRwJGAYEB1wHaAd8B/wG/AY8BhAH/AawBHwEA
+ Af8BwAFEAQAB/wHIAVEBAAH/AcsBVgEAAf8BygFUAQAB/wHHAUgBAAH/Ab0BQgEAAf8BxAGsAaYB/wNV
+ AbIIAAGsAX8BaAH+Av8B7AH/AYgBjQHqAf8BDwERAdwB/wETARUB1gH/AQwBDgHDAf8BrAGtAeMB/wHx
+ AfUC/wFBAYoC/wE1AY4C/wEsAWwC/wE5AWYC/wHuAfIC/wHrAZ0BWAH/A1gBwAQAAlkBdQHyAu0B9wH/
+ AvkB/AP/Af4D/wH5Af8B8wHwAfUB/wFTAVIB9gH/Ai8B8QH/AioB6gH/Ah8B5AH/AhUB6AH/AiEBhQH8
+ AjABMQFNCAADbQH3Ae8C3AH/AcACsgH/A1UBtQM/AW8BogKZAf8B9ALrAf8B+ALxAf8BagJoAfIDKgFB
+ JAADVQGyAegB5wHoAf8BqQFOAT4B/wGyASYBAAH/AckBUQEAAf8B2gFhAQAB/wHeAWcBAAH/AdABVwEA
+ Af8BuwE1AQAB/wG1AUUBGwH/AbwCrgH/A0gBiAgAAacBfwFpAf4B+AHlAdgB/wHsAecB6wH/Ad8B1wHi
+ Af8B3wHZAeQB/wHfAdgB5AH/Ae8B6QHrAf8B9gHuAewB/wHiAdoB7QH/AeAB2QHtAf8B4AHaAe4B/wHj
+ Ad8B8AH/AfoB9AHyAf8B4gGTAVYB/wNWAcEEAAM4AVwCUAFSAaQCWgFdAcoBagFrAXsB8wLDAd4B/wLO
+ AfQB/wJrAv8CUQH+Af8COAH3Af8CIgHrAf8CFgHqAf8CXAFgAdQDEAEVCAADZAHsAcgCugH/A1UBsAMW
+ AR4DVQGyAcACtAH/AegC3AH/AfAC5wH/AWMCYQHrAxwBJyAAAwMBBANeAdkB3gHZAdwB/wGhATEBFgH/
+ AcABPAEAAf8BzwFbAQAB/wHfAWsBAAH/AecBggEAAf8B4AFuAQAB/wHJAUkBAAH/AboBWQE7Af8BoQGZ
+ AZ4B/QM3AVoIAAHRAZ8BgwH/Af4BzgGYAf8B/QHIAZIC/wHMAZEC/wHJAYwC/wHHAYkB/wH8Ab4BggH/
+ AfkBtwFtAv8BvAFpAv8BuQFlAv8BtwFiAf8B/gGzAV0C/wGxAVwB/wHvAZABNwH/A1kBxAwAAwcBCgMq
+ AUEDOwFkAk8BUQGcAloBYAHeAlABxQH/Al8B3wH/AlwB9AH/AkEB7gH/A1QBrwwAA0IBdANRAZwDHwEt
+ A1UBsgHAArAB/wHeAswB/wHoAtoB/wHOAsEB/wNTAaokAAMRARcBbQJrAfMB0AG6Ab0B/wGRAQMBAAH/
+ Aa8BHgEAAf8BugE2AQAB/wHEAUUBAAH/AckBSgEAAf8ByAFKAQAB/wG7AS8BAAH/Ab4BaAFVAf8BdAFt
+ AXQB9wMhATAIAAFuAWQBYAHxAaEBdgFmAfwBlAJfAfsBlAJfAfsBlAFfAVkB+wGUAV8BVAH7AZQBXwFO
+ AfsBlAFfAUkB+wGUAV8BRAH7AZQBXwEyAfsBlAFfATIB+wGUAV8BMgH7AZYBXwExAfsBjwFDASsB/ANI
+ AYYcAAMUARsDIgEyA0IBdQJXAVkBwgJTAWoB8gM+AWsUAANRAZwBxQK3Af8B7wLdAf8B3gLLAf8BxAK3
+ Af8DYAHUAxUBHSQAAzABTQGdApQB/gHcAc4BzwH/AZ0CRwH/Aa0BUAFDAf8BrgFTAT4B/wGuAVMBOgH/
+ Aa4BUwE2Af8BrAFOATIB/wGhAToBLQH/AcIBmgGYAf8DYgHpAwcBCowAA0IBdgNkAecBcQJtAfcDZAHs
+ A04BmAMUARwoAAMiATEDXgHZA2UB7gFlAmcB7gJvAXAB8QNxAfMBdwFzAXcB9QGHAYYBhwH3AYsBiQGL
+ AfkBkwGRAZIB+wG0Aa8BsAH9A1YBuQgAAzoBYQNZAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHK
+ A1oBygNaAcoDWgHKA1oBygNcAc4DWQHDAzQBVUAAA04BmANZAcMDVgG+A1YBvgNWAb4DVgG+A1YBvgNW
+ Ab4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DWQHEA0QBfAgAA0gBhAF/An4B8wFyAnAB8AFyAnAB8AFy
+ AnAB8AFyAnAB8AFyAm4B8AFwAm4B8AFwAm4B8AFwAm4B8AGAAn8B8wNRAZwIAANhAe4D4gH/A90B/wPa
+ Af8D2gH/A9gB/wHYAtcB/wPXAf8D1gH/A9UB/wPVAf8D1AH/A9MB/wPgAf8DmQH/A1cBvQwAAy4BRwJe
+ AWEB2gMlATcoAAGZAZ0BnwH9AcoBzQHPAf8BywHNAdAB/wHLAc4B0AH/AcoBzQHQAf8BygHNAc8B/wHJ
+ Ac0BzwH/AcgBzAHOAf8ByAHMAc4B/wHIAcsBzQH/AcgBywHNAf8ByAHLAc0B/wHIAcsBzQH/AckBywHO
+ Af8BsQG1AbcB/wNbAdADAwEEAy8BSQNSAaQB6ALjBf8B+wL5Af8B+gL3Af8B+AL0Af8B9gLwAf8B8wLs
+ Af8B8ALoAf8B8gLrAf8B7ALlAf8DVgG2AzEBTQMEAQYDhAH3BP8D9AH/A/MB/wHzAvIB/wHxAvAB/wHw
+ AfEB8gH/Ae8B8AHxAf8B7QHuAe8B/wHrAewB6wH/AesC7AH/AekB6gHsAf8B5QLmAf8D9QH/A8YB/wNZ
+ AcMIAAMbASYBTAFiAWsB7wEAAeQC/wJcAWAB1CgAAa4BsAGyAf0B7QLwAf8B2QHbAdoB/wHbAd0B3gH/
+ AdsB3QHeAf8B2wHeAd8B/wHbAd4B3wH/AdsB3gHgAf8B2wHeAeAB/wHbAd4B4AH/AdwB3gHgAf8B2wHd
+ Ad4B/wHaAdsB3AH/AeYB6AHpAf8B4QHmAekB/wNYAcsDPgFrAYACfgH1Ad0C1QH/Ad4C1Qb/Av0B/wH8
+ AvgB/wH6AvUB/wH4AvEB/wH1Au0B/wHxAukB/wH2Au8B/wHhAtYB/wHdAtYB/wN9AfYDRAF6A3MB9gP7
+ Af8D6gH/AesC6gH/AeoB6wHqAf8B6wHwAfEB/wHmAekB6gH/AeEB4AHiAf8B4wHlAecB/wHnAewB7wH/
+ AeEB4gHlAf8B3gHfAeEB/wHeAt8B/wLsAesB/wO9Af8DVgHBCAADDgETAVcBXwFlAegBAAHxAv8BMgF3
+ AZUB+gJMAU0BkQNJAYcDSQGHA0kBhwNJAYcDSQGHA0kBhwNJAYcDRwGABAABqAGqAa4B/QFcAV4BWwH/
+ AhsBBgH/AicBBwH/AjUBEgH/AkoBKgH/AlABNAH/AlIBNwH/AU8BTgEzAf8BRAFFAScB/wE3ATgBFwH/
+ ASsBLAERAf8BIQEgAQsB/wI1AS8B/wG/AcYBywH/A1oBygNeAc4B9QLpAf8B0QLIAf8BaQJnAf8CtQG0
+ Af8BwgLBAf8BvAK7Af8BvAG7AboB/wG6ArkB/wG5AbgBtwH/AbsCuQH/AbUCtAH/AWkCaAH/AckCwgH/
+ AfgC7AH/A14B2QN1AfYD/AH/Ae0C7AH/Ae4B8AHyAf8B6QHsAe4B/wHaAcgBvwH/AdYBtwGnAf8B2QG+
+ Aa4B/wHSAbYBpwH/AdABuQGwAf8B1QG1AaMB/wHOAaoBlAH/AdYBzQHKAf8B7wHxAfMB/wPAAf8DVgHB
+ CAADGwEmAVcBYAFqAesBAAHoAv8BLQGbAcgB/wG7AbgBuQH/Ac0B2AHRAf8BywHVAdIB/wHJAdIB0AH/
+ AcYB0QHOAf8BxAHPAc0B/wHBAc0BywH/AckB1QHXAf8BnQGkAagB/wQAAqgBqwH9AUMBRgE9Af8DAAH/
+ AjkBGAH/AkABGwH/ASIBIQEAAf8CNgEEAf8CNwEGAf8CNAEDAf8CKgEAAf8CHQEAAf8CFQEAAf8CCgEA
+ Af8BGQEYAQsB/wG2Ab0BwgH/A1oBygNhAeYB4gLQAf8BwgKyAf8BUwFQAVEB/wFXAVsBYgH/AV4BYwFq
+ Af8BXQFjAWsB/wFeAWMBawH/AV4BYwFrAf8BXQFkAWwB/wFeAWQBawH/AVkBXgFlAf8BUAFOAU8B/wG5
+ AawBqwH/AeIC0AH/AWcCZgHrA3UB9gP8Af8B8ALyAf8B6wHpAeoB/wHXAbMBoAH/AegBvgGVAf8B9QHR
+ AaIB/wHyAdIBpwH/AfMB0AGgAf8B6wHCAZkB/wH1Ac0BoQH/Ad4BqAFsAf8B0wHDAbsB/wHwAfQB9wH/
+ A8EB/wNWAcEIAAMpAT4BDwF4AbEB/AEAAeoC/wEcAZEBtwH/AVIBaQFEAf8BTgGIATYB/wE1AXABFAH/
+ ATYBgwETAf8BOwGFARkB/wEzAW4BFgH/ASABXgEHAf8BbAGeAWEB/wGpAawBtAH/BAACqAGpAf0BPQFA
+ ATsB/wItAR4B/wLbAdUB/wK9AbcB/wIiAQMB/wIgAQAB/wIeAQAB/wIWAQAB/wIdAQAB/wIdAQAB/wIZ
+ AQAB/wIOAQAB/wIeARAB/wG0AbsBwQH/A1oBygFkAmIB7wHOArkB/wHOAb8BwQH/AdgBwwG8Af8B4AGn
+ AYoB/wHmAaUBgAH/AekBogFnAf8B6QGdAV8B/wHpAZ0BXwH/AekBoQFmAf8B5gGmAW8B/wHgAagBiwH/
+ AdkBwQG6Af8BzgHAAcIB/wHOArkB/wFoAmYB8AN1AfYD/gH/AfAB9AH3Af8B3QG7AasB/wHuAbcBgwH/
+ AfIBwAGHAf8B3wGzAZEB/wHeAb8BqgH/Ad4BsgGOAf8B8wHBAYkB/wH3AcgBlQH/AdQBowGGAf8B3gHc
+ Ad4B/wHyAfQB9QH/A8IB/wNWAcEIAAMcASgBIQFzAZwB+gEAAegC/wEZAZABtQH/AVIBbwFJAf8BgwGl
+ AWYB/wFXAZABRgH/AVgBkAFGAf8BGgFiAQAB/wEYAV4BAAH/AQIBTAEAAf8BWwGSAVIB/wGqAasBtQH/
+ BAADqAH9ATgCOQH/ATcBNgEmAf8CgQFsAf8CqgGnAf8CkQGHAf8CFwEAAf8CkwGCAf8CSQE2Af8CDQEA
+ Af8CFAEAAf8CEQEAAf8CBgEAAf8CGQEQAf8BsAG3Ab0B/wNaAcoBbwJuAfEB7QLkAf8C6wHxAf8B5QHR
+ AcAB/wH5AYcBEwL/AWYBAAL/AWYBAAL/AWcBAAL/AWcBAAL/AWgBAAL/AWgBAAH/AfoBZgEAAf8B5wHE
+ AaoB/wHsAfAB+AH/AeoC4AH/AWkCaAHwA3UB9gT/AeoC5QH/AeUBqwGDAf8B9QGvAWAB/wHYAaoBjQH/
+ AegB5gHoAf8C7QHrAf8B5AHnAewB/wHbAa8BkgH/AfUBtQFsAf8B2QGiAW0B/wHbAdcB2AH/AfMB9wH4
+ Af8CxQHEAf8DVgHBCAADQgF1AQABuAHvAf8BAAHoAv8BGgGUAbYB/wGHAaEBgQH/ATkBgwEtAf8BNQGD
+ ASoB/wEvAW0BIAH/AQsBUgEAAf8BCgFNAQAB/wEAAUABAAH/AVoBkAFTAf8BqgGsAbQB/wQAAaUCqAH9
+ AT4BQQE/Af8DAAH/AwAB/wKoAaUB/wKlAZ0B/wIBAQAB/wJRAUYB/wK9AboB/wKRAYkB/wIOAQAB/wIH
+ AQAB/wIBAQAB/wEUARMBDwH/Aa0BtAG5Af8DWgHKA2kB8AT/AfEB7gHyAf8B3QHVAc8B/wHwAcABZAL/
+ AbcBOgL/AaYBFgH/Af4BogEJAf8B/gGhAQcB/wH+AaEBBwL/AZ8BAgH/AfABnAESAf8B2wHNAb0B/wHk
+ AeMB6AH/AfIC6wH/AXIBcAFyAfEDdQH2BP8B5wHaAdYB/wHqAakBZwH/AesBpwFbAf8B2gHDAbcB/wHw
+ Ae0B5gH/AeYBuAGJAf8B7QHnAdoB/wHbAcABswH/AfABwgGZAf8B5gG4AZUB/wHaAc0ByAH/AfQB+AH6
+ Af8DxgH/A1YBwQQAAwoBDQJcAWAB1AEAAeEC/wEAAeAC/wEVAZUBwAH/ASgBVQFLAf8BLwGQATEB/wEG
+ AYEBBQH/AQkBgQEIAf8BEQGCAQ8B/wEQAWQBDAH/AQABMwEAAf8BUwGJAU4B/wGsAa0BtQH/BAABogKo
+ Af0BNAE3ATkB/wEIAQcBBgH/AqwBpQH/Ar0BugH/AiQBFQH/AgEBAAH/AkEBOQH/Ar4BuwH/ApwBmAH/
+ AgkBAAH/AgEBAAH/AwAB/wEPARABDgH/AaoBsgG3Af8DWgHKA18B4AH/AfsB+gH/AfgB9AH1Af8B3wLb
+ Af8B4AHLAasB/wH9AeUBuwH/AfwB4AGzAf8B+wHZAaMB/wH8AdMBlgH/AfsB0AGQAf8B/gHPAYgB/wHk
+ AcABiAH/AdQBywHKAf8BzQHMAbsB/wHiAdsBzwH/A2EB6AN3AfYE/wHuAuoB/wHnAasBgAH/AfYBtAFm
+ Af8B1AGfAW8B/wHjAeIB4wH/AesB4gHQAf8B4QG6AZMB/wHbAa0BiwH/AfcB0wG0Af8B3gGtAY4B/wHf
+ AdkB1wH/AfUB+QH6Af8DyAH/A1YBwQQAA1EBoAEAAZkB6gH/AQAB5gL/AQAB2wH2Af8BMgHmAfwB/wE7
+ AaUB3QH/AUgBggFkAf8BggHEAW8B/wFuAbwBcAH/AW4BvQFvAf8BgQHCAYIB/wFBAZEBQQH/AVYBjAFS
+ Af8BqgGsAbMB/wQAAZ8BpgGoAf0BLAEvATEB/wFrAWoBaQH/A7gB/wICAQEB/wMAAf8CEgEGAf8ClQGN
+ Af8CRQFBAf8DAAH/AwAB/wMAAf8DAAH/AQwCDgH/AagBsAG1Af8DWgHKA0kBhwHIAsIB/wH2Ae8B7gH/
+ AeoC5QH/AcMBtAGrAf8B7gHcAcwB/wHvAeIB1AH/AewB4gHWAf8B6wHjAdcB/wHqAeMB1gH/AeoB3wHQ
+ Af8BxQG2Aa0B/wHgAdcB2QH/Ae4B5AHjAf8BxwHAAb8B/wNOAZgDdwH2BP8B9wH9Af4B/wHkAcABrAH/
+ Ae8BrAFmAf8B8QG6AYUB/wHYAaQBgAH/AdsBtAGbAf8B3QGoAYIB/wHlAcYBpwH/AeYBsQGNAf8B3QG7
+ AagB/wHoAe4B8QH/AfYC9wH/A8kB/wNWAcEEAAJaAV4B1QEAAcgC/wEAAecC/wEAAf0B/gH/AVMD/wGK
+ Ae4B/gH/AWABhgGfAf8BuwHSAbAB/wG3Ac8BsAH/AbgBzwGxAf8BuQHQAbIB/wG2AdABsAH/AacBvgGh
+ Af8BpAGnAawB/wQAAZsBogGnAf0BLQExATIB/wJZAVgB/wO9Af8CigGJAf8CMAErAf8DAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AQsBDAENAf8BpgGuAbMB/wNaAcoDBwEJAz0BaANYAbkDYAHeAagBpQGm
+ Af0B+QH3AfYB/wH1AfoB+QH/AfAB+gH4Af8B7AH6AfkB/wHoAfsB+QH/Ae8C+QH/AZcBjwGQAf4DYQHi
+ A1oBvQNAAW8DCQEMA3cB9gT/AfkB+gH7Af8B9QL2Af8B4wG5AaIB/wHsAa8BgQH/AfYBwAGRAf8B9gHB
+ AZcB/wH1AcsBpwH/AegBsgGPAf8B3gG4AaQB/wHrAe4B8AH/AesB7QHuAf8B9wL2Af8DywH/A1YBwQQA
+ ATMBWAF7AfYBAAHHAv8BAAHqAv8BAAP/AU0D/wGUAfcC/wFdAYQBqgH/AtIBzQH/AdEB1gHRAf8BzwHU
+ AdAB/wHNAdMBzwH/AcwB0gHPAf8B2QLgAf8BnAGfAaIB/wQAAZYBnQGjAf0BPgFBAUIB/wIMAQsB/wOy
+ Af8D0QH/Ai8BMAH/AwgB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wEJAQoBCwH/AaUBrQGyAf8DWgHK
+ DAADDgETA1gBwQT/AfoD/wH1A/8B8gP/Ae4D/wH5A/8DXAHMAxQBHAwAA3cB9gT/A/kB/wH5AvsB/wH3
+ AvsB/wHrAdsB0wH/AecBwQGuAf8B5QG8AaUB/wHlAcEBrgH/AegB1wHQAf8B8AH0AfcB/wHuAvAB/wHr
+ AuoB/wP5Af8DzQH/A1YBwQQAAlcBZQHoAQABywL/ARgBoAG5AfwBWAJfAeMBQwHpAfcB/wGIAfIC/wJW
+ AVgBuwNDAXgDQwF4A0MBeANDAXgDQwF4A0MBeANBAXIEAAGRAZkBngH9AU0BUAFRAf8BJwImAf8DRgH/
+ A0QB/wMwAf8DOwH/AzUB/wMpAf8CHAEdAf8DEgH/AwoB/wECAgEB/wEWAhcB/wGiAaoBrwH/A1oByhAA
+ A1MBpQP9Af8B/gP/AfgD/wH1A/8B8QP/AfgD/wNVAbIQAAN5AfYE/wP7Af8D+QH/AfgC+QH/AfgB/QH+
+ Af8B9QH6Af0B/wHyAfUB+AH/AfIB9gH6Af8B8wH3AfoB/wHvAfAB8QH/A+0B/wPrAf8D9wH/A88B/wNX
+ AcIEAANTAaoBAAHJAv8BOAGCAZIB9wJSAVMBqAEqAcsB7QH/AVkBzQHsAf8DKwFCIAABjwGXAZ0B/QFL
+ AU0BTgH/ATcCNAH/AjoBOQH/ATgCNwH/Aj8BPgH/AUACPwH/AUECQAH/AkIBQQH/AUMCQgH/AkEBQAH/
+ Aj4BPQH/ATsCOQH/ATQCMwH/AZwBpAGqAf8DWQHMEAADVgGrA/0F/wH7A/8B+AP/AfUD/wH6A/8DVwG3
+ AwMBBAwAA4gB+Bz/A/4B/wP9Af8D/AH/A/oB/wP5Bf8D0wH/A1cBwgQAAzsBZQE3AWcBiAH3ATQBYgF7
+ AfYBIgFUAYwB+gFUAWEBagHuAloBXgHVAw0BESAAA38B/gGPAZcBmgH/AV8BYwFmAf8BZgFrAW4B/wFl
+ AWoBbQH/AWUBagFtAf8BZQFqAW0B/wFlAWoBbAH/AWUBagFsAf8BZQFqAW0B/wFmAWkBbQH/AWYBawFu
+ Af8BZAFpAWwB/wFtAYEBhQH/AasBtgG8Af8DWQHHEAADVAGvGP8DWAG7AwQBBQwAA1sBywOlAf4DsQH9
+ A7EB/QOxAf0DsQH9A7EB/QOxAf0DsQH9A7EB/QOxAf0DsQH9A7IB/QOtAf4DagH1AzsBZUAAAlkBWgHP
+ AYoBjQGOAfsBegF8AX4B+gF5AXsBfQH6AXoBfAF+AfoBegF9AYAB+gF7AX0BgQH6AXwBfgGDAfoBfAF+
+ AYMB+gF9AYEBhAH6AX0BgwGGAfoBfgGDAYYB+gF+AYQBhwH6AYMBjgGSAfwCZwFoAfIDOgFiEAADUQGc
+ AX4CfAHzA24B7wNuAe8DbgHvA24B7wF+AnwB8wNSAacDAQECMAADPwFtATkBSAGJAfYCIQEiATEgAAMF
+ AQcDIwEzAzQBVAMmATgDDAEQAwIBA2QAAyABLgM6AWEDNgFZA0UBfwNWAbsDVgGzA0ABcAM3AVoDOQFf
+ AxwBKDAAAzgBXgE2AaIB+AH/AloBXQHKAxcBIBMAAQEDBgEIAwsBDwNBAXIBawJiAe8BXgJbAdkDVQGy
+ A0gBhgMyAVEDGQEjAw0BEQMKAQ4DBwEKAwMBBAgAAVkCVwHCAaIBcAFZAfsBmwFrAU0B+gGNAnIB+gGQ
+ AXUBdgH6AY8CdAH6AY8CcwH6AY8CcwH6AY8CdAH6AY8BcgFwAfoBnwF0AVgB+gGgAW8BTQH6AaIBXwFF
+ AfsBXgJbAdAMAAMDAQQDYAHeAn8BfgH+AYYBWQFYAf0BNwFlAbgB/wEzAbkB8wH/AS4BiAHPAf8BdwFw
+ AX4B/gGOAYMBYwH9AVECTgH9A04BlxwAAzkBYANKAY0BSQJIAYcDNwFbBAADIAEuAVQBYQFyAe4BPgG5
+ AfQB/wNbAcgDFgEeCAADBAEFAyQBNgNEAXkDTAGSAWUCYQHuAf8B/AH9Af8B/ALrAf8BtwGmAacB/QFn
+ AlcB8gNXAd8DWgHKA1UBsgNQAZoDSAGFAzMBUwMLAQ8EAAHSAWwBRQL/AcQBWAH/Ae8BmgFPAf8B0AHE
+ AccB/wHSAssB/wHTAcoBywH/AdcCzgH/AdYCzgH/AdUB0AHTAf8B1AHCAb0B/wH9AbkBjAL/AZ0BNwL/
+ AZcBGAH/AdwBcAE5Af8QAANcAd8BrwGrAaoB/AGcAZYBlQH6AVQBqAG+Af0BagHkAv8BVAG2AfEB/wKR
+ AZUB+wGnAZ0BnAH7AX8CfQH4A0ABcBgAA0gBiAF1AnMB+gGqAqMB/wGKAmYB/wFqAmkB+QJbAVkBwwMo
+ ATwDVAGvAVMB8AL/ASQBbQHEAf8CRQFGAX4IAAMdASoBtQE3AQAB/wH0AU8BAAH/AbsBQAEMAf8B8QHM
+ Ac0C/wLzAv8B9wH2Bv8B9AH1Af8B5wG9AbwB/wGgAUwBRAH/AVoBGQEEAf8BUAEFAQAB/wGSASoBAAH/
+ A1MBsAM2AVkEAAGtAWsBOwH8Af8BtgFSAf8B7QGUAU8B/wHUAcIBxAH/AdoBUQE2Af8B1wGgAZYB/wHb
+ AdcB2gH/AdwBzgHNAf8B2wHTAdQB/wHYAb4BugH/AfMBlAFaAf8B/gGOAS8C/wGPARsB/wG6AV0BQAH9
+ CAADEQEXAxUBHQMpAT8DMwFSAygBPAFTAlUBsAGmAcIB3wH/AkwBXQHzAzoBYgMtAUYDLwFKAxgBIQMV
+ AR0DDwEUDAADKQE+A2cB8gG/AbsBsQH/AawBrQGmAf8BxgK6Af8BrgKUAf8BrwGaAZcB/wNeAdACVQFX
+ AboBVAG3AeEB/gFQAeoB/AH/A1sByAMJAQwEAAG1ATcBAAL/AWUBAwH/Ae8BYwEIAf8BuwFvAWQC/wHo
+ AeYC/wHnAegC/wLvAv8C9gL/AvoG/wL7Af8B8gLPAf8BswFeAVsB/wFuAS4BHAH/AbIBNgEAAf8DSQGJ
+ BAABrAFnATkB/AH/AbsBWAH/Ae8BmwFXAf8B3QHRAdIB/wHmATEBDgH/AeEBnQGRAf8B5QHtAe8B/wHl
+ Ad8B3QH/AuYB6AH/AeABygHFAf8B8gGCAUUB/wH9AY0BLwL/AZgBJAH/AbkBWwFAAf0EAANLAZADXAHn
+ AVwCVQHqAVsCWAHjA1sB4QNaAd4DXQHwAc0BuQG1Af8BcQFhAV4B/ANaAeQDXwHgA10B4gNcAecDYAHr
+ A1gB4wNAAXADFgEfAzcBWwNVAbUBhwFvAaEB/wFZAVQBjAH/AVUBVwGBAf8BugG4AbYB/wG+AawBqwH/
+ AbsBpgGlAf8BwgGsAaIB/wFEAUIBYgH1ATIBjgGtAfsBWQP/AUEBxgH1Af8CRgFHAYAEAAG1ATcBAAH/
+ Af4BbwERAf8BygFVAR4B/wHxAcMBuwH/AfwB0wHKAf8B9wHRAc8B/wHaAaIBpQH/AdkBngGhAf8BqwFQ
+ AVoC/wL0Av8C9QL/Af4B/QP/Af0B/wG5AWABVwH/AbUBNwEAAf8DTAGRBAABrAFnATkB/AH/AbwBWwH/
+ AfABoAFeAf8C5gHqAf8B5QGWAYcB/wHnAcsBxwH/Ae0B+gH+Af8B7QHxAfUB/wHuAfoB/gH/AeYB2AHU
+ Af8B8AFeAS8B/wH9AYoBLQL/AZwBLAH/AbkBWgFAAf0EAAGNAokB+QHyAvAB/wHiAuAB/wHdAtsB/wHc
+ AtkB/wHOAswB/wHTAtIB/wHnAuYB/wHuAuwB/wHyAvEB/wHyAu8B/wH0AvEB/wHkAekB4gH/AccB5gHK
+ Af8B0AHLAcoB/wNXAcUDVgGzAQsBlgHiAf8BAwGQAegB/wEAAYEB6gH/AQABYwHoAf8BIAFQAbwB/wGv
+ AaUBnwH/Ac4BwAG+Af8BzAG4AbIB/wGnAZoBtgH/AS8BbgHNAf8BQQHQAfIB/wFVAfkC/wFdA/8BUQF6
+ AZIB9wMsAUQBtQE3AQAB/wH+AYcBIwH/AcIBZQFSAf8B1QKZAf8B1gGdAZ4B/wHXAaEBowH/AfMC3gH/
+ AfgC7AH/AbYBYAFoAf8B/QHlAeQC/wLsAv8C8wH/AfUBzwHNAf8BjQE7ASYB/wHeAUcBAAH/A0sBkAQA
+ AawBZAE4AfwB/wHAAWIB/wHzAZwBWQH/AegB0gHQAf8B6gHpAecB/wHrAd8B3AH/AesB2QHVAf8B6wHZ
+ AdYB/wHsAeEB2gH/AecBwQG1Af8B7wFEARIB/wH8AYYBKAL/AaABMQH/AbkBWQFAAf0EAAG2ArMB/QHu
+ AvAB/wHSAtMB/wHVAtYB/wHVAtYB/wHDAsQB/wHPAtAB/wH0AfUB9AH/AfEC8gH/AfEC8gH/AfEC8gH/
+ A/MB/wHpAe4B6gH/AdwB7gHgAf8B4gHgAd8B/wNZAccBWwJhAeEBRAF/AYsB9AEvAa8BwAH9ARIBsQHv
+ Af8BCwGhAe8B/wFVAYYBqAH/AakBngGWAf8B0QLGAf8B2wHLAcYB/wG9AacBvgH/AUMBpgHgAf8BVgH9
+ Av8BVwH8Av8BVQH1AfwB/wFLAdsB8wH/AlcBWQHCAbUBNwEAAv8BlQE3Af8B2wFeASIB/wHLAYwBhAH/
+ AfABwgG/Av8B7gHrAv8B/QH8Bf8B+QLmAf8BuAFfAWcC/wHjAeIC/wHpAegB/wGzAVkBVQH/AbMBawE8
+ Af8B8gFPAQAB/wNLAZAEAAGsAWMBNgH8Af8BxQFsAf8B/QGjAVAB/wH3AZkBTAH/AfgBmgFMAf8B+AGX
+ AUgB/wH4AZcBRAH/AfgBlAFBAf8B+AGUAUAB/wH5AY8BOAH/AfwBgQEmAv8BkQEuAv8BoAE1Af8BuQFX
+ AUAB/QQAAacCngH8AeUC5gH/AdsC3AH/A98B/wPfAf8D4AH/AeEC4AH/A+AB/wPfAf8D4AH/A+AB/wPg
+ Af8B4QHgAeEB/wHvAewB7wH/AeEC3QH/A1kBwwMMARADLwFJA10B4gGbAY8BngH/AW4BZgGIAf8BbgFo
+ AW8B/wGfAp0B/wHWAs0B/wHkAdsB2QH/AfsB4gHYAf8BjwGUAckB/wFGAdMB8AH/AYAD/wFbAeAB9AH/
+ AlgBZAHmAjQBNQFVAbUBNwEAAv8BoQFMAv8BawEIAf8B/AHPAakB/wHgAagBjgH/AcoBhgFsAf8B5QGs
+ AakB/wH+AeAB3gL/AfwB+wH/AbkBZAFrAv8B1gHNAf8B8gHBAbwB/wGCASUBGgH/AekBqgFkAf8B9gFQ
+ AQAB/wNLAY8EAAGtAV8BMwH8Af8BzgGTAf8B+AHYAb4B/wH4AdcBugH/AfcB1AG1Af8B9QHSAbMB/wHy
+ Ac8BsAH/AfEBzQGuAf8B8QHJAasB/wHvAckBqQH/AewBzAGtAf8B6AHEAakB/wH7Aa8BVwH/AboBVAFA
+ Af0EAAF5AncB9AH3AvgB/wPxAf8D8AH/Ae4C7wH/A+4B/wHsAu0B/wHqAusB/wPpAf8D6AH/A+cB/wPl
+ Af8D4wH/AesC7AH/Ac8CygH/A1UBsQE9Aj4BagEmAU0BmAH6AQsBWgHCAf8BEAFjAdMB/wEFAVIBzgH/
+ ARwBSgG8Af8BqAGgAaIB/wHkAdkB1AH/AfEB6QHqAf8BsAG2AdkB/wFSAWEBvgH/AScBmgHZAf8BiAH+
+ Av8BnQP/AVgBYgFuAe8CIQEiATEBtQE3AQAC/wGuAWIC/wFrAQgC/wHcAb4C/wHcAb4B/wH+AdkBuAH/
+ AeoBuQGdAf8BzQGJAWsB/wHbAZ0BmQH/AfoB0wHSAf8BvAFjAWcB/wG2AWMBWgH/Aa0BOwEoAf8B/AHB
+ AYwB/wH2AVABAAH/A0QBfAQAAa0BXQEwAfwB/gHTAZ4B/wH1AvgB/wH8A/8B/AP/AfwD/wH6Af0C/wH6
+ AfsB/QH/AfoB9wH5Af8B+QL0Af8B+QHyAfMB/wHpAeYB6gH/AfIBswFlAf8BugFTAUAB/QQAAV0CXAHf
+ CP8B+QL6Af8B9gL3Af8D8wH/Ae4C7wH/AeoC6wH/A+cB/wHiAuMB/wPeAf8B2QLbAf8D1gH/Ad0C3gH/
+ AagCogH/A0gBiAFYAV4BYQHdARQB3gL/AQkB1QL/AQABugL/AQABogL/AUsBmgHfAf8ByAG0Aa4B/wHp
+ AeAB3QH/Ae4B6QHwAf8BQgGMAdQB/wFUAcwB7wH/AYsB5wH3Af8BlwH9Av8BowP/AZgD/wJZAVwBzAG1
+ ATcBAAL/AbsBiAL/AWsBCBX/AfIC5QH/AdICpQH/AaQBPgFHAf8BywGqAakB/wP2Bf8B9gFQAQAB/wMl
+ ATcEAAGtAV0BMAH8Af0B0gGcAf8B9gH1AfIK/wL8Av8B+QH2Av8B9wHyAv8B8wHuAv8B8AHpAv8B8QHr
+ Af8B8AHlAeQB/wHyAbMBYwH/AboBUwE+Af0EAANXAboB3wLVAf8B4wLZAf8B3ALTAf8B2wLRAf8B2gLQ
+ Af8B1wLOAf8B1QLMAf8B1ALLAf8B0wLKAf8B0QLJAf8BzwLIAf8B0ALJAf8B1wLQAf8BZAJfAfsDNAFU
+ AzIBUAM1AVYDVQG1AWwBkAGgAf8BpAHCAdoB/wHDAcoB0AH/AcsBvgG7Af8B8wHuAe0C/wH9Av8BhgGo
+ AeEB/wFvAdsB8wH/AcQD/wG3A/8BRAGtAeIB/wFCAVkBfgH1AlcBXQHfAbUBNwEAAv8ByQGfAv8BsgFn
+ Av8BawEIAv8BawEIAv8BawEIAv8BawEIAv8BawEIAv8BawEIAv8BawEIAf8B/gFrAQgB/wH+AWsBCAL/
+ AWsBCAL/AWsBCAH/AyoBQAMEAQUEAAGtAVwBLgL8AdIBnQH/AfQB8wHxBv8B/AH7Av8B9wH2Av8B9AHx
+ Av8B8gHtAv8B7gHoAv8B7gHnAv8B8wHvAf8B7AHlAeQB/wHwAbIBZAH/AboBUgE9Af0EAANMAZIBtwKh
+ Af8BxgKwAf8BwQKsAf8BwgKtAf8BwwKuAf8BxAKwAf8BxgKzAf8ByAK2Af8BywK5Af8BzgK9Af8B0QLB
+ Af8B2QLLAf8B1gLDAf8BZAJXAfEDHQEqCAADLAFEAVwBWAFBAfgB7AHhAdwB/wHmAd0B2wH/AeUC2gX/
+ Ad8B2QHTAf8BQQFJAV8B+wFJAagBugH9AdED/wHRA/8BjQHHAeoB/wNOAZQDAQECAbUBNwEAAv8B1QG1
+ Av8B1QG1Av8B1QG0Av8B1gG1Av8B1QGzAv8B1QGzFf8BtQE3AQAB/wMqAUADBAEFCAABrQFcAS4B/AH7
+ AdIBnQH/AfMB8QHwAv8C/gL/AfkB9QL/AfUB8QL/AfEB7QL/Ae4B5wL/Ae0B5gL/Ae8B6QL/AfYB8wH/
+ AesC5QH/AfEBswFmAf8BugFSAT4B/QQAAz0BaAGOAn8B/gHKArUB/wHGArIB/wHGArMB/wHIArQB/wHK
+ ArcB/wHLArkB/wHNArwB/wHRAsAB/wHTAsQB/wHXAsoB/wHfAtIB/wHJArUB/wNbAeEDDAEQDAADSgGM
+ AVkCVAH/AZ8ClQH/AbQCswH/AYgBhwGIAf8DVgG4A0MBdwFVAV0BZgHqAd8B/gL/AecD/wHrA/8BUgFt
+ AYoB9wMkATYBtQE3AQAC/wHgAccC/wHgAccC/wHgAccC/wHgAccC/wHgAccF/wG1ATcBAAH/AbUBNwEA
+ Af8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DHQEqAwQBBQMCAQMIAAG3AVIBQAH9AfoB1AGgAf8B8gHv
+ AfAC/wH+A/8B+AH2Av8B9QHxAv8B8QHsAv8B7wHrAv8B8wHuAv8B9QHzAv8B/AH7Af8B7ALqAf8B4AGl
+ AVkB/wG4AU4BNAH9BAADJgE4AW4CYgH2AcYCsQH/AccCswH/AccCswH/AckCtgH/AcsCuQH/Ac0CvAH/
+ AdACvwH/AdICwwH/AdUCyAH/AdsC0AH/Ad0C0QH/AbACnAH/A1YBwRAAAwEBAgM0AVQDQgF0Az4BbAMx
+ AU8DCwEPAwABAQJZAVwCyQH5Av8B+wf/AdEB+AH+Af8DWwHIAbUBNwEAFf8BtQE3AQAB/wMrAUIDBwEK
+ AwMBBAMDAQQDAgEDAwABARAAAdABWAEpAv8B4QGnAf8B9wH6AfMH/wH6A/8B9QL/AfwB8gL/Af4B9gP/
+ AfoD/wH9Bf8B8QH1Ae4B/wHnAbMBYwH/AdMBUgETAf8EAAMQARYBXwJcAeoBwwKtAf8BzwK7Af8B0AK+
+ Af8B0QK/Af8B1ALDAf8B1wLHAf8B2wLLAf8B3gLQAf8B4QLWAf8B6QLeAf8B3QLLAf8BmAKEAf8DTAGS
+ LAACSAFJAYcBMQFfAZUB+wFNAWcBmgH6AU0BYgGZAfoBSQFfAZoB+wFOAVcBZgHvAwEBAgG1ATcBAAH/
+ AbUBNwEAAf8BtQE3AQAB/wG1ATcBAAH/AbUBNwEAAf8DHQEqAwQBBQMCAQMgAAFWAlQBqwGWAVoBMgH7
+ AX4CWQH1AX4CWQH1AX4CWQH1AX4CWQH1AX4BWQFMAfUBfgJZAfUBfgJZAfUBfgJZAfUBfgJZAfUBiAFS
+ AVEB9wGWAVYBLAH7AVgCVgG7CAADUQGcAXgCcQH6AY4ChAH7AYECeAH6AYECeAH6AYQCeQH6AYYCegH6
+ AYkCfAH6AYoCfQH6AYwCgAH6AZICjwH7AX4CeAH8A18B4AMhATAYAAMhATEDQAFwA1ABngMpAT8EAAMK
+ AQ4DEQEXHAADBAEFAxQBHAMnAToDLAFEAygBPQMjATQDHgErAxgBIgMUARsDEAEVAwwBEAMJAQwDBAEG
AzoBYQNZAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNcAc4DWQHD
- AzQBVUQAA1cBwgNEAXs4AANhAeIDewHxA24B7gNuAe4DbgHuA20B7gNsAe4DbAHuA2wB7gNsAe4DbAHu
- A2wB7gNuAfADZQHlBAADYQHuA+IB/wPdAf8D2gH/AtsB2gH/A9kB/wPYAf8D2AH/A9cB/wPWAf8D1QH/
- A9QB/wPTAf8D4AH/A5kB/wNXAb0MAANIAYYBTQFRATIB+gNDAXcsAANcAdQBCwEnATwB/wNJAYkDEwEa
- MAABogKjBf8B9gLwAf8B9gLvAf8B9gLvAf8B9ALvAf8B9ALtAf8B9ALtAf8B9ALtAf8B8gLrAf8B8wLr
- Af8B8gLoAv8C+wH/AaICoQH/BAADiAH3BP8C9AHzAf8B/QH4AfUC/wH2AfMB/wH9AfQB8QH/AfwB8wHw
- Af8B+wHwAe0B/wH5AfAB7QH/AfgB7wHsAf8B9wHtAeoB/wHyAe0B6gH/AecB5gHnAf8D9QH/A8YB/wNZ
- AcMIAAMOARMCXwFdAeABNAHEAU8B/wFHAWoBQQH5AzgBXigAAykBPwE+AVIBaQH3AWUBmgGuAf8DWwHQ
- A0IBdQMGAQgoAAOfAf0B+gLzAf8B6gLiAf8B6QLhAf8B6QLhAf8B6ALfAf8B5wLeAf8B5gLeAf8B5gLd
- Af8B5ALbAf8B5ALaAf8B4gLXAf8B9QLrAf8BngKcAf0EAAN7AfYB/AL7Af8B7gHsAeoB/wG7AcwB2gH/
- AZMBswHLAf8BmAG1AcsB/wGWAbUBywH/AZUBtAHKAf8BlQGzAckB/wGUAbMByQH/AY4BrgHHAf8BqQG6
- AcgB/wHeAtwB/wHuAu0B/wO9Af8DVgHBCAADQAFxAT8BmgE6Af8BTQHpAZIB/wFBAdIBaQH/AUwBZAFM
- AfMDLgFHKAADUQGiAXIBxAHfAf8BmwHkAfIB/wEmAYoBrQH/A0wBkQMCAQMkAAGfAp4C/QL2Af8B9QLt
- Af8B8wLsAf8B8wLsAf8B8gLqAf8B8QLpAf8B8QLpAf8B8ALoAf8B7wLmAf8B7wLlAf8B7QLjAf8B+ALu
- Af8DnAH9BAADewH2Av8B/gH/Ae0B5AHnAf8BTQGzAdgB/wEFAcsB6wH/ARMB0AHtAf8BFgHRAe4B/wEW
- AdQB8QH/ARcB0gHuAf8BGQHSAe4B/wEQAc8B7gH/AToBpAHMAf8B1QHPAdMB/wH2AfIB8AH/A8AB/wNW
- AcEEAAMFAQcBVgFYAVYBvAFQAc8BbwH/AXEB6AGrAf8BYgHoAaMB/wFGAc4BaQH/AVkBYgFWAesDJAE1
- JAADMQFOARIBcgGlAf8BlwHmAfkB/wGGAegB9QH/AUABXQGPAf0DIgEyJAADoAH9AfsC9wH/Ad4C2gH/
- Ad4C2QH/Ad8C2gH/Ad4C2QH/Ad0C2QH/Ad0C2QH/Ad0C2AH/AdwC1gH/AdsC1gH/AdoC1AH/AfgC8QH/
- AZ4CnQH9BAADfQH2BP8B6gHkAeYB/wFSAbsB4QH/ASUB3AL/ASoB3QL/ARIB0wH9Af8BDQHQAfcB/wEQ
- AdQB/AH/ARAB3QL/AQkB3QL/ATgBrgHYAf8B1QHPAdMB/wH3AfMB8QH/A8EB/wNWAcEEAAMuAUgBQwF/
- ATwB/gGJAe4BtQH/AZYB8wHFAf8BigHrAbgB/wFuAewBrwH/AUUBzAFnAf8BVwFcAVcB3wMaASQgAAMI
- AQsDUwGtASMBoQHMAf8BnQHTAd0B/wGqAeIB8AH/A1QBqyQAA6gB/QHSAtEB/wEjAiIB/wIXARYB/wEb
- ARoBGQH/ARcBFgEXAf8BGgIZAf8BHAIZAf8DHAH/ARoCGwH/ARMBFgEXAf8DHwH/AcsCygH/A6gB/QQA
- A30B9gT/AekB5wHpAf8BYQG3AeEB/wFgAdAB/gH/AWAB1QL/AT8BqQHcAf8BRAFiAYcB/wEXAZ8B2gH/
- AQABwQL/AQABvAL/ATUBpQHXAf8B2AHUAdYB/wH4AfQB8gH/AsIBwwH/A1YBwQMCAQMDUAGaAWEBzgGC
- Af8BoQH6AdEB/wFRAc0BawH/AW0B5gGlAf8BlQHzAcgB/wFxAfIBuAH/AUQByAFiAf8BWwFeAVsB0AMU
- ARwgAAMSARgDVgGzAWUBxgHhAf8B8AP/AY4BmgGiAf8DMwFSAw8BFBwAA6gB/QHGAsgB/wEAAgEB/wMA
- Af8DAAH/AgMBAAH/AwAB/wMAAf8DAAH/AwAB/wECAgAB/wMAAf8BvAK9Af8DqAH9BAADfQH2BP8B6QHo
- AesB/wFkAbkB4QH/AW4B1QH+Af8BcAHdAv8BZgGsAcoB/wFgAU0BSQH/ATcBnQHJAf8BAAG4Av8BAAGv
- Av8BNgGiAdcB/wHaAdUB1gH/AfoB9gH0Af8BxALFAf8DVgHBAxwBJwFRAYIBPwH3AZgB/AHJAf8BXgGy
- AXMB/gFYAWEBVQHkAUIBcAFCAfUBYQHjAZgB/wGRAfkBzAH/AXEB9wHBAf8BQAHDAVkB/wFVAVcBVQG3
- AwoBDSAAAwoBDgNPAaUBjQG+Ac8B/wGYAccB4AH/AUABZAF8AfUBWAJcAdEDGgElGAADqAH9AcoBzwHQ
- Af8BCwETARQB/wMAAf8BOAE7ATQB/wG9AbYBlgH/ARYBKAEkAf8BHwElARwB/wEmASIBFwH/AwAB/wFi
- ATABDwH/AwAB/wHCAr8B/wOoAf0EAAN9AfYE/wHmAecB6wH/AWoBuwHiAf8BlwHkAv8BlgHoAv8BkAHH
- Ad0B/wGLAZIBkwH/AWEBvAHeAf8BHAHFAv8BFAHAAv8BPAGmAdgB/wHXAdQB1wH/AfsB9wH1Af8DxgH/
- A1YBwQNHAYIBTwHQAW8B/wFUAdUBdAH/AVgBWgFYAcADAAEBAy0BRQFaAWEBWAHiAUYBywFiAf8BgQH5
- AcYB/wFvAf4BygH/ATkBwAFSAf8DUgGpAwQBBSAAAwoBDgNXAcUBRwGUAbsB/wFFAZgBuwH/ASYBKwEw
- Af8DUAGfAwABARQAA6gB/QHRAswB/wG4AZgBXwH/AWUBZgFQAf8BtgK4Bf8BTgJYAf8BXgFXATwB/wFk
- AWMBSwH/ATcBKwEWAf8BzgFnASYB/wFDARsBBwH/AckBvgG9Af8DqAH9BAADfwH2BP8B8QHwAfEB/wGD
- AbkB2gH/AWIBtwHeAf8BZgG4Ad4B/wFmAb8B5wH/AXQBywHzAf8BVwG7AegB/wFCAa4B4AH/ATgBqgHc
- Af8BXwGqAdEB/wHhAd8B4AH/AfoB9wH2Af8DyAH/A1YBwQFWAWUBVgHpATkB0AFXAf8BWQFbAVkBxAMN
- ARIIAAMcASgBVAFWAVQBqwEvAbQBOwH/AWMB8gGzAf8BZwH/AdAB/wE0AbsBSAH/A0sBjiQAAj4BPwFs
- AYABdAFxAf8BkwEdARMB/wEYAgAB/wEnAQUBAAH/A0ABcBQAAaYCqAH9AdEBzAHKAf8B1wGvAW0B/wH8
- AeEBrgH/AfYC9wH/AfsB/gL/AeQB1wHFAf8BywGvAXEB/wGPAW8BTQH/AcwBkgFBAv8BkQEzAf8ByQFB
- AQkB/wHKAb0BuwH/AaUCqAH9BAADgQH2BP8B+wH6AfkB/wHmAeoB7gH/AZ8BpwGxAf8BogGnAa4B/wGf
- AacBrwH/AcABzAHXAf8BsAG1Ab0B/wGuAa0BswH/AZ8BoQGoAf8B3gHfAeMB/wHuAu0B/wP1Af8DyQH/
- A1YBwQE4AXUBNQH2AVkBXAFZAc8DFAEbEAADBAEFAT0BPgE9AWoBOAF3ATYB9gFOAegBlgH/AV4B/wHS
- Af8BLQG4AT4B/wFFAUYBRQF+IAADAQECA0cBggG+AVsBQQH/AW0BFAEQAf8BEwIAAf8BRwEnASIB+QEs
- AisBQxAAAacCqAH9AdABygHJAf8BzQGhAV8C/wHcAZ0B/wH9AeUBwQH/AfYB4wHNAf8B/gHgAa4C/wHa
- AZoB/wH5AcABawH/AfwBpwFIAv8BgAEoAf8B0AE+AQQB/wHJAbwBugH/AaQCqAH9BAADgQH2BP8D9wP/
- Af4B/wHbAdYB1AH/AbsBtQGyAf8ByQHCAcAB/wG7AbUBsgH/AcwBxwHEAf8BuwG1AbIB/wHQAcsByAH/
- AfcB9QH0Af8C6gHpAf8D9gH/A8sB/wNWAcEDGAEhAxEBFxwAAyQBNgFaAV4BWgHVATcB1AFjAf8BWgH8
- Ab4B/wEpAbcBOwH/AzwBZiAAAwIBAwNTAaoBxgFqAVAB/wFJAQkBBgH/ARoCAAH/AV0CWQHXAxgBIQwA
- AacCqAH9Ac8BygHIAf8BzQGXAU0C/wHLAYUC/wHOAY4C/wHPAZAC/wHNAY0C/wHEAXMC/wG2AVgB/wH8
- AZYBOwH/AfoBZAEcAf8ByAEvAQAB/wHIAboBuQH/AaUCqAH9BAADgQH2BP8D+QH/A/oB/wH5AvoB/wPL
- Af8BuAK2Af8BwQK/Af8BuAK2Af8DxAH/AfAC8QH/Ae4C7wH/A+sB/wP5Af8DzQH/A1YBwSgAAxABFQFP
- AVABTwGbASQBvgE8Af8BUAH1AaQB/wE2AagBQAH9AzEBTiAAAxABFgFcAlkBzAG5AV0BPwH/ASoCAAH/
- AS4BBwEAAf8BUQJQAZ8MAAGnAqgB/QHNAcUBxAH/AdABggEuAv8BuQFTAv8BvwFkAv8BwQFnAv8BvAFe
- Av8BsAFNAv8BmAE3Af8B/QFtASAC/wFIAQQB/wHNARoBAAH/AcYBtgG1Af8BpQKoAf0EAAOFAfYE/wP7
- Af8D+QH/A/oB/wH6AvsB/wPlAf8D1QH/A+EB/wP0Af8D8QH/A+0B/wPrAf8D9wH/A88B/wNXAcIwAAE5
- AToBOQFgAVgBZAFYAeMBOQHdAV4B/wFQAXABUQHtJAADHQEqAWoCWAHpAZ8BSAEmAf8BFQIAAf8BSgEI
- AQAB/wM3AVsIAAOoAf0B1ALLAf8BmAFSASsB/wG0AXEBOgH/AbMBgwFDAf8BtAGGAUQB/wGzAYIBQQH/
- AbMBbQE5Af8BswFfATEB/wGzAU0BJQH/AbUBOAEVAf8BlwEkARMB/wHLAb8BvgH/AacCqAH9BAADkwH4
- IP8D/QH/A/wB/wP6Af8D+QX/A9MB/wNXAcI0AAMdASkBVwFaAVcBxQFJAXABSQHvKAADKgFAAYUBSwFI
- AfYBgAE1ARgB/wESAgAB/wFgAVQBUQHrCAABowKkBf8B2wHcAeAB/wLYAd4B/wLZAd0B/wHYAdkB3QH/
- AdgB2QHeAf8B2AHZAd4B/wHYAdoB3gH/AdgB2wHfAf8B1wHcAeAB/wHZAdwB3wL/AvwB/wOiAf8EAANb
- AcsDrQH+A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9A7UB/QO2Af0DtQH+A24B9QM7
- AWVsAAM7AWQBfQFIATgB9gFZATcBMwH1AVICUQGnCAADXgHdA24B7wFtAm4B7QNtAe0DbQHtA20B7QNt
- Ae0BawJtAe0DawHtA2sB7QFqAmsB7QFrAmoB7gNrAe8DXwHgkwABAQMEAQUDEAEWAykBPwM+AWwDRgGA
- A0QBewM4AVwDIAEuAwoBDQMBAQIMAAFaAl0B0wFMAX8BjAHzAVIBcAF7Ae8BUgFwAXsB7wFSAXABewHv
- AVIBcAF7Ae8BUgFwAXsB7wFSAXABewHvAVIBcAF7Ae8BUgFwAXsB7wFSAXABewHvAVIBcAF7Ae8BUQF7
- AYkB8gFbAl4B2QsAAQEDBgEIAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMH
- AQoDAwEECwABAQMGAQgDCgENAwoBDQMKAQ0DCgENAwoBDQMKAQ0DCgENAwoBDQMHAQoDAwEEEwABAQMH
- AQkDFQEdAzkBXwNTAbACWAFhAeYBXwGQAZkB+wFZAagBtQH9AU4BXQFmAfADWQHSA1IBqQNGAYADJAE2
- AwQBBggAATMBoAHSAf8BKQH7Av8BHwHxAv8BIgHwAv8BIwHwAv8BIwHxAv8BIwHxAv8BIwHxAv8BIwHx
- Av8BIwHwAv8BIwHwAv8BIQHwAv8BJwH7Av8BNwGsAdgB/wQAAwQBBQMkATYDRAF5A0oBiwNKAYsDSgGL
- A0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0oBiwNHAYIDMwFSAwsBDwMEAQUDJAE2A0QBeQNKAYsDSgGL
- A0oBiwNKAYsDSgGLA0oBiwNKAYsDSgGLA0UBfwMpAT8DAwEECAADBAEFAyQBNgNEAXoBXQFeAWEB2gFd
- AXoBjwH8Aa8B1QHjAf8BxAHyAf0B/wG3AfAC/wGqAf4C/wGfAf0B/gH/AYgB2gHlAf8BWgGHAaMB/gFB
- AVIBZQH0A1YBuQM1AVcDCwEPBAABMAF9AbMB/AEZAeIC/wEQAdkC/wESAdgC/wERAdcC/wETAd8C/wEU
- AeUC/wEUAeUC/wEUAeAC/wESAdkC/wETAdkC/wEQAdkC/wEXAeMC/wEyAYMBtwH8BAADHQEqAbUBOwEA
- Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1
- ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DUgGpAzUBWAMdASoBtQE7AQAB/wG1
- ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEA
- Af8BtQE7AQAB/wG1ATsBAAH/A0sBjgMUARsDAAEBBAADHQEqAbUBOwEAAf8B8wFTAQAB/wGVAb8B0wH/
- Ae8D/wHUAfsC/wGpAeYC/wGSAdkC/wGOAesC/wGNAfMC/wGdAf0C/wGrA/8BaQHEAdcB/wFfAR4BAAH/
- A1MBrQM1AVgEAAEyAX0BswH8ATMB4AL/ASYB1QL/ARoB0wL/AQ8B0AL/AQEBngH2Af8BAAGJAeYB/wEB
- AYoB5QH/AQIBmgHzAf8BCQHJAv8BCgHMAv8BBwHJAv8BDQHUAv8BMAGAAbcB/AQAAbUBOwEAAv8BaQEH
- Af8BtQE7AQAC/wGoAVMC/wGnAVIC/wGmAVAC/wGkAU0C/wGiAUkC/wGgAUUC/wGdAUAC/wGbATwC/wGb
- ATwB/wHlAUIBGAL/AZsBPAH/AbUBOwEAAf8DSAGIAbUBOwEAAf8BtQE7AQAC/wFvAQwC/wGvAV8C/wGl
- AU4C/wGkAUwC/wGjAUoC/wGgAUYC/wGfAUQC/wGdAUAC/wGbATwB/wG1ATsBAAH/A1QBrwM2AVkDGwEm
- BAABtQE7AQAC/wFpAQcB/wH7AW0BDAH/AZgBwwHYAf8B2QP/AasB5gL/AYYB0wL/AWkBygL/AW4B3QL/
- AWsB4gL/AYEB6AL/AZEB9wL/AWEBwgHbAf8BagE8ARYB/wHpAU8BAAH/A0gBiAQAATIBfAG0AfwBRQHg
- Av8BOAHWAv8BKQHUAv8BGwHbAv8BAAGAAeMB/wIAAW0B/wIAAWcB/wEAAWMB3AH/AQABxwL/AQABvgL/
- AQABuwL/AQIBxgL/AS0BfgG3AfwEAAG1ATsBAAL/AXMBFQH/AbUBOwEAAv8BsgFmAv8BsQFlAv8BsQFk
- Av8BrwFgAv8BqwFaAv8BqAFUAv8BpwFRAv8BpAFMAv8BogFIAf8B5QFFAR0C/wGiAUgB/wG1ATsBAAH/
- A0sBkAG1ATsBAAL/AWoBBQH/AbUBOwEAAf8BtQE7AQAC/wGvAV8C/wGuAV0C/wGtAVsC/wGqAVYC/wGo
- AVIC/wGlAU4C/wGjAUoB/wHlAUYBHwH/AbUBOwEAAf8DTAGRAxQBGwQAAbUBOwEAAv8BcwEVAf8B+wFt
- AQwB/wGJAb8B2wH/AbkB8AL/AYwB1gL/AVsBxAL/AUwBvAL/AVgBzwL/AVUB0wL/AWAB2gL/AW8B5wL/
- AVABuAHdAf8BagE/ARsB/wHpAU8BAAH/A0sBkAQAATIBfAG0AfwBUAHfAv8BSAHYAv8BNwHTAv8BKwHc
- Av8BDAGvAfMB/wEAAQcBVgH/AQABAgFLAf8BAAGVAeoB/wEAAbsC/wEAAbAC/wEAAa4C/wEAAbkC/wEr
- AX0BtwH8BAABtQE7AQAC/wGIAScB/wG1ATsBAAL/Ab4BhwL/Ab4BhgL/AbwBgwL/AboBcwL/AbcBbgL/
- AbMBZwL/AbABYQL/Aa0BXAL/AaoBVwH/AeUBSQEkAv8BqQFUAf8BtQE7AQAB/wNLAZABtQE7AQAC/wGS
- AS8C/wF0ARIB/wG1ATsBAAL/AboBcwL/AbgBbgL/AbYBbAL/AbQBaAL/AbABYQL/Aa8BXwL/Aa0BWwH/
- AeUBSwEoAf8BtQE7AQAB/wNUAa8DNQFYAwMBBAG1ATsBAAL/AYgBJwH/AfsBbQEMAf8BaQG3Ad4B/wGX
- Ad8C/wFeAcUC/wEzAbAC/wE0Aa8C/wFLAcQC/wE3AcAC/wFHAcoC/wFXAdcC/wFAAbAB4AH/AWoBQwEh
- Af8B6QFPAQAB/wNLAZAEAAE0AXwBtAH8AWQB4wL/AVwB3AL/AUsB2QL/AToB4AL/AQQBawG3Af8CAAEU
- Af8CAAEQAf8BAAFYAaoB/wECAb0C/wEDAbMC/wEAAbAC/wEGAbsC/wEvAX4BtwH8BAABtQE7AQAC/wGV
- ATsB/wG1ATsBAAL/AcgBmgL/AcgBmAL/AcYBlgL/AcQBkAL/AcABiwL/Ab0BhAL/AbkBcgL/AbYBawL/
- AbIBZgH/AeUBTQErAv8BsAFhAf8BtQE7AQAB/wNLAZABtQE7AQAC/wGfAUQC/wGfAUQC/wFrAQYB/wG1
- ATsBAAL/AcMBjgL/AcABiQL/Ab4BhAL/AboBcwL/AbgBbgL/AbUBagH/AeUBTQErAv8BsAFhAf8BtQE7
- AQAB/wNMAZEDEwEaAbUBOwEAAv8BlQE7Af8B/AFuAQwB/wFSAa4B4AH/AWkBzQL/AUwBvAL/AU0BvgL/
- AVsByAL/AW8B1QL/AVsBywL/AUQBwgL/AT8BxgL/ASoBpgHiAf8BcAFKASkB/wHrAVABAAH/A0sBkAQA
- ATgBfQG1AfwBigHqAv8BgAHiAv8BYwHeAv8BVQHlAv8BFwGZAc8B/wEAAQ8BJAH/AQABCgEeAf8BAQGJ
- AcMB/wEbAcUC/wEcAbsC/wEYAbkC/wEfAcMC/wE1AYABuAH8BAABtQE7AQAC/wGhAVAB/wG1ATsBAAL/
- AdMBrAL/AdMBrQL/AdEBqQL/Ac4BpAL/AcsBngL/AccBlQL/AcQBkAL/AcABigL/Ab0BhAH/AeUBUgEz
- Av8BugFzAf8BtQE7AQAB/wNLAY8BtQE7AQAC/wGrAVgC/wGrAVgC/wGTATEB/wG1ATsBAAL/Ac4BoAL/
- AcwBnAL/AckBlwL/AcUBkgL/AcIBiwL/Ab8BhwH/AeUBVAE4Av8BugFzAf8BtQE7AQAB/wNUAa8DNQFY
- AbUBOwEAAv8BoQFQAf8B/gFvAQwB/wFNAaoB4QH/AZQB3gL/AZkB4wL/AZAB4gH+Af8BZAHJAfsB/wFr
- AdAB+wH/AYsB3QH9Af8BmgHiAv8BjQHdAv8BPwGoAeIB/wGmAW4BRwH/AfEBUgEAAf8DSwGPBAABQwGg
- AdIB/wGjAfgC/wGZAe4C/wGGAeoC/wFuAegC/wFbAecC/wE0AcYB7gH/ASgBwgHsAf8BNQHdAv8BPgHQ
- Av8BNwHIAv8BNwHJAv8BRwHYAv8BQAGnAdgB/wQAAbUBOwEAAv8BrgFmAf8BtQE7AQAC/wHcAb4C/wHc
- Ab4C/wHaAbkC/wHYAbUC/wHVAa8C/wHRAakC/wHOAaIC/wHKAZoC/wHIAZcB/wHlAVcBPgL/AcMBjgH/
- AbUBOwEAAf8DRAF8AbUBOwEAAv8BuAFuAv8BuAFuAv8BuAFuAv8BiAEfAf8BtQE7AQAC/wHVAa0C/wHS
- AagC/wHQAaMC/wHNAZ4C/wHKAZkB/wHlAVoBQQL/AcUBkgL/AcUBkgH/AbUBOwEAAf8DQgF1AbUBOwEA
- Av8BrgFmAv8BbwEMAf8BcAGjAbwB/wFCAZ0BzgH/AWABvQHoAf8BlwHaAfgB/wGPAcoB7QH/AZYB0wH0
- Af8BkQHUAfUB/wFdAboB5wH/ATgBlgHKAf8BQgFdAY0B/wHsAbQBgwH/AfUBVAEAAf8DRAF8BAABWQJc
- AcwBXAGIAZ8B+AFPAXcBhwHzAUwBdwGHAfMBTAF3AYcB8wFNAXcBhwHzAU8BewGIAfMBTQF7AYgB8wFT
- AXQBgwHxAVEBhAGaAfcBVgGqAdQB/wFYAZABvQH+AVMBhwGfAfgBWQJdAdIEAAG1ATsBAAL/AbsBiAH/
- AbUBOwEALf8BtQE7AQAB/wMlATcBtQE7AQAC/wHEAZAC/wHEAZAC/wHEAZAC/wGqAVYB/wG1ATsBAAL/
- AfYB7B3/AbUBOwEAAf8DLgFHAbUBOwEAAv8BuwGIAv8BbwEMBf8D/gH/Ab4B2AHrAf8BVQGnAdUB/wFX
- AbAB3AH/AVoBtAHeAf8BRAGYAccB/wGZAbkB0AH/AfAB8QHyAf8D/AH/A/4B/wH2AVQBAAH/AyUBNwQA
- AxABFQMcASgDGgEkAxkBIwMaASUDGwEmAxsBJgMbASYDEgEYA0gBhQG7AacBqAH/A2UB5QMuAUcDDQER
- BAABtQE7AQAC/wHJAZ8C/wGyAWsB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEA
- Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DKgFAAwQBBQG1
- ATsBAAL/AdIBqAL/Ac4BoAL/AdIBqAL/AdIBqAL/AZkBOgH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/
- AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wNAAXEDBwEKAbUBOwEAAv8ByQGf
- Av8BsgFrAv8BbwEMAv8BbwEMAv8BbwEMAf8B/gFvAQwB/wH+AW8BDAH/AfwBbgEMAf8B/QFuAQwB/wH+
- AW8BDAL/AW8BDAL/AW8BDAL/AW8BDAH/AyoBQAMEAQUoAANIAYQB0wHAAb0B/wNhAdoDFQEdCAABtQE7
- AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1ATsBAAH/AyoBQAMEAQUEAAG1
- ATsBAAL/Ad4BvgL/Ad4BvgL/Ad0BuwL/Ad4BvgL/Ad0BuwL/Ad0BuxH/AbUBOwEAAf8DKwFCAwcBCgMA
- AQEEAAG1ATsBAAL/AdUBtQL/AdUBtQL/AdUBtAL/AdYBtQL/AdUBswL/AdUBsxX/AbUBOwEAAf8DKgFA
- AwQBBRAAA0ABbgNYAbwDTgGYAxMBGggAAwgBCwNaAcUB3wHPAdAB/wNYAbwMAAG1ATsBAAL/AeABxwL/
- AeABxwL/AeABxwL/AeABxwL/AeABxwX/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7
- AQAB/wMdASoDBAEFAwIBAwQAAbUBOwEAAv8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNAv8B5gHNBf8BtQE7
- AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFDAABtQE7AQAC/wHgAccC/wHgAccC/wHg
- AccC/wHgAccC/wHgAccF/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DHQEq
- AwQBBQMCAQMQAAM2AVgBkQKJAfsBuAKkAf8DVgG2AyABLwMdASoDUgGnAc4BvgG/Af8BngKPAfwDNwFa
- DAABtQE7AQAV/wG1ATsBAAH/AysBQgMHAQoDAwEEAwMBBAMCAQMDAAEBDAABtQE7AQAV/wG1ATsBAAH/
- AysBQgMHAQoDAwEEAwIBAwMAAQEQAAG1ATsBABX/AbUBOwEAAf8DKwFCAwcBCgMDAQQDAwEEAwIBAwMA
- AQEcAANGAX8BsgKlAf8BxwK2Af8BjwJ/Af4BpAKWAf0B1ALEAf8BwwK5Af8DTAGPEAADAQECAbUBOwEA
- Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFAwIBAxwAAwEBAgG1ATsBAAH/
- AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DHQEqAwQBBSAAAwEBAgG1ATsBAAH/AbUBOwEA
- Af8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8DHQEqAwQBBQMCAQMvAAEBAzcBWgNbAcsBewJ0AfEBewJ5
- AfIDXgHQAzsBZQMBAQIQAAMKAQ4DHwEsAyUBNwMtAUYDOQFfA0IBdANIAYgDTgGXA1IBpgNWAbMDVwG9
- A0EBcxQAAx0BKQJaAVwBzQI9AZgB+QM9AWkYAAM3AVsCQgGJAfUCXQFiAdoDJQE3EAADCAELAzcBWgFc
- AlkByQF5AUQBPQH0AZUBRAEjAfoBkwFBASMB+gF8AUIBNAH1AV0CWgHTAT8CPgFsAw0BEigAAwoBDgM2
- AVkDVQGxA1QBrgM0AVUDDAEQDAACWQFdAdIBMwFiAXkB9gE5AXABiwH4ASIBeQGWAfsBJAF/AbEB/gEf
- AZ0B0wH/ASQBpgHeAf8BJwGxAecB/wEoAboB7QH/ASYBxgH1Af8BIwGsAfQB/wEfATYBfQH8A1QBrwMR
- ARcIAAMeASsCWQFcAcwCIwHxAf8CDwH7Af8CJQGhAfsDPgFrEAADNwFbAjgBjQH2AkQB9wH/AlYB9QH/
- AlkBXwHXAyYBOAgAAxkBIwNWAbMBvQFCARUB/wHQAVcBFQH/AcsBSAEBAf8BwQE6AQAB/wG+AT8BAAH/
- AcIBRgECAf8BwQFCAQMB/wGyAS0BAQH/A1sByAMgAS8cAAMdASoDSAGIA1gB3QGGATkBTwH8AeQBbgGP
- Af8BzAFzAYIB/wFwAk0B+gNTAaoMAAFBAZUBuwH5AaED/wGlA/8BngP/AZkD/wGMA/8BcAP/AV4D/wFL
- AfwC/wE1AfkC/wErAd8B/QH/ARwBqwL/AQABSAHOAf8DWgHYAyoBQQQAAlwBYAHUAisB8wH/AgAB+gH/
- AgAB7AH/AgUB8QH/AiEBowH7Az4BawgAAzYBWQI2AY0B9gIvAe8B/wIwAewB/wJBAfYB/wJmAfcB/wJX
- AWIB3wQAAxgBIgFgAlsB1gHXAWEBJAH/AdgBWgEPAf8BwAE8AQAB/wHIAVgBHgH/AdgBkAFZAf8BugFG
- AQ0B/wGnAS0BAAH/AaoBNAEAAf8BuAE/AQAB/wHCAUABAwH/AWUBWAFXAeUDIwEzDAADBgEIAzsBZANX
- AcIBZgJMAfMBuAFGAV0B/wHkAWkBjwH/Ae0BjwGpAf8B9wGJAaEC/wGgAaYB/wH3AaQBqAH/A1oB3gwA
- AVQBbgF/Ae4BxAP/AcQD/wGzA/8BqQP/AZwD/wGKAfsC/wFsAfYC/wFaAfEC/wFIAfAC/wE1AdsB9wH/
- ARoBrgH7Af8BAAGpAv8BAgFxAecB/wNaAdMDCQEMAk4BewHyAiUC/wIAAfgB/wIAAesB/wIAAecB/wIA
- AesB/wIxAZkB+AI5AToBYAMyAVECPgGHAfQCHgHpAf8CJAHmAf8CMQHqAf8COwH0Af8CbAL/AlEBlgH3
- AwcBCgFVAlMBrQHcAWgBKgH/AdoBWgELAf8BxAE7AQAB/wHEATwBAAH/AesBywGzAf8B+AH/Af4B/wHj
- Aa0BjAH/Aa4BKAEAAf8BrAEyAQAB/wGlAS4BAAH/Aa8BNwEAAf8BwQE/AQMB/wFcAloBzQMPARQEAAMJ
- AQwDWQHHAYkBRgFWAf4BzQFXAWsB/wHkAYMBmAH/AecBpwG1Af8B4AHHAcsB/wHaAckBzAH/AeoBhQGa
- Av8BkwGaAf8B9wGcAaAB/wFbAloB2QwAAVoBZgF0AecBwgP/AccD/wG3A/8BrgP/AaQD/wGZAf4C/wGI
- AfsC/wFqAfYC/wFYAfEC/wFGAe0C/wEzAeQC/wEgAewC/wEgAdwC/wFRAVkBZAHsAxYBHwMxA04BfQHy
- AhoB+gH/AgAB8QH/AgAB5QH/AgAB3wH/AgAB4wH/AhUBtgH9AiEBmgH7AgsB4wH/AhYB3wH/AiMB5AH/
- AjEB7gH/AlUB+QH/AlIBigH0AzgBXgMtAUUBxAFSASEB/wHoAWoBGwH/Ac8BRAEAAf8BywFEAQAB/wHG
- AT0BAAH/Ad8BnwFtAf8B7wHfAdAB/wHVAYUBSwH/AbQBMAEAAf8BsQE2AQAB/wGsATMBAAH/AaUBLgEA
- Af8BtwE+AQAB/wGyAS0BAQH/AT4CPQFqBAADHQEqAYUBUQFSAfcB5gGVAaQB/wHlAb8BxQH/AeUB2gHb
- Af8B5AHjAeEB/wHlAeQB4QH/AeEB0gHVAf8B6wGFAZkC/wGVAZsB/wH1AZcBnAH/AVsCWgHZDAABWgFg
- AWQB3gHIA/8B0gP/AcED/wG4A/8BrgP/AaUD/wGZA/8BiAH7Av8BagH2Av8BWAHxAv8BRwHuAv8BNAHv
- Av8BJwHiAv8BQAFMAXAB8wMhATEEAAMvAUoCUwF+AfECEwH1Af8CAAHqAf8CAAHfAf8CAAHXAf8CAAHb
- Af8CAAHcAf8CCAHXAf8CFwHeAf8CJAHnAf8CQwH0Af8CSAGNAfYDNgFZBAADVAGvAeYBcgEvAf8B4gFV
- AQAB/wHVAUkBAAH/AdIBSgEAAf8ByAE5AQAB/wHOAVsBHgH/AeUBsAGJAf8BvgE3AQAB/wG5ATkBAAH/
- AbUBOQEAAf8BsgE2AQAB/wGsATIBAAH/AaoBMwEAAf8BwAFBAQQB/wFdAlkB0gQAAxoBJQFwAUcBWQH1
- Ae0B0wHXAf8B9AH6AfcB/wH1AfQB8wH/AfgC9QH/AvoB+QH/AfMB5gHqAf8B6wGEAZgB/wH+AZQBmgH/
- AfYBlgGbAf8BWwJaAdkMAAFZAl0B0gHMA/8B2gP/AckD/wHBA/8BuAP/Aa8D/wGkA/8BmQP/AYgB+wL/
- AWoB9gL/AVkB8QL/AUYB8AL/ATcB7gL/ATcBXAGIAfgDLgFICAADMAFMAksBfQHyAg0B8AH/AgAB4AH/
- AgAB1QH/AgABzAH/AgABzAH/AgAB1AH/AhUB3wH/AjIB7gH/Aj8BjQH2AzcBWwgAAWgBVwFWAegB8wGD
- ASsB/wHgAU0BAAH/AdkBTAEAAf8B1QFGAQAB/wHPATwBAAH/AdkBhQFMAf8B9AHvAekB/wHJAVUBGQH/
- Ab4BNgEAAf8BuwE7AQAB/wG0ATgBAAH/AbEBNgEAAf8BqgExAQAB/wHAAUQBAwH/AXkBOAExAfYEAAMa
- ASUBcAFHAVgC9QHcAeAR/wH5AesB8AH/AekBggGWAf8B/gGTAZkB/wH2AZUBmQH/AVsCWgHZDAABWQJb
- AcQBzgH8Af4B/wHhA/8B0QP/AcoD/wHBA/8BtwP/Aa4D/wGkA/8BmAP/AYgB+wL/AWsB9QL/AVkB8wL/
- AUYB9wL/ASoBbQGaAfwDOgFhDAADKgFAAjsBjAH3AgMB5wH/Ah8B6AH/AjcB6gH/AjcB6gH/AiwB5wH/
- Ah4B5wH/AikBngH6AjABMQFNDAABgwFSAUIB9AH4AYQBJgH/AeIBSwEAAf8B3wFOAQAB/wHhAWoBKAH/
- AeEBcwE4Af8B3wGZAWQB/wH3AfgB9gH/AfQB7gHoAf8B3wGmAYMB/wHLAU0BDwH/AcQBQwECAf8BtgE6
- AQAB/wGtATMBAAH/Ab8BQwEBAf8BlQFAASIB+gQAAxoBJQFwAUcBWAH1AfcB3gHiEf8B+QHsAfAB/wHn
- AYIBlQH/Af0BkwGZAf8B9gGVAZkB/wFbAloB2QwAA1YBtgHRAfgC/wHyA/8B2gP/AdED/wHKA/8BwAP/
- AbgD/wGuA/8BpAP/AZgB/gL/AYgB+wL/AWsB9wL/AVgB/gL/AScBfwGyAf4DRgGADAADMgFQAikBkAH5
- AjcB9AH/AoUC/wKPAv8CjgL/AocB/gH/AkwB9QH/AioBrQH8AzgBXQwAAYMBUgFCAfQB+wGCASIB/wHo
- AVQBAAH/Ae4BlwFVAf8B7wGpAXMB/wHrAZsBYQH/Ad4BjQFSAf8B4gGwAZMB/wHwAeMB3AH/AfwD/wHe
- AaYBhQH/Ac8BTgERAf8BygFKAQ4B/wG1ATcBAAH/AcEBRgEBAf8BlQFDASMB+gQAAxoBJQFvAUUBTAH1
- AfYB3gHhEf8B9wHiAegB/wHrAYEBkwL/AZgBngH/AfcBlQGZAf8DWgHYDAABUgJUAaYB2QH4AfsB/wH2
- AfoB8gH/Ae0B/wH9Af8B3gP/AdAD/wHKA/8BwQP/AbcD/wGtA/8BpAP/AZgB/gL/AYgB+wL/AWsD/wEl
- AagB2gH/A04BmAgAAzcBWwI6AY0B9wJAAfoB/wKTAv8CoAL/ApYB/QH/ApUB/QH/Ap8C/wKWAf4B/wJf
- AfsB/wItAZ8B+wM+AWsIAAFpAlgB5gH8AZIBOQH/AfgBpgFjAf8B9gG7AZcB/wHyAa0BgQH/AeoBmwFg
- Af8B4wGJAUsB/wHgAXIBOgH/AdYBdAFDAf8B9QHtAecB/wHyAeQB2gH/Ac8BXgEoAf8B0wFVARoB/wHH
- AUgBCwH/Ac0BUQELAf8BeQFEAT0B9AQAAxoBJQFvAUYBTAH1AfYB3wHjBf8B/QH6AfsB/wH4AeAB4wH/
- Ae8BrgG2Af8B4AFwAY8B/wHgAWYBhAH/Af0BkgGWAf8B9wGTAZgB/wNaAdUMAAJPAVEBnAE6AU8B2wH/
- ASUBJwHBAf8BWwFmAcEB/wHXAu0B/wHeA/8B0gP/AcoD/wHAA/8BtwP/Aa4D/wGkA/8BmgP/AYwD/wE0
- Ab8B5wH/A1QBqwQAAzYBWQI5AYkB9gJRAfwB/wKqAv8CtAL/ArAB/QH/AjIB7AH/AisB6gH/AqsB/QH/
- ArMC/wKsAv8CgQH9Af8CMgGlAfsDPgFrBAABUwJSAagB7wGpAWoC/wHVAbMB/wH7AcABmAH/AfEBrAGA
- Af8B3wGkAYIB/wHdAakBjAH/AeUBlAFaAf8B3wGEAUQB/wHsAdEBwgH/AfYB8AHsAf8B0gFsATgB/wHS
- AV0BIwH/AdgBWgEeAf8B4wFaARgB/wFeAlwBzgQAAxoBJQFvAUcBVwH1Ae0BywHPAf8B7wHGAcgB/wHg
- AYsBkgH/Ac0BXAFrAf8BqgFIAWQB/wFqAT8BaQH/AUIBMwFjAf8BkwFCAVsB/wHoAWQBcAH/AWcBSgFM
- AfIDOQFfAwYBCAQAAlgBYgHjARUBFAHzAf8CAAHjAf8CAAHCAf8BaAFzAcQB/wHsAf0B+wH/Ad8D/wHX
- A/8B0QP/AckD/wHCA/8BuQP/Aa4D/wGlA/8BRwHZAfIB/wNYAcADNwFaAkUBfwH0AlwB/QH/ArsC/wLI
- Av8CxAL/AkIB9AH/AhcBlgH7AigBkAH4AkEB8QH/AsEC/wLGAv8CvwL/ApQB/gH/AkQBmgH4Aj0BPgFq
- AykBPgHKAW0BPwL/AdkBtAL/AcsBpgH/AekBpQFvAf8B6QHPAcEB/wH2AfUB9AH/AdYBiAFRAf8B2wGI
- AVAB/wH3AfEB7QH/AecBygG5Af8B0wFmAS8B/wHXAWkBMwH/Ae4BbwEtAf8BzwFGARIB/wM7AWMEAAMa
- ASUBcwJSAfQBzQFfAWUB/wGvAUsBWwH/AYEBQwFlAf8BQgFBAYEB/wEVATsBhQH/AQQBOQGGAf8BDAFL
- AZYB/wE0AYYBtgH/AZgBqgG/Af8BxwGHAZ4B/wFiAS8BRgH7A0ABcAQAAisBuQH8AScBKAHyAf8COQHr
- Af8CAAHeAf8BPgFCAcoB/wH0Af8B9AH/AewD/wHRA/8BuAP/AZkB9QL/AW8B6gH8Af8BVAHaAfYB/wFA
- AbcB0QH9ATIBlgHCAfsBNgFzAZcB9gNKAYsCSAF7AfYCYwL/AtQC/wLfAv8C0wL/AlIB9wH/AjsBfwH0
- AzMBUwMtAUUCRAF9AfICVwH0Af8C0gL/AtkC/wLWAv8CqgL/AkMBmwH7AwYBCAFSAlABowHoAagBbwL/
- AdwBuAH/AfUBvgGVAf8B3gGrAY4B/wHwAeYB4wH/AeUBygG7Af8B7AHZAdEB/wHqAdoB0gH/AdQBhwFT
- Af8B3QGBAUMB/wHtAYoBRQH/AewBawErAf8BWwJZAcMDDQERBAADGgElAV4BRAFZAfUBSAFAAWgB/wEZ
- AUQBcgH/AQABTwGkAf8BAAFSAaoB/wESAXABvAH/ATcBpwHaAf8BWAHTAfUB/wFuAfIC/wGBAfsC/wGP
- Ae0C/wJcAYUB+AMvAUoEAAIiAZoB+gIMAe4B/wEjASIB+AH/AQ4BCwHqAf8BQAFHAbcB/QFlAX8BkgH0
- AVkBbgF8AewBXAFjAWgB4gFZAlwBzANWAbMDUAGdA0UBfQM5AV8DMAFLAyABLgQAAlkBXAHJAlAB7QH/
- AskC/wLtAv8CXgH7Af8CMgGFAfYDNgFZCAADLwFKAkcBfgHxAmkB+AH/AusC/wLeAv8CiwHzAf8CWgFe
- AdUEAAMWAR4BWwJYAcsB6QGoAXAC/wHeAbgB/wH2AcEBmgH/AeABpQGDAf8B5gG7AaQB/wHiAa8BlAH/
- AdoBjgFZAf8B7AGZAVwB/wH5AaABXQH/AewBgQE7Af8BYAFaAVgB3gMfAS0IAANFAX0BVgGeAdgB/gEm
- AZoB1wH/AQUBagHBAf8BFQGcAeAB/wE2Ab4B7gH/AVUB4AH+Af8BaAHwAv8BbQHpAv8BbAGxAdoB/gFY
- AWsBfgHvAVYCWAG5Ay8BSggAAk8BUAGbAhoBmAH8AScBJQHBAf4CWgFhAdwBMAIxAU0DGAEhAxEBFwMJ
- AQwgAAMWAR8CWQFbAcMCTwHrAf8CXQL/AjYBgQH2AzcBWxAAAzADTAF+AfEChwH9Af8ChAHyAf8CWQFc
- AcwDHgErCAADFgEeAVUCUwGtAc4BcgFDAf8B9AG8AZEC/wHIAZsB/wH9Ab0BjgH/Af0BtQGFAv8BswGA
- Af8B9AGdAV0B/wHQAV4BLQH/AVgCVgG8AxwBKAwAAVkBZAF4AesBlgP/AYMB+gL/ATABaQGoAfoBPgF4
- AaQB+AFaAekC/wFSAcUB9gH/AUYBcAGSAfUCWQFbAcQDQAFxAxEBF1QAAxYBHwJZAVsBwwJBAXsB9AI1
- ATYBWBgAAzABSwJKAXsB8gJZAVwBzwMdASkQAAMHAQkDLwFKA1YBtgFzAVgBTQHvAaABVgFGAfoBnwFS
- AUMB+gF+AVMBTwHxAVsCWQHEAzYBWQMKAQ4QAANDAXcBWQFcAV8BzwFSAYUBrQH3AkgBSQGHAzsBZAFZ
- AV0BYAHXA0sBjgMhATBQAAM4AV4BUwFZAXYB6wJVAVcBugM6AWEDWQHHA1kBzANaAcoDWgHKA1oBygNa
- AcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDXAHOA1kBwwM0AVUMAAMcASgDVAGrAzMBUjQAAxEBFwM4
- AV0DTgGZA1YBswNWAbwDVgG7A1UBsgNOAZQDNAFUAwwBEDwAAzQBVAFGAVgBewHvAS8B0QL/AVMBcAGG
- AfEDYQHuA+IB/wPdAf8D2gH/A9oB/wPYAf8C2wHaAf8C3wHaAf8C3QHaAf8C2AHXAf8D1QH/A9QB/wPT
- Af8D4AH/A5kB/wNXAb0IAAMYASEBWgFbAVgB4QERAYABNgH/AUwBUwFQAe0DKwFDKAADAQECA0MBdwFl
- AV4BWwHlAawBaQFKAf0B0QFoAR4B/wHgAW8BHwH/AegBcwEhAf8B6AFxASIB/wHbAWsBIgH/AboBVgEY
- Af8BcwFFASEB+gFbAVkBWAHZAzgBXRQAAyMBMwNHAYIDIAEuAwEBAgMGAQgDDAEQAwMBBAQAAzIBUQFG
- AVgBfwHvAS0BzQL/AUEBigGtAfkCPAE9AWgDiAH3BP8D9AH/A/MB/wLxAfMB/wL4AfMB/wLxAegB/wLe
- Ad8B/wPeAf8C6QHhAf8C8QHoAf8C7gHqAf8C5gHnAf8D9QH/A8YB/wNZAcMEAAMSARkBWgFbAVgB4QEl
- AU8BAAH/ASUBgAFVAf8BAAGmAagB/wFMAVIBUAHtAy0BRiQAAVACTwGbAbcBfwFSAv4B4wHCAv8B0gGl
- Af8B6AFoAQQB/wHnAXIBHwH/AfABhgEsAf8B9gGSAUMB/wH1AZoBUgH/AfABmAFTAf8B8gGVAUYB/wHT
- AWABEAH/AVMBOwEwAfcDOwFkDAADBAEGA1cBugHoAbgBugH/AWQCYQHkA1QBrgNcAckDYAHeA1kBvgM/
- AW8BWgJcAc0BcAHoAv8BPgGLAawB+AM9AWkEAAN7AfYD+wH/A+oB/wLqAesB/wLxAewB/wLUAdwB/wJI
- AdQB/wImAecB/wJEAeQB/wJpAdcB/wKkAc0B/wPQAf8C5QHfAf8D7QH/A70B/wNWAcEDFAEbAVkBWwFY
- AdkBJwFUAQcB/wE8AVEBEAH/AS4BPAEAAf8BFwFvAVgB/wEAAZ4BpwH/AUkBUwFNAe4DLQFGIAABpgF6
- AU8B+gH4AcgBkQH/AfYB2gG5Af8B7wHDAZgB/wHVAWkBFwH/AdYBkwFSAf8B3gGdAWAB/wHgAZoBXQH/
- AdIBjAFQAf8B4AGTAVMB/wHtAaABXwH/AfUBjwEzAf8BzgFUAQAB/wNWAbsMAAMzAVIBswKRAfsB9gL6
- Af8BwAG5AboB/wHIAb0BswH/AeoB4QHRAf8B8AHnAdYB/wHaAdIBwwH/AZUBkAGHAf8BoQGeAZAB/wJf
- AWMB2wM7AWMIAAN9AfYD/AH/AuwB7QH/A+4B/wL4AegB/wJyAdoB/wIAAfkB/wIAAv8CAAL/AhYC/wJF
- AfYB/wJzAdgB/wLEAc4B/wL1Ae8B/wPAAf8DVgHBA1gB3QEUAUIBAAH/AT0BSAEOAf8BQAFPARQB/wE+
- AVIBLAH/AVkBZQEsAf8BJAGFAV4B/wEAAZsBrAH/AUsBUgFQAe0DLQFGHAABzQGZAX8B/gHzAc4BqgH/
- AfQB2wG+Af8B7AHEAZ8B/wHOAXQBMQH/AdoBoQFkAf8B3AGpAYEB/wHcAaYBdAH/AdkBlwFZAf8B3QGN
- AUYB/wHfAZMBTQH/Ad8BjQE7Af8B0QFdAQAB/wNYAcAIAAMBAQIDVQGwAfUB3gHgAf8BxAHFAcYB/wHN
- AccBugL/AfYB3AL/AfMB2wL/AfIB2wL/AfgB4QH/AfkB7QHWAf8BmQGUAYEB/wNEAXoMAAN9AfYD/QH/
- Au0B7gH/AvUB8QH/AusB4gH/AkMB4QH/AgAB/gH/AgAC/wIAAv8CAAL/AgYC/wI5Af0B/wJ0AdYB/wPk
- Af8CxwHEAf8DVgHBA1oB2wEnAUQBAgH/ATgBPQEEAf8BPgFEAScB/wJJAVIB/wFbAmkB/wFVAWYBKAH/
- ARcBcQFZAf8BAAGUAaoB/wFGAU0BSwHvAy4BSBgAAccBkAF1Af4B/QHrAdkB/wH9Ae4B3gH/AfIB0AGt
- Af8B2wGWAUkB/wHbAaYBaQH/AdYBpQFvAf8B4gGvAYUB/wHiAaUBZAH/AdwBkAFEAf8B3gGVAUgB/wHb
- AYsBLgH/Ac0BWQEAAf8DVgG+CAADMAFMAZICewH1Ae8B4gHlAf8BwgG6AbUB/wH5AecBygL/AegByQL/
- AeEBvwL/AeABvwL/AeQBxQL/AfQB1wH/AdABxwGuAf8DWgHYATYCNQFYAxABFQQAA30B9gL+Af0B/wLy
- AfAB/wL4AfIB/wLoAeMB/wJCAeQB/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wI0AekB/wLLAd8B/wLO
- AcQB/wNWAcEDEAEWA1sB1gEwAVEBDQH/AWkBZQFVAf8BUwFQAVMB/wJNAVIB/wFYAWYBZwH/AU4BZQEj
- Af8BJgGGAWQB/wEAAYwBnwH/AUkBUQFKAe4DKwFDFAABvwGnAWEB/QH/Ae0B2AH/AfwB6wHbAf8B/gHk
- AckB/wHvAbsBiAH/AewBtgGAAf8B1AGjAWcB/wHWAawBgwH/AecBtAGBAf8B8QGqAVkB/wHmAaABTwH/
- AdsBjQExAf8BzQFaAQAB/wNWAb4EAAMHAQoDVQGtAfkB1gHTAf8B5wHVAdYB/wHUAcYBuwL/Ad8BtgL/
- AdMBpAL/AdABngL/Ac4BnQL/Ac8BoQL/AeEBuAH/AeQB0AGxAf8BkwGEAXQB/wHMAZEBiQH/AVsCWAHL
- AykBPgN9AfYD/QH/Au0B7wH/AvcB8wH/AvEB6gH/AmcB5QH/AgMB/QH/AgAC/wIAAv8CAAH7Af8CAAH4
- Af8CAAH1Af8CRwHfAf8D6gH/AsoBxgH/A1YBwQQAAw8BFANaAdUBOAFeARkB/wFrAWwBVgH/AWMBXwFj
- Af8BYAFeAWgB/wFbAWYBYQH/ATcBXwEAAf8BGgGAASoB/wEAAZsBagH/AUsBUwFRAe0DLgFIEAABvwGn
- AWAB/QH/AesB1gH/Af0B7AHaAf8B/QHnAdAB/wHhAbsBkwH/AecBvAGPAf8B3gGxAYMB/wHSAbIBkgH/
- AdgBrQGAAf8B5AGbAUgB/wHgAZcBRQH/Ad8BhgEgAf8BzwFbAQAB/wNWAb4EAAMuAUcBngGFAYQB9wH/
- AeoB3gH/AecBzwHMAf8B0gG/AbYC/wHPAZ4B/wH+AcsBmAH/Af4BzQGgAv8B0QGjAv8BzgGcAv8B1QGf
- Af8B3QG3AY4B/wGPAY0BigH/AfoD/wHqAagBpAH/AUACPwFvAoEBfwH2AucB/AH/ApsB3QH/AtgB6QP/
- AfEB/wKdAeYB/wIzAfwB/wIXAv8CEAHyAf8CbwHhAf8CoQHfAf8CrAHeAf8C3wHhAf8C+QH0Af8DxgH/
- A1YBwQgAAwoBDgNbAdYBNAFhARIB/wFwAXEBWgH/AW0BagFsAf8BNwFaARsB/wE5AWYBGQH/AVgBhwEo
- Af8BKAGkAWUB/wEAAacBqwH/AUsBUwFQAe0DLQFFDAABwQGoAWAB/QH/AesB1AH/AfwB6wHbAv8B6wHT
- Af8B8gHWAbQB/wHiAcIBnwH/AecBwgGbAf8B2AGzAYsB/wHdAaoBagH/AeMBnAFJAf8B4QGaAUgB/wHg
- AXIBDwH/AdEBWQEAAf8DVgG+BAADVwG6AdwBsAGoAf8B2wGyAagB/wHLAaEBngH/AbcBqAGnAf8B8wHE
- AaMC/wHSAaoB/wH8AdgBvAL/Ad4BwQL/AeQBvwL/AdcBpAH/AbQBjwFmAf8BoAGjAaUC/wHxAfAB/wFg
- AlwB1AMYASICgQF/AfYC+QL/AsQB6AH/Ar4B2gH/AtgB6gH/AocB8AH/AlIC/wIpAfsB/wKCAeIB/wL+
- AecB/wL9AesB/wL3AeoB/wLrAegB/wP0Af8DyAH/A1YBwQwAAw8BFANZAdcBOAFnARYB/wFCAWUBHAH/
- ATcBYgEcAf8BXwJhAf8BZQGAAYEB/wFTAYkBJwH/ARQBmAFUAf8BAAGeAakB/wFLAVIBUQHtAysBQwgA
- AbwBiQFqAfwB/wHqAdAB/wH9AesB2AL/AeYBywH/Af4B1QGpAf8B8QHDAZsB/wHpAbUBiQH/AeIBnAFS
- Af8B9AGmAVMB/wH4AakBUgH/AecBnwFKAf8B3wF0ARIB/wHQAVoBAAH/A1YBvgQAAWMCYQHkAccBngGb
- Af8B5AHIAccB/wHzAuYB/wHUAdUB1wH/AcQBtAGsAf8B8gHJAa0C/wHfAcgC/wHeAcsB/wH7AdoBvAH/
- AcwBpgGLAf8BjgGDAYEB/wHkAeMB5QH/AcgCqAH9A0ABcAQAA4EB9gb/AfkB/wLbAeUB/wKNAdIB/wKG
- AfYB/wJeAv8CLQH2Af8CqwHnAf8C/AHtAf8C7AHtAf8C6gHrAf8D6AH/A/YB/wPJAf8DVgHBEAADCgEO
- A1oB2AEiAWkBAAH/AW8BiAFYAf8BbwFmAXAB/wFUAVIBWQH/AVYBaAFlAf8BSgGIASIB/wEYAZkBWwH/
- AQABlQGrAf8BSwFTAVEB7QM0AVUEAAG8AYwBbQH8Af8B6gHPAf8B+QHOAacB/wH4AcoBpAH/AesBvAGY
- Af8B5QG7AZ4B/wHrAcQBqgH/Ae4BwQGhAf8B6gGyAYsB/wHvAagBawH/Ae8BkgFBAf8B7QGAAQ4B/wHR
- AV0BAAH/A1YBvgQAAy0BRgNTAaoBoQGCAYAB+QHvAcMBwAL/AekB5wH/AdUB1AHVAf8BvwG0Aa8B/wHO
- AbIBpQH/AdABrQGgAf8BtgGWAYsB/wGdAZEBkAH/AdUByQHLAv8B7QHrAf8BXQFaAVkB0gMSARgEAAOB
- AfYE/wP4A/8B+wH/AsYB4gH/AooB2wH/Ao4B9gH/ApIB8AH/AuIB7gH/AvQB7wH/A+0B/wPrAf8D6gH/
- A/cB/wPLAf8DVgHBFAADCgEOA1sB1gE7AYgBHQH/AXABhwFaAf8BWQFVAVgB/wFHAUQBTwH/AU8CWwH/
- ATYBhQEGAf8BHAGgAUcB/wEOAZUBNQH/A1MBqgQAAb0BjgFsAfwB/wHBAYkB/wHPAYkBRQH/A98B/wHP
- AdUB2wH/AcEBxgHJAf8B4AHkAegB/wHVAdwB4gH/AcEBzAHVAf8B0QHbAeAB/wHYAcABsgH/AdkBaAEn
- Af8B4gFmAQsB/wNXAb8IAAMHAQkDJgE5A1ABngF2AmIB7wHrAbcBtAH/AesB1gHVAf8B2wHXAdYB/wHS
- AtcB/wHKAbABswH/AecBvwG6Av8B8gHrAf8B6gGwAasB/wNEAXoIAAOBAfYE/wP5Af8C+QH4Af8C/QH6
- Af8CywHgAf8CxwHcAf8C+wHyAf8C9gHzAf8C7wHwAf8D7wH/A+0B/wPrAf8D+QH/A80B/wNWAcEYAAMR
- ARcBWQFdAVkB1wE4AYwBGQH/AWUBcQFOAf8BTAFDAU4B/wFIAV4BOwH/AVEBpQEqAf8BJQGfAQAB/wFa
- AVsBWgHhAx0BKgQAAb8BggFRAfwB7AGUATsB/wGtAWUBMgH/AcUBuwG0Af8BzwHLAcgB/wHeAeYB6gH/
- AdwB4wHoAf8BuwHAAcQB/wGeAYIBaAH/AagBgAFjAf8BogFzAWcB/wGbATsBFwH/AekBawEgAf8DVgG+
- FAADIwE0A0wBkwFhAl8B2wHmAbABrQH/AfoB5gHkAv8B7QHuAf8B/AHDAb0C/wHdAc8B/wFiAV4BWgHd
- AxMBGggAA4UB9gT/A/sB/wP5Af8C+gH5Af8C/AH7Af8CrAHPAf8CugHUAf8C+QH2Af8D8QH/A+8B/wPt
- Af8D6wH/A/cB/wPPAf8DVwHCHAADBwEKA1sB1gE1AY0BGAH/AU4BgAErAf8BYgGtAUAB/wFBAbABKgH/
- AVoBWwFaAeEDFQEdCAABZAFfAVgB3QH1AbEBZAH/Ad4BigE2Af8B0gFjAREB/wG/AWMBJQH/AcoBsQGg
- Af8ByAG1AagB/wGrAWsBRwH/AZ8BMQEAAf8BmwEhAQAB/wGXASEBAAH/Ac0BVQEcAf8BuQFuAS0B/gNB
- AXMcAAMdASkBRwJGAYADYQHaAeABqAGnAf8B/QHOAcwB/wHnAZ0BlgH/A0ABcAwAA5MB+BT/AvgB/AH/
- AvMB+gP/Af4B/wP9Af8D/AH/A/oB/wP5Bf8D0wH/A1cBwiAAAw8BFAFaAV4BWgHVAScBnAEJAf8BJQGW
- ARYB/wFZAVsBWQHZAxYBHwwAAyUBNwFmAWIBXQHgAfMBqgFWAf8B8wGfAUcB/wHpAYkBLQH/AdUBcQEq
- Af8BywFmASUB/wHLAVkBEgH/AcoBXAEcAf8B0QFjASQB/wHbAW8BLAH/AZoBXwE+AfgDTAGTKAADGgEk
- AUACPwFvAV8CXgHZAVwCWQHMAxMBGgwAA1sBywOtAf4DtQH9A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9
- A7UB/QO1Af0DtQH9A7YB/QO1Af4DbgH1AzsBZSQAAw0BEgFaAWEBWgHcAVoBXAFYAdwDEAEWFAADDQES
- A0MBdwJbAVkBxAFvAWQBXAHnAY4BbQFRAfQBpAF4AUIB+AGTAWsBSAH2AXwBYQFUAe4CYAFbAdYBUQJP
- AZwDJwE6EAADIwEzA1YBuQNUAasDEQEXAxABFgMgAS4DAQECIwABAQMEBAUBBwMMARADHQEqAysBQwMv
- AUkDJQE3AxYBHgMSARkDIAEuAy0BRQMyAVADMgFRAy4BSAMiATIMAAMGAQgDUAGkA1kBzwNcAc4BVgFX
- AWUB6AFHAVkBdwHyA1sB4QNZAcwDWwHQA0gBhBgAAwQBBgM0AVQDVgGzAXQBZAFaAecBgwFiAVgB7wGD
- AWMBWAHvAXIBXwFXAegBVwJWAbgDNgFZAwcBCRAAA10B0gG1ApoB/wFyAl0B/wNQAZ4DWgHbA1kB5QMf
- ASwgAAMDAQQDCgENAxEBFwFAAj8BbgFhAVwBWgHcAWIBWgFWAeQDWQHDA0IBdQM1AVYDRAF8AV0CWQHX
- AZ4BbQFRAfcBoQFyAUEB+AFlAV4BWAHlA1QBqwNAAXEMAAMYASEBkgKNAfoB3gHOAcgB/wGtAbEBzgH/
- AVQBwgH5Af8BYwHgAv8BhwGpAeAB/wHkAc4BwwH/AckCwgH/A1UBshQAAxIBGAFTAlIBqAH2AYoBVgH/
- AfABvwGrAf8B4wHGAcAB/wHVAcABvgH/AdMBvwG9Af8B5AHGAcAB/wHvAcABrQH/AfYBjwFbAf8DVQGy
- AxgBIQwAA1kBxwHIAbMBsgH/AaABhwGGAf0BXwFWAVQB+wFsAmkB/wFfAlkB/gNXAd8DWQHJA1oBzQNa
- Ac0DWgHNA1sB0ANZAckDRQF9AwYBCAMiATEDMAFMAzEBTQJcAVoBzQH+AcYBpgH/AewB0AHFAf8B1gF/
- AUsB/gNSAakDSgGMAXkBYQFTAe4B9gHCAaUB/wHXAsYB/wHVAcUBxgH/Ae8ByAG0Af8BrAFzAU0B+gNO
- AZkIAAMEAQYDEAEWAz4BawNEAXkDQgF0AWIBdwGEAfMBcQGlAcoB/wNXAcUDPwFtA0UBfQMhATADCQEM
- AwYBCAgAAxIBGAFbAlkBwwHzAakBhQH/Ac0BtgGuAf8BxgG8Ab8B/wHyAeoB7QH/AcsBxgHIAf8BxgHC
- AcMB/wH0AewB7gH/AccBvgHCAf8ByAGyAa4B/wH0AbABjQH/AVsCWAHLAxUBHQgAAw8BFANIAYQDVgG7
- AXoBfAF/Af4BcgGTAaAB/wFzAaMBrwH/AagBnwGtAf8BwQGOAZoB/wHOAXABgwH/AdYBZgFsAf8B4QFy
- AXQB/wHgAW8BcwH/AeABbwGBAf8BXwFAAUIB/QNEAXoDGgElAycBOwMnATsDSAGEAekBmwFgAf8ByAHF
- AdAB/wHqAbsBpAH/AV4CXAHOAVYCVQGxAfEBrwGJAf8BxgHBAcoB/wHcAbwBrgH/AeEBuwGpAf8BxAG8
- AcQB/wHrAb8BqgH/AV0CWAHRBAABSQJIAYgDXAHnAVsCWAHpAVwCVwHfAWECXAHcA1sB2QGTAY0BjAH7
- AbgBogGeAf8BXQFaAVkB7QNbAdkBXgJYAd0DWgHkA2AB6wNbAeEDOgFiAwgBCwFUAlIBpgH2AaUBaQH/
- AdYBvQHDAf8BtAGwAdYB/wLcAdkC/wH+AfwB/wH3AvUB/wL1AfQC/wH9AfwB/wPdAf8B2gHTAdcB/wHg
- AcgBxQH/AfMBpQFwAf8DVQGyAwoBDQQAA1IBqAFgAWQBZgHsAYoBlAGXAfsBtAHiAesB/wG0AfMC/wGr
- Af4C/wGUAfcB+gH/AZEB2wHkAf8BjgGzAcAB/wGGAYEBkwH/AWgBOAE7AfwBZAJSAe8B0AJWAf8B3gFz
- AXQB/wNWAbMHAAEBAwcBCQMPARQBXAJaAc0B4gHDAbYB/wHSAcoB0QH/AawBdAFNAfoBdgFUAUgB7gHh
- AcIBtQH/Ac8BxgHMAf8BzAF/AUwB/gG/AVsBOAH9AdcBxgHFAf8B2gHFAcIB/wGIAWcBSwHyBAABkgKM
- AvkC+AH/AeEC3wH/AdwC2gH/AdkC1wH/AcoCxwH/Ad8C3gH/Ae0C6wH/AfcC9AH/AfUC8gH/AfYB8wH0
- Af8B7gHwAewB/wHMAewB0AH/AdEBzwHLAf8DVgG7AzABSwHFAVoBQAH9Ac0BoQGKAf8B2AHUAdUB/wLW
- AfsB/wLQAfoD/wH9Cf8B/gL9Av8C/gH/Af4C/AH/AdkB1gHaAf8BygGhAY4B/wHnAWwBOwH/ATYCNQFY
- BAABeAGYAaMC+gP/AdoD/wGvAfMC/wGMAeAC/wGJAeoC/wGHAfYC/wGTAf0C/wGeA/8BkwHzAf4B/wNX
- Ad8DKQE+AZUCWgH7Ad8BbQFsAf8DVQGyAwABAQMKAQ0DHAEoAzIBUAFMAksBkAHKAX8BWgH+AdMBzgHW
- Af8B4AG6AaYB/wHhAWEBGQH/AdsBwQG3Af8B1wHLAc8B/wGQAWIBSAH2AYIBWwFJAfEB4AHIAcMB/wHY
- AsgB/wGqAWoBQQH5BAABrwKpAfwB7ALvAf8B1QLWAf8D2QH/AdcC2AH/AcsCzAH/AeEC4gH/AewC7QH/
- AuoB6wH/AeoC7AH/AewC7QH/AegB6gHpAf8B5gHvAegB/wHhAt4B/wNVAboDUgGpAesBkQFQAf8BywG2
- AbMB/wHaAd0B3gL/Av4B/wHFAcYB/AH/AtIB+hL/Av4B/wHdAd8B4QH/AcoBuAG3Af8B7QGVAVUB/wFY
- AlYBuQQAAXoBjAGaAfcB3AP/AaIB6wL/AYAB3AL/AVoB0QL/AWIB3QL/AV4B5AL/AWkB6AL/AYUB9QL/
- AYwB+QL/AVoCWwHhAyABLgGaAk8B+gHdAW0BbgH/A1UBsQMGAQgDNwFaAWACXAHUAYYBXwFMAfMBhAFf
- AUwB8wHBAWEBGQH+AeABuQGmAf8B1AHPAdUB/wHvAZkBWQH/AeABuwGqAf8B1gHPAdUB/wHNAX8BSwH+
- Ab0BVAExAf0B3QHMAcoB/wHeAcsByAH/AYcBXwFMAfMEAAGWApAB+QHuAvAB/wLmAeUB/wPmAf8D5gH/
- AegC6QH/AeYC5QH/AewB6QHmAf8B7wHsAeYB/wLpAeYB/wPjAf8B4wLiAf8C7wHwAf8B2QHUAdUB/wNU
- Aa8BZgFbAVoB4QHoAZYBWQH/AfMB7AHvAf8B/gH9BP8B/gH/AvcC/wK5AfsB/wLcDv8D/gL/Av4B/wH0
- Ae0B8gH/AecBmAFfAf8BbgFXAVYB6AQAAV8BfgGGAfMBsAH2Av8BbwHaAv8BSAHMAv8BLwHBAv8BUAHT
- Av8BPQHUAv8BRwHYAv8BWQHjAv8BYgHsAv8BWAJeAeUDKQE+AZoCUAH6Ad0CbQH/A1UBsQMqAUABiQFZ
- AUIB9QHjAcQBtgH/Ad4B1wHcAf8B3gHWAdsB/wHgAbgBoQH/AeMBmAFcAf8B1gHPAdMB/wHnAb8BrQH/
- Ae8BtQGVAf8B0wHQAdgB/wHkAcEBsQH/AegBvAGmAf8B1AHQAdYB/wHqAcMBrwH/AV4CXAHOBAABagJl
- AeUE/wH8A/8B+QH9Af4B/wH0AfsB/QH/AfMB/AH+Af8B6wHpAesB/wHAAccB2gH/AawBtAHPAf8ByQHE
- Ac8B/wLjAeAB/wHdAt4B/wHmAugB/wGzAq0B/wNIAYcBeQFUAU0B7gHZAYUBSAH/AcUBwwHJAf8B8gHz
- AfQJ/wL0Av8BsAGqAcgB/wGxAacBowH/AeYB4gHfAf8B+gL5Bf8B9gH1AfYB/wHHAcgBzgH/AdkBjAFU
- Af8BegFYAUoB7wQAAVkBeQGHAfIBiQHrAv8BUQHQAv8BRAHLAv8BSgHOAv8BZAHZAv8BWgHbAv8BRwHW
- Av8BRAHYAv8BSAHlAv8BVAFZAWAB6wEsAisBQwGaAVABUQH6AdwBbQFuAf8DVQGxA1UBtQHfAbMBmQH/
- AdoB1wHgAf8B2wGxAZsB/wHcAbYBoQH/AdcB1gHfAf8B6gG1AZgB/wHpAbsBpQH/AdcB0wHaAf8B8wGq
- AYAB/wHqAbwBpAH/Ad4B1wHbAf8B3gHYAd0B/wHpAc4BwgH/AbUBXwFAAfsDOAFcBAADVwG6AesB4AHc
- Af8B4QHHAb4B/wHXAcoByAH/AdwBwgG6Af8B0QGjAZkB/wFiAaMB3AH/ATwBtgHtAf8BIAHHAeoB/wEb
- AYMBzAH/AawBqAG8Af8B2QHSAc0B/wHaAtcB/wF3AnQB/AMvAUoBdwFUAU0B7gHbAYUBRgH/AckByAHM
- Af8B9gL3Bf8B7wLsAf8BzQHCAb4B/wG7AbABqwH/AZMBigGrAf8BtAGoAbYB/wHFAbkBtQH/AdICywH/
- A/EB/wHOAc8B1QH/AdwBjAFSAf8BdgFYAUsB7wQAAVUBZQFvAeoBhgHdAf4B/wGJAeAC/wGFAdsB+wH/
- AWwBygHxAf8BVQG4AesB/wFzAdAB8gH/AYYB2wL/AYUB4wL/AV0B4AL/AloBXwHbAyQBNQGaAVEBUgH6
- AdwBbQFuAf8DVQGxAWwBWAFSAekB3gHJAcIB/wHhAdYB1wH/AbcBTwEsAf0BuwFcAUAB/QHgAdoB3QH/
- AeMBxgG6Af8B9wGeAV4B/wHdAdYB2gH/AeYByAG7Af8BzgFvASsB/gGEAWcBTgHyAYgBZwFRAfIBXQJZ
- Ac8DNQFXAwcBCQQAA0gBhgG8AaABnAH/AeMBdAE0Af8B3wGjAW4B/wHrAZ8BaQH/AdMBNgEMAf8BSwGE
- AbYB/wFbAd0C/wFWA/8BIAHLAfsB/wFjAYABtwH/AeEBywHEAf8B2gHIAckB/wFiAlcB8QMVAR0BYQJX
- Ad8B6QGQAUsB/wH0AesB7gH/AvkB+gH/AdICygH/AboCrAH/AdYBzwHOAf8B+wH5AfgB/wHqAewC/wHs
- Ae0B/QH/Ae8B6wHoAf8B3wLZAf8B+QH4AfkB/wH1Ae4B8gH/AecBkgFSAf8BagFXAVYB6AQAAzUBVwNV
- AbUBXQFtAXoB7QGGAaUBswH/AW8BiwGYAf8BZQGDAZQB/wFgAZMBqQH/AU4BfwGcAf4BRgFlAXcB9AJa
- AV0BygMvAUoDHwEsAY8BTQFOAfoB4gFwAXEB/wNVAbQBhgFfAUwB8wHjAdMBzwH/AecB1wHVAf8BggFd
- AUQB8wGHAWIBQwH0AeYC2wH/AeMB0QHLAf8B4AFmASMB/wHkAbcBnwH/AeAB4QHqAf8BzAGDAW0B/gNT
- AaoDNgFZAxUBHQMDAQQIAAM0AVQBkAGDAYkB/gHsAZkBVAL/AcwBjgL/Ad0BtwH/AfMBXQErAf8BjgFd
- AWcB/wFDAcQB/gH/AUsB+AH9Af8BHQHhAfoB/wExAXEB1wH/AeABygHNAf8BzAK4Af8DWAHdAwYBCAFS
- AlABowHqAYwBRQH/Ac8BrwGnAf8BugG0AbgB/wHMAsIB/wHzAvEZ/wHbAd8B4gH/AcgBrwGoAf8B6wGP
- AUYB/wNVAbUMAAM2AVkBfwF+AXcB/gGCAXMBcQH/AZwBjQGGAf8BxQGmAaEB/wF/AXYBewH+AWgCWQH1
- AWQBXAFaAecDWgHYA1kB1wGlAWoBaAH+AeECgQH/A1ABnQFrAWEBWAHmAecB1AHOAf8B5gHeAeAB/wG9
- AXABNwH+Ab8BeQFCAf4B5gHgAeQB/wHpAdMBygH/AXMBVAFLAe4BkAFiAUgB9gHmAeAB4gH/AekB1AHM
- Af8BawFcAVUB5wM6AWEDIwEzAwgBCwgAAxoBJQFwAW4BcAH1AdUBowGMAf8B/QG2AV8C/wHlAawB/wH5
- AYMBOAH/AcIBXgFFAf8BXgGvAcoB/wFaAbUBmAH/AVcBuAGQAf8BQAF0AYsB/wHFAbcBvAH/AbgCoQH/
- A1YBuAQAAy0BRQGtAV8BRQH7AdMBkQFhAf8B1AHKAdAJ/wH+Av0J/wP9Av8C/QH/Af4C/AH/AdoB1gHc
- Af8B0AGVAWgB/wHZAXMBPwH/AzMBUwwAAzUBVQF0AXMBcgH+AV4CYAH/AWwCaAH/AbsBnQGXAf8B9wHF
- AbwB/wH7AcQBvQH/AfkBwgG7Af8B8QGxAasB/wHqAZ8BmQH/AeoBkwGQAf8BYwJZAesDHAEoAVMCUgGo
- AecBvwGnAf8C5wHuAf8B5wHJAboB/wHnAcoBvQH/AecB6AHvAf8B6AG8AaAB/wFRAlABnwNOAZgB5wG9
- AaUB/wHnAesB9QH/AeIBqQGHAf8BUgJQAaQDKAE8AwwBEAgAAwYBCAFfAl4B3QG4AaIBowH/AW8BVwGf
- Af8BlgF0AZ8B/wGUAWYBmwH/AVMBOQGvAf8BWAGDAU0B/wFHAcMBWAH/AZYB9gGzAf8BWgHJAV0B/wFw
- AYgBWgH/AYYCfwH+Az8BbQQAAwcBCQNQAZ4B6wGjAWUB/wHnAbcBowH/AdcBzgHSAf8B1gHYAdoB/wH+
- AvwB/wH1AvQB/wH0AvMC/wH9Af4B/wHaAdwB3QH/AdYBzwHSAf8B5QG3AaYB/wHsAaYBaAH/A1MBqgMJ
- AQwMAAMfASwDagH5AW8CbgH/AVUBVwFYAf8DUAH0A1EBogNWAbQDXAHJA2AB3gF1AWkBaAHtAVsCWQHE
- Ax0BKgQAAx0BKgFrAWEBWAHmAegBzgG8Af8B6ALjAf8B6AHiAeMB/wHoAcoBuAH/AWwBXAFUAeoDJQE3
- AxgBIgGHAWYBTAHzAekB2AHPAf8B6gHOAbsB/wFdAlkB0gMcAScDBwEKDAADKgFBAk8BTgGXAlYBbgHo
- AWsBbgH5Af8BnQGmAf4B/wEsAS0B9gH/ASEBIwEyAfsBPgG9AVIB/wGiAf8BzgH/AYwB/wGwAf8BJQFk
- AR0B/wNTAaoMAAMMARABVwJVAboB7AGwAYAB/wHRAaUBkAH/AcgBsgGxAf8B8gHmAegB/wHKAcIBxAH/
- AcUBvQG/Af8B8wHoAeoB/wHKArYB/wHNAaMBkQH/Ae4BtAGFAf8BWQJXAcIDEAEVFAADWwHLA9cB/wOT
- Af8DUAGjEAADBgEIEAADJAE2AVsCWQHEAZ4BagFHAfkBmgFwAVQB+AFaAlcBxQMpAT4DBgEIAwABAQM9
- AWkBXAFaAVkBzAFcAlkBzAM7AWMDBwEKAwEBAhQAA0MBdwFqAWwC/wHLAcwC/wFhAV8C/wEMARABZAH9
- ASkBdQEqAfoBYwGqAYMB+QFhAYIBawHuATwBhAE/AfcDRwGDEAADDQESAlABTwGbAd8BnAFdAf8B7AG+
- AZwB/wHnAcIBrwH/AdkBtQGpAf8B1wGzAagB/wHnAcIBrwH/AewBvgGdAf8B4QGgAWIB/wJSAVABowMT
- ARoYAAMnAToDewHxA14B2QMUARtwAAMQARYCWgFmAd4CqAHdAf0CUAHCAfoCWgFeAdUDOwFkAyYBOAMS
- ARkDKAE8AxYBHxgAAy0BRgNRAaIBYgFeAVcB3wF8AWoBXgHuAXwBagFfAe4BZwFhAVsB4QJTAVIBqAMw
- AUwDAgEDuAADIwEzA1kB7ANWAb4DEgEZCAADEQEXA1MBqgFkAVwBVQHqAXUBZgFRAfIBZgFdAVYB7QNZ
- AccDKgFBBAADCQEMHAADRgGBA1YBuwNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNVAbUDVQG1A1UBtQNV
- AbUDVgG2A1YBuwM8AWgMAAI5AToBYAI1AXcB9QJZAV0B1wNKAYsDLgFIAxgBIQMHAQpAAAMmATkDWAHp
- AfIC5wH/AdoC0AH/A1cBwgMSARkDEQEXAl4BWwHZAfcB2AGrAv8B3gGtAv8B3QGuAv8B7AHCAf8B6AHO
- AaoB/wFiAVgBUgHvA1kB0gNbAeEDWQHDA1ABnQM/AW4DIAEuDAABuwFlAUAB/QHwAYoBKQH/Ae0BcwEe
- Af8B7gFyAR0B/wHuAW8BGQH/Ae4BbAEUAf8B7QFnAQoB/wHtAWIBAwH/Ae0BYwECAf8B7QFfAQAB/wHt
- AVwBAAH/Ae0BWQEAAf8B8gFXAQAB/wHjAVUBAAH/A1kBxAwAAlEBUgGnAioB3gH/Ah8B1QH/Ag4BugH/
- AgEBowH/AkgBZwHuAlUBVgG0A0ABcQMyAVEDFAEcMAADJwE7A1wB5wHqAt8B/wHsAuIB/wHmAtkB/wHc
- AtUB/wNZAcQDVAGuAfoBvAGAAv8B2wGhAv8BxQGGAf8B/QHCAYQB/wH4AcIBiAL/Ad0BqQH/AeoBtQGH
- Af8BvQGiAZcB/wHgAd0B4AH/AecB4gHjAf8B0wHMAc0B/wGcAZQBlQH+A2UB9ANZAccDMQFPBAABxgF/
- AUYB/gH2AbcBigH/AfQBugGUAf8B8gG3AY8B/wHyAbYBjwH/AfIBtQGNAf8B8wG0AYgB/wHzAbEBhQH/
- AfEBrgGAAf8B8AGqAXEB/wHwAaoBcAH/Ae8BqQFvAf8B8wGsAXIB/wHvAXEBIgH/A1YBwQgAAwoBDQJc
- AV4BzgI4AfMB/wIpAewB/wIdAeYB/wIQAd4B/wIAAc8B/wGXAZEBxQH/AbQBqwGwAf8BagFkAZYB/wJb
- AV4B2QJVAVYBsQNAAXEkAAMkATYDWQHsAekC3AH/AfUC7QH/AeEC2AH/AeQC2QH/AfwC9wH/AVoCWAHu
- AYABXwFMAfMBrgFaAR4B/wHmAZwBRwL/Ab4BXwH/Ae0BpAFLAf8BrgFVARcB/wHlAaEBUQH/Ad4BlgFK
- Af8BzQGfAXMB/wHNAcIBwQH/AewB3AHYAf8B7wHZAdcB/wHwAd4B3AL/Af0B/AH/AeAC1AH/A1YBuAQA
- AbsBfQFLAf4B/wHxAfMB/wGZAeABsAH/ATgBxwFSAf8BNwHBAUwB/wElAbUBNAH/AawB3QG4Af8B/QHv
- AfYB/wH5AbYBhwH/AfsBswGDAf8B+gGrAW4B/wH1AawBgAH/AekB5wHuAf8B4wGPAVUB/wNYAcAIAAMs
- AUQCOwGNAfYCQAH3Af8CLwHqAf8CIwHlAf8CEgHgAf8BHQEcAd0B/wHdAdQB4AH/AfcB7QHeAf8B6QHe
- AdgB/wHdAdIBzAH/AcwBwgG8Af8CTQFzAfogAAMkATUBXAJZAewB6wLkAf8B9QLtAf8B6gLiAf8B+wL4
- Af8B9gL0Af8BXwJbAewDJgE4AYsBXAErAfwBhAE1AQAB/wHbAZYBRQH/AfIBuQFpAf8BtwFvATEB/wFo
- ASUBAAH/AZUBRAEGAf8ByQGIATgB/wHPAZwBZwH/AeQBzAHEAv8B7QHfAv8B4gHRAf8B+QHVAcYB/wHY
- AcABuwH/AWYCZAHoAykBPwQAAbwBfwFPAf4B/wHvAfAB/wGFAd0BmgH/ARsBzwE5Af8BFAHBASoB/wEA
- AakBAAH/AZcB0wGbAv8C5wH/Af0BsAFoAv8BsQFsAv8BoQFTAf8B/AGcAVEB/wHtAeAB3gH/AeQBkAFT
- Af8DWAHACAACPAE9AWcCLwHhAf8CPgH5Af8CMwHtAf8CKwHoAf8CFAHiAf8BSwFIAd4B/wHzAewB3wH/
- AegB3wHbAf8B4gHYAdoB/wHoAd0B2wH/AewB4QHcAf8CWgFdAdMcAAMkATYBXwJXAegB6wLmBf8B+AL2
- Af8B+gL2Af8B8gLvAf8BZAJiAecDJwE7BAABgwFlAUUB9AHgAacBXAL/Ad8BswH/AccBpgGGAf8BnwFv
- AU8B/wGeAW4BSwH/AYQBSQEeAf8BcgE2AQAB/wGoAWoBRwH/A2UB9AFqAmUB6QGXAYsBhwH4AWoBZgFl
- Ae0BUAJPAZsDCgEOCAABugF/AVMB/gH/Ae8B7gH/AYcB4QGhAf8BJAHeAVAB/wEeAdIBQQH/AQABuAEV
- Af8BlwHWAZ8C/wHqAekB/wH+AbYBcgL/AbwBiQH/Af4BrAFkAf8B/AGiAVoB/wHwAeQB4gH/AeQBkwFW
- Af8DWAHABAADBAEGA1EBogKDAfQB/wFWAVUB+QH/ATIBMQHyAf8BIQEiAewB/wEOAQ8B5gH/AZIBjwHi
- Af8B+gHxAeEB/wHkAdsB3AH/AeMB2QHaAf8B7wHkAd4B/wHCAbgBxgH/A0gBhRAAAxoBJQMqAUEDOAFc
- A14B5QHuAugN/wHxAu4B/wFiAmAB6QMmATkIAANWAbMB7wHKAaEC/wH7AfQB/wH5AfQB7gH/AewB2QHG
- Af8B7QHYAcAB/wHnAdIBugH/Ac0BkQFSAf8BcgFQATwB/gNEAXoDAwEEAxEBFxQAAbcBfwFXAf4B/wHv
- AesB/wG8Ae4BxwH/AYoB5gGUAf8BiQHjAY8B/wFtAdkBcAH/AcYB6QHHAv8B8QHwAv8BzwGZAv8B0QGc
- Av8BygGTAf8B/QHHAZQB/wH0AusB/wHjAZEBVwH/A1gBwAQAAxQBGwFdAVwBZQHhAvkB+AH/AegB5AHx
- Af8BxgHAAe8B/wGQAY0B7AH/AkQB6AH/AcsBxQHlAv8B9wHiAf8B8wHqAeAB/wHtAeMB3QH/AfcB7AHj
- Af8BmAGQAbAB/wMsAUQIAAMWAR8DVAGrA2QB5wFoAmYB8AF3AmoB+QHgAtYN/wHvAusB/wFkAmMB7AMj
- ATMMAAMRARcCYQFcAdwB+AHmAdMG/wH2AesB/wH7Ae0B3AH/AfcB2wG+Af8B4wG/AacB/wGrAacBrwH/
- AmgBagH1A1wB6gNbAdkDWQHDA1IBpgM3AVoDAwEEBAABtgF/AVoB/gH/AfYB5gH/AcgBxwHzAf8BlAGL
- Ad4B/wGXAY4B3gH/AZQBigHZAf8B2AHTAe4B/wH1AfYB+wH/AZgBrQH+Af8BjwGnAfsB/wGMAaEB+gH/
- AZYBpgH6Af8B7wHwAfcB/wHpAZUBUgH/A1gBwAQAAyYBOQKWAc8D/wH8Af8B+QH2AfIB/wH8AfcB7wP/
- AesB/wHZAdQB6AH/AToBOQHmAf8BYAFcAeIB/wGgAZoB4AH/AckBwgHcAf8B7wHpAeIB/wFiAV4BagHs
- AxYBHwQAAxUBHQNaAdMBxwK4Af8B8QLlAf8B+QLxAf8B+wL0Af8B7ALlAf8B7ALlBf8B8gLtAf8DYAHr
- AyUBNxQAAwkBDANQAZ4BcAFmAWIB6gHkAc0BvwH/AeIBvwGpAf8BvgFbAR4B/wHGAYQBQQH/AdUBrAFx
- Af8BywGsAYsB/wHRAbkBogH/Ad0BxwG4Af8B2AHJAcIB/wHRAcMBxQH/A10B4gMMARAEAAG3AX8BXwH+
- Af8B/gHqAf8BYgFnAd4B/wIAAcMB/wIAAbcB/wIAAZ8B/wGZAZgB0wH/Ae4B8AL/ARsBWwH8Af8BCQFY
- Af0B/wEAATwB/AH/AREBPQH8Af8B6QHrAfkB/wHuAZ0BVQH/A1gBwAQAA0MBeALIAeYD/wH9Af8B9gLz
- Af8B8wHuAfEC/wH7Ae0B/wGsAacB7AH/ARoBGwHqAf8CEgHkAf8BBAEFAd8B/wINAdwB/wExAS4B1gH/
- A1QBrwMHAQkEAANQAZoBvAKvAf8B6QLaAf8B6QLdAf8B9ALqAf8B8wLuAf8B9gL0Af8B7gLnAf8B5gLf
- Af8DXwHgAycBOyAAAy4BSAGdAZcBmwH8AdQBtQGoAf8BsgExAQAB/wHMAVIBAAH/Ac8BYQEAAf8B0gFs
- AQQB/wHPAWwBBwH/Ac0BZAEFAf8BvgFYARUB/wHQAbgBrwH/A1oB1QMDAQQEAAG1AX8BZAH+Af8B/gHo
- Af8BZgFrAegB/wIAAd8B/wIAAdIB/wIAAbgB/wGcAZsB2gH/Ae4B8AL/AS8BhQH9Af8BIwGMAf0B/wEX
- AWIB/AH/ASIBVgH9Af8B6gHsAfwB/wHsAZ0BWAH/A1gBwAQAA1kBxwL6Af0C/wH9AfsB/wH4AfQB9QH/
- AfcB8wHyAv8B/AHvAf8BdAFyAfAB/wErASwB7gH/AiwB6AH/AhsB4QH/AgkB4QH/AgABxQH/Aj8BQAFu
- CAADYQHuAdwCyQH/Ad0CzQH/Ab0CrwH/AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/AXMCbAH0AzQBVCQA
- AUcCRgGBAdcB2gHfAf8BvwGPAYQB/wGsASMBAAH/AcABSAEAAf8ByAFVAQAB/wHLAVoBAAH/AcoBWAEA
- Af8BxwFMAQAB/wG9AUYBAgH/AcQBrAGmAf8DVQGyCAABtAF/AWgB/gL/AewB/wGIAY0B6gH/ARMBFQHc
- Af8BFwEZAdYB/wEQARIBwwH/AawBrQHjAf8B8QH1Av8BRQGKAv8BOQGOAv8BMAFwAv8BPQFqAv8B7gHy
- Av8B6wGdAVwB/wNYAcAEAAJZAX0B8gLtAfcB/wL5AfwD/wH+A/8B+QH/AfMB8AH1Af8BVwFWAfYB/wIz
- AfEB/wIuAeoB/wIjAeQB/wIZAegB/wIdAZEB/AIwATEBTQgAAXECbQH3Ae8C3AH/AcACsgH/A1UBtQM/
- AW8BogKZAf8B9ALrAf8B+ALxAf8BdQJvAfIDKgFBJAADVQGyAegB5wHoAf8BqQFSAUIB/wGyASoBAAH/
- AckBVQEAAf8B2gFlAQAB/wHeAWsBAAH/AdABWwEAAf8BuwE5AQAB/wG1AUkBHwH/AbwCrgH/A0gBiAgA
- Aa8BfwFpAf4B+AHlAdgB/wHsAecB6wH/Ad8B1wHiAf8B3wHZAeQB/wHfAdgB5AH/Ae8B6QHrAf8B9gHu
- AewB/wHiAdoB7QH/AeAB2QHtAf8B4AHaAe4B/wHjAd8B8AH/AfoB9AHyAf8B4gGTAVoB/wNWAcEEAAM4
- AVwCUAFSAaQCWgFdAcoBbgFvAYQB8wLDAd4B/wLOAfQB/wJvAv8CVQH+Af8CPAH3Af8CJgHrAf8CGgHq
- Af8CXAFgAdQDEAEVCAADZAHsAcgCugH/A1UBsAMWAR4DVQGyAcACtAH/AegC3AH/AfAC5wH/AWgCZgHr
- AxwBJyAAAwMBBANeAdkB3gHZAdwB/wGhATUBGgH/AcABQAEAAf8BzwFfAQAB/wHfAW8BAAH/AecBggEA
- Af8B4AFyAQAB/wHJAU0BAAH/AboBXQE/Af8BoQGZAZ4B/QM3AVoIAAHRAZ8BgwH/Af4BzgGYAf8B/QHI
- AZIC/wHMAZEC/wHJAYwC/wHHAYkB/wH8Ab4BggH/AfkBtwFxAv8BvAFtAv8BuQFpAv8BtwFmAf8B/gGz
- AWEC/wGxAWAB/wHvAZABOwH/A1kBxAwAAwcBCgMqAUEDOwFkAk8BUQGcAloBYAHeAlQBxQH/AmMB3wH/
- AmAB9AH/AkUB7gH/A1QBrwwAA0IBdANRAZwDHwEtA1UBsgHAArAB/wHeAswB/wHoAtoB/wHOAsEB/wNT
- AaokAAMRARcBcQJvAfMB0AG6Ab0B/wGRAQcBAAH/Aa8BIgEAAf8BugE6AQAB/wHEAUkBAAH/AckBTgEA
- Af8ByAFOAQAB/wG7ATMBAAH/Ab4BbAFZAf8BfwFuAX8B9wMhATAIAAF0AWQBYAHxAawBegFqAfwBmQFk
- AV8B+wGZAWABXwH7AZkBXwFZAfsBmQFfAVQB+wGZAV8BTgH7AZkBXwFJAfsBmQFfAUQB+wGZAV8BNAH7
- AZkBXwEyAfsBmQFfATIB+wGdAV8BMQH7AZsBSwErAfwDSAGGHAADFAEbAyIBMgNCAXUCVwFZAcICTQF1
- AfIDPgFrFAADUQGcAcUCtwH/Ae8C3QH/Ad4CywH/AcQCtwH/A2AB1AMVAR0kAAMwAU0BpQKcAf4B3AHO
- Ac8B/wGdAksB/wGtAVQBRwH/Aa4BVwFCAf8BrgFXAT4B/wGuAVcBOgH/AawBUgE2Af8BoQE+ATEB/wHC
- AZoBmAH/A2IB6QMHAQqMAANCAXYDZAHnAX0CbQH3A2QB7ANOAZgDFAEcKAADIgExA14B2QNsAe4BbQJu
- Ae4CdwF7AfEDfgHzAYIBgAGCAfUBjAGKAYwB9wGQAY0BkAH5AZcBlQGWAfsBuAGzAbQB/QNWAbkIAAM6
- AWEDWQHHA1kBzANaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDWgHKA1oBygNaAcoDXAHOA1kBwwM0
- AVVAAANOAZgDWQHDA1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+
- A1kBxANEAXwIAANIAYQBiQKHAfMBfwJ9AfABfwJ9AfABfwJ9AfABfwJ9AfABfwJ8AfABfQJ8AfABfQJ8
- AfABfQJ8AfABjAKJAfMDUQGcCAADYQHuA+IB/wPdAf8D2gH/A9oB/wPYAf8B2ALXAf8D1wH/A9YB/wPV
- Af8D1QH/A9QB/wPTAf8D4AH/A5kB/wNXAb0MAAMuAUcBXAFeAWEB2gMlATcoAAGZAZ0BnwH9AcoBzQHP
- Af8BywHNAdAB/wHLAc4B0AH/AcoBzQHQAf8BygHNAc8B/wHJAc0BzwH/AcgBzAHOAf8ByAHMAc4B/wHI
- AcsBzQH/AcgBywHNAf8ByAHLAc0B/wHIAcsBzQH/AckBywHOAf8BsQG1AbcB/wNbAdADAwEEAy8BSQNS
- AaQB6ALjBf8B+wL5Af8B+gL3Af8B+AL0Af8B9gLwAf8B8wLsAf8B8ALoAf8B8gLrAf8B7ALlAf8DVgG2
- AzEBTQMEAQYDiAH3BP8D9AH/A/MB/wHzAvIB/wHxAvAB/wHwAfEB8gH/Ae8B8AHxAf8B7QHuAe8B/wHr
- AewB6wH/AesC7AH/AekB6gHsAf8B5QLmAf8D9QH/A8YB/wNZAcMIAAMbASYBRgFiAXUB7wEEAeQC/wJc
- AWAB1CgAAbIBtAG2Af0B7QLwAf8B2QHbAdoB/wHbAd0B3gH/AdsB3QHeAf8B2wHeAd8B/wHbAd4B3wH/
- AdsB3gHgAf8B2wHeAeAB/wHbAd4B4AH/AdwB3gHgAf8B2wHdAd4B/wHaAdsB3AH/AeYB6AHpAf8B4QHm
- AekB/wNYAcsDPgFrAYkChgH1Ad0C1QH/Ad4C1Qb/Av0B/wH8AvgB/wH6AvUB/wH4AvEB/wH1Au0B/wHx
- AukB/wH2Au8B/wHhAtYB/wHdAtYB/wONAfYDRAF6A3sB9gP7Af8D6gH/AesC6gH/AeoB6wHqAf8B6wHw
- AfEB/wHmAekB6gH/AeEB4AHiAf8B4wHlAecB/wHnAewB7wH/AeEB4gHlAf8B3gHfAeEB/wHeAt8B/wLs
- AesB/wO9Af8DVgHBCAADDgETAVIBYQFqAegBAwHxAv8BMgF7AZ4B+gJMAU0BkQNJAYcDSQGHA0kBhwNJ
- AYcDSQGHA0kBhwNJAYcDRwGABAABqAGuAbIB/QFgAWIBXwH/Ah8BCgH/AisBCwH/AjkBFgH/Ak4BLgH/
- AlQBOAH/AlYBOwH/AVMBUgE3Af8BSAFJASsB/wE7ATwBGwH/AS8BMAEVAf8BJQEkAQ8B/wI5ATMB/wG/
- AcYBywH/A1oBygNeAc4B9QLpAf8B0QLIAf8BbQJrAf8CtQG0Af8BwgLBAf8BvAK7Af8BvAG7AboB/wG6
- ArkB/wG5AbgBtwH/AbsCuQH/AbUCtAH/AW0CbAH/AckCwgH/AfgC7AH/A14B2QN9AfYD/AH/Ae0C7AH/
- Ae4B8AHyAf8B6QHsAe4B/wHaAcgBvwH/AdYBtwGnAf8B2QG+Aa4B/wHSAbYBpwH/AdABuQGwAf8B1QG1
- AaMB/wHOAaoBlAH/AdYBzQHKAf8B7wHxAfMB/wPAAf8DVgHBCAADGwEmAVEBYwF0AesBAAHoAv8BMQGb
- AcgB/wG7AbgBuQH/Ac0B2AHRAf8BywHVAdIB/wHJAdIB0AH/AcYB0QHOAf8BxAHPAc0B/wHBAc0BywH/
- AckB1QHXAf8BnQGkAagB/wQAAagBqgGvAf0BRwFKAUEB/wMAAf8CPQEcAf8CRAEfAf8BJgElAQAB/wI6
- AQgB/wI7AQoB/wI4AQcB/wIuAQAB/wIhAQAB/wIZAQAB/wIOAQAB/wEdARwBDwH/AbYBvQHCAf8DWgHK
- A2cB5gHiAtAB/wHCArIB/wFXAVQBVQH/AVsBXwFmAf8BYgFnAW4B/wFhAWcBbwH/AWIBZwFvAf8BYgFn
- AW8B/wFhAWgBcAH/AWIBaAFvAf8BXQFiAWkB/wFUAVIBUwH/AbkBrAGrAf8B4gLQAf8BawJqAesDfQH2
- A/wB/wHwAvIB/wHrAekB6gH/AdcBswGgAf8B6AG+AZUB/wH1AdEBogH/AfIB0gGnAf8B8wHQAaAB/wHr
- AcIBmQH/AfUBzQGhAf8B3gGoAXAB/wHTAcMBuwH/AfAB9AH3Af8DwQH/A1YBwQgAAykBPgELAXwBuQH8
- AQQB6gL/ASABkQG3Af8BVgFtAUgB/wFSAYgBOgH/ATkBdAEYAf8BOgGDARcB/wE/AYUBHQH/ATcBcgEa
- Af8BJAFiAQsB/wFwAZ4BZQH/AakBrAG0Af8EAAKoAa0B/QFBAUQBPwH/AjEBIgH/AtsB1QH/Ar0BtwH/
- AiYBBwH/AiQBAAH/AiIBAAH/AhoBAAH/AiEBAAH/AiEBAAH/Ah0BAAH/AhIBAAH/AiIBFAH/AbQBuwHB
- Af8DWgHKAWsCZgHvAc4CuQH/Ac4BvwHBAf8B2AHDAbwB/wHgAacBigH/AeYBpQGAAf8B6QGiAWsB/wHp
- AZ0BYwH/AekBnQFjAf8B6QGhAWoB/wHmAaYBcwH/AeABqAGLAf8B2QHBAboB/wHOAcABwgH/Ac4CuQH/
- AW4CagHwA30B9gP+Af8B8AH0AfcB/wHdAbsBqwH/Ae4BtwGDAf8B8gHAAYcB/wHfAbMBkQH/Ad4BvwGq
- Af8B3gGyAY4B/wHzAcEBiQH/AfcByAGVAf8B1AGjAYYB/wHeAdwB3gH/AfIB9AH1Af8DwgH/A1YBwQgA
- AxwBKAEdAXcBpAH6AQQB6AL/AR0BkAG1Af8BVgFzAU0B/wGDAaUBagH/AVsBkAFKAf8BXAGQAUoB/wEe
- AWYBAQH/ARwBYgEEAf8BBgFQAQAB/wFfAZIBVgH/AaoBqwG1Af8EAAKoAaoB/QE8Aj0B/wE7AToBKgH/
- AoEBcAH/AqoBpwH/ApEBhwH/AhsBAwH/ApMBggH/Ak0BOgH/AhEBAAH/AhgBAAH/AhUBAAH/AgoBAAH/
- Ah0BFAH/AbABtwG9Af8DWgHKAXcCdAHxAe0C5AH/AusB8QH/AeUB0QHAAf8B+QGHARcC/wFqAQAC/wFq
- AQAC/wFrAQAC/wFrAQAC/wFsAQAC/wFsAQAB/wH6AWoBAAH/AecBxAGqAf8B7AHwAfgB/wHqAuAB/wF0
- AnAB8AN9AfYE/wHqAuUB/wHlAasBgwH/AfUBrwFkAf8B2AGqAY0B/wHoAeYB6AH/Au0B6wH/AeQB5wHs
- Af8B2wGvAZIB/wH1AbUBcAH/AdkBogFxAf8B2wHXAdgB/wHzAfcB+AH/AsUBxAH/A1YBwQgAA0IBdQEA
- AbgB7wH/AQQB6AL/AR4BlAG2Af8BhwGhAYEB/wE9AYMBMQH/ATkBgwEuAf8BMwFxASQB/wEPAVYBAAH/
- AQ4BUQEAAf8BAAFEAQAB/wFeAZABVwH/AaoBrAG0Af8EAAGlAqgB/QFCAUUBQwH/AwAB/wMAAf8CqAGl
- Af8CpQGdAf8CBQEAAf8CVQFKAf8CvQG6Af8CkQGJAf8CEgEAAf8CCwEAAf8CBQEAAf8BGAEXARMB/wGt
- AbQBuQH/A1oBygN0AfAE/wHxAe4B8gH/Ad0B1QHPAf8B8AHAAWgC/wG3AT4C/wGmARoB/wH+AaIBDQH/
- Af4BoQELAf8B/gGhAQsC/wGfAQYB/wHwAZwBFgH/AdsBzQG9Af8B5AHjAegB/wHyAusB/wF+AXsBfgHx
- A30B9gT/AecB2gHWAf8B6gGpAWsB/wHrAacBXwH/AdoBwwG3Af8B8AHtAeYB/wHmAbgBiQH/Ae0B5wHa
- Af8B2wHAAbMB/wHwAcIBmQH/AeYBuAGVAf8B2gHNAcgB/wH0AfgB+gH/A8YB/wNWAcEEAAMKAQ0CXAFg
- AdQBAAHhAv8BBAHgAv8BGQGVAcAB/wEsAVkBTwH/ATMBkAE1Af8BCgGBAQkB/wENAYEBDAH/ARUBggET
- Af8BFAFoARAB/wEAATcBAAH/AVcBiQFSAf8BrAGtAbUB/wQAAaICqAH9ATgBOwE9Af8BDAELAQoB/wKs
- AaUB/wK9AboB/wIoARkB/wIFAQAB/wJFAT0B/wK+AbsB/wKcAZgB/wINAQAB/wIFAQAB/wMAAf8BEwEU
- ARIB/wGqAbIBtwH/A1oBygNjAeAB/wH7AfoB/wH4AfQB9QH/Ad8C2wH/AeABywGrAf8B/QHlAbsB/wH8
- AeABswH/AfsB2QGjAf8B/AHTAZYB/wH7AdABkAH/Af4BzwGIAf8B5AHAAYgB/wHUAcsBygH/Ac0BzAG7
- Af8B4gHbAc8B/wNmAegDfwH2BP8B7gLqAf8B5wGrAYAB/wH2AbQBagH/AdQBnwFzAf8B4wHiAeMB/wHr
- AeIB0AH/AeEBugGTAf8B2wGtAYsB/wH3AdMBtAH/Ad4BrQGOAf8B3wHZAdcB/wH1AfkB+gH/A8gB/wNW
- AcEEAANRAaABAAGZAeoB/wEAAeYC/wECAdsB9gH/ATYB5gH8Af8BPwGlAd0B/wFMAYIBaAH/AYIBxAFz
- Af8BcgG8AXQB/wFyAb0BcwH/AYEBwgGCAf8BRQGRAUUB/wFaAYwBVgH/AaoBrAGzAf8EAAGfAaYBqAH9
- ATABMwE1Af8BbwFuAW0B/wO4Af8CBgEFAf8DAAH/AhYBCgH/ApUBjQH/AkkBRQH/AwAB/wIDAQAB/wID
- AQAB/wMAAf8BEAISAf8BqAGwAbUB/wNaAcoDSQGHAcgCwgH/AfYB7wHuAf8B6gLlAf8BwwG0AasB/wHu
- AdwBzAH/Ae8B4gHUAf8B7AHiAdYB/wHrAeMB1wH/AeoB4wHWAf8B6gHfAdAB/wHFAbYBrQH/AeAB1wHZ
- Af8B7gHkAeMB/wHHAcABvwH/A04BmAOBAfYE/wH3Af0B/gH/AeQBwAGsAf8B7wGsAWoB/wHxAboBhQH/
- AdgBpAGAAf8B2wG0AZsB/wHdAagBggH/AeUBxgGnAf8B5gGxAY0B/wHdAbsBqAH/AegB7gHxAf8B9gL3
- Af8DyQH/A1YBwQQAAloBXgHVAQAByAL/AQAB5wL/AQIB/QH+Af8BVwP/AYoB7gH+Af8BZAGGAZ8B/wG7
- AdIBsAH/AbcBzwGwAf8BuAHPAbEB/wG5AdABsgH/AbYB0AGwAf8BpwG+AaEB/wGkAacBrAH/BAABmwGi
- AacB/QExATUBNgH/Al0BXAH/A70B/wKKAYkB/wI0AS8B/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
- Af8BDwEQAREB/wGmAa4BswH/A1oBygMHAQkDPQFoA1gBuQNgAd4BqAGlAaYB/QH5AfcB9gH/AfUB+gH5
- Af8B8AH6AfgB/wHsAfoB+QH/AegB+wH5Af8B7wL5Af8BnwGXAZgB/gNhAeIDWgG9A0ABbwMJAQwDgQH2
- BP8B+QH6AfsB/wH1AvYB/wHjAbkBogH/AewBrwGBAf8B9gHAAZEB/wH2AcEBlwH/AfUBywGnAf8B6AGy
- AY8B/wHeAbgBpAH/AesB7gHwAf8B6wHtAe4B/wH3AvYB/wPLAf8DVgHBBAABLgFYAYcB9gEAAccC/wEA
- AeoC/wEBA/8BUQP/AZQB9wL/AWEBhAGqAf8C0gHNAf8B0QHWAdEB/wHPAdQB0AH/Ac0B0wHPAf8BzAHS
- Ac8B/wHZAuAB/wGcAZ8BogH/BAABlgGdAaMB/QFCAUUBRgH/AhABDwH/A7IB/wPRAf8CMwE0Af8DDAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AQ0BDgEPAf8BpQGtAbIB/wNaAcoMAAMOARMDWAHBBP8B+gP/
- AfUD/wHyA/8B7gP/AfkD/wNcAcwDFAEcDAADgQH2BP8D+QH/AfkC+wH/AfcC+wH/AesB2wHTAf8B5wHB
- Aa4B/wHlAbwBpQH/AeUBwQGuAf8B6AHXAdAB/wHwAfQB9wH/Ae4C8AH/AesC6gH/A/kB/wPNAf8DVgHB
- BAABUgFXAWkB6AEAAcsC/wEUAasBwwH8AVgBYAFlAeMBRwHpAfcB/wGIAfIC/wJWAVgBuwNDAXgDQwF4
- A0MBeANDAXgDQwF4A0MBeANBAXIEAAGRAZkBngH9AVEBVAFVAf8BKwIqAf8DSgH/A0gB/wM0Af8DPwH/
- AzkB/wMtAf8CIAEhAf8DFgH/Aw4B/wEGAgUB/wEaAhsB/wGiAaoBrwH/A1oByhAAA1MBpQP9Af8B/gP/
- AfgD/wH1A/8B8QP/AfgD/wNVAbIQAAOFAfYE/wP7Af8D+QH/AfgC+QH/AfgB/QH+Af8B9QH6Af0B/wHy
- AfUB+AH/AfIB9gH6Af8B8wH3AfoB/wHvAfAB8QH/A+0B/wPrAf8D9wH/A88B/wNXAcIEAANTAaoBAAHJ
- Av8BMgGGAaEB9wJSAVMBqAEuAcsB7QH/AV0BzQHsAf8DKwFCIAABjwGXAZ0B/QFPAVEBUgH/ATsCOAH/
- Aj4BPQH/ATwCOwH/AkMBQgH/AUQCQwH/AUUCRAH/AkYBRQH/AUcCRgH/AkUBRAH/AkIBQQH/AT8CPQH/
- ATgCNwH/AZwBpAGqAf8DWQHMEAADVgGrA/0F/wH7A/8B+AP/AfUD/wH6A/8DVwG3AwMBBAwAA5MB+Bz/
- A/4B/wP9Af8D/AH/A/oB/wP5Bf8D0wH/A1cBwgQAAzsBZQEwAWcBkQH3AS8BYgGJAfYBHgFcAZgB+gFM
- AWMBdgHuAloBXgHVAw0BESAAAX8BgQGHAf4BjwGXAZoB/wFjAWcBagH/AWoBbwFyAf8BaQFuAXEB/wFp
- AW4BcQH/AWkBbgFxAf8BaQFuAXAB/wFpAW4BcAH/AWkBbgFxAf8BagFtAXEB/wFqAW8BcgH/AWgBbQFw
- Af8BcQGBAYUB/wGrAbYBvAH/A1kBxxAAA1QBrxj/A1gBuwMEAQUMAANbAcsDrQH+A7UB/QO1Af0DtQH9
- A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9A7UB/QO2Af0DtQH+A24B9QM7AWVAAAJZAVoBzwGOAZEBkgH7
- AX4BhAGKAfoBfQGBAYcB+gF+AYQBigH6AX4BhgGMAfoBgQGHAY0B+gGDAYkBjwH6AYMBigGPAfoBhgGN
- AZAB+gGHAY8BkgH6AYkBjwGSAfoBigGQAZMB+gGPAZoBngH8AWoBbAFvAfIDOgFiEAADUQGcAYcChgHz
- AXsCegHvAXsCegHvAXsCegHvAXsCegHvAYcChgHzA1IBpwMBAQIwAAM/AW0BNQFIAZYB9gIhASIBMSAA
- AwUBBwMjATMDNAFUAyYBOAMMARADAgEDZAADIAEuAzoBYQM2AVkDRQF/A1YBuwNWAbMDQAFwAzcBWgM5
- AV8DHAEoMAADOAFeAToBogH4Af8CWgFdAcoDFwEgEwABAQMGAQgDCwEPA0EBcgF1AmQB7wFeAlsB2QNV
- AbIDSAGGAzIBUQMZASMDDQERAwoBDgMHAQoDAwEECAABWQJXAcIBsgF8AVkB+wGjAW8BTQH6AZkCdgH6
- AZsBeQF6AfoBmgJ4AfoBmgJ3AfoBmgJ3AfoBmgJ4AfoBmgF2AXQB+gGnAXgBYAH6AakBcwFNAfoBsgFf
- AUUB+wFeAlsB0AwAAwMBBANgAd4CfwF+Af4BhgFhAWAB/QE7AWkBuAH/ATcBuQHzAf8BMgGIAc8B/wF3
- AXABfgH+AY4BgwFrAf0BVgJSAf0DTgGXHAADOQFgA0oBjQFJAkgBhwM3AVsEAAMgAS4BUwFhAX8B7gFC
- AbkB9AH/A1sByAMWAR4IAAMEAQUDJAE2A0QBeQNMAZIBbAJhAe4B/wH8Af0B/wH8AusB/wG7AaYBpwH9
- AWcCUQHyA1cB3wNaAcoDVQGyA1ABmgNIAYUDMwFTAwsBDwQAAdIBcAFJAv8BxAFcAf8B7wGaAVMB/wHQ
- AcQBxwH/AdICywH/AdMBygHLAf8B1wLOAf8B1gLOAf8B1QHQAdMB/wHUAcIBvQH/Af0BuQGMAv8BnQE7
- Av8BlwEcAf8B3AF0AT0B/xAAA2AB3wG3AbMBsgH8AaQBnwGeAfoBWwGoAcoB/QFuAeQC/wFYAbYB8QH/
- ApUBmwH7AbcBqwGqAfsBiwKHAfgDQAFwGAADSAGIAXkCdwH6AaoCowH/AYoCagH/AWoCaQH5AlsBWQHD
- AygBPANUAa8BVwHwAv8BKAFxAcQB/wJFAUYBfggAAx0BKgG1ATsBAAH/AfQBUwEAAf8BuwFEARAB/wHx
- AcwBzQL/AvMC/wH3AfYG/wH0AfUB/wHnAb0BvAH/AaABUAFIAf8BXgEdAQgB/wFUAQkBAAH/AZIBLgEA
- Af8DUwGwAzYBWQQAAbUBbwE/AfwB/wG2AVYB/wHtAZQBUwH/AdQBwgHEAf8B2gFVAToB/wHXAaABlgH/
- AdsB1wHaAf8B3AHOAc0B/wHbAdMB1AH/AdgBvgG6Af8B8wGUAV4B/wH+AY4BMwL/AY8BHwH/Ab4BZQFA
- Af0IAAMRARcDFQEdAykBPwMzAVIDKAE8AVMCVQGwAaYBwgHfAf8CTAFdAfMDOgFiAy0BRgMvAUoDGAEh
- AxUBHQMPARQMAAMpAT4BawFpAWcB8gG/AbsBsQH/AawBrQGmAf8BxgK6Af8BrgKUAf8BrwGaAZcB/wNe
- AdACVQFXAboBVAG/AekB/gFUAeoB/AH/A1sByAMJAQwEAAG1ATsBAAL/AWkBBwH/Ae8BZwEMAf8BuwFz
- AWgC/wHoAeYC/wHnAegC/wLvAv8C9gL/AvoG/wL7Af8B8gLPAf8BswFiAV8B/wFyATIBIAH/AbIBOgEA
- Af8DSQGJBAABtAFrAT0B/AH/AbsBXAH/Ae8BmwFbAf8B3QHRAdIB/wHmATUBEgH/AeEBnQGRAf8B5QHt
- Ae8B/wHlAd8B3QH/AuYB6AH/AeABygHFAf8B8gGCAUkB/wH9AY0BMwL/AZgBKAH/Ab0BYwFAAf0EAANL
- AZADXAHnAVwCVQHqAVsCWAHjA1sB4QNaAd4BZQJdAfABzQG5AbUB/wF1AWUBYgH8A1oB5ANfAeADXQHi
- A1wB5wNgAesDWAHjA0ABcAMWAR8DNwFbA1UBtQGHAXMBoQH/AV0BWAGMAf8BWQFbAYEB/wG6AbgBtgH/
- Ab4BrAGrAf8BuwGmAaUB/wHCAawBogH/AUQBQgFoAfUBNAGSAb0B+wFdA/8BRQHGAfUB/wJGAUcBgAQA
- AbUBOwEAAf8B/gFzARUB/wHKAVkBIgH/AfEBwwG7Af8B/AHTAcoB/wH3AdEBzwH/AdoBogGlAf8B2QGe
- AaEB/wGrAVQBXgL/AvQC/wL1Av8B/gH9A/8B/QH/AbkBZAFbAf8BtQE7AQAB/wNMAZEEAAG0AWsBPQH8
- Af8BvAFfAf8B8AGgAWIB/wLmAeoB/wHlAZYBhwH/AecBywHHAf8B7QH6Af4B/wHtAfEB9QH/Ae4B+gH+
- Af8B5gHYAdQB/wHwAWIBMwH/Af0BigExAv8BnAEwAf8BvQFiAUAB/QQAAZQCjQH5AfIC8AH/AeIC4AH/
- Ad0C2wH/AdwC2QH/Ac4CzAH/AdMC0gH/AecC5gH/Ae4C7AH/AfIC8QH/AfIC7wH/AfQC8QH/AeQB6QHi
- Af8BxwHmAcoB/wHQAcsBygH/A1cBxQNWAbMBDwGWAeIB/wEHAZAB6AH/AQABgQHqAf8BAAFnAegB/wEk
- AVQBvAH/Aa8BpQGfAf8BzgHAAb4B/wHMAbgBsgH/AacBmgG2Af8BMwFyAc0B/wFFAdAB8gH/AVkB+QL/
- AWED/wFQAYEBoQH3AywBRAG1ATsBAAH/Af4BhwEnAf8BwgFpAVYB/wHVApkB/wHWAZ0BngH/AdcBoQGj
- Af8B8wLeAf8B+ALsAf8BtgFkAWwB/wH9AeUB5AL/AuwC/wLzAf8B9QHPAc0B/wGNAT8BKgH/Ad4BSwEA
- Af8DSwGQBAABtAFoATwB/AH/AcABZgH/AfMBnAFdAf8B6AHSAdAB/wHqAekB5wH/AesB3wHcAf8B6wHZ
- AdUB/wHrAdkB1gH/AewB4QHaAf8B5wHBAbUB/wHvAUgBFgH/AfwBhgEsAv8BoAE1Af8BvQFhAUAB/QQA
- AboCtwH9Ae4C8AH/AdIC0wH/AdUC1gH/AdUC1gH/AcMCxAH/Ac8C0AH/AfQB9QH0Af8B8QLyAf8B8QLy
- Af8B8QLyAf8D8wH/AekB7gHqAf8B3AHuAeAB/wHiAeAB3wH/A1kBxwFaAWQBaQHhAUABjgGcAfQBKwGz
- AcwB/QEWAbEB7wH/AQ8BoQHvAf8BWQGGAagB/wGpAZ4BlgH/AdECxgH/AdsBywHGAf8BvQGnAb4B/wFH
- AaYB4AH/AVoB/QL/AVsB/AL/AVkB9QH8Af8BTwHbAfMB/wJXAVkBwgG1ATsBAAL/AZUBOwH/AdsBYgEm
- Af8BywGMAYQB/wHwAcIBvwL/Ae4B6wL/Af0B/AX/AfkC5gH/AbgBYwFrAv8B4wHiAv8B6QHoAf8BswFd
- AVkB/wGzAW8BQAH/AfIBUwEAAf8DSwGQBAABtAFnAToB/AH/AcUBcAH/Af0BowFUAf8B9wGZAVAB/wH4
- AZoBUAH/AfgBlwFMAf8B+AGXAUgB/wH4AZQBRQH/AfgBlAFEAf8B+QGPATwB/wH8AYEBKgL/AZEBMgL/
- AaABOQH/Ab0BXwFAAf0EAAGwAqoB/AHlAuYB/wHbAtwB/wPfAf8D3wH/A+AB/wHhAuAB/wPgAf8D3wH/
- A+AB/wPgAf8D4AH/AeEB4AHhAf8B7wHsAe8B/wHhAt0B/wNZAcMDDAEQAy8BSQFdAVwBXQHiAZsBjwGe
- Af8BcgFqAYgB/wFyAWwBcwH/AZ8CnQH/AdYCzQH/AeQB2wHZAf8B+wHiAdgB/wGPAZQByQH/AUoB0wHw
- Af8BgAP/AV8B4AH0Af8CWAFpAeYCNAE1AVUBtQE7AQAC/wGhAVAC/wFvAQwB/wH8Ac8BqQH/AeABqAGO
- Af8BygGGAXAB/wHlAawBqQH/Af4B4AHeAv8B/AH7Af8BuQFoAW8C/wHWAc0B/wHyAcEBvAH/AYIBKQEe
- Af8B6QGqAWgB/wH2AVQBAAH/A0sBjwQAAbUBYwE3AfwB/wHOAZMB/wH4AdgBvgH/AfgB1wG6Af8B9wHU
- AbUB/wH1AdIBswH/AfIBzwGwAf8B8QHNAa4B/wHxAckBqwH/Ae8ByQGpAf8B7AHMAa0B/wHoAcQBqQH/
- AfsBrwFbAf8BvgFbAUAB/QQAAYMCfwH0AfcC+AH/A/EB/wPwAf8B7gLvAf8D7gH/AewC7QH/AeoC6wH/
- A+kB/wPoAf8D5wH/A+UB/wPjAf8B6wLsAf8BzwLKAf8DVQGxAT0CPgFqASIBUQGgAfoBDwFeAcIB/wEU
- AWcB0wH/AQkBVgHOAf8BIAFOAbwB/wGoAaABogH/AeQB2QHUAf8B8QHpAeoB/wGwAbYB2QH/AVYBZQG+
- Af8BKwGaAdkB/wGIAf4C/wGdA/8BWAFmAXsB7wIhASIBMQG1ATsBAAL/Aa4BZgL/AW8BDAL/AdwBvgL/
- AdwBvgH/Af4B2QG4Af8B6gG5AZ0B/wHNAYkBbwH/AdsBnQGZAf8B+gHTAdIB/wG8AWcBawH/AbYBZwFe
- Af8BrQE/ASwB/wH8AcEBjAH/AfYBVAEAAf8DRAF8BAABtQFhATQB/AH+AdMBngH/AfUC+AH/AfwD/wH8
- A/8B/AP/AfoB/QL/AfoB+wH9Af8B+gH3AfkB/wH5AvQB/wH5AfIB8wH/AekB5gHqAf8B8gGzAWkB/wG+
- AVoBPAH9BAABYQJgAd8I/wH5AvoB/wH2AvcB/wPzAf8B7gLvAf8B6gLrAf8D5wH/AeIC4wH/A94B/wHZ
- AtsB/wPWAf8B3QLeAf8BqAKiAf8DSAGIAVgBYgFlAd0BGAHeAv8BDQHVAv8BAAG6Av8BAAGiAv8BTwGa
- Ad8B/wHIAbQBrgH/AekB4AHdAf8B7gHpAfAB/wFGAYwB1AH/AVgBzAHvAf8BiwHnAfcB/wGXAf0C/wGj
- A/8BmAP/AlkBXAHMAbUBOwEAAv8BuwGIAv8BbwEMFf8B8gLlAf8B0gKlAf8BpAFCAUsB/wHLAaoBqQH/
- A/YF/wH2AVQBAAH/AyUBNwQAAbUBYQE0AfwB/QHSAZwB/wH2AfUB8gr/AvwC/wH5AfYC/wH3AfIC/wHz
- Ae4C/wHwAekC/wHxAesB/wHwAeUB5AH/AfIBswFnAf8BvgFaAToB/QQAA1cBugHfAtUB/wHjAtkB/wHc
- AtMB/wHbAtEB/wHaAtAB/wHXAs4B/wHVAswB/wHUAssB/wHTAsoB/wHRAskB/wHPAsgB/wHQAskB/wHX
- AtAB/wFwAl8B+wM0AVQDMgFQAzUBVgNVAbUBcAGQAaAB/wGkAcIB2gH/AcMBygHQAf8BywG+AbsB/wHz
- Ae4B7QL/Af0C/wGGAagB4QH/AXMB2wHzAf8BxAP/AbcD/wFIAa0B4gH/AUIBWQGGAfUCVwFhAd8BtQE7
- AQAC/wHJAZ8C/wGyAWsC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwC/wFvAQwB/wH+
- AW8BDAH/Af4BbwEMAv8BbwEMAv8BbwEMAf8DKgFAAwQBBQQAAbUBYAEyAvwB0gGdAf8B9AHzAfEG/wH8
- AfsC/wH3AfYC/wH0AfEC/wHyAe0C/wHuAegC/wHuAecC/wHzAe8B/wHsAeUB5AH/AfABsgFoAf8BvgFX
- ATkB/QQAA0wBkgG3AqEB/wHGArAB/wHBAqwB/wHCAq0B/wHDAq4B/wHEArAB/wHGArMB/wHIArYB/wHL
- ArkB/wHOAr0B/wHRAsEB/wHZAssB/wHWAsMB/wFkAlcB8QMdASoIAAMsAUQBXAFUAUEB+AHsAeEB3AH/
- AeYB3QHbAf8B5QLaBf8B3wHZAdMB/wFBAUkBXwH7AU0BqAG+Af0B0QP/AdED/wGNAccB6gH/A04BlAMB
- AQIBtQE7AQAC/wHVAbUC/wHVAbUC/wHVAbQC/wHWAbUC/wHVAbMC/wHVAbMV/wG1ATsBAAH/AyoBQAME
- AQUIAAG1AWABMgH8AfsB0gGdAf8B8wHxAfAC/wL+Av8B+QH1Av8B9QHxAv8B8QHtAv8B7gHnAv8B7QHm
- Av8B7wHpAv8B9gHzAf8B6wLlAf8B8QGzAWoB/wG+AVgBOgH9BAADPQFoAZYCggH+AcoCtQH/AcYCsgH/
- AcYCswH/AcgCtAH/AcoCtwH/AcsCuQH/Ac0CvAH/AdECwAH/AdMCxAH/AdcCygH/Ad8C0gH/AckCtQH/
- A1sB4QMMARAMAANKAYwBXQJYAf8BnwKVAf8BtAKzAf8BiAGHAYgB/wNWAbgDQwF3AVUBYgFwAeoB3wH+
- Av8B5wP/AesD/wFSAW0BlgH3AyQBNgG1ATsBAAL/AeABxwL/AeABxwL/AeABxwL/AeABxwL/AeABxwX/
- AbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFAwIBAwgAAbsBWAFA
- Af0B+gHUAaAB/wHyAe8B8AL/Af4D/wH4AfYC/wH1AfEC/wHxAewC/wHvAesC/wHzAe4C/wH1AfMC/wH8
- AfsB/wHsAuoB/wHgAaUBXQH/AbwBUgEwAf0EAAMmATgBdwJoAfYBxgKxAf8BxwKzAf8BxwKzAf8ByQK2
- Af8BywK5Af8BzQK8Af8B0AK/Af8B0gLDAf8B1QLIAf8B2wLQAf8B3QLRAf8BsAKcAf8DVgHBEAADAQEC
- AzQBVANCAXQDPgFsAzEBTwMLAQ8DAAEBAlkBXALJAfkC/wH7B/8B0QH4Af4B/wNbAcgBtQE7AQAV/wG1
- ATsBAAH/AysBQgMHAQoDAwEEAwMBBAMCAQMDAAEBEAAB0AFcAS0C/wHhAacB/wH3AfoB8wf/AfoD/wH1
- Av8B/AHyAv8B/gH2A/8B+gP/Af0F/wHxAfUB7gH/AecBswFnAf8B0wFWARcB/wQAAxABFgFkAl8B6gHD
- Aq0B/wHPArsB/wHQAr4B/wHRAr8B/wHUAsMB/wHXAscB/wHbAssB/wHeAtAB/wHhAtYB/wHpAt4B/wHd
- AssB/wGYAoQB/wNMAZIsAAJIAUkBhwExAV8BnAH7AU0BawGiAfoBTQFoAaEB+gFJAWIBpgH7AUoBUgFw
- Ae8DAQECAbUBOwEAAf8BtQE7AQAB/wG1ATsBAAH/AbUBOwEAAf8BtQE7AQAB/wMdASoDBAEFAwIBAyAA
- AVYCVAGrAZ4BWgEyAfsBhgJZAfUBhgJZAfUBhgJZAfUBhgFZAVcB9QGGAVkBTAH1AYYBWQFXAfUBhgFZ
- AVcB9QGGAVkBVwH1AYYBWQFXAfUBjgFUAVEB9wGeAVYBLAH7AVgCVgG7CAADUQGcAXwCdQH6AZICiAH7
- AY0CfAH6AY0CfAH6AZACfQH6AZICfgH6AZUCgwH6AZYChwH6AZgCjAH6AZYCkwH7AYoCfAH8A18B4AMh
- ATAYAAMhATEDQAFwA1ABngMpAT8EAAMKAQ4DEQEXHAADBAEFAxQBHAMnAToDLAFEAygBPQMjATQDHgEr
- AxgBIgMUARsDEAEVAwwBEAMJAQwDBAEGAzoBYQNZAccDWQHMA1oBygNaAcoDWgHKA1oBygNaAcoDWgHK
- A1oBygNaAcoDWgHKA1oBygNcAc4DWQHDAzQBVQNKAYwDVgG2A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGx
- A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1YBtgNOAZgUAANeAdkBxQKyAf8BzwK7Af8DWAHAAykBPwNb
- AcsDXQHSAzEBTxgAAx8BLAJXAVoBxQJbAWAB1gNXAb8DUAGkA0oBiwNBAXIDOAFdAzEBTgMtAUUDKAE9
- AyMBNAMaASUDYQHuA+IB/wPdAf8D2gH/A9oB/wPYAf8D2AH/A9cB/wPXAf8D1QH/A9UB/wPUAf8DyAH/
- A9oB/wOZAf8DVwG9AWgBQAE4Af0BtAFzAWUB/wGwAYYBcwH/AbQBiAGAAf8BsgGIAXQB/wGxAYYBdAH/
- Aa4BhgF0Af8BrQGFAXQB/wGsAYUBcwH/AaoBhAFzAf8BqQGBAXIB/wGoAYIBcwH/AaYBgQFyAf8BpwGD
- AYIB/wGsAXIBbAH/AU4BQAE/AfQIAAM6AWIDOAFeAzIBUQF7AnUB9gHmAtIB/wHnAtgB/wHFArQB/wGd
- Ao4B/wHMAroB/wHgAswB/wGHAn8B/gM3AVsQAAMCAQMCTwFRAZwBNQHeAv8BQwGzAccB/wElAY0BrQH/
- ARQBlgHRAf8BEgF/AcEB/gEzAVkBhAH1AVIBVwFlAegCWgFeAdUDVwG/A1IBpgNJAYkDNAFUA4gB9wT/
- A/QB/wPzAf8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D7AH/A+cB/wOWAf8D0AH/A8wB/wNZAcMBpgFQ
- AUAB/QHzAdsBzgH/AeAB0QHGAf8B3wHNAcEB/wHaAckBvwH/AdoByAG9Af8B2gHFAbsB/wHZAcUBugH/
- AdkBxQG4Af8B2AHDAbYB/wHYAcEBtAH/AdgBwQGyAf8B1gG/AbAB/wHYAcQBtQH/AeQBvAGoAf8BWQFL
- AUkB8gQAAzUBVwGvAp0B/wG4AqQB/wGlApMB/wHHArQB/wHhAtEB/wHtAuEB/wHsAt8B/wHjAtIB/wHb
- As4B/wH0AusB/wHxAuIB/wFZAlcBwhAAAw4BEwFVAV8BagHoAVUB0wH0Af8BswFwAVAB/wHiAakBhAH/
- AcEBlAFmAf8BpgGYAXEB/wGCAaMBnQH/AVQBsAHMAf8BOAG4AfYB/wEkAbEC/wEYAZ4C/wEIAVYB0wH/
- A1EBoAN7AfYD+wH/A+oB/wPrAf8D6gH/A+gB/wPnAf8D5gH/A+QB/wPjAf8D5AH/A98B/wOcAf8D0AH/
- A8QB/wNWAcEBpAFPAUAB/QHvAccBnAH/AcQBpQGCAf8B2QGsAXIB/wHzAbcBdAH/AfEBsQFrAf8B8gGt
- AWQB/wHyAakBXAH/AfIBpAFWAf8B8gGgAVAB/wHyAZwBSQH/AfIBmQFCAf8B8gGVATwB/wH1AZUBOQH/
- AfYBkAEyAf8BVgFPAUcB8QMMARABZQJkAecBzAK5Af8B3QLLAf8B2gLHAf8B2ALHAf8B6QLcAf8B8QLm
- Af8B9gLsAf8B9gLtAf8B9gLtAf8B/QL2Af8B3QLQAf8DYQHcA0UBfgMEAQYIAAM4AVwBJgGpAfQB/wFf
- AaMBtAH/AeQBtAGLAv8BzwHEAv8B1gG9Av8B3AG2Af8B+wHIAZ0B/wHmAbMBhAH/AcQBoAFtAf8BnwGb
- AXQB/wFxAqoB/wFOAc4C/wJaAVwBzQN9AfYD/AH/A+0B/wPtAf8D7AH/A+oB/wPpAf8D6AH/A+YB/wPl
- Af8D5QH/A+EB/wPTAf8D6gH/A8EB/wNWAcEBqAFOAUAB/QHmAcsBrgH/AdAB3AHjAf8B1QG9AaYB/wH+
- Ab0BgAL/AbwBgAL/AbYBbQL/AbIBZgL/Aa4BXwL/AakBWQL/AaUBUwL/AaIBTAL/AZ8BRgL/AZ8BQgL/
- AZkBOgH/AVkBTwFHAfEEAANMAZABzAK6Af8B6QLbAf8B6ALbAf8B7QLgAf8B8gLmAf8B3gLRAf8B0ALD
- Af8B5QLaAf8B/AL0Af8B/QL3Af8B5wLbAf8B2wLGAf8BsQKeAf8DOgFiBAADAwEEA1YBtgFGAc8C/wGX
- AZABgAH/Af0B1QG6Af8B9AG7AbkB/wH9Ad4BvwH/Af4B3QG/Av8B5gHLAv8B5wHLAv8B5wHJAv8B0QGu
- Af8B0QGgAVcB/wEcAYkB0gH/A0oBigN9AfYD/QH/A+4B/wPuAf8D7QH/A+sB/wPqAf8D6QH/A+cB/wPm
- Af8D5gH/A+MB/wOiAf8D0wH/A8cB/wNWAcEBpwFOAUAB/QHwAdYBugH/AegB8wH6Af8B4QHKAbQB/wH7
- AbwBgQL/Ab0BggL/AbcBcAL/AbMBagL/Aa8BYwL/AasBXgL/AacBWAL/AaQBUQL/AaEBTAL/AaIBSQL/
- AZwBQwH/AVkBTwFHAfEDFQEdA0gBhAHAAqsB/wHmAtcB/wHsAuAB/wHvAuMB/wFzAnAB7wNCAXQDLAFE
- A0gBhQGiAp4B+gH/AvwC/wL7Af8B+QLzAf8B8ALlAf8DUwGqBAADGQEjATgBWQGJAfUBZwHJAesB/wHI
- AaABcgH/AfwB0wHRAf8B9gHLAcUB/wH8AeMBygH/Af0B4AHKAf8BrgGgAYEB/wHiAcUBsAL/Ad0BxQH/
- AfQByQGsAf8B+AHYAasB/wNaAdsDIwEzA30B9gP9Af8D8AH/A+8B/wPuAf8D7AH/A+sB/wPqAf8D6QH/
- A+cB/wPpAf8D5AH/A5EB/wPNAf8DywH/A1YBwQGlAVABQAH9AfsB1AGqAf8B4wHDAaIB/wHvAcABlgL/
- AcIBjAL/Ab4BhQL/AbkBdAL/AbUBbgL/AbEBZwL/Aa4BYgL/AaoBXAL/AacBVgL/AaQBUQL/AaYBTwL/
- AaABSAH/AVkBTwFHAfEDYQHkAcECqwH/Ac0CtgH/AeQC1gH/AfMC6QH/Ac0CvQH/AzQBVQgAAwsBDwF+
- AnQB8wH/AvoJ/wH9AvYB/wNbAcsDAAEBAkEBQgFzAS4BoAH9Af8BlQGwAa0B/wHtAcQBpAH/AfUBxwHV
- Af8B+AHhAdIC/wHpAdsB/wHPAcMBpwH/AS8BpAFAAf8BVQGRAUwB/wHfAbsBrAH/AfUBywG0Af8B+AHO
- AaAB/wNKAYoDEwEaA30B9gP+Af8D8QH/A/EB/wPwAf8D7gH/A+0B/wPsAf8D6gH/A+kB/wPoAf8D5gH/
- A8sB/wPoAf8DxwH/A1YBwQGoAVEBQAH9AecBygGoAf8BwwG4Aa0B/wHXAbUBlgL/AcUBjwL/AcEBigL/
- AbwBgwL/AbgBcgL/AbQBbAL/AbIBZgL/Aa4BYQL/AasBWwL/AagBVgL/AakBVQL/AaQBTgH/AVoBUQFH
- AfEBZAJjAeAB0gK9Af8B4gLSAf8B7QLiAf8B+ALtAf8BjgKJAfkDHQEpBAADFAEbA1UBsgHYAscB/wH+
- AvsF/wGnAp0B+wNRAaADKAE9AwQBBgJZAVwByQFeAcgC/wG4AaYBhQH/AfkB1gHTAf8B8wHLAdgB/wH3
- AesB3gH/AfwB5AHeAf8BgQGxAW0B/wFfAegBnwH/AVEB2wGNAf8BVQGWAU8B/wHrAdYBywH/AmEBXAHc
- AykBPwMNAREDfQH2BP8D8wH/A/IB/wPyAf8D8AH/A+8B/wPtAf8D7AH/A+oB/wPqAf8D6AH/A8gB/wPl
- Af8DyQH/A1YBwQGoAVABQAH9AesB1gG/Af8B5AHzAv8B2wHKAbkB/wH7AcMBjQL/AcQBjwL/AcABhwL/
- AbwBggL/AbkBcQL/AbUBbAL/AbIBZgL/Aa4BYQL/AasBXAL/Aa0BWwL/AagBVgH/AVoBUQFJAfEDUgGh
- AdQCwgH/AfYC7AH/AfIC6AH/AfcC7gH/AdgCyQH/A2AB1gNXAbgBZgJlAegBzgK7Af8B7ALhCf8BewJx
- AfMDHQEqBAADKAE8ASQBTQGvAfoBlQHOAeIB/wHYAbYBkQH/AfcB0wHsAf8B8wHgAeQB/wH8Ae4B7AH/
- AcoB0AG4Af8BUAHGAWoB/wFeAboBZwH/AVsBzwGEAf8BUgHoAZsB/wFQAZkBTAH/A04BlwMvAUoDGQEj
- A38B9gT/A/QB/wP0Af8D8wH/A/EB/wPwAf8D7wH/A+0B/wPsAf8D7QH/A+gB/wOJAf8DyQH/A9AB/wNW
- AcEBpwFSAUAB/QH2AdwBvQH/AecB4AHYAf8B5wHMAbAB/wH+AccBlQL/AcYBkwL/AcIBjAL/Ab4BhwL/
- AbsBgQL/AbgBcQL/AbQBbAL/AbIBZwL/Aa8BYwL/AbEBYgL/AawBXAH/AWABUQFJAfEDHAEoAV0CXAHR
- AYICfgHzAeAC0QH/AfcC7wH/AfkC8QH/AegC2gH/AdwCyQH/Ad8CzwH/AewC4wL/Av4J/wHwAuUB/wNY
- AcEDAQECAk8BUAGbAT4BngL/AbUBvgGqAf8B8gHOAb4B/wH3AdMB7wH/AfwB8wHxAv8B8QH0Af8BXgG6
- AV8B/wFZAboBYAH/AesB3gHYAf8ByAHSAbkB/wFjAcoBbQH/AUgB7gGVAf8BWQFdAVkB1wM3AVoDKQE/
- A4EB9gT/A/YB/wP1Af8D9QH/A/MB/wPyAf8D8AH/A+8B/wPtAf8D7QH/A+oB/wOwAf8D3AH/A88B/wNW
- AcEBqAFTAUAB/QH1AdcBsAH/AdQBtgGYAf8B6AG/AZkC/wHOAZ4C/wHIAZgC/wHFAZEC/wHBAYwC/wG+
- AYYC/wG7AYEC/wG3AXEC/wG1AW0C/wGyAWkC/wG1AWgC/wGxAWIB/wFgAVIBSQHxBAADCAELA2EB3AHQ
- ArsB/wH1AuwB/wH9AvgG/wL9Av8C/gn/AfQC7QH/Af0C+wH/Ad0C0wH/A0ABbgQAAUEBTgF9AfABhwHO
- Af0B/wHOAbkBkgL/Ad0B8QH/AfwB3gHuAf8B3gHbAdQB/wHmAtsB/wHEAdIBtgH/AfEB6gHjAv8B8wH1
- Av8B9wHuAf8BgAF/AZAB/gNVAboBTAGwAWAB+gFZAV0BWQHXAzABTQOBAfYE/wP3Af8D9gH/A/YB/wP0
- Af8D8wH/A/EB/wPwAf8D7gH/A+0B/wPrAf8D4gH/A/QB/wPMAf8DVgHBAagBUwFAAf0B5gHUAbwB/wHS
- AdoB4AH/AdUBxAGxAf8B/AHNAZ0C/wHLAZwC/wHHAZUC/wHDAZEC/wHBAYsC/wG+AYYC/wG7AYIC/wG4
- AXMC/wG2AW4C/wG4AW4C/wG0AWgB/wFgAVMBSQHxCAADVQGwAdwCywL/Av0B/wH8AvUB/wHrAuEB/wH6
- AvYJ/wF/AnsB8gNEAXkDVAGuA0oBjAgAAVoBXQFoAeIBvAHjAeQB/wHpAccBkgH/Ae4B1wHQAf8BVAGc
- AUcB/wEPAYoBCgH/AQ4BgAEHAf8BSwGDATUB/wHvAd0BzgL/AfIB4AH/AecB4QHCAf8CWQFdAdIDGwEm
- AyIBMgNbAcgBWAFbAVgBxgOBAfYE/wP5Af8D+AH/A/gB/wP2Af8D9AH/A/MB/wPyAf8D8AH/A/EB/wPt
- Af8DnQH/A9IB/wPSAf8DVgHBAagBUwFAAf0B8AHhAc0B/wHmAfEB+QH/Ad8B0wHDAf8B/AHSAaUC/wHS
- AaUC/wHOAZ8C/wHLAZkC/wHIAZQC/wHEAZAC/wHCAYsC/wHAAYcC/wG9AYIC/wG+AYQC/wG8AXEB/wFg
- AVMBTAHxCAADEgEZA1IBowHbAs0B/wFlAmQB4gNAAW4BbQJqAecB/wL+Af8B/AL5Af8DXAHJFAADLQFF
- A1UBsgFaAl0BygFZAmQB7AFGAcoBQQH/AUgB3QFGAf8BOwHYATUB/wEXAYwBJwH/AY0BrAHFAf8BqgHM
- AdcB/wFZAWQBewHsAzEBTwMIAQsDAAEBAwIBAwMfASwDhQH2BP8D+wH/A/kB/wP4Af8D9gH/A/QB/wPz
- Af8D8gH/A/EB/wPxAf8D7QH/A5YB/wPPAf8D1AH/A1cBwgGdAXEBTQH+Af8B8gHNAf8B+gHeAcUC/wHb
- AbgC/wHgAbIC/wHeAa0C/wHZAaYC/wHWAaIC/wHTAZwC/wHPAZgC/wHNAZQC/wHLAZAC/wHIAYwC/wHL
- AYwC/wHGAYcB/wFfAUwBRAHzEAADMgFQAx8BLAQAA0oBiQFlAmQB4gNWAbEDNQFXIAADIAEuA1sBwwGB
- AaEBgQH3AVwBYAFcAdQDPQFpAz4BawJBAUIBcwMfAS0DBAEFAwABAQwAA5MB+Bz/A/4B/wP9Af8D/QH/
- A/sB/wPfAf8D9gH/A9QB/wNXAcIBWQFLAUcB8gF4AU0BQwH6AXYBTQExAfoBdgFNATIB+gF1AU0BMgH6
- AXQBTQExAfoBdAFNAS8B+gFzAU0BLgH6AXMBTQEsAfoBcgFNASoB+gFyAU0BKgH6AXIBTQEpAfoBcgFM
- ASkB+gFqAUMBOwH5AXQBNQErAfwBWwJZAdmAAANbAcsDrQH+A7UB/QO1Af0DtQH9A7UB/QO1Af0DtQH9
- A7UB/QO1Af0DtQH9A7UB/QO3Af0DuAH+A24B9QM7AWVMAANWAbMDUgGpAzUBWAMtAUUDHAEnAxcBIAM7
- AWUBWgFfAWEB2wNBAXMDGgEkAwQBBhgAAxUBHQNCAXYDVQGyA1cBwgNWAcEDVAGrAz4BawMPARQcAAMQ
- ARYDWwHIA2QB8QNiAe8DYgHvA2IB7wNiAe8DZwHyA1oB0wMUARsUAANWAbMBZwJRAfIBXwJbAeADVgG2
- A0QBeQMoATwDDQESKAADUgGpAQABlgHtAf8BWwJeAdADRAF7AzUBVgJPAVEBnAE1AYcBpwH3ATMBgAGR
- AfUDPAFmAykBPgMXASADCgENAwIBAwwAA0MBdwFfAlUB6gGnAXsBegH+AdoBoAGdAf8B4gG1Aa0B/wHe
- Aa0BpQH/AcsBkQGKAf8BeQE+AT0B/AFcAloB3AM4AV0YAAMEAQYDawHrA/oB/wPwAf8D8AH/A+8B/wPy
- Af8D8gH/A1cB3xQAASwCKwFDAZQCagH5Af8B4wHUAf8B7wHAAbMB/wHQAZsBkwH/AZABawFpAf4BZwFE
- AUUB+AFaAlYB5ANXAb8DSAGGAy8BSgMQARYYAAMxAU4BAAFeAeoB/wEAASoB9AH/AUsBYQF2Ae4BWQJe
- AdkBAAGDAv8BAAEtAfEB/wFTAWsBcQHxA1MBqgNBAXIDMQFPAyEBMQMNARIIAANQAaMBrwJrAf0B+wLk
- Av8B6QHmAv8B2QHPAv8B6QHZAv8B6AHWAv8B5wHVAv8B2gHKAf8B3AGaAZEB/wFcAj4B+ANFAX8IAAME
- AQYDKgFBAz8BbQNKAYsDWQHrA70B/wO/Af8DvAH/A70B/wO+Af8DrQH/A1sB5QNNAZYDQgF2AzABTQMU
- ARsEAAFJAkgBhwHfAawBpQL/AdwBxQL/AdcBwQL/Ad8BzQL/AeEB0wL/AdsB0AH/AfQByAG/Af8B2QGk
- AZ4B/wGuAWkBZgH/AWIBRAFDAfsBWQJVAesDWQHHA04BlAMlATcLAAEBAw4BEwFYAWkBcQHmAQABGgH3
- Af8BBwEtAv8BCgFRAv8BBgERAfgB/wEAAWQB+AH/AbkBywG1Av8B3gGvAf8BfgFuAWQB8QNQAaQDNgFZ
- AyIBMgQAA0sBkAG+AYIBhAH+Bf8B/gH8Av8B6QHnAv8BzQHDAv8B2AHJAv8B2gHJAv8B1wHGAv8B2gHH
- Av8B5QHRAf8B9AG1AacB/wFcAj4B+AM4AVwEAANaAc0DewH8AbcBuAG5Af8B0AHRAdIB/wHOAc8B0AH/
- AdoB2wHcAf8C5QHmAf8B4gHjAeQB/wHiAeMB5AH/AeMC5QH/AuUB5wH/AcwB0QHPAf8BuwG/Ab0B/wKs
- Aa0B/wN2AfwDWQHSBAADWwHIAfIBzQHEAv8B2wHNAv8B1gHMAv8B2QHRAv8B2gHUAv8B3QHWAv8B4gHZ
- Av8B5wHdAv8B6AHeAv8B3wHUAf8B+gHMAcEB/wHjAa0BpgH/AaMBTQFMAf8DVQGyBAADAgEDAwsBDwMd
- ASoBWwJgAdYBIwFfAf0B/wFYAWAB/QH/AUoBVQH8Af8BJwE7AfwB/wELAZQB9QH/AcQBwwGlAv8B2wGl
- Av8B7wHHAf8B7AG+AZUB/wNRAacDMwFSAyoBQQGOAmUB+QH/AfAB7wL/AfsB+QL/AfAB7wL/Ae8B7gL/
- AdkB0QL/AdwBzAL/AeABzgL/AdgBxwL/AdMBwQL/AdQBwQL/AeMBzAH/AdwBlAGHAf8BXAJaAdwDEAEW
- A7kB/QL4AfcB/wHVAdEBzgH/AdMB0AHNAf8B0gHQAc0B/wHRAc8BzAH/AcYBxAHCAf8BtwG2AbMB/wG+
- AbwBuwH/As0BywH/AtEBzwH/Ac8B0QHOAf8BzgHPAc0B/wPZBf8DaAHzAxwBKAFyAl0B8AH/AeEB2gL/
- AeAB3AL/AeEB3wL/AuMC/wLlAv8C5wL/AuUC/wHhAeAC/wHdAdsC/wHbAdUC/wHdAdAC/wHsAd0B/wHG
- AYIBcwH/A08BmwQAAwkBDAMwAUsBXAJgAdQBMgGaAfwB/wGlAbAB/gH/AZ0BqwH9Af8BbwGNAfwB/wFR
- AWQB+wH/ARoBRwH5Af8BEQGBAeYB/wGeAa4BoQH/Af4BvgGDAv8B4wGwAf8BlgGBAWgB9wNFAX0BVQJT
- AbAB8QG7AbkC/wHcAdcC/wHbAdgC/wHuAe0C/wH3AfUC/wHUAdEC/wG5AbIC/wHGAbsC/wHYAccC/wHW
- AcQC/wHSAb4C/wHWAcEC/wHQAboB/wGPAUEBQAH9Az4BawGjAacBqQH7AbsBsAGmAf8BsAFrAToB/wHG
- AYgBTAH/AcYBgAFHAf8BxgFvAUIB/wHEAWsBPAH/AcQBZQE3Af8BxAFgATMB/wHCAVsBLQH/AcIBVQEn
- Af8BwgFRASQB/wHBAUkBGwH/AZkBPwEeAf8B0gHUAdYB/wNlAfABPgI9AWoBuQGFAYQB/gH/AewB6wL/
- AecB6AL/Au4C/wL3Af8B/gL4Af8B/ALzAf8B/gL1Av8B7wHuAv8B6gHrAv8C5QL/AeYB4gL/AdIBzQH/
- AXoCQQH5AzABSwQAA0IBdgEyAW4BkwH2AR0BagL/AY4BpgL/AYwBpQL/AYwBmgH9Af8BbAGIAfwB/wFD
- AV8B/QH/ASIBSAL/AQABKgL/AQABWgHyAf8BUgGkAbwB/wHDAYQBSAH/AcsBbgEzAf8DVgHBAWsCYgHp
- Af8B7wHpAv8B5AHcAv8B0gHLAv8B2QHSAv8BywHKAf8B/QGqAa8B/wH+AcABwwH/Af0BrgG0Af8B/gGv
- AasC/wHWAcMC/wHTAb8C/wHQAbwC/wHaAcMB/wHMAYYBbgH/A1MBrQGfAaUBpwH7Ab0BrwGhAf8B5gGi
- AWEC/wG8AYcC/wGuAW8C/wGlAWYC/wGcAV0C/wGUAVYB/wH+AYwBTQH/Af0BhQFEAf8B/QFyAT0B/wH8
- AWsBNgL/AWMBKwH/AcABTAEfAf8BzALQAf8CZQFmAfABVgJUAasB8AHJAcgC/wL6Av8B/AH9Af8B/gL6
- Af8B9AHlAeYB/wHmAb4BvQH/Ad0BmAGTAf8B7wHSAdAG/wH0AfUC/wHwAe8C/wH0AfUB/wHwArwB/wNb
- AeEDDwEUBAABWAJbAcsBWwJgAdYBQgFuAYoB9QEkAYkBygH/ARIBlQHpAf8BUAGKAf4B/wFkAXEB/AH/
- ARcBiwH5Af8BOAGmAeAB/wEnAYsBzgH/AR8BgAHFAf8BKAGmAdoB/wGvAYcBWwH/Ad8BlwFKAf8BZwFf
- AVcB6AGeAW4BagH5Af8B9wHuAv8B6wHiAv8B6QHeAv8B2AHNAv8BqQGqAf8B4gG2AboB/wGnAmkB/QG4
- AZUBlgH+Af0BrgGzAv8BwQG1Av8B1gHCAv8BzwG7Av8B2QHCAf8B3wGeAY4B/wNXAcIBoQGlAacB+wG9
- Aa8BowH/AeEBoAFhAv8BuQGHAf8B+QGsAXAB/wH4AaQBaAH/AfgBnQFgAf8B9gGWAVkB/wH2AY4BUQH/
- AfUBiAFLAf8B9AGBAUQB/wHzAXEBPQH/Af0BagE0Af8BvQFRAScB/wHNAtAB/wJlAWYB8AFkAl8B4wH8
- AecB5gH/AfoB6AHlAf8B5gHBAbwB/wHSAZkBlgH/AcgBdAFyAf8BygFwAW4B/wHPAW8BagH/AdMBgwFx
- Af8B8gHdAdoG/wL4Av8C/gH/AdIBkQGQAf8DUwGwEAACXQFaAcoBhAEsAQAB/wFJAU8BSQH/ASQBiwL/
- ATUBYAL/AUkBmAHIAf8B7wGcAUgB/wGGATQBAAH/AXQBLgEAAf8BlAE8AQcB/wHbAYwBNwH/AdcBlQFJ
- Af8BgAFkAUwB8wGjAX8BdgH7Af8B9QHtAv8B6AHfAv8B6gHfAv8B2AHOAv8BswG2Af8B0gGyAbMB/wFV
- AjYB9wGnAmkC/QHAAcUC/wG4Aa4C/wHXAcEC/wHPAbsC/wHYAcIB/wHiAaIBkgH/A1cBwgGhAaUBqQH7
- AbwBrwGjAf8B4gGjAWUC/wG9AYsB/wH6AbEBgAH/AfkBqQFsAf8B+QGiAWUB/wH4AZsBXgH/AfcBlAFX
- Af8B9gGOAVEB/wH2AYgBSgH/AfUBggFDAf8B/QFzAT0B/wG+AVgBLAH/Ac0C0AH/AmUBZgHwAZYBbgFt
- AfcB3QGfAZwB/wGyAVYBVAH/AaMBQgFBAf8BpgFHAUYB/wGwAVUBVAH/AbgBYAFfAf8BvwFpAWgB/wHA
- AWMBYAH/Ac4BcwFsAf8B9wHfAdkG/wH1AfMB/wGjAUwBSgH9Az0BahAAAlkBVwG/AZ4BUAESAf8BvgGH
- AUUB/wEiAYUB8wH/AQMBUwH9Af8BUAFZAVoB/wGLAUIBDwH/AWoBNAEGAf8BYAEoAQAB/wFhASYBAAH/
- AYABNwECAf8BjQFGAQ8B/wFpAVkBVwHrAYcCaAH1Af8B9AHtAv8B6gHhAv8B5wHcAv8B4wHbAv8BsAGy
- Af8B7gGyAbYB/wHSAbIBswH/AeIBtwG5Af8B/QGoAa0C/wHLAcQC/wHUAcMC/wHPAboC/wHbAcQB/wHb
- AZcBigH/A1UBsQGhAaUBqQH7AbsBrgGiAf8B4wGmAWgC/wHCAZAB/wH7AbUBhAH/AfoBrgFyAf8B+QGn
- AWoB/wH4AaEBZAH/AfgBmgFdAf8B9wGVAVgB/wH2AY4BUQH/AfYBiQFLAf8B/gGGAUUB/wG/AVwBMQH/
- Ac0CzgH/AmUBZgHwA1cBugHhAbMBtQH/AeEBoQGlAf8BzgGHAYgB/wG9AWcBaQH/Aa0CVgH/AaUCSwH/
- AaQCSQH/AakBUAFPAf8BqgFLAUoB/wHJAW4BagH/Af0B7AHqAv8B4QHcAf8BZAFRAU8B8QMcASgQAAJJ
- AUgBiAHPAYgBNgL/AcYBdAH/AVMBpQHpAf8BBwGDAfQB/wGuAZwBkQH/Ab0BoAGDAf8BvQGkAYoB/wG1
- AZgBcQH/AZ0BbAFHAf8BYQEtAQEB/wGEATkBAgH/AVsCWQHEAV4CWgHYAfgB5AHeAv8B8AHmAv8B4wHc
- Av8B5QHhAv8B1wHVAv8BrwGyAv8BsgG3Av8BrQGxAv8BygHMAv8B5QHkAv8B2AHTAv8BygG8Av8B0QG8
- Af8BqAF0AWoB/gNCAXYBogGmAaoB+wG7Aa4BogH/AeMBqwFsAv8BxwGVAf8B+wG6AYkB/wH7AbUBgwH/
- AfoBrgFxAf8B+QGoAWsB/wH5AaABZAH/AfgBnAFfAf8B9wGVAVgB/wH2AZEBUwH/Af4BjwFOAf8BvgFh
- ATcB/wHMAc4BzQH/AWUCZgHwAxgBIQF0AmoB7AH/AeYB6QL/AdQB1wH/Af0BygHNAf8B9QG9AcAB/wHl
- AacBqgH/AdIBjgGPAf8BvwJrAf8BsAFZAVoB/wGhAT8BQAH/AdABigGIAf8B6QGjAZ0B/wNZAcwUAAMc
- ASgBpAF1AUoB+gH3AdMBrQH/AbMBzgHvAf8BZQGxAfcB/wH+AfMB5wH/AegB0QG6Af8B6QHQAbcB/wHr
- AdEBuAH/AeYBzAG0Af8B1wG0AY4B/wGnAXIBMwH+AzsBZAFJAkgBhwHdAawBpgL/AfkB8gL/AeUB4gL/
- AeMB4AL/AeYB4gL/AeMB3wL/AdQB0gL/AdsB2QL/AesB6gL/AegB5wL/AuYC/wHjAd8B/wH9AbcBqwH/
- AWMBWAFXAesDFAEbAaIBpgGqAfsBuwGuAaIB/wHjAbABcAL/AcwBmwH/AfwBvwGOAf8B+wG6AYgB/wH6
- AbMBgQH/AfoBrQFwAf8B+QGmAWoB/wH4AaMBZQH/AfgBnQFfAf8B9wGZAVsB/wH+AZcBVwH/Ab4BZwE7
- Af8BywHNAcwB/wFlAmYB8AQAAzsBZQG+AbABsQH9Af8B7QHvAv8B3AHeAv8B2gHdAv8B2AHcAv8B1QHY
- Av8BzQHQAf8B+wHDAccB/wHuAbsBvwH/AeABnAGdAf8BiQJHAfkDPAFoGAADRAF6AfIBxgGbAf8B/QHq
- AdgC/wHuAeEB/wH+AfsB8wH/AfcB5AHTAf8B8wHYAcEB/wHzAdwBxQH/AfgB5wHTAf8B+AHFAZMB/wNR
- AaADEAEWAw8BFAFkAlsB4QHzAd0B1wL/Af0B+gL/AesB6AL/AekB5QL/AesB5gL/AewB5wL/AeYB4wL/
- AeoB6QL/Ae4B7QL/AfcB9gL/Af4B/QH/AbQBYgFfAf0DQwF3BAABogGlAaoB+wG7Aa4BoAH/AegBuQGE
- Av8B2AGnAv8BywGaAv8BxQGUAv8BvgGMAv8BuQGHAv8BswGBAv8BrgFxAf8B/gGoAWsB/wH+AaQBZwL/
- AaQBYwH/AcIBbgFBAf8BywHMAcsB/wFlAmYB8AgAA1gBvAHzAugC/wH3AfkC/wHnAeoC/wHjAeYC/wHk
- AecC/wHtAfAC/wHkAeYB/wG5AaEBogH9AVwCWQHJAy8BSiAAAkcBRgGAAawBmQGFAfgB/gH1AeoC/wH9
- AfgC/wH8AfgB/wH+AfgB8QH/Af4B9QHpAf8BwgGsAYAB/ANQAZ0DDQESAwMBBAQAAykBPwF3Al0B8AHz
- AeIB3wb/AfkB9wL/AfQB7wL/AfIB7QL/Ae0B6QL/AfQB8gb/AvgB/wG9AYEBgAH+A1EBoggAAaMBpwGr
- AfsBswGnAZoB/wHMAZwBWAH/AeYBuQGCAf8B5QGuAW0B/wHlAagBaAH/AeQBowFjAf8B5AGeAV4B/wHj
- AZoBWgH/AeIBlgFVAf8B4gGSAVEB/wHhAY4BTQH/AeQBjgFKAf8BqQFdATAB/wLJAcoB/wNmAfAIAAMW
- AR8BdAJqAesM/wH+AfYB9wH/AcIBngGfAf4BXQJaAdMBMQIwAU0sAAMqAUECVgFVAbQBgQF2AWoB8AHs
- AckBrgH/AYsBfQFyAfICWgFXAb0BNQI0AVUDBwEJAwEBAgwAAyoBQQFkAl0B4gHdAa8BrgH/AfcB6QHo
- Av8B/QH4A/8B+wL/AfgB8wL/AfAB7QH/AewCygH/AYsCbQH3A0sBjgwAAboCuwH9AdsB2AHWAf8BtAGk
- AZUB/wG7AaoBmQH/AboBqgGaAf8BugGpAZoB/wG6AagBmgH/AbkBqAGZAf8BuQGoAZoB/wG5AacBmAH/
- AbkBqAGZAf8BuAGnAZgB/wG4AaQBlgH/AbIBpQGaAf8C7QHuAf8DawHzDAADQAFuAb4CtQH9BP8BxAKr
- Af4BXQJZAdcDNwFaaAADEAEWAUkCSAGIAWACWwHWAYcCZQH0AaMBeQFwAfsBngJqAfkBaQJfAegBVgJV
- AbEDKgFBEAADZwHlA6sB+wGiAaQBpgH6AaIBpAGmAfoBogGkAaYB+gGiAaQBpgH6AaIBpAGmAfoBogGk
- AaYB+gGiAaQBpgH6AaIBpAGmAfoBogGkAaYB+gGiAaQBpgH6AaEBpAGlAfoBogGkAaYB+gOzAfwDXAHJ
- DAADAQECA1cBuANlAeUBPQI8AWgDAwEENAADCAELAlMBVQGwAkwBjAHzAjsBjAHzAlMBVQGwAwgBC6gA
- AxABFgM6AWEDVQG0A0sBjgMDAQQgAAMEAQYDAgEDBAADAQECA1ABnQI4Av8CAAH0Af8DUAGdAwEBAgQA
- AwIBAwMEAQYkAAM9AWkDXQHXA1IBoWAAAwkBDAM3AVoDVAGrAV0CXAHqAasCqAH9AeUC4QH/AYICfwH+
- A1UBsQMNARIYAAMlATcDSAGEDAADQgF0AikB8AH/AgABzQH/A0IBdAwAAkcBSAGDAyYBOBwAAwMBBANe
- AdkBuQK0Af8DXgHVAwEBAhgAAw0BEgMeASsDAwEEAxYBHgJYAVkB3QFQAVMBXAHqA0IBdAMRARcDHAEo
- AzcBWgNEAXsDKAE9DAADKQE+A1QBrgFfAlwB6gKoAacB/QHdAtcB/wH5AfcB+AH/Af4D/wH6Af4G/wGv
- AqgB/wNZAc8DGQEjEAADDAEQAlEBUgGnAzsBZAMkATUDAAEBBAADOQFfAgcBxwH/AgABqwH/AzkBXwcA
- AQEDJAE1AzsBYwJRAVIBpwMMARAYAANVAbIBogKbAf8BvQK4Af8DSwGOAwABARgAA1cBvQFBAUwBXQHw
- A0cBggMgAS4BNwFIAWUB9AEAAYgB9AH/AQABTQGmAf8DWQHMAV8CVwHoAZkBUQFQAf8BtAJhAf8BWQJL
- AfIDOAFeCAABfwJ0AfUB3wLTAf8B+gHxAfIF/wH4AfYB+AH/AfcB9QH2Af8B8wHoAeAB/wHxAcsBqgH/
- AfEB2wHFBf8BxwLCAf8BWwJaAeIDLQFGDAADPgFrA0QBegNEAXkDQgF0AwABAQQAAzABSwIWAY4B+wIW
- AYIB+wMwAUsHAAEBA0IBdQNEAXkDRAF6Az4BaxQAAy0BRQF4AnYB+gHHAsEB/wFoAmcB5gMNARIcAAE+
- AUgBZAH0AQABjAH8Af8BAAFRAawB/wNYAcYBWwJUAekBhQGBAZUB/wErAb0B/QH/AQABnwHgAf8BnQGS
- AbEC/wG7AbcB/wH+AasBqgH/AcsBXgFgAf8BYAJBAfkDMAFNBAAB4QLTBf8B/gH9AfsC/wH7AfMB/wH+
- AfYB5gH/AfsB5AHAAf8B/AHMAZAC/wG0AVQB/wH3AaIBRgH/AeoBxQGrAf8B/QP/AtUB2AH/A1MB8QM6
- AWIIAANQAZ0DNQFWA0oBjAM0AVQDPwFtBAADFQEdAlQBYQHkAlQBYQHkAxUBHQQAAz8BbQM1AVUDSgGM
- AzUBVQJPAVEBnA8AAQEDOwFkAWkCZwHuAbsCtAH/AboCtQH/AzoBYgQAAwMBBANMAY8DQwF3AxsBJgwA
- AzABTQJUAWEB7gErAbUB9gH/AQABlQHiAf8BbwGDAacC/wG7Aa8B/wHkAcoBxwH/AWAB1QHvAf8BiwGu
- AcoB/wH+AaoBpwH/AfACjgH/AewBhAGIAf8BzAFjAWYB/wNbAdkEAANWAasBpgKiAfoB+wH6AeoD/wHe
- Av8B9wHLAv8B4QGnAv8ByQGEAv8BtAFXAf8B9wGcATwB/wHmAYMBLwH/Ad4BpQGHAf8B9gH3AfoB/wHl
- AeYB6QH/AV8CWAH5A0oBigMEAQYDSgGKAz4BagNCAXYDSwGOAzIBUAQAAyUBNwJRAWAB6wJRAWAB6wMl
- ATcEAAMxAU8DTAGPA0IBdgM+AWoCSAFJAYgIAAMNAREDWwHDAZwClgH/Ab0CtwH/AcYCvwH/A1oBvQME
- AQYDSgGLA1oBxQG3ArEB/wG/ArgB/wM/AW0MAAMUARwBYQJbAeEB9gHXAdMB/wFiAeEB+QH/AVwBxQHn
- Af8B9QHHAcUC/wHDAbsC/wGyAa4B/wH+Aa4BrQH/AfsBsQG0Af8B7wGrAaQB/wHfAZABigH/AegBgwGE
- Af8BjwFKAUsB/wgAAykBPwNcAc8ByQG9AbIB/gH/AewBywL/AdoBnQL/AcEBagH/Af0BrQFOAf8B8gGZ
- AUEB/wHkAYMBNAH/AdQBWwEdAf8B0AGAAVYB/wHrAd8B3gH/AukB6wH/AWECVgH9A0sBkAJEAUUBfAM9
- AWcDPQFnA08BlwMSARkDCgENAlcBWQHCAgAB0wH/AgABoQH/AlcBWQHCAwoBDQMSARkDTgGWAz0BZwM+
- AWoDQgF0BAADBAEFA1QBrAGwAqcB/wHEArwB/wHAArgB/wG4ArIB/wNbAcMDXgHQAakCpAH/AcgCwgH/
- AckCwgH/AWICYAHjAxQBHAwAAxwBKAGKAW4BcAH+Af8B5AHeAf8B/gHXAdAB/wH4AcYBxAL/AcEBwwL/
- AccBygL/AdIB0wL/At4C/wHjAeIC/wHcAdcB/wHxAbYBrgH/AcUBbwFoAf8DXwHgEAADPgFqAWcCZQHl
- AeIBxgGyAv8BvwFzAv8BpQFBAf8B7gGRATkB/wHgAXMBMwH/AdMBXAEkAf8BwwE6AQkB/wG8AUMBJgH/
- AeEBvQG5Af8B3wHUAdYB/wNbAdADRAF7Az0BZwM9AWcDTwGXAxIBGAMOARMCVAFkAeQBGQErAv8CAAH0
- Af8CVAFhAeQDDgETAxEBFwNOAZYDPQFnAj0BPgFqA0IBdAQAAzMBUgGmAp0B/wHDArcB/wHJAsYB/wPT
- Af8B1wLVAf8BoQKWAf8BvAK1Af8ByQHCAcEB/wGOAosB+QNNAZEDEgEYEAADBAEGAUoCSQGJAZYBiQGK
- AfsB9gLVAv8B7gHtAv8B/QH8Bv8B/AH5Av8B8AHtAv8B4AHbAf8B8wHIAcIB/wHTAaEBnAH/AYUBWwFY
- Af8DOAFcFAADBAEGA0wBkwF/AXkBeAH0Ae0BrwGKAf8B8AGNAUEB/wHeAWoBLQH/AdABXwE0Af8BxAFc
- AT8B/wG3AVUBQwH/AbwBhQF0Af8BuAGoAaoB/wNVAbQDSgGKAz0BaQNCAXYDTAGPAywBQwQAAzsBZQFB
- AUcBggHzAjsBgAHzAzsBZQQAAysBQgNMAY8DQgF2Aj0BPgFqAkkBSgGJBAADVgGzAb0CsgH/AbsCsgH/
- AcgCxgH/AeIC4wH/AeAC3QH/AagCngH/AZcCkwH7A1QBpgMaASUfAAEBAzEBTgNWAbMBcAFuAWwB7AHJ
- AbcBsQH/AdEBvAG3Af8BzQG1Aa8B/wGbAZEBjwH7A10B0gFqAmcB8gHWAcoByQH/AbUBsQGyAf8DOQFf
- HAADGgElA1sBxgHFAZ8BlAH/AcsBnAGNAf8BvAGfAZ0B/wG2AaQBpQH/AbYBqQGrAf8BtgGmAacB/wFf
- AlIB9AMlATcCTwFRAZwDNQFVA0oBiwMyAVADUgGjAxEBFwQAAxYBHgMWAR4EAAMRARcDUgGkAzIBUQNK
- AYsDNQFWA1ABnQQAAV8CXgHfAbkBrgGsAf8BiAFvAXAB/wGlApsB/wHsAusB/wG4Aq4B/wGpAZ4BmgH/
- AUIBWQFzAfUDQgF0AzMBUwI8AT0BaAMjATQDMwFTGAADAQECAxYBHwMiATIDKAE8AyYBOQMmATkDIwEz
- A2AB3gT/AcoCwwH/AzYBWSAAA1kBxwG5Aa0BsAH/Ab0BsgG2Af8BugGuAbAB/wG7AqwB/wHIArYB/wN/
- Af4DQgF2BAADPgFrA0QBeQNDAXgDQgFzAzkBXwNSAaMDLgFHAxEBFwMRARcDLgFHA1EBogM6AWADQgFz
- A0QBeQNEAXoDPgFrBAADFgEfA1wBzwGLAW8BbQH/AbMCpgH/AbsCswH/Ab4BtQG0Af8BxAGuAasB/wEW
- AasByQH/AQABywH8Af8BAAGsAewB/wEAAbMB8AH/AQABlAHdAf8BAAGeAecB/wNOAZkMAAMCAQMDFQEd
- AxYBHwMWAR4DGwEmAyMBNAM1AVcDTwGXA14B1wHWAtQB/gHqAuUB/wNbAcYDDgETHAADVAGrAcICswH/
- AdACwwH/AckCvAH/AcgCvAH/AdECxAH/AboCrQH/A1cBvQgAAwwBEAJSAVQBpgM0AVQCRwFIAYMDRAF6
- AzQBVANMAY8DTwGXA08BlwNMAY8DNAFUA0QBegJHAUgBgwI0ATUBVQJRAVIBpwMMARAIAANQAZ0BowGd
- AZkB/wGkAZIBkAH/AaYBkwGSAf8BtAGrAakB/wE8AbABvQH/ARQB0wHvAf8BFwHWAfMB/wEWAdUB9AH/
- ARcB0QHzAf8BGAHVAfYB/wESAbIB5AH/AlMBVAGsDAADCgENA1cBuAFpAWMBZAHqAXICZwHuAbYBpAGi
- Af0B0gG4AbYB/wHgAcsBygH/Ae0B2QHaAf8B4gLWAf8BbAJqAekDTgGWAxYBHhwAA0IBdgGoApsB/gHf
- AtYB/wHUAssB/wHUAssB/wHaAtEB/wHaAs8B/wFiAlkB7AMSARkMAAMjATMDUgGpAjQBNQFVA0MBdwNK
- AYsDQgF2Az0BZwM9AWgDQgF2A0oBiwNDAXcDNQFWA1IBqQMiATIMAANQAZoBbwGjAbYB/wGbAa0BsAH/
- AZIBwgHDAf8BgQHiAeMB/wErAYMBuQH8A0ABcQM7AWQDOgFiAzoBYQM6AWEDMgFQFAADQwF4AXYCZgHv
- AYMBbwFwAfEBbQJmAecDYQHaA1sBxANOAZUDOgFgAx0BKgMBAQIcAAMpAT4BiwKIAfkB8ALsAf8B4wLf
- Af8B5QLhAf8B6QLmAf8B8gLtAf8BiQJ/AfsDNgFZFAADIwE0AlEBUgGnA0QBewM1AVYDPQFpAjwBPQFn
- AjwBPQFnAj0BPgFqAzUBVwNEAXsCUQFSAacDIwE0EAADHAEnAkcBSAGDAVoCXQHKAVgBaAF1Ae8BWgJd
- AcoDSAGGbAADIQEwAWoCZgHsBP8D+AH/AfQC8wH/AewC6gH/AekC5gH/Ab8CtwH/A08BnBwAAw8BFAM+
- AWsDUAGdA0oBigNEAXsDRAF7AkkBSgGJAk8BUQGcAj0BPgFqAw8BFJgAA0ABcQGcApQB+QGBAn0B8gFp
- AmgB5gNgAdYDWAHBA1QBrgNGAX8DAwEEMAADEQEXA0gBiANXAb8DVgHBA0wBkwMbASbYAAMGAQgDMQFP
- A0IBdgNIAYcCVwFcAd8BAQECAbIB/wIIAcsB/wIJAcoB/wIWAZgB/wJaAVsB3AMoATxYAAMHAQoDRAF6
+ AzQBVQNKAYwDVgG2A1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGxA1UBsQNVAbEDVQGx
+ A1YBtgNOAZgUAANeAdkBxQKyAf8BzwK7Af8DWAHAAykBPwNbAcsDXQHSAzEBTxgAAx8BLAJXAVoBxQJb
+ AWAB1gNXAb8DUAGkA0oBiwNBAXIDOAFdAzEBTgMtAUUDKAE9AyMBNAMaASUDYQHuA+IB/wPdAf8D2gH/
+ A9oB/wPYAf8D2AH/A9cB/wPXAf8D1QH/A9UB/wPUAf8DyAH/A9oB/wOZAf8DVwG9AWABQAE8Af0BtAFv
+ AWEB/wGwAYYBbwH/AbQBiAGAAf8BsgGIAXAB/wGxAYYBcAH/Aa4BhgFwAf8BrQGFAXAB/wGsAYUBbwH/
+ AaoBhAFvAf8BqQGBAW4B/wGoAYIBbwH/AaYBgQFuAf8BpwGDAYIB/wGsAW4BaAH/AVIBRAFDAfQIAAM6
+ AWIDOAFeAzIBUQFzAmsB9gHmAtIB/wHnAtgB/wHFArQB/wGdAo4B/wHMAroB/wHgAswB/wN/Af4DNwFb
+ EAADAgEDAk8BUQGcATEB3gL/AT8BswHHAf8BIQGNAa0B/wEQAZYB0QH/ARIBfwG5Af4BPgFZAXsB9QJX
+ AWAB6AJaAV4B1QNXAb8DUgGmA0kBiQM0AVQDhAH3BP8D9AH/A/MB/wPzAf8D8QH/A/AB/wPuAf8D7QH/
+ A+sB/wPsAf8D5wH/A5YB/wPQAf8DzAH/A1kBwwGmAUwBQAH9AfMB2wHOAf8B4AHRAcYB/wHfAc0BwQH/
+ AdoByQG/Af8B2gHIAb0B/wHaAcUBuwH/AdkBxQG6Af8B2QHFAbgB/wHYAcMBtgH/AdgBwQG0Af8B2AHB
+ AbIB/wHWAb8BsAH/AdgBxAG1Af8B5AG8AagB/wFZAU8BTQHyBAADNQFXAa8CnQH/AbgCpAH/AaUCkwH/
+ AccCtAH/AeEC0QH/Ae0C4QH/AewC3wH/AeMC0gH/AdsCzgH/AfQC6wH/AfEC4gH/AVkCVwHCEAADDgET
+ AVcBXwFlAegBUQHTAfQB/wGzAWwBTAH/AeIBqQGEAf8BwQGUAWIB/wGmAZgBbQH/AYIBowGdAf8BUAGw
+ AcwB/wE0AbgB9gH/ASABsQL/ARQBngL/AQQBUgHTAf8DUQGgA3MB9gP7Af8D6gH/A+sB/wPqAf8D6AH/
+ A+cB/wPmAf8D5AH/A+MB/wPkAf8D3wH/A5wB/wPQAf8DxAH/A1YBwQGkAUsBQAH9Ae8BxwGcAf8BxAGl
+ AYIB/wHZAawBbgH/AfMBtwFwAf8B8QGxAWcB/wHyAa0BYAH/AfIBqQFYAf8B8gGkAVIB/wHyAaABTAH/
+ AfIBnAFFAf8B8gGZAT4B/wHyAZUBOAH/AfUBlQE1Af8B9gGQAS4B/wFWAVMBUQHxAwwBEANkAecBzAK5
+ Af8B3QLLAf8B2gLHAf8B2ALHAf8B6QLcAf8B8QLmAf8B9gLsAf8B9gLtAf8B9gLtAf8B/QL2Af8B3QLQ
+ Af8DYQHcA0UBfgMEAQYIAAM4AVwBIgGpAfQB/wFbAaMBtAH/AeQBtAGLAv8BzwHEAv8B1gG9Av8B3AG2
+ Af8B+wHIAZ0B/wHmAbMBhAH/AcQBoAFpAf8BnwGbAXAB/wFtAqoB/wFKAc4C/wJaAVwBzQN1AfYD/AH/
+ A+0B/wPtAf8D7AH/A+oB/wPpAf8D6AH/A+YB/wPlAf8D5QH/A+EB/wPTAf8D6gH/A8EB/wNWAcEBqAFK
+ AUAB/QHmAcsBrgH/AdAB3AHjAf8B1QG9AaYB/wH+Ab0BgAL/AbwBgAL/AbYBaQL/AbIBYgL/Aa4BWwL/
+ AakBVQL/AaUBTwL/AaIBSAL/AZ8BQgL/AZ8BPgL/AZkBNgH/AVkBUwFRAfEEAANMAZABzAK6Af8B6QLb
+ Af8B6ALbAf8B7QLgAf8B8gLmAf8B3gLRAf8B0ALDAf8B5QLaAf8B/AL0Af8B/QL3Af8B5wLbAf8B2wLG
+ Af8BsQKeAf8DOgFiBAADAwEEA1YBtgFCAc8C/wGXAZABgAH/Af0B1QG6Af8B9AG7AbkB/wH9Ad4BvwH/
+ Af4B3QG/Av8B5gHLAv8B5wHLAv8B5wHJAv8B0QGuAf8B0QGgAVMB/wEYAYkB0gH/A0oBigN1AfYD/QH/
+ A+4B/wPuAf8D7QH/A+sB/wPqAf8D6QH/A+cB/wPmAf8D5gH/A+MB/wOiAf8D0wH/A8cB/wNWAcEBpwFK
+ AUAB/QHwAdYBugH/AegB8wH6Af8B4QHKAbQB/wH7AbwBgQL/Ab0BggL/AbcBbAL/AbMBZgL/Aa8BXwL/
+ AasBWgL/AacBVAL/AaQBTQL/AaEBSAL/AaIBRQL/AZwBPwH/AVkBUwFRAfEDFQEdA0gBhAHAAqsB/wHm
+ AtcB/wHsAuAB/wHvAuMB/wFoAmYB7wNCAXQDLAFEA0gBhQGaApUB+gH/AvwC/wL7Af8B+QLzAf8B8ALl
+ Af8DUwGqBAADGQEjAUIBWQGAAfUBYwHJAesB/wHIAaABbgH/AfwB0wHRAf8B9gHLAcUB/wH8AeMBygH/
+ Af0B4AHKAf8BrgGgAYEB/wHiAcUBsAL/Ad0BxQH/AfQByQGsAf8B+AHYAasB/wNaAdsDIwEzA3UB9gP9
+ Af8D8AH/A+8B/wPuAf8D7AH/A+sB/wPqAf8D6QH/A+cB/wPpAf8D5AH/A5EB/wPNAf8DywH/A1YBwQGl
+ AUwBQAH9AfsB1AGqAf8B4wHDAaIB/wHvAcABlgL/AcIBjAL/Ab4BhQL/AbkBcAL/AbUBagL/AbEBYwL/
+ Aa4BXgL/AaoBWAL/AacBUgL/AaQBTQL/AaYBSwL/AaABRAH/AVkBUwFRAfEDYQHkAcECqwH/Ac0CtgH/
+ AeQC1gH/AfMC6QH/Ac0CvQH/AzQBVQgAAwsBDwFxAm4B8wH/AvoJ/wH9AvYB/wNbAcsDAAEBAkEBQgFz
+ ASoBoAH9Af8BlQGwAa0B/wHtAcQBpAH/AfUBxwHVAf8B+AHhAdIC/wHpAdsB/wHPAcMBpwH/ASsBpAE8
+ Af8BUQGRAUgB/wHfAbsBrAH/AfUBywG0Af8B+AHOAaAB/wNKAYoDEwEaA3UB9gP+Af8D8QH/A/EB/wPw
+ Af8D7gH/A+0B/wPsAf8D6gH/A+kB/wPoAf8D5gH/A8sB/wPoAf8DxwH/A1YBwQGoAU0BQAH9AecBygGo
+ Af8BwwG4Aa0B/wHXAbUBlgL/AcUBjwL/AcEBigL/AbwBgwL/AbgBbgL/AbQBaAL/AbIBYgL/Aa4BXQL/
+ AasBVwL/AagBUgL/AakBUQL/AaQBSgH/AVoBUwFRAfEBYAJfAeAB0gK9Af8B4gLSAf8B7QLiAf8B+ALt
+ Af8BigKFAfkDHQEpBAADFAEbA1UBsgHYAscB/wH+AvsF/wGbApYB+wNRAaADKAE9AwQBBgJZAVwByQFa
+ AcgC/wG4AaYBhQH/AfkB1gHTAf8B8wHLAdgB/wH3AesB3gH/AfwB5AHeAf8BgQGxAWkB/wFbAegBnwH/
+ AU0B2wGNAf8BUQGWAUsB/wHrAdYBywH/AmEBXAHcAykBPwMNAREDdQH2BP8D8wH/A/IB/wPyAf8D8AH/
+ A+8B/wPtAf8D7AH/A+oB/wPqAf8D6AH/A8gB/wPlAf8DyQH/A1YBwQGoAUwBQAH9AesB1gG/Af8B5AHz
+ Av8B2wHKAbkB/wH7AcMBjQL/AcQBjwL/AcABhwL/AbwBggL/AbkBbQL/AbUBaAL/AbIBYgL/Aa4BXQL/
+ AasBWAL/Aa0BVwL/AagBUgH/AVoCUwHxA1IBoQHUAsIB/wH2AuwB/wHyAugB/wH3Au4B/wHYAskB/wNg
+ AdYDVwG4AWECYAHoAc4CuwH/AewC4Qn/AXACbQHzAx0BKgQAAygBPAEoAU0BpAH6AZUBzgHiAf8B2AG2
+ AZEB/wH3AdMB7AH/AfMB4AHkAf8B/AHuAewB/wHKAdABuAH/AUwBxgFmAf8BWgG6AWMB/wFXAc8BhAH/
+ AU4B6AGbAf8BTAGZAUgB/wNOAZcDLwFKAxkBIwN3AfYE/wP0Af8D9AH/A/MB/wPxAf8D8AH/A+8B/wPt
+ Af8D7AH/A+0B/wPoAf8DiQH/A8kB/wPQAf8DVgHBAacBTgFAAf0B9gHcAb0B/wHnAeAB2AH/AecBzAGw
+ Af8B/gHHAZUC/wHGAZMC/wHCAYwC/wG+AYcC/wG7AYEC/wG4AW0C/wG0AWgC/wGyAWMC/wGvAV8C/wGx
+ AV4C/wGsAVgB/wFgAlMB8QMcASgDXAHRAXcCcQHzAeAC0QH/AfcC7wH/AfkC8QH/AegC2gH/AdwCyQH/
+ Ad8CzwH/AewC4wL/Av4J/wHwAuUB/wNYAcEDAQECAk8BUAGbAToBngL/AbUBvgGqAf8B8gHOAb4B/wH3
+ AdMB7wH/AfwB8wHxAv8B8QH0Af8BWgG6AVsB/wFVAboBXAH/AesB3gHYAf8ByAHSAbkB/wFfAcoBaQH/
+ AUQB7gGVAf8BWQFdAVkB1wM3AVoDKQE/A3cB9gT/A/YB/wP1Af8D9QH/A/MB/wPyAf8D8AH/A+8B/wPt
+ Af8D7QH/A+oB/wOwAf8D3AH/A88B/wNWAcEBqAFPAUAB/QH1AdcBsAH/AdQBtgGYAf8B6AG/AZkC/wHO
+ AZ4C/wHIAZgC/wHFAZEC/wHBAYwC/wG+AYYC/wG7AYEC/wG3AW0C/wG1AWkC/wGyAWUC/wG1AWQC/wGx
+ AV4B/wFgAlMB8QQAAwgBCwNhAdwB0AK7Af8B9QLsAf8B/QL4Bv8C/QL/Av4J/wH0Au0B/wH9AvsB/wHd
+ AtMB/wNAAW4EAAFLAU4BcAHwAYcBzgH9Af8BzgG5AZIC/wHdAfEB/wH8Ad4B7gH/Ad4B2wHUAf8B5gLb
+ Af8BxAHSAbYB/wHxAeoB4wL/AfMB9QL/AfcB7gH/An8BiAH+A1UBugFNAaUBWAH6AVkBXQFZAdcDMAFN
+ A3cB9gT/A/cB/wP2Af8D9gH/A/QB/wPzAf8D8QH/A/AB/wPuAf8D7QH/A+sB/wPiAf8D9AH/A8wB/wNW
+ AcEBqAFPAUAB/QHmAdQBvAH/AdIB2gHgAf8B1QHEAbEB/wH8Ac0BnQL/AcsBnAL/AccBlQL/AcMBkQL/
+ AcEBiwL/Ab4BhgL/AbsBggL/AbgBbwL/AbYBagL/AbgBagL/AbQBZAH/AWACUwHxCAADVQGwAdwCywL/
+ Av0B/wH8AvUB/wHrAuEB/wH6AvYJ/wF3AnIB8gNEAXkDVAGuA0oBjAgAAl0BYgHiAbwB4wHkAf8B6QHH
+ AZIB/wHuAdcB0AH/AVABnAFDAf8BCwGKAQYB/wEKAYABAwH/AUcBgwExAf8B7wHdAc4C/wHyAeAB/wHn
+ AeEBwgH/AlkBXQHSAxsBJgMiATIDWwHIAVgBWwFYAcYDdwH2BP8D+QH/A/gB/wP4Af8D9gH/A/QB/wPz
+ Af8D8gH/A/AB/wPxAf8D7QH/A50B/wPSAf8D0gH/A1YBwQGoAU8BQAH9AfAB4QHNAf8B5gHxAfkB/wHf
+ AdMBwwH/AfwB0gGlAv8B0gGlAv8BzgGfAv8BywGZAv8ByAGUAv8BxAGQAv8BwgGLAv8BwAGHAv8BvQGC
+ Av8BvgGEAv8BvAFtAf8BYAJTAfEIAAMSARkDUgGjAdsCzQH/A2EB4gNAAW4DZAHnAf8C/gH/AfwC+QH/
+ A1wByRQAAy0BRQNVAbIBWgJdAcoBWQJkAewBQgHKAT0B/wFEAd0BQgH/ATcB2AExAf8BEwGMASMB/wGN
+ AawBxQH/AaoBzAHXAf8BWQFkAW4B7AMxAU8DCAELAwABAQMCAQMDHwEsA3kB9gT/A/sB/wP5Af8D+AH/
+ A/YB/wP0Af8D8wH/A/IB/wPxAf8D8QH/A+0B/wOWAf8DzwH/A9QB/wNXAcIBlQFxAU0B/gH/AfIBzQH/
+ AfoB3gHFAv8B2wG4Av8B4AGyAv8B3gGtAv8B2QGmAv8B1gGiAv8B0wGcAv8BzwGYAv8BzQGUAv8BywGQ
+ Av8ByAGMAv8BywGMAv8BxgGHAf8BXwJMAfMQAAMyAVADHwEsBAADSgGJA2EB4gNWAbEDNQFXIAADIAEu
+ A1sBwwF6AZIBegH3AVwBYAFcAdQDPQFpAz4BawJBAUIBcwMfAS0DBAEFAwABAQwAA4gB+Bz/A/4B/wP9
+ Af8D/QH/A/sB/wPfAf8D9gH/A9QB/wNXAcIBWQFPAUsB8gF0AU0BRwH6AXIBTQExAfoBcgFNATIB+gFx
+ AU0BMgH6AXABTQExAfoBcAFNAS8B+gFvAU0BLgH6AW8BTQEsAfoBbgFNASoB+gFuAU0BKgH6AW4BTQEp
+ AfoBbgFNASkB+gFqAUMBQQH5AXABMQErAfwDWwHZgAADWwHLA6UB/gOxAf0DsQH9A7EB/QOxAf0DsQH9
+ A7EB/QOxAf0DsQH9A7EB/QOxAf0DswH9A7AB/gNqAfUDOwFlTAADVgGzA1IBqQM1AVgDLQFFAxwBJwMX
+ ASADOwFlAVoCXwHbA0EBcwMaASQDBAEGGAADFQEdA0IBdgNVAbIDVwHCA1YBwQNUAasDPgFrAw8BFBwA
+ AxABFgNbAcgDZAHxA2IB7wNiAe8DYgHvA2IB7wNnAfIDWgHTAxQBGxQAA1YBswFnAlcB8gNfAeADVgG2
+ A0QBeQMoATwDDQESKAADUgGpAQABlgHtAf8BWwJeAdADRAF7AzUBVgJPAVEBnAE5AYMBmgH3AT4BcwGE
+ AfUDPAFmAykBPgMXASADCgENAwIBAwwAA0MBdwFcAlUB6gGfAXsBegH+AdoBoAGdAf8B4gG1Aa0B/wHe
+ Aa0BpQH/AcsBkQGKAf8BdQE6ATkB/ANcAdwDOAFdGAADBAEGA2cB6wP6Af8D8AH/A/AB/wPvAf8D8gH/
+ A/IB/wNXAd8UAAEsAisBQwGNAmoB+QH/AeMB1AH/Ae8BwAGzAf8B0AGbAZMB/wGIAWsBaQH+AV8BRAFF
+ AfgDWgHkA1cBvwNIAYYDLwFKAxABFhgAAzEBTgEAAVoB6gH/AQABJgH0Af8BUwFhAWoB7gFbAl4B2QEA
+ AYMC/wEAASkB8QH/AVMBZAFtAfEDUwGqA0EBcgMxAU8DIQExAw0BEggAA1ABowGrAmMB/QH7AuQC/wHp
+ AeYC/wHZAc8C/wHpAdkC/wHoAdYC/wHnAdUC/wHaAcoB/wHcAZoBkQH/AVwCPgH4A0UBfwgAAwQBBgMq
+ AUEDPwFtA0oBiwNZAesDvQH/A78B/wO8Af8DvQH/A74B/wOtAf8DXgHlA00BlgNCAXYDMAFNAxQBGwQA
+ AUkCSAGHAd8BrAGlAv8B3AHFAv8B1wHBAv8B3wHNAv8B4QHTAv8B2wHQAf8B9AHIAb8B/wHZAaQBngH/
+ Aa4BZQFiAf8BXwFEAUMB+wNZAesDWQHHA04BlAMlATcLAAEBAw4BEwFYAWQBaAHmAQABFgH3Af8BAwEp
+ Av8BBgFNAv8BAgENAfgB/wEAAWAB+AH/AbkBywG1Av8B3gGvAf8BcgFnAWQB8QNQAaQDNgFZAyIBMgQA
+ A0sBkAG2An8B/gX/Af4B/AL/AekB5wL/Ac0BwwL/AdgByQL/AdoByQL/AdcBxgL/AdoBxwL/AeUB0QH/
+ AfQBtQGnAf8BXAI+AfgDOAFcBAADWgHNA3cB/AG3AbgBuQH/AdAB0QHSAf8BzgHPAdAB/wHaAdsB3AH/
+ AuUB5gH/AeIB4wHkAf8B4gHjAeQB/wHjAuUB/wLlAecB/wHMAdEBzwH/AbsBvwG9Af8CrAGtAf8DcgH8
+ A1kB0gQAA1sByAHyAc0BxAL/AdsBzQL/AdYBzAL/AdkB0QL/AdoB1AL/Ad0B1gL/AeIB2QL/AecB3QL/
+ AegB3gL/Ad8B1AH/AfoBzAHBAf8B4wGtAaYB/wGjAUkBSAH/A1UBsgQAAwIBAwMLAQ8DHQEqAVsCYAHW
+ AR8BWwH9Af8BVAFcAf0B/wFGAVEB/AH/ASMBNwH8Af8BBwGUAfUB/wHEAcMBpQL/AdsBpQL/Ae8BxwH/
+ AewBvgGVAf8DUQGnAzMBUgMqAUEBigJlAfkB/wHwAe8C/wH7AfkC/wHwAe8C/wHvAe4C/wHZAdEC/wHc
+ AcwC/wHgAc4C/wHYAccC/wHTAcEC/wHUAcEC/wHjAcwB/wHcAZQBhwH/A1wB3AMQARYDtQH9AvgB9wH/
+ AdUB0QHOAf8B0wHQAc0B/wHSAdABzQH/AdEBzwHMAf8BxgHEAcIB/wG3AbYBswH/Ab4BvAG7Af8CzQHL
+ Af8C0QHPAf8BzwHRAc4B/wHOAc8BzQH/A9kF/wNgAfMDHAEoAWkCXQHwAf8B4QHaAv8B4AHcAv8B4QHf
+ Av8C4wL/AuUC/wLnAv8C5QL/AeEB4AL/Ad0B2wL/AdsB1QL/Ad0B0AL/AewB3QH/AcYBggFvAf8DTwGb
+ BAADCQEMAzABSwFcAmAB1AEuAZoB/AH/AaUBsAH+Af8BnQGrAf0B/wFrAY0B/AH/AU0BYAH7Af8BFgFD
+ AfkB/wENAYEB5gH/AZ4BrgGhAf8B/gG+AYMC/wHjAbAB/wGKAXoBaAH3A0UBfQFVAlMBsAHxAbsBuQL/
+ AdwB1wL/AdsB2AL/Ae4B7QL/AfcB9QL/AdQB0QL/AbkBsgL/AcYBuwL/AdgBxwL/AdYBxAL/AdIBvgL/
+ AdYBwQL/AdABugH/AY8CQAH9Az4BawGZApsB+wG7AbABpgH/AbABZwE2Af8BxgGIAUgB/wHGAYABQwH/
+ AcYBawE+Af8BxAFnATgB/wHEAWEBMwH/AcQBXAEvAf8BwgFXASkB/wHCAVEBIwH/AcIBTQEgAf8BwQFF
+ ARcB/wGZATsBGgH/AdIB1AHWAf8DXQHwAT4CPQFqAbECfwH+Af8B7AHrAv8B5wHoAv8C7gL/AvcB/wH+
+ AvgB/wH8AvMB/wH+AvUC/wHvAe4C/wHqAesC/wLlAv8B5gHiAv8B0gHNAf8BbgJBAfkDMAFLBAADQgF2
+ ATYBYgGFAfYBGQFmAv8BjgGmAv8BjAGlAv8BjAGaAf0B/wFoAYgB/AH/AT8BWwH9Af8BHgFEAv8BAAEm
+ Av8BAAFWAfIB/wFOAaQBvAH/AcMBhAFEAf8BywFqAS8B/wNWAcEBYwJiAekB/wHvAekC/wHkAdwC/wHS
+ AcsC/wHZAdIC/wHLAcoB/wH9AaoBrwH/Af4BwAHDAf8B/QGuAbQB/wH+Aa8BqwL/AdYBwwL/AdMBvwL/
+ AdABvAL/AdoBwwH/AcwBhgFqAf8DUwGtAZcBmQGbAfsBvQGvAaEB/wHmAaIBXQL/AbwBhwL/Aa4BawL/
+ AaUBYgL/AZwBWQL/AZQBUgH/Af4BjAFJAf8B/QGFAUAB/wH9AW4BOQH/AfwBZwEyAv8BXwEnAf8BwAFI
+ ARsB/wHMAtAB/wJdAV8B8AFWAlQBqwHwAckByAL/AvoC/wH8Af0B/wH+AvoB/wH0AeUB5gH/AeYBvgG9
+ Af8B3QGYAZMB/wHvAdIB0Ab/AfQB9QL/AfAB7wL/AfQB9QH/AfACvAH/A1sB4QMPARQEAAFYAlsBywFb
+ AmAB1gFCAWoBgQH1ASABiQHKAf8BDgGVAekB/wFMAYoB/gH/AWABbQH8Af8BEwGLAfkB/wE0AaYB4AH/
+ ASMBiwHOAf8BGwGAAcUB/wEkAaYB2gH/Aa8BhwFXAf8B3wGXAUYB/wFjAV8BVwHoAZACagH5Af8B9wHu
+ Av8B6wHiAv8B6QHeAv8B2AHNAv8BqQGqAf8B4gG2AboB/wGnAmEB/QGwAY0BjgH+Af0BrgGzAv8BwQG1
+ Av8B1gHCAv8BzwG7Av8B2QHCAf8B3wGeAY4B/wNXAcIBlwGZAZsB+wG9Aa8BowH/AeEBoAFdAv8BuQGH
+ Af8B+QGsAWwB/wH4AaQBZAH/AfgBnQFcAf8B9gGWAVUB/wH2AY4BTQH/AfUBiAFHAf8B9AGBAUAB/wHz
+ AW0BOQH/Af0BZgEwAf8BvQFNASMB/wHNAtAB/wJdAV8B8ANfAeMB/AHnAeYB/wH6AegB5QH/AeYBwQG8
+ Af8B0gGZAZYB/wHIAXABbgH/AcoBbAFqAf8BzwFrAWYB/wHTAYMBbQH/AfIB3QHaBv8C+AL/Av4B/wHS
+ AZEBkAH/A1MBsBAAAl0BWgHKAYQBKAEAAf8BRQFLAUUB/wEgAYsC/wExAVwC/wFFAZgByAH/Ae8BnAFE
+ Af8BhgEwAQAB/wFwASoBAAH/AZQBOAEDAf8B2wGMATMB/wHXAZUBRQH/AXMBXwFMAfMBmQFzAWoB+wH/
+ AfUB7QL/AegB3wL/AeoB3wL/AdgBzgL/AbMBtgH/AdIBsgGzAf8BUgI6AfcBpwJhAv0BwAHFAv8BuAGu
+ Av8B1wHBAv8BzwG7Av8B2AHCAf8B4gGiAZIB/wNXAcIBlwGZAZsB+wG8Aa8BowH/AeIBowFhAv8BvQGL
+ Af8B+gGxAYAB/wH5AakBaAH/AfkBogFhAf8B+AGbAVoB/wH3AZQBUwH/AfYBjgFNAf8B9gGIAUYB/wH1
+ AYIBPwH/Af0BbwE5Af8BvgFUASgB/wHNAtAB/wJdAV8B8AGKAm0B9wHdAZ8BnAH/AbIBUgFQAf8BowE+
+ AT0B/wGmAUMBQgH/AbABUQFQAf8BuAFcAVsB/wG/AWUBZAH/AcABXwFcAf8BzgFvAWgB/wH3Ad8B2Qb/
+ AfUB8wH/AaMBSAFGAf0DPQFqEAACWQFXAb8BngFMAQ4B/wG+AYcBQQH/AR4BhQHzAf8BAAFPAf0B/wFM
+ AVUBVgH/AYsBPgELAf8BZgEwAQIB/wFcASQBAAH/AV0BIgEAAf8BgAEzAQAB/wGNAUIBCwH/AWQCWQHr
+ AX8CYgH1Af8B9AHtAv8B6gHhAv8B5wHcAv8B4wHbAv8BsAGyAf8B7gGyAbYB/wHSAbIBswH/AeIBtwG5
+ Af8B/QGoAa0C/wHLAcQC/wHUAcMC/wHPAboC/wHbAcQB/wHbAZcBigH/A1UBsQGXAZkBmwH7AbsBrgGi
+ Af8B4wGmAWQC/wHCAZAB/wH7AbUBhAH/AfoBrgFuAf8B+QGnAWYB/wH4AaEBYAH/AfgBmgFZAf8B9wGV
+ AVQB/wH2AY4BTQH/AfYBiQFHAf8B/gGGAUEB/wG/AVgBLQH/Ac0CzgH/Al0BXwHwA1cBugHhAbMBtQH/
+ AeEBoQGlAf8BzgGHAYgB/wG9AWMBZQH/Aa0CUgH/AaUCRwH/AaQCRQH/AakBTAFLAf8BqgFHAUYB/wHJ
+ AWoBZgH/Af0B7AHqAv8B4QHcAf8BZAJTAfEDHAEoEAACSQFIAYgBzwGIATIC/wHGAXAB/wFPAaUB6QH/
+ AQMBgwH0Af8BrgGcAZEB/wG9AaABgwH/Ab0BpAGKAf8BtQGYAW0B/wGdAWgBQwH/AV0BKQEAAf8BhAE1
+ AQAB/wFbAlkBxAFeAloB2AH4AeQB3gL/AfAB5gL/AeMB3AL/AeUB4QL/AdcB1QL/Aa8BsgL/AbIBtwL/
+ Aa0BsQL/AcoBzAL/AeUB5AL/AdgB0wL/AcoBvAL/AdEBvAH/AaABdAFqAf4DQgF2AZgBmgGcAfsBuwGu
+ AaIB/wHjAasBaAL/AccBlQH/AfsBugGJAf8B+wG1AYMB/wH6Aa4BbQH/AfkBqAFnAf8B+QGgAWAB/wH4
+ AZwBWwH/AfcBlQFUAf8B9gGRAU8B/wH+AY8BSgH/Ab4BXQEzAf8BzAHOAc0B/wFdAl8B8AMYASEBagJk
+ AewB/wHmAekC/wHUAdcB/wH9AcoBzQH/AfUBvQHAAf8B5QGnAaoB/wHSAY4BjwH/Ab8CZwH/AbABVQFW
+ Af8BoQE7ATwB/wHQAYoBiAH/AekBowGdAf8DWQHMFAADHAEoAZwBcQFNAfoB9wHTAa0B/wGzAc4B7wH/
+ AWEBsQH3Af8B/gHzAecB/wHoAdEBugH/AekB0AG3Af8B6wHRAbgB/wHmAcwBtAH/AdcBtAGOAf8BnwFy
+ ATMB/gM7AWQBSQJIAYcB3QGsAaYC/wH5AfIC/wHlAeIC/wHjAeAC/wHmAeIC/wHjAd8C/wHUAdIC/wHb
+ AdkC/wHrAeoC/wHoAecC/wLmAv8B4wHfAf8B/QG3AasB/wFgAlkB6wMUARsBmAGaAZwB+wG7Aa4BogH/
+ AeMBsAFsAv8BzAGbAf8B/AG/AY4B/wH7AboBiAH/AfoBswGBAf8B+gGtAWwB/wH5AaYBZgH/AfgBowFh
+ Af8B+AGdAVsB/wH3AZkBVwH/Af4BlwFTAf8BvgFjATcB/wHLAc0BzAH/AV0CXwHwBAADOwFlAboBrAGt
+ Af0B/wHtAe8C/wHcAd4C/wHaAd0C/wHYAdwC/wHVAdgC/wHNAdAB/wH7AcMBxwH/Ae4BuwG/Af8B4AGc
+ AZ0B/wGFAkcB+QM8AWgYAANEAXoB8gHGAZsB/wH9AeoB2AL/Ae4B4QH/Af4B+wHzAf8B9wHkAdMB/wHz
+ AdgBwQH/AfMB3AHFAf8B+AHnAdMB/wH4AcUBkwH/A1EBoAMQARYDDwEUAWECWwHhAfMB3QHXAv8B/QH6
+ Av8B6wHoAv8B6QHlAv8B6wHmAv8B7AHnAv8B5gHjAv8B6gHpAv8B7gHtAv8B9wH2Av8B/gH9Af8BsAFa
+ AVcB/QNDAXcEAAGYAZkBnAH7AbsBrgGgAf8B6AG5AYQC/wHYAacC/wHLAZoC/wHFAZQC/wG+AYwC/wG5
+ AYcC/wGzAYEC/wGuAW0B/wH+AagBZwH/Af4BpAFjAv8BpAFfAf8BwgFqAT0B/wHLAcwBywH/AV0CXwHw
+ CAADWAG8AfMC6AL/AfcB+QL/AecB6gL/AeMB5gL/AeQB5wL/Ae0B8AL/AeQB5gH/AbUBoQGiAf0BXAJZ
+ AckDLwFKIAACRwFGAYABnAGRAX0B+AH+AfUB6gL/Af0B+AL/AfwB+AH/Af4B+AHxAf8B/gH1AekB/wG5
+ AaEBewH8A1ABnQMNARIDAwEEBAADKQE/AWoCXQHwAfMB4gHfBv8B+QH3Av8B9AHvAv8B8gHtAv8B7QHp
+ Av8B9AHyBv8C+AH/AbUCfwH+A1EBoggAAZkBmwGdAfsBswGnAZoB/wHMAZwBVAH/AeYBuQGCAf8B5QGu
+ AWkB/wHlAagBZAH/AeQBowFfAf8B5AGeAVoB/wHjAZoBVgH/AeIBlgFRAf8B4gGSAU0B/wHhAY4BSQH/
+ AeQBjgFGAf8BqQFZASwB/wLJAcoB/wNfAfAIAAMWAR8BagJmAesM/wH+AfYB9wH/AboBlgGXAf4BXQJa
+ AdMBMQIwAU0sAAMqAUECVgFVAbQBcgFqAWYB8AHsAckBrgH/AX0BdQFpAfICWgFXAb0BNQI0AVUDBwEJ
+ AwEBAgwAAyoBQQFhAl0B4gHdAa8BrgH/AfcB6QHoAv8B/QH4A/8B+wL/AfgB8wL/AfAB7QH/AewCygH/
+ AYYCbQH3A0sBjgwAAbYCtwH9AdsB2AHWAf8BtAGkAZUB/wG7AaoBmQH/AboBqgGaAf8BugGpAZoB/wG6
+ AagBmgH/AbkBqAGZAf8BuQGoAZoB/wG5AacBmAH/AbkBqAGZAf8BuAGnAZgB/wG4AaQBlgH/AbIBpQGa
+ Af8C7QHuAf8DZAHzDAADQAFuAboCsQH9BP8BvAKjAf4BXQJZAdcDNwFaaAADEAEWAUkCSAGIAWACWwHW
+ AXsCZQH0AZkBbQFkAfsBkAJqAfkBZQJfAegBVgJVAbEDKgFBEAADZQHlA50B+wGaAZwBngH6AZoBnAGe
+ AfoBmgGcAZ4B+gGaAZwBngH6AZoBnAGeAfoBmgGcAZ4B+gGaAZwBngH6AZoBnAGeAfoBmgGcAZ4B+gGa
+ AZwBngH6AZkBnAGdAfoBmgGcAZ4B+gOrAfwDXAHJDAADAQECA1cBuANlAeUBPQI8AWgDAwEENAADCAEL
+ AlMBVQGwAkwBgAHzAkQBgAHzAlMBVQGwAwgBC6gAAxABFgM6AWEDVQG0A0sBjgMDAQQgAAMEAQYDAgED
+ BAADAQECA1ABnQI0Av8CAAH0Af8DUAGdAwEBAgQAAwIBAwMEAQYkAAM9AWkDXQHXA1IBoWAAAwkBDAM3
+ AVoDVAGrA1wB6gOoAf0B5QLhAf8DfwH+A1UBsQMNARIYAAMlATcDSAGEDAADQgF0AiUB8AH/AgABzQH/
+ A0IBdAwAAkcBSAGDAyYBOBwAAwMBBANeAdkBuQK0Af8DXgHVAwEBAhgAAw0BEgMeASsDAwEEAxYBHgJY
+ AVkB3QFUAVUBXAHqA0IBdAMRARcDHAEoAzcBWgNEAXsDKAE9DAADKQE+A1QBrgNcAeoCqAGnAf0B3QLX
+ Af8B+QH3AfgB/wH+A/8B+gH+Bv8BrwKoAf8DWQHPAxkBIxAAAwwBEAJRAVIBpwM7AWQDJAE1AwABAQQA
+ AzkBXwIDAccB/wIAAasB/wM5AV8HAAEBAyQBNQM7AWMCUQFSAacDDAEQGAADVQGyAaICmwH/Ab0CuAH/
+ A0sBjgMAAQEYAANXAb0BSwFOAV0B8ANHAYIDIAEuAT8BUAFlAfQBAAGIAfQB/wEAAUkBpgH/A1kBzAFf
+ AlcB6AGZAU0BTAH/AbQCXQH/AVkCTwHyAzgBXggAAXACbQH1Ad8C0wH/AfoB8QHyBf8B+AH2AfgB/wH3
+ AfUB9gH/AfMB6AHgAf8B8QHLAaoB/wHxAdsBxQX/AccCwgH/A10B4gMtAUYMAAM+AWsDRAF6A0QBeQNC
+ AXQDAAEBBAADMAFLAh4BigH7Ah4BfAH7AzABSwcAAQEDQgF1A0QBeQNEAXoDPgFrFAADLQFFAXQCcgH6
+ AccCwQH/AWICYQHmAw0BEhwAAUIBUAFkAfQBAAGMAfwB/wEAAU0BrAH/A1gBxgFbAlgB6QGFAYEBlQH/
+ AScBvQH9Af8BAAGfAeAB/wGdAZIBsQL/AbsBtwH/Af4BqwGqAf8BywFaAVwB/wFgAkEB+QMwAU0EAAHh
+ AtMF/wH+Af0B+wL/AfsB8wH/Af4B9gHmAf8B+wHkAcAB/wH8AcwBkAL/AbQBUAH/AfcBogFCAf8B6gHF
+ AasB/wH9A/8C1QHYAf8DUwHxAzoBYggAA1ABnQM1AVYDSgGMAzQBVAM/AW0EAAMVAR0CWQFhAeQCWQFh
+ AeQDFQEdBAADPwFtAzUBVQNKAYwDNQFVAk8BUQGcDwABAQM7AWQDYQHuAbsCtAH/AboCtQH/AzoBYgQA
+ AwMBBANMAY8DQwF3AxsBJgwAAzABTQJUAWEB7gEnAbUB9gH/AQABlQHiAf8BawGDAacC/wG7Aa8B/wHk
+ AcoBxwH/AVwB1QHvAf8BiwGuAcoB/wH+AaoBpwH/AfACjgH/AewBhAGIAf8BzAFfAWIB/wNbAdkEAANW
+ AasBngKaAfoB+wH6AeoD/wHeAv8B9wHLAv8B4QGnAv8ByQGEAv8BtAFTAf8B9wGcATgB/wHmAYMBKwH/
+ Ad4BpQGHAf8B9gH3AfoB/wHlAeYB6QH/AV8CWAH5A0oBigMEAQYDSgGKAz4BagNCAXYDSwGOAzIBUAQA
+ AyUBNwJXAWAB6wJXAWAB6wMlATcEAAMxAU8DTAGPA0IBdgM+AWoCSAFJAYgIAAMNAREDWwHDAZwClgH/
+ Ab0CtwH/AcYCvwH/A1oBvQMEAQYDSgGLA1oBxQG3ArEB/wG/ArgB/wM/AW0MAAMUARwBYQJbAeEB9gHX
+ AdMB/wFeAeEB+QH/AVgBxQHnAf8B9QHHAcUC/wHDAbsC/wGyAa4B/wH+Aa4BrQH/AfsBsQG0Af8B7wGr
+ AaQB/wHfAZABigH/AegBgwGEAf8BjwFGAUcB/wgAAykBPwNcAc8BwQG1AaoB/gH/AewBywL/AdoBnQL/
+ AcEBZgH/Af0BrQFKAf8B8gGZAT0B/wHkAYMBMAH/AdQBVwEZAf8B0AGAAVIB/wHrAd8B3gH/AukB6wH/
+ AVkCUQH9A0sBkAJEAUUBfAM9AWcDPQFnA08BlwMSARkDCgENAlcBWQHCAgAB0wH/AgABoQH/AlcBWQHC
+ AwoBDQMSARkDTgGWAz0BZwM+AWoDQgF0BAADBAEFA1QBrAGwAqcB/wHEArwB/wHAArgB/wG4ArIB/wNb
+ AcMDXgHQAakCpAH/AcgCwgH/AckCwgH/A18B4wMUARwMAAMcASgBggFuAXAB/gH/AeQB3gH/Af4B1wHQ
+ Af8B+AHGAcQC/wHBAcMC/wHHAcoC/wHSAdMC/wLeAv8B4wHiAv8B3AHXAf8B8QG2Aa4B/wHFAWsBZAH/
+ A18B4BAAAz4BagNlAeUB4gHGAbIC/wG/AW8C/wGlAT0B/wHuAZEBNQH/AeABbwEvAf8B0wFYASAB/wHD
+ ATYBBQH/AbwBPwEiAf8B4QG9AbkB/wHfAdQB1gH/A1sB0ANEAXsDPQFnAz0BZwNPAZcDEgEYAw4BEwJZ
+ AWEB5AEVAScC/wIAAfQB/wJZAWEB5AMOARMDEQEXA04BlgM9AWcCPQE+AWoDQgF0BAADMwFSAaYCnQH/
+ AcMCtwH/AckCxgH/A9MB/wHXAtUB/wGhApYB/wG8ArUB/wHJAcIBwQH/AYoChwH5A00BkQMSARgQAAME
+ AQYBSgJJAYkBkgGFAYYB+wH2AtUC/wHuAe0C/wH9AfwG/wH8AfkC/wHwAe0C/wHgAdsB/wHzAcgBwgH/
+ AdMBoQGcAf8BhQFXAVQB/wM4AVwUAAMEAQYDTAGTAXcBcAFvAfQB7QGvAYoB/wHwAY0BPQH/Ad4BZgEp
+ Af8B0AFbATAB/wHEAVgBOwH/AbcBUQE/Af8BvAGFAXAB/wG4AagBqgH/A1UBtANKAYoDPQFpA0IBdgNM
+ AY8DLAFDBAADOwFlAkwBdwHzAkQBcwHzAzsBZQQAAysBQgNMAY8DQgF2Aj0BPgFqAkkBSgGJBAADVgGz
+ Ab0CsgH/AbsCsgH/AcgCxgH/AeIC4wH/AeAC3QH/AagCngH/AZMCjwH7A1QBpgMaASUfAAEBAzEBTgNW
+ AbMBaAFmAWQB7AHJAbcBsQH/AdEBvAG3Af8BzQG1Aa8B/wGVAY0BiwH7A10B0gNnAfIB1gHKAckB/wG1
+ AbEBsgH/AzkBXxwAAxoBJQNbAcYBxQGfAZQB/wHLAZwBjQH/AbwBnwGdAf8BtgGkAaUB/wG2AakBqwH/
+ AbYBpgGnAf8BXwJSAfQDJQE3Ak8BUQGcAzUBVQNKAYsDMgFQA1IBowMRARcEAAMWAR4DFgEeBAADEQEX
+ A1IBpAMyAVEDSgGLAzUBVgNQAZ0EAANcAd8BuQGuAawB/wGIAWsBbAH/AaUCmwH/AewC6wH/AbgCrgH/
+ AakBngGaAf8BQgFZAW0B9QNCAXQDMwFTAjwBPQFoAyMBNAMzAVMYAAMBAQIDFgEfAyIBMgMoATwDJgE5
+ AyYBOQMjATMDYAHeBP8BygLDAf8DNgFZIAADWQHHAbkBrQGwAf8BvQGyAbYB/wG6Aa4BsAH/AbsCrAH/
+ AcgCtgH/A38B/gNCAXYEAAM+AWsDRAF5A0MBeANCAXMDOQFfA1IBowMuAUcDEQEXAxEBFwMuAUcDUQGi
+ AzoBYANCAXMDRAF5A0QBegM+AWsEAAMWAR8DXAHPAYsBawFpAf8BswKmAf8BuwKzAf8BvgG1AbQB/wHE
+ Aa4BqwH/ARIBqwHJAf8BAAHLAfwB/wEAAawB7AH/AQABswHwAf8BAAGUAd0B/wEAAZ4B5wH/A04BmQwA
+ AwIBAwMVAR0DFgEfAxYBHgMbASYDIwE0AzUBVwNPAZcDXQHXAc4CzAH+AeoC5QH/A1sBxgMOARMcAANU
+ AasBwgKzAf8B0ALDAf8ByQK8Af8ByAK8Af8B0QLEAf8BugKtAf8DVwG9CAADDAEQAlIBVAGmAzQBVAJH
+ AUgBgwNEAXoDNAFUA0wBjwNPAZcDTwGXA0wBjwM0AVQDRAF6AkcBSAGDAjQBNQFVAlEBUgGnAwwBEAgA
+ A1ABnQGjAZ0BmQH/AaQBkgGQAf8BpgGTAZIB/wG0AasBqQH/ATgBsAG9Af8BEAHTAe8B/wETAdYB8wH/
+ ARIB1QH0Af8BEwHRAfMB/wEUAdUB9gH/AQ4BsgHkAf8CUwFUAawMAAMKAQ0DVwG4AWMBXgFfAeoBaQJh
+ Ae4BsgGkAaIB/QHSAbgBtgH/AeABywHKAf8B7QHZAdoB/wHiAtYB/wFjAmIB6QNOAZYDFgEeHAADQgF2
+ AaACkwH+Ad8C1gH/AdQCywH/AdQCywH/AdoC0QH/AdoCzwH/AWICWQHsAxIBGQwAAyMBMwNSAakCNAE1
+ AVUDQwF3A0oBiwNCAXYDPQFnAz0BaANCAXYDSgGLA0MBdwM1AVYDUgGpAyIBMgwAA1ABmgFrAaMBtgH/
+ AZsBrQGwAf8BkgHCAcMB/wGBAeIB4wH/ASsBfAGxAfwDQAFxAzsBZAM6AWIDOgFhAzoBYQMyAVAUAAND
+ AXgBawJiAe8BdwFpAWsB8QNkAecDYQHaA1sBxANOAZUDOgFgAx0BKgMBAQIcAAMpAT4BhwKEAfkB8ALs
+ Af8B4wLfAf8B5QLhAf8B6QLmAf8B8gLtAf8BhQJzAfsDNgFZFAADIwE0AlEBUgGnA0QBewM1AVYDPQFp
+ AjwBPQFnAjwBPQFnAj0BPgFqAzUBVwNEAXsCUQFSAacDIwE0EAADHAEnAkcBSAGDAVoCXQHKAVgBYwFr
+ Ae8BWgJdAcoDSAGGbAADIQEwA2QB7AT/A/gB/wH0AvMB/wHsAuoB/wHpAuYB/wG/ArcB/wNPAZwcAAMP
+ ARQDPgFrA1ABnQNKAYoDRAF7A0QBewJJAUoBiQJPAVEBnAI9AT4BagMPARSYAANAAXEBkAKNAfkBdwJ1
+ AfIBZAJiAeYDYAHWA1gBwQNUAa4DRgF/AwMBBDAAAxEBFwNIAYgDVwG/A1YBwQNMAZMDGwEm2AADBgEI
+ AzEBTwNCAXYDSAGHAlcBXAHfAgABsgH/AgQBywH/AgUBygH/AhIBmAH/A1wB3AMoATxYAAMHAQoDRAF6
A1IBqQNFAX0DJgE4AwoBDhQAAz8BbgNWAcEDVwG/A1YBvgNWAb4DVgG+A1YBvgNWAb4DVgG+A1YBvgNW
- Ab4DVgG+A1YBvgNYAcADVgG+AzkBXwwAAz4BawFcAlcB3wGTAVIBPwH6AbYBfQE9Af4BVAE0AW8B/gED
- AQgB1AH/ASgBKQHvAf8BLAEtAfcB/wFGAUUC/wFXAVAC/wEzATIBwAH/A1wBzgMKAQ4BXQJZAdcBgwFk
- AVIB9wF1AWIBWwH2AXUBYgFeAfYBdwFiAVsB9gF3AWIBWQH2AXcBYgFaAfYBeQFiAVgB9gF5AWIBSQH2
- AXsBYgFJAfYBewFiAUkB9gF7AWIBSQH2AXsBYgFJAfYBewFiAUkB9gGHAWUBUQH3AV4BWwFaAdkUAAFV
- AlMBsAHlAaYBSgH/Ae4ByAGXAf8BpQF/AVsB/gFtAVIBPQH3A1cB3wNUAasDPgFrAyMBMwMEAQYEAAF5
- Am0B9gHZAtMB/wHJArgB/wG4Ap8B/wG8AqIB/wHEAqkB/wG+AqQB/wG8AqoB/wHJAsEB/wHSAswB/wHH
- Ar0B/wHFArAB/wHeAsAB/wHkAsUB/wHCApMB/wNXAcUEAAMDAQQDUwGqAbgBnAFdAf0B/wHWAaoC/wHZ
- AZwB/wHbAbMBmgH/AR4BGAG+Af8BGwEdAekB/wItAfcB/wJKAv8BTQFRAfMB/wEzAUQB4AH/ATkBMQHs
- Af8CWAFeAeUDDwEUAXICWQHyAd8B2wHfAf8B5wHgAeIB/wHhAbcBqgH/AeYBtAGSAf8B6gG5AZAB/wHd
- AbEBnQH/AdkByAHGAf8B2gHVAdoB/wHaAdIB1QH/AdsB1AHXAf8B2wHUAdgB/wHcAdUB2AH/AeEB3AHf
- Af8B3AHbAeEB/wF3AWQBUwHxBAADFgEfA1oBygNZAcQDSgGKAcgBqwFjAf0BuAG/AWwB/wG+AcQBnQL/
- Ae8B0AL/AewByQH/AfYB1wGtAf8B3AG0AYYB/wGoAYABSgH9AWQBSQE3AfYBXwFbAVoB4ANOAZgBtAKo
- Af0B+gP/AeIC2gH/Ac0CugH/AdQCvgH/AdACvAH/AdICygH/AfgC9w3/AfEC7QH/AeAC1AH/AfkC2gH/
- AeMCsQH/A1gBywQAA1ABnQHnAa0BcAL/Ae4BxAL/Ad8BtQL/AegBrAH/AasBlwGgAf8CAAHFAf8BEQET
- AfMB/wJEAv8BWwFMAfsB/wE/AUsB7AH/ARwBuQHpAf8BGAFSAcAB/wNWAb4EAAFqAWEBXAHuAe0B7AHv
- Af8B/gHDAZ8B/wH+AakBSQH/AdgBlwFoAf8BvQGCAWsC/wGtAVQB/wHpAZwBWQH/AbwBoAGdAf8BwwGz
- AbQB/wHIArcB/wHMArwB/wHQAsEB/wHdAdAB0QH/AewB6gHtAf8BbwFhAVUB7gQAA0gBhAFlAe8BkQH/
- AVABvwFkAf8BPAFyAR0B/wFhAb0BUgH/ATIBxgFBAf8BOAGXASgB/wHpAccBowL/AeUBxAL/AeoBzAL/
- AfIB2QL/AfUB3QL/AewB0AH/AfoB1QGpAf8BYgFVAVMB6gGdAokB/AHvAvIB/wHYAs8B/wHFArEB/wHI
- ArIB/wHAArMB/wHlAt8B/wH6AvcB/wH2AvUB/wHvAfAB8QH/AfIC8AH/AfcC8gH/Ad4C2QH/AdgCwQH/
- AdoCqgH/A1sByAMvAUoBoAFxAU0B+gH/AccBkQL/AdMBnwL/AccBjgL/AdIBhwH/Ab0BlwGCAf8CAAHG
- Af8BIgEgAv8BYQFnAfoB/wE6AWYB3QH/AT8BOgHeAf8BLgGDAfwB/wEAAbIB7wH/AUsBVQFeAe0DNgFZ
- AWoCYQLuAd8B4AL/AbYBcgL/AdoBjAH/AZsBjAHEAf8BQQE8AdAB/wH3Ac4BjwH/AfwBsQFcAf8B5QG+
- Aa4B/wLrAe8B/wHsAuUB/wHsAuYB/wHtAucB/wHyAu0B/wHuAe0B7gH/AW8BYQFYAe4EAAM6AWEBlgHZ
- AacB/gHuAf8B8gH/AaUB+AG5Af8BoAHxAbEB/wGoAf8BwAH/AWUBvwFjAf8B8gHZAbkC/wHnAcoC/wHo
- AcwB/wH9AegBzwH/Af0B6QHTAv8B+AHqAf8B9QHdAcIB/wNTAa0BnQKIAfwB8ALzAf8B2QLQAf8ByAKz
- Af8BwAKtAf8BzALBAf8B7gLlAf8B6ALmAf8B1ALSAf8BywLHAf8BygHJAcgB/wHkAuAB/wHuAuYB/wHW
- AskB/wHRAqMB/wNbAcgBWgJYAcABzgFyATMB/wHRAYwBRgH/AfwBwwF0Av8BvQFpAv8BvAFfAf8B7QGw
- AVQB/wE0ASEBpQH/AjsC/wFoAW8B/gH/ASABwQH3Af8BEwGKAeMB/wFUASQBkAH/AVMBhAGnAf8BAAGI
- AegB/wNQAZ0BagJhAe4B8gHpAegB/wH8AcsBqAL/AfEByAH/AbEBrwHjAf8BbAFqAeMB/wH7AfABzgH/
- AfUBwgGYAf8BxgGgAZQB/wHDAbcBuQH/AcoCuAH/Ac4CvgH/AdACwAH/AdsC0AH/AfAB7wHyAf8BcgFh
- AV0B7gQAA1ABngGMAegBpQH/AeEB/wHjAf8BugH/AcEB/wFyAf8BggH/AXEB8gGRAf8BWAGjAU4B/wHt
- AdcBwQL/Ae8B1wH/AfsB6gHVAf8B+wHsAdsB/wH6Ae4B4AL/Af4B8QH/AZUBgAFfAfsDKgFBAZ0ChwH8
- AfAC8wH/AdkC0AH/AccCsgH/Ab0CrAH/AdMCxwH/AeoC4gH/AeMB4QHgAf8BkQGNAYwB/wEtASsBKgH/
- AaABnQGbAf8B2QHXAdYB/wHsAuUB/wHaAtAB/wHJAp8B/wNbAcgBdQFjAVQB7QGqAVcBHAH/AZcBPgED
- Af8BwwFuASsB/wH5AbEBUgL/AbEBUwL/AbwBUAH/AbUBcAFLAf8BRQE7Aa8B/wFbAVkB7gH/AUgBaAHd
- Af8BBwG1Ae8B/wFCAZUBswH/AbgBZwFRAf8CWgFeAdkDIQEwAWoCYQHuAfYB9QH2Af8B/QHiAdQC/wHk
- AckB/wGjAZ4BwwH/AV0BWgGoAf8B/QHeAcMB/wH3AdUBxAH/Ad4B0wHRAf8B3gLWAf8B4gLYAf8B5ALa
- Af8B5ALcAf8B6wHlAeYB/wH0AfUB+AH/AXICYQHuAzsBZAFfAb8BfwH+AdoB/gHlAf8B2AH/AdwB/wGs
- Af8BuAH/AYkB/QGTAf8BnAH6Aa0B/wE8AcABVQH/AWABjAFEAf8B+AHnAdoB/wH9AfIB5AH/AfkB7wHj
- Af8B/AH4AfAB/wH8Ae0B3AH/AV0CWQHSAwEBAgGbAocB/AHwAvMB/wHZAtAB/wHHArIB/wG+Aq4B/wHV
- AsgB/wHoAuEB/wHoAeUB5AH/AVsBVgFVAf8DAAH/AYECcAH/AeAC3QH/AeoC4gH/AdsC0gH/AcYCnwH/
- A1sByAGYAW4BPgH4AY0BQgELAf8BbwErAQAB/wGbAUkBDQH/AfEBrQFXAv8BxAFyAv8BzgGHAf8B1AGQ
- ATgB/wFnASwBDAH/AVEBKgE5Af8BkgFFAS8B/wGiAZoBiQH/AS8BrAH5Af8BngGDAYAB/wNQAZ0EAAFr
- AmEB7gH5AfgB+QP/AfsB/wHEAckBygH/AUwBigGyAf8BLwFnAZ8B/wGCAZkBpwH/AewB3QHYAf8B3wLV
- Af8B3ALSAf8B3wLWAf8B4QLXAf8B4gLZAf8B6gLjAf8B+AH5AfsB/wFyAmEB7gEwAjEBTQFqAawBhgH5
- AdAB+AHTAf8ByAH9AdUB/wHjAf8B7wH/Ab8B/gHPAf8BiwHvAZIB/wFgAeMBhwH/AUcBnwE/Af8B8gHf
- AdoB/wH9AfgB7wH/AfcB8QHtBf8BwgGhAYsB/gNCAXQEAAGbAocB/AHwAvQB/wHZAtAB/wHIArMB/wG8
- AqwB/wHQAsUB/wHsAuQB/wHjAuAB/wGuAaUBpAH/AWcCXQH/AbUBrQGsAf8B4ALdAf8B7wLlAf8B2QLN
- Af8BywKhAf8DWwHIAZwBagFBAfkBiQFDAQ0B/wGTAUoBDgH/AdsBngFQAf8B/QHLAYoB/wHhAawBaAH/
- Aa8BbgE6Af8BjwFKARUB/wFsASsBAAH/AWsBKAEAAf8BhgE3AQAB/wGyAVoBEwH/AZwBYgFLAf8BrAFo
- AUIB/wNRAaIEAAFsAmEB7gH+AvsB/wHzAfoB/QH/AZsB2AH5Af8BggG9AeIB/wFsAbIB1wH/AVgBtgHi
- Af8BtAHKAdcB/wHKAbUBsgH/AcUCtQH/AcoCuwH/Ac4CvwH/AdECwQH/AdsC0AH/AvoB+wH/AXIBYwFh
- Ae4DBAEGAWYBZAFcAecB1AHxAdAB/wGjAe0BtgH/AcwB/wHbAf8BkgHvAaMB/wGQAdQBjwH/AbYB1QGp
- Af8B3wHjAdAB/wH9AfYB8wH/AfYB9AHyAf8B9wH4AfkD/wH8Af8BZwFfAVQB7gMNARIEAAGaAoYB/AHw
- AvQB/wHZAtAB/wHHArIB/wHEArAB/wHHArwB/wHxAegB6QH/AfgB+QH7Af8B5wLlAf8B5ALeAf8B4QHe
- Ad0B/wHyAewB7QH/AeoB5AHlAf8B1gHFAcYB/wHWAqYB/wNbAcgBdgFjAVcB6wHHAYkBOwH/AfMBtQFi
- Av8B1AGbAf8B/gHdAbYB/wG+AZsBcAH/AZMBZAFFAf8BngFxAVEB/wGdAW4BTAH/AZABXAE0Af8BgAFC
- ARIB/wFdASUBAAH/AXQBNAEAAf8BkQFjATQB/gNCAXQEAAFsAmEB7gL/Af4B/wHrAfUB/AH/Aa4B3AH3
- Af8B2AH3Av8BwAHwAv8BcwHKAfMB/wG+AdgB5wH/AfUB8AHtAf8B8QLtAf8B8wLuAf8B8wLvAf8B8wLw
- Af8B9wL0Af8B/gP/AXMBZQFhAe4DUQGiAfsB2gG8Bf8ByAHpAcwB/wGNAeUBmgH/AZAB2QGVAf8B9AHr
- AecC/wH4Af0C/wH6AfsB/wH1AfcB9QH/AvcB+AH/Af0B/gL/Ae0B1QHIAf8DUQGnCAABmgKFAfwB8ALz
- Af8B2ALPAf8BxAKxAf8BygK0Af8BxAKzAf8B0AHIAccB/wHQAccBwwH/A+wB/wHeAuAB/wH8AvoB/wH0
- Ae4B7QH/AdQCzQH/Ad0CwQH/AdoCqAH/A1kByQJWAVUBtAHOAYkBOAH/AewBwQGQAv8B8AHbAv8B9QHp
- Af8B8gHpAd8B/wHdAcoBtgH/AdkBxAGuAf8B4AHMAbgB/wHaAcYBsAH/AckBrgGUAf8BoQFrAUQB/wGx
- AV8BIAH/AWUBVAFRAe4DGAEhBAABbAJjAe4E/wH8Af0C/wHPAecB9wH/AdUB7AH6Af8BtAHhAf0B/wGe
- AdUB+gH/At4B4gH/AbkBoQGfAf8BuAKkAf8BvgKrAf8BwwKwAf8BxAK0Af8B0gHEAcUB/wH9Af4C/wF2
- AWcBYQHuAYgBdwFVAfMB/wH8AfcF/wHvAdkBvwH/Ab0BxgGLAf8B5wH0AecC/wL7Af8B+AH6AfwB/wH6
- Af0C/wH8A/8B/Qf/AZMBcwFfAfsDJgE4CAABsAKoAf0B9wL8Af8B3gLXAf8ByQK2Af8B0AK6Af8B2QHH
- AcsB/wGmAY0BgQH/AZgBTwEeAf8BmgGWAZMB/wFoAW0BcAH/AeoC7AH/AecB3QHUAf8B5AHLAbEB/wHq
- AccBqwH/AdMBpgGlAf8DXAHOAykBPgGQAWUBSAH2Ae4B0QGwAf8B+AHuAeIB/wH9AfMB6QP/AfwB/wH5
- AfAB5wH/Ae8B1gG+Af8B8AHWAb4B/wHvAdYBvgH/AfEB3QHJAf8B+gHYAbIB/wHVAYYBPgH/A04BlAgA
- AXkCagHyCP8B+wP/Ad8B8gL/AdMB7QL/Ae8B+wP/Av4B/wHtAukB/wHuAusB/wHwAu0B/wHxAe4B7wH/
- AfIB7wHwAf8B9QH0AfUF/wF+AW8BZwHxAkABPwFuAl0BWgHTAa8BlgGHAfkB7wHUAbYB/wHzAcwBrAH/
- AfMB1AG4Af8B7QHLAawB/wHsAcsBrwH/AfQB3gHKAf8B9QHiAdUB/wH3Ae0B5gH/AfcB5QHZAf8DWwHQ
- AwEBAggAAYgCggH3AeUC3wH/AdQCxwH/AcYCtAH/AcwCuAH/AdgBwgHEAf8BvQGmAaIB/wGfAYEBZwH/
- Aa0BoQGgAf8BqwGjAaQB/wHLAb8BwAH/AdMBwgHBAf8B4gHPAcYB/wHhAcgBugH/AckBpQGkAf8DUQGn
- BAADRAF6AcMBpQFaAf0B/AHsAdcB/wH6AfIB5wH/AfsB8wHrAf8B/AH0AesB/wH3AeUB1AH/AfcB5AHS
- Af8B+QHuAeAC/wHzAdsB/wHyAbEBcQH/AVsCWQHEAwQBBggAAWACXAHUAYYCbQH3AXkBaAFlAfYBewFo
- AWQB9gF7AWgBYgH2AX0BaAFiAfYBfQFoAWIB9gF9AWgBYgH2AX0BawFiAfYBgQFrAWIB9gGBAWsBYgH2
- AYEBawFiAfYBgQFrAWIB9gGBAWsBYgH2AYwBbgFtAfcBXgJaAdgIAAMlATcCTwFOAZcBZgFjAV8B4AHB
- Aa4BmgH9AfMB3AHDAf8B/AHrAcoB/wGqAX8BZgH+A1UBsgJTAVIBqAFbAlkBxAMtAUUMAAE9AjwBZwFS
- AlEBoQNdAdcBewJsAfoBZAJZAewBVgJUAasDUAGdAVIBUQFSAaEDUgGhA1IBoQFSAlEBoQNSAaEDUgGh
- A1IBpANMAZMDGAEhCAACRwFGAYABkwF1AWIB9gH3AeIBzAL/Af0B9wf/Af0D/wH6Av8B7gHXAf8BtgF+
- AWoB/ANWAbYDDAEQXAADBwEKAzABSwJWAVUBtAGHAW0BZQH0A1UBtWgAAygBPAJWAVUBtAFuAWMBXQHp
- AaoBjAF9AfkBrQGTAXgB+gF8AWkBXQHwAVwCWQHJAzoBYf8AGQADHwEsA0sBjwNVAbQDVwG/A1gBwANX
- Ab0DVAGuA0EBcwMNARJgAAMMARADTgGUA1UBtQNVAbQDVQG0A1UBtQNWAbYDVgG2A1UBugNWAb4DQQFz
- GAADBQEHAwEBAiwAAzIBUAFLAVgBSwHvAScBmAE7Af8BLgGwAUwB/wEyAbgBUwH/ATMBuAFTAf8BLwGz
- AU4B/wEpAZ0BQAH/AS8BTwEwAf0DVwHFAw8BFCwAAw8BFANOAZcDRgGAAwMBBCAAA0gBhwGeAT0BQAH/
- AbEBSgFNAf8BtQFNAVAB/wG+AVUBVwH/AccBXAFeAf8BzwFkAWUB/wHUAWgBaQH/AdkBbQFuAf8B1QFz
- AXQB/wFeAlkB5QMGAQgQAAJTAVUBrQEaAXMB0gH/AUIBaAGJAfUDWQHHAk0BTgGWAzsBZQNKAY0BmgFt
- AVEB9wFfAV0BWQHXAVYCVQG0AU0CTAGRAUACPwFuAyUBNwQAAVwBXwFbAeABPQHVAWgB/wFKAeUBiAH/
- AVUB4QGNAf8BWwHiAZIB/wFcAeEBkgH/AVgB4wGPAf8BTwHlAYsB/wFFAeABcgH/ASkBZwEtAf4DQAFx
- KAADJQE3AVoCWwHhASQBkgEdAf8BLAFAAQwB/QNWAbMDEAEWHAABWwJYAcsB8AGbAZQC/wG7AaQB/wH+
- Ab0BqQL/AbwBqAL/Ab4BqwL/AbwBqAL/AbwBqQL/Ab8BqgL/AcMBuAH/AV8CWAHjAwQBBhAAAUMBXQF5
- AfABPAHBAf4B/wFfAckB/gH/AVgByAH+Af8BQwG3AfAB/wFeAWABagH/AfMBuAGGAv8BvwFyAv8BuQFl
- Av8BsgFWAv8BsQFUAf8B7AGkAWIB/wNEAXkEAAE4AYABPgH8AWQB6AGcAf8BdAHeAZ8B/wGJAeEBpwH/
- AZAB4wGsAf8BkQHjAa0B/wGNAeIBqgH/AYQB3wGiAf8BbgHsAaIB/wFDAa8BWAH/A1EBoCQAA0IBdgEz
- AWIBOAH2AScB0AFeAf8BLAHJAToB/wErAZ4BAAH/AR8BVQEAAf8DWgHbAy0BRhQAAwEBAgFjAlgB6QH8
- AcYBrAL/AfUB2QH/AfgB7gHZAf8B+gH0AeIB/wH7AfQB5AL/AfwB8QL/Af4B+QL/AfwB+AH/Ae0B4QHd
- Af8DVgG+EAADCQEMAQEBYAHUAf8BTwHFAf4B/wGSAdgC/wGWAdwC/wGDAaoBvwH/AdgBnwFyAv8BzgGa
- Av8BywGTAv8BxQGIAv8BvgFvAf8B+AGyAWQB/wFtAXABhwH/AlABUQGfBAABWAGTAV8B+wGUAeoBtAH/
- AacB6AG8Af8BsgHsAccB/wG+AfMBzAH/AcAB9AHOAf8BtwHsAckB/wGtAeoBwAH/AZ8B8AG7Af8BWwG2
- AW0B/wNMAZMgAAMnAToBKQF9AT4B+gEqAdcBYgH/ASkB1gFnAf8BJgG0AS4B/wEoAZgBAAH/ASsBpAEA
- Af8BJgFrAQAB/wNaAcoUAAMjATMBkQFPAU0B+wH/AdMBtwL/AfcB3wH/AZ0BjwGCAf8BRgFCAT4B/wGO
- AYgBjAH/AcIBsAGrAf8B6gHgAdED/wH+Af8BzQHBAcAB/wNGAYEQAAMcASgBAAFqAeIB/wFtAdAB/gH/
- Ab4B6AL/AbgB5QH9Af8BnwGMAYQB/wH9AdkBtAL/AdYBqwL/AdMBpAL/Ac4BmwL/AcgBjgH/AckBjwFm
- Af8BPgGvAfkB/wNSAakEAAFVAWUBVQHqAbIB8QHJAf8B0AH0Ad0B/wHmAfsB7AH/AeUB8QHrAf8B4gHv
- AekB/wHtAfwB8AH/AdwB9gHmAf8BwAH5AdMB/wFTAZ0BWQH9AzYBWRwAAwwBEANYAcABIwG7AUgB/wEo
- AdMBYAH/ASUBzQFfAf8BLAHAAT8B/wEpAZcBAAH/ASkBmwEAAf8BKgGYAQAB/wExAj4B+ANIAYYDAwEE
- DAADRAF6Ab0BWgFQAv8B3gG+Av8B8QHZAf8BwgG0AaMB/wFHAU0BSAH/AYEBpwHAAf8BEAFMAacB/wJP
- AW8B/wHvAdsByQH/AYoBegF4AfoDLQFFEAACKwEsAUMBCAGCAfAB/wGPAdkB/gH/AcIB6gL/AcEB5QH4
- Af8B0QGnAYwC/wHeAbkC/wHcAbYC/wHZAbAC/wHVAagB/wHzAaQBZQH/AaYBqgGuAf8BQAG2Af4B/wNK
- AY0EAANOAZkBtwHgAcAB/wH0Af8B9AH/AewB/QHWAf8BcQGHAdsB/wFdAWIB2wH/AdAB+wHFAf8B6QH/
- AewB/wHNAfIB1AH/A1sB2QMHAQoYAAMmATgCVwFcAd8BAAEPAagB/wEYAa8BRgH/AScB1QFZAf8BRQHm
- AYMB/wFEAesBhwH/ASwBwQFBAf8BKQGdAQAB/wEnAY0BAAH/AQMBYAGnAf8BCwE5AbAB/QNVAboDFQEd
- CAADVQGyAdIBbAFYAv8B5QHDAf8B8AHaAcIB/wHpAdkBwgH/AbACpwH/AYwBvwHoAf8BDAGvAv8BAAFo
- AdIB/wFiAWYBogH/AWICVgHvAxIBGRAAAzgBXgEYAZEB/AH/AZ4B3gL/AcgB6wL/AcUB4AHuAf8B5gG7
- AZsC/wHlAcgC/wHWAbAC/wGRAUIC/wGmAV8B/wHVAWMBMQH/AZsB2wH6Af8BOwG1Af4B/wNBAXIEAAMP
- ARQBWgFeAVoB1QGiAdIBoAH/AXEBwwG2Af8BGwFiAbkB/wEOAVABuQH/ATIBsAGVAf8BcQHTAY0B/wFd
- AWgBXQHwAykBPhgAA0EBcwIuAW4B9gIAAfcB/wEAARIBywH/AUMBxAFUAf8BiwH7AagB/wFlAf4BnwH/
- AUIB6gGDAf8BLQHWAWkB/wEpAcgBSQH/AScBoAEJAf8BAgFuAZwB/wEAAWgC/wEAATgBzgH/A1cB3wMw
- AUsDAQECAWECWgHcAeMBkQFqAv8B7QHKAf8B5wHPAbYB/wHlAdABugH/AdoBxAG2Af8BSQFyAacB/wFh
- AdkB9wH/ASABzgL/AQABmgHsAf8BGAE8AVkB/QNRAacDBgEIDAADRAF5ASkBmAL/AawB4wL/Ac8B7gL/
- AckCzQH/AfMB2gHFAv8B8QHiAv8B6wHWAv8BrgFqAf8B2AGGAVYB/wErARsBcgH/AWcBqgHhAf8BNwGt
- AfoB/wM4AVwIAAMZASMBRwFiAWUB9gFuAbQB3QH/Ab0B1AHfAf8BwgHXAd8B/wFaAZ4BywH/ARIBawFw
- Af8DTQGWHAACJQGTAfgCAAL/AgAC/wIAAdkB/wFLAYsBbgH/AaYB+QGgAf8BZQH/AaAB/wE+AeYBggH/
- AS8B1QFiAf8BKQHNAUsB/wEUAaIBRAH/AQABbgHEAf8BAAFgAv8BAAFqAv8BAAFHAeQB/wNYAcADHwEs
- AWwBQQFAAfUB8wGtAYsB/wH7AeUBxQH/AdEBuQGkAf8BxgGyAaAB/wHtAdgBwQH/AcwBvgG5Af8BSwGL
- AbMB/wFhAd0B8wH/ATsB8AL/AQABxQH7Af8BBgFRAX8B/gNYAcYDFQEdCAADTgGUATsBnwL/AbsB6AL/
- AdYB8AL/Ac4BwgG2Af8B+wHwAeYC/wH2Ae0B/wH9AfEB4wH/Ae4BzQGvAf8BWAFJAZMB/wEAAQYBuwH/
- AQABCQGtAf8BAgEVAbUB/wJXAVoBxQgAAzoBYQFTAagBvQH9AbQBzwHlAf8B5gHqAfEB/wHsAe4B9gH/
- AbwByQHdAf8BPgGWAcwB/wNZAdIDHwEsAxIBGQMEAQYDBAEGDAACCwG8Af0CAAL/AgAC/wEWARQB/gH/
- AgABxwH/ARUBUAFoAf8BUAHnAWIB/wFIAfoBgQH/ASoBxwFCAf8BBwGUAVQB/wEAAZsB1AH/AQABngL/
- AQABYAL/AQABYgL/AQABXgH4Af8DWQHHAzoBYgGGATcBLwL+AcEBmQH/Ad4ByAGuAf8BxQGuAZoB/wHQ
- Ab8BqAH/AdMBwgGtAf8B3wHNAbMB/wG4AaABmwH/ATgBXQGbAf8BWQHOAesB/wFNAf0C/wEAAd0C/wEA
- AWABrAH/AlsBXQHaAyUBNwQAAlMBVQGwAVEBqwL/AcsB7QL/AeAB9AL/AdUBwAGtAf8B/gH7AfgC/wH7
- AfcB/wHzAfAB7AH/AdMBzgHMAf8BTgFWAbcB/wFaAXIB8QH/ATIBSQHbAf8BMQFGAdoB/wJYAV0B0QgA
- AVACUgGjAZ4B2QH0Af8BsgHgAfoB/wGqAdoB9gH/AZ0B1AH1Af8BlQHRAfUB/wFuAc0B9wH/AlMBYQHx
- AV8CVwHfAWICWAHpAV4BWwFaAdkBXgJaAdgDUwGwAygBPAQAAhYBrQH7AgAC/wJDAv8CgQH+Af8BUQFO
- Af0B/wEHAQAB3gH/AQIBKQGIAf8BJwGkATwB/wEKAZwBhwH/AQABowHsAf8BAAHMAv8BAAHHAv8BAAGc
- Av8BAAFpAv8BAAFWAfQB/wNYAcYDTgGZAboBQQEuAf8B8wHAAZgB/wHWAcIBpAH/AdABuAGeAf8BxgGV
- AY0B/wHLAYcBjQH/AccBgwGNAf8B1QGQAZQB/wHUAYIBkwH/AVsBUAGbAf8BTQGzAd4B/wFWAfYC/wEN
- Ad8C/wE4AWgBpwH/AloBWwHcBAACWAFbAcsBaAG5Av8B3AHzAv8B6gH3Av8B3QHGAbIB/wHzAd8B0AH/
- AfUB5QHYAf8B9gHpAd4B/wH4Ae0B5AH/Ab4BtgHMAf8BNgFBAbgB/wGXAZ8B0wH/AU0BkAHHAf0DHwEs
- CAABTQJOAZYBsgHeAfIB/wHbAfcC/wHRAe8C/wG4AeYC/wGgAd8C/wGGAdcC/wNZAewBngFvAVwB+AH/
- AekBwAL/Ad0BvAL/AdwBuAH/AdwBpQF0Af8BYAFXAVUB6wMwAUsCKwG8Af0CbgL/ApIC/wJvAv8CZQL/
- AV0BWwL/ASIBFQHhAf8BHwEhAWIB+wEAAawB4wH/AQAB9QL/AQAB3gL/AQABwgL/AQABsAL/AQABpgL/
- AQABcAH7Af8DWQHEA1oCygFWATwB/wHgAb4BmAH/AdMBtQGXAf8B0wGWAY0B/wHxAaIBpQH/Af4BswG0
- Af8B/gG0AbYB/wH+AbcBuQL/AcQBwgH/AfkBuAG6Af8BgwGAAbgB/wFIAa4B5QH/Aa0B8gHzAf8BbwGw
- AewB/wFNAVEBYAHtBAACWQFdAdIBiwHIAv8B8QH6Av8B9wH8Av8B9gH5AfsB/wHwAeUB3AH/Ae4B4AHV
- Af8B7QHcAc8B/wHsAdgByQH/AeoB1AHCAf8B9AHwAe0B/wH3AfsC/wFYAWIBcgHpDAADKAE8AXcBlQGi
- AfoE/wH1A/8BzwHyAv8BtAHyAv8BYgGPAbYB/gFnAVkBVQHyAfkBzAGXAv8B3gGyAv8B4AG5Av8B4QG5
- Av8B7AG+Af8B7AGlAWgB/wNXAb0CWAFbAcsCcwHlAf8CkQL/Am4C/wJkAv8CYAL/AUQBQAGQAfoDUAGd
- AVcBXgFiAd8BAAHpAf4B/wEAAeQC/wEAAcAC/wEAAbEC/wEAAa4C/wEwAW0BngH3AzoBYgFjAkoB7wG+
- AWcBSAH/AcwBogGEAf8B1AGOAYcB/wH3AasBqQL/AbcBsgL/AbYBswL/Ab4BvAL/AcYBxQL/AdkB1wL/
- AfwB+gH/AeYBsQG9Af8BXQFYAV4B5QFLAWgBsgH9ARwBWgHKAf8DSwGPBAADHAEnAlMBVQGtA1wB0QJd
- AV8B1wJeAWMB3QJfAWYB4wFiAWMBbgHpAWIBaAF7Ae8BagF0AZYB9QFtAZABvwH7AYcBpgHwAf8BiAGr
- AfUB/wJUAVYBqxAAAUYCRwGAAX4BmAGiAfoB1gHlAe4B/wG8AeIB8QH/AWoBjAGyAfwCUAFSAaMBYQJa
- AdsB/wHaAZQC/wHNAZkC/wHOAZ0C/wHMAZsC/wHXAZwB/wH+AbUBZwH/A1cBvwQAAk8BUQGcAj4BtAH8
- AoMC/wJZAfUB/wJLAWUB7wMzAVIEAAMQARYBWAJaAcABAAG1AfYB/wEAAc8C/wEAAaQC/wFaAV8BZQHg
- AycBOgQAAXYBKwEnAfwBtgFkAU8B/wHoAasBoAL/AcYBwAL/Ac8BxwL/AdQBzQL/Ad4B1wL/AeYB4QL/
- Ae8B6QL/AvoB/wG7AYQBmQH+A1QBrwMEAQYDQAFwAksBTAGPAwEBAi8AAQEDBQEHGAADLwFKAVECUgGh
- A1IBqQM5AV8EAANFAX0B1gGNAXIB/gH/AfQB1AL/AfQB3wL/AfUB3QL/AdsBqgH/AYwBUgE+AfcDMQFP
- CAADOwFkAlEBcwHuAlsBXgHQAxgBIRAAA0wBkgE0AWIBmgH2AlUBVwG6AwwBEAgAAV8CVwHfAZcBQQFA
- Af4BtwJSAf0BqwFZAVsB/AGqAVsBYAH8AZkCXwH7AZkCXwH7AZwBVgFrAfoBmgFfAWIB+wF5AVkBZwHy
- A0QBfHgAAUcCRgGAAWwBZQFeAeUBqgGEAXoB+gGeAYIBbQH3AWACXAHUAzMBUoQAA0sBjgNZAcMDVwHC
- A0IBdkAAAxEBFwNEAXkDVgGzA1gBxgNXAcUDVAGvAz0BagMNARIQAAJVAVcBugEhASQBlAH7ATsBPQGO
- AfgBOAE6AYsB+AE0ATgBiAH4ATEBNwGFAfgBMQE0AYIB+AEuATEBfgH4Ai4BfAH4ASsBLgF6AfgBKwEs
- AXkB+AEpASsBeAH4AisBdwH4AisBdwH4ARwBHQFtAfsCWQFbAcMMAANTAaoDWAHRA1gBywNaAdUBUAFd
- AWoB7QE/AV0BdwHzAVYBVwFfAegDWwHQA1wBzgNZAdIDRAF8CAABNgFtAYwB9wEAAbUB4QH/AQEBqwHa
- Af8BTwFXAVkB7AMZASM4AANDAXcBYgFZAVgB6wJ/AU0B/gGBAakBSAH/AYYBuwFWAf8BiQG2AVcB/wGz
- AagBcgH/AaIBVgFOAf0BWgJYAd4DOQFfDAABNwE4AYMB9gEjAT4B7gH/AQsBJgHkAf8BBgEfAeAB/wEJ
- AR4B2gH/AQcBGgHVAf8BBAEVAc8B/wEPAR0B1gH/AQ8BGQHSAf8BAgEJAcEB/wECAQYBvQH/AQABBAG5
- Af8CAAG1Af8CAAGvAf8CAAG5Af8CMwF6AfcMAAGyAasBrAH/AdsB0gHRAf8B4gHMAcIB/wGFAaMB3gH/
- AVoB0gL/AWgB6QL/AWIBrQHyAf8B2gHGAcIB/wHfAdUB1AH/AbwCtgH/A1UBtQgAAT4BdQGDAfQBAAHo
- Av8BAAHuAv8BAQGDAbUB/wJaAVwB3ANKAYsDAwEELAABUgJQAaQBsgJ/Af4B/wHvAeUB/wHdAfgBzwH/
- Ad8B9QHOAf8B5gH1AdYB/wHpAfoB3wP/AfoD/wH5Af8B6wHIAbkB/wFqAkEB+QNEAXoIAANVAbUBHwEy
- AdsB/wEAAREB5AH/AVgBZwHRAf8BqwGvAdAB/wGpAa4B2QH/AbMBtwHgAf8BnAGfAccB/wGaAZwBxAH/
- AbQBtgHcAf8BrAGuAdMB/wGvAbABywH/AWUBZwG6Af8CAAGkAf8CAAGrAf8CVgFYAcEMAANRAaADVQGt
- A1ABnQNVAbUBYAGqAcsB/QFtAbcB5wH/AVkBYAFoAesDVAGmA1UBrQNSAakDKAE8CAABWgJdAdMBAAHa
- AfQB/wEAAdkB9wH/AQABzAH6Af8BAwG4AesB/wElAUMBagH5AzgBXCgAA0sBkAHGAZoBcQL/Af0B4wL/
- AeoBzgL/AeABwgL/AdwBuwL/AdwBuQL/Ad0BvQL/AeABwwL/AeoB0QP/AfYB/wH9AeQB1AH/AWoCQQH5
- AzgBXQQAAysBQgEoAS4BlwH7AQkBJQHqAf8BcQGIAdcB/wH5AfUB2QH/AfgB9gHqA/8B+wH/Al8BUwH/
- AlQBSQP/AfkB/wL6Ae8B/wL7AeIB/wGNAY8BxQH/AgABtQH/AQABAgGTAf8DMgFRGAADMwFSAX0BeQF6
- AfoBpQGaAZwB/wNUAa4YAAMkATUBVgFjAWgB6AEAAdsB9AH/AQAB2gH2Af8BAgHuAv8BAAGaAdQB/wFD
- AUoBWQHyA0sBkAMjATMcAAMmATgBfQFcAUMB+AG/AdMBjgL/AdsBsgL/Ac8BnAL/AcoBkwL/AcgBjwL/
- AckBjgL/AcsBlAL/AdIBnwL/AdYBqQH/Ae4B1QGrAv8B+AHhAf8B8gHIAa0B/wNYAd0DDQESAwQBBQNT
- AaoBHgExAd4B/wEbATIB6AH/AdYB2AHlAf8B+gH5AfIB/wL9Af4B/wLVAdcB/wLSAdMB/wL9Af4B/wL6
- AfUB/wHhAeIB5QH/ASIBJQG8Af8BAAECAbUB/wJWAVgBuQMJAQwMAAMxAU8DVgG2A1cB6AF1AXkBdAH6
- AbMBqwGmAf8BhgJtAf8DWAHRAxABFhgAAyQBNQFVAWcBcQHrAQAB4QH5Af8BAAHQAfUB/wEAAdQB/gH/
- AQYBwQHxAf8BEgFFAZkB/QFLAVEBXQHtA1EBpwNKAYsDJAE1EAADVQGyAXABjwE3Af8BbAGjAUAB/wH4
- AckBjQL/AcABcgL/AboBaQL/AbkBZQL/AbsBaAH/AdQBrwFWAf8BdAGYATYB/wHhAb0BcAH/Ae0BxwGO
- Af8BqAGyAWQB/wFqAakBSwH/AZYBUwFAAf0DPQFqBAADKgFBAkIBhAH1AQgBJAHtAf8BagGDAegD/wH3
- Bf8DvAH/A7UH/wH8Af8BkAGUAdUB/wEAAQIBwAH/ATEBNAGBAfgDMQFOEAABbQJnAfEB4wHaAdsB/wHz
- AesB6gH/AekB7AHkAf8B2wHQAc4B/wHLAbgBuQH/AY4CgQH/A1gB4wM9AWoDAQECFAADJgE4AVABZgFx
- Ae0BAAHiAfkB/wEAAdMB8wH/AQsB5QH9Af8BEwHmAv8BDQGvAfIB/wEAAVsBxgH/AQABUAG+Af8BUwFU
- AVwB5wM4AV0MAAFmAVUBVAHqAT8BggEdAf8BFgFeAQAB/wFwAYkBKQH/AfUBswFYAv8BsQFTAv8BrgFP
- Av8BswFVAf8BhgGKAScB/wEGAVgBAAH/AWsBhgElAf8B/QHFAYMB/wGdAZwBQwH/AVYBkQEvAf8BxgGc
- AWMB/wNTAbAIAAJUAVYBqwElATcB3gH/AUABVAH1Af8B7QHuAfwF/wOMAf8DcwX/AeoB6wH+Af8BJQEs
- Ad8B/wEFAQ4BwAH/AlUBVwG3AwEBAhAAAX4CegH4Ae0C4AH/AeIC1gH/AecB3AHeAf8B2QHKAcsB/wHU
- AsMB/wHlAtQB/wHJAroB/wFUAk8B/QNXAcIDIQEwFAADKQE/AUoBYwFzAe8BAAHjAfoB/wEAAc4B8gH/
- ARYB5AH7Af8BOAP/AUIB6gL/AVoB5AL/ARMBigHnAf8BMAE5AW0B9wNGAYAIAAGHAVsBQQH5AS0BYQEM
- Af8BFwFMAQAB/wEUAUsBAAH/AbEBkQEyAv8BswFSAv8BtAFUAv8BuAFXAf8BXgFrARkB/wEZAU8BAAH/
- AR4BUAEAAf8BqgGTATkB/wHlAbABXAH/AckBsgFnAf8B7AG6AYoB/wNXAcUIAAMnAToCQQGVAfkBngGi
- Af0B/wLPBv8DagH/A1gF/wKnAv8BGgEbAf4B/wEiASQBqAH9Ay8BSRQAAYQCggH3AfkC8gH/AfIC7QH/
- AfEC7gH/AdwCzwH/Ac8CvQH/AdQCxQH/AeEC0gH/Ae8C4gH/AZgCjQH/A1EBoRgAAy0BRgFJAWQBdQHv
- AQAB3QH0Af8BAAHHAfAB/wEVAeAB9gH/AU0D/wGOA/8BjwH2Av8BJwGjAfkB/wEwAT4BYgH1Ay8BSgQA
- AZABXwEyAfsBJQFMAQQB/wEWATgBAAH/AWQBYgEYAf8B4wGpAUsC/wG3AVoB/wHbAaMBSQH/AbYBjgE2
- Af8BNQFHAQAB/wEaAToBAAH/AR0BPgEAAf8BNgFMAQMB/wGeAYMBLwH/AaMBjwE8Af8BuwGXAVIB/wNZ
- AccIAAMCAQMCUAFSAaMBdAGCAecB/wG9AbwC/wL7Av8CSQFFAf8COwE2Af8C9gH+Af8CYgL/ASUBJgHi
- Af8DVQGyAwUBBxQAAYUChAH3Af4C/AH/AewC5gH/Ae8C6gH/Ad0C0QH/Ac4CvAH/AdMCxAH/AdUCxgH/
- Ae0C3wH/AboCrQH/A1IBqRwAA0gBhAEAAagB2gH/AQAB6wH9Af8BAAHkAfQB/wETAv4B/wFEA/8BkgP/
- AZsD/wEQAXEB4QH/A1sB0AMPARQBfQFYAUgB9gGFAWsBJAH/AbcBigEwAf8B9QGuAVAC/wG+AWcB/wHb
- AawBYAH/AU4BUwEfAf8BOwFKARcB/wFBAUsBGQH/ATgBQQEQAf8BKQEzAQAB/wEzATQBAAH/AjsBAAH/
- AToBQAEHAf8BkgFkAS0B/wNVAbQMAAMkATYCTAGCAfMBsgG0Af4B/wLfAv8CagFkAf8CZQFZAf8CwAH8
- Af8BUQFSAf4B/wE6ATsBigH3AyoBQRgAA4QB9wHYAsoB/wHIArcB/wHoAuAB/wHfAtMB/wHMArkB/wHS
- AsEB/wHVAsQB/wHmAtYB/wGtAp8B/wNRAaccAAJbAWAB1gEAAcoB+QH/AQAB4AL/AQAB7wL/AQAB/AL/
- ARID/wE5AfoC/wGGA/8BXwHgAv8BBwFLAZsB/gNKAYwBXgFbAVoB2QGxAYsBNgH/Ae0BqgFJAv8BygGM
- Av8B3gG3Af8B4AHSAbkB/wGfAaYBjwH/AaABpwGPAf8BqAGrAZMB/wGmAakBkAH/AZUBmQFxAf8BYQFl
- AT8B/wEcASwBAAH/ASQBNAEAAf8BqgFlATQB/wNDAXcMAAMDAQQDUAGdAYIBhQHlAf8ByQHIAv8C5gHv
- Af8C5gHtAf8ClgL/AUYBSAHjAf8DUwGqAwYBCBgAAYQCgwH3Ac0CuwH/AcMCsgH/Ae8C6gH/Ad4C0gH/
- AcYCswH/AdACvgH/AdECwAH/AeIC0QH/AakCmgH/A1EBpxwAAVUCVwG6AQABxwHzAf8BAAHRAv8BAAHa
- Av8BAAH1Av8BEgHYAfEB/wE+AVoBggH1AS8BqAHCAf0BWAP/AQcBggHoAf8DTgGUAUcCRgGBAZ0BaQEx
- Af8BpQG1AXMB/wH5Ae4B2gL/AfAB4QL/AfYB6gH/AfEB7gHgAf8BwgHPAbgB/wHGAdEBugH/Ac0B1QG8
- Af8BxAHQAbcB/wG6Ac0BtQH/AYUBqAGGAf8BagGAAS0B/wFmAVkBVQHsAxIBGRAAAyUBNwJTAYAB8QG+
- AcAB/gH/AtcC/wHJAcgC/wGOAY8C/wE7AT0BhQH2Ay0BRRwAA4QB9wHvAugB/wHwAusB/wH+Av0B/wHZ
- AswB/wG+AqgB/wHHArQB/wHNArsB/wHfAs0B/wGmApcB/wNRAaccAAMQARYBVQFjAXMB6wEAAdMC/wEA
- Ac8C/wEAAegC/wElAYYBugH+A1kBzwElAWUBlQH4AQABswHzAf8CVwFaAb0DDQESAw0BEgFgAlcB3wG9
+ Ab4DVgG+A1YBvgNYAcADVgG+AzkBXwwAAz4BawFcAlcB3wGHAU4BQwH6Aa4BfQE9Af4BVAE0AW8B/gEA
+ AQQB1AH/ASQBJQHvAf8BKAEpAfcB/wFCAUEC/wFTAUwC/wEvAS4BwAH/A1wBzgMKAQ4BXQJZAdcBfwFk
+ AVIB9wFrAWIBWwH2AWsBYgFeAfYBbgFiAVsB9gFuAWIBWQH2AW4BYgFaAfYBcQFiAVgB9gFxAWIBSQH2
+ AXMBYgFJAfYBcwFiAUkB9gFzAWIBSQH2AXMBYgFJAfYBcwFiAUkB9gGDAWUBUQH3AV4CWwHZFAABVQJT
+ AbAB5QGmAUYB/wHuAcgBlwH/AZ0BfwFbAf4BbQFSAUIB9wNXAd8DVAGrAz4BawMjATMDBAEGBAABcQJi
+ AfYB2QLTAf8ByQK4Af8BuAKfAf8BvAKiAf8BxAKpAf8BvgKkAf8BvAKqAf8ByQLBAf8B0gLMAf8BxwK9
+ Af8BxQKwAf8B3gLAAf8B5ALFAf8BwgKTAf8DVwHFBAADAwEEA1MBqgG0AZwBVQH9Af8B1gGqAv8B2QGc
+ Af8B2wGzAZoB/wEaARQBvgH/ARcBGQHpAf8CKQH3Af8CRgL/AUkBTQHzAf8BLwFAAeAB/wE1AS0B7AH/
+ A14B5QMPARQBaQJZAfIB3wHbAd8B/wHnAeAB4gH/AeEBtwGqAf8B5gG0AZIB/wHqAbkBkAH/Ad0BsQGd
+ Af8B2QHIAcYB/wHaAdUB2gH/AdoB0gHVAf8B2wHUAdcB/wHbAdQB2AH/AdwB1QHYAf8B4QHcAd8B/wHc
+ AdsB4QH/AW8BZAFTAfEEAAMWAR8DWgHKA1kBxANKAYoBvgGoAVsB/QG4Ab8BaAH/Ab4BxAGdAv8B7wHQ
+ Av8B7AHJAf8B9gHXAa0B/wHcAbQBhgH/AagBgAFGAf0BYgFJAT0B9gJfAV4B4ANOAZgBsAKoAf0B+gP/
+ AeIC2gH/Ac0CugH/AdQCvgH/AdACvAH/AdICygH/AfgC9w3/AfEC7QH/AeAC1AH/AfkC2gH/AeMCsQH/
+ A1gBywQAA1ABnQHnAa0BbAL/Ae4BxAL/Ad8BtQL/AegBrAH/AasBlwGgAf8CAAHFAf8BDQEPAfMB/wJA
+ Av8BVwFIAfsB/wE7AUcB7AH/ARgBuQHpAf8BFAFOAcAB/wNWAb4EAAFjAWEBXAHuAe0B7AHvAf8B/gHD
+ AZ8B/wH+AakBRQH/AdgBlwFkAf8BvQGCAWcC/wGtAVAB/wHpAZwBVQH/AbwBoAGdAf8BwwGzAbQB/wHI
+ ArcB/wHMArwB/wHQAsEB/wHdAdAB0QH/AewB6gHtAf8BZwFhAVUB7gQAA0gBhAFhAe8BkQH/AUwBvwFg
+ Af8BOAFuARkB/wFdAb0BTgH/AS4BxgE9Af8BNAGXASQB/wHpAccBowL/AeUBxAL/AeoBzAL/AfIB2QL/
+ AfUB3QL/AewB0AH/AfoB1QGpAf8BXQJVAeoBkQJ+AfwB7wLyAf8B2ALPAf8BxQKxAf8ByAKyAf8BwAKz
+ Af8B5QLfAf8B+gL3Af8B9gL1Af8B7wHwAfEB/wHyAvAB/wH3AvIB/wHeAtkB/wHYAsEB/wHaAqoB/wNb
+ AcgDLwFKAZgBbQFNAfoB/wHHAZEC/wHTAZ8C/wHHAY4C/wHSAYcB/wG9AZcBggH/AgABxgH/AR4BHAL/
+ AV0BYwH6Af8BNgFiAd0B/wE7ATYB3gH/ASoBgwH8Af8BAAGyAe8B/wFSAVkBXQHtAzYBWQFjAmEC7gHf
+ AeAC/wG2AW4C/wHaAYwB/wGbAYwBxAH/AT0BOAHQAf8B9wHOAY8B/wH8AbEBWAH/AeUBvgGuAf8C6wHv
+ Af8B7ALlAf8B7ALmAf8B7QLnAf8B8gLtAf8B7gHtAe4B/wFnAWEBWAHuBAADOgFhAY4B0QGfAf4B7gH/
+ AfIB/wGlAfgBuQH/AaAB8QGxAf8BqAH/AcAB/wFhAb8BXwH/AfIB2QG5Av8B5wHKAv8B6AHMAf8B/QHo
+ Ac8B/wH9AekB0wL/AfgB6gH/AfUB3QHCAf8DUwGtAZECfgH8AfAC8wH/AdkC0AH/AcgCswH/AcACrQH/
+ AcwCwQH/Ae4C5QH/AegC5gH/AdQC0gH/AcsCxwH/AcoByQHIAf8B5ALgAf8B7gLmAf8B1gLJAf8B0QKj
+ Af8DWwHIAVoCWAHAAc4BbgEvAf8B0QGMAUIB/wH8AcMBcAL/Ab0BZQL/AbwBWwH/Ae0BsAFQAf8BMAEd
+ AaUB/wI3Av8BZAFrAf4B/wEcAcEB9wH/AQ8BigHjAf8BUAEgAZAB/wFPAYQBpwH/AQABiAHoAf8DUAGd
+ AWMCYQHuAfIB6QHoAf8B/AHLAagC/wHxAcgB/wGxAa8B4wH/AWgBZgHjAf8B+wHwAc4B/wH1AcIBmAH/
+ AcYBoAGUAf8BwwG3AbkB/wHKArgB/wHOAr4B/wHQAsAB/wHbAtAB/wHwAe8B8gH/AWkBYQFdAe4EAANQ
+ AZ4BjAHoAaUB/wHhAf8B4wH/AboB/wHBAf8BbgH/AYIB/wFtAfIBkQH/AVQBowFKAf8B7QHXAcEC/wHv
+ AdcB/wH7AeoB1QH/AfsB7AHbAf8B+gHuAeAC/wH+AfEB/wGRAXYBXwH7AyoBQQGRAn0B/AHwAvMB/wHZ
+ AtAB/wHHArIB/wG9AqwB/wHTAscB/wHqAuIB/wHjAeEB4AH/AZEBjQGMAf8BKQEnASYB/wGgAZ0BmwH/
+ AdkB1wHWAf8B7ALlAf8B2gLQAf8ByQKfAf8DWwHIAWoBXwFYAe0BqgFTARgB/wGXAToBAAH/AcMBagEn
+ Af8B+QGxAU4C/wGxAU8C/wG8AUwB/wG1AWwBRwH/AUEBNwGvAf8BVwFVAe4B/wFEAWQB3QH/AQMBtQHv
+ Af8BPgGVAbMB/wG4AWMBTQH/AlsBXgHZAyEBMAFjAmEB7gH2AfUB9gH/Af0B4gHUAv8B5AHJAf8BowGe
+ AcMB/wFZAVYBqAH/Af0B3gHDAf8B9wHVAcQB/wHeAdMB0QH/Ad4C1gH/AeIC2AH/AeQC2gH/AeQC3AH/
+ AesB5QHmAf8B9AH1AfgB/wFpAmEB7gM7AWQBXwG3AX8B/gHaAf4B5QH/AdgB/wHcAf8BrAH/AbgB/wGJ
+ Af0BkwH/AZwB+gGtAf8BOAHAAVEB/wFcAYwBQAH/AfgB5wHaAf8B/QHyAeQB/wH5Ae8B4wH/AfwB+AHw
+ Af8B/AHtAdwB/wFdAlkB0gMBAQIBjwJ9AfwB8ALzAf8B2QLQAf8BxwKyAf8BvgKuAf8B1QLIAf8B6ALh
+ Af8B6AHlAeQB/wFXAVIBUQH/AwAB/wGBAmwB/wHgAt0B/wHqAuIB/wHbAtIB/wHGAp8B/wNbAcgBkAFn
+ AT4B+AGNAT4BBwH/AWsBJwEAAf8BmwFFAQkB/wHxAa0BUwL/AcQBbgL/Ac4BhwH/AdQBkAE0Af8BYwEo
+ AQgB/wFNASYBNQH/AZIBQQErAf8BogGaAYkB/wErAawB+QH/AZ4BgwGAAf8DUAGdBAABYwJhAe4B+QH4
+ AfkD/wH7Af8BxAHJAcoB/wFIAYoBsgH/ASsBYwGfAf8BggGZAacB/wHsAd0B2AH/Ad8C1QH/AdwC0gH/
+ Ad8C1gH/AeEC1wH/AeIC2QH/AeoC4wH/AfgB+QH7Af8BaQJhAe4BMAIxAU0BagGdAYIB+QHQAfgB0wH/
+ AcgB/QHVAf8B4wH/Ae8B/wG/Af4BzwH/AYsB7wGSAf8BXAHjAYcB/wFDAZ8BOwH/AfIB3wHaAf8B/QH4
+ Ae8B/wH3AfEB7QX/AboBmQGDAf4DQgF0BAABjwJ9AfwB8AL0Af8B2QLQAf8ByAKzAf8BvAKsAf8B0ALF
+ Af8B7ALkAf8B4wLgAf8BrgGlAaQB/wFjAlkB/wG1Aa0BrAH/AeAC3QH/Ae8C5QH/AdkCzQH/AcsCoQH/
+ A1sByAGQAWoBQQH5AYkBPwEJAf8BkwFGAQoB/wHbAZ4BTAH/Af0BywGKAf8B4QGsAWQB/wGvAWoBNgH/
+ AY8BRgERAf8BaAEnAQAB/wFnASQBAAH/AYYBMwEAAf8BsgFWAQ8B/wGcAV4BRwH/AawBZAE+Af8DUQGi
+ BAABZQJhAe4B/gL7Af8B8wH6Af0B/wGbAdgB+QH/AYIBvQHiAf8BaAGyAdcB/wFUAbYB4gH/AbQBygHX
+ Af8BygG1AbIB/wHFArUB/wHKArsB/wHOAr8B/wHRAsEB/wHbAtAB/wL6AfsB/wFpAmEB7gMEAQYCZAFc
+ AecB1AHxAdAB/wGjAe0BtgH/AcwB/wHbAf8BkgHvAaMB/wGQAdQBjwH/AbYB1QGpAf8B3wHjAdAB/wH9
+ AfYB8wH/AfYB9AHyAf8B9wH4AfkD/wH8Af8BYQFfAVQB7gMNARIEAAGOAn0B/AHwAvQB/wHZAtAB/wHH
+ ArIB/wHEArAB/wHHArwB/wHxAegB6QH/AfgB+QH7Af8B5wLlAf8B5ALeAf8B4QHeAd0B/wHyAewB7QH/
+ AeoB5AHlAf8B1gHFAcYB/wHWAqYB/wNbAcgBawFgAVkB6wHHAYkBNwH/AfMBtQFeAv8B1AGbAf8B/gHd
+ AbYB/wG+AZsBbAH/AZMBYAFBAf8BngFtAU0B/wGdAWoBSAH/AZABWAEwAf8BgAE+AQ4B/wFZASEBAAH/
+ AXABMAEAAf8BiQFjATQB/gNCAXQEAAFlAmEB7gL/Af4B/wHrAfUB/AH/Aa4B3AH3Af8B2AH3Av8BwAHw
+ Av8BbwHKAfMB/wG+AdgB5wH/AfUB8AHtAf8B8QLtAf8B8wLuAf8B8wLvAf8B8wLwAf8B9wL0Af8B/gP/
+ AWkCYQHuA1EBogH7AdoBvAX/AcgB6QHMAf8BjQHlAZoB/wGQAdkBlQH/AfQB6wHnAv8B+AH9Av8B+gH7
+ Af8B9QH3AfUB/wL3AfgB/wH9Af4C/wHtAdUByAH/A1EBpwgAAY4CfQH8AfAC8wH/AdgCzwH/AcQCsQH/
+ AcoCtAH/AcQCswH/AdAByAHHAf8B0AHHAcMB/wPsAf8B3gLgAf8B/AL6Af8B9AHuAe0B/wHUAs0B/wHd
+ AsEB/wHaAqgB/wNZAckCVgFVAbQBzgGJATQB/wHsAcEBkAL/AfAB2wL/AfUB6QH/AfIB6QHfAf8B3QHK
+ AbYB/wHZAcQBrgH/AeABzAG4Af8B2gHGAbAB/wHJAa4BlAH/AaEBZwFAAf8BsQFbARwB/wFhAlQB7gMY
+ ASEEAAFlAmEB7gT/AfwB/QL/Ac8B5wH3Af8B1QHsAfoB/wG0AeEB/QH/AZ4B1QH6Af8C3gHiAf8BuQGh
+ AZ8B/wG4AqQB/wG+AqsB/wHDArAB/wHEArQB/wHSAcQBxQH/Af0B/gL/AWoCYQHuAX4BbwFVAfMB/wH8
+ AfcF/wHvAdkBvwH/Ab0BxgGLAf8B5wH0AecC/wL7Af8B+AH6AfwB/wH6Af0C/wH8A/8B/Qf/AY8BZwFf
+ AfsDJgE4CAABrAKoAf0B9wL8Af8B3gLXAf8ByQK2Af8B0AK6Af8B2QHHAcsB/wGmAY0BgQH/AZgBSwEa
+ Af8BmgGWAZMB/wFkAWkBbAH/AeoC7AH/AecB3QHUAf8B5AHLAbEB/wHqAccBqwH/AdMBpgGlAf8DXAHO
+ AykBPgGBAWIBSAH2Ae4B0QGwAf8B+AHuAeIB/wH9AfMB6QP/AfwB/wH5AfAB5wH/Ae8B1gG+Af8B8AHW
+ Ab4B/wHvAdYBvgH/AfEB3QHJAf8B+gHYAbIB/wHVAYYBOgH/A04BlAgAAW8CZwHyCP8B+wP/Ad8B8gL/
+ AdMB7QL/Ae8B+wP/Av4B/wHtAukB/wHuAusB/wHwAu0B/wHxAe4B7wH/AfIB7wHwAf8B9QH0AfUF/wFy
+ AWkBZAHxAkABPwFuAl0BWgHTAaEBjQGDAfkB7wHUAbYB/wHzAcwBrAH/AfMB1AG4Af8B7QHLAawB/wHs
+ AcsBrwH/AfQB3gHKAf8B9QHiAdUB/wH3Ae0B5gH/AfcB5QHZAf8DWwHQAwEBAggAAYQCfQH3AeUC3wH/
+ AdQCxwH/AcYCtAH/AcwCuAH/AdgBwgHEAf8BvQGmAaIB/wGfAYEBYwH/Aa0BoQGgAf8BqwGjAaQB/wHL
+ Ab8BwAH/AdMBwgHBAf8B4gHPAcYB/wHhAcgBugH/AckBpQGkAf8DUQGnBAADRAF6AbwBpQFTAf0B/AHs
+ AdcB/wH6AfIB5wH/AfsB8wHrAf8B/AH0AesB/wH3AeUB1AH/AfcB5AHSAf8B+QHuAeAC/wHzAdsB/wHy
+ AbEBbQH/AVsCWQHEAwQBBggAAWACXAHUAYICbQH3AXECYgH2AXMCYgH2AXMCYgH2AXUCYgH2AXUCYgH2
+ AXUCYgH2AXUCYgH2AXcCYgH2AXcCYgH2AXcCYgH2AXcCYgH2AXcCYgH2AYcCbQH3AV4CWgHYCAADJQE3
+ Ak8BTgGXAWICXwHgAbsBqgGaAf0B8wHcAcMB/wH8AesBygH/AaIBfwFmAf4DVQGyAlMBUgGoAVsCWQHE
+ Ay0BRQwAAT0CPAFnAVICUQGhA10B1wF3AmgB+gFkAlkB7AFWAlQBqwNQAZ0BUgFRAVIBoQNSAaEDUgGh
+ AVICUQGhA1IBoQNSAaEDUgGkA0wBkwMYASEIAAJHAUYBgAGFAWsBYgH2AfcB4gHMAv8B/QH3B/8B/QP/
+ AfoC/wHuAdcB/wGuAXoBZgH8A1YBtgMMARBcAAMHAQoDMAFLAlYBVQG0AXsCZQH0A1UBtWgAAygBPAJW
+ AVUBtAFlAWIBXQHpAZoBiAFxAfkBowGHAXQB+gFuAWUBXQHwAVwCWQHJAzoBYf8AGQADHwEsA0sBjwNV
+ AbQDVwG/A1gBwANXAb0DVAGuA0EBcwMNARJgAAMMARADTgGUA1UBtQNVAbQDVQG0A1UBtQNWAbYDVgG2
+ A1UBugNWAb4DQQFzGAADBQEHAwEBAiwAAzIBUAFPAVgBTwHvASMBmAE3Af8BKgGwAUgB/wEuAbgBTwH/
+ AS8BuAFPAf8BKwGzAUoB/wElAZ0BPAH/ATMBSwE0Af0DVwHFAw8BFCwAAw8BFANOAZcDRgGAAwMBBCAA
+ A0gBhwGeATkBPAH/AbEBRgFJAf8BtQFJAUwB/wG+AVEBUwH/AccBWAFaAf8BzwFgAWEB/wHUAWQBZQH/
+ AdkBaQFqAf8B1QFvAXAB/wNeAeUDBgEIEAACUwFVAa0BFgFvAdIB/wFCAWIBgAH1A1kBxwJNAU4BlgM7
+ AWUDSgGNAYwBbQFRAfcCXQFZAdcBVgJVAbQBTQJMAZEBQAI/AW4DJQE3BAADXwHgATkB1QFkAf8BRgHl
+ AYgB/wFRAeEBjQH/AVcB4gGSAf8BWAHhAZIB/wFUAeMBjwH/AUsB5QGLAf8BQQHgAW4B/wEpAWcBLQH+
+ A0ABcSgAAyUBNwNbAeEBIAGSARkB/wEwAUABEAH9A1YBswMQARYcAAFbAlgBywHwAZsBlAL/AbsBpAH/
+ Af4BvQGpAv8BvAGoAv8BvgGrAv8BvAGoAv8BvAGpAv8BvwGqAv8BwwG4Af8BXwJYAeMDBAEGEAABTQFd
+ AWwB8AE4AcEB/gH/AVsByQH+Af8BVAHIAf4B/wE/AbcB8AH/AVoBXAFmAf8B8wG4AYYC/wG/AW4C/wG5
+ AWEC/wGyAVIC/wGxAVAB/wHsAaQBXgH/A0QBeQQAATQBewE6AfwBYAHoAZwB/wFwAd4BnwH/AYkB4QGn
+ Af8BkAHjAawB/wGRAeMBrQH/AY0B4gGqAf8BhAHfAaIB/wFqAewBogH/AT8BrwFUAf8DUQGgJAADQgF2
+ ATcBYgE/AfYBIwHQAVoB/wEoAckBNgH/AScBngEAAf8BGwFRAQAB/wNaAdsDLQFGFAADAQECAWICWAHp
+ AfwBxgGsAv8B9QHZAf8B+AHuAdkB/wH6AfQB4gH/AfsB9AHkAv8B/AHxAv8B/gH5Av8B/AH4Af8B7QHh
+ Ad0B/wNWAb4QAAMJAQwBAAFcAdQB/wFLAcUB/gH/AZIB2AL/AZYB3AL/AYMBqgG/Af8B2AGfAW4C/wHO
+ AZoC/wHLAZMC/wHFAYgC/wG+AWsB/wH4AbIBYAH/AWkBbAGHAf8CUAFRAZ8EAAFYAY8BXwH7AZQB6gG0
+ Af8BpwHoAbwB/wGyAewBxwH/Ab4B8wHMAf8BwAH0Ac4B/wG3AewByQH/Aa0B6gHAAf8BnwHwAbsB/wFX
+ AbYBaQH/A0wBkyAAAycBOgEpAXkBQgH6ASYB1wFeAf8BJQHWAWMB/wEiAbQBKgH/ASQBmAEAAf8BJwGk
+ AQAB/wEiAWcBAAH/A1oByhQAAyMBMwGNAU8BTQH7Af8B0wG3Av8B9wHfAf8BnQGPAYIB/wFCAT4BOgH/
+ AY4BiAGMAf8BwgGwAasB/wHqAeAB0QP/Af4B/wHNAcEBwAH/A0YBgRAAAxwBKAEAAWYB4gH/AWkB0AH+
+ Af8BvgHoAv8BuAHlAf0B/wGfAYwBhAH/Af0B2QG0Av8B1gGrAv8B0wGkAv8BzgGbAv8ByAGOAf8ByQGP
+ AWIB/wE6Aa8B+QH/A1IBqQQAAVUBYQFVAeoBsgHxAckB/wHQAfQB3QH/AeYB+wHsAf8B5QHxAesB/wHi
+ Ae8B6QH/Ae0B/AHwAf8B3AH2AeYB/wHAAfkB0wH/AU8BnQFTAf0DNgFZHAADDAEQA1gBwAEfAbsBRAH/
+ ASQB0wFcAf8BIQHNAVsB/wEoAcABOwH/ASUBlwEAAf8BJQGbAQAB/wEmAZgBAAH/AToCPgH4A0gBhgMD
+ AQQMAANEAXoBvQFWAUwC/wHeAb4C/wHxAdkB/wHCAbQBowH/AUMBSQFEAf8BgQGnAcAB/wEMAUgBpwH/
+ AksBawH/Ae8B2wHJAf8BfgF2AXQB+gMtAUUQAAIrASwBQwEEAYIB8AH/AY8B2QH+Af8BwgHqAv8BwQHl
+ AfgB/wHRAacBjAL/Ad4BuQL/AdwBtgL/AdkBsAL/AdUBqAH/AfMBpAFhAf8BpgGqAa4B/wE8AbYB/gH/
+ A0oBjQQAA04BmQG3AeABwAH/AfQB/wH0Af8B7AH9AdYB/wFtAYcB2wH/AVkBXgHbAf8B0AH7AcUB/wHp
+ Af8B7AH/Ac0B8gHUAf8DWwHZAwcBChgAAyYBOAJXAVwB3wEAAQsBqAH/ARQBrwFCAf8BIwHVAVUB/wFB
+ AeYBgwH/AUAB6wGHAf8BKAHBAT0B/wElAZ0BAAH/ASMBjQEAAf8BAAFcAacB/wEPAT0BrAH9A1UBugMV
+ AR0IAANVAbIB0gFoAVQC/wHlAcMB/wHwAdoBwgH/AekB2QHCAf8BsAKnAf8BjAG/AegB/wEIAa8C/wEA
+ AWQB0gH/AV4BYgGiAf8BYgJYAe8DEgEZEAADOAFeARQBkQH8Af8BngHeAv8ByAHrAv8BxQHgAe4B/wHm
+ AbsBmwL/AeUByAL/AdYBsAL/AZEBPgL/AaYBWwH/AdUBXwEtAf8BmwHbAfoB/wE3AbUB/gH/A0EBcgQA
+ Aw8BFAFaAV4BWgHVAaIB0gGgAf8BbQHDAbYB/wEXAV4BuQH/AQoBTAG5Af8BLgGwAZUB/wFtAdMBjQH/
+ AV0BYwFdAfADKQE+GAADQQFzAjMBYgH2AgAB9wH/AQABDgHLAf8BPwHEAVAB/wGLAfsBqAH/AWEB/gGf
+ Af8BPgHqAYMB/wEpAdYBZQH/ASUByAFFAf8BIwGgAQUB/wEAAWoBnAH/AQABZAL/AQABNAHOAf8DVwHf
+ AzABSwMBAQIBYQJcAdwB4wGRAWYC/wHtAcoB/wHnAc8BtgH/AeUB0AG6Af8B2gHEAbYB/wFFAW4BpwH/
+ AV0B2QH3Af8BHAHOAv8BAAGaAewB/wEcAUABUwH9A1EBpwMGAQgMAANEAXkBJQGYAv8BrAHjAv8BzwHu
+ Av8ByQLNAf8B8wHaAcUC/wHxAeIC/wHrAdYC/wGuAWYB/wHYAYYBUgH/AScBFwFuAf8BYwGqAeEB/wEz
+ Aa0B+gH/AzgBXAgAAxkBIwFIAmIB9gFqAbQB3QH/Ab0B1AHfAf8BwgHXAd8B/wFWAZ4BywH/AQ4BZwFs
+ Af8DTQGWHAACMQGIAfgCAAL/AgAC/wIAAdkB/wFHAYsBagH/AaYB+QGgAf8BYQH/AaAB/wE6AeYBggH/
+ ASsB1QFeAf8BJQHNAUcB/wEQAaIBQAH/AQABagHEAf8BAAFcAv8BAAFmAv8BAAFDAeQB/wNYAcADHwEs
+ AWgCQgH1AfMBrQGLAf8B+wHlAcUB/wHRAbkBpAH/AcYBsgGgAf8B7QHYAcEB/wHMAb4BuQH/AUcBiwGz
+ Af8BXQHdAfMB/wE3AfAC/wEAAcUB+wH/AQYBUQF/Af4DWAHGAxUBHQgAA04BlAE3AZ8C/wG7AegC/wHW
+ AfAC/wHOAcIBtgH/AfsB8AHmAv8B9gHtAf8B/QHxAeMB/wHuAc0BrwH/AVQBRQGTAf8BAAECAbsB/wEA
+ AQUBrQH/AQABEQG1Af8CVwFaAcUIAAM6AWEBTwGoAbkB/QG0Ac8B5QH/AeYB6gHxAf8B7AHuAfYB/wG8
+ AckB3QH/AToBlgHMAf8DWQHSAx8BLAMSARkDBAEGAwQBBgwAAg8BuAH9AgAC/wIAAv8BEgEQAf4B/wIA
+ AccB/wERAUwBZAH/AUwB5wFeAf8BRAH6AYEB/wEmAccBPgH/AQMBlAFQAf8BAAGbAdQB/wEAAZ4C/wEA
+ AVwC/wEAAV4C/wEAAVoB+AH/A1kBxwM6AWIBfwE3AS8C/gHBAZkB/wHeAcgBrgH/AcUBrgGaAf8B0AG/
+ AagB/wHTAcIBrQH/Ad8BzQGzAf8BuAGgAZsB/wE0AVkBmwH/AVUBzgHrAf8BSQH9Av8BAAHdAv8BAAFc
+ AawB/wNeAdoDJQE3BAACUwFVAbABTQGrAv8BywHtAv8B4AH0Av8B1QHAAa0B/wH+AfsB+AL/AfsB9wH/
+ AfMB8AHsAf8B0wHOAcwB/wFKAVIBtwH/AVYBbgHxAf8BLgFFAdsB/wEtAUIB2gH/AlgBXAHRCAABUAJS
+ AaMBngHZAfQB/wGyAeAB+gH/AaoB2gH2Af8BnQHUAfUB/wGVAdEB9QH/AWoBzQH3Af8CUwFhAfEBXAJX
+ Ad8BYgJYAekBXgJbAdkBXgJaAdgDUwGwAygBPAQAAh4BnQH7AgAC/wI/Av8CgQH+Af8BTQFKAf0B/wED
+ AQAB3gH/AQABJQGIAf8BIwGkATgB/wEGAZwBhwH/AQABowHsAf8BAAHMAv8BAAHHAv8BAAGcAv8BAAFl
+ Av8BAAFSAfQB/wNYAcYDTgGZAboBPQEqAf8B8wHAAZgB/wHWAcIBpAH/AdABuAGeAf8BxgGVAY0B/wHL
+ AYcBjQH/AccBgwGNAf8B1QGQAZQB/wHUAYIBkwH/AVcBTAGbAf8BSQGzAd4B/wFSAfYC/wEJAd8C/wE0
+ AWQBpwH/A1wB3AQAAlgBWwHLAWQBuQL/AdwB8wL/AeoB9wL/Ad0BxgGyAf8B8wHfAdAB/wH1AeUB2AH/
+ AfYB6QHeAf8B+AHtAeQB/wG+AbYBzAH/ATIBPQG4Af8BlwGfAdMB/wFJAZABvQH9Ax8BLAgAAU0CTgGW
+ AbIB3gHyAf8B2wH3Av8B0QHvAv8BuAHmAv8BoAHfAv8BhgHXAv8DWQHsAZUBaQFcAfgB/wHpAcAC/wHd
+ AbwC/wHcAbgB/wHcAaUBcAH/AWACWQHrAzABSwIvAbgB/QJqAv8CkgL/AmsC/wJhAv8BWQFXAv8BHgER
+ AeEB/wIhAV8B+wEAAawB4wH/AQAB9QL/AQAB3gL/AQABwgL/AQABsAL/AQABpgL/AQABbAH7Af8DWQHE
+ A1oCygFSATgB/wHgAb4BmAH/AdMBtQGXAf8B0wGWAY0B/wHxAaIBpQH/Af4BswG0Af8B/gG0AbYB/wH+
+ AbcBuQL/AcQBwgH/AfkBuAG6Af8BgwGAAbgB/wFEAa4B5QH/Aa0B8gHzAf8BawGwAewB/wFTAVUBXQHt
+ BAACWQFdAdIBiwHIAv8B8QH6Av8B9wH8Av8B9gH5AfsB/wHwAeUB3AH/Ae4B4AHVAf8B7QHcAc8B/wHs
+ AdgByQH/AeoB1AHCAf8B9AHwAe0B/wH3AfsC/wFYAWIBaAHpDAADKAE8AXMBiQGaAfoE/wH1A/8BzwHy
+ Av8BtAHyAv8BYgGHAa4B/gFnAlkB8gH5AcwBlwL/Ad4BsgL/AeABuQL/AeEBuQL/AewBvgH/AewBpQFk
+ Af8DVwG9AlgBWwHLAm8B5QH/ApEC/wJqAv8CYAL/AlwC/wFIAUQBhAH6A1ABnQFXAVwBXgHfAQAB6QH+
+ Af8BAAHkAv8BAAHAAv8BAAGxAv8BAAGuAv8BNwFtAY4B9wM6AmICTgHvAb4BYwFEAf8BzAGiAYQB/wHU
+ AY4BhwH/AfcBqwGpAv8BtwGyAv8BtgGzAv8BvgG8Av8BxgHFAv8B2QHXAv8B/AH6Af8B5gGxAb0B/wNe
+ AeUBRwFgAa4B/QEYAVYBygH/A0sBjwQAAxwBJwJTAVUBrQNcAdEDXQHXA14B3QJfAWAB4wJiAWUB6QFi
+ AWMBbgHvAWYBbQGGAfUBYgGMAa8B+wGHAaYB8AH/AYgBqwH1Af8CVAFWAasQAAFGAkcBgAF6AYwBmgH6
+ AdYB5QHuAf8BvAHiAfEB/wFmAYABqgH8AlABUgGjAV8CWgHbAf8B2gGUAv8BzQGZAv8BzgGdAv8BzAGb
+ Av8B1wGcAf8B/gG1AWMB/wNXAb8EAAJPAVEBnAI6AawB/AKDAv8CVQH1Af8CTwFiAe8DMwFSBAADEAEW
+ AVgCWgHAAQABtQH2Af8BAAHPAv8BAAGkAv8BXgFfAWEB4AMnAToEAAFyAisB/AG2AWABSwH/AegBqwGg
+ Av8BxgHAAv8BzwHHAv8B1AHNAv8B3gHXAv8B5gHhAv8B7wHpAv8C+gH/AbMBfwGRAf4DVAGvAwQBBgNA
+ AXACSwFMAY8DAQECLwABAQMFAQcYAAMvAUoBUQJSAaEDUgGpAzkBXwQAA0UBfQHOAYUBcgH+Af8B9AHU
+ Av8B9AHfAv8B9QHdAv8B2wGqAf8BhwFSAUQB9wMxAU8IAAM7AWQCVAFpAe4CWwFeAdADGAEhEAADTAGS
+ ATgBYgGNAfYCVQFXAboDDAEQCAABXAJXAd8BjwFBAUAB/gGzAk4B/QGgAVUBVwH8AZ4BVwFcAfwBlAJf
+ AfsBlAJfAfsBkgFRAWcB+gGUAl8B+wFvAVkBZwHyA0QBfHgAAUcCRgGAAmUBXgHlAaEBfAF2AfoBjgF9
+ AW0B9wFgAlwB1AMzAVKEAANLAY4DWQHDA1cBwgNCAXZAAAMRARcDRAF5A1YBswNYAcYDVwHFA1QBrwM9
+ AWoDDQESEAACVQFXAboBIQEkAZAB+wI+AYIB+AE8AT4BfwH4ATsBPAF+AfgBOgE8AX0B+AE6ATsBfAH4
+ ATkBOgF6AfgCOQF4AfgBNwE5AXYB+AE3ATgBdQH4ATUBNwF0AfgCNwFzAfgCNwFzAfgCIQFiAfsCWQFb
+ AcMMAANTAaoDWAHRA1gBywNaAdUBVAFdAWYB7QFKAV0BbwHzAlcBXwHoA1sB0ANcAc4DWQHSA0QBfAgA
+ AToBbQGHAfcBAAG1AeEB/wEAAasB2gH/AVcCWQHsAxkBIzgAA0MBdwFgAlkB6wJ/AU0B/gGBAakBRAH/
+ AYYBuwFSAf8BiQG2AVMB/wGzAagBbgH/AaIBUQFKAf0DWgHeAzkBXwwAAT0BPwF5AfYBHwE6Ae4B/wEH
+ ASIB5AH/AQIBGwHgAf8BBQEaAdoB/wEDARYB1QH/AQABEQHPAf8BCwEZAdYB/wELARUB0gH/AQABBQHB
+ Af8BAAECAb0B/wIAAbkB/wIAAbUB/wIAAa8B/wIAAbkB/wI4AW4B9wwAAbIBqwGsAf8B2wHSAdEB/wHi
+ AcwBwgH/AYUBowHeAf8BVgHSAv8BZAHpAv8BXgGtAfIB/wHaAcYBwgH/Ad8B1QHUAf8BvAK2Af8DVQG1
+ CAABQgFqAXkB9AEAAegC/wEAAe4C/wEAAYMBtQH/A1wB3ANKAYsDAwEELAABUgJQAaQBqgJ/Af4B/wHv
+ AeUB/wHdAfgBzwH/Ad8B9QHOAf8B5gH1AdYB/wHpAfoB3wP/AfoD/wH5Af8B6wHIAbkB/wFqAkEB+QNE
+ AXoIAANVAbUBGwEuAdsB/wEAAQ0B5AH/AVQBYwHRAf8BqwGvAdAB/wGpAa4B2QH/AbMBtwHgAf8BnAGf
+ AccB/wGaAZwBxAH/AbQBtgHcAf8BrAGuAdMB/wGvAbABywH/AWEBYwG6Af8CAAGkAf8CAAGrAf8CVgFY
+ AcEMAANRAaADVQGtA1ABnQNVAbUBWAGoAb8B/QFpAbcB5wH/AVkBYAFjAesDVAGmA1UBrQNSAakDKAE8
+ CAABWgJdAdMBAAHaAfQB/wEAAdkB9wH/AQABzAH6Af8BAAG4AesB/wEpAUMBagH5AzgBXCgAA0sBkAHG
+ AZoBbQL/Af0B4wL/AeoBzgL/AeABwgL/AdwBuwL/AdwBuQL/Ad0BvQL/AeABwwL/AeoB0QP/AfYB/wH9
+ AeQB1AH/AWoCQQH5AzgBXQQAAysBQgEoAS4BkwH7AQUBIQHqAf8BbQGIAdcB/wH5AfUB2QH/AfgB9gHq
+ A/8B+wH/AlsBTwH/AlABRQP/AfkB/wL6Ae8B/wL7AeIB/wGNAY8BxQH/AgABtQH/AgABkwH/AzIBURgA
+ AzMBUgF5AXUBdgH6AaUBmgGcAf8DVAGuGAADJAE1AVcBXwFkAegBAAHbAfQB/wEAAdoB9gH/AQAB7gL/
+ AQABmgHUAf8BSQFOAVkB8gNLAZADIwEzHAADJgE4AXkBXAFDAfgBvwHTAY4C/wHbAbIC/wHPAZwC/wHK
+ AZMC/wHIAY8C/wHJAY4C/wHLAZQC/wHSAZ8C/wHWAakB/wHuAdUBqwL/AfgB4QH/AfIByAGtAf8DWAHd
+ Aw0BEgMEAQUDUwGqARoBLQHeAf8BFwEuAegB/wHWAdgB5QH/AfoB+QHyAf8C/QH+Af8C1QHXAf8C0gHT
+ Af8C/QH+Af8C+gH1Af8B4QHiAeUB/wEeASEBvAH/AgABtQH/AlYBWAG5AwkBDAwAAzEBTwNWAbYDVwHo
+ AXEBdQFwAfoBswGrAaYB/wGGAmkB/wNYAdEDEAEWGAADJAE1AVkBYgFpAesBAAHhAfkB/wEAAdAB9QH/
+ AQAB1AH+Af8BAgHBAfEB/wEWAUEBmQH9AVIBVQFdAe0DUQGnA0oBiwMkATUQAANVAbIBbAGPATMB/wFo
+ AaMBPAH/AfgByQGNAv8BwAFuAv8BugFlAv8BuQFhAv8BuwFkAf8B1AGvAVIB/wFwAZgBMgH/AeEBvQFs
+ Af8B7QHHAY4B/wGoAbIBYAH/AWYBqQFHAf8BlgFPAUAB/QM9AWoEAAMqAUECQgF7AfUBBAEgAe0B/wFm
+ AYMB6AP/AfcF/wO8Af8DtQf/AfwB/wGQAZQB1QH/AgABwAH/AToBOwF7AfgDMQFOEAABZQJkAfEB4wHa
+ AdsB/wHzAesB6gH/AekB7AHkAf8B2wHQAc4B/wHLAbgBuQH/AY4CgQH/A1gB4wM9AWoDAQECFAADJgE4
+ AVQBYgFoAe0BAAHiAfkB/wEAAdMB8wH/AQcB5QH9Af8BDwHmAv8BCQGvAfIB/wEAAVcBxgH/AQABTAG+
+ Af8BWAFaAVwB5wM4AV0MAAFiAlUB6gE7AYIBGQH/ARIBWgEAAf8BbAGJASUB/wH1AbMBVAL/AbEBTwL/
+ Aa4BSwL/AbMBUQH/AYYBigEjAf8BAgFUAQAB/wFnAYYBIQH/Af0BxQGDAf8BnQGcAT8B/wFSAZEBKwH/
+ AcYBnAFfAf8DUwGwCAACVAFWAasBIQEzAd4B/wE8AVAB9QH/Ae0B7gH8Bf8DjAH/A28F/wHqAesB/gH/
+ ASEBKAHfAf8BAQEKAcAB/wJVAVcBtwMBAQIQAAF6AnYB+AHtAuAB/wHiAtYB/wHnAdwB3gH/AdkBygHL
+ Af8B1ALDAf8B5QLUAf8ByQK6Af8BUAJLAf0DVwHCAyEBMBQAAykBPwFOAWIBaAHvAQAB4wH6Af8BAAHO
+ AfIB/wESAeQB+wH/ATQD/wE+AeoC/wFWAeQC/wEPAYoB5wH/ATcBPQFtAfcDRgGACAABgwFbAUEB+QEp
+ AV0BCAH/ARMBSAEAAf8BEAFHAQAB/wGxAZEBLgL/AbMBTgL/AbQBUAL/AbgBUwH/AVoBZwEVAf8BFQFL
+ AQAB/wEaAUwBAAH/AaoBkwE1Af8B5QGwAVgB/wHJAbIBYwH/AewBugGKAf8DVwHFCAADJwE6AkEBjQH5
+ AZ4BogH9Af8Czwb/A2YB/wNUBf8CpwL/ARYBFwH+Af8BJgEoAagB/QMvAUkUAAGAAn0B9wH5AvIB/wHy
+ Au0B/wHxAu4B/wHcAs8B/wHPAr0B/wHUAsUB/wHhAtIB/wHvAuIB/wGYAo0B/wNRAaEYAAMtAUYBTQFi
+ AWsB7wEAAd0B9AH/AQABxwHwAf8BEQHgAfYB/wFJA/8BjgP/AY8B9gL/ASMBowH5Af8BOgFCAVoB9QMv
+ AUoEAAGMAV8BMgH7ASEBSAEAAf8BEgE0AQAB/wFgAV4BFAH/AeMBqQFHAv8BtwFWAf8B2wGjAUUB/wG2
+ AY4BMgH/ATEBQwEAAf8BFgE2AQAB/wEZAToBAAH/ATIBSAEAAf8BngGDASsB/wGjAY8BOAH/AbsBlwFO
+ Af8DWQHHCAADAgEDAlABUgGjAXABggHnAf8BvQG8Av8C+wL/AkUBQQH/AjcBMgH/AvYB/gH/Al4C/wEh
+ ASIB4gH/A1UBsgMFAQcUAAGBAoAB9wH+AvwB/wHsAuYB/wHvAuoB/wHdAtEB/wHOArwB/wHTAsQB/wHV
+ AsYB/wHtAt8B/wG6Aq0B/wNSAakcAANIAYQBAAGoAdoB/wEAAesB/QH/AQAB5AH0Af8BDwL+Af8BQAP/
+ AZID/wGbA/8BDAFtAeEB/wNbAdADDwEUAXUBWAFIAfYBhQFnASAB/wG3AYoBLAH/AfUBrgFMAv8BvgFj
+ Af8B2wGsAVwB/wFKAU8BGwH/ATcBRgETAf8BPQFHARUB/wE0AT0BDAH/ASUBLwEAAf8BLwEwAQAB/wI3
+ AQAB/wE2ATwBAwH/AZIBYAEpAf8DVQG0DAADJAE2AkwBdwHzAbIBtAH+Af8C3wL/AmYBYAH/AmEBVQH/
+ AsAB/AH/AU0BTgH+Af8BPgE/AYYB9wMqAUEYAAOAAfcB2ALKAf8ByAK3Af8B6ALgAf8B3wLTAf8BzAK5
+ Af8B0gLBAf8B1QLEAf8B5gLWAf8BrQKfAf8DUQGnHAACWwFgAdYBAAHKAfkB/wEAAeAC/wEAAe8C/wEA
+ AfwC/wEOA/8BNQH6Av8BhgP/AVsB4AL/AQcBSwGTAf4DSgGMAV4CWwHZAbEBiwEyAf8B7QGqAUUC/wHK
+ AYwC/wHeAbcB/wHgAdIBuQH/AZ8BpgGPAf8BoAGnAY8B/wGoAasBkwH/AaYBqQGQAf8BlQGZAW0B/wFd
+ AWEBOwH/ARgBKAEAAf8BIAEwAQAB/wGqAWEBMAH/A0MBdwwAAwMBBANQAZ0BggGFAeUB/wHJAcgC/wLm
+ Ae8B/wLmAe0B/wKWAv8BQgFEAeMB/wNTAaoDBgEIGAABgAJ/AfcBzQK7Af8BwwKyAf8B7wLqAf8B3gLS
+ Af8BxgKzAf8B0AK+Af8B0QLAAf8B4gLRAf8BqQKaAf8DUQGnHAABVQJXAboBAAHHAfMB/wEAAdEC/wEA
+ AdoC/wEAAfUC/wEOAdgB8QH/AUIBWQF3AfUBMwGoAbwB/QFUA/8BAwGCAegB/wNOAZQBRwJGAYEBnQFl
+ AS0B/wGlAbUBbwH/AfkB7gHaAv8B8AHhAv8B9gHqAf8B8QHuAeAB/wHCAc8BuAH/AcYB0QG6Af8BzQHV
+ AbwB/wHEAdABtwH/AboBzQG1Af8BhQGoAYYB/wFmAYABKQH/AWQCWQHsAxIBGRAAAyUBNwJTAXQB8QG+
+ AcAB/gH/AtcC/wHJAcgC/wGOAY8C/wFDAUUBeQH2Ay0BRRwAA4AB9wHvAugB/wHwAusB/wH+Av0B/wHZ
+ AswB/wG+AqgB/wHHArQB/wHNArsB/wHfAs0B/wGmApcB/wNRAaccAAMQARYBWQFgAWoB6wEAAdMC/wEA
+ Ac8C/wEAAegC/wElAX8BsgH+A1kBzwExAV0BiwH4AQABswHzAf8CVwFaAb0DDQESAw0BEgFcAlcB3wG9
AccBlQH/AcwB6QHRAf8B5QHpAdgB/wH4AfQB6QL/Af0B+AH/AdkB6AHWAf8BvgHYAb4B/wHAAdgBvwH/
- AcMB2QHBAf8BwAHfAcoB/wG3AdgBqwH/AZgBfAFFAf4DRAF5GAADUAGeAYwBkAHlAf8CzAL/AbUBtAL/
- AW0BcAHkAf8DVAGuIAADcAH1Af8C/QH/AfYC7wH/AeQC2wH/Ad4C0wH/AdMCxQH/AcQCsAH/AcECqwH/
- AdYCwQH/AaICkQH/A1EBpyAAAzkBXwEhAXkBpAH6AQAB0QH7Af8BAAHeAv8BAAHBAe0B/wEGAX8BqAH+
- AQABjQHbAf8CWQFbAcMDBAEGCAADJQE3AXMBWAFQAe8B4AHdAboB/wHbAfgB5wH/Ad4B8AHlAf8B7AH1
- Ae0B/wHjAe8B4wH/AdUB5wHWAf8B1QHqAdwB/wHbAfYB6QH/AesB8AHPAf8ByQGTAVMB/wFSAlABpBwA
- Ax0BKgJMAYIB8wHWAdgC/wHMAc0C/wI+AZYB+AMmATkgAAM+AWsDYQHqAcwCxQH/AfAC6AH/AfAC6AH/
- AegC4wH/AeAC2QH/Ac4CvwH/AdACuQH/AZ0CiwH/A1QBqyQAAzgBXAFXAVwBYQHfAQABsQHpAf8BAAHq
- Av8BAAHLAfQB/wJaAV0BygMJAQwQAAMlATcBYgJYAd0B4gG3AZ4B/wH4AfcB7An/AfsD/wH6Af4B8gH/
- AfYB2QG9Af8BlgFlAVsB+ANOAZQgAAMCAQMDTgGUAZMBlwHoAf8BmgGfAekB/wJPAVMBpQMDAQQkAAMJ
- AQwDSwGPA2UB7wHZAtYB/wH5AvYB/wH6AvcB/wH4AvcB/wHtAuUB/wGXAooB/wNOAZkoAAMNARIDTgGU
- AUIBYwF8AfACWgFdAcoDDQESGAADCQEMAUcCRgGAAV4CWwHZAYkBaQFcAfUBqwGMAXAB+wGiAYMBagH5
- AWwBXAFVAeoDVQGyAycBOigAAxsBJgJaAWEB2wFVAVYBZAHkAyIBMjAAAxUBHQNQAZ4BeAJ3AfUDiwH5
- A18B4wNZAccDTAGTAxYBHwgAAUIBTQE+BwABPgMAASgDAAFAAwABIAEBAgABAQEAAQEGAAEJFgAD/wEA
- AfABHwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYA
- AeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAeABDwYAAfgBDwL/Af4BfwL/AfABBwL/Af4BfwL/
- AfABAwH5Ac8B4AEPAv8B4AEBAfgBjwHgAQcCAAHgAQEB8AGPAeYBRwIAAcABAQHwAQcB5gFDAgABwAEA
- AeABBwH+AQcCAAHAAQAB4gETAfABBwIAAcABAAHCATMB4AEPAgABwAEAAcQBEwHgAR8CAAHAAQEBhAEZ
- AeABbwIAAeABAwGIAQkB4gFnAgAB/AEPAgAB4AFHAgABwAF/Av8B8AEHAgABgwG/Av8B/AE/Av8BzwG/
- Av8B/gF/Av8B+AE/AccB4wHgAQcBfwH/AeABAwHBAcMBwAEDAT8B/wGAAQEBwAEDAeABBwGPAf8BgAEB
- AeABBwGAAQEBgwH/AYABAQHgAQcBgAEBAcEB/wGAAQEB4AEHAYABAQHAAf8BgAEBAeABAwGAAQEB4AE/
- AYABAAHAAQEBgAEBAfABHwQAAcABAwH4AQ8EAAHAAQMB/AEHBAAB4AEHAf4BAwEAAQEB+AEfAeABBwH/
- AQEBgAEBAfgBHwHwAQ8B/wGBAcABAwH8AT8B8AEPAf8CwAEHAfwBPwHwAQ8B/wHwAv8B/AE/AfgBHwH/
- AfwB4AP/AcIBAwH/AeEB4AE/AgABgAEBAf8B4AHAAQ8CAAGAAQAB/wHAAYABBwIAAYABAAH/AYABAAED
- AgABgAEAAf8BgQEAAQMCAAGAAQAB/wEDAQABAQIAAYABAAH/AQMEAAGAAQABjgEHAeAEAAEBAQwBDwH8
- BAABAwEAAR8B/gQAAQEBAAE/Af8BAQMAAQEBAAE/Af8BAwMAAQEBwAFjAf8BhwMAAQMBwAEDAf8BxwMA
- AQcB4AEDAv8CAAEBAQ8B8AEPAgAC/wGfAf8BgAEBAgAB4wH/AYcB/wGAAQECAAHBAf8BgQH/AYABAQIA
- AcAB/wHAAf8BgAEBAgABgAF/AcAB/wGAAQECAAGAAT8BwAH/AYABAQMAAR8B4AE/AYABAQMAAQ8B8AEf
- AYABAQMAAQcB+AEPAYABAQIAAQwBBwH8AQ8BgAEBAgABHgEDAfwBBwGAAQECAAE/AYEB/gEDAYABAQIA
- Af8BwAH/AQMBgAEBAgAB/wHwAf8BgQGAAQECAAH/AfgB/wHBAYABAQIAA/8B4QGAAQEE/wHgAQMBgAEB
- AYABAQGAAQcBgAEBAYABAQMAAQMCAAGAAQEDAAEBAgABgAEBAwABAQIAAYABAQMAAQECAAGAAQEGAAGA
- AQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAH/AcMBAAEBAQABAQEAAQEB4QGHAQABAQEAAQcBAAEB
- AeABBwEAAQcBAAEPAQABBwHwAQ8BAAF/AQAB/wEAAX8B8AEPAQABDwGHAeEB4AEHAf4BBwEAAgMCwAED
- AfgBBwEAAgECgAEBAcABBwYAAYABBwYAAYABBwIAAYABAQIAAYABBwIAAcABAwIAAYABBwIAAeABBwIA
- AYABBwIAAeABBwIAAYABBwIAAcABAwIAAYABBwIAAYABAQIAAYABAQYAAYABAQYAAYABAQEAAgECgAEB
- AYABAwEAAf8BAwLAAQMBgAEPAv8BhwHhAeABBwGAAX8B/wH4AgAB4wH/AeABBwH/AfACAAHBAf8BgAED
- AeABIAIAAYAB/wGAAQEBwAEBAwABfwGAAQEBwAEDAwABPwGAAQEBgAEHAwABHwGAAQEBgAEBAwABDwGA
- AQEEAAGAAQcBgAEBBAABwAEDAYABAQQAAeABAQGAAQEBAAEBAgAB8AEAAYABAQEAAQECAAH4AQABgAEB
- AYABAwIAAfwBAAGAAQEB8AEDAgAB/gEBAYABAQH8AQcCAAH/AQMBgAEDAf8BBwIAAf8BhwHAAQcBgAH/
- AgAB4AEHAeABBwGAAf8CAAHgAQcBwAEDAYADAAHAAQEBgAEBAYADAAGAAwABgAEAAYABAAGAAwABgAMA
- AYADAAGAAwABgAMAAYADAAGAAwABgAMAAYADAAGAAwABgAMAAYACAAEBAYADAAHgAgABAQGAAQECAAHg
- AgABAQGAAQECAAHgAQEBAAEBAcABAwGAAQEB8AH3AYABAQHwAQMBwAEDAfAD/wHwAQMB8AEHBf8B4QGA
- Ab8BgAEAAeABPwH/AcABAAEDAYABAAHgAQcB/wGAAgABgAEAAcABAQH/AwABgAEAAcABAQH+AwABgAEA
- AcABAQH8AQEBAAEBAYABAAGAAQEB4AEDAQABDwGAAQABgAEBAYABBwIAAYABAAGAAQEBAAEPAYABAAGA
- AQABgAEBAQABHwHgAQABgAEAAYABAwEAAT8B4AEBAYABAAGAAQMBAAE/AeABAQGAAQABgAEDAQABPwHA
- AQEBgAEAAeABBwEAAX8BwAEBAYABAAH+AQcBwAF/AcABAQT/AcAB/wHAAQMCAAL/AgABwAEDAgAB4wH/
- BgABwwH/BgABwAEBBgABwAEBBgABwAEBBgABwAEBBgABwAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEB
- AgAB4AEHAgABgAEBAgAB8AEPAgABgAH/AgAB8AEHAgABgAH/AgAB8AEHAgAC/wIAAfABBwH/AY8B8AE/
- Av8B4AEHAf8BhwGAAQEBgAEBAcABBwHwAYMCAAGAAQEB4AEHAeABAwIAAYABAQGAAQEBwAEBAgABgAEB
- AwABAQIAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQIAAcACAAEBAYABAQIA
- AeACAAEBAYABAQEAAQEB4AIAAQcBgAEBAQABAQH/AcABAAF/AYABAQGAAQEB+AFPAeAFAAH4AQcB4AUA
- AcABAwHABQABgAEDAcAHAAHABQABgAEAAYAHAAGABQABAQGABgABAQgAAQEOAAGAAQEGAAHAAQMGAAHA
- AR8GAAHyAR8B4AEHBAAE/wIAAv8B4AEDAfABDwHgAQcBwAF/AeABAAHgAQcB4AEPAYABBwHgAQABwAED
- AgABgAEAAcABAAGAAQECAAGAAQABgAcAAYAHAAGABwABgAYAAQEB4AYAAQEB4AYAAQEB4AYAAQMB4AUA
- AYABAwHwAgABAQIAAcABBwH4AQABgAEDAgABwAEfAfwBAQHAAQcCAAHgAX8C/wHgAQ8CAAHgAf8B+AEf
- BP8B+AE/AcgBEwH+AT8C/wHAAR8BnAE5AfwBHwGAAQcBAAEPAQQBIAH8AR8BgAEDAQABBwEEASAB+AE/
- AYABAQEAAQMBBAEgAeABQwGAAQECAAEEASABwAEDAYABAQGAAwABgAEDAYABAQHgAwABgAEHAYABAQHw
- AQABBAEgAYABHwHAAQEB/AEAAQIBQAGAAQMB8AEBAf4BAQIAAYABAQHAAQEB/AEDAgABwAEBAcABAwH4
- AQMBgAEBAcABAwHgAQcB8AEHAcABAwHAA/8B4AEPAeABBwT/AeABDwH/AQMG/wHwAQEC/wH4AR8CAAHg
- AwAB+AEBAgABgAMAAYADAAGAAQECAAGABwABgAcAAYAMAAEBAwABAQMAAQEDAAEBAwABAQMAAQMDAAEB
- AwABAwMAAQMDAAEDAgABgAEDAgABwAEHAgABwAEHAv8B8AF/Av8B4AEfCP8BgAE/Av8BwAEHAecB/wEA
- AR8B/AE/AcABAwHAAQEBAAEfAfgBHwHAAQMBwAEBAQABHwHwAQ8BgAEHAYABAQEAAR8B4AEPAYABBwGA
- AQEBAAEfAcABAwGAAQcBgAEBAQABHwGAAQEBgAEHAYABAQEAAT8DAAEDAYABAQGAAX8DAAEBAYABAQGA
- AQcEAAGAAQEBgAEBBAABgAEBAYAFAAGAAQMBgAUAAYABAwHAAQABgQEBAgAB/wHnAeEBAALDAQABHwP/
- AYEE/wEPAf8B8AEPAgAB4AEDAQcB/wHgAQcCAAHgAQMBAQH/AcABAwIAAeABAwEBAf8BgAEBAgAB/AE/
- AQABfwQAAeABHwGAAQ8CAAGAAQEB4AEHAcABBwIAAcABAQHgAQMB4AEDAgABwAEDAeABAwHwAQECAAHA
- AQMB4AEDAfgDAAHgAQcB4AEDAfgDAAHgAQcB4AEDAfgDAAHwAQ8B4AEDAfgCAAEBAfgBHwHgAQMB/AEB
- AYABAwH4AR8B4AEDAf4BAwHAAQcB+AEfAfABAwH/AQcB4AEPAfwBPwH8AQML
+ AcMB2QHBAf8BwAHfAcoB/wG3AdgBqwH/AZABfAFFAf4DRAF5GAADUAGeAYwBkAHlAf8CzAL/AbUBtAL/
+ AWkBbAHkAf8DVAGuIAADbAH1Af8C/QH/AfYC7wH/AeQC2wH/Ad4C0wH/AdMCxQH/AcQCsAH/AcECqwH/
+ AdYCwQH/AaICkQH/A1EBpyAAAzkBXwElAXUBnAH6AQAB0QH7Af8BAAHeAv8BAAHBAe0B/wEGAX8BoAH+
+ AQABjQHbAf8CWQFbAcMDBAEGCAADJQE3AWgBWAFWAe8B4AHdAboB/wHbAfgB5wH/Ad4B8AHlAf8B7AH1
+ Ae0B/wHjAe8B4wH/AdUB5wHWAf8B1QHqAdwB/wHbAfYB6QH/AesB8AHPAf8ByQGTAU8B/wFSAlABpBwA
+ Ax0BKgJMAXcB8wHWAdgC/wHMAc0C/wI+AY0B+AMmATkgAAM+AWsDXAHqAcwCxQH/AfAC6AH/AfAC6AH/
+ AegC4wH/AeAC2QH/Ac4CvwH/AdACuQH/AZ0CiwH/A1QBqyQAAzgBXAFXAVwBXQHfAQABsQHpAf8BAAHq
+ Av8BAAHLAfQB/wJaAV0BygMJAQwQAAMlATcBXgJYAd0B4gG3AZ4B/wH4AfcB7An/AfsD/wH6Af4B8gH/
+ AfYB2QG9Af8BjQFdAVwB+ANOAZQgAAMCAQMDTgGUAZMBlwHoAf8BmgGfAekB/wJPAVMBpQMDAQQkAAMJ
+ AQwDSwGPA2IB7wHZAtYB/wH5AvYB/wH6AvcB/wH4AvcB/wHtAuUB/wGXAooB/wNOAZkoAAMNARIDTgGU
+ AUwBXQFuAfACWgFdAcoDDQESGAADCQEMAUcCRgGAAV4CWwHZAYABZAFZAfUBnQGIAWQB+wGSAX8BagH5
+ AWQBXAFVAeoDVQGyAycBOigAAxsBJgJaAV8B2wJaAWEB5AMiATIwAAMVAR0DUAGeA24B9QOHAfkDXwHj
+ A1kBxwNMAZMDFgEfCAABQgFNAT4HAAE+AwABKAMAAUADAAEgAQECAAEBAQABAQYAAQkWAAP/AQAB8AEf
+ BgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEP
+ BgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB4AEPBgAB+AEPAv8B/gF/Av8B8AEHAv8B/gF/Av8B8AED
+ AfkBzwHgAQ8C/wHgAQEB+AGPAeABBwIAAeABAQHwAY8B5gFHAgABwAEBAfABBwHmAUMCAAHAAQAB4AEH
+ Af4BBwIAAcABAAHiARMB8AEHAgABwAEAAcIBMwHgAQ8CAAHAAQABxAETAeABHwIAAcABAQGEARkB4AFv
+ AgAB4AEDAYgBCQHiAWcCAAH8AQ8CAAHgAUcCAAHAAX8C/wHwAQcCAAGDAb8C/wH8AT8C/wHPAb8C/wH+
+ AX8C/wH4AT8BxwHjAeABBwF/Af8B4AEDAcEBwwHAAQMBPwH/AYABAQHAAQMB4AEHAY8B/wGAAQEB4AEH
+ AYABAQGDAf8BgAEBAeABBwGAAQEBwQH/AYABAQHgAQcBgAEBAcAB/wGAAQEB4AEDAYABAQHgAT8BgAEA
+ AcABAQGAAQEB8AEfBAABwAEDAfgBDwQAAcABAwH8AQcEAAHgAQcB/gEDAQABAQH4AR8B4AEHAf8BAQGA
+ AQEB+AEfAfABDwH/AYEBwAEDAfwBPwHwAQ8B/wLAAQcB/AE/AfABDwH/AfAC/wH8AT8B+AEfAf8B/AHg
+ A/8BwgEDAf8B4QHgAT8CAAGAAQEB/wHgAcABDwIAAYABAAH/AcABgAEHAgABgAEAAf8BgAEAAQMCAAGA
+ AQAB/wGBAQABAwIAAYABAAH/AQMBAAEBAgABgAEAAf8BAwQAAYABAAGOAQcB4AQAAQEBDAEPAfwEAAED
+ AQABHwH+BAABAQEAAT8B/wEBAwABAQEAAT8B/wEDAwABAQHAAWMB/wGHAwABAwHAAQMB/wHHAwABBwHg
+ AQMC/wIAAQEBDwHwAQ8CAAL/AZ8B/wGAAQECAAHjAf8BhwH/AYABAQIAAcEB/wGBAf8BgAEBAgABwAH/
+ AcAB/wGAAQECAAGAAX8BwAH/AYABAQIAAYABPwHAAf8BgAEBAwABHwHgAT8BgAEBAwABDwHwAR8BgAEB
+ AwABBwH4AQ8BgAEBAgABDAEHAfwBDwGAAQECAAEeAQMB/AEHAYABAQIAAT8BgQH+AQMBgAEBAgAB/wHA
+ Af8BAwGAAQECAAH/AfAB/wGBAYABAQIAAf8B+AH/AcEBgAEBAgAD/wHhAYABAQT/AeABAwGAAQEBgAEB
+ AYABBwGAAQEBgAEBAwABAwIAAYABAQMAAQECAAGAAQEDAAEBAgABgAEBAwABAQIAAYABAQYAAYABAQYA
+ AYABAQYAAYABAQYAAYABAQYAAYABAQYAAf8BwwEAAQEBAAEBAQABAQHhAYcBAAEBAQABBwEAAQEB4AEH
+ AQABBwEAAQ8BAAEHAfABDwEAAX8BAAH/AQABfwHwAQ8BAAEPAYcB4QHgAQcB/gEHAQACAwLAAQMB+AEH
+ AQACAQKAAQEBwAEHBgABgAEHBgABgAEHAgABgAEBAgABgAEHAgABwAEDAgABgAEHAgAB4AEHAgABgAEH
+ AgAB4AEHAgABgAEHAgABwAEDAgABgAEHAgABgAEBAgABgAEBBgABgAEBBgABgAEBAQACAQKAAQEBgAED
+ AQAB/wEDAsABAwGAAQ8C/wGHAeEB4AEHAYABfwH/AfgCAAHjAf8B4AEHAf8B8AIAAcEB/wGAAQMB4AEg
+ AgABgAH/AYABAQHAAQEDAAF/AYABAQHAAQMDAAE/AYABAQGAAQcDAAEfAYABAQGAAQEDAAEPAYABAQQA
+ AYABBwGAAQEEAAHAAQMBgAEBBAAB4AEBAYABAQEAAQECAAHwAQABgAEBAQABAQIAAfgBAAGAAQEBgAED
+ AgAB/AEAAYABAQHwAQMCAAH+AQEBgAEBAfwBBwIAAf8BAwGAAQMB/wEHAgAB/wGHAcABBwGAAf8CAAHg
+ AQcB4AEHAYAB/wIAAeABBwHAAQMBgAMAAcABAQGAAQEBgAMAAYADAAGAAQABgAEAAYADAAGAAwABgAMA
+ AYADAAGAAwABgAMAAYADAAGAAwABgAMAAYADAAGAAwABgAIAAQEBgAMAAeACAAEBAYABAQIAAeACAAEB
+ AYABAQIAAeABAQEAAQEBwAEDAYABAQHwAfcBgAEBAfABAwHAAQMB8AP/AfABAwHwAQcF/wHhAYABvwGA
+ AQAB4AE/Af8BwAEAAQMBgAEAAeABBwH/AYACAAGAAQABwAEBAf8DAAGAAQABwAEBAf4DAAGAAQABwAEB
+ AfwBAQEAAQEBgAEAAYABAQHgAQMBAAEPAYABAAGAAQEBgAEHAgABgAEAAYABAQEAAQ8BgAEAAYABAAGA
+ AQEBAAEfAeABAAGAAQABgAEDAQABPwHgAQEBgAEAAYABAwEAAT8B4AEBAYABAAGAAQMBAAE/AcABAQGA
+ AQAB4AEHAQABfwHAAQEBgAEAAf4BBwHAAX8BwAEBBP8BwAH/AcABAwIAAv8CAAHAAQMCAAHjAf8GAAHD
+ Af8GAAHAAQEGAAHAAQEGAAHAAQEGAAHAAQEGAAHAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQECAAHg
+ AQcCAAGAAQECAAHwAQ8CAAGAAf8CAAHwAQcCAAGAAf8CAAHwAQcCAAL/AgAB8AEHAf8BjwHwAT8C/wHg
+ AQcB/wGHAYABAQGAAQEBwAEHAfABgwIAAYABAQHgAQcB4AEDAgABgAEBAYABAQHAAQECAAGAAQEDAAEB
+ AgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBAgABwAIAAQEBgAEBAgAB4AIA
+ AQEBgAEBAQABAQHgAgABBwGAAQEBAAEBAf8BwAEAAX8BgAEBAYABAQH4AU8B4AUAAfgBBwHgBQABwAED
+ AcAFAAGAAQMBwAcAAcAFAAGAAQABgAcAAYAFAAEBAYAGAAEBCAABAQ4AAYABAQYAAcABAwYAAcABHwYA
+ AfIBHwHgAQcEAAT/AgAC/wHgAQMB8AEPAeABBwHAAX8B4AEAAeABBwHgAQ8BgAEHAeABAAHAAQMCAAGA
+ AQABwAEAAYABAQIAAYABAAGABwABgAcAAYAHAAGABgABAQHgBgABAQHgBgABAQHgBgABAwHgBQABgAED
+ AfACAAEBAgABwAEHAfgBAAGAAQMCAAHAAR8B/AEBAcABBwIAAeABfwL/AeABDwIAAeAB/wH4AR8E/wH4
+ AT8ByAETAf4BPwL/AcABHwGcATkB/AEfAYABBwEAAQ8BBAEgAfwBHwGAAQMBAAEHAQQBIAH4AT8BgAEB
+ AQABAwEEASAB4AFDAYABAQIAAQQBIAHAAQMBgAEBAYADAAGAAQMBgAEBAeADAAGAAQcBgAEBAfABAAEE
+ ASABgAEfAcABAQH8AQABAgFAAYABAwHwAQEB/gEBAgABgAEBAcABAQH8AQMCAAHAAQEBwAEDAfgBAwGA
+ AQEBwAEDAeABBwHwAQcBwAEDAcAD/wHgAQ8B4AEHBP8B4AEPAf8BAwb/AfABAQL/AfgBHwIAAeADAAH4
+ AQECAAGAAwABgAMAAYABAQIAAYAHAAGABwABgAwAAQEDAAEBAwABAQMAAQEDAAEBAwABAwMAAQEDAAED
+ AwABAwMAAQMCAAGAAQMCAAHAAQcCAAHAAQcC/wHwAX8C/wHgAR8I/wGAAT8C/wHAAQcB5wH/AQABHwH8
+ AT8BwAEDAcABAQEAAR8B+AEfAcABAwHAAQEBAAEfAfABDwGAAQcBgAEBAQABHwHgAQ8BgAEHAYABAQEA
+ AR8BwAEDAYABBwGAAQEBAAEfAYABAQGAAQcBgAEBAQABPwMAAQMBgAEBAYABfwMAAQEBgAEBAYABBwQA
+ AYABAQGAAQEEAAGAAQEBgAUAAYABAwGABQABgAEDAcABAAGBAQECAAH/AecB4QEAAsMBAAEfA/8BgQT/
+ AQ8B/wHwAQ8CAAHgAQMBBwH/AeABBwIAAeABAwEBAf8BwAEDAgAB4AEDAQEB/wGAAQECAAH8AT8BAAF/
+ BAAB4AEfAYABDwIAAYABAQHgAQcBwAEHAgABwAEBAeABAwHgAQMCAAHAAQMB4AEDAfABAQIAAcABAwHg
+ AQMB+AMAAeABBwHgAQMB+AMAAeABBwHgAQMB+AMAAfABDwHgAQMB+AIAAQEB+AEfAeABAwH8AQEBgAED
+ AfgBHwHgAQMB/gEDAcABBwH4AR8B8AEDAf8BBwHgAQ8B/AE/AfwBAws=
</value>
</data>
<metadata name="m_ctxPwList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@@ -1581,17 +1573,17 @@
<data name="m_tbCloseTab.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAjhJREFUOE+1k9tL
- k2Ecx/1jqotIbyShIiMPqWva5nSH1BVOcqYL7OBFEi0sMIlQXMNW22IjnKXL3Dxs2jClk2J2GNhFiyLq
- xguD6qKIPv32zpqSsaseeHmf532f7+H3/T1PVtb/GPGGJu6V64hVVDOl1jG2r5wnJjMZtZbb7UxrDHzu
- 6IJwDJ6/hdgiuAf5cMrOSIGKV1bbxkRJ8GPjIYg+gOl5WPki7wUITkL/OHT7+HbRTaRMx1Jj898k0xo9
- RGbBE+Dn5T7o9cDtiKL+yd7Nj0tOcdbLylkHt3YWrCdI1qzYnotDzzWU0efl6wWHAqbHnfp21cf7E508
- O2xjcr8mTTJReoCPbZ2wmABXQDb6/wBweFPzGwO8OXaO1y3JUq24s3PTBOMlGuINbbxrtUu9o3zvcglR
- fwq4Ck7Y7BLgGWYq66RDRq5v254mGC2ukGBOM3ewmafmZkn8vCgOpQn8QV7UH5cAq5SWxipMuLaucRAu
- UvPScpL5mqOKPZy+FLh/RIgGU3NvQFpsIlykkrNhwLklJ+1goa6eWZ1F1G3ShVXA8CQP9Rbua2vhZihF
- MjAmYD3BfBV395as78TQ7mJx0MJyu4Q5HJVyrEyUakmWN1MpJIGQ/OsgqtJzZfMa9d/HM2Fr5c4elZTQ
- xCPDEWlTlTw6IdEQKlRJcAZZG/Dk7Pj3sV5qbMGfu0tA1aJqlpprJDCjAgzml+HYlC3ktZnvxJRaK0p5
- 0qo8Je2k5VBhaWZgxtu2wYZf6sXN8tgp1swAAAAASUVORK5CYII=
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI4SURBVDhPtZPbS5NhHMf9Y6qLSG8koSIjD6lr2uZ0h9QV
+ TnKmC+zgRRItLDCJUFzDVttiI5yly9w8bNowpZNidhjYRYsi6sYLg+qiiD799s6akrGrHnh5n+d9n+/h
+ 9/09T1bW/xjxhibuleuIVVQzpdYxtq+cJyYzGbWW2+1Mawx87uiCcAyev4XYIrgH+XDKzkiBildW28ZE
+ SfBj4yGIPoDpeVj5Iu8FCE5C/zh0+/h20U2kTMdSY/PfJNMaPURmwRPg5+U+6PXA7Yii/snezY9LTnHW
+ y8pZB7d2FqwnSNas2J6LQ881lNHn5esFhwKmx536dtXH+xOdPDtsY3K/Jk0yUXqAj22dsJgAV0A2+v8A
+ cHhT8xsDvDl2jtctyVKtuLNz0wTjJRriDW28a7VLvaN873IJUX8KuApO2OwS4BlmKuukQ0aub9ueJhgt
+ rpBgTjN3sJmn5mZJ/LwoDqUJ/EFe1B+XAKuUlsYqTLi2rnEQLlLz0nKS+Zqjij2cvhS4f0SIBlNzb0Ba
+ bCJcpJKzYcC5JSftYKGunlmdRdRt0oVVwPAkD/UW7mtr4WYoRTIwJmA9wXwVd/eWrO/E0O5icdDCcruE
+ ORyVcqxMlGpJljdTKSSBkPzrIKrSc2XzGvXfxzNha+XOHpWU0MQjwxFpU5U8OiHRECpUSXAGWRvw5Oz4
+ 97FeamzBn7tLQNWiapaaayQwowIM5pfh2JQt5LWZ78SUWitKedKqPCXtpOVQYWlmYMbbtsGGX+rFzfLY
+ KdbMAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="m_statusMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
diff --git a/KeePass/Forms/MainForm_Events.cs b/KeePass/Forms/MainForm_Events.cs
index f01a0b6..99e333c 100644
--- a/KeePass/Forms/MainForm_Events.cs
+++ b/KeePass/Forms/MainForm_Events.cs
@@ -130,6 +130,24 @@ namespace KeePass.Forms
}
/// <summary>
+ /// Event arguments structure for file-closing events.
+ /// </summary>
+ public sealed class FileClosingEventArgs : CancellableOperationEventArgs
+ {
+ private PwDatabase m_pwDatabase;
+
+ public PwDatabase Database { get { return m_pwDatabase; } }
+
+ /// <summary>
+ /// Default constructor.
+ /// </summary>
+ public FileClosingEventArgs(PwDatabase pwDatabase)
+ {
+ m_pwDatabase = pwDatabase;
+ }
+ }
+
+ /// <summary>
/// Event arguments structure for the file-closed event.
/// </summary>
public sealed class FileClosedEventArgs : EventArgs
@@ -189,6 +207,9 @@ namespace KeePass.Forms
/// </summary>
public event EventHandler<FileOpenedEventArgs> FileOpened;
+ public event EventHandler<FileClosingEventArgs> FileClosingPre;
+ public event EventHandler<FileClosingEventArgs> FileClosingPost;
+
/// <summary>
/// Event that is fired after a database has been closed.
/// </summary>
diff --git a/KeePass/Forms/MainForm_Functions.cs b/KeePass/Forms/MainForm_Functions.cs
index 968b48b..15ac1f7 100644
--- a/KeePass/Forms/MainForm_Functions.cs
+++ b/KeePass/Forms/MainForm_Functions.cs
@@ -23,8 +23,8 @@ using System.Drawing;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
-using System.Diagnostics;
using System.IO;
+using System.Diagnostics;
using KeePass.App;
using KeePass.App.Configuration;
@@ -1176,14 +1176,7 @@ namespace KeePass.Forms
}
if(lviFocused != null)
- {
- try { m_lvEntries.FocusedItem = lviFocused; } // .NET
- catch(Exception)
- {
- try { lviFocused.Focused = true; } // Mono
- catch(Exception) { Debug.Assert(false); }
- }
- }
+ UIUtil.SetFocusedItem(m_lvEntries, lviFocused, false);
View view = m_lvEntries.View;
if(m_bSimpleTanView)
@@ -2172,7 +2165,8 @@ namespace KeePass.Forms
}
catch(Exception ex)
{
- MessageService.ShowLoadWarning(ioc.GetDisplayName(), ex);
+ MessageService.ShowLoadWarning(ioc.GetDisplayName(), ex,
+ (Program.CommandLineArgs[AppDefs.CommandLineOptions.Debug] != null));
pwDb = null;
}
@@ -3166,20 +3160,26 @@ namespace KeePass.Forms
}
}
- private void CloseDocument(PwDocument ds, bool bLocking, bool bExiting)
+ private void CloseDocument(bool bLocking, bool bExiting)
{
- if(ds == null) ds = m_docMgr.ActiveDocument;
-
+ PwDocument ds = m_docMgr.ActiveDocument;
PwDatabase pd = ds.Database;
- IOConnectionInfo ioClosing = pd.IOConnectionInfo.CloneDeep();
+
+ Program.TriggerSystem.RaiseEvent(EcasEventIDs.ClosingDatabaseFilePre,
+ pd.IOConnectionInfo.Path);
+ if(this.FileClosingPre != null)
+ {
+ FileClosingEventArgs fcea = new FileClosingEventArgs(pd);
+ this.FileClosingPre(null, fcea);
+ if(fcea.Cancel) return;
+ }
if(pd.Modified) // Implies pd.IsOpen
{
+ bool bInvokeSave = false;
+
if(Program.Config.Application.FileClosing.AutoSave)
- {
- OnFileSave(null, EventArgs.Empty);
- if(pd.Modified) return;
- }
+ bInvokeSave = true;
else
{
FileSaveOrigin fso = FileSaveOrigin.Closing;
@@ -3190,15 +3190,28 @@ namespace KeePass.Forms
pd.IOConnectionInfo.GetDisplayName(), fso, this.Handle);
if(dr == DialogResult.Cancel) return;
- else if(dr == DialogResult.Yes)
- {
- OnFileSave(null, EventArgs.Empty);
- if(pd.Modified) return;
- }
+ else if(dr == DialogResult.Yes) bInvokeSave = true;
else if(dr == DialogResult.No) { } // Changes are lost
}
+
+ if(bInvokeSave)
+ {
+ OnFileSave(null, EventArgs.Empty);
+ if(pd.Modified) return;
+ }
}
+ Program.TriggerSystem.RaiseEvent(EcasEventIDs.ClosingDatabaseFilePost,
+ pd.IOConnectionInfo.Path);
+ if(this.FileClosingPost != null)
+ {
+ FileClosingEventArgs fcea = new FileClosingEventArgs(pd);
+ this.FileClosingPost(null, fcea);
+ if(fcea.Cancel) return;
+ }
+
+ IOConnectionInfo ioClosing = pd.IOConnectionInfo.CloneDeep();
+
pd.Close();
if(!bLocking) m_docMgr.CloseDatabase(pd);
@@ -3209,14 +3222,15 @@ namespace KeePass.Forms
{
m_docMgr.ActiveDatabase.UINeedsIconUpdate = true;
UpdateUI(true, null, true, null, true, null, false);
+ ResetDefaultFocus(null);
}
// NativeMethods.ClearIconicBitmaps(this.Handle);
- if(FileClosed != null)
+ if(this.FileClosed != null)
{
FileClosedEventArgs fcea = new FileClosedEventArgs(ioClosing);
- FileClosed(null, fcea);
+ this.FileClosed(null, fcea);
}
}
@@ -3241,15 +3255,13 @@ namespace KeePass.Forms
foreach(PwDocument ds in m_docMgr.Documents)
{
PwDatabase pd = ds.Database;
-
if(!pd.IsOpen) continue; // Nothing to lock
IOConnectionInfo ioIoc = pd.IOConnectionInfo;
Debug.Assert(ioIoc != null);
m_docMgr.ActiveDocument = ds;
-
- CloseDocument(null, true, false);
+ CloseDocument(true, false);
if(pd.IsOpen) return;
ds.LockedIoc = ioIoc;
@@ -3296,7 +3308,7 @@ namespace KeePass.Forms
if(ds.Database.IsOpen)
{
m_docMgr.ActiveDocument = ds;
- CloseDocument(null, false, bExiting);
+ CloseDocument(false, bExiting);
if(ds.Database.IsOpen)
{
@@ -3524,10 +3536,7 @@ namespace KeePass.Forms
{
if((m_lvEntries.Items.Count > 0) &&
(m_lvEntries.SelectedIndices.Count == 0))
- {
- m_lvEntries.Items[0].Selected = true;
- m_lvEntries.Items[0].Focused = true;
- }
+ UIUtil.SetFocusedItem(m_lvEntries, m_lvEntries.Items[0], true);
}
private void SelectEntries(PwObjectList<PwEntry> lEntries,
@@ -3550,7 +3559,8 @@ namespace KeePass.Forms
if(bFirst && bFocusFirst)
{
- m_lvEntries.Items[i].Focused = true;
+ UIUtil.SetFocusedItem(m_lvEntries,
+ m_lvEntries.Items[i], false);
bFirst = false;
}
@@ -4134,8 +4144,8 @@ namespace KeePass.Forms
aceMru.Items.Clear();
// Count <= max is not guaranteed, therefore take minimum of both
- for(uint uMru = 0; uMru < Math.Min(m_mruList.MaxItemCount,
- m_mruList.ItemCount); ++uMru)
+ uint uMax = Math.Min(m_mruList.MaxItemCount, m_mruList.ItemCount);
+ for(uint uMru = 0; uMru < uMax; ++uMru)
{
KeyValuePair<string, object> kvpMru = m_mruList.GetItem(uMru);
IOConnectionInfo ioMru = (kvpMru.Value as IOConnectionInfo);
@@ -4147,10 +4157,10 @@ namespace KeePass.Forms
{
m_mruList.MaxItemCount = aceMru.MaxItemCount;
- for(int iMru = 0; iMru < Math.Min((int)m_mruList.MaxItemCount,
- aceMru.Items.Count); ++iMru)
+ int nMax = Math.Min((int)m_mruList.MaxItemCount, aceMru.Items.Count);
+ for(int iMru = 0; iMru < nMax; ++iMru)
{
- IOConnectionInfo ioMru = aceMru.Items[iMru];
+ IOConnectionInfo ioMru = aceMru.Items[nMax - iMru - 1];
m_mruList.AddItem(ioMru.GetDisplayName(), ioMru.CloneDeep(), false);
}
@@ -4737,5 +4747,15 @@ namespace KeePass.Forms
ctx.ForcePlainTextPasswords = false;
return ctx;
}
+
+ private void EnsureAlwaysOnTopOpt()
+ {
+ bool bWish = Program.Config.MainWindow.AlwaysOnTop;
+ if(KeePassLib.Native.NativeLib.IsUnix()) { this.TopMost = bWish; return; }
+
+ // Workaround for issue reported in KPB 3475997
+ this.TopMost = false;
+ if(bWish) this.TopMost = true;
+ }
}
}
diff --git a/KeePass/Forms/OptionsForm.cs b/KeePass/Forms/OptionsForm.cs
index 588dfd0..a061396 100644
--- a/KeePass/Forms/OptionsForm.cs
+++ b/KeePass/Forms/OptionsForm.cs
@@ -135,7 +135,12 @@ namespace KeePass.Forms
CreateDialogBanner(BannerStyle.Default); // Default forces generation
m_cmbBannerStyle.SelectedIndex = (int)BannerStyle.Default;
- if(BannerFactory.CustomGenerator != null) m_cmbBannerStyle.Enabled = false;
+ if((BannerFactory.CustomGenerator != null) ||
+ AppConfigEx.IsOptionEnforced(Program.Config.UI, "BannerStyle"))
+ {
+ m_lblBannerStyle.Enabled = false;
+ m_cmbBannerStyle.Enabled = false;
+ }
int nWidth = m_lvPolicy.ClientRectangle.Width - UIUtil.GetVScrollBarWidth() - 1;
m_lvPolicy.Columns.Add(KPRes.Feature, (nWidth * 10) / 29);
@@ -167,6 +172,13 @@ namespace KeePass.Forms
m_cbAutoRun.Enabled = false;
}
+ UIUtil.SetExplorerTheme(m_lvSecurityOptions, false);
+ UIUtil.SetExplorerTheme(m_lvPolicy, false);
+ UIUtil.SetExplorerTheme(m_lvGuiOptions, false);
+ UIUtil.SetExplorerTheme(m_lvAdvanced, false);
+
+ AppConfigEx.ClearXmlPathCache();
+
LoadOptions();
// if(Program.Config.Meta.IsEnforcedConfiguration)
@@ -190,15 +202,21 @@ namespace KeePass.Forms
private void LoadSecurityOptions()
{
- uint uLockTime = Program.Config.Security.WorkspaceLocking.LockAfterTime;
+ AceWorkspaceLocking aceWL = Program.Config.Security.WorkspaceLocking;
+
+ uint uLockTime = aceWL.LockAfterTime;
bool bLockTime = (uLockTime > 0);
m_numLockAfterTime.Value = (bLockTime ? uLockTime : 300);
m_cbLockAfterTime.Checked = bLockTime;
+ if(AppConfigEx.IsOptionEnforced(aceWL, "LockAfterTime"))
+ m_cbLockAfterTime.Enabled = false;
- uLockTime = Program.Config.Security.WorkspaceLocking.LockAfterGlobalTime;
+ uLockTime = aceWL.LockAfterGlobalTime;
bLockTime = (uLockTime > 0);
m_numLockAfterGlobalTime.Value = (bLockTime ? uLockTime : 240);
m_cbLockAfterGlobalTime.Checked = bLockTime;
+ if(AppConfigEx.IsOptionEnforced(aceWL, "LockAfterGlobalTime"))
+ m_cbLockAfterGlobalTime.Enabled = false;
int nDefaultExpireDays = Program.Config.Defaults.NewEntryExpiresInDays;
if(nDefaultExpireDays < 0)
@@ -209,6 +227,8 @@ namespace KeePass.Forms
try { m_numDefaultExpireDays.Value = nDefaultExpireDays; }
catch(Exception) { Debug.Assert(false); }
}
+ if(AppConfigEx.IsOptionEnforced(Program.Config.Defaults, "NewEntryExpiresInDays"))
+ m_cbDefaultExpireDays.Enabled = false;
int nClipClear = Program.Config.Security.ClipboardClearAfterSeconds;
if(nClipClear >= 0)
@@ -217,6 +237,8 @@ namespace KeePass.Forms
m_numClipClearTime.Value = nClipClear;
}
else m_cbClipClearTime.Checked = false;
+ if(AppConfigEx.IsOptionEnforced(Program.Config.Security, "ClipboardClearAfterSeconds"))
+ m_cbClipClearTime.Enabled = false;
m_lvSecurityOptions.Columns.Add(string.Empty, 200); // Resize below
@@ -224,20 +246,20 @@ namespace KeePass.Forms
m_lvSecurityOptions.Groups.Add(lvg);
Debug.Assert(lvg.ListView == m_lvSecurityOptions);
- m_cdxSecurityOptions = new CheckedLVItemDXList(m_lvSecurityOptions);
-
- m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
- "LockOnWindowMinimize", lvg, KPRes.LockOnMinimize);
- m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
- "LockOnSessionSwitch", lvg, KPRes.LockOnSessionSwitch);
- m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
- "LockOnSuspend", lvg, KPRes.LockOnSuspend);
- m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
- "LockOnRemoteControlChange", lvg, KPRes.LockOnRemoteControlChange);
- m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
- "ExitInsteadOfLockingAfterTime", lvg, KPRes.ExitInsteadOfLockingAfterTime);
- m_cdxSecurityOptions.CreateItem(Program.Config.Security.WorkspaceLocking,
- "AlwaysExitInsteadOfLocking", lvg, KPRes.ExitInsteadOfLockingAlways);
+ m_cdxSecurityOptions = new CheckedLVItemDXList(m_lvSecurityOptions, true);
+
+ m_cdxSecurityOptions.CreateItem(aceWL, "LockOnWindowMinimize",
+ lvg, KPRes.LockOnMinimize);
+ m_cdxSecurityOptions.CreateItem(aceWL, "LockOnSessionSwitch",
+ lvg, KPRes.LockOnSessionSwitch);
+ m_cdxSecurityOptions.CreateItem(aceWL, "LockOnSuspend",
+ lvg, KPRes.LockOnSuspend);
+ m_cdxSecurityOptions.CreateItem(aceWL, "LockOnRemoteControlChange",
+ lvg, KPRes.LockOnRemoteControlChange);
+ m_cdxSecurityOptions.CreateItem(aceWL, "ExitInsteadOfLockingAfterTime",
+ lvg, KPRes.ExitInsteadOfLockingAfterTime);
+ m_cdxSecurityOptions.CreateItem(aceWL, "AlwaysExitInsteadOfLocking",
+ lvg, KPRes.ExitInsteadOfLockingAlways);
m_cdxSecurityOptions.CreateItem(Program.Config.Security, "ClipboardClearOnExit",
lvg, KPRes.ClipboardClearOnExit);
m_cdxSecurityOptions.CreateItem(Program.Config.Security,
@@ -268,7 +290,7 @@ namespace KeePass.Forms
private void LoadPolicyOptions()
{
- m_cdxPolicy = new CheckedLVItemDXList(m_lvPolicy);
+ m_cdxPolicy = new CheckedLVItemDXList(m_lvPolicy, true);
LoadPolicyOption("Plugins", KPRes.Plugins, KPRes.PolicyPluginsDesc);
LoadPolicyOption("Export", KPRes.Export, KPRes.PolicyExportDesc);
@@ -305,7 +327,7 @@ namespace KeePass.Forms
m_lvGuiOptions.Groups.Add(lvg);
Debug.Assert(lvg.ListView == m_lvGuiOptions);
- m_cdxGuiOptions = new CheckedLVItemDXList(m_lvGuiOptions);
+ m_cdxGuiOptions = new CheckedLVItemDXList(m_lvGuiOptions, true);
m_cdxGuiOptions.CreateItem(Program.Config.MainWindow, "CloseButtonMinimizesWindow",
lvg, KPRes.CloseButtonMinimizes);
@@ -373,6 +395,8 @@ namespace KeePass.Forms
lvg = new ListViewGroup(KPRes.Advanced);
m_lvGuiOptions.Groups.Add(lvg);
+ m_cdxGuiOptions.CreateItem(Program.Config.UI, "RepeatPasswordOnlyWhenHidden",
+ lvg, KPRes.RepeatOnlyWhenHidden);
m_cdxGuiOptions.CreateItem(Program.Config.UI, "UseCustomToolStripRenderer",
lvg, KPRes.UseCustomToolStripRenderer);
m_cdxGuiOptions.CreateItem(Program.Config.UI, "ForceSystemFontUnix",
@@ -386,6 +410,16 @@ namespace KeePass.Forms
try { m_numMruCount.Value = Program.Config.Application.MostRecentlyUsed.MaxItemCount; }
catch(Exception) { Debug.Assert(false); m_numMruCount.Value = AceMru.DefaultMaxItemCount; }
+ if(AppConfigEx.IsOptionEnforced(Program.Config.Application.MostRecentlyUsed, "MaxItemCount"))
+ {
+ m_lblMruCount.Enabled = false;
+ m_numMruCount.Enabled = false;
+ }
+
+ if(AppConfigEx.IsOptionEnforced(Program.Config.UI, "StandardFont"))
+ m_btnSelFont.Enabled = false;
+ if(AppConfigEx.IsOptionEnforced(Program.Config.UI, "PasswordFont"))
+ m_btnSelPwFont.Enabled = false;
}
private void LoadIntegrationOptions()
@@ -395,32 +429,46 @@ namespace KeePass.Forms
m_hkGlobalAutoType.HotKeyModifiers = (kAT & Keys.Modifiers);
m_hkGlobalAutoType.RenderHotKey();
m_kPrevATHKKey = (m_hkGlobalAutoType.HotKey | m_hkGlobalAutoType.HotKeyModifiers);
+ if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "HotKeyGlobalAutoType"))
+ m_hkGlobalAutoType.Enabled = false;
Keys kATS = (Keys)Program.Config.Integration.HotKeySelectedAutoType;
m_hkSelectedAutoType.HotKey = (kATS & Keys.KeyCode);
m_hkSelectedAutoType.HotKeyModifiers = (kATS & Keys.Modifiers);
m_hkSelectedAutoType.RenderHotKey();
m_kPrevATSHKKey = (m_hkSelectedAutoType.HotKey | m_hkSelectedAutoType.HotKeyModifiers);
+ if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "HotKeySelectedAutoType"))
+ m_hkSelectedAutoType.Enabled = false;
Keys kSW = (Keys)Program.Config.Integration.HotKeyShowWindow;
m_hkShowWindow.HotKey = (kSW & Keys.KeyCode);
m_hkShowWindow.HotKeyModifiers = (kSW & Keys.Modifiers);
m_hkShowWindow.RenderHotKey();
m_kPrevSWHKKey = (m_hkShowWindow.HotKey | m_hkShowWindow.HotKeyModifiers);
+ if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "HotKeyShowWindow"))
+ m_hkShowWindow.Enabled = false;
m_cbAutoRun.Checked = ShellUtil.GetStartWithWindows(AppDefs.AutoRunName);
+
m_cbSingleClickTrayAction.Checked = Program.Config.UI.TrayIcon.SingleClickDefault;
+ if(AppConfigEx.IsOptionEnforced(Program.Config.UI.TrayIcon, "SingleClickDefault"))
+ m_cbSingleClickTrayAction.Enabled = false;
string strOverride = Program.Config.Integration.UrlOverride;
m_cbUrlOverride.Checked = (strOverride.Length > 0);
m_tbUrlOverride.Text = strOverride;
+ if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "UrlOverride"))
+ m_cbUrlOverride.Enabled = false;
+
+ if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "UrlSchemeOverrides"))
+ m_btnSchemeOverrides.Enabled = false;
}
private void LoadAdvancedOptions()
{
m_lvAdvanced.Columns.Add(string.Empty, 200); // Resize below
- m_cdxAdvanced = new CheckedLVItemDXList(m_lvAdvanced);
+ m_cdxAdvanced = new CheckedLVItemDXList(m_lvAdvanced, true);
ListViewGroup lvg = new ListViewGroup(KPRes.StartAndExit);
m_lvAdvanced.Groups.Add(lvg);
@@ -450,6 +498,8 @@ namespace KeePass.Forms
lvg, KPRes.AutoTypeMatchByUrlInTitle);
m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByUrlHostInTitle",
lvg, KPRes.AutoTypeMatchByUrlHostInTitle);
+ m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeMatchByTagInTitle",
+ lvg, KPRes.AutoTypeMatchByTagInTitle);
m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypePrependInitSequenceForIE",
lvg, KPRes.AutoTypePrependInitSeqForIE);
m_cdxAdvanced.CreateItem(Program.Config.Integration, "AutoTypeReleaseAltWithKeyPress",
@@ -497,10 +547,18 @@ namespace KeePass.Forms
m_cdxAdvanced.UpdateData(false);
m_lvAdvanced.Columns[0].Width = m_lvAdvanced.ClientRectangle.Width -
UIUtil.GetVScrollBarWidth() - 1;
+
+ if(AppConfigEx.IsOptionEnforced(Program.Config.Integration, "ProxyType") ||
+ AppConfigEx.IsOptionEnforced(Program.Config.Integration, "ProxyAddress"))
+ m_btnProxy.Enabled = false;
}
private bool ValidateOptions()
{
+ m_hkGlobalAutoType.ResetIfModifierOnly();
+ m_hkSelectedAutoType.ResetIfModifierOnly();
+ m_hkShowWindow.ResetIfModifierOnly();
+
bool bAltMod = false;
bAltMod |= ((m_hkGlobalAutoType.HotKeyModifiers == Keys.Alt) ||
(m_hkGlobalAutoType.HotKeyModifiers == (Keys.Alt | Keys.Shift)));
@@ -586,6 +644,8 @@ namespace KeePass.Forms
m_cdxPolicy.Release();
m_cdxGuiOptions.Release();
m_cdxAdvanced.Release();
+
+ AppConfigEx.ClearXmlPathCache();
}
private static void ChangeHotKey(ref Keys kPrevHK, HotKeyControlEx hkControl,
@@ -614,7 +674,8 @@ namespace KeePass.Forms
if(m_bBlockUIUpdate) return;
m_bBlockUIUpdate = true;
- m_numLockAfterTime.Enabled = m_cbLockAfterTime.Checked;
+ m_numLockAfterTime.Enabled = (m_cbLockAfterTime.Checked &&
+ m_cbLockAfterTime.Enabled);
if(WinUtil.IsWindows9x || NativeLib.IsUnix())
{
@@ -622,12 +683,17 @@ namespace KeePass.Forms
m_cbLockAfterGlobalTime.Enabled = false;
m_numLockAfterGlobalTime.Enabled = false;
}
- else m_numLockAfterGlobalTime.Enabled = m_cbLockAfterGlobalTime.Checked;
-
- m_numDefaultExpireDays.Enabled = m_cbDefaultExpireDays.Checked;
- m_numClipClearTime.Enabled = m_cbClipClearTime.Checked;
+ else
+ m_numLockAfterGlobalTime.Enabled = (m_cbLockAfterGlobalTime.Checked &&
+ m_cbLockAfterGlobalTime.Enabled);
+
+ m_numDefaultExpireDays.Enabled = (m_cbDefaultExpireDays.Checked &&
+ m_cbDefaultExpireDays.Enabled);
+ m_numClipClearTime.Enabled = (m_cbClipClearTime.Checked &&
+ m_cbClipClearTime.Enabled);
- m_tbUrlOverride.Enabled = m_cbUrlOverride.Checked;
+ m_tbUrlOverride.Enabled = (m_cbUrlOverride.Checked &&
+ m_cbUrlOverride.Enabled);
m_bBlockUIUpdate = false;
}
diff --git a/KeePass/Forms/PrintForm.Designer.cs b/KeePass/Forms/PrintForm.Designer.cs
index b528a18..e9a0ab2 100644
--- a/KeePass/Forms/PrintForm.Designer.cs
+++ b/KeePass/Forms/PrintForm.Designer.cs
@@ -364,9 +364,9 @@
this.m_cbExpire.AutoSize = true;
this.m_cbExpire.Location = new System.Drawing.Point(360, 42);
this.m_cbExpire.Name = "m_cbExpire";
- this.m_cbExpire.Size = new System.Drawing.Size(94, 17);
+ this.m_cbExpire.Size = new System.Drawing.Size(76, 17);
this.m_cbExpire.TabIndex = 8;
- this.m_cbExpire.Text = "Expiration time";
+ this.m_cbExpire.Text = "Expiry time";
this.m_cbExpire.UseVisualStyleBackColor = true;
//
// m_cbNotes
diff --git a/KeePass/Forms/PrintForm.cs b/KeePass/Forms/PrintForm.cs
index c4a8ad4..02d4808 100644
--- a/KeePass/Forms/PrintForm.cs
+++ b/KeePass/Forms/PrintForm.cs
@@ -214,14 +214,37 @@ namespace KeePass.Forms
sb.AppendLine("body, p, div, h1, h2, h3, h4, h5, h6, ol, ul, li, td, th, dd, dt, a {");
sb.AppendLine("\tfont-family: Tahoma, MS Sans Serif, Sans Serif, Verdana, sans-serif;");
+ sb.AppendLine("\tfont-size: 10pt;");
sb.AppendLine("}");
sb.AppendLine("span.fserif {");
sb.AppendLine("\tfont-family: Times New Roman, serif;");
sb.AppendLine("}");
+ sb.AppendLine("h1 { font-size: 2em; }");
+ sb.AppendLine("h2 { font-size: 1.5em; }");
+ sb.AppendLine("h3 { font-size: 1.2em; }");
+ sb.AppendLine("h4 { font-size: 1em; }");
+ sb.AppendLine("h5 { font-size: 0.89em; }");
+ sb.AppendLine("h6 { font-size: 0.6em; }");
sb.AppendLine("td {");
sb.AppendLine("\ttext-align: left;");
sb.AppendLine("\tvertical-align: top;");
sb.AppendLine("}");
+ sb.AppendLine("a:visited {");
+ sb.AppendLine("\ttext-decoration: none;");
+ sb.AppendLine("\tcolor: #0000DD;");
+ sb.AppendLine("}");
+ sb.AppendLine("a:active {");
+ sb.AppendLine("\ttext-decoration: none;");
+ sb.AppendLine("\tcolor: #6699FF;");
+ sb.AppendLine("}");
+ sb.AppendLine("a:link {");
+ sb.AppendLine("\ttext-decoration: none;");
+ sb.AppendLine("\tcolor: #0000DD;");
+ sb.AppendLine("}");
+ sb.AppendLine("a:hover {");
+ sb.AppendLine("\ttext-decoration: underline;");
+ sb.AppendLine("\tcolor: #6699FF;");
+ sb.AppendLine("}");
sb.AppendLine("--></style>");
@@ -250,13 +273,13 @@ namespace KeePass.Forms
if(m_rbSerif.Checked)
{
- strFontInit = "<span class=\"fserif\"><small>";
- strFontExit = "</small></span>";
+ strFontInit = "<span class=\"fserif\">";
+ strFontExit = "</span>";
}
else if(m_rbSansSerif.Checked)
{
- strFontInit = "<small>";
- strFontExit = "</small>";
+ strFontInit = string.Empty;
+ strFontExit = string.Empty;
}
else if(m_rbMonospace.Checked)
{
@@ -275,12 +298,11 @@ namespace KeePass.Forms
string strCellPre = "<td>" + strFontInit;
string strCellPost = strFontExit + "</td>";
- sb.AppendLine(strTableInit);
-
- string strHTdInit = "<td><b><small>";
- string strHTdExit = "</small></b></td>";
+ string strHTdInit = "<td><b>";
+ string strHTdExit = "</b></td>";
StringBuilder sbH = new StringBuilder();
+ sbH.AppendLine();
sbH.Append("<tr>");
if(bGroup) sbH.AppendLine(strHTdInit + StrUtil.StringToHtml(KPRes.Group) + strHTdExit);
if(bTitle) sbH.AppendLine(strHTdInit + StrUtil.StringToHtml(KPRes.Title) + strHTdExit);
@@ -292,17 +314,16 @@ namespace KeePass.Forms
if(bLastAcc) sbH.AppendLine(strHTdInit + StrUtil.StringToHtml(KPRes.LastAccessTime) + strHTdExit);
if(bLastMod) sbH.AppendLine(strHTdInit + StrUtil.StringToHtml(KPRes.LastModificationTime) + strHTdExit);
if(bExpire) sbH.AppendLine(strHTdInit + StrUtil.StringToHtml(KPRes.ExpiryTime) + strHTdExit);
- sbH.AppendLine("</tr>");
+ sbH.Append("</tr>"); // No terminating \r\n
- string strH = sbH.ToString();
- sb.Append(strH);
- strTableInit += strH;
+ strTableInit += sbH.ToString();
+ sb.AppendLine(strTableInit);
eh = delegate(PwEntry pe)
{
sb.AppendLine("<tr>");
- WriteTabularIf(bGroup, sb, pe.ParentGroup.Name, strCellPre, strCellPost);
+ WriteTabularIf(bGroup, sb, StrUtil.StringToHtml(pe.ParentGroup.Name), strCellPre, strCellPost);
WriteTabularIf(bTitle, sb, pe, PwDefs.TitleField, strCellPre, strCellPost);
WriteTabularIf(bUserName, sb, pe, PwDefs.UserNameField, strCellPre, strCellPost);
@@ -321,13 +342,20 @@ namespace KeePass.Forms
else sb.AppendLine(strCellPost);
}
- WriteTabularIf(bURL, sb, pe, PwDefs.UrlField, strCellPre, strCellPost);
+ // WriteTabularIf(bURL, sb, pe, PwDefs.UrlField, strCellPre, strCellPost);
+ WriteTabularIf(bURL, sb, MakeUrlLink(pe.Strings.ReadSafe(PwDefs.UrlField),
+ strFontInit, strFontExit), strCellPre, strCellPost);
+
WriteTabularIf(bNotes, sb, pe, PwDefs.NotesField, strCellPre, strCellPost);
- WriteTabularIf(bCreation, sb, pe.CreationTime.ToString(), strCellPre, strCellPost);
- WriteTabularIf(bLastAcc, sb, pe.LastAccessTime.ToString(), strCellPre, strCellPost);
- WriteTabularIf(bLastMod, sb, pe.LastModificationTime.ToString(), strCellPre, strCellPost);
- WriteTabularIf(bExpire, sb, pe.ExpiryTime.ToString(), strCellPre, strCellPost);
+ WriteTabularIf(bCreation, sb, TimeUtil.ToDisplayString(
+ pe.CreationTime), strCellPre, strCellPost);
+ WriteTabularIf(bLastAcc, sb, TimeUtil.ToDisplayString(
+ pe.LastAccessTime), strCellPre, strCellPost);
+ WriteTabularIf(bLastMod, sb, TimeUtil.ToDisplayString(
+ pe.LastModificationTime), strCellPre, strCellPost);
+ WriteTabularIf(bExpire, sb, (pe.Expires ? TimeUtil.ToDisplayString(
+ pe.ExpiryTime) : KPRes.NeverExpires), strCellPre, strCellPost);
sb.AppendLine("</tr>");
return true;
@@ -337,6 +365,9 @@ namespace KeePass.Forms
{
sb.AppendLine(strTableInit);
+ if(pgDataSource.Entries.UCount == 0)
+ sb.AppendLine(@"<tr><td> </td></tr>");
+
eh = delegate(PwEntry pe)
{
if(bGroup) WriteDetailsLine(sb, KPRes.Group, pe.ParentGroup.Name, bSmallMono, bMonoPasswords, strFontInit, strFontExit);
@@ -345,10 +376,14 @@ namespace KeePass.Forms
if(bPassword) WriteDetailsLine(sb, KPRes.Password, pe.Strings.ReadSafe(PwDefs.PasswordField), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
if(bURL) WriteDetailsLine(sb, KPRes.Url, pe.Strings.ReadSafe(PwDefs.UrlField), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
if(bNotes) WriteDetailsLine(sb, KPRes.Notes, pe.Strings.ReadSafe(PwDefs.NotesField), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
- if(bCreation) WriteDetailsLine(sb, KPRes.CreationTime, pe.CreationTime.ToString(), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
- if(bLastAcc) WriteDetailsLine(sb, KPRes.LastAccessTime, pe.LastAccessTime.ToString(), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
- if(bLastMod) WriteDetailsLine(sb, KPRes.LastModificationTime, pe.LastModificationTime.ToString(), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
- if(bExpire) WriteDetailsLine(sb, KPRes.ExpiryTime, pe.ExpiryTime.ToString(), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
+ if(bCreation) WriteDetailsLine(sb, KPRes.CreationTime, TimeUtil.ToDisplayString(
+ pe.CreationTime), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
+ if(bLastAcc) WriteDetailsLine(sb, KPRes.LastAccessTime, TimeUtil.ToDisplayString(
+ pe.LastAccessTime), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
+ if(bLastMod) WriteDetailsLine(sb, KPRes.LastModificationTime, TimeUtil.ToDisplayString(
+ pe.LastModificationTime), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
+ if(bExpire) WriteDetailsLine(sb, KPRes.ExpiryTime, (pe.Expires ? TimeUtil.ToDisplayString(
+ pe.ExpiryTime) : KPRes.NeverExpires), bSmallMono, bMonoPasswords, strFontInit, strFontExit);
if(bAutoType)
{
@@ -395,6 +430,8 @@ namespace KeePass.Forms
try { UIUtil.SetWebBrowserDocument(m_wbMain, sb.ToString()); }
catch(Exception) { } // Throws in Mono 2.0+
+ try { m_wbMain.AllowNavigation = false; }
+ catch(Exception) { Debug.Assert(false); }
m_bBlockPreviewRefresh = false;
}
@@ -420,7 +457,7 @@ namespace KeePass.Forms
sb.Append(strCellPre);
- if(strValue.Length > 0) sb.Append(strValue);
+ if(strValue.Length > 0) sb.Append(strValue); // Don't HTML-encode
else sb.Append(@" ");
sb.AppendLine(strCellPost);
@@ -430,9 +467,9 @@ namespace KeePass.Forms
KeyValuePair<string, ProtectedString> kvp, bool bSmallMono,
bool bMonoPasswords, string strFontInit, string strFontExit)
{
- sb.Append("<tr><td><i><small>");
+ sb.Append("<tr><td><i>");
sb.Append(StrUtil.StringToHtml(kvp.Key));
- sb.AppendLine(":</small></i></td>");
+ sb.AppendLine(":</i></td>");
sb.Append("<td>");
@@ -440,9 +477,14 @@ namespace KeePass.Forms
sb.Append(bSmallMono ? "<code><small>" : "<code>");
else sb.Append(strFontInit);
- string strInner = StrUtil.StringToHtml(kvp.Value.ReadString());
- if(strInner.Length > 0) sb.Append(strInner);
- else sb.Append(" ");
+ if((kvp.Key == PwDefs.UrlField) && !kvp.Value.IsEmpty)
+ sb.Append(MakeUrlLink(kvp.Value.ReadString(), strFontInit, strFontExit));
+ else
+ {
+ string strInner = StrUtil.StringToHtml(kvp.Value.ReadString());
+ if(strInner.Length > 0) sb.Append(strInner);
+ else sb.Append(" ");
+ }
if(kvp.Key == PwDefs.PasswordField)
sb.Append(bSmallMono ? "</small></code>" : "</code>");
@@ -461,6 +503,17 @@ namespace KeePass.Forms
WriteDetailsLine(sb, kvp, bSmallMono, bMonoPasswords, strFontInit, strFontExit);
}
+ private static string MakeUrlLink(string strRawUrl, string strFontInit,
+ string strFontExit)
+ {
+ if(string.IsNullOrEmpty(strRawUrl)) return string.Empty;
+
+ string strUrl = StrUtil.StringToHtml(strRawUrl);
+ strUrl = "<a href=\"" + strUrl + "\">" + strFontInit + strUrl +
+ strFontExit + "</a>";
+ return strUrl;
+ }
+
private void SortGroupEntriesRecursive(PwGroup pg, string strFieldName)
{
PwEntryComparer cmp = new PwEntryComparer(strFieldName, true, true);
diff --git a/KeePass/Forms/PrintForm.resx b/KeePass/Forms/PrintForm.resx
index 5c542b5..35aa4d5 100644
--- a/KeePass/Forms/PrintForm.resx
+++ b/KeePass/Forms/PrintForm.resx
@@ -125,38 +125,38 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAS
- CAAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
- AwABEAMAAQEBAAEgBgABEEIAAxIBGQNTAaoDVAGrAx0BKiwAAyMBMwFkAkYB7AFZAlYBvgMSARmwAAMU
- ARsBYAJXAdYBGgGAAd8B/wEmAW0BsAH/A1QBqygAAyYBOQFiAkgB6QHyAucB/wHaAtAB/wFZAlcBwgMS
- ARmoAAMSARkBXgJZAdUBEwF0Ae0B/wFHAdsC/wFOAbQB6gH/A1MBqiQAAycBOwFkAk0B5wHqAt8B/wHs
- AuIB/wHmAtkB/wHcAtUB/wFbAlkBxJQAAwMBBAMBAQIIAAMQARYBXgJWAdgBFAF1AfEB/wFGAdUC/wFX
- AccB8gH/AV0CVgHXAxUBHSAAAyQBNgFkAkYB7AHpAtwB/wH1Au0B/wHhAtgB/wHkAtkB/wH8AvcB/wFh
- AkIB7owAAzQEVAGvAVwCWAHRAV4CWQHOAVICUQGhAygBPANWAbYBPgGOAfQB/wFEAdQC/wFWAcgB8wH/
- AV4CWQHVAxQBGyAAAyQBNQFkAkYB7AHrAuQB/wH1Au0B/wHqAuIB/wH7AvgB/wH2AvQB/wFkAkYB7AMm
- ATiEAAMMARADVQGyAW4BRgFHAfoBqAGlAaAB/wG2AbABqQH/AaMBnwGYAf8BgAF2AXQB/wFfAjcB8wFj
- AUMBWAH8AcsB9AH1Af8BaQHHAfgB/wFeAlYB2AMVAR0gAAMkATYBXwJKAegB6wLmBf8B+AL2Af8B+gL2
- Af8B8gLvAf8BZAJNAecDJwE7hAADBAEGAVoCVwHFAbcBswGvAf8B9QHpAdgC/wHzAd8C/wH1AeIC/wH0
- AeAB/wHnAd4BywH/AagBoAGXAf8BpgGkAZgB/wFyAVEBXwH8AVYCVQG0Aw8BFBgAAxoBJQMqAUEDOAFc
- AWUCTwHlAe4C6A3/AfEC7gH/AWICSAHpAyYBOYgAA0gBhgG1AbEBrgL/AfMB2wL/AfIB2QL/AfAB2AL/
- Ae8B2AL/AfAB2QL/AfcB4AH/AfoB7AHUAf8BpAGcAZAB/wFSAjEB9AMlATcUAAMWAR8DVAGrAWQCTQHn
- AWMCPwHwAWoCQQH5AeAC1g3/Ae8C6wH/AWQCRgHsAyMBM4wAAV8CVAHgAfQB5QHTAv8B7QHOAv8B6AHM
- Av8B5QHHAv8B5QHHAv8B5gHIAv8B5wHNAv8B9QHbAf8B4AHQAbcB/wFjAWEBXgH/A1EBoBAAAxUBHQFa
- AlcB0wHHArgB/wHxAuUB/wH5AvEB/wH7AvQB/wHsAuUB/wHsAuUF/wHyAu0B/wFiAkoB6wMlATeQAAGA
+ CAAAAk1TRnQBSQFMAgEBAgEAAQwBAAEMAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ AwABEAMAAQEBAAEgBgABEEIAAxIBGQNTAaoDVAGrAx0BKiwAAyMBMwFkAkoB7AFZAlYBvgMSARmwAAMU
+ ARsBYAJYAdYBGQGAAd8B/wElAWwBsAH/A1QBqygAAyYBOQFiAkwB6QHyAucB/wHaAtAB/wFZAlcBwgMS
+ ARmoAAMSARkBXgJaAdUBEgFzAe0B/wFGAdsC/wFNAbQB6gH/A1MBqiQAAycBOwFkAlEB5wHqAt8B/wHs
+ AuIB/wHmAtkB/wHcAtUB/wFbAlkBxJQAAwMBBAMBAQIIAAMQARYBXgJYAdgBEwF0AfEB/wFFAdUC/wFW
+ AccB8gH/AV0CWQHXAxUBHSAAAyQBNgFkAkoB7AHpAtwB/wH1Au0B/wHhAtgB/wHkAtkB/wH8AvcB/wFh
+ AkYB7owAAzQEVAGvAVwCWAHRAV4CWgHOAVICUQGhAygBPANWAbYBPQGOAfQB/wFDAdQC/wFVAcgB8wH/
+ AV4CWgHVAxQBGyAAAyQBNQFkAkoB7AHrAuQB/wH1Au0B/wHqAuIB/wH7AvgB/wH2AvQB/wFkAkoB7AMm
+ ATiEAAMMARADVQGyAW0BRwFIAfoBqAGlAaAB/wG2AbABqQH/AaMBnwGYAf8BgAF1AXMB/wFfAjkB8wFi
+ AUEBVwH8AcsB9AH1Af8BaAHHAfgB/wFeAlgB2AMVAR0gAAMkATYBXwJNAegB6wLmBf8B+AL2Af8B+gL2
+ Af8B8gLvAf8BZAJRAecDJwE7hAADBAEGAVoCVwHFAbcBswGvAf8B9QHpAdgC/wHzAd8C/wH1AeIC/wH0
+ AeAB/wHnAd4BywH/AagBoAGXAf8BpgGkAZgB/wFxAU8BXgH8AVYCVQG0Aw8BFBgAAxoBJQMqAUEDOAFc
+ AWUCUwHlAe4C6A3/AfEC7gH/AWICTAHpAyYBOYgAA0gBhgG1AbEBrgL/AfMB2wL/AfIB2QL/AfAB2AL/
+ Ae8B2AL/AfAB2QL/AfcB4AH/AfoB7AHUAf8BpAGcAZAB/wFSAjUB9AMlATcUAAMWAR8DVAGrAWQCUQHn
+ AWECQQHwAWoCQQH5AeAC1g3/Ae8C6wH/AWQCSgHsAyMBM4wAAV8CVwHgAfQB5QHTAv8B7QHOAv8B6AHM
+ Av8B5QHHAv8B5QHHAv8B5gHIAv8B5wHNAv8B9QHbAf8B4AHQAbcB/wFiAWABXQH/A1EBoBAAAxUBHQFa
+ AlkB0wHHArgB/wHxAuUB/wH5AvEB/wH7AvQB/wHsAuUB/wHsAuUF/wHyAu0B/wFhAk0B6wMlATeQAAF/
AkcB+QH/AegBywL/Ad8BuwL/AdoBsgL/AdYBqgL/AdUBqQL/AdcBrAL/AdsBtAL/AegBxwH/Af0B5QHF
Af8BigKBAf8BXAJZAc8DAwEEDAADUAGaAbwCrwH/AekC2gH/AekC3QH/AfQC6gH/AfMC7gH/AfYC9AH/
- Ae4C5wH/AeYC3wH/AV8CVAHgAycBO5QAAXsBawFpAfwB/wHcAbcC/wHPAZ4C/wHNAZkC/wHNAZkC/wHN
- AZoC/wHMAZkC/wHNAZoC/wHXAakC/wHdAbQB/wGXAYcBgQH/AVwCWAHRAwMBBAwAAWECQgHuAdwCyQH/
- Ad0CzQH/Ab0CrwH/AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/AWUCPQH0AzQBVJgAAWoCPQHzAf8B1wGy
+ Ae4C5wH/AeYC3wH/AV8CVwHgAycBO5QAAXoBagFoAfwB/wHcAbcC/wHPAZ4C/wHNAZkC/wHNAZkC/wHN
+ AZoC/wHMAZkC/wHNAZoC/wHXAakC/wHdAbQB/wGXAYcBgQH/AVwCWAHRAwMBBAwAAWECRgHuAdwCyQH/
+ Ad0CzQH/Ab0CrwH/AZ8ClQH/Ad8C1AH/AfMC7wH/AfsC9gH/AWUCPgH0AzQBVJgAAWgCPwHzAf8B1wGy
Av8BywGUAv8B0gGkAv8B1QGpAv8B1gGrAv8B0wGoAv8BzwGfAv8B0wGdAf8B9wHHAZgB/wGCAoEB/wNU
- Aa8QAAFtAjoB9wHvAtwB/wHAArIB/wNVAbUBQAI/AW8BogKZAf8B9ALrAf8B+ALxAf8BZwJAAfIDKgFB
+ Aa8QAAFtAjsB9wHvAtwB/wHAArIB/wNVAbUBQAI/AW8BogKZAf8B9ALrAf8B+ALxAf8BZwJEAfIDKgFB
mAABWgJXAcUB7QHQAb4C/wHRAaIC/wHgAbsC/wHiAcMC/wHhAcIC/wHgAb8C/wHgAboC/wHYAaQB/wHX
- AawBiQH/AV8BMwE1AfsBNQI0AVUQAAFkAkYB7AHIAroB/wFVAlMBsAMWAR4DVQGyAcACtAH/AegC3AH/
- AfAC5wH/AWMCSwHrAxwBJ5gAAy0BRQFuAjwB9wH5Ac8BtwL/AdYBtQL/AekB0gL/AfAB2wL/AesB0wH/
+ AawBiQH/AV8BMgE0AfsBNQI0AVUQAAFkAkoB7AHIAroB/wFVAlMBsAMWAR4DVQGyAcACtAH/AegC3AH/
+ AfAC5wH/AWICTgHrAxwBJ5gAAy0BRQFtAj0B9wH5Ac8BtwL/AdYBtQL/AekB0gL/AfAB2wL/AesB0wH/
Af4B2wG4Af8B6wG6AZcB/wGPAYIBgQH/A1YBsxQAA0IBdAFRAk8BnAMfAS0DVQGyAcACsAH/Ad4CzAH/
- AegC2gH/Ac4CwQH/A1MBqqAAAz8BbQFiAjcB9gHiAcABsgH/AfIBxQGwAf8B9AHIAbQB/wHtAb4BqQH/
+ AegC2gH/Ac4CwQH/A1MBqqAAAz8BbQFiAjgB9gHiAcABsgH/AfIBxQGwAf8B9AHIAbQB/wHtAb4BqQH/
AdUBrAGZAf8BkgGHAYQB/wFaAlcBxQMPARQcAAFRAk8BnAHFArcB/wHvAt0B/wHeAssB/wHEArcB/wFg
- AlgB1AMVAR2kAAEsAisBQwFbAlkBxAFnAkAB8gGJAVkBVwH7AXcCPgH4AWACVAHeA0gBhAMGAQggAANC
- AXYBZAJNAecBbQI6AfcBZAJGAewDTgGYAxQBHKAAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEB
+ AlkB1AMVAR2kAAEsAisBQwFbAlkBxAFnAkQB8gGIAVkBVwH7AXYCPgH4AWACVQHeA0gBhAMGAQggAANC
+ AXYBZAJRAecBbQI7AfcBZAJKAewDTgGYAxQBHKAAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEB
BQABgBcAA/8BAAH/AfAB/wHhBAAB/wHgAf8BwAQAAf8BwAH/AYAEAAH5AYAB/wUAAeABAQH+BQABgAED
AfwBAQUAAQcB4AEDBQABDwGAAQcFAAEPAQABDwUAAQcBAAEfBQABBwEAAT8FAAEPAQABPwUAAQ8BAAE/
BQABHwEAAX8EAAGAAR8BwAF/BAABwAE/AcAB/wQACw==
diff --git a/KeePass/Forms/PwEntryForm.Designer.cs b/KeePass/Forms/PwEntryForm.Designer.cs
index 2818475..e189648 100644
--- a/KeePass/Forms/PwEntryForm.Designer.cs
+++ b/KeePass/Forms/PwEntryForm.Designer.cs
@@ -138,6 +138,10 @@
this.m_ctxToolsFieldRefsInPassword = new System.Windows.Forms.ToolStripMenuItem();
this.m_ctxToolsFieldRefsInUrl = new System.Windows.Forms.ToolStripMenuItem();
this.m_ctxToolsFieldRefsInNotes = new System.Windows.Forms.ToolStripMenuItem();
+ this.m_ctxBinAttach = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.m_ctxBinImportFile = new System.Windows.Forms.ToolStripMenuItem();
+ this.m_ctxBinSep0 = new System.Windows.Forms.ToolStripSeparator();
+ this.m_ctxBinNew = new System.Windows.Forms.ToolStripMenuItem();
this.m_ctxDefaultTimes.SuspendLayout();
this.m_tabMain.SuspendLayout();
this.m_tabEntry.SuspendLayout();
@@ -152,6 +156,7 @@
this.m_ctxStrMoveToStandard.SuspendLayout();
this.m_ctxPwGen.SuspendLayout();
this.m_ctxTools.SuspendLayout();
+ this.m_ctxBinAttach.SuspendLayout();
this.SuspendLayout();
//
// m_lblUserName
@@ -287,7 +292,6 @@
this.m_dtExpireDateTime.Name = "m_dtExpireDateTime";
this.m_dtExpireDateTime.Size = new System.Drawing.Size(335, 20);
this.m_dtExpireDateTime.TabIndex = 20;
- this.m_dtExpireDateTime.ValueChanged += new System.EventHandler(this.OnExpireDateTimeChanged);
//
// m_ctxDefaultTimes
//
@@ -408,7 +412,6 @@
//
// m_btnGenPw
//
- this.m_btnGenPw.Image = global::KeePass.Properties.Resources.B15x13_KGPG_Gen;
this.m_btnGenPw.Location = new System.Drawing.Point(423, 90);
this.m_btnGenPw.Name = "m_btnGenPw";
this.m_btnGenPw.Size = new System.Drawing.Size(32, 23);
@@ -551,7 +554,7 @@
this.m_btnBinView.Location = new System.Drawing.Point(374, 104);
this.m_btnBinView.Name = "m_btnBinView";
this.m_btnBinView.Size = new System.Drawing.Size(75, 23);
- this.m_btnBinView.TabIndex = 4;
+ this.m_btnBinView.TabIndex = 3;
this.m_btnBinView.Text = "<>";
this.m_btnBinView.UseVisualStyleBackColor = true;
this.m_btnBinView.Click += new System.EventHandler(this.OnBtnBinView);
@@ -561,7 +564,7 @@
this.m_btnBinSave.Location = new System.Drawing.Point(374, 133);
this.m_btnBinSave.Name = "m_btnBinSave";
this.m_btnBinSave.Size = new System.Drawing.Size(75, 23);
- this.m_btnBinSave.TabIndex = 3;
+ this.m_btnBinSave.TabIndex = 4;
this.m_btnBinSave.Text = "&Save";
this.m_btnBinSave.UseVisualStyleBackColor = true;
this.m_btnBinSave.Click += new System.EventHandler(this.OnBtnBinSave);
@@ -589,7 +592,9 @@
// m_lvBinaries
//
this.m_lvBinaries.FullRowSelect = true;
+ this.m_lvBinaries.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.m_lvBinaries.HideSelection = false;
+ this.m_lvBinaries.LabelEdit = true;
this.m_lvBinaries.Location = new System.Drawing.Point(6, 20);
this.m_lvBinaries.Name = "m_lvBinaries";
this.m_lvBinaries.ShowItemToolTips = true;
@@ -598,6 +603,7 @@
this.m_lvBinaries.UseCompatibleStateImageBehavior = false;
this.m_lvBinaries.View = System.Windows.Forms.View.Details;
this.m_lvBinaries.ItemActivate += new System.EventHandler(this.OnBinariesItemActivate);
+ this.m_lvBinaries.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.OnBinAfterLabelEdit);
this.m_lvBinaries.SelectedIndexChanged += new System.EventHandler(this.OnBinariesSelectedIndexChanged);
//
// m_grpStringFields
@@ -1074,11 +1080,11 @@
this.m_ctxPwGenSep0,
this.m_ctxPwGenProfiles});
this.m_ctxPwGen.Name = "m_ctxPwGen";
- this.m_ctxPwGen.Size = new System.Drawing.Size(229, 54);
+ this.m_ctxPwGen.Size = new System.Drawing.Size(229, 76);
//
// m_ctxPwGenOpen
//
- this.m_ctxPwGenOpen.Image = global::KeePass.Properties.Resources.B16x16_KGPG_Gen;
+ this.m_ctxPwGenOpen.Image = global::KeePass.Properties.Resources.B16x16_Key_New;
this.m_ctxPwGenOpen.Name = "m_ctxPwGenOpen";
this.m_ctxPwGenOpen.Size = new System.Drawing.Size(228, 22);
this.m_ctxPwGenOpen.Text = "&Open Password Generator...";
@@ -1197,6 +1203,36 @@
this.m_ctxToolsFieldRefsInNotes.Text = "In N&otes Field";
this.m_ctxToolsFieldRefsInNotes.Click += new System.EventHandler(this.OnFieldRefInNotes);
//
+ // m_ctxBinAttach
+ //
+ this.m_ctxBinAttach.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.m_ctxBinImportFile,
+ this.m_ctxBinSep0,
+ this.m_ctxBinNew});
+ this.m_ctxBinAttach.Name = "m_ctxBinAttach";
+ this.m_ctxBinAttach.Size = new System.Drawing.Size(212, 54);
+ //
+ // m_ctxBinImportFile
+ //
+ this.m_ctxBinImportFile.Image = global::KeePass.Properties.Resources.B16x16_Folder_Yellow_Open;
+ this.m_ctxBinImportFile.Name = "m_ctxBinImportFile";
+ this.m_ctxBinImportFile.Size = new System.Drawing.Size(211, 22);
+ this.m_ctxBinImportFile.Text = "Attach &File(s)...";
+ this.m_ctxBinImportFile.Click += new System.EventHandler(this.OnCtxBinImport);
+ //
+ // m_ctxBinSep0
+ //
+ this.m_ctxBinSep0.Name = "m_ctxBinSep0";
+ this.m_ctxBinSep0.Size = new System.Drawing.Size(208, 6);
+ //
+ // m_ctxBinNew
+ //
+ this.m_ctxBinNew.Image = global::KeePass.Properties.Resources.B16x16_FileNew;
+ this.m_ctxBinNew.Name = "m_ctxBinNew";
+ this.m_ctxBinNew.Size = new System.Drawing.Size(211, 22);
+ this.m_ctxBinNew.Text = "&Create Empty Attachment";
+ this.m_ctxBinNew.Click += new System.EventHandler(this.OnCtxBinNew);
+ //
// PwEntryForm
//
this.AcceptButton = this.m_btnOK;
@@ -1237,6 +1273,7 @@
this.m_ctxStrMoveToStandard.ResumeLayout(false);
this.m_ctxPwGen.ResumeLayout(false);
this.m_ctxTools.ResumeLayout(false);
+ this.m_ctxBinAttach.ResumeLayout(false);
this.ResumeLayout(false);
}
@@ -1352,6 +1389,10 @@
private System.Windows.Forms.CheckBox m_cbCustomForegroundColor;
private System.Windows.Forms.TextBox m_tbTags;
private System.Windows.Forms.Label m_lblTags;
+ private System.Windows.Forms.ContextMenuStrip m_ctxBinAttach;
+ private System.Windows.Forms.ToolStripMenuItem m_ctxBinImportFile;
+ private System.Windows.Forms.ToolStripSeparator m_ctxBinSep0;
+ private System.Windows.Forms.ToolStripMenuItem m_ctxBinNew;
}
}
\ No newline at end of file
diff --git a/KeePass/Forms/PwEntryForm.cs b/KeePass/Forms/PwEntryForm.cs
index 4057d3b..37bc5b3 100644
--- a/KeePass/Forms/PwEntryForm.cs
+++ b/KeePass/Forms/PwEntryForm.cs
@@ -78,7 +78,10 @@ namespace KeePass.Forms
private bool m_bForceClosing = false;
private PwInputControlGroup m_icgPassword = new PwInputControlGroup();
+ private ExpiryControlGroup m_cgExpiry = new ExpiryControlGroup();
private RichTextBoxContextMenu m_ctxNotes = new RichTextBoxContextMenu();
+ private Image m_imgPwGen = null;
+ private Image m_imgStdExpire = null;
private readonly string DeriveFromPrevious = "(" + KPRes.GenPwBasedOnPrevious + ")";
private DynamicMenu m_dynGenProfiles;
@@ -136,6 +139,11 @@ namespace KeePass.Forms
get { return m_ctxStrMoveToStandard; }
}
+ public ContextMenuStrip AttachmentsContextMenu
+ {
+ get { return m_ctxBinAttach; }
+ }
+
private bool m_bInitSwitchToHistory = false;
internal bool InitSwitchToHistoryTab
{
@@ -153,6 +161,7 @@ namespace KeePass.Forms
Program.Translation.ApplyTo("KeePass.Forms.PwEntryForm.m_ctxListOperations", m_ctxListOperations.Items);
Program.Translation.ApplyTo("KeePass.Forms.PwEntryForm.m_ctxPwGen", m_ctxPwGen.Items);
Program.Translation.ApplyTo("KeePass.Forms.PwEntryForm.m_ctxStrMoveToStandard", m_ctxStrMoveToStandard.Items);
+ Program.Translation.ApplyTo("KeePass.Forms.PwEntryForm.m_ctxBinAttach", m_ctxBinAttach.Items);
}
public void InitEx(PwEntry pwEntry, PwEditMode pwMode, PwDatabase pwDatabase,
@@ -204,9 +213,6 @@ namespace KeePass.Forms
m_tbRepeatPassword, m_lblQuality, m_pbQuality, m_lblQualityBitsText,
this, bHideInitial, false);
- m_dtExpireDateTime.CustomFormat = DateTimeFormatInfo.CurrentInfo.ShortDatePattern +
- " " + DateTimeFormatInfo.CurrentInfo.LongTimePattern;
-
if(m_pwEntry.Expires)
{
m_dtExpireDateTime.Value = m_pwEntry.ExpiryTime;
@@ -214,9 +220,10 @@ namespace KeePass.Forms
}
else // Does not expire
{
- m_dtExpireDateTime.Value = DateTime.Now;
+ m_dtExpireDateTime.Value = DateTime.Now.Date;
m_cbExpires.Checked = false;
}
+ m_cgExpiry.Attach(m_cbExpires, m_dtExpireDateTime);
if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry)
{
@@ -256,9 +263,9 @@ namespace KeePass.Forms
m_lvStrings.Columns.Add(KPRes.FieldName, nWidth);
m_lvStrings.Columns.Add(KPRes.FieldValue, nWidth);
- nWidth = m_lvBinaries.ClientRectangle.Width;
+ nWidth = m_lvBinaries.ClientRectangle.Width / 2;
m_lvBinaries.Columns.Add(KPRes.Attachments, nWidth);
- // m_lvBinaries.Columns.Add(KPRes.FieldValue, nWidth);
+ m_lvBinaries.Columns.Add(KPRes.Size, nWidth, HorizontalAlignment.Right);
if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry)
{
@@ -266,6 +273,8 @@ namespace KeePass.Forms
m_btnStrDelete.Enabled = m_btnStrMove.Enabled =
m_btnBinAdd.Enabled = m_btnBinDelete.Enabled =
m_btnBinView.Enabled = m_btnBinSave.Enabled = false;
+
+ m_lvBinaries.LabelEdit = false;
}
}
@@ -329,11 +338,17 @@ namespace KeePass.Forms
// Public for plugins
public void UpdateEntryBinaries(bool bGuiToInternal)
{
- UpdateEntryBinaries(bGuiToInternal, false);
+ UpdateEntryBinaries(bGuiToInternal, false, null);
}
public void UpdateEntryBinaries(bool bGuiToInternal, bool bUpdateState)
{
+ UpdateEntryBinaries(bGuiToInternal, bUpdateState, null);
+ }
+
+ public void UpdateEntryBinaries(bool bGuiToInternal, bool bUpdateState,
+ string strFocusItem)
+ {
if(bGuiToInternal) { }
else // Internal to GUI
{
@@ -343,9 +358,22 @@ namespace KeePass.Forms
{
PwIcon pwIcon = (kvpBin.Value.IsProtected ?
m_pwObjectProtected : m_pwObjectPlainText);
- m_lvBinaries.Items.Add(kvpBin.Key, (int)pwIcon);
+ ListViewItem lvi = m_lvBinaries.Items.Add(kvpBin.Key, (int)pwIcon);
+ lvi.SubItems.Add(StrUtil.FormatDataSizeKB(kvpBin.Value.Length));
}
UIUtil.SetTopVisibleItem(m_lvBinaries, iTopVisible);
+
+ if(strFocusItem != null)
+ {
+ ListViewItem lvi = m_lvBinaries.FindItemWithText(strFocusItem,
+ false, 0, false);
+ if(lvi != null)
+ {
+ m_lvBinaries.EnsureVisible(lvi.Index);
+ UIUtil.SetFocusedItem(m_lvBinaries, lvi, true);
+ }
+ else { Debug.Assert(false); }
+ }
}
if(bUpdateState) EnableControlsEx();
@@ -485,11 +513,13 @@ namespace KeePass.Forms
{
Debug.Assert(m_lvStrings.Columns.Count == 2);
int dx = m_lvStrings.ClientRectangle.Width;
- m_lvStrings.Columns[0].Width = m_lvStrings.Columns[1].Width = dx / 2;
+ m_lvStrings.Columns[0].Width = dx / 2;
+ m_lvStrings.Columns[1].Width = dx / 2;
- Debug.Assert(m_lvBinaries.Columns.Count == 1);
+ Debug.Assert(m_lvBinaries.Columns.Count == 2);
dx = m_lvBinaries.ClientRectangle.Width;
- m_lvBinaries.Columns[0].Width = dx;
+ m_lvBinaries.Columns[0].Width = (dx * 4) / 5;
+ m_lvBinaries.Columns[1].Width = dx / 5;
Debug.Assert(m_lvAutoType.Columns.Count == 2);
dx = m_lvAutoType.ClientRectangle.Width;
@@ -553,14 +583,22 @@ namespace KeePass.Forms
this.Icon = Properties.Resources.KeePass;
this.Text = strTitle;
+ m_imgPwGen = UIUtil.CreateDropDownImage(Properties.Resources.B16x16_Key_New);
+ m_imgStdExpire = UIUtil.CreateDropDownImage(Properties.Resources.B16x16_History);
+
UIUtil.SetButtonImage(m_btnTools,
Properties.Resources.B16x16_Package_Settings, true);
- UIUtil.SetButtonImage(m_btnStandardExpires,
- Properties.Resources.B16x16_History, true);
+ UIUtil.SetButtonImage(m_btnGenPw, m_imgPwGen, true);
+ UIUtil.SetButtonImage(m_btnStandardExpires, m_imgStdExpire, true);
if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry)
m_bLockEnabledState = true;
+ // UIUtil.SetExplorerTheme(m_lvStrings, true);
+ // UIUtil.SetExplorerTheme(m_lvBinaries, true);
+ // UIUtil.SetExplorerTheme(m_lvAutoType, true);
+ // UIUtil.SetExplorerTheme(m_lvHistory, true);
+
UIUtil.PrepareStandardMultilineControl(m_rtNotes, true, true);
m_bInitializing = true;
@@ -661,22 +699,23 @@ namespace KeePass.Forms
m_btnPickFgColor.Enabled = m_cbCustomForegroundColor.Checked;
m_btnPickBgColor.Enabled = m_cbCustomBackgroundColor.Checked;
+ bool bATEnabled = m_cbAutoTypeEnabled.Checked;
m_lvAutoType.Enabled = m_btnAutoTypeAdd.Enabled =
m_rbAutoTypeSeqInherit.Enabled = m_rbAutoTypeOverride.Enabled =
- m_cbAutoTypeObfuscation.Enabled = m_cbAutoTypeEnabled.Checked;
+ m_cbAutoTypeObfuscation.Enabled = bATEnabled;
if(!m_rbAutoTypeOverride.Checked)
m_tbDefaultAutoTypeSeq.Enabled = m_btnAutoTypeEditDefault.Enabled = false;
else
m_tbDefaultAutoTypeSeq.Enabled = m_btnAutoTypeEditDefault.Enabled =
- m_cbAutoTypeEnabled.Checked;
+ bATEnabled;
int nAutoTypeSel = m_lvAutoType.SelectedItems.Count;
if(m_pwEditMode != PwEditMode.ViewReadOnlyEntry)
{
- m_btnAutoTypeEdit.Enabled = (nAutoTypeSel == 1);
- m_btnAutoTypeDelete.Enabled = (nAutoTypeSel >= 1);
+ m_btnAutoTypeEdit.Enabled = (bATEnabled && (nAutoTypeSel == 1));
+ m_btnAutoTypeDelete.Enabled = (bATEnabled && (nAutoTypeSel >= 1));
}
int nAccumSel = nStringsSel + nBinSel + nAutoTypeSel;
@@ -725,8 +764,8 @@ namespace KeePass.Forms
peTarget.Tags.Clear();
foreach(string strTag in vNewTags) peTarget.AddTag(strTag);
- peTarget.Expires = m_cbExpires.Checked;
- if(peTarget.Expires) peTarget.ExpiryTime = m_dtExpireDateTime.Value;
+ peTarget.Expires = m_cgExpiry.Checked;
+ if(peTarget.Expires) peTarget.ExpiryTime = m_cgExpiry.Value;
UpdateEntryStrings(true, false);
@@ -738,10 +777,7 @@ namespace KeePass.Forms
AutoTypeObfuscationOptions.UseClipboard :
AutoTypeObfuscationOptions.None);
- if(m_rbAutoTypeSeqInherit.Checked) m_atConfig.DefaultSequence = string.Empty;
- else if(m_rbAutoTypeOverride.Checked)
- m_atConfig.DefaultSequence = m_tbDefaultAutoTypeSeq.Text;
- else { Debug.Assert(false); }
+ SaveDefaultSeq();
peTarget.AutoType = m_atConfig;
@@ -750,17 +786,24 @@ namespace KeePass.Forms
StrUtil.NormalizeNewLines(peTarget.Strings, true);
+ bool bUndoBackup = false;
PwCompareOptions cmpOpt = m_cmpOpt;
if(bCreateBackup) cmpOpt |= PwCompareOptions.IgnoreLastBackup;
-
if(peTarget.EqualsEntry(m_pwInitialEntry, cmpOpt, MemProtCmpMode.CustomOnly))
{
+ // No modifications at all => restore last mod time and undo backup
peTarget.LastModificationTime = m_pwInitialEntry.LastModificationTime;
-
- if(bCreateBackup)
- peTarget.History.Remove(peTarget.History.GetAt(
- peTarget.History.UCount - 1)); // Undo backup
+ bUndoBackup = bCreateBackup;
+ }
+ else if(bCreateBackup)
+ {
+ // If only history items have been modified (deleted) => undo
+ // backup, but without restoring the last mod time
+ PwCompareOptions cmpOptNH = (m_cmpOpt | PwCompareOptions.IgnoreHistory);
+ if(peTarget.EqualsEntry(m_pwInitialEntry, cmpOptNH, MemProtCmpMode.CustomOnly))
+ bUndoBackup = true;
}
+ if(bUndoBackup) peTarget.History.RemoveAt(peTarget.History.UCount - 1);
peTarget.MaintainBackups(m_pwDatabase);
@@ -769,6 +812,15 @@ namespace KeePass.Forms
return true;
}
+ private void SaveDefaultSeq()
+ {
+ if(m_rbAutoTypeSeqInherit.Checked)
+ m_atConfig.DefaultSequence = string.Empty;
+ else if(m_rbAutoTypeOverride.Checked)
+ m_atConfig.DefaultSequence = m_tbDefaultAutoTypeSeq.Text;
+ else { Debug.Assert(false); }
+ }
+
private void OnBtnOK(object sender, EventArgs e)
{
if(SaveEntry(m_pwEntry, true)) m_bForceClosing = true;
@@ -796,6 +848,14 @@ namespace KeePass.Forms
m_ctxNotes.Detach();
m_icgPassword.Release();
+ m_cgExpiry.Release();
+
+ m_btnGenPw.Image = null;
+ m_imgPwGen.Dispose();
+ m_imgPwGen = null;
+ m_btnStandardExpires.Image = null;
+ m_imgStdExpire.Dispose();
+ m_imgStdExpire = null;
}
private void OnBtnStrAdd(object sender, EventArgs e)
@@ -854,72 +914,7 @@ namespace KeePass.Forms
private void OnBtnBinAdd(object sender, EventArgs e)
{
- if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
-
- OpenFileDialog ofd = UIUtil.CreateOpenFileDialog(KPRes.AttachFiles,
- UIUtil.CreateFileTypeFilter(null, null, true), 1, null, true, true);
-
- if(ofd.ShowDialog() == DialogResult.OK)
- {
- UpdateEntryBinaries(true, false);
-
- foreach(string strFile in ofd.FileNames)
- {
- byte[] vBytes = null;
- string strMsg, strItem = UrlUtil.GetFileName(strFile);
-
- if(m_vBinaries.Get(strItem) != null)
- {
- strMsg = KPRes.AttachedExistsAlready + MessageService.NewLine +
- strItem + MessageService.NewParagraph + KPRes.AttachNewRename +
- MessageService.NewParagraph + KPRes.AttachNewRenameRemarks0 +
- MessageService.NewLine + KPRes.AttachNewRenameRemarks1 +
- MessageService.NewLine + KPRes.AttachNewRenameRemarks2;
-
- DialogResult dr = MessageService.Ask(strMsg, null,
- MessageBoxButtons.YesNoCancel);
-
- if(dr == DialogResult.Cancel) continue;
- else if(dr == DialogResult.Yes)
- {
- string strFileName = UrlUtil.StripExtension(strItem);
- string strExtension = "." + UrlUtil.GetExtension(strItem);
-
- int nTry = 0;
- while(true)
- {
- string strNewName = strFileName + nTry.ToString() + strExtension;
- if(m_vBinaries.Get(strNewName) == null)
- {
- strItem = strNewName;
- break;
- }
-
- ++nTry;
- }
- }
- }
-
- try
- {
- vBytes = File.ReadAllBytes(strFile);
- vBytes = DataEditorForm.ConvertAttachment(strItem, vBytes);
-
- if(vBytes != null)
- {
- ProtectedBinary pb = new ProtectedBinary(false, vBytes);
- m_vBinaries.Set(strItem, pb);
- }
- }
- catch(Exception exAttach)
- {
- MessageService.ShowWarning(KPRes.AttachFailed, strFile, exAttach);
- }
- }
-
- UpdateEntryBinaries(false, true);
- ResizeColumnHeaders();
- }
+ m_ctxBinAttach.Show(m_btnBinAdd, new Point(0, m_btnBinAdd.Height));
}
private void OnBtnBinDelete(object sender, EventArgs e)
@@ -1002,7 +997,7 @@ namespace KeePass.Forms
if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
EditAutoTypeItemForm dlg = new EditAutoTypeItemForm();
- dlg.InitEx(m_atConfig, m_vStrings, -1, false);
+ dlg.InitEx(m_atConfig, -1, false, m_tbDefaultAutoTypeSeq.Text, m_vStrings);
if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK)
{
@@ -1015,12 +1010,12 @@ namespace KeePass.Forms
{
if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
- EditAutoTypeItemForm dlg = new EditAutoTypeItemForm();
-
ListView.SelectedIndexCollection lvSel = m_lvAutoType.SelectedIndices;
Debug.Assert(lvSel.Count == 1); if(lvSel.Count != 1) return;
- dlg.InitEx(m_atConfig, m_vStrings, lvSel[0], false);
+ EditAutoTypeItemForm dlg = new EditAutoTypeItemForm();
+ dlg.InitEx(m_atConfig, lvSel[0], false, m_tbDefaultAutoTypeSeq.Text,
+ m_vStrings);
if(UIUtil.ShowDialogAndDestroy(dlg) == DialogResult.OK)
UpdateAutoTypeList();
@@ -1113,13 +1108,18 @@ namespace KeePass.Forms
{
if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
- DateTime dt = DateTime.Now;
- if(nYears != 0) dt = dt.AddYears(nYears);
- if(nMonths != 0) dt = dt.AddMonths(nMonths);
- if(nDays != 0) dt = dt.AddDays(nDays);
+ DateTime dt = DateTime.Now.Date;
+ dt = dt.AddYears(nYears);
+ dt = dt.AddMonths(nMonths);
+ dt = dt.AddDays(nDays);
+
+ DateTime dtPrevTime = m_cgExpiry.Value;
+ dt = dt.AddHours(dtPrevTime.Hour);
+ dt = dt.AddMinutes(dtPrevTime.Minute);
+ dt = dt.AddSeconds(dtPrevTime.Second);
- m_cbExpires.Checked = true;
- m_dtExpireDateTime.Value = dt;
+ m_cgExpiry.Checked = true;
+ m_cgExpiry.Value = dt;
EnableControlsEx();
}
@@ -1227,10 +1227,10 @@ namespace KeePass.Forms
{
if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
- m_atConfig.DefaultSequence = m_tbDefaultAutoTypeSeq.Text;
+ SaveDefaultSeq();
EditAutoTypeItemForm ef = new EditAutoTypeItemForm();
- ef.InitEx(m_atConfig, m_vStrings, -1, true);
+ ef.InitEx(m_atConfig, -1, true, m_tbDefaultAutoTypeSeq.Text, m_vStrings);
if(UIUtil.ShowDialogAndDestroy(ef) == DialogResult.OK)
m_tbDefaultAutoTypeSeq.Text = m_atConfig.DefaultSequence;
@@ -1318,12 +1318,6 @@ namespace KeePass.Forms
m_ctxStrMoveToStandard.Show(m_btnStrMove, 0, m_btnStrMove.Height);
}
- private void OnExpireDateTimeChanged(object sender, EventArgs e)
- {
- m_cbExpires.Checked = true;
- EnableControlsEx();
- }
-
private void OnNotesLinkClicked(object sender, LinkClickedEventArgs e)
{
WinUtil.OpenUrl(e.LinkText, m_pwEntry);
@@ -1497,7 +1491,7 @@ namespace KeePass.Forms
{
m_vBinaries.Set(strDataItem, new ProtectedBinary(
pbinData.IsProtected, def.EditedBinaryData));
- UpdateEntryBinaries(false, true);
+ UpdateEntryBinaries(false, true, strDataItem); // Update size
}
UIUtil.DestroyForm(def);
@@ -1609,8 +1603,17 @@ namespace KeePass.Forms
return base.ProcessDialogKey(keyData);
}
+ private bool m_bClosing = false; // Mono bug workaround
private void OnFormClosing(object sender, FormClosingEventArgs e)
{
+ if(m_bClosing) return;
+ m_bClosing = true;
+ HandleFormClosing(e);
+ m_bClosing = false;
+ }
+
+ private void HandleFormClosing(FormClosingEventArgs e)
+ {
bool bCancel = false;
if(!m_bForceClosing && (m_pwEditMode != PwEditMode.ViewReadOnlyEntry))
{
@@ -1654,5 +1657,127 @@ namespace KeePass.Forms
{
OnBtnHistoryView(sender, e);
}
+
+ private void OnCtxBinImport(object sender, EventArgs e)
+ {
+ if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
+
+ OpenFileDialog ofd = UIUtil.CreateOpenFileDialog(KPRes.AttachFiles,
+ UIUtil.CreateFileTypeFilter(null, null, true), 1, null, true, true);
+
+ if(ofd.ShowDialog() == DialogResult.OK)
+ {
+ UpdateEntryBinaries(true, false);
+
+ foreach(string strFile in ofd.FileNames)
+ {
+ byte[] vBytes = null;
+ string strMsg, strItem = UrlUtil.GetFileName(strFile);
+
+ if(m_vBinaries.Get(strItem) != null)
+ {
+ strMsg = KPRes.AttachedExistsAlready + MessageService.NewLine +
+ strItem + MessageService.NewParagraph + KPRes.AttachNewRename +
+ MessageService.NewParagraph + KPRes.AttachNewRenameRemarks0 +
+ MessageService.NewLine + KPRes.AttachNewRenameRemarks1 +
+ MessageService.NewLine + KPRes.AttachNewRenameRemarks2;
+
+ DialogResult dr = MessageService.Ask(strMsg, null,
+ MessageBoxButtons.YesNoCancel);
+
+ if(dr == DialogResult.Cancel) continue;
+ else if(dr == DialogResult.Yes)
+ {
+ string strFileName = UrlUtil.StripExtension(strItem);
+ string strExtension = "." + UrlUtil.GetExtension(strItem);
+
+ int nTry = 0;
+ while(true)
+ {
+ string strNewName = strFileName + nTry.ToString() + strExtension;
+ if(m_vBinaries.Get(strNewName) == null)
+ {
+ strItem = strNewName;
+ break;
+ }
+
+ ++nTry;
+ }
+ }
+ }
+
+ try
+ {
+ vBytes = File.ReadAllBytes(strFile);
+ vBytes = DataEditorForm.ConvertAttachment(strItem, vBytes);
+
+ if(vBytes != null)
+ {
+ ProtectedBinary pb = new ProtectedBinary(false, vBytes);
+ m_vBinaries.Set(strItem, pb);
+ }
+ }
+ catch(Exception exAttach)
+ {
+ MessageService.ShowWarning(KPRes.AttachFailed, strFile, exAttach);
+ }
+ }
+
+ UpdateEntryBinaries(false, true);
+ ResizeColumnHeaders();
+ }
+ }
+
+ private void OnCtxBinNew(object sender, EventArgs e)
+ {
+ if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
+
+ string strName;
+ for(int i = 0; ; ++i)
+ {
+ strName = KPRes.New;
+ if(i >= 1) strName += " (" + i.ToString() + ")";
+ strName += ".rtf";
+
+ if(m_vBinaries.Get(strName) == null) break;
+ }
+
+ ProtectedBinary pb = new ProtectedBinary();
+ m_vBinaries.Set(strName, pb);
+ UpdateEntryBinaries(false, true, strName);
+ ResizeColumnHeaders();
+
+ ListViewItem lviNew = m_lvBinaries.FindItemWithText(strName,
+ false, 0, false);
+ if(lviNew != null) lviNew.BeginEdit();
+ }
+
+ private void OnBinAfterLabelEdit(object sender, LabelEditEventArgs e)
+ {
+ string strNew = e.Label;
+
+ e.CancelEdit = true; // In the case of success, we update it on our own
+
+ if(string.IsNullOrEmpty(strNew)) return;
+ if(m_pwEditMode == PwEditMode.ViewReadOnlyEntry) return;
+
+ int iItem = e.Item;
+ if((iItem < 0) || (iItem >= m_lvBinaries.Items.Count)) return;
+ string strOld = m_lvBinaries.Items[iItem].Text;
+ if(strNew == strOld) return;
+
+ if(m_vBinaries.Get(strNew) != null)
+ {
+ MessageService.ShowWarning(KPRes.FieldNameExistsAlready);
+ return;
+ }
+
+ ProtectedBinary pb = m_vBinaries.Get(strOld);
+ if(pb == null) { Debug.Assert(false); return; }
+ m_vBinaries.Remove(strOld);
+ m_vBinaries.Set(strNew, pb);
+
+ UpdateEntryBinaries(false, true, strNew);
+ }
}
}
diff --git a/KeePass/Forms/PwEntryForm.resx b/KeePass/Forms/PwEntryForm.resx
index 72825d9..94cc339 100644
--- a/KeePass/Forms/PwEntryForm.resx
+++ b/KeePass/Forms/PwEntryForm.resx
@@ -138,4 +138,7 @@
<metadata name="m_ctxTools.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 43</value>
</metadata>
+ <metadata name="m_ctxBinAttach.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>135, 46</value>
+ </metadata>
</root>
\ No newline at end of file
diff --git a/KeePass/Forms/TextEncodingForm.Designer.cs b/KeePass/Forms/TextEncodingForm.Designer.cs
index 4fd6d9d..e8b099c 100644
--- a/KeePass/Forms/TextEncodingForm.Designer.cs
+++ b/KeePass/Forms/TextEncodingForm.Designer.cs
@@ -75,7 +75,7 @@
this.m_cmbEnc.Location = new System.Drawing.Point(12, 53);
this.m_cmbEnc.MaxDropDownItems = 12;
this.m_cmbEnc.Name = "m_cmbEnc";
- this.m_cmbEnc.Size = new System.Drawing.Size(233, 21);
+ this.m_cmbEnc.Size = new System.Drawing.Size(385, 21);
this.m_cmbEnc.TabIndex = 4;
this.m_cmbEnc.SelectedIndexChanged += new System.EventHandler(this.OnEncSelectedIndexChanged);
//
diff --git a/KeePass/Forms/TextEncodingForm.cs b/KeePass/Forms/TextEncodingForm.cs
index 96be9d0..a73be78 100644
--- a/KeePass/Forms/TextEncodingForm.cs
+++ b/KeePass/Forms/TextEncodingForm.cs
@@ -29,6 +29,8 @@ using KeePass.UI;
using KeePass.Util;
using KeePass.Resources;
+using KeePassLib.Utility;
+
namespace KeePass.Forms
{
public partial class TextEncodingForm : Form
@@ -37,24 +39,7 @@ namespace KeePass.Forms
private byte[] m_pbData = null;
private bool m_bInitializing = false;
private Encoding m_encSel = null;
-
- private string[] m_vEncText = new string[] {
- KPRes.BinaryNoConv,
- BinaryDataClassifier.BdeAnsi + " (" + KPRes.SystemCodePage + ")",
- BinaryDataClassifier.BdeAscii,
- BinaryDataClassifier.BdeUtf7, BinaryDataClassifier.BdeUtf8,
- BinaryDataClassifier.BdeUtf32,
- BinaryDataClassifier.BdeUnicodeLE, BinaryDataClassifier.BdeUnicodeBE
- };
-
- private Encoding[] m_vEnc = new Encoding[] {
- null,
- Encoding.Default,
- Encoding.ASCII,
- Encoding.UTF7, new UTF8Encoding(false),
- Encoding.UTF32,
- Encoding.Unicode, Encoding.BigEndianUnicode
- };
+ private uint m_uStartOffset = 0;
public Encoding SelectedEncoding
{
@@ -81,15 +66,17 @@ namespace KeePass.Forms
FontUtil.AssignDefaultBold(m_lblContext);
m_lblContext.Text = m_strContext;
- foreach(string strEnc in m_vEncText)
- m_cmbEnc.Items.Add(strEnc);
+ m_cmbEnc.Items.Add(KPRes.BinaryNoConv);
+ foreach(StrEncodingInfo sei in StrUtil.Encodings)
+ m_cmbEnc.Items.Add(sei.Name);
+
+ StrEncodingInfo seiGuess = BinaryDataClassifier.GetStringEncoding(
+ m_pbData, out m_uStartOffset);
- string strDet;
- uint uStartOffset;
- BinaryDataClassifier.GetStringEncoding(m_pbData, false,
- out strDet, out uStartOffset);
- int iDet = Array.IndexOf<string>(m_vEncText, strDet);
- m_cmbEnc.SelectedIndex = ((iDet >= 0) ? iDet : 0);
+ int iSel = 0;
+ if(seiGuess != null)
+ iSel = Math.Max(m_cmbEnc.FindStringExact(seiGuess.Name), 0);
+ m_cmbEnc.SelectedIndex = iSel;
m_bInitializing = false;
UpdateTextPreview();
@@ -100,17 +87,24 @@ namespace KeePass.Forms
GlobalWindowManager.RemoveWindow(this);
}
+ private Encoding GetSelEnc()
+ {
+ StrEncodingInfo sei = StrUtil.GetEncoding(m_cmbEnc.Text);
+ return ((sei != null) ? sei.Encoding : null);
+ }
+
private void UpdateTextPreview()
{
if(m_bInitializing) return;
- if(m_pbData == null) { Debug.Assert(false); return; }
+ m_rtbPreview.Clear(); // Clear formatting
try
{
- Encoding enc = m_vEnc[m_cmbEnc.SelectedIndex];
- if(enc == null) enc = new UTF8Encoding(false);
+ Encoding enc = GetSelEnc();
+ if(enc == null) throw new InvalidOperationException();
- m_rtbPreview.Text = enc.GetString(m_pbData);
+ m_rtbPreview.Text = enc.GetString(m_pbData, (int)m_uStartOffset,
+ m_pbData.Length - (int)m_uStartOffset);
}
catch(Exception) { m_rtbPreview.Text = string.Empty; }
}
@@ -122,7 +116,7 @@ namespace KeePass.Forms
private void OnBtnOK(object sender, EventArgs e)
{
- m_encSel = m_vEnc[m_cmbEnc.SelectedIndex];
+ m_encSel = GetSelEnc();
}
private void OnBtnCancel(object sender, EventArgs e)
diff --git a/KeePass/Forms/UpdateCheckForm.cs b/KeePass/Forms/UpdateCheckForm.cs
index 2088a86..a995197 100644
--- a/KeePass/Forms/UpdateCheckForm.cs
+++ b/KeePass/Forms/UpdateCheckForm.cs
@@ -67,7 +67,7 @@ namespace KeePass.Forms
this.Icon = Properties.Resources.KeePass;
this.Text = KPRes.UpdateCheck + " - " + PwDefs.ShortProductName;
- // UIUtil.SetExplorerTheme(m_lvInfo.Handle);
+ UIUtil.SetExplorerTheme(m_lvInfo, true);
int nWidth = m_lvInfo.ClientRectangle.Width - UIUtil.GetVScrollBarWidth();
m_lvInfo.Columns.Add(KPRes.Component, (nWidth * 2) / 6);
@@ -123,12 +123,12 @@ namespace KeePass.Forms
else lvi.ImageIndex = 0;
lvi.SubItems.Add(strStatus);
- lvi.SubItems.Add(StrUtil.VersionToString(uc.VerInstalled));
+ lvi.SubItems.Add(StrUtil.VersionToString(uc.VerInstalled, true));
if((uc.Status == UpdateComponentStatus.UpToDate) ||
(uc.Status == UpdateComponentStatus.NewVerAvailable) ||
(uc.Status == UpdateComponentStatus.PreRelease))
- lvi.SubItems.Add(StrUtil.VersionToString(uc.VerAvailable));
+ lvi.SubItems.Add(StrUtil.VersionToString(uc.VerAvailable, true));
else lvi.SubItems.Add("?");
if(lvg != null) lvi.Group = lvg;
diff --git a/KeePass/Forms/UrlSchemesForm.cs b/KeePass/Forms/UrlSchemesForm.cs
index 469d6b6..b466926 100644
--- a/KeePass/Forms/UrlSchemesForm.cs
+++ b/KeePass/Forms/UrlSchemesForm.cs
@@ -57,7 +57,7 @@ namespace KeePass.Forms
this.Icon = Properties.Resources.KeePass;
this.Text = KPRes.UrlSchemeOverrides;
- UIUtil.SetExplorerTheme(m_lvOverrides.Handle);
+ UIUtil.SetExplorerTheme(m_lvOverrides, false);
int nWidth = (m_lvOverrides.ClientSize.Width - UIUtil.GetVScrollBarWidth()) / 4;
m_lvOverrides.Columns.Add(KPRes.Scheme, nWidth);
diff --git a/KeePass/KeePass.csproj b/KeePass/KeePass.csproj
index 1b60651..87f61d0 100644
--- a/KeePass/KeePass.csproj
+++ b/KeePass/KeePass.csproj
@@ -140,6 +140,9 @@
<Compile Include="..\KeePassLib\Interfaces\IUIOperations.cs">
<Link>KeePassLib\Interfaces\IUIOperations.cs</Link>
</Compile>
+ <Compile Include="..\KeePassLib\Interfaces\IXmlSerializerEx.cs">
+ <Link>KeePassLib\Interfaces\IXmlSerializerEx.cs</Link>
+ </Compile>
<Compile Include="..\KeePassLib\Keys\CompositeKey.cs">
<Link>KeePassLib\Keys\CompositeKey.cs</Link>
</Compile>
@@ -306,6 +309,7 @@
<Compile Include="App\Configuration\AppConfigEx.cs" />
<Compile Include="App\Configuration\AppConfigSerializer.cs" />
<Compile Include="DataExchange\CsvStreamReader.cs" />
+ <Compile Include="DataExchange\CsvStreamReaderEx.cs" />
<Compile Include="DataExchange\ExportUtil.cs" />
<Compile Include="DataExchange\FileFormatProvider.cs" />
<Compile Include="DataExchange\Formats\AmpXml250.cs" />
@@ -317,7 +321,6 @@
<Compile Include="DataExchange\Formats\HandySafeProXml12.cs" />
<Compile Include="DataExchange\Formats\HandySafeTxt512.cs" />
<Compile Include="DataExchange\Formats\KasperskyPwMgrXml50.cs" />
- <Compile Include="DataExchange\Formats\KeePassCsv1x.cs" />
<Compile Include="DataExchange\Formats\KeePassHtml2x.cs" />
<Compile Include="DataExchange\Formats\KeePassKdb1x.cs" />
<Compile Include="DataExchange\Formats\KeePassKdb2x.cs" />
@@ -389,6 +392,12 @@
<Compile Include="Forms\ColumnsForm.Designer.cs">
<DependentUpon>ColumnsForm.cs</DependentUpon>
</Compile>
+ <Compile Include="Forms\CsvImportForm.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\CsvImportForm.Designer.cs">
+ <DependentUpon>CsvImportForm.cs</DependentUpon>
+ </Compile>
<Compile Include="Forms\DatabaseOperationsForm.cs">
<SubType>Form</SubType>
</Compile>
@@ -491,12 +500,6 @@
<Compile Include="Forms\FileBrowserForm.Designer.cs">
<DependentUpon>FileBrowserForm.cs</DependentUpon>
</Compile>
- <Compile Include="Forms\ImportCsvForm.cs">
- <SubType>Form</SubType>
- </Compile>
- <Compile Include="Forms\ImportCsvForm.Designer.cs">
- <DependentUpon>ImportCsvForm.cs</DependentUpon>
- </Compile>
<Compile Include="Forms\GroupForm.cs">
<SubType>Form</SubType>
</Compile>
@@ -696,6 +699,7 @@
<SubType>Component</SubType>
</Compile>
<Compile Include="UI\DocumentManagerEx.cs" />
+ <Compile Include="UI\ExpiryControlGroup.cs" />
<Compile Include="UI\FileDialogsEx.cs" />
<Compile Include="UI\FontUtil.cs" />
<Compile Include="UI\GlobalWindowManager.cs" />
@@ -764,6 +768,9 @@
<EmbeddedResource Include="Forms\ColumnsForm.resx">
<DependentUpon>ColumnsForm.cs</DependentUpon>
</EmbeddedResource>
+ <EmbeddedResource Include="Forms\CsvImportForm.resx">
+ <DependentUpon>CsvImportForm.cs</DependentUpon>
+ </EmbeddedResource>
<EmbeddedResource Include="Forms\DatabaseOperationsForm.resx">
<SubType>Designer</SubType>
<DependentUpon>DatabaseOperationsForm.cs</DependentUpon>
@@ -822,10 +829,6 @@
<EmbeddedResource Include="Forms\FileBrowserForm.resx">
<DependentUpon>FileBrowserForm.cs</DependentUpon>
</EmbeddedResource>
- <EmbeddedResource Include="Forms\ImportCsvForm.resx">
- <DependentUpon>ImportCsvForm.cs</DependentUpon>
- <SubType>Designer</SubType>
- </EmbeddedResource>
<EmbeddedResource Include="Forms\GroupForm.resx">
<SubType>Designer</SubType>
<DependentUpon>GroupForm.cs</DependentUpon>
@@ -945,6 +948,7 @@
<Compile Include="Util\ClipboardContents.cs" />
<Compile Include="Util\ClipboardEventChainBlocker.cs" />
<Compile Include="Util\ClipboardUtil.cs" />
+ <Compile Include="Util\ClipboardUtil.MacOSX.cs" />
<Compile Include="Util\ClipboardUtil.Windows.cs" />
<Compile Include="Util\CommandLineArgs.cs" />
<Compile Include="Ecas\EcasActionType.cs" />
@@ -973,6 +977,7 @@
<Compile Include="Util\IpcBroadcast.Fsw.cs" />
<Compile Include="Util\IpcUtilEx.cs" />
<Compile Include="Util\KeyUtil.cs" />
+ <Compile Include="Util\MonoWorkarounds.cs" />
<Compile Include="Util\NetUtil.cs" />
<Compile Include="Util\PwGeneratorUtil.cs" />
<Compile Include="Util\SearchUtil.cs" />
@@ -990,7 +995,9 @@
<Compile Include="Util\TextSimilarity.cs" />
<Compile Include="Util\UpdateCheckEx.cs" />
<Compile Include="Util\WinUtil.cs" />
+ <Compile Include="Util\XmlSerialization\XmlSerializerEx.Gen.cs" />
<Compile Include="Util\XmlUtil.cs" />
+ <Compile Include="Util\XmlSerialization\XmlSerializerEx.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Nuvola\B16x16_1DownArrow.png" />
@@ -1117,6 +1124,7 @@
</ItemGroup>
<ItemGroup>
<Content Include="KeePass.ico" />
+ <None Include="Resources\Nuvola_Derived\B16x16_Key_New.png" />
<None Include="Resources\Nuvola_Derived\B16x16_EditCopyLink.png" />
<None Include="Resources\Images\B16x16_Imp_KasperskyPwMgr.png" />
<None Include="Resources\Images\B16x16_Imp_StickyPw.png" />
diff --git a/KeePass/Native/NativeMethods.New.cs b/KeePass/Native/NativeMethods.New.cs
index fc22ce7..8d2c89d 100644
--- a/KeePass/Native/NativeMethods.New.cs
+++ b/KeePass/Native/NativeMethods.New.cs
@@ -435,5 +435,45 @@ namespace KeePass.Native
SendMessageLVGroup(lv.Handle, LVM_SETGROUPINFO,
new IntPtr(iGroupID), ref g);
} */
+
+ /* internal static int GetGroupIDByIndex(ListView lv, uint uIndex)
+ {
+ if(lv == null) { Debug.Assert(false); return 0; }
+
+ LVGROUP g = new LVGROUP();
+ g.cbSize = (uint)Marshal.SizeOf(g);
+ g.AssertSize();
+
+ g.mask = NativeMethods.LVGF_GROUPID;
+
+ if(SendMessageLVGroup(lv.Handle, LVM_GETGROUPINFOBYINDEX,
+ new IntPtr((int)uIndex), ref g) == IntPtr.Zero)
+ {
+ Debug.Assert(false);
+ }
+
+ return g.iGroupId;
+ }
+
+ internal static void SetGroupTask(ListView lv, int iGroupID,
+ string strTask)
+ {
+ if(lv == null) { Debug.Assert(false); return; }
+
+ LVGROUP g = new LVGROUP();
+ g.cbSize = (uint)Marshal.SizeOf(g);
+ g.AssertSize();
+
+ g.mask = LVGF_TASK;
+
+ g.pszTask = strTask;
+ g.cchTask = (uint)((strTask != null) ? strTask.Length : 0);
+
+ if(SendMessageLVGroup(lv.Handle, LVM_SETGROUPINFO,
+ new IntPtr(iGroupID), ref g) == (new IntPtr(-1)))
+ {
+ Debug.Assert(false);
+ }
+ } */
}
}
diff --git a/KeePass/Native/NativeMethods.Structs.cs b/KeePass/Native/NativeMethods.Structs.cs
index a5eea28..6d75972 100644
--- a/KeePass/Native/NativeMethods.Structs.cs
+++ b/KeePass/Native/NativeMethods.Structs.cs
@@ -246,9 +246,10 @@ namespace KeePass.Native
public IntPtr pszSubtitle;
public uint cchSubtitle;
- // [MarshalAs(UnmanagedType.LPWStr)]
+ [MarshalAs(UnmanagedType.LPWStr)]
+ public string pszTask;
// public StringBuilder pszTask;
- public IntPtr pszTask;
+ // public IntPtr pszTask;
public uint cchTask;
// [MarshalAs(UnmanagedType.LPWStr)]
@@ -270,6 +271,20 @@ namespace KeePass.Native
// public StringBuilder pszSubsetTitle;
public IntPtr pszSubsetTitle;
public uint cchSubsetTitle;
+
+ [Conditional("DEBUG")]
+ internal void AssertSize()
+ {
+ if(IntPtr.Size == 4)
+ {
+ Debug.Assert(Marshal.SizeOf(this) == 96);
+ }
+ else if(IntPtr.Size == 8)
+ {
+ Debug.Assert(Marshal.SizeOf(this) == 152);
+ }
+ else { Debug.Assert(false); }
+ }
} */
}
}
diff --git a/KeePass/Native/NativeMethods.Unix.cs b/KeePass/Native/NativeMethods.Unix.cs
index 1a59394..812a3df 100644
--- a/KeePass/Native/NativeMethods.Unix.cs
+++ b/KeePass/Native/NativeMethods.Unix.cs
@@ -29,6 +29,8 @@ using KeePass.Util;
using KeePassLib.Utility;
+using KeeNativeLib = KeePassLib.Native;
+
namespace KeePass.Native
{
internal static partial class NativeMethods
@@ -120,7 +122,8 @@ namespace KeePass.Native
try
{
Application.DoEvents(); // E.g. for clipboard updates
- string strOutput = WinUtil.RunConsoleApp("xdotool", strParams);
+ string strOutput = KeeNativeLib.NativeLib.RunConsoleApp(
+ "xdotool", strParams);
Application.DoEvents(); // E.g. for clipboard updates
return (strOutput ?? string.Empty);
}
diff --git a/KeePass/Plugins/PlgxCache.cs b/KeePass/Plugins/PlgxCache.cs
index 4bc3d8e..fa6acf2 100644
--- a/KeePass/Plugins/PlgxCache.cs
+++ b/KeePass/Plugins/PlgxCache.cs
@@ -30,6 +30,7 @@ using KeePass.App.Configuration;
using KeePass.Util.Spr;
using KeePassLib;
+using KeePassLib.Native;
using KeePassLib.Utility;
namespace KeePass.Plugins
@@ -38,29 +39,56 @@ namespace KeePass.Plugins
{
private const string CacheDirName = "PluginCache";
- private static string m_strAppID = null;
+ private static string m_strAppEnvID = null;
- private static string GetAppID()
+ private static string GetAppEnvID()
{
- if(m_strAppID != null) return m_strAppID;
+ if(m_strAppEnvID != null) return m_strAppEnvID;
+ StringBuilder sb = new StringBuilder();
+
+ Assembly asm = null;
+ AssemblyName asmName = null;
try
{
- Assembly asm = Assembly.GetExecutingAssembly();
- AssemblyName n = asm.GetName();
- m_strAppID = n.Version.ToString(4);
- }
- catch(Exception)
- {
- Debug.Assert(false);
- m_strAppID = PwDefs.VersionString;
+ asm = Assembly.GetExecutingAssembly();
+ asmName = asm.GetName();
}
+ catch(Exception) { Debug.Assert(false); }
+
+ try { sb.Append(asmName.Version.ToString(4)); }
+ catch(Exception) { Debug.Assert(false); sb.Append(PwDefs.VersionString); }
#if DEBUG
- m_strAppID += "d";
+ sb.Append("d");
#endif
- return m_strAppID;
+ sb.Append(",PK=");
+ try
+ {
+ byte[] pk = asmName.GetPublicKeyToken();
+ sb.Append(Convert.ToBase64String(pk, Base64FormattingOptions.None));
+ }
+ catch(Exception) { Debug.Assert(false); sb.Append('?'); }
+
+ sb.Append(",CLR=");
+ sb.Append(Environment.Version.ToString(4));
+ sb.Append(",Ptr=");
+ sb.Append(IntPtr.Size.ToString());
+
+ sb.Append(",OS=");
+ PlatformID p = NativeLib.GetPlatformID();
+ if((p == PlatformID.Win32NT) || (p == PlatformID.Win32S) ||
+ (p == PlatformID.Win32Windows))
+ sb.Append("Win");
+ else if(p == PlatformID.WinCE) sb.Append("WinCE");
+ else if(p == PlatformID.Xbox) sb.Append("Xbox");
+ else if(p == PlatformID.Unix) sb.Append("Unix");
+ else if(p == PlatformID.MacOSX) sb.Append("MacOSX");
+ else sb.Append('?');
+
+ m_strAppEnvID = sb.ToString();
+ return m_strAppEnvID;
}
public static string GetCacheRoot()
@@ -77,7 +105,7 @@ namespace KeePass.Plugins
}
}
- string strDataDir = AppConfigSerializer.AppDataDirectory;
+ string strDataDir = AppConfigSerializer.LocalAppDataDirectory;
// try
// {
// DirectoryInfo diAppData = new DirectoryInfo(strDataDir);
@@ -95,15 +123,27 @@ namespace KeePass.Plugins
return (strDataDir + Path.DirectorySeparatorChar + CacheDirName);
}
- public static string GetCacheDirectory(PwUuid pwPluginUuid, bool bEnsureExists)
+ public static string GetCacheDirectory(PlgxPluginInfo plgx, bool bEnsureExists)
{
- string strPlgID = Convert.ToBase64String(pwPluginUuid.UuidBytes,
- Base64FormattingOptions.None);
- strPlgID = StrUtil.AlphaNumericOnly(strPlgID);
- if(strPlgID.Length > 16) strPlgID = strPlgID.Substring(0, 16);
+ if(plgx == null) { Debug.Assert(false); return null; }
+
+ StringBuilder sb = new StringBuilder();
+ sb.Append(plgx.BaseFileName);
+ sb.Append(':');
+ sb.Append(Convert.ToBase64String(plgx.FileUuid.UuidBytes,
+ Base64FormattingOptions.None));
+ sb.Append(';');
+ sb.Append(GetAppEnvID());
- string strDir = GetCacheRoot() + Path.DirectorySeparatorChar +
- strPlgID + "_" + GetAppID();
+ byte[] pbID = StrUtil.Utf8.GetBytes(sb.ToString());
+ SHA256Managed sha256 = new SHA256Managed();
+ byte[] pbHash = sha256.ComputeHash(pbID);
+
+ string strHash = Convert.ToBase64String(pbHash, Base64FormattingOptions.None);
+ strHash = StrUtil.AlphaNumericOnly(strHash);
+ if(strHash.Length > 20) strHash = strHash.Substring(0, 20);
+
+ string strDir = GetCacheRoot() + Path.DirectorySeparatorChar + strHash;
if(bEnsureExists && !Directory.Exists(strDir))
Directory.CreateDirectory(strDir);
@@ -111,29 +151,33 @@ namespace KeePass.Plugins
return strDir;
}
- public static string GetCacheFile(PwUuid pwPluginUuid, bool bMustExist,
+ public static string GetCacheFile(PlgxPluginInfo plgx, bool bMustExist,
bool bCreateDirectory)
{
- if(pwPluginUuid == null) return null;
+ if(plgx == null) { Debug.Assert(false); return null; }
+
+ // byte[] pbID = new byte[(int)PwUuid.UuidSize];
+ // Array.Copy(pwPluginUuid.UuidBytes, 0, pbID, 0, pbID.Length);
+ // Array.Reverse(pbID);
+ // string strID = Convert.ToBase64String(pbID, Base64FormattingOptions.None);
+ // strID = StrUtil.AlphaNumericOnly(strID);
+ // if(strID.Length > 8) strID = strID.Substring(0, 8);
- byte[] pbID = new byte[(int)PwUuid.UuidSize];
- Array.Copy(pwPluginUuid.UuidBytes, 0, pbID, 0, pbID.Length);
- Array.Reverse(pbID);
- string strID = Convert.ToBase64String(pbID, Base64FormattingOptions.None);
- strID = StrUtil.AlphaNumericOnly(strID);
- if(strID.Length > 8) strID = strID.Substring(0, 8);
+ string strFileName = StrUtil.AlphaNumericOnly(plgx.BaseFileName);
+ if(strFileName.Length == 0) strFileName = "Plugin";
+ strFileName += ".dll";
- string strDir = GetCacheDirectory(pwPluginUuid, bCreateDirectory);
- string strPlugin = strDir + Path.DirectorySeparatorChar + strID + ".dll";
- bool bExists = File.Exists(strPlugin);
+ string strDir = GetCacheDirectory(plgx, bCreateDirectory);
+ string strPath = strDir + Path.DirectorySeparatorChar + strFileName;
+ bool bExists = File.Exists(strPath);
if(bMustExist && bExists)
{
- try { File.SetLastAccessTime(strPlugin, DateTime.Now); }
+ try { File.SetLastAccessTime(strPath, DateTime.Now); }
catch(Exception) { } // Might be locked by other KeePass instance
}
- if(!bMustExist || bExists) return strPlugin;
+ if(!bMustExist || bExists) return strPath;
return null;
}
@@ -141,7 +185,7 @@ namespace KeePass.Plugins
{
if(string.IsNullOrEmpty(strAssemblyPath)) { Debug.Assert(false); return null; }
- string strNewFile = GetCacheFile(plgx.FileUuid, false, true);
+ string strNewFile = GetCacheFile(plgx, false, true);
File.Copy(strAssemblyPath, strNewFile, true);
return strNewFile;
@@ -152,7 +196,7 @@ namespace KeePass.Plugins
if(string.IsNullOrEmpty(strNormalFile)) { Debug.Assert(false); return null; }
string strNewFile = UrlUtil.EnsureTerminatingSeparator(GetCacheDirectory(
- plgx.FileUuid, true), false) + UrlUtil.GetFileName(strNormalFile);
+ plgx, true), false) + UrlUtil.GetFileName(strNormalFile);
File.Copy(strNormalFile, strNewFile, true);
return strNewFile;
diff --git a/KeePass/Plugins/PlgxCsprojLoader.cs b/KeePass/Plugins/PlgxCsprojLoader.cs
index c1f3949..df04d83 100644
--- a/KeePass/Plugins/PlgxCsprojLoader.cs
+++ b/KeePass/Plugins/PlgxCsprojLoader.cs
@@ -130,8 +130,7 @@ namespace KeePass.Plugins
if((xnInc == null) || string.IsNullOrEmpty(xnInc.Value)) { Debug.Assert(false); return; }
string str = xnInc.Value;
- if((str == PwDefs.ShortProductName) || str.StartsWith(
- PwDefs.ShortProductName + ",", StrUtil.CaseIgnoreCmp))
+ if(UrlUtil.AssemblyEquals(str, PwDefs.ShortProductName))
return; // Ignore KeePass references
foreach(XmlNode xnSub in xn.ChildNodes)
diff --git a/KeePass/Plugins/PlgxPlugin.cs b/KeePass/Plugins/PlgxPlugin.cs
index d101514..30df3d0 100644
--- a/KeePass/Plugins/PlgxPlugin.cs
+++ b/KeePass/Plugins/PlgxPlugin.cs
@@ -230,8 +230,7 @@ namespace KeePass.Plugins
if(bContent.HasValue)
throw new PlgxException(KLRes.FileCorrupted);
- string strCached = PlgxCache.GetCacheFile(plgx.FileUuid, true,
- false);
+ string strCached = PlgxCache.GetCacheFile(plgx, true, false);
if(!string.IsNullOrEmpty(strCached) && plgx.AllowCached)
{
strPluginPath = strCached;
@@ -427,14 +426,14 @@ namespace KeePass.Plugins
string strKP = Program.CommandLineArgs[AppDefs.CommandLineOptions.PlgxPrereqKP];
if(!string.IsNullOrEmpty(strKP))
{
- ulong uKP = StrUtil.GetVersion(strKP);
+ ulong uKP = StrUtil.ParseVersion(strKP);
if(uKP != 0) WriteObject(bw, PlgxPrereqKP, MemUtil.UInt64ToBytes(uKP));
}
string strNet = Program.CommandLineArgs[AppDefs.CommandLineOptions.PlgxPrereqNet];
if(!string.IsNullOrEmpty(strNet))
{
- ulong uNet = StrUtil.GetVersion(strNet);
+ ulong uNet = StrUtil.ParseVersion(strNet);
if(uNet != 0) WriteObject(bw, PlgxPrereqNet, MemUtil.UInt64ToBytes(uNet));
}
@@ -510,9 +509,8 @@ namespace KeePass.Plugins
}
CompilerParameters cp = plgx.CompilerParameters;
- cp.OutputAssembly = UrlUtil.EnsureTerminatingSeparator(strTmpRoot,
- false) + UrlUtil.GetFileName(PlgxCache.GetCacheFile(plgx.FileUuid,
- false, false));
+ cp.OutputAssembly = UrlUtil.EnsureTerminatingSeparator(strTmpRoot, false) +
+ UrlUtil.GetFileName(PlgxCache.GetCacheFile(plgx, false, false));
cp.GenerateExecutable = false;
cp.GenerateInMemory = false;
cp.IncludeDebugInformation = false;
@@ -530,7 +528,8 @@ namespace KeePass.Plugins
vCompilers = new string[] {
null,
"v4", // Suggested in CodeDomProvider.CreateProvider doc
- "v4.0", // Apparently works for most people
+ "v4.0", // Suggested in community content of the above
+ "v4.0.30319", // Deduced from file system
"v3.5"
};
}
@@ -539,7 +538,8 @@ namespace KeePass.Plugins
vCompilers = new string[] {
null, "v3.5",
"v4", // Suggested in CodeDomProvider.CreateProvider doc
- "v4.0" // Apparently works for most people
+ "v4.0", // Suggested in community content of the above
+ "v4.0.30319" // Deduced from file system
};
}
@@ -577,6 +577,29 @@ namespace KeePass.Plugins
private static bool CompileAssembly(PlgxPluginInfo plgx,
ref CompilerResults cr, string strCompilerVersion)
{
+ const string StrCoreRef = "System.Core";
+ const string StrCoreDll = "System.Core.dll";
+ bool bHasCore = false, bCoreAdded = false;
+ foreach(string strAsm in plgx.CompilerParameters.ReferencedAssemblies)
+ {
+ if(UrlUtil.AssemblyEquals(strAsm, StrCoreRef))
+ {
+ bHasCore = true;
+ break;
+ }
+ }
+ if((strCompilerVersion != null) && strCompilerVersion.StartsWith(
+ "v", StrUtil.CaseIgnoreCmp))
+ {
+ ulong v = StrUtil.ParseVersion(strCompilerVersion.Substring(1));
+ if(!bHasCore && (v >= 0x0003000500000000UL))
+ {
+ plgx.CompilerParameters.ReferencedAssemblies.Add(StrCoreDll);
+ bCoreAdded = true;
+ }
+ }
+
+ bool bResult = false;
try
{
Dictionary<string, string> dictOpt = new Dictionary<string, string>();
@@ -599,12 +622,15 @@ namespace KeePass.Plugins
cr = cdp.CompileAssemblyFromFile(plgx.CompilerParameters,
plgx.SourceFiles.ToArray());
- return ((cr.Errors == null) || !cr.Errors.HasErrors);
+ bResult = ((cr.Errors == null) || !cr.Errors.HasErrors);
}
catch(Exception) { }
+ if(bCoreAdded)
+ plgx.CompilerParameters.ReferencedAssemblies.Remove(StrCoreDll);
+
// cr = null; // Keep previous results for output
- return false;
+ return bResult;
}
private static void SaveCompilerResults(PlgxPluginInfo plgx,
diff --git a/KeePass/Program.cs b/KeePass/Program.cs
index 97c674c..82f50a2 100644
--- a/KeePass/Program.cs
+++ b/KeePass/Program.cs
@@ -36,6 +36,7 @@ using KeePass.Native;
using KeePass.Resources;
using KeePass.UI;
using KeePass.Util;
+using KeePass.Util.XmlSerialization;
using KeePass.Ecas;
using KeePass.Plugins;
@@ -202,40 +203,7 @@ namespace KeePass
Application.SetCompatibleTextRenderingDefault(false);
Application.DoEvents(); // Required
- int nRandomSeed = (int)DateTime.UtcNow.Ticks;
- // Prevent overflow (see Random class constructor)
- if(nRandomSeed == int.MinValue) nRandomSeed = 17;
- m_rndGlobal = new Random(nRandomSeed);
-
- InitEnvSecurity();
-
- try { SelfTest.TestFipsComplianceProblems(); }
- catch(Exception exFips)
- {
- MessageService.ShowWarning(KPRes.SelfTestFailed, exFips);
- return;
- }
-
- // Set global localized strings
- PwDatabase.LocalizedAppName = PwDefs.ShortProductName;
- Kdb4File.DetermineLanguageId();
-
- m_appConfig = AppConfigSerializer.Load();
- if(m_appConfig.Logging.Enabled)
- AppLogEx.Open(PwDefs.ShortProductName);
-
- AppPolicy.Current = m_appConfig.Security.Policy.CloneDeep();
- IOConnection.SetProxy(m_appConfig.Integration.ProxyType,
- m_appConfig.Integration.ProxyAddress, m_appConfig.Integration.ProxyPort,
- m_appConfig.Integration.ProxyUserName, m_appConfig.Integration.ProxyPassword);
-
- m_ecasTriggers = m_appConfig.Application.TriggerSystem;
- m_ecasTriggers.SetToInitialState();
-
- string strHelpFile = UrlUtil.StripExtension(WinUtil.GetExecutable()) + ".chm";
- AppHelp.LocalHelpFile = strHelpFile;
-
- LoadTranslation();
+ if(!CommonInit()) { CommonTerminate(); return; }
if(m_appConfig.Application.Start.PluginCacheClearOnce)
{
@@ -346,6 +314,12 @@ namespace KeePass
MainCleanUp();
return;
}
+ else if(m_cmdLineArgs[AppDefs.CommandLineOptions.MakeXmlSerializerEx] != null)
+ {
+ XmlSerializerEx.GenerateSerializers(m_cmdLineArgs);
+ MainCleanUp();
+ return;
+ }
#if (DEBUG && !KeePassLibSD)
else if(m_cmdLineArgs[AppDefs.CommandLineOptions.MakePopularPasswordTable] != null)
{
@@ -438,6 +412,55 @@ namespace KeePass
// if(mSingleLock != null) { GC.KeepAlive(mSingleLock); }
}
+ /// <summary>
+ /// Common program initialization function that can also be
+ /// used by applications that use KeePass as a library
+ /// (like e.g. KPScript).
+ /// </summary>
+ public static bool CommonInit()
+ {
+ int nRandomSeed = (int)DateTime.UtcNow.Ticks;
+ // Prevent overflow (see Random class constructor)
+ if(nRandomSeed == int.MinValue) nRandomSeed = 17;
+ m_rndGlobal = new Random(nRandomSeed);
+
+ InitEnvSecurity();
+
+ try { SelfTest.TestFipsComplianceProblems(); }
+ catch(Exception exFips)
+ {
+ MessageService.ShowWarning(KPRes.SelfTestFailed, exFips);
+ return false;
+ }
+
+ // Set global localized strings
+ PwDatabase.LocalizedAppName = PwDefs.ShortProductName;
+ Kdb4File.DetermineLanguageId();
+
+ m_appConfig = AppConfigSerializer.Load();
+ if(m_appConfig.Logging.Enabled)
+ AppLogEx.Open(PwDefs.ShortProductName);
+
+ AppPolicy.Current = m_appConfig.Security.Policy.CloneDeep();
+ IOConnection.SetProxy(m_appConfig.Integration.ProxyType,
+ m_appConfig.Integration.ProxyAddress, m_appConfig.Integration.ProxyPort,
+ m_appConfig.Integration.ProxyUserName, m_appConfig.Integration.ProxyPassword);
+
+ m_ecasTriggers = m_appConfig.Application.TriggerSystem;
+ m_ecasTriggers.SetToInitialState();
+
+ string strHelpFile = UrlUtil.StripExtension(WinUtil.GetExecutable()) + ".chm";
+ AppHelp.LocalHelpFile = strHelpFile;
+
+ LoadTranslation();
+ return true;
+ }
+
+ public static void CommonTerminate()
+ {
+ AppLogEx.Close();
+ }
+
private static void MainCleanUp()
{
IpcBroadcast.StopServer();
@@ -446,9 +469,9 @@ namespace KeePass
EntryMenu.Destroy();
- AppLogEx.Close();
-
GlobalMutexPool.ReleaseAll();
+
+ CommonTerminate();
}
private static void InitEnvSecurity()
@@ -575,7 +598,7 @@ namespace KeePass
private static void LoadTranslation()
{
string strLangFile = m_appConfig.Application.LanguageFile;
- if((strLangFile != null) && (strLangFile.Length > 0))
+ if(!string.IsNullOrEmpty(strLangFile))
{
string[] vLangDirs = new string[]{
AppConfigSerializer.AppDataDirectory,
@@ -590,7 +613,8 @@ namespace KeePass
try
{
- m_kpTranslation = KPTranslation.LoadFromFile(strLangPath);
+ XmlSerializerEx xs = new XmlSerializerEx(typeof(KPTranslation));
+ m_kpTranslation = KPTranslation.LoadFromFile(strLangPath, xs);
KPRes.SetTranslatedStrings(
m_kpTranslation.SafeGetStringTableDictionary(
@@ -608,5 +632,19 @@ namespace KeePass
}
}
}
+
+ internal static bool IsDevelopmentSnapshot()
+ {
+ try
+ {
+ Assembly asm = Assembly.GetExecutingAssembly();
+ byte[] pk = asm.GetName().GetPublicKeyToken();
+ string strPk = MemUtil.ByteArrayToHexString(pk);
+ return !strPk.Equals("fed2ed7716aecf5c", StrUtil.CaseIgnoreCmp);
+ }
+ catch(Exception) { Debug.Assert(false); }
+
+ return false;
+ }
}
}
diff --git a/KeePass/Properties/AssemblyInfo.cs b/KeePass/Properties/AssemblyInfo.cs
index e822870..9ed86df 100644
--- a/KeePass/Properties/AssemblyInfo.cs
+++ b/KeePass/Properties/AssemblyInfo.cs
@@ -38,5 +38,5 @@ using System.Runtime.InteropServices;
[assembly: Guid("02020c52-c0da-47c0-9f3f-a6fe76cee400")]
// Assembly version information
-[assembly: AssemblyVersion("2.1.8.*")]
-[assembly: AssemblyFileVersion("2.1.8.0")]
+[assembly: AssemblyVersion("2.19.0.*")]
+[assembly: AssemblyFileVersion("2.19.0.0")]
diff --git a/KeePass/Properties/Resources.Designer.cs b/KeePass/Properties/Resources.Designer.cs
index 292e4c4..b3977f4 100644
--- a/KeePass/Properties/Resources.Designer.cs
+++ b/KeePass/Properties/Resources.Designer.cs
@@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
-// Runtime Version:2.0.50727.5446
+// Runtime Version:2.0.50727.5448
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -60,13 +60,6 @@ namespace KeePass.Properties {
}
}
- internal static System.Drawing.Bitmap B15x13_KGPG_Gen {
- get {
- object obj = ResourceManager.GetObject("B15x13_KGPG_Gen", resourceCulture);
- return ((System.Drawing.Bitmap)(obj));
- }
- }
-
internal static System.Drawing.Bitmap B15x14_FileNew {
get {
object obj = ResourceManager.GetObject("B15x14_FileNew", resourceCulture);
@@ -662,6 +655,13 @@ namespace KeePass.Properties {
}
}
+ internal static System.Drawing.Bitmap B16x16_Key_New {
+ get {
+ object obj = ResourceManager.GetObject("B16x16_Key_New", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
internal static System.Drawing.Bitmap B16x16_Keyboard_Layout {
get {
object obj = ResourceManager.GetObject("B16x16_Keyboard_Layout", resourceCulture);
diff --git a/KeePass/Properties/Resources.resx b/KeePass/Properties/Resources.resx
index 165f24f..686cff6 100644
--- a/KeePass/Properties/Resources.resx
+++ b/KeePass/Properties/Resources.resx
@@ -118,9 +118,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
- <data name="B15x13_KGPG_Gen" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Resources\Nuvola_Derived\B15x13_KGPG_Gen.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="B16x16_Reload_Page" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Nuvola\B16x16_Reload_Page.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -574,4 +571,7 @@
<data name="B16x16_EditCopyLink" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Nuvola_Derived\B16x16_EditCopyLink.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="B16x16_Key_New" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\Nuvola_Derived\B16x16_Key_New.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
</root>
\ No newline at end of file
diff --git a/KeePass/Resources/KPRes.Generated.cs b/KeePass/Resources/KPRes.Generated.cs
index 181a09b..8bcb45b 100644
--- a/KeePass/Resources/KPRes.Generated.cs
+++ b/KeePass/Resources/KPRes.Generated.cs
@@ -60,6 +60,7 @@ namespace KeePass.Resources
m_strAttachNewRenameRemarks1 = TryGetEx(dictNew, "AttachNewRenameRemarks1", m_strAttachNewRenameRemarks1);
m_strAttachNewRenameRemarks2 = TryGetEx(dictNew, "AttachNewRenameRemarks2", m_strAttachNewRenameRemarks2);
m_strAuthor = TryGetEx(dictNew, "Author", m_strAuthor);
+ m_strAuto = TryGetEx(dictNew, "Auto", m_strAuto);
m_strAutoCreateNew = TryGetEx(dictNew, "AutoCreateNew", m_strAutoCreateNew);
m_strAutoGeneratedPasswordSettings = TryGetEx(dictNew, "AutoGeneratedPasswordSettings", m_strAutoGeneratedPasswordSettings);
m_strAutoRememberOpenLastFile = TryGetEx(dictNew, "AutoRememberOpenLastFile", m_strAutoRememberOpenLastFile);
@@ -72,6 +73,7 @@ namespace KeePass.Resources
m_strAutoTypeEntrySelectionDescLong = TryGetEx(dictNew, "AutoTypeEntrySelectionDescLong", m_strAutoTypeEntrySelectionDescLong);
m_strAutoTypeEntrySelectionDescShort = TryGetEx(dictNew, "AutoTypeEntrySelectionDescShort", m_strAutoTypeEntrySelectionDescShort);
m_strAutoTypeGlobalHint = TryGetEx(dictNew, "AutoTypeGlobalHint", m_strAutoTypeGlobalHint);
+ m_strAutoTypeMatchByTagInTitle = TryGetEx(dictNew, "AutoTypeMatchByTagInTitle", m_strAutoTypeMatchByTagInTitle);
m_strAutoTypeMatchByTitle = TryGetEx(dictNew, "AutoTypeMatchByTitle", m_strAutoTypeMatchByTitle);
m_strAutoTypeMatchByUrlHostInTitle = TryGetEx(dictNew, "AutoTypeMatchByUrlHostInTitle", m_strAutoTypeMatchByUrlHostInTitle);
m_strAutoTypeMatchByUrlInTitle = TryGetEx(dictNew, "AutoTypeMatchByUrlInTitle", m_strAutoTypeMatchByUrlInTitle);
@@ -110,6 +112,7 @@ namespace KeePass.Resources
m_strClipboardViewerIgnoreFormat = TryGetEx(dictNew, "ClipboardViewerIgnoreFormat", m_strClipboardViewerIgnoreFormat);
m_strCloseButton = TryGetEx(dictNew, "CloseButton", m_strCloseButton);
m_strCloseButtonMinimizes = TryGetEx(dictNew, "CloseButtonMinimizes", m_strCloseButtonMinimizes);
+ m_strClosingDatabaseFile = TryGetEx(dictNew, "ClosingDatabaseFile", m_strClosingDatabaseFile);
m_strColumn = TryGetEx(dictNew, "Column", m_strColumn);
m_strColumns = TryGetEx(dictNew, "Columns", m_strColumns);
m_strCompany = TryGetEx(dictNew, "Company", m_strCompany);
@@ -208,7 +211,6 @@ namespace KeePass.Resources
m_strEnable = TryGetEx(dictNew, "Enable", m_strEnable);
m_strEnabled = TryGetEx(dictNew, "Enabled", m_strEnabled);
m_strEncoding = TryGetEx(dictNew, "Encoding", m_strEncoding);
- m_strEncodingAnsi = TryGetEx(dictNew, "EncodingAnsi", m_strEncodingAnsi);
m_strEncodingFail = TryGetEx(dictNew, "EncodingFail", m_strEncodingFail);
m_strEndsWith = TryGetEx(dictNew, "EndsWith", m_strEndsWith);
m_strEnterCompositeKey = TryGetEx(dictNew, "EnterCompositeKey", m_strEnterCompositeKey);
@@ -239,6 +241,7 @@ namespace KeePass.Resources
m_strExportToPrompt = TryGetEx(dictNew, "ExportToPrompt", m_strExportToPrompt);
m_strFatalError = TryGetEx(dictNew, "FatalError", m_strFatalError);
m_strFeature = TryGetEx(dictNew, "Feature", m_strFeature);
+ m_strField = TryGetEx(dictNew, "Field", m_strField);
m_strFieldName = TryGetEx(dictNew, "FieldName", m_strFieldName);
m_strFieldNameExistsAlready = TryGetEx(dictNew, "FieldNameExistsAlready", m_strFieldNameExistsAlready);
m_strFieldNameInvalid = TryGetEx(dictNew, "FieldNameInvalid", m_strFieldNameInvalid);
@@ -400,10 +403,12 @@ namespace KeePass.Resources
m_strNavigation = TryGetEx(dictNew, "Navigation", m_strNavigation);
m_strNetwork = TryGetEx(dictNew, "Network", m_strNetwork);
m_strNeverExpires = TryGetEx(dictNew, "NeverExpires", m_strNeverExpires);
+ m_strNew = TryGetEx(dictNew, "New", m_strNew);
m_strNewDatabase = TryGetEx(dictNew, "NewDatabase", m_strNewDatabase);
m_strNewDatabaseFileName = TryGetEx(dictNew, "NewDatabaseFileName", m_strNewDatabaseFileName);
m_strNewerNetRequired = TryGetEx(dictNew, "NewerNetRequired", m_strNewerNetRequired);
m_strNewGroup = TryGetEx(dictNew, "NewGroup", m_strNewGroup);
+ m_strNewLine = TryGetEx(dictNew, "NewLine", m_strNewLine);
m_strNewState = TryGetEx(dictNew, "NewState", m_strNewState);
m_strNewVersionAvailable = TryGetEx(dictNew, "NewVersionAvailable", m_strNewVersionAvailable);
m_strNo = TryGetEx(dictNew, "No", m_strNo);
@@ -497,6 +502,7 @@ namespace KeePass.Resources
m_strRememberKeySources = TryGetEx(dictNew, "RememberKeySources", m_strRememberKeySources);
m_strRemoteHostReachable = TryGetEx(dictNew, "RemoteHostReachable", m_strRemoteHostReachable);
m_strRepairMode = TryGetEx(dictNew, "RepairMode", m_strRepairMode);
+ m_strRepeatOnlyWhenHidden = TryGetEx(dictNew, "RepeatOnlyWhenHidden", m_strRepeatOnlyWhenHidden);
m_strRestartKeePassQuestion = TryGetEx(dictNew, "RestartKeePassQuestion", m_strRestartKeePassQuestion);
m_strRootDirectory = TryGetEx(dictNew, "RootDirectory", m_strRootDirectory);
m_strSameKeybLayout = TryGetEx(dictNew, "SameKeybLayout", m_strSameKeybLayout);
@@ -510,6 +516,8 @@ namespace KeePass.Resources
m_strSavedDatabaseFile = TryGetEx(dictNew, "SavedDatabaseFile", m_strSavedDatabaseFile);
m_strSavingDatabase = TryGetEx(dictNew, "SavingDatabase", m_strSavingDatabase);
m_strSavingDatabaseFile = TryGetEx(dictNew, "SavingDatabaseFile", m_strSavingDatabaseFile);
+ m_strSavingPost = TryGetEx(dictNew, "SavingPost", m_strSavingPost);
+ m_strSavingPre = TryGetEx(dictNew, "SavingPre", m_strSavingPre);
m_strScheme = TryGetEx(dictNew, "Scheme", m_strScheme);
m_strSearch = TryGetEx(dictNew, "Search", m_strSearch);
m_strSearchDesc = TryGetEx(dictNew, "SearchDesc", m_strSearchDesc);
@@ -636,6 +644,7 @@ namespace KeePass.Resources
m_strViewEntry = TryGetEx(dictNew, "ViewEntry", m_strViewEntry);
m_strViewEntryDesc = TryGetEx(dictNew, "ViewEntryDesc", m_strViewEntryDesc);
m_strWait = TryGetEx(dictNew, "Wait", m_strWait);
+ m_strWaitForExit = TryGetEx(dictNew, "WaitForExit", m_strWaitForExit);
m_strWarnings = TryGetEx(dictNew, "Warnings", m_strWarnings);
m_strWebBrowser = TryGetEx(dictNew, "WebBrowser", m_strWebBrowser);
m_strWebSiteLogin = TryGetEx(dictNew, "WebSiteLogin", m_strWebSiteLogin);
@@ -649,6 +658,7 @@ namespace KeePass.Resources
m_strXslSelectFile = TryGetEx(dictNew, "XslSelectFile", m_strXslSelectFile);
m_strXslStylesheets = TryGetEx(dictNew, "XslStylesheets", m_strXslStylesheets);
m_strYes = TryGetEx(dictNew, "Yes", m_strYes);
+ m_strZoom = TryGetEx(dictNew, "Zoom", m_strZoom);
}
private static readonly string[] m_vKeyNames = {
@@ -686,6 +696,7 @@ namespace KeePass.Resources
"AttachNewRenameRemarks1",
"AttachNewRenameRemarks2",
"Author",
+ "Auto",
"AutoCreateNew",
"AutoGeneratedPasswordSettings",
"AutoRememberOpenLastFile",
@@ -698,6 +709,7 @@ namespace KeePass.Resources
"AutoTypeEntrySelectionDescLong",
"AutoTypeEntrySelectionDescShort",
"AutoTypeGlobalHint",
+ "AutoTypeMatchByTagInTitle",
"AutoTypeMatchByTitle",
"AutoTypeMatchByUrlHostInTitle",
"AutoTypeMatchByUrlInTitle",
@@ -736,6 +748,7 @@ namespace KeePass.Resources
"ClipboardViewerIgnoreFormat",
"CloseButton",
"CloseButtonMinimizes",
+ "ClosingDatabaseFile",
"Column",
"Columns",
"Company",
@@ -834,7 +847,6 @@ namespace KeePass.Resources
"Enable",
"Enabled",
"Encoding",
- "EncodingAnsi",
"EncodingFail",
"EndsWith",
"EnterCompositeKey",
@@ -865,6 +877,7 @@ namespace KeePass.Resources
"ExportToPrompt",
"FatalError",
"Feature",
+ "Field",
"FieldName",
"FieldNameExistsAlready",
"FieldNameInvalid",
@@ -1026,10 +1039,12 @@ namespace KeePass.Resources
"Navigation",
"Network",
"NeverExpires",
+ "New",
"NewDatabase",
"NewDatabaseFileName",
"NewerNetRequired",
"NewGroup",
+ "NewLine",
"NewState",
"NewVersionAvailable",
"No",
@@ -1123,6 +1138,7 @@ namespace KeePass.Resources
"RememberKeySources",
"RemoteHostReachable",
"RepairMode",
+ "RepeatOnlyWhenHidden",
"RestartKeePassQuestion",
"RootDirectory",
"SameKeybLayout",
@@ -1136,6 +1152,8 @@ namespace KeePass.Resources
"SavedDatabaseFile",
"SavingDatabase",
"SavingDatabaseFile",
+ "SavingPost",
+ "SavingPre",
"Scheme",
"Search",
"SearchDesc",
@@ -1262,6 +1280,7 @@ namespace KeePass.Resources
"ViewEntry",
"ViewEntryDesc",
"Wait",
+ "WaitForExit",
"Warnings",
"WebBrowser",
"WebSiteLogin",
@@ -1274,7 +1293,8 @@ namespace KeePass.Resources
"XslFileType",
"XslSelectFile",
"XslStylesheets",
- "Yes"
+ "Yes",
+ "Zoom"
};
public static string[] GetKeyNames()
@@ -1656,6 +1676,17 @@ namespace KeePass.Resources
get { return m_strAuthor; }
}
+ private static string m_strAuto =
+ @"Auto";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'Auto'.
+ /// </summary>
+ public static string Auto
+ {
+ get { return m_strAuto; }
+ }
+
private static string m_strAutoCreateNew =
@"Automatically create new";
/// <summary>
@@ -1788,6 +1819,17 @@ namespace KeePass.Resources
get { return m_strAutoTypeGlobalHint; }
}
+ private static string m_strAutoTypeMatchByTagInTitle =
+ @"An entry matches if one of its tags is contained in the target window title";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'An entry matches if one of its tags is contained in the target window title'.
+ /// </summary>
+ public static string AutoTypeMatchByTagInTitle
+ {
+ get { return m_strAutoTypeMatchByTagInTitle; }
+ }
+
private static string m_strAutoTypeMatchByTitle =
@"An entry matches if its title is contained in the target window title";
/// <summary>
@@ -2206,6 +2248,17 @@ namespace KeePass.Resources
get { return m_strCloseButtonMinimizes; }
}
+ private static string m_strClosingDatabaseFile =
+ @"Closing database file";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'Closing database file'.
+ /// </summary>
+ public static string ClosingDatabaseFile
+ {
+ get { return m_strClosingDatabaseFile; }
+ }
+
private static string m_strColumn =
@"Column";
/// <summary>
@@ -3284,17 +3337,6 @@ namespace KeePass.Resources
get { return m_strEncoding; }
}
- private static string m_strEncodingAnsi =
- @"Default ANSI (System)";
- /// <summary>
- /// Look up a localized string similar to
- /// 'Default ANSI (System)'.
- /// </summary>
- public static string EncodingAnsi
- {
- get { return m_strEncodingAnsi; }
- }
-
private static string m_strEncodingFail =
@"Selected encoding is invalid. The file cannot be interpreted using the selected encoding.";
/// <summary>
@@ -3625,6 +3667,17 @@ namespace KeePass.Resources
get { return m_strFeature; }
}
+ private static string m_strField =
+ @"Field";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'Field'.
+ /// </summary>
+ public static string Field
+ {
+ get { return m_strField; }
+ }
+
private static string m_strFieldName =
@"Field Name";
/// <summary>
@@ -5396,6 +5449,17 @@ namespace KeePass.Resources
get { return m_strNeverExpires; }
}
+ private static string m_strNew =
+ @"New";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'New'.
+ /// </summary>
+ public static string New
+ {
+ get { return m_strNew; }
+ }
+
private static string m_strNewDatabase =
@"New Database";
/// <summary>
@@ -5440,6 +5504,17 @@ namespace KeePass.Resources
get { return m_strNewGroup; }
}
+ private static string m_strNewLine =
+ @"New line";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'New line'.
+ /// </summary>
+ public static string NewLine
+ {
+ get { return m_strNewLine; }
+ }
+
private static string m_strNewState =
@"New state";
/// <summary>
@@ -6463,6 +6538,17 @@ namespace KeePass.Resources
get { return m_strRepairMode; }
}
+ private static string m_strRepeatOnlyWhenHidden =
+ @"Require password repetition only when hiding using asterisks is enabled";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'Require password repetition only when hiding using asterisks is enabled'.
+ /// </summary>
+ public static string RepeatOnlyWhenHidden
+ {
+ get { return m_strRepeatOnlyWhenHidden; }
+ }
+
private static string m_strRestartKeePassQuestion =
@"Do you wish to restart KeePass now?";
/// <summary>
@@ -6606,6 +6692,28 @@ namespace KeePass.Resources
get { return m_strSavingDatabaseFile; }
}
+ private static string m_strSavingPost =
+ @"after saving";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'after saving'.
+ /// </summary>
+ public static string SavingPost
+ {
+ get { return m_strSavingPost; }
+ }
+
+ private static string m_strSavingPre =
+ @"before saving";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'before saving'.
+ /// </summary>
+ public static string SavingPre
+ {
+ get { return m_strSavingPre; }
+ }
+
private static string m_strScheme =
@"Scheme";
/// <summary>
@@ -7992,6 +8100,17 @@ namespace KeePass.Resources
get { return m_strWait; }
}
+ private static string m_strWaitForExit =
+ @"Wait for exit";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'Wait for exit'.
+ /// </summary>
+ public static string WaitForExit
+ {
+ get { return m_strWaitForExit; }
+ }
+
private static string m_strWarnings =
@"Warnings";
/// <summary>
@@ -8134,5 +8253,16 @@ namespace KeePass.Resources
{
get { return m_strYes; }
}
+
+ private static string m_strZoom =
+ @"Zoom";
+ /// <summary>
+ /// Look up a localized string similar to
+ /// 'Zoom'.
+ /// </summary>
+ public static string Zoom
+ {
+ get { return m_strZoom; }
+ }
}
}
diff --git a/KeePass/Resources/Nuvola_Derived/B15x13_KGPG_Gen.png b/KeePass/Resources/Nuvola_Derived/B15x13_KGPG_Gen.png
deleted file mode 100644
index 4e8989f..0000000
Binary files a/KeePass/Resources/Nuvola_Derived/B15x13_KGPG_Gen.png and /dev/null differ
diff --git a/KeePass/Resources/Nuvola_Derived/B16x16_Key_New.png b/KeePass/Resources/Nuvola_Derived/B16x16_Key_New.png
new file mode 100644
index 0000000..de21b88
Binary files /dev/null and b/KeePass/Resources/Nuvola_Derived/B16x16_Key_New.png differ
diff --git a/KeePass/UI/CheckedLVItemDXList.cs b/KeePass/UI/CheckedLVItemDXList.cs
index 159c65d..2281df0 100644
--- a/KeePass/UI/CheckedLVItemDXList.cs
+++ b/KeePass/UI/CheckedLVItemDXList.cs
@@ -21,10 +21,13 @@ using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
-using System.Diagnostics;
+using System.Drawing;
using System.Reflection;
+using System.Diagnostics;
using KeePass.App;
+using KeePass.App.Configuration;
+using KeePass.Util;
using KeePassLib.Utility;
@@ -43,11 +46,57 @@ namespace KeePass.UI
{
private ListView m_lv;
- private List<object> m_vObjects = new List<object>();
- private List<PropertyInfo> m_vProperties = new List<PropertyInfo>();
- private List<ListViewItem> m_vListViewItems = new List<ListViewItem>();
+ private List<ClviInfo> m_lItems = new List<ClviInfo>();
+ private List<CheckItemLink> m_lLinks = new List<CheckItemLink>();
+
+ private bool m_bUseEnforcedConfig;
+
+ private sealed class ClviInfo
+ {
+ private object m_o; // Never null
+ public object Object { get { return m_o; } }
+
+ // private string m_strPropName; // Never null
+ // public string PropertyName { get { return m_strPropName; } }
- private List<CheckItemLink> m_vLinks = new List<CheckItemLink>();
+ private PropertyInfo m_pi; // Never null
+ public PropertyInfo PropertyInfo { get { return m_pi; } }
+
+ private ListViewItem m_lvi; // Never null
+ public ListViewItem ListViewItem { get { return m_lvi; } }
+
+ public bool PropertyValue
+ {
+ get { return (bool)m_pi.GetValue(m_o, null); }
+ set { m_pi.SetValue(m_o, value, null); }
+ }
+
+ private bool m_bReadOnly = false;
+ public bool ReadOnly
+ {
+ get { return m_bReadOnly; }
+ set { m_bReadOnly = value; }
+ }
+
+ public ClviInfo(object pContainer, string strPropertyName,
+ ListViewItem lvi)
+ {
+ if(pContainer == null) throw new ArgumentNullException("pContainer");
+ if(strPropertyName == null) throw new ArgumentNullException("strPropertyName");
+ if(strPropertyName.Length == 0) throw new ArgumentException("strPropertyName");
+ // if(lvi == null) throw new ArgumentNullException("lvi");
+
+ m_o = pContainer;
+ // m_strPropName = strPropertyName;
+ m_lvi = lvi;
+
+ Type t = pContainer.GetType();
+ m_pi = t.GetProperty(strPropertyName);
+ if((m_pi == null) || (m_pi.PropertyType != typeof(bool)) ||
+ !m_pi.CanRead || !m_pi.CanWrite)
+ throw new ArgumentException("strPropertyName");
+ }
+ }
private sealed class CheckItemLink
{
@@ -69,11 +118,24 @@ namespace KeePass.UI
}
}
+ [Obsolete]
public CheckedLVItemDXList(ListView lv)
{
+ Construct(lv, false);
+ }
+
+ public CheckedLVItemDXList(ListView lv, bool bUseEnforcedConfig)
+ {
+ Construct(lv, bUseEnforcedConfig);
+ }
+
+ private void Construct(ListView lv, bool bUseEnforcedConfig)
+ {
if(lv == null) throw new ArgumentNullException("lv");
m_lv = lv;
+ m_bUseEnforcedConfig = bUseEnforcedConfig;
+
m_lv.ItemChecked += this.OnItemCheckedChanged;
}
@@ -88,10 +150,8 @@ namespace KeePass.UI
{
if(m_lv == null) { Debug.Assert(false); return; }
- m_vObjects.Clear();
- m_vProperties.Clear();
- m_vListViewItems.Clear();
- m_vLinks.Clear();
+ m_lItems.Clear();
+ m_lLinks.Clear();
m_lv.ItemChecked -= this.OnItemCheckedChanged;
m_lv = null;
@@ -101,21 +161,31 @@ namespace KeePass.UI
{
if(m_lv == null) { Debug.Assert(false); return; }
- for(int i = 0; i < m_vObjects.Count; ++i)
+ Color clr = SystemColors.ControlText;
+ float fH, fS, fV;
+ UIUtil.ColorToHsv(clr, out fH, out fS, out fV);
+ if(fV >= 0.5f) // Text color is rather light
+ clr = UIUtil.ColorFromHsv(fH, 0.0f, 0.40f);
+ else // Text color is rather dark
+ clr = UIUtil.ColorFromHsv(fH, 0.0f, 0.60f);
+
+ foreach(ClviInfo clvi in m_lItems)
{
- object o = m_vObjects[i];
+ ListViewItem lvi = clvi.ListViewItem;
- Debug.Assert(m_vListViewItems[i].Index >= 0);
- Debug.Assert(m_lv.Items.IndexOf(m_vListViewItems[i]) >= 0);
+ Debug.Assert(lvi.Index >= 0);
+ Debug.Assert(m_lv.Items.IndexOf(lvi) >= 0);
if(bGuiToInternals)
{
- bool bChecked = m_vListViewItems[i].Checked;
- m_vProperties[i].SetValue(o, bChecked, null);
+ bool bChecked = lvi.Checked;
+ clvi.PropertyValue = bChecked;
}
else // Internals to GUI
{
- bool bValue = (bool)m_vProperties[i].GetValue(o, null);
- m_vListViewItems[i].Checked = bValue;
+ bool bValue = clvi.PropertyValue;
+ lvi.Checked = bValue;
+
+ if(clvi.ReadOnly) lvi.ForeColor = clr;
}
}
}
@@ -125,18 +195,15 @@ namespace KeePass.UI
{
if(pContainer == null) throw new ArgumentNullException("pContainer");
if(strPropertyName == null) throw new ArgumentNullException("strPropertyName");
- if(strPropertyName.Length == 0) throw new ArgumentException();
+ if(strPropertyName.Length == 0) throw new ArgumentException("strPropertyName");
if(strDisplayString == null) throw new ArgumentNullException("strDisplayString");
if(m_lv == null) { Debug.Assert(false); return null; }
- Type t = pContainer.GetType();
- PropertyInfo pi = t.GetProperty(strPropertyName);
- if((pi == null) || (pi.PropertyType != typeof(bool)) ||
- !pi.CanRead || !pi.CanWrite)
- throw new ArgumentException();
-
ListViewItem lvi = new ListViewItem(strDisplayString);
+ ClviInfo clvi = new ClviInfo(pContainer, strPropertyName, lvi);
+ DetermineReadOnlyState(clvi);
+
if(lvgContainer != null)
{
lvi.Group = lvgContainer;
@@ -145,10 +212,7 @@ namespace KeePass.UI
}
m_lv.Items.Add(lvi);
-
- m_vObjects.Add(pContainer);
- m_vProperties.Add(pi);
- m_vListViewItems.Add(lvi);
+ m_lItems.Add(clvi);
return lvi;
}
@@ -161,10 +225,22 @@ namespace KeePass.UI
if(m_lv == null) { Debug.Assert(false); return; }
- Debug.Assert(m_vListViewItems.IndexOf(lviSource) >= 0);
- Debug.Assert(m_vListViewItems.IndexOf(lviTarget) >= 0);
+ Debug.Assert(GetItem(lviSource) != null);
+ Debug.Assert(GetItem(lviTarget) != null);
+
+ m_lLinks.Add(new CheckItemLink(lviSource, lviTarget, t));
+ }
+
+ private ClviInfo GetItem(ListViewItem lvi)
+ {
+ if(lvi == null) { Debug.Assert(false); return null; }
+
+ foreach(ClviInfo clvi in m_lItems)
+ {
+ if(clvi.ListViewItem == lvi) return clvi;
+ }
- m_vLinks.Add(new CheckItemLink(lviSource, lviTarget, t));
+ return null;
}
private void OnItemCheckedChanged(object sender, ItemCheckedEventArgs e)
@@ -174,8 +250,17 @@ namespace KeePass.UI
bool bChecked = lvi.Checked;
- // Debug.Assert(m_vListViewItems.IndexOf(lvi) >= 0);
- foreach(CheckItemLink cl in m_vLinks)
+ ClviInfo clvi = GetItem(lvi);
+ if(clvi != null)
+ {
+ if(clvi.ReadOnly && (bChecked != clvi.PropertyValue))
+ {
+ lvi.Checked = clvi.PropertyValue;
+ return;
+ }
+ }
+
+ foreach(CheckItemLink cl in m_lLinks)
{
if(cl.Source == lvi)
{
@@ -196,5 +281,15 @@ namespace KeePass.UI
}
}
}
+
+ private void DetermineReadOnlyState(ClviInfo clvi)
+ {
+ if(clvi == null) { Debug.Assert(false); return; }
+
+ if(!m_bUseEnforcedConfig) clvi.ReadOnly = false;
+ else
+ clvi.ReadOnly = AppConfigEx.IsOptionEnforced(clvi.Object,
+ clvi.PropertyInfo);
+ }
}
}
diff --git a/KeePass/UI/CustomListViewEx.cs b/KeePass/UI/CustomListViewEx.cs
index f35c87a..1980a24 100644
--- a/KeePass/UI/CustomListViewEx.cs
+++ b/KeePass/UI/CustomListViewEx.cs
@@ -121,9 +121,8 @@ namespace KeePass.UI
foreach(ListViewItem lviEnum in this.Items)
lviEnum.Selected = false;
- lviChangeTo.Selected = true;
- lviChangeTo.Focused = true;
EnsureVisible(lviChangeTo.Index);
+ UIUtil.SetFocusedItem(this, lviChangeTo, true);
e.Handled = true;
return true;
diff --git a/KeePass/UI/ExpiryControlGroup.cs b/KeePass/UI/ExpiryControlGroup.cs
new file mode 100644
index 0000000..39eac25
--- /dev/null
+++ b/KeePass/UI/ExpiryControlGroup.cs
@@ -0,0 +1,128 @@
+/*
+ KeePass Password Safe - The Open-Source Password Manager
+ Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Globalization;
+using System.Diagnostics;
+
+using KeePassLib;
+
+namespace KeePass.UI
+{
+ public sealed class ExpiryControlGroup
+ {
+ private CheckBox m_cb = null;
+ private DateTimePicker m_dtp = null;
+
+ public bool Checked
+ {
+ get
+ {
+ if(m_cb == null) { Debug.Assert(false); return false; }
+ return m_cb.Checked;
+ }
+
+ set { UIUtil.SetChecked(m_cb, value); }
+ }
+
+ public DateTime Value
+ {
+ get
+ {
+ if(m_dtp == null) { Debug.Assert(false); return DateTime.Now; }
+
+ // Force validation/update of incomplete edit
+ // (workaround for KPB 3505269)
+ if(m_dtp.Focused && m_dtp.Visible)
+ {
+ m_dtp.Visible = false;
+ m_dtp.Visible = true;
+ }
+
+ return m_dtp.Value;
+ }
+
+ set
+ {
+ if(m_dtp == null) { Debug.Assert(false); return; }
+ m_dtp.Value = value;
+ }
+ }
+
+ public ExpiryControlGroup()
+ {
+ }
+
+#if DEBUG
+ ~ExpiryControlGroup()
+ {
+ Debug.Assert(m_cb == null); // Owner should call Release()
+ }
+#endif
+
+ public void Attach(CheckBox cb, DateTimePicker dtp)
+ {
+ if(cb == null) throw new ArgumentNullException("cb");
+ if(dtp == null) throw new ArgumentNullException("dtp");
+
+ m_cb = cb;
+ m_dtp = dtp;
+
+ // m_dtp.ShowUpDown = true;
+ m_dtp.CustomFormat = DateTimeFormatInfo.CurrentInfo.ShortDatePattern +
+ " " + DateTimeFormatInfo.CurrentInfo.LongTimePattern;
+
+ m_dtp.ValueChanged += this.OnExpiryValueChanged;
+ // Also handle key press event (workaround for KPB 3505269)
+ m_dtp.KeyPress += this.OnExpiryKeyPress;
+ }
+
+ public void Release()
+ {
+ if(m_cb == null) return;
+
+ m_dtp.ValueChanged -= this.OnExpiryValueChanged;
+ m_dtp.KeyPress -= this.OnExpiryKeyPress;
+
+ m_cb = null;
+ m_dtp = null;
+ }
+
+ private void UpdateUI(bool? pbSetCheck)
+ {
+ if(pbSetCheck.HasValue)
+ UIUtil.SetChecked(m_cb, pbSetCheck.Value);
+
+ UIUtil.SetEnabled(m_dtp, m_cb.Enabled);
+ }
+
+ private void OnExpiryValueChanged(object sender, EventArgs e)
+ {
+ UpdateUI(true);
+ }
+
+ private void OnExpiryKeyPress(object sender, KeyPressEventArgs e)
+ {
+ if(char.IsDigit(e.KeyChar)) UpdateUI(true);
+ }
+ }
+}
diff --git a/KeePass/UI/GlobalWindowManager.cs b/KeePass/UI/GlobalWindowManager.cs
index 2788156..11871fe 100644
--- a/KeePass/UI/GlobalWindowManager.cs
+++ b/KeePass/UI/GlobalWindowManager.cs
@@ -25,6 +25,7 @@ using System.Windows.Forms;
using System.Drawing;
using KeePass.App;
+using KeePass.Util;
using KeePassLib.Native;
using KeePassLib.Utility;
@@ -122,6 +123,8 @@ namespace KeePass.UI
CustomizeControl(form);
+ MonoWorkarounds.ApplyTo(form);
+
if(GlobalWindowManager.WindowAdded != null)
GlobalWindowManager.WindowAdded(null, new GwmWindowEventArgs(
form, wnd));
@@ -148,6 +151,8 @@ namespace KeePass.UI
GlobalWindowManager.WindowRemoved(null, new GwmWindowEventArgs(
form, m_vWindows[i].Value));
+ MonoWorkarounds.Release(form);
+
m_vWindows.RemoveAt(i);
return;
}
diff --git a/KeePass/UI/HotKeyControlEx.cs b/KeePass/UI/HotKeyControlEx.cs
index a5b73f7..aae3a5d 100644
--- a/KeePass/UI/HotKeyControlEx.cs
+++ b/KeePass/UI/HotKeyControlEx.cs
@@ -169,6 +169,12 @@ namespace KeePass.UI
RenderHotKey();
}
+ public void ResetIfModifierOnly()
+ {
+ if((m_kHotKey == Keys.None) && (m_kModifiers != Keys.None))
+ ResetHotKey();
+ }
+
public void RenderHotKey()
{
if(m_kHotKey == Keys.None)
diff --git a/KeePass/UI/OpenWithMenu.cs b/KeePass/UI/OpenWithMenu.cs
index 3cbb55a..b14d6bd 100644
--- a/KeePass/UI/OpenWithMenu.cs
+++ b/KeePass/UI/OpenWithMenu.cs
@@ -232,10 +232,7 @@ namespace KeePass.UI
AddAppByFile(AppLocator.InternetExplorerPath, @"&Internet Explorer");
AddAppByFile(AppLocator.FirefoxPath, @"&Firefox");
AddAppByFile(AppLocator.OperaPath, @"O&pera");
-
- AddAppByFile(AppLocator.ChromePath, (NativeLib.IsUnix() ?
- @"&Google Chromium" : @"&Google Chrome"));
-
+ AddAppByFile(AppLocator.ChromePath, @"&Google Chrome");
AddAppByFile(AppLocator.SafariPath, @"&Safari");
if(NativeLib.IsUnix())
diff --git a/KeePass/UI/PwInputControlGroup.cs b/KeePass/UI/PwInputControlGroup.cs
index f1e6ad4..060ec72 100644
--- a/KeePass/UI/PwInputControlGroup.cs
+++ b/KeePass/UI/PwInputControlGroup.cs
@@ -79,6 +79,9 @@ namespace KeePass.UI
{
get
{
+ if(!Program.Config.UI.RepeatPasswordOnlyWhenHidden)
+ return false;
+
if(m_cbHide == null) { Debug.Assert(false); return false; }
return !m_cbHide.Checked;
}
@@ -243,7 +246,8 @@ namespace KeePass.UI
m_secPassword.EnableProtection(bHide);
m_secRepeat.EnableProtection(bHide);
- if(bHide && !m_bPrgmCheck)
+ bool bWasAutoRepeat = Program.Config.UI.RepeatPasswordOnlyWhenHidden;
+ if(bHide && !m_bPrgmCheck && bWasAutoRepeat)
{
++m_uBlockUIUpdate;
byte[] pb = GetPasswordUtf8();
diff --git a/KeePass/UI/UIUtil.cs b/KeePass/UI/UIUtil.cs
index 877b075..7d4bb56 100644
--- a/KeePass/UI/UIUtil.cs
+++ b/KeePass/UI/UIUtil.cs
@@ -520,9 +520,7 @@ namespace KeePass.UI
if(bFirstEntry)
{
- lvi.Selected = true;
- lvi.Focused = true;
-
+ UIUtil.SetFocusedItem(lv, lvi, true);
bFirstEntry = false;
}
}
@@ -640,9 +638,7 @@ namespace KeePass.UI
if(bFirstEntry)
{
- lvi.Selected = true;
- lvi.Focused = true;
-
+ UIUtil.SetFocusedItem(lv, lvi, true);
bFirstEntry = false;
}
}
@@ -664,25 +660,64 @@ namespace KeePass.UI
return 18; // Default theme on Windows Vista
}
+ /// <summary>
+ /// Create a file type filter specification string.
+ /// </summary>
+ /// <param name="strExtension">Default extension(s), without leading
+ /// dot. Multiple extensions must be separated by a '|' (e.g.
+ /// "html|htm", having the same description "HTML Files").</param>
public static string CreateFileTypeFilter(string strExtension, string strDescription,
bool bIncludeAllFiles)
{
- string str = string.Empty;
+ StringBuilder sb = new StringBuilder();
- if((strExtension != null) && (strExtension.Length > 0) &&
- (strDescription != null) && (strDescription.Length > 0))
+ if(!string.IsNullOrEmpty(strExtension) && !string.IsNullOrEmpty(
+ strDescription))
{
- str += strDescription + @" (*." + strExtension + @")|*." + strExtension;
+ // str += strDescription + @" (*." + strExtension +
+ // @")|*." + strExtension;
+
+ string[] vExts = strExtension.Split(new char[]{ '|' },
+ StringSplitOptions.RemoveEmptyEntries);
+ if(vExts.Length > 0)
+ {
+ sb.Append(strDescription);
+ sb.Append(@" (*.");
+
+ for(int i = 0; i < vExts.Length; ++i)
+ {
+ if(i > 0) sb.Append(@", *.");
+ sb.Append(vExts[i]);
+ }
+
+ sb.Append(@")|*.");
+
+ for(int i = 0; i < vExts.Length; ++i)
+ {
+ if(i > 0) sb.Append(@";*.");
+ sb.Append(vExts[i]);
+ }
+ }
}
if(bIncludeAllFiles)
{
- if(str.Length > 0) str += @"|";
-
- str += KPRes.AllFiles + @" (*.*)|*.*";
+ if(sb.Length > 0) sb.Append(@"|");
+ sb.Append(KPRes.AllFiles);
+ sb.Append(@" (*.*)|*.*");
}
- return str;
+ return sb.ToString();
+ }
+
+ public static string GetPrimaryFileTypeExt(string strExtensions)
+ {
+ if(strExtensions == null) { Debug.Assert(false); return string.Empty; }
+
+ int i = strExtensions.IndexOf('|');
+ if(i >= 0) return strExtensions.Substring(0, i);
+
+ return strExtensions; // Single extension
}
public static OpenFileDialog CreateOpenFileDialog(string strTitle, string strFilter,
@@ -972,8 +1007,10 @@ namespace KeePass.UI
if(vItemTags == null) throw new ArgumentNullException("vItemTags");
for(int i = 0; i < lv.Items.Count; ++i)
+ {
if(Array.IndexOf<object>(vItemTags, lv.Items[i].Tag) >= 0)
lv.Items[i].Selected = true;
+ }
}
public static void SetWebBrowserDocument(WebBrowser wb, string strDocumentText)
@@ -1006,6 +1043,19 @@ namespace KeePass.UI
catch(Exception) { } // Not supported on older operating systems
}
+ public static void SetExplorerTheme(Control c, bool bUseListFont)
+ {
+ if(c == null) { Debug.Assert(false); return; }
+
+ SetExplorerTheme(c.Handle);
+
+ if(bUseListFont)
+ {
+ if(UISystemFonts.ListFont != null)
+ c.Font = UISystemFonts.ListFont;
+ }
+ }
+
public static Image LoadImage(byte[] pb)
{
if(pb == null) throw new ArgumentNullException("pb");
@@ -2018,5 +2068,72 @@ namespace KeePass.UI
tsmi.ShortcutKeyDisplayString = str;
}
+
+ /* public static string ImageToDataUri(Image img)
+ {
+ if(img == null) { Debug.Assert(false); return string.Empty; }
+
+ MemoryStream ms = new MemoryStream();
+ img.Save(ms, ImageFormat.Png);
+
+ byte[] pbImage = ms.ToArray();
+ string strImage = Convert.ToBase64String(pbImage);
+
+ ms.Close();
+ return ("data:image/png;base64," + strImage);
+ } */
+
+ public static void SetFocusedItem(ListView lv, ListViewItem lvi,
+ bool bAlsoSelect)
+ {
+ if((lv == null) || (lvi == null)) { Debug.Assert(false); return; }
+
+ if(bAlsoSelect) lvi.Selected = true;
+
+ try { lv.FocusedItem = lvi; } // .NET
+ catch(Exception)
+ {
+ try { lvi.Focused = true; } // Mono
+ catch(Exception) { Debug.Assert(false); }
+ }
+ }
+
+ public static Image CreateDropDownImage(Image imgBase)
+ {
+ if(imgBase == null) { Debug.Assert(false); return null; }
+
+ int dx = imgBase.Width, dy = imgBase.Height;
+ if((dx < 8) || (dy < 5)) return new Bitmap(imgBase);
+
+ Bitmap bmp = new Bitmap(dx, dy, PixelFormat.Format32bppArgb);
+ using(Graphics g = Graphics.FromImage(bmp))
+ {
+ g.Clear(Color.Transparent);
+ g.DrawImageUnscaled(imgBase, 0, 0);
+
+ Pen penDark = Pens.Black;
+ g.DrawLine(penDark, dx - 5, dy - 3, dx - 1, dy - 3);
+ g.DrawLine(penDark, dx - 4, dy - 2, dx - 2, dy - 2);
+ // g.DrawLine(penDark, dx - 7, dy - 4, dx - 1, dy - 4);
+ // g.DrawLine(penDark, dx - 6, dy - 3, dx - 2, dy - 3);
+ // g.DrawLine(penDark, dx - 5, dy - 2, dx - 3, dy - 2);
+
+ using(Pen penLight = new Pen(Color.FromArgb(
+ 160, 255, 255, 255), 1.0f))
+ {
+ g.DrawLine(penLight, dx - 5, dy - 4, dx - 1, dy - 4);
+ g.DrawLine(penLight, dx - 6, dy - 3, dx - 4, dy - 1);
+ g.DrawLine(penLight, dx - 2, dy - 1, dx - 1, dy - 2);
+ // g.DrawLine(penLight, dx - 7, dy - 5, dx - 1, dy - 5);
+ // g.DrawLine(penLight, dx - 8, dy - 4, dx - 5, dy - 1);
+ // g.DrawLine(penLight, dx - 3, dy - 1, dx - 1, dy - 3);
+ }
+ }
+
+ bmp.SetPixel(dx - 3, dy - 1, Color.Black);
+ // bmp.SetPixel(dx - 4, dy - 1, Color.Black);
+
+ return bmp;
+ }
}
}
diff --git a/KeePass/Util/AppLocator.cs b/KeePass/Util/AppLocator.cs
index 422bb15..2df75b1 100644
--- a/KeePass/Util/AppLocator.cs
+++ b/KeePass/Util/AppLocator.cs
@@ -222,7 +222,12 @@ namespace KeePass.Util
// HKEY_CLASSES_ROOT\\ChromeHTML\\shell\\open\\command
private static string FindChrome()
{
- if(NativeLib.IsUnix()) return FindAppUnix("chromium-browser");
+ if(NativeLib.IsUnix())
+ {
+ string str = FindAppUnix("google-chrome");
+ if(!string.IsNullOrEmpty(str)) return str;
+ return FindAppUnix("chromium-browser");
+ }
RegistryKey kHtml = Registry.ClassesRoot.OpenSubKey("ChromeHTML", false);
RegistryKey kShell = kHtml.OpenSubKey("shell", false);
@@ -292,7 +297,7 @@ namespace KeePass.Util
public static string FindAppUnix(string strApp)
{
- string str = WinUtil.RunConsoleApp("whereis", "-b " + strApp);
+ string str = NativeLib.RunConsoleApp("whereis", "-b " + strApp);
if(str == null) return null;
str = str.Trim();
diff --git a/KeePass/Util/AutoType.cs b/KeePass/Util/AutoType.cs
index 186c3d7..f4a679c 100644
--- a/KeePass/Util/AutoType.cs
+++ b/KeePass/Util/AutoType.cs
@@ -78,6 +78,17 @@ namespace KeePass.Util
public static event EventHandler<AutoTypeEventArgs> FilterSendPre;
public static event EventHandler<AutoTypeEventArgs> FilterSend;
+ public static event EventHandler<SequenceQueryEventArgs> SequenceQuery;
+
+ public static event EventHandler<SequenceQueriesEventArgs> SequenceQueriesBegin;
+ public static event EventHandler<SequenceQueriesEventArgs> SequenceQueriesEnd;
+
+ private static int m_iEventID = 0;
+ public static int GetNextEventID()
+ {
+ return Interlocked.Increment(ref m_iEventID);
+ }
+
internal static void InitStatic()
{
try
@@ -206,8 +217,28 @@ namespace KeePass.Util
return AutoType.Execute(ctxNew);
}
+ private static SequenceQueriesEventArgs GetSequencesForWindowBegin(
+ IntPtr hWnd, string strWindow)
+ {
+ SequenceQueriesEventArgs e = new SequenceQueriesEventArgs(
+ GetNextEventID(), hWnd, strWindow);
+
+ if(AutoType.SequenceQueriesBegin != null)
+ AutoType.SequenceQueriesBegin(null, e);
+
+ return e;
+ }
+
+ private static void GetSequencesForWindowEnd(SequenceQueriesEventArgs e)
+ {
+ if(AutoType.SequenceQueriesEnd != null)
+ AutoType.SequenceQueriesEnd(null, e);
+ }
+
+ // Multiple calls of this method should be wrapped in
+ // GetSequencesForWindowBegin and GetSequencesForWindowEnd
private static List<string> GetSequencesForWindow(PwEntry pwe,
- string strWindow, PwDatabase pdContext)
+ IntPtr hWnd, string strWindow, PwDatabase pdContext, int iEventID)
{
List<string> l = new List<string>();
@@ -275,6 +306,30 @@ namespace KeePass.Util
AddSequence(l, pwe.GetAutoTypeSequence());
}
+ if(Program.Config.Integration.AutoTypeMatchByTagInTitle)
+ {
+ foreach(string strTag in pwe.Tags)
+ {
+ if(string.IsNullOrEmpty(strTag)) { Debug.Assert(false); continue; }
+
+ if(strWindow.IndexOf(strTag, StrUtil.CaseIgnoreCmp) >= 0)
+ {
+ AddSequence(l, pwe.GetAutoTypeSequence());
+ break;
+ }
+ }
+ }
+
+ if(AutoType.SequenceQuery != null)
+ {
+ SequenceQueryEventArgs e = new SequenceQueryEventArgs(iEventID,
+ hWnd, strWindow, pwe, pdContext);
+ AutoType.SequenceQuery(null, e);
+
+ foreach(string strSeq in e.Sequences)
+ AddSequence(l, strSeq);
+ }
+
return l;
}
@@ -359,6 +414,9 @@ namespace KeePass.Util
if(string.IsNullOrEmpty(strWindow)) return false;
if(!IsValidAutoTypeWindow(hWnd, true)) return false;
+ SequenceQueriesEventArgs evQueries = GetSequencesForWindowBegin(
+ hWnd, strWindow);
+
List<AutoTypeCtx> lCtxs = new List<AutoTypeCtx>();
PwDatabase pdCurrent = null;
DateTime dtNow = DateTime.Now;
@@ -368,7 +426,8 @@ namespace KeePass.Util
// Ignore expired entries
if(pe.Expires && (pe.ExpiryTime < dtNow)) return true;
- List<string> lSeq = GetSequencesForWindow(pe, strWindow, pdCurrent);
+ List<string> lSeq = GetSequencesForWindow(pe, hWnd, strWindow,
+ pdCurrent, evQueries.EventID);
foreach(string strSeq in lSeq)
{
lCtxs.Add(new AutoTypeCtx(strSeq, pe, pdCurrent));
@@ -384,6 +443,8 @@ namespace KeePass.Util
pwSource.RootGroup.TraverseTree(TraversalMethod.PreOrder, null, eh);
}
+ GetSequencesForWindowEnd(evQueries);
+
if(lCtxs.Count == 1)
AutoType.PerformInternal(lCtxs[0], strWindow);
else if(lCtxs.Count > 1)
@@ -447,13 +508,13 @@ namespace KeePass.Util
if(!pe.GetAutoTypeEnabled()) return false;
if(!AppPolicy.Try(AppPolicyId.AutoTypeWithoutContext)) return false;
+ IntPtr hWnd;
string strWindow;
try
{
- IntPtr hDummy;
- NativeMethods.GetForegroundWindowInfo(out hDummy, out strWindow, true);
+ NativeMethods.GetForegroundWindowInfo(out hWnd, out strWindow, true);
}
- catch(Exception) { strWindow = null; }
+ catch(Exception) { hWnd = IntPtr.Zero; strWindow = null; }
if(!KeePassLib.Native.NativeLib.IsUnix())
{
@@ -463,7 +524,14 @@ namespace KeePass.Util
Thread.Sleep(100);
- List<string> lSeq = GetSequencesForWindow(pe, strWindow, pdContext);
+ SequenceQueriesEventArgs evQueries = GetSequencesForWindowBegin(
+ hWnd, strWindow);
+
+ List<string> lSeq = GetSequencesForWindow(pe, hWnd, strWindow,
+ pdContext, evQueries.EventID);
+
+ GetSequencesForWindowEnd(evQueries);
+
if(lSeq.Count == 0) lSeq.Add(pe.GetAutoTypeSequence());
AutoTypeCtx ctx = new AutoTypeCtx(lSeq[0], pe, pdContext);
diff --git a/KeePass/Util/AutoTypeCtx.cs b/KeePass/Util/AutoTypeCtx.cs
index a193d02..d31368a 100644
--- a/KeePass/Util/AutoTypeCtx.cs
+++ b/KeePass/Util/AutoTypeCtx.cs
@@ -22,6 +22,8 @@ using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
+using KeePass.Util.Spr;
+
using KeePassLib;
namespace KeePass.Util
@@ -72,4 +74,89 @@ namespace KeePass.Util
return (AutoTypeCtx)this.MemberwiseClone();
}
}
+
+ public sealed class SequenceQueriesEventArgs : EventArgs
+ {
+ private readonly int m_iEventID;
+ public int EventID
+ {
+ get { return m_iEventID; }
+ }
+
+ private readonly IntPtr m_h;
+ public IntPtr TargetWindowHandle
+ {
+ get { return m_h; }
+ }
+
+ private readonly string m_strWnd;
+ public string TargetWindowTitle
+ {
+ get { return m_strWnd; }
+ }
+
+ public SequenceQueriesEventArgs(int iEventID, IntPtr hWnd,
+ string strWnd)
+ {
+ m_iEventID = iEventID;
+ m_h = hWnd;
+ m_strWnd = strWnd;
+ }
+ }
+
+ public sealed class SequenceQueryEventArgs : EventArgs
+ {
+ private readonly int m_iEventID;
+ public int EventID
+ {
+ get { return m_iEventID; }
+ }
+
+ private readonly IntPtr m_h;
+ public IntPtr TargetWindowHandle
+ {
+ get { return m_h; }
+ }
+
+ private readonly string m_strWnd;
+ public string TargetWindowTitle
+ {
+ get { return m_strWnd; }
+ }
+
+ private readonly PwEntry m_pe;
+ public PwEntry Entry
+ {
+ get { return m_pe; }
+ }
+
+ private readonly PwDatabase m_pd;
+ public PwDatabase Database
+ {
+ get { return m_pd; }
+ }
+
+ private List<string> m_lSeqs = new List<string>();
+ internal IEnumerable<string> Sequences
+ {
+ get { return m_lSeqs; }
+ }
+
+ public SequenceQueryEventArgs(int iEventID, IntPtr hWnd, string strWnd,
+ PwEntry pe, PwDatabase pd)
+ {
+ m_iEventID = iEventID;
+ m_h = hWnd;
+ m_strWnd = strWnd;
+ m_pe = pe;
+ m_pd = pd;
+ }
+
+ public void AddSequence(string strSeq)
+ {
+ if(strSeq == null) { Debug.Assert(false); return; }
+
+ m_lSeqs.Add(strSeq);
+ }
+ }
}
diff --git a/KeePass/Util/BinaryDataClassifier.cs b/KeePass/Util/BinaryDataClassifier.cs
index e38337d..d144ebe 100644
--- a/KeePass/Util/BinaryDataClassifier.cs
+++ b/KeePass/Util/BinaryDataClassifier.cs
@@ -24,6 +24,10 @@ using System.Diagnostics;
using System.Drawing;
using System.IO;
+using KeePass.Resources;
+
+using KeePassLib.Utility;
+
namespace KeePass.Util
{
public enum BinaryDataClass
@@ -37,14 +41,6 @@ namespace KeePass.Util
public static class BinaryDataClassifier
{
- public const string BdeAnsi = "ANSI";
- public const string BdeAscii = "ASCII";
- public const string BdeUtf7 = "UTF-7";
- public const string BdeUtf8 = "UTF-8";
- public const string BdeUtf32 = "UTF-32";
- public const string BdeUnicodeLE = "Unicode (Little Endian)";
- public const string BdeUnicodeBE = "Unicode (Big Endian)";
-
private static readonly string[] m_vTextExtensions = new string[]{
"txt", "csv", "c", "cpp", "h", "hpp", "css", "js", "bat"
};
@@ -121,61 +117,70 @@ namespace KeePass.Util
return ClassifyData(pbData);
}
- public static Encoding GetStringEncoding(byte[] pbData, bool bBom,
- out string strOutEncodingName, out uint uStartOffset)
+ public static StrEncodingInfo GetStringEncoding(byte[] pbData,
+ out uint uStartOffset)
{
Debug.Assert(pbData != null);
if(pbData == null) throw new ArgumentNullException("pbData");
- byte bt1 = ((pbData.Length >= 1) ? pbData[0] : (byte)0);
- byte bt2 = ((pbData.Length >= 2) ? pbData[1] : (byte)0);
- byte bt3 = ((pbData.Length >= 3) ? pbData[2] : (byte)0);
- byte bt4 = ((pbData.Length >= 4) ? pbData[3] : (byte)0);
+ uStartOffset = 0;
- if((bt1 == 0xEF) && (bt2 == 0xBB) && (bt3 == 0xBF))
- {
- strOutEncodingName = BdeUtf8;
- uStartOffset = 3;
- return new UTF8Encoding(bBom);
- }
- if((bt1 == 0x00) && (bt2 == 0x00) && (bt3 == 0xFE) && (bt4 == 0xFF))
- {
- strOutEncodingName = BdeUtf32;
- uStartOffset = 4;
- return new UTF32Encoding(true, bBom);
- }
- if((bt1 == 0xFF) && (bt2 == 0xFE) && (bt3 == 0x00) && (bt4 == 0x00))
+ List<StrEncodingInfo> lEncs = new List<StrEncodingInfo>(StrUtil.Encodings);
+ lEncs.Sort(BinaryDataClassifier.CompareBySigLengthRev);
+
+ foreach(StrEncodingInfo sei in lEncs)
{
- strOutEncodingName = BdeUtf32;
- uStartOffset = 4;
- return new UTF32Encoding(false, bBom);
+ byte[] pbSig = sei.StartSignature;
+ if((pbSig == null) || (pbSig.Length == 0)) continue;
+ if(pbSig.Length > pbData.Length) continue;
+
+ byte[] pbStart = MemUtil.Mid<byte>(pbData, 0, pbSig.Length);
+ if(MemUtil.ArraysEqual(pbStart, pbSig))
+ {
+ uStartOffset = (uint)pbSig.Length;
+ return sei;
+ }
}
- if((bt1 == 0xFF) && (bt2 == 0xFE))
+
+ if((pbData.Length % 4) == 0)
{
- strOutEncodingName = BdeUnicodeLE;
- uStartOffset = 2;
- return new UnicodeEncoding(false, bBom);
+ byte[] z3 = new byte[] { 0, 0, 0 };
+ int i = MemUtil.IndexOf<byte>(pbData, z3);
+ if((i >= 0) && (i < (pbData.Length - 4))) // Ignore last zero char
+ {
+ if((i % 4) == 0) return StrUtil.GetEncoding(StrEncodingType.Utf32BE);
+ if((i % 4) == 1) return StrUtil.GetEncoding(StrEncodingType.Utf32LE);
+ // Don't assume UTF-32 for other offsets
+ }
}
- if((bt1 == 0xFE) && (bt2 == 0xFF))
+
+ if((pbData.Length % 2) == 0)
{
- strOutEncodingName = BdeUnicodeBE;
- uStartOffset = 2;
- return new UnicodeEncoding(true, bBom);
+ int i = Array.IndexOf<byte>(pbData, 0);
+ if((i >= 0) && (i < (pbData.Length - 2))) // Ignore last zero char
+ {
+ if((i % 2) == 0) return StrUtil.GetEncoding(StrEncodingType.Utf16BE);
+ return StrUtil.GetEncoding(StrEncodingType.Utf16LE);
+ }
}
- uStartOffset = 0;
-
try
{
- Encoding.UTF8.GetString(pbData);
-
- strOutEncodingName = BdeUtf8;
- return new UTF8Encoding(bBom);
+ UTF8Encoding utf8Throw = new UTF8Encoding(false, true);
+ utf8Throw.GetString(pbData);
+ return StrUtil.GetEncoding(StrEncodingType.Utf8);
}
catch(Exception) { }
- strOutEncodingName = BdeAnsi;
- return Encoding.Default;
+ return StrUtil.GetEncoding(StrEncodingType.Default);
+ }
+
+ private static int CompareBySigLengthRev(StrEncodingInfo a, StrEncodingInfo b)
+ {
+ int na = 0, nb = 0;
+ if(a.StartSignature != null) na = a.StartSignature.Length;
+ if(b.StartSignature != null) nb = b.StartSignature.Length;
+ return -(na.CompareTo(nb));
}
}
}
diff --git a/KeePass/Util/CancellableOperationEventArgs.cs b/KeePass/Util/CancellableOperationEventArgs.cs
index 4380b2b..da82b1f 100644
--- a/KeePass/Util/CancellableOperationEventArgs.cs
+++ b/KeePass/Util/CancellableOperationEventArgs.cs
@@ -21,6 +21,15 @@ using System;
namespace KeePass.Util
{
+ /// <summary>
+ /// Structure for a cancellable event.
+ /// The difference between this class and the .NET <c>CancelEventArgs</c>
+ /// class is that in <c>CancellableOperationEventArgs</c> once the
+ /// <c>Cancel</c> property has been set to <c>true</c>, it remains
+ /// <c>true</c>, even when trying to set it to <c>false</c> afterwards;
+ /// this allows passing an instance to multiple recipients and cancel
+ /// if at least one of them wants to (the others can't reset the vote).
+ /// </summary>
public class CancellableOperationEventArgs : EventArgs
{
private bool m_bCancel = false;
diff --git a/KeePassLibSD/SecureStringEx.cs b/KeePass/Util/ClipboardUtil.MacOSX.cs
similarity index 70%
copy from KeePassLibSD/SecureStringEx.cs
copy to KeePass/Util/ClipboardUtil.MacOSX.cs
index ae1d85e..5d0301f 100644
--- a/KeePassLibSD/SecureStringEx.cs
+++ b/KeePass/Util/ClipboardUtil.MacOSX.cs
@@ -1,4 +1,4 @@
-/*
+/*
KeePass Password Safe - The Open-Source Password Manager
Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
@@ -20,31 +20,23 @@
using System;
using System.Collections.Generic;
using System.Text;
+using System.Diagnostics;
-namespace KeePassLib
+using KeePassLib.Native;
+
+namespace KeePass.Util
{
- public sealed class SecureString
+ public static partial class ClipboardUtil
{
- private string m_secString = string.Empty;
-
- public int Length
- {
- get { return m_secString.Length; }
- }
-
- public void AppendChar(char ch)
- {
- m_secString += ch;
- }
-
- public string ReadAsString()
+ private static string GetStringM()
{
- return m_secString;
+ return (NativeLib.RunConsoleApp("pbpaste", "-pboard general") ??
+ string.Empty);
}
- public void Clear()
+ private static void SetStringM(string str)
{
- m_secString = string.Empty;
+ NativeLib.RunConsoleApp("pbcopy", "-pboard general", str);
}
}
}
diff --git a/KeePass/Util/ClipboardUtil.cs b/KeePass/Util/ClipboardUtil.cs
index 3050a14..af9f3fe 100644
--- a/KeePass/Util/ClipboardUtil.cs
+++ b/KeePass/Util/ClipboardUtil.cs
@@ -95,6 +95,8 @@ namespace KeePass.Util
if(bFailed) return false;
}
+ else if(KeeNativeLib.NativeLib.GetPlatformID() == PlatformID.MacOSX)
+ SetStringM(strData);
else // Managed
{
Clear();
@@ -163,6 +165,9 @@ namespace KeePass.Util
if(bFailed) return false;
}
+ else if(KeeNativeLib.NativeLib.GetPlatformID() == PlatformID.MacOSX)
+ SetStringM(Convert.ToBase64String(pbToCopy,
+ Base64FormattingOptions.None));
else // Managed, no encoding
{
Clear();
@@ -201,6 +206,8 @@ namespace KeePass.Util
return Convert.FromBase64String(str);
}
+ else if(KeeNativeLib.NativeLib.GetPlatformID() == PlatformID.MacOSX)
+ return Convert.FromBase64String(GetStringM());
else // Managed, no encoding
{
return (byte[])Clipboard.GetData(strFormat);
@@ -271,6 +278,11 @@ namespace KeePass.Util
bNativeSuccess = true;
}
}
+ else if(KeeNativeLib.NativeLib.GetPlatformID() == PlatformID.MacOSX)
+ {
+ SetStringM(string.Empty);
+ bNativeSuccess = true;
+ }
}
catch(Exception) { Debug.Assert(false); }
@@ -302,7 +314,15 @@ namespace KeePass.Util
{
try
{
- if(Clipboard.ContainsText())
+ if(KeeNativeLib.NativeLib.GetPlatformID() == PlatformID.MacOSX)
+ {
+ string strData = GetStringM();
+ byte[] pbUtf8 = StrUtil.Utf8.GetBytes(strData);
+
+ SHA256Managed sha256 = new SHA256Managed();
+ return sha256.ComputeHash(pbUtf8);
+ }
+ else if(Clipboard.ContainsText())
{
string strData = Clipboard.GetText();
byte[] pbUtf8 = StrUtil.Utf8.GetBytes(strData);
@@ -346,6 +366,15 @@ namespace KeePass.Util
}
catch(Exception) { Debug.Assert(false); }
+ if(KeeNativeLib.NativeLib.GetPlatformID() == PlatformID.MacOSX)
+ {
+ string str = GetStringM();
+ byte[] pbText = StrUtil.Utf8.GetBytes("pb" + str);
+
+ SHA256Managed sha256 = new SHA256Managed();
+ return sha256.ComputeHash(pbText);
+ }
+
try
{
MemoryStream ms = new MemoryStream();
@@ -359,6 +388,7 @@ namespace KeePass.Util
MemUtil.CopyStream(sAudio, ms);
sAudio.Close();
}
+
if(Clipboard.ContainsFileDropList())
{
StringCollection sc = Clipboard.GetFileDropList();
@@ -368,6 +398,7 @@ namespace KeePass.Util
ms.Write(pbStr, 0, pbStr.Length);
}
}
+
if(Clipboard.ContainsImage())
{
using(Image img = Clipboard.GetImage())
@@ -379,6 +410,7 @@ namespace KeePass.Util
msImage.Close();
}
}
+
if(Clipboard.ContainsText())
{
string str = Clipboard.GetText();
diff --git a/KeePass/Util/HotKeyManager.cs b/KeePass/Util/HotKeyManager.cs
index 36ee8c7..5f1899d 100644
--- a/KeePass/Util/HotKeyManager.cs
+++ b/KeePass/Util/HotKeyManager.cs
@@ -61,7 +61,7 @@ namespace KeePass.Util
public static bool RegisterHotKey(int nId, Keys kKey)
{
- if(kKey == Keys.None) return false;
+ UnregisterHotKey(nId);
uint uMod = 0;
if((kKey & Keys.Shift) != Keys.None) uMod |= NativeMethods.MOD_SHIFT;
@@ -69,8 +69,7 @@ namespace KeePass.Util
if((kKey & Keys.Control) != Keys.None) uMod |= NativeMethods.MOD_CONTROL;
uint vkCode = (uint)(kKey & Keys.KeyCode);
-
- UnregisterHotKey(nId);
+ if(vkCode == (uint)Keys.None) return false; // Don't register mod keys only
try
{
@@ -126,20 +125,10 @@ namespace KeePass.Util
public static void UnregisterAll()
{
- try
- {
- foreach(KeyValuePair<int, Keys> kvp in m_vRegKeys)
- {
- if(!NativeLib.IsUnix())
- NativeMethods.UnregisterHotKey(m_fRecvWnd.Handle, kvp.Key);
- // else // Unix
- // NativeMethods.tomboy_keybinder_unbind(
- // EggAccKeysToString(kvp.Value), m_hOnHotKey);
- }
- }
- catch(Exception) { Debug.Assert(false); }
+ List<int> vIDs = new List<int>(m_vRegKeys.Keys);
+ foreach(int nID in vIDs) UnregisterHotKey(nID);
- m_vRegKeys.Clear();
+ Debug.Assert(m_vRegKeys.Count == 0);
}
/* private static void OnHotKey(string strKey, IntPtr lpUserData)
diff --git a/KeePass/Util/IpcUtilEx.cs b/KeePass/Util/IpcUtilEx.cs
index 366b6a8..247a111 100644
--- a/KeePass/Util/IpcUtilEx.cs
+++ b/KeePass/Util/IpcUtilEx.cs
@@ -27,6 +27,7 @@ using System.Threading;
using KeePass.Forms;
using KeePass.Native;
+using KeePass.UI;
using KeePassLib;
using KeePassLib.Cryptography;
@@ -200,6 +201,10 @@ namespace KeePass.Util
mf.EnsureVisibleForegroundWindow(true, true);
mf.UIBlockAutoUnlock(false);
+ // Don't try to open another database while a dialog
+ // is displayed (3489098)
+ if(GlobalWindowManager.WindowCount > 0) return;
+
string[] vArgs = CommandLineArgs.SafeDeserialize(ipcMsg.Param0);
if(vArgs == null) { Debug.Assert(false); return; }
diff --git a/KeePass/Util/MonoWorkarounds.cs b/KeePass/Util/MonoWorkarounds.cs
new file mode 100644
index 0000000..a409aea
--- /dev/null
+++ b/KeePass/Util/MonoWorkarounds.cs
@@ -0,0 +1,207 @@
+/*
+ KeePass Password Safe - The Open-Source Password Manager
+ Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.ComponentModel;
+using System.Reflection;
+using System.Diagnostics;
+
+using KeePassLib.Native;
+
+namespace KeePass.Util
+{
+ public static class MonoWorkarounds
+ {
+ private static bool? m_bReq = null;
+ public static bool IsRequired
+ {
+ get
+ {
+ if(!m_bReq.HasValue) m_bReq = NativeLib.IsUnix();
+ return m_bReq.Value;
+ }
+ }
+
+ public static void ApplyTo(Form f)
+ {
+ if(!MonoWorkarounds.IsRequired) return;
+ if(f == null) { Debug.Assert(false); return; }
+
+ ApplyToControlsRec(f.Controls, f, MonoWorkarounds.ApplyToControl);
+ }
+
+ public static void Release(Form f)
+ {
+ if(!MonoWorkarounds.IsRequired) return;
+ if(f == null) { Debug.Assert(false); return; }
+
+ ApplyToControlsRec(f.Controls, f, MonoWorkarounds.ReleaseControl);
+ }
+
+ private delegate void MwaControlHandler(Control c, Form fContext);
+
+ private static void ApplyToControlsRec(Control.ControlCollection cc,
+ Form fContext, MwaControlHandler fn)
+ {
+ if(cc == null) { Debug.Assert(false); return; }
+
+ foreach(Control c in cc)
+ {
+ fn(c, fContext);
+ ApplyToControlsRec(c.Controls, fContext, fn);
+ }
+ }
+
+ private sealed class MwaHandlerInfo
+ {
+ private readonly Delegate m_fnOrg; // May be null
+ public Delegate FunctionOriginal
+ {
+ get { return m_fnOrg; }
+ }
+
+ private readonly Delegate m_fnOvr;
+ public Delegate FunctionOverride
+ {
+ get { return m_fnOvr; }
+ }
+
+ private readonly DialogResult m_dr;
+ public DialogResult Result
+ {
+ get { return m_dr; }
+ }
+
+ private readonly Form m_fContext;
+ public Form FormContext
+ {
+ get { return m_fContext; }
+ }
+
+ public MwaHandlerInfo(Delegate fnOrg, Delegate fnOvr, DialogResult dr,
+ Form fContext)
+ {
+ m_fnOrg = fnOrg;
+ m_fnOvr = fnOvr;
+ m_dr = dr;
+ m_fContext = fContext;
+ }
+ }
+
+ private static void ApplyToControl(Control c, Form fContext)
+ {
+ Button btn = (c as Button);
+ if(btn != null) ApplyToButton(btn, fContext);
+ }
+
+ private static EventHandlerList GetEventHandlers(Component c,
+ out object objClickEvent)
+ {
+ FieldInfo fi = typeof(Control).GetField("ClickEvent", // Mono
+ BindingFlags.Static | BindingFlags.NonPublic);
+ if(fi == null)
+ fi = typeof(Control).GetField("EventClick", // .NET
+ BindingFlags.Static | BindingFlags.NonPublic);
+ if(fi == null) { Debug.Assert(false); objClickEvent = null; return null; }
+
+ objClickEvent = fi.GetValue(null);
+ if(objClickEvent == null) { Debug.Assert(false); return null; }
+
+ PropertyInfo pi = typeof(Component).GetProperty("Events",
+ BindingFlags.Instance | BindingFlags.NonPublic);
+ return (pi.GetValue(c, null) as EventHandlerList);
+ }
+
+ private static Dictionary<object, MwaHandlerInfo> m_dictHandlers =
+ new Dictionary<object, MwaHandlerInfo>();
+ private static void ApplyToButton(Button btn, Form fContext)
+ {
+ DialogResult dr = btn.DialogResult;
+ if(dr == DialogResult.None) return; // No workaround required
+
+ object objClickEvent;
+ EventHandlerList ehl = GetEventHandlers(btn, out objClickEvent);
+ if(ehl == null) { Debug.Assert(false); return; }
+ Delegate fnClick = ehl[objClickEvent]; // May be null
+
+ EventHandler fnOvr = new EventHandler(MonoWorkarounds.OnButtonClick);
+ m_dictHandlers[btn] = new MwaHandlerInfo(fnClick, fnOvr, dr, fContext);
+
+ btn.DialogResult = DialogResult.None;
+ if(fnClick != null) ehl.RemoveHandler(objClickEvent, fnClick);
+ ehl[objClickEvent] = fnOvr;
+ }
+
+ private static void ReleaseControl(Control c, Form fContext)
+ {
+ Button btn = (c as Button);
+ if(btn != null) ReleaseButton(btn, fContext);
+ }
+
+ private static void ReleaseButton(Button btn, Form fContext)
+ {
+ MwaHandlerInfo hi;
+ m_dictHandlers.TryGetValue(btn, out hi);
+ if(hi == null) return;
+
+ object objClickEvent;
+ EventHandlerList ehl = GetEventHandlers(btn, out objClickEvent);
+ if(ehl == null) { Debug.Assert(false); return; }
+
+ ehl.RemoveHandler(objClickEvent, hi.FunctionOverride);
+ if(hi.FunctionOriginal != null)
+ ehl[objClickEvent] = hi.FunctionOriginal;
+
+ btn.DialogResult = hi.Result;
+ m_dictHandlers.Remove(btn);
+ }
+
+ private static void OnButtonClick(object sender, EventArgs e)
+ {
+ Button btn = (sender as Button);
+ if(btn == null) { Debug.Assert(false); return; }
+
+ MwaHandlerInfo hi;
+ m_dictHandlers.TryGetValue(btn, out hi);
+ if(hi == null) { Debug.Assert(false); return; }
+
+ Form f = hi.FormContext;
+
+ // Set current dialog result by setting the form's private
+ // variable; the DialogResult property can't be used,
+ // because it raises close events
+ FieldInfo fiRes = typeof(Form).GetField("dialog_result",
+ BindingFlags.Instance | BindingFlags.NonPublic);
+ if(fiRes == null) { Debug.Assert(false); return; }
+ if(f != null) fiRes.SetValue(f, hi.Result);
+
+ if(hi.FunctionOriginal != null)
+ hi.FunctionOriginal.Method.Invoke(hi.FunctionOriginal.Target,
+ new object[]{ btn, e });
+
+ // Raise close events, if the click event handler hasn't
+ // reset the dialog result
+ if((f != null) && (f.DialogResult == hi.Result))
+ f.DialogResult = hi.Result; // Raises close events
+ }
+ }
+}
diff --git a/KeePass/Util/SendInputEx.Windows.cs b/KeePass/Util/SendInputEx.Windows.cs
index 1217bac..0775c62 100644
--- a/KeePass/Util/SendInputEx.Windows.cs
+++ b/KeePass/Util/SendInputEx.Windows.cs
@@ -304,23 +304,39 @@ namespace KeePass.Util
}
} */
+ private static Dictionary<string, char> m_dictNativeChars = null;
+ private static string[] m_vNativeCharKeys = null;
private static void OSSendKeysWindows(string strSequence)
{
// Workaround for ^/& .NET SendKeys bug:
// https://connect.microsoft.com/VisualStudio/feedback/details/93922/sendkeys-send-sends-wrong-character
- string[] vSpecial = new string[]{ @"{^}", @"{%}", @"´", @"`", @"@" };
- List<string> vSend = StrUtil.SplitWithSep(strSequence, vSpecial, true);
+ if(m_dictNativeChars == null)
+ {
+ m_dictNativeChars = new Dictionary<string, char>();
+ m_dictNativeChars[@"{^}"] = '^';
+ m_dictNativeChars[@"{%}"] = '%';
+ m_dictNativeChars[@"´"] = '´';
+ m_dictNativeChars[@"`"] = '`';
+ m_dictNativeChars[@"@"] = '@';
+ m_dictNativeChars[@"°"] = '°';
+ m_dictNativeChars[@"£"] = '£';
+ m_dictNativeChars[@"|"] = '|';
+
+ List<string> lKeys = new List<string>(m_dictNativeChars.Keys);
+ m_vNativeCharKeys = lKeys.ToArray();
+ }
+
+ List<string> vSend = StrUtil.SplitWithSep(strSequence,
+ m_vNativeCharKeys, true);
foreach(string strSend in vSend)
{
if(string.IsNullOrEmpty(strSend)) continue;
- if(strSend.Equals(@"{^}")) SendCharNative('^');
- else if(strSend.Equals(@"{%}")) SendCharNative('%');
- else if(strSend.Equals(@"´")) SendCharNative('´');
- else if(strSend.Equals(@"`")) SendCharNative('`');
- else if(strSend.Equals(@"@")) SendCharNative('@');
+ char chNative;
+ if(m_dictNativeChars.TryGetValue(strSend, out chNative))
+ SendCharNative(chNative);
else SendKeys.SendWait(strSend);
}
}
diff --git a/KeePass/Util/Spr/SprEngine.cs b/KeePass/Util/Spr/SprEngine.cs
index 561ce18..6e0a72e 100644
--- a/KeePass/Util/Spr/SprEngine.cs
+++ b/KeePass/Util/Spr/SprEngine.cs
@@ -163,9 +163,19 @@ namespace KeePass.Util.Spr
}
if((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None)
+ {
str = SprEngine.FillIfExists(str, @"{ENV_DIRSEP}", new ProtectedString(
false, Path.DirectorySeparatorChar.ToString()), ctx, uRecursionLevel);
+ string strPF86 = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
+ if(string.IsNullOrEmpty(strPF86))
+ strPF86 = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
+ if(strPF86 != null)
+ str = SprEngine.FillIfExists(str, @"{ENV_PROGRAMFILES_X86}",
+ new ProtectedString(false, strPF86), ctx, uRecursionLevel);
+ else { Debug.Assert(false); }
+ }
+
if((ctx.Flags & SprCompileFlags.AutoType) != SprCompileFlags.None)
str = StrUtil.ReplaceCaseInsensitive(str, @"{CLEARFIELD}",
@"{HOME}+({END}){DEL}{DELAY 50}");
diff --git a/KeePass/Util/UpdateCheckEx.cs b/KeePass/Util/UpdateCheckEx.cs
index f11ad06..59a23cc 100644
--- a/KeePass/Util/UpdateCheckEx.cs
+++ b/KeePass/Util/UpdateCheckEx.cs
@@ -305,51 +305,70 @@ namespace KeePass.Util
ms.Close();
if(ioc.Path.EndsWith(".gz", StrUtil.CaseIgnoreCmp))
- pb = MemUtil.Decompress(pb);
-
- string strData = StrUtil.Utf8.GetString(pb);
- strData = StrUtil.NormalizeNewLines(strData, false);
- string[] vLines = strData.Split('\n');
-
- List<UpdateComponentInfo> l = new List<UpdateComponentInfo>();
- bool bHeader = true, bFooterFound = false;
- char chSep = ':'; // Modified by header
- for(int i = 0; i < vLines.Length; ++i)
{
- string str = vLines[i].Trim();
- if(str.Length == 0) continue;
-
- if(bHeader)
- {
- chSep = str[0];
- bHeader = false;
- }
- else if(str[0] == chSep)
- {
- bFooterFound = true;
- break;
- }
- else // Component info
+ // Decompress in try-catch, because some web filters
+ // incorrectly pre-decompress the returned data
+ // https://sourceforge.net/projects/keepass/forums/forum/329221/topic/4915083
+ try
{
- string[] vInfo = str.Split(new char[] { chSep });
- if(vInfo.Length >= 2)
- {
- UpdateComponentInfo c = new UpdateComponentInfo(
- vInfo[0].Trim(), 0, ioc.Path, string.Empty);
- c.VerAvailable = StrUtil.GetVersion(vInfo[1]);
-
- AddComponent(l, c);
- }
+ byte[] pbDec = MemUtil.Decompress(pb);
+ List<UpdateComponentInfo> l = LoadInfoFilePriv(pbDec, ioc);
+ if(l != null) return l;
}
+ catch(Exception) { }
}
- return (bFooterFound ? l : null);
+ return LoadInfoFilePriv(pb, ioc);
}
catch(Exception) { }
return null;
}
+ private static List<UpdateComponentInfo> LoadInfoFilePriv(byte[] pbData,
+ IOConnectionInfo iocSource)
+ {
+ if((pbData == null) || (pbData.Length == 0)) return null;
+
+ string strData = StrUtil.Utf8.GetString(pbData);
+ strData = StrUtil.NormalizeNewLines(strData, false);
+ string[] vLines = strData.Split('\n');
+
+ List<UpdateComponentInfo> l = new List<UpdateComponentInfo>();
+ bool bHeader = true, bFooterFound = false;
+ char chSep = ':'; // Modified by header
+ for(int i = 0; i < vLines.Length; ++i)
+ {
+ string str = vLines[i].Trim();
+ if(str.Length == 0) continue;
+
+ if(bHeader)
+ {
+ chSep = str[0];
+ bHeader = false;
+ }
+ else if(str[0] == chSep)
+ {
+ bFooterFound = true;
+ break;
+ }
+ else // Component info
+ {
+ string[] vInfo = str.Split(new char[] { chSep });
+ if(vInfo.Length >= 2)
+ {
+ UpdateComponentInfo c = new UpdateComponentInfo(
+ vInfo[0].Trim(), 0, iocSource.Path, string.Empty);
+ c.VerAvailable = StrUtil.ParseVersion(vInfo[1]);
+
+ AddComponent(l, c);
+ }
+ }
+ }
+
+ return (bFooterFound ? l : null);
+ }
+
private static void AddComponent(List<UpdateComponentInfo> l,
UpdateComponentInfo c)
{
@@ -375,7 +394,7 @@ namespace KeePass.Util
string.Empty);
AddComponent(l, new UpdateComponentInfo(pi.Name.Trim(),
- StrUtil.GetVersion(pi.FileVersion), strUrl.Trim(),
+ StrUtil.ParseVersion(pi.FileVersion), strUrl.Trim(),
KPRes.Plugins));
}
@@ -449,7 +468,8 @@ namespace KeePass.Util
// If the user has manually enabled the automatic update check
// before, there's no need to ask him again
- if(!Program.Config.Application.Start.CheckForUpdate)
+ if(!Program.Config.Application.Start.CheckForUpdate &&
+ !Program.IsDevelopmentSnapshot())
{
string strHdr = KPRes.UpdateCheckInfo;
string strSub = KPRes.UpdateCheckInfoRes + MessageService.NewParagraph +
diff --git a/KeePass/Util/WinUtil.cs b/KeePass/Util/WinUtil.cs
index 8b1df4e..8772aab 100644
--- a/KeePass/Util/WinUtil.cs
+++ b/KeePass/Util/WinUtil.cs
@@ -513,7 +513,7 @@ namespace KeePass.Util
SearchOption.TopDirectoryOnly))
{
string strVer = di.Name.TrimStart('v', 'V');
- ulong uVer = StrUtil.GetVersion(strVer);
+ ulong uVer = StrUtil.ParseVersion(strVer);
if(uVer > uFrameworkVersion) uFrameworkVersion = uVer;
}
@@ -541,33 +541,10 @@ namespace KeePass.Util
catch(Exception) { Debug.Assert(NativeLib.IsUnix()); }
}
+ [Obsolete]
public static string RunConsoleApp(string strAppPath, string strParams)
{
- if(strAppPath == null) throw new ArgumentNullException("strAppPath");
- if(strAppPath.Length == 0) throw new ArgumentException("strAppPath");
-
- try
- {
- ProcessStartInfo psi = new ProcessStartInfo();
-
- psi.CreateNoWindow = true;
- psi.FileName = strAppPath;
- psi.WindowStyle = ProcessWindowStyle.Hidden;
- psi.UseShellExecute = false;
- psi.RedirectStandardOutput = true;
-
- if(!string.IsNullOrEmpty(strParams)) psi.Arguments = strParams;
-
- Process p = Process.Start(psi);
-
- string strOutput = p.StandardOutput.ReadToEnd();
- p.WaitForExit();
-
- return strOutput;
- }
- catch(Exception) { Debug.Assert(false); }
-
- return null;
+ return NativeLib.RunConsoleApp(strAppPath, strParams);
}
public static string LocateSystemApp(string strExeName)
diff --git a/KeePass/Util/XmlSerialization/XmlSerializerEx.Gen.cs b/KeePass/Util/XmlSerialization/XmlSerializerEx.Gen.cs
new file mode 100644
index 0000000..765e894
--- /dev/null
+++ b/KeePass/Util/XmlSerialization/XmlSerializerEx.Gen.cs
@@ -0,0 +1,3015 @@
+// This is a generated file!
+// Do not edit manually, changes will be overwritten.
+
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using System.Diagnostics;
+
+using KeePassLib.Interfaces;
+
+namespace KeePass.Util.XmlSerialization
+{
+ public sealed partial class XmlSerializerEx : IXmlSerializerEx
+ {
+ private static char[] m_vEnumSeps = new char[] {
+ ' ', '\t', '\r', '\n', '|', ',', ';', ':'
+ };
+
+ private static KeePass.App.Configuration.AppConfigEx ReadAppConfigEx(XmlReader xr)
+ {
+ KeePass.App.Configuration.AppConfigEx o = new KeePass.App.Configuration.AppConfigEx();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Meta":
+ o.Meta = ReadAceMeta(xr);
+ break;
+ case "Application":
+ o.Application = ReadAceApplication(xr);
+ break;
+ case "Logging":
+ o.Logging = ReadAceLogging(xr);
+ break;
+ case "MainWindow":
+ o.MainWindow = ReadAceMainWindow(xr);
+ break;
+ case "UI":
+ o.UI = ReadAceUI(xr);
+ break;
+ case "Security":
+ o.Security = ReadAceSecurity(xr);
+ break;
+ case "Native":
+ o.Native = ReadAceNative(xr);
+ break;
+ case "PasswordGenerator":
+ o.PasswordGenerator = ReadAcePasswordGenerator(xr);
+ break;
+ case "Defaults":
+ o.Defaults = ReadAceDefaults(xr);
+ break;
+ case "Integration":
+ o.Integration = ReadAceIntegration(xr);
+ break;
+ case "Custom":
+ o.CustomSerialized = ReadArrayOfAceKvp(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePassLib.Translation.KPTranslation ReadKPTranslation(XmlReader xr)
+ {
+ KeePassLib.Translation.KPTranslation o = new KeePassLib.Translation.KPTranslation();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Properties":
+ o.Properties = ReadKPTranslationProperties(xr);
+ break;
+ case "StringTables":
+ o.StringTables = ReadListOfKPStringTable(xr);
+ break;
+ case "Forms":
+ o.Forms = ReadListOfKPFormCustomization(xr);
+ break;
+ case "UnusedText":
+ o.UnusedText = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceMeta ReadAceMeta(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceMeta o = new KeePass.App.Configuration.AceMeta();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "PreferUserConfiguration":
+ o.PreferUserConfiguration = ReadBoolean(xr);
+ break;
+ case "OmitItemsWithDefaultValues":
+ o.OmitItemsWithDefaultValues = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceApplication ReadAceApplication(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceApplication o = new KeePass.App.Configuration.AceApplication();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "LanguageFile":
+ o.LanguageFile = ReadString(xr);
+ break;
+ case "HelpUseLocal":
+ o.HelpUseLocal = ReadBoolean(xr);
+ break;
+ case "LastUpdateCheck":
+ o.LastUpdateCheck = ReadString(xr);
+ break;
+ case "LastUsedFile":
+ o.LastUsedFile = ReadIOConnectionInfo(xr);
+ break;
+ case "MostRecentlyUsed":
+ o.MostRecentlyUsed = ReadAceMru(xr);
+ break;
+ case "Start":
+ o.Start = ReadAceStartUp(xr);
+ break;
+ case "FileOpening":
+ o.FileOpening = ReadAceOpenDb(xr);
+ break;
+ case "VerifyWrittenFileAfterSaving":
+ o.VerifyWrittenFileAfterSaving = ReadBoolean(xr);
+ break;
+ case "UseTransactedFileWrites":
+ o.UseTransactedFileWrites = ReadBoolean(xr);
+ break;
+ case "UseFileLocks":
+ o.UseFileLocks = ReadBoolean(xr);
+ break;
+ case "FileClosing":
+ o.FileClosing = ReadAceCloseDb(xr);
+ break;
+ case "TriggerSystem":
+ o.TriggerSystem = ReadEcasTriggerSystem(xr);
+ break;
+ case "PluginCachePath":
+ o.PluginCachePath = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceLogging ReadAceLogging(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceLogging o = new KeePass.App.Configuration.AceLogging();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Enabled":
+ o.Enabled = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceMainWindow ReadAceMainWindow(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceMainWindow o = new KeePass.App.Configuration.AceMainWindow();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "X":
+ o.X = ReadInt32(xr);
+ break;
+ case "Y":
+ o.Y = ReadInt32(xr);
+ break;
+ case "Width":
+ o.Width = ReadInt32(xr);
+ break;
+ case "Height":
+ o.Height = ReadInt32(xr);
+ break;
+ case "Maximized":
+ o.Maximized = ReadBoolean(xr);
+ break;
+ case "SplitterHorizontalFrac":
+ o.SplitterHorizontalFrac = ReadSingle(xr);
+ break;
+ case "SplitterVerticalFrac":
+ o.SplitterVerticalFrac = ReadSingle(xr);
+ break;
+ case "Layout":
+ o.Layout = ReadAceMainWindowLayout(xr);
+ break;
+ case "AlwaysOnTop":
+ o.AlwaysOnTop = ReadBoolean(xr);
+ break;
+ case "CloseButtonMinimizesWindow":
+ o.CloseButtonMinimizesWindow = ReadBoolean(xr);
+ break;
+ case "MinimizeToTray":
+ o.MinimizeToTray = ReadBoolean(xr);
+ break;
+ case "ShowFullPathInTitle":
+ o.ShowFullPathInTitle = ReadBoolean(xr);
+ break;
+ case "DropToBackAfterClipboardCopy":
+ o.DropToBackAfterClipboardCopy = ReadBoolean(xr);
+ break;
+ case "MinimizeAfterClipboardCopy":
+ o.MinimizeAfterClipboardCopy = ReadBoolean(xr);
+ break;
+ case "MinimizeAfterLocking":
+ o.MinimizeAfterLocking = ReadBoolean(xr);
+ break;
+ case "MinimizeAfterOpeningDatabase":
+ o.MinimizeAfterOpeningDatabase = ReadBoolean(xr);
+ break;
+ case "QuickFindSearchInPasswords":
+ o.QuickFindSearchInPasswords = ReadBoolean(xr);
+ break;
+ case "QuickFindExcludeExpired":
+ o.QuickFindExcludeExpired = ReadBoolean(xr);
+ break;
+ case "QuickFindDerefData":
+ o.QuickFindDerefData = ReadBoolean(xr);
+ break;
+ case "FocusResultsAfterQuickFind":
+ o.FocusResultsAfterQuickFind = ReadBoolean(xr);
+ break;
+ case "FocusQuickFindOnRestore":
+ o.FocusQuickFindOnRestore = ReadBoolean(xr);
+ break;
+ case "FocusQuickFindOnUntray":
+ o.FocusQuickFindOnUntray = ReadBoolean(xr);
+ break;
+ case "CopyUrlsInsteadOfOpening":
+ o.CopyUrlsInsteadOfOpening = ReadBoolean(xr);
+ break;
+ case "DisableSaveIfNotModified":
+ o.DisableSaveIfNotModified = ReadBoolean(xr);
+ break;
+ case "ToolBar":
+ o.ToolBar = ReadAceToolBar(xr);
+ break;
+ case "EntryView":
+ o.EntryView = ReadAceEntryView(xr);
+ break;
+ case "TanView":
+ o.TanView = ReadAceTanView(xr);
+ break;
+ case "EntryListColumnCollection":
+ o.EntryListColumns = ReadListOfAceColumn(xr);
+ break;
+ case "EntryListColumnDisplayOrder":
+ o.EntryListColumnDisplayOrder = ReadString(xr);
+ break;
+ case "EntryListAutoResizeColumns":
+ o.EntryListAutoResizeColumns = ReadBoolean(xr);
+ break;
+ case "EntryListAlternatingBgColors":
+ o.EntryListAlternatingBgColors = ReadBoolean(xr);
+ break;
+ case "EntryListShowDerefData":
+ o.EntryListShowDerefData = ReadBoolean(xr);
+ break;
+ case "EntryListShowDerefDataAsync":
+ o.EntryListShowDerefDataAsync = ReadBoolean(xr);
+ break;
+ case "ListSorting":
+ o.ListSorting = ReadListSorter(xr);
+ break;
+ case "ShowEntriesOfSubGroups":
+ o.ShowEntriesOfSubGroups = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceUI ReadAceUI(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceUI o = new KeePass.App.Configuration.AceUI();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "TrayIcon":
+ o.TrayIcon = ReadAceTrayIcon(xr);
+ break;
+ case "Hiding":
+ o.Hiding = ReadAceHiding(xr);
+ break;
+ case "RepeatPasswordOnlyWhenHidden":
+ o.RepeatPasswordOnlyWhenHidden = ReadBoolean(xr);
+ break;
+ case "StandardFont":
+ o.StandardFont = ReadAceFont(xr);
+ break;
+ case "PasswordFont":
+ o.PasswordFont = ReadAceFont(xr);
+ break;
+ case "ForceSystemFontUnix":
+ o.ForceSystemFontUnix = ReadBoolean(xr);
+ break;
+ case "BannerStyle":
+ o.BannerStyle = ReadBannerStyle(xr);
+ break;
+ case "ShowImportStatusDialog":
+ o.ShowImportStatusDialog = ReadBoolean(xr);
+ break;
+ case "ShowDbMntncResultsDialog":
+ o.ShowDbMntncResultsDialog = ReadBoolean(xr);
+ break;
+ case "UseCustomToolStripRenderer":
+ o.UseCustomToolStripRenderer = ReadBoolean(xr);
+ break;
+ case "OptimizeForScreenReader":
+ o.OptimizeForScreenReader = ReadBoolean(xr);
+ break;
+ case "DataEditorRect":
+ o.DataEditorRect = ReadString(xr);
+ break;
+ case "DataEditorFont":
+ o.DataEditorFont = ReadAceFont(xr);
+ break;
+ case "DataEditorWordWrap":
+ o.DataEditorWordWrap = ReadBoolean(xr);
+ break;
+ case "CharPickerRect":
+ o.CharPickerRect = ReadString(xr);
+ break;
+ case "AutoTypeCtxRect":
+ o.AutoTypeCtxRect = ReadString(xr);
+ break;
+ case "AutoTypeCtxFlags":
+ o.AutoTypeCtxFlags = ReadInt64(xr);
+ break;
+ case "AutoTypeCtxColumnWidths":
+ o.AutoTypeCtxColumnWidths = ReadString(xr);
+ break;
+ case "UIFlags":
+ o.UIFlags = ReadUInt64(xr);
+ break;
+ case "KeyCreationFlags":
+ o.KeyCreationFlags = ReadUInt64(xr);
+ break;
+ case "KeyPromptFlags":
+ o.KeyPromptFlags = ReadUInt64(xr);
+ break;
+ case "SecureDesktopPlaySound":
+ o.SecureDesktopPlaySound = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceSecurity ReadAceSecurity(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceSecurity o = new KeePass.App.Configuration.AceSecurity();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "WorkspaceLocking":
+ o.WorkspaceLocking = ReadAceWorkspaceLocking(xr);
+ break;
+ case "Policy":
+ o.Policy = ReadAppPolicyFlags(xr);
+ break;
+ case "MasterPassword":
+ o.MasterPassword = ReadAceMasterPassword(xr);
+ break;
+ case "MasterKeyOnSecureDesktop":
+ o.MasterKeyOnSecureDesktop = ReadBoolean(xr);
+ break;
+ case "ClipboardClearOnExit":
+ o.ClipboardClearOnExit = ReadBoolean(xr);
+ break;
+ case "ClipboardClearAfterSeconds":
+ o.ClipboardClearAfterSeconds = ReadInt32(xr);
+ break;
+ case "UseClipboardViewerIgnoreFormat":
+ o.UseClipboardViewerIgnoreFormat = ReadBoolean(xr);
+ break;
+ case "ClearKeyCommandLineParams":
+ o.ClearKeyCommandLineParams = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceNative ReadAceNative(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceNative o = new KeePass.App.Configuration.AceNative();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "NativeKeyTransformations":
+ o.NativeKeyTransformations = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AcePasswordGenerator ReadAcePasswordGenerator(XmlReader xr)
+ {
+ KeePass.App.Configuration.AcePasswordGenerator o = new KeePass.App.Configuration.AcePasswordGenerator();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "AutoGeneratedPasswordsProfile":
+ o.AutoGeneratedPasswordsProfile = ReadPwProfile(xr);
+ break;
+ case "LastUsedProfile":
+ o.LastUsedProfile = ReadPwProfile(xr);
+ break;
+ case "UserProfiles":
+ o.UserProfiles = ReadListOfPwProfile(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceDefaults ReadAceDefaults(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceDefaults o = new KeePass.App.Configuration.AceDefaults();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "NewEntryExpiresInDays":
+ o.NewEntryExpiresInDays = ReadInt32(xr);
+ break;
+ case "OptionsTabIndex":
+ o.OptionsTabIndex = ReadUInt32(xr);
+ break;
+ case "TanCharacters":
+ o.TanCharacters = ReadString(xr);
+ break;
+ case "TanExpiresOnUse":
+ o.TanExpiresOnUse = ReadBoolean(xr);
+ break;
+ case "SearchParameters":
+ o.SearchParameters = ReadSearchParameters(xr);
+ break;
+ case "FileSaveAsDirectory":
+ o.FileSaveAsDirectory = ReadString(xr);
+ break;
+ case "RememberKeySources":
+ o.RememberKeySources = ReadBoolean(xr);
+ break;
+ case "KeySources":
+ o.KeySources = ReadListOfAceKeyAssoc(xr);
+ break;
+ case "CustomColors":
+ o.CustomColors = ReadString(xr);
+ break;
+ case "WinFavsBaseFolderName":
+ o.WinFavsBaseFolderName = ReadString(xr);
+ break;
+ case "WinFavsFileNamePrefix":
+ o.WinFavsFileNamePrefix = ReadString(xr);
+ break;
+ case "WinFavsFileNameSuffix":
+ o.WinFavsFileNameSuffix = ReadString(xr);
+ break;
+ case "RecycleBinCollapse":
+ o.RecycleBinCollapse = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceIntegration ReadAceIntegration(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceIntegration o = new KeePass.App.Configuration.AceIntegration();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "HotKeyGlobalAutoType":
+ o.HotKeyGlobalAutoType = ReadUInt64(xr);
+ break;
+ case "HotKeySelectedAutoType":
+ o.HotKeySelectedAutoType = ReadUInt64(xr);
+ break;
+ case "HotKeyShowWindow":
+ o.HotKeyShowWindow = ReadUInt64(xr);
+ break;
+ case "HotKeyEntryMenu":
+ o.HotKeyEntryMenu = ReadUInt64(xr);
+ break;
+ case "UrlOverride":
+ o.UrlOverride = ReadString(xr);
+ break;
+ case "UrlSchemeOverrides":
+ o.UrlSchemeOverrides = ReadAceUrlSchemeOverrides(xr);
+ break;
+ case "SearchKeyFiles":
+ o.SearchKeyFiles = ReadBoolean(xr);
+ break;
+ case "SearchKeyFilesOnRemovableMedia":
+ o.SearchKeyFilesOnRemovableMedia = ReadBoolean(xr);
+ break;
+ case "LimitToSingleInstance":
+ o.LimitToSingleInstance = ReadBoolean(xr);
+ break;
+ case "AutoTypeMatchByTitle":
+ o.AutoTypeMatchByTitle = ReadBoolean(xr);
+ break;
+ case "AutoTypeMatchByUrlInTitle":
+ o.AutoTypeMatchByUrlInTitle = ReadBoolean(xr);
+ break;
+ case "AutoTypeMatchByUrlHostInTitle":
+ o.AutoTypeMatchByUrlHostInTitle = ReadBoolean(xr);
+ break;
+ case "AutoTypeMatchByTagInTitle":
+ o.AutoTypeMatchByTagInTitle = ReadBoolean(xr);
+ break;
+ case "AutoTypePrependInitSequenceForIE":
+ o.AutoTypePrependInitSequenceForIE = ReadBoolean(xr);
+ break;
+ case "AutoTypeReleaseAltWithKeyPress":
+ o.AutoTypeReleaseAltWithKeyPress = ReadBoolean(xr);
+ break;
+ case "AutoTypeAdjustKeyboardLayout":
+ o.AutoTypeAdjustKeyboardLayout = ReadBoolean(xr);
+ break;
+ case "AutoTypeCancelOnWindowChange":
+ o.AutoTypeCancelOnWindowChange = ReadBoolean(xr);
+ break;
+ case "ProxyType":
+ o.ProxyType = ReadProxyServerType(xr);
+ break;
+ case "ProxyAddress":
+ o.ProxyAddress = ReadString(xr);
+ break;
+ case "ProxyPort":
+ o.ProxyPort = ReadString(xr);
+ break;
+ case "ProxyUserName":
+ o.ProxyUserName = ReadString(xr);
+ break;
+ case "ProxyPassword":
+ o.ProxyPassword = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceKvp[] ReadArrayOfAceKvp(XmlReader xr)
+ {
+ List<KeePass.App.Configuration.AceKvp> l = new List<KeePass.App.Configuration.AceKvp>();
+
+ if(SkipEmptyElement(xr)) return l.ToArray();
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePass.App.Configuration.AceKvp oElem = ReadAceKvp(xr);
+ l.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return l.ToArray();
+ }
+
+ private static KeePassLib.Translation.KPTranslationProperties ReadKPTranslationProperties(XmlReader xr)
+ {
+ KeePassLib.Translation.KPTranslationProperties o = new KeePassLib.Translation.KPTranslationProperties();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Application":
+ o.Application = ReadString(xr);
+ break;
+ case "ApplicationVersion":
+ o.ApplicationVersion = ReadString(xr);
+ break;
+ case "NameEnglish":
+ o.NameEnglish = ReadString(xr);
+ break;
+ case "NameNative":
+ o.NameNative = ReadString(xr);
+ break;
+ case "Iso6391Code":
+ o.Iso6391Code = ReadString(xr);
+ break;
+ case "RightToLeft":
+ o.RightToLeft = ReadBoolean(xr);
+ break;
+ case "AuthorName":
+ o.AuthorName = ReadString(xr);
+ break;
+ case "AuthorContact":
+ o.AuthorContact = ReadString(xr);
+ break;
+ case "Generator":
+ o.Generator = ReadString(xr);
+ break;
+ case "FileUuid":
+ o.FileUuid = ReadString(xr);
+ break;
+ case "LastModified":
+ o.LastModified = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Collections.Generic.List<KeePassLib.Translation.KPStringTable> ReadListOfKPStringTable(XmlReader xr)
+ {
+ System.Collections.Generic.List<KeePassLib.Translation.KPStringTable> o = new System.Collections.Generic.List<KeePassLib.Translation.KPStringTable>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePassLib.Translation.KPStringTable oElem = ReadKPStringTable(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Collections.Generic.List<KeePassLib.Translation.KPFormCustomization> ReadListOfKPFormCustomization(XmlReader xr)
+ {
+ System.Collections.Generic.List<KeePassLib.Translation.KPFormCustomization> o = new System.Collections.Generic.List<KeePassLib.Translation.KPFormCustomization>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePassLib.Translation.KPFormCustomization oElem = ReadKPFormCustomization(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.String ReadString(XmlReader xr)
+ {
+ return xr.ReadElementString();
+ }
+
+ private static System.Boolean ReadBoolean(XmlReader xr)
+ {
+ string strValue = xr.ReadElementString();
+ return XmlConvert.ToBoolean(strValue);
+ }
+
+ private static KeePassLib.Serialization.IOConnectionInfo ReadIOConnectionInfo(XmlReader xr)
+ {
+ KeePassLib.Serialization.IOConnectionInfo o = new KeePassLib.Serialization.IOConnectionInfo();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Path":
+ o.Path = ReadString(xr);
+ break;
+ case "UserName":
+ o.UserName = ReadString(xr);
+ break;
+ case "Password":
+ o.Password = ReadString(xr);
+ break;
+ case "CredProtMode":
+ o.CredProtMode = ReadIOCredProtMode(xr);
+ break;
+ case "CredSaveMode":
+ o.CredSaveMode = ReadIOCredSaveMode(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceMru ReadAceMru(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceMru o = new KeePass.App.Configuration.AceMru();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "MaxItemCount":
+ o.MaxItemCount = ReadUInt32(xr);
+ break;
+ case "Items":
+ o.Items = ReadListOfIOConnectionInfo(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceStartUp ReadAceStartUp(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceStartUp o = new KeePass.App.Configuration.AceStartUp();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "OpenLastFile":
+ o.OpenLastFile = ReadBoolean(xr);
+ break;
+ case "CheckForUpdate":
+ o.CheckForUpdate = ReadBoolean(xr);
+ break;
+ case "CheckForUpdateConfigured":
+ o.CheckForUpdateConfigured = ReadBoolean(xr);
+ break;
+ case "MinimizedAndLocked":
+ o.MinimizedAndLocked = ReadBoolean(xr);
+ break;
+ case "PluginCacheDeleteOld":
+ o.PluginCacheDeleteOld = ReadBoolean(xr);
+ break;
+ case "PluginCacheClearOnce":
+ o.PluginCacheClearOnce = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceOpenDb ReadAceOpenDb(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceOpenDb o = new KeePass.App.Configuration.AceOpenDb();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "ShowExpiredEntries":
+ o.ShowExpiredEntries = ReadBoolean(xr);
+ break;
+ case "ShowSoonToExpireEntries":
+ o.ShowSoonToExpireEntries = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceCloseDb ReadAceCloseDb(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceCloseDb o = new KeePass.App.Configuration.AceCloseDb();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "AutoSave":
+ o.AutoSave = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.Ecas.EcasTriggerSystem ReadEcasTriggerSystem(XmlReader xr)
+ {
+ KeePass.Ecas.EcasTriggerSystem o = new KeePass.Ecas.EcasTriggerSystem();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Enabled":
+ o.Enabled = ReadBoolean(xr);
+ break;
+ case "Triggers":
+ o.TriggerArrayForSerialization = ReadArrayOfEcasTrigger(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Int32 ReadInt32(XmlReader xr)
+ {
+ string strValue = xr.ReadElementString();
+ return XmlConvert.ToInt32(strValue);
+ }
+
+ private static System.Single ReadSingle(XmlReader xr)
+ {
+ string strValue = xr.ReadElementString();
+ return XmlConvert.ToSingle(strValue);
+ }
+
+ private static Dictionary<string, KeePass.App.Configuration.AceMainWindowLayout> m_dictAceMainWindowLayout = null;
+ private static KeePass.App.Configuration.AceMainWindowLayout ReadAceMainWindowLayout(XmlReader xr)
+ {
+ if(m_dictAceMainWindowLayout == null)
+ {
+ m_dictAceMainWindowLayout = new Dictionary<string, KeePass.App.Configuration.AceMainWindowLayout>();
+ m_dictAceMainWindowLayout["Default"] = KeePass.App.Configuration.AceMainWindowLayout.Default;
+ m_dictAceMainWindowLayout["SideBySide"] = KeePass.App.Configuration.AceMainWindowLayout.SideBySide;
+ }
+
+ string strValue = xr.ReadElementString();
+ KeePass.App.Configuration.AceMainWindowLayout eResult;
+ if(!m_dictAceMainWindowLayout.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static KeePass.App.Configuration.AceToolBar ReadAceToolBar(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceToolBar o = new KeePass.App.Configuration.AceToolBar();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Show":
+ o.Show = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceEntryView ReadAceEntryView(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceEntryView o = new KeePass.App.Configuration.AceEntryView();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Show":
+ o.Show = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceTanView ReadAceTanView(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceTanView o = new KeePass.App.Configuration.AceTanView();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "UseSimpleView":
+ o.UseSimpleView = ReadBoolean(xr);
+ break;
+ case "ShowIndices":
+ o.ShowIndices = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Collections.Generic.List<KeePass.App.Configuration.AceColumn> ReadListOfAceColumn(XmlReader xr)
+ {
+ System.Collections.Generic.List<KeePass.App.Configuration.AceColumn> o = new System.Collections.Generic.List<KeePass.App.Configuration.AceColumn>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePass.App.Configuration.AceColumn oElem = ReadAceColumn(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.UI.ListSorter ReadListSorter(XmlReader xr)
+ {
+ KeePass.UI.ListSorter o = new KeePass.UI.ListSorter();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Column":
+ o.Column = ReadInt32(xr);
+ break;
+ case "Order":
+ o.Order = ReadSortOrder(xr);
+ break;
+ case "CompareNaturally":
+ o.CompareNaturally = ReadBoolean(xr);
+ break;
+ case "CompareTimes":
+ o.CompareTimes = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceTrayIcon ReadAceTrayIcon(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceTrayIcon o = new KeePass.App.Configuration.AceTrayIcon();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "ShowOnlyIfTrayed":
+ o.ShowOnlyIfTrayed = ReadBoolean(xr);
+ break;
+ case "SingleClickDefault":
+ o.SingleClickDefault = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceHiding ReadAceHiding(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceHiding o = new KeePass.App.Configuration.AceHiding();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "SeparateHidingSettings":
+ o.SeparateHidingSettings = ReadBoolean(xr);
+ break;
+ case "HideInEntryWindow":
+ o.HideInEntryWindow = ReadBoolean(xr);
+ break;
+ case "UnhideButtonAlsoUnhidesSource":
+ o.UnhideButtonAlsoUnhidesSource = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceFont ReadAceFont(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceFont o = new KeePass.App.Configuration.AceFont();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Family":
+ o.Family = ReadString(xr);
+ break;
+ case "Size":
+ o.Size = ReadSingle(xr);
+ break;
+ case "GraphicsUnit":
+ o.GraphicsUnit = ReadGraphicsUnit(xr);
+ break;
+ case "Style":
+ o.Style = ReadFontStyle(xr);
+ break;
+ case "OverrideUIDefault":
+ o.OverrideUIDefault = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static Dictionary<string, KeePass.UI.BannerStyle> m_dictBannerStyle = null;
+ private static KeePass.UI.BannerStyle ReadBannerStyle(XmlReader xr)
+ {
+ if(m_dictBannerStyle == null)
+ {
+ m_dictBannerStyle = new Dictionary<string, KeePass.UI.BannerStyle>();
+ m_dictBannerStyle["Default"] = KeePass.UI.BannerStyle.Default;
+ m_dictBannerStyle["WinXPLogin"] = KeePass.UI.BannerStyle.WinXPLogin;
+ m_dictBannerStyle["WinVistaBlack"] = KeePass.UI.BannerStyle.WinVistaBlack;
+ m_dictBannerStyle["KeePassWin32"] = KeePass.UI.BannerStyle.KeePassWin32;
+ m_dictBannerStyle["BlueCarbon"] = KeePass.UI.BannerStyle.BlueCarbon;
+ }
+
+ string strValue = xr.ReadElementString();
+ KeePass.UI.BannerStyle eResult;
+ if(!m_dictBannerStyle.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static System.Int64 ReadInt64(XmlReader xr)
+ {
+ string strValue = xr.ReadElementString();
+ return XmlConvert.ToInt64(strValue);
+ }
+
+ private static System.UInt64 ReadUInt64(XmlReader xr)
+ {
+ string strValue = xr.ReadElementString();
+ return XmlConvert.ToUInt64(strValue);
+ }
+
+ private static KeePass.App.Configuration.AceWorkspaceLocking ReadAceWorkspaceLocking(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceWorkspaceLocking o = new KeePass.App.Configuration.AceWorkspaceLocking();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "LockOnWindowMinimize":
+ o.LockOnWindowMinimize = ReadBoolean(xr);
+ break;
+ case "LockOnSessionSwitch":
+ o.LockOnSessionSwitch = ReadBoolean(xr);
+ break;
+ case "LockOnSuspend":
+ o.LockOnSuspend = ReadBoolean(xr);
+ break;
+ case "LockOnRemoteControlChange":
+ o.LockOnRemoteControlChange = ReadBoolean(xr);
+ break;
+ case "LockAfterTime":
+ o.LockAfterTime = ReadUInt32(xr);
+ break;
+ case "LockAfterGlobalTime":
+ o.LockAfterGlobalTime = ReadUInt32(xr);
+ break;
+ case "ExitInsteadOfLockingAfterTime":
+ o.ExitInsteadOfLockingAfterTime = ReadBoolean(xr);
+ break;
+ case "AlwaysExitInsteadOfLocking":
+ o.AlwaysExitInsteadOfLocking = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.AppPolicyFlags ReadAppPolicyFlags(XmlReader xr)
+ {
+ KeePass.App.AppPolicyFlags o = new KeePass.App.AppPolicyFlags();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Plugins":
+ o.Plugins = ReadBoolean(xr);
+ break;
+ case "Export":
+ o.Export = ReadBoolean(xr);
+ break;
+ case "ExportNoKey":
+ o.ExportNoKey = ReadBoolean(xr);
+ break;
+ case "Import":
+ o.Import = ReadBoolean(xr);
+ break;
+ case "Print":
+ o.Print = ReadBoolean(xr);
+ break;
+ case "PrintNoKey":
+ o.PrintNoKey = ReadBoolean(xr);
+ break;
+ case "NewFile":
+ o.NewFile = ReadBoolean(xr);
+ break;
+ case "SaveFile":
+ o.SaveFile = ReadBoolean(xr);
+ break;
+ case "AutoType":
+ o.AutoType = ReadBoolean(xr);
+ break;
+ case "AutoTypeWithoutContext":
+ o.AutoTypeWithoutContext = ReadBoolean(xr);
+ break;
+ case "CopyToClipboard":
+ o.CopyToClipboard = ReadBoolean(xr);
+ break;
+ case "CopyWholeEntries":
+ o.CopyWholeEntries = ReadBoolean(xr);
+ break;
+ case "DragDrop":
+ o.DragDrop = ReadBoolean(xr);
+ break;
+ case "UnhidePasswords":
+ o.UnhidePasswords = ReadBoolean(xr);
+ break;
+ case "ChangeMasterKey":
+ o.ChangeMasterKey = ReadBoolean(xr);
+ break;
+ case "ChangeMasterKeyNoKey":
+ o.ChangeMasterKeyNoKey = ReadBoolean(xr);
+ break;
+ case "EditTriggers":
+ o.EditTriggers = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceMasterPassword ReadAceMasterPassword(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceMasterPassword o = new KeePass.App.Configuration.AceMasterPassword();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "MinimumLength":
+ o.MinimumLength = ReadUInt32(xr);
+ break;
+ case "MinimumQuality":
+ o.MinimumQuality = ReadUInt32(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePassLib.Cryptography.PasswordGenerator.PwProfile ReadPwProfile(XmlReader xr)
+ {
+ KeePassLib.Cryptography.PasswordGenerator.PwProfile o = new KeePassLib.Cryptography.PasswordGenerator.PwProfile();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Name":
+ o.Name = ReadString(xr);
+ break;
+ case "GeneratorType":
+ o.GeneratorType = ReadPasswordGeneratorType(xr);
+ break;
+ case "CollectUserEntropy":
+ o.CollectUserEntropy = ReadBoolean(xr);
+ break;
+ case "Length":
+ o.Length = ReadUInt32(xr);
+ break;
+ case "CharSetRanges":
+ o.CharSetRanges = ReadString(xr);
+ break;
+ case "CharSetAdditional":
+ o.CharSetAdditional = ReadString(xr);
+ break;
+ case "Pattern":
+ o.Pattern = ReadString(xr);
+ break;
+ case "PatternPermutePassword":
+ o.PatternPermutePassword = ReadBoolean(xr);
+ break;
+ case "ExcludeLookAlike":
+ o.ExcludeLookAlike = ReadBoolean(xr);
+ break;
+ case "NoRepeatingCharacters":
+ o.NoRepeatingCharacters = ReadBoolean(xr);
+ break;
+ case "ExcludeCharacters":
+ o.ExcludeCharacters = ReadString(xr);
+ break;
+ case "CustomAlgorithmUuid":
+ o.CustomAlgorithmUuid = ReadString(xr);
+ break;
+ case "CustomAlgorithmOptions":
+ o.CustomAlgorithmOptions = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Collections.Generic.List<KeePassLib.Cryptography.PasswordGenerator.PwProfile> ReadListOfPwProfile(XmlReader xr)
+ {
+ System.Collections.Generic.List<KeePassLib.Cryptography.PasswordGenerator.PwProfile> o = new System.Collections.Generic.List<KeePassLib.Cryptography.PasswordGenerator.PwProfile>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePassLib.Cryptography.PasswordGenerator.PwProfile oElem = ReadPwProfile(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.UInt32 ReadUInt32(XmlReader xr)
+ {
+ string strValue = xr.ReadElementString();
+ return XmlConvert.ToUInt32(strValue);
+ }
+
+ private static KeePassLib.SearchParameters ReadSearchParameters(XmlReader xr)
+ {
+ KeePassLib.SearchParameters o = new KeePassLib.SearchParameters();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "SearchString":
+ o.SearchString = ReadString(xr);
+ break;
+ case "RegularExpression":
+ o.RegularExpression = ReadBoolean(xr);
+ break;
+ case "SearchInTitles":
+ o.SearchInTitles = ReadBoolean(xr);
+ break;
+ case "SearchInUserNames":
+ o.SearchInUserNames = ReadBoolean(xr);
+ break;
+ case "SearchInPasswords":
+ o.SearchInPasswords = ReadBoolean(xr);
+ break;
+ case "SearchInUrls":
+ o.SearchInUrls = ReadBoolean(xr);
+ break;
+ case "SearchInNotes":
+ o.SearchInNotes = ReadBoolean(xr);
+ break;
+ case "SearchInOther":
+ o.SearchInOther = ReadBoolean(xr);
+ break;
+ case "SearchInUuids":
+ o.SearchInUuids = ReadBoolean(xr);
+ break;
+ case "SearchInGroupNames":
+ o.SearchInGroupNames = ReadBoolean(xr);
+ break;
+ case "SearchInTags":
+ o.SearchInTags = ReadBoolean(xr);
+ break;
+ case "ComparisonMode":
+ o.ComparisonMode = ReadStringComparison(xr);
+ break;
+ case "ExcludeExpired":
+ o.ExcludeExpired = ReadBoolean(xr);
+ break;
+ case "RespectEntrySearchingDisabled":
+ o.RespectEntrySearchingDisabled = ReadBoolean(xr);
+ break;
+ case "DataTransformation":
+ o.DataTransformation = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Collections.Generic.List<KeePass.App.Configuration.AceKeyAssoc> ReadListOfAceKeyAssoc(XmlReader xr)
+ {
+ System.Collections.Generic.List<KeePass.App.Configuration.AceKeyAssoc> o = new System.Collections.Generic.List<KeePass.App.Configuration.AceKeyAssoc>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePass.App.Configuration.AceKeyAssoc oElem = ReadAceKeyAssoc(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.App.Configuration.AceUrlSchemeOverrides ReadAceUrlSchemeOverrides(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceUrlSchemeOverrides o = new KeePass.App.Configuration.AceUrlSchemeOverrides();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "BuiltInOverridesEnabled":
+ o.BuiltInOverridesEnabled = ReadUInt64(xr);
+ break;
+ case "CustomOverrides":
+ o.CustomOverrides = ReadListOfAceUrlSchemeOverride(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static Dictionary<string, KeePassLib.ProxyServerType> m_dictProxyServerType = null;
+ private static KeePassLib.ProxyServerType ReadProxyServerType(XmlReader xr)
+ {
+ if(m_dictProxyServerType == null)
+ {
+ m_dictProxyServerType = new Dictionary<string, KeePassLib.ProxyServerType>();
+ m_dictProxyServerType["None"] = KeePassLib.ProxyServerType.None;
+ m_dictProxyServerType["System"] = KeePassLib.ProxyServerType.System;
+ m_dictProxyServerType["Manual"] = KeePassLib.ProxyServerType.Manual;
+ }
+
+ string strValue = xr.ReadElementString();
+ KeePassLib.ProxyServerType eResult;
+ if(!m_dictProxyServerType.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static KeePass.App.Configuration.AceKvp ReadAceKvp(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceKvp o = new KeePass.App.Configuration.AceKvp();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Key":
+ o.Key = ReadString(xr);
+ break;
+ case "Value":
+ o.Value = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePassLib.Translation.KPStringTable ReadKPStringTable(XmlReader xr)
+ {
+ KeePassLib.Translation.KPStringTable o = new KeePassLib.Translation.KPStringTable();
+
+ while(xr.MoveToNextAttribute())
+ {
+ switch(xr.LocalName)
+ {
+ case "Name":
+ o.Name = xr.Value;
+ break;
+ default:
+ Debug.Assert(false);
+ break;
+ }
+ }
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Strings":
+ o.Strings = ReadListOfKPStringTableItem(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePassLib.Translation.KPFormCustomization ReadKPFormCustomization(XmlReader xr)
+ {
+ KeePassLib.Translation.KPFormCustomization o = new KeePassLib.Translation.KPFormCustomization();
+
+ while(xr.MoveToNextAttribute())
+ {
+ switch(xr.LocalName)
+ {
+ case "FullName":
+ o.FullName = xr.Value;
+ break;
+ default:
+ Debug.Assert(false);
+ break;
+ }
+ }
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Window":
+ o.Window = ReadKPControlCustomization(xr);
+ break;
+ case "ChildControls":
+ o.Controls = ReadListOfKPControlCustomization(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static Dictionary<string, KeePassLib.Serialization.IOCredProtMode> m_dictIOCredProtMode = null;
+ private static KeePassLib.Serialization.IOCredProtMode ReadIOCredProtMode(XmlReader xr)
+ {
+ if(m_dictIOCredProtMode == null)
+ {
+ m_dictIOCredProtMode = new Dictionary<string, KeePassLib.Serialization.IOCredProtMode>();
+ m_dictIOCredProtMode["None"] = KeePassLib.Serialization.IOCredProtMode.None;
+ m_dictIOCredProtMode["Obf"] = KeePassLib.Serialization.IOCredProtMode.Obf;
+ }
+
+ string strValue = xr.ReadElementString();
+ KeePassLib.Serialization.IOCredProtMode eResult;
+ if(!m_dictIOCredProtMode.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static Dictionary<string, KeePassLib.Serialization.IOCredSaveMode> m_dictIOCredSaveMode = null;
+ private static KeePassLib.Serialization.IOCredSaveMode ReadIOCredSaveMode(XmlReader xr)
+ {
+ if(m_dictIOCredSaveMode == null)
+ {
+ m_dictIOCredSaveMode = new Dictionary<string, KeePassLib.Serialization.IOCredSaveMode>();
+ m_dictIOCredSaveMode["NoSave"] = KeePassLib.Serialization.IOCredSaveMode.NoSave;
+ m_dictIOCredSaveMode["UserNameOnly"] = KeePassLib.Serialization.IOCredSaveMode.UserNameOnly;
+ m_dictIOCredSaveMode["SaveCred"] = KeePassLib.Serialization.IOCredSaveMode.SaveCred;
+ }
+
+ string strValue = xr.ReadElementString();
+ KeePassLib.Serialization.IOCredSaveMode eResult;
+ if(!m_dictIOCredSaveMode.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static System.Collections.Generic.List<KeePassLib.Serialization.IOConnectionInfo> ReadListOfIOConnectionInfo(XmlReader xr)
+ {
+ System.Collections.Generic.List<KeePassLib.Serialization.IOConnectionInfo> o = new System.Collections.Generic.List<KeePassLib.Serialization.IOConnectionInfo>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePassLib.Serialization.IOConnectionInfo oElem = ReadIOConnectionInfo(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.Ecas.EcasTrigger[] ReadArrayOfEcasTrigger(XmlReader xr)
+ {
+ List<KeePass.Ecas.EcasTrigger> l = new List<KeePass.Ecas.EcasTrigger>();
+
+ if(SkipEmptyElement(xr)) return l.ToArray();
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePass.Ecas.EcasTrigger oElem = ReadEcasTrigger(xr);
+ l.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return l.ToArray();
+ }
+
+ private static KeePass.App.Configuration.AceColumn ReadAceColumn(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceColumn o = new KeePass.App.Configuration.AceColumn();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Type":
+ o.Type = ReadAceColumnType(xr);
+ break;
+ case "CustomName":
+ o.CustomName = ReadString(xr);
+ break;
+ case "Width":
+ o.Width = ReadInt32(xr);
+ break;
+ case "HideWithAsterisks":
+ o.HideWithAsterisks = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static Dictionary<string, System.Windows.Forms.SortOrder> m_dictSortOrder = null;
+ private static System.Windows.Forms.SortOrder ReadSortOrder(XmlReader xr)
+ {
+ if(m_dictSortOrder == null)
+ {
+ m_dictSortOrder = new Dictionary<string, System.Windows.Forms.SortOrder>();
+ m_dictSortOrder["None"] = System.Windows.Forms.SortOrder.None;
+ m_dictSortOrder["Ascending"] = System.Windows.Forms.SortOrder.Ascending;
+ m_dictSortOrder["Descending"] = System.Windows.Forms.SortOrder.Descending;
+ }
+
+ string strValue = xr.ReadElementString();
+ System.Windows.Forms.SortOrder eResult;
+ if(!m_dictSortOrder.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static Dictionary<string, System.Drawing.GraphicsUnit> m_dictGraphicsUnit = null;
+ private static System.Drawing.GraphicsUnit ReadGraphicsUnit(XmlReader xr)
+ {
+ if(m_dictGraphicsUnit == null)
+ {
+ m_dictGraphicsUnit = new Dictionary<string, System.Drawing.GraphicsUnit>();
+ m_dictGraphicsUnit["World"] = System.Drawing.GraphicsUnit.World;
+ m_dictGraphicsUnit["Display"] = System.Drawing.GraphicsUnit.Display;
+ m_dictGraphicsUnit["Pixel"] = System.Drawing.GraphicsUnit.Pixel;
+ m_dictGraphicsUnit["Point"] = System.Drawing.GraphicsUnit.Point;
+ m_dictGraphicsUnit["Inch"] = System.Drawing.GraphicsUnit.Inch;
+ m_dictGraphicsUnit["Document"] = System.Drawing.GraphicsUnit.Document;
+ m_dictGraphicsUnit["Millimeter"] = System.Drawing.GraphicsUnit.Millimeter;
+ }
+
+ string strValue = xr.ReadElementString();
+ System.Drawing.GraphicsUnit eResult;
+ if(!m_dictGraphicsUnit.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static Dictionary<string, System.Drawing.FontStyle> m_dictFontStyle = null;
+ private static System.Drawing.FontStyle ReadFontStyle(XmlReader xr)
+ {
+ if(m_dictFontStyle == null)
+ {
+ m_dictFontStyle = new Dictionary<string, System.Drawing.FontStyle>();
+ m_dictFontStyle["Regular"] = System.Drawing.FontStyle.Regular;
+ m_dictFontStyle["Bold"] = System.Drawing.FontStyle.Bold;
+ m_dictFontStyle["Italic"] = System.Drawing.FontStyle.Italic;
+ m_dictFontStyle["Underline"] = System.Drawing.FontStyle.Underline;
+ m_dictFontStyle["Strikeout"] = System.Drawing.FontStyle.Strikeout;
+ }
+
+ string strValue = xr.ReadElementString();
+ System.Drawing.FontStyle eResult = (System.Drawing.FontStyle)0;
+ string[] vValues = strValue.Split(m_vEnumSeps, StringSplitOptions.RemoveEmptyEntries);
+ foreach(string strPart in vValues)
+ {
+ System.Drawing.FontStyle ePart;
+ if(m_dictFontStyle.TryGetValue(strPart, out ePart))
+ eResult |= ePart;
+ else { Debug.Assert(false); }
+ }
+ return eResult;
+ }
+
+ private static Dictionary<string, KeePassLib.Cryptography.PasswordGenerator.PasswordGeneratorType> m_dictPasswordGeneratorType = null;
+ private static KeePassLib.Cryptography.PasswordGenerator.PasswordGeneratorType ReadPasswordGeneratorType(XmlReader xr)
+ {
+ if(m_dictPasswordGeneratorType == null)
+ {
+ m_dictPasswordGeneratorType = new Dictionary<string, KeePassLib.Cryptography.PasswordGenerator.PasswordGeneratorType>();
+ m_dictPasswordGeneratorType["CharSet"] = KeePassLib.Cryptography.PasswordGenerator.PasswordGeneratorType.CharSet;
+ m_dictPasswordGeneratorType["Pattern"] = KeePassLib.Cryptography.PasswordGenerator.PasswordGeneratorType.Pattern;
+ m_dictPasswordGeneratorType["Custom"] = KeePassLib.Cryptography.PasswordGenerator.PasswordGeneratorType.Custom;
+ }
+
+ string strValue = xr.ReadElementString();
+ KeePassLib.Cryptography.PasswordGenerator.PasswordGeneratorType eResult;
+ if(!m_dictPasswordGeneratorType.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static Dictionary<string, System.StringComparison> m_dictStringComparison = null;
+ private static System.StringComparison ReadStringComparison(XmlReader xr)
+ {
+ if(m_dictStringComparison == null)
+ {
+ m_dictStringComparison = new Dictionary<string, System.StringComparison>();
+ m_dictStringComparison["CurrentCulture"] = System.StringComparison.CurrentCulture;
+ m_dictStringComparison["CurrentCultureIgnoreCase"] = System.StringComparison.CurrentCultureIgnoreCase;
+ m_dictStringComparison["InvariantCulture"] = System.StringComparison.InvariantCulture;
+ m_dictStringComparison["InvariantCultureIgnoreCase"] = System.StringComparison.InvariantCultureIgnoreCase;
+ m_dictStringComparison["Ordinal"] = System.StringComparison.Ordinal;
+ m_dictStringComparison["OrdinalIgnoreCase"] = System.StringComparison.OrdinalIgnoreCase;
+ }
+
+ string strValue = xr.ReadElementString();
+ System.StringComparison eResult;
+ if(!m_dictStringComparison.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static KeePass.App.Configuration.AceKeyAssoc ReadAceKeyAssoc(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceKeyAssoc o = new KeePass.App.Configuration.AceKeyAssoc();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "DatabasePath":
+ o.DatabasePath = ReadString(xr);
+ break;
+ case "KeyFilePath":
+ o.KeyFilePath = ReadString(xr);
+ break;
+ case "KeyProvider":
+ o.KeyProvider = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Collections.Generic.List<KeePass.App.Configuration.AceUrlSchemeOverride> ReadListOfAceUrlSchemeOverride(XmlReader xr)
+ {
+ System.Collections.Generic.List<KeePass.App.Configuration.AceUrlSchemeOverride> o = new System.Collections.Generic.List<KeePass.App.Configuration.AceUrlSchemeOverride>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePass.App.Configuration.AceUrlSchemeOverride oElem = ReadAceUrlSchemeOverride(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Collections.Generic.List<KeePassLib.Translation.KPStringTableItem> ReadListOfKPStringTableItem(XmlReader xr)
+ {
+ System.Collections.Generic.List<KeePassLib.Translation.KPStringTableItem> o = new System.Collections.Generic.List<KeePassLib.Translation.KPStringTableItem>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePassLib.Translation.KPStringTableItem oElem = ReadKPStringTableItem(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePassLib.Translation.KPControlCustomization ReadKPControlCustomization(XmlReader xr)
+ {
+ KeePassLib.Translation.KPControlCustomization o = new KeePassLib.Translation.KPControlCustomization();
+
+ while(xr.MoveToNextAttribute())
+ {
+ switch(xr.LocalName)
+ {
+ case "Name":
+ o.Name = xr.Value;
+ break;
+ case "BaseHash":
+ o.BaseHash = xr.Value;
+ break;
+ default:
+ Debug.Assert(false);
+ break;
+ }
+ }
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Text":
+ o.Text = ReadString(xr);
+ break;
+ case "Layout":
+ o.Layout = ReadKpccLayout(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Collections.Generic.List<KeePassLib.Translation.KPControlCustomization> ReadListOfKPControlCustomization(XmlReader xr)
+ {
+ System.Collections.Generic.List<KeePassLib.Translation.KPControlCustomization> o = new System.Collections.Generic.List<KeePassLib.Translation.KPControlCustomization>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePassLib.Translation.KPControlCustomization oElem = ReadKPControlCustomization(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.Ecas.EcasTrigger ReadEcasTrigger(XmlReader xr)
+ {
+ KeePass.Ecas.EcasTrigger o = new KeePass.Ecas.EcasTrigger();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Guid":
+ o.UuidString = ReadString(xr);
+ break;
+ case "Name":
+ o.Name = ReadString(xr);
+ break;
+ case "Comments":
+ o.Comments = ReadString(xr);
+ break;
+ case "Enabled":
+ o.Enabled = ReadBoolean(xr);
+ break;
+ case "InitiallyOn":
+ o.InitiallyOn = ReadBoolean(xr);
+ break;
+ case "TurnOffAfterAction":
+ o.TurnOffAfterAction = ReadBoolean(xr);
+ break;
+ case "Events":
+ o.EventArrayForSerialization = ReadArrayOfEcasEvent(xr);
+ break;
+ case "Conditions":
+ o.ConditionsArrayForSerialization = ReadArrayOfEcasCondition(xr);
+ break;
+ case "Actions":
+ o.ActionArrayForSerialization = ReadArrayOfEcasAction(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static Dictionary<string, KeePass.App.Configuration.AceColumnType> m_dictAceColumnType = null;
+ private static KeePass.App.Configuration.AceColumnType ReadAceColumnType(XmlReader xr)
+ {
+ if(m_dictAceColumnType == null)
+ {
+ m_dictAceColumnType = new Dictionary<string, KeePass.App.Configuration.AceColumnType>();
+ m_dictAceColumnType["Title"] = KeePass.App.Configuration.AceColumnType.Title;
+ m_dictAceColumnType["UserName"] = KeePass.App.Configuration.AceColumnType.UserName;
+ m_dictAceColumnType["Password"] = KeePass.App.Configuration.AceColumnType.Password;
+ m_dictAceColumnType["Url"] = KeePass.App.Configuration.AceColumnType.Url;
+ m_dictAceColumnType["Notes"] = KeePass.App.Configuration.AceColumnType.Notes;
+ m_dictAceColumnType["CreationTime"] = KeePass.App.Configuration.AceColumnType.CreationTime;
+ m_dictAceColumnType["LastAccessTime"] = KeePass.App.Configuration.AceColumnType.LastAccessTime;
+ m_dictAceColumnType["LastModificationTime"] = KeePass.App.Configuration.AceColumnType.LastModificationTime;
+ m_dictAceColumnType["ExpiryTime"] = KeePass.App.Configuration.AceColumnType.ExpiryTime;
+ m_dictAceColumnType["Uuid"] = KeePass.App.Configuration.AceColumnType.Uuid;
+ m_dictAceColumnType["Attachment"] = KeePass.App.Configuration.AceColumnType.Attachment;
+ m_dictAceColumnType["CustomString"] = KeePass.App.Configuration.AceColumnType.CustomString;
+ m_dictAceColumnType["PluginExt"] = KeePass.App.Configuration.AceColumnType.PluginExt;
+ m_dictAceColumnType["OverrideUrl"] = KeePass.App.Configuration.AceColumnType.OverrideUrl;
+ m_dictAceColumnType["Tags"] = KeePass.App.Configuration.AceColumnType.Tags;
+ m_dictAceColumnType["ExpiryTimeDateOnly"] = KeePass.App.Configuration.AceColumnType.ExpiryTimeDateOnly;
+ m_dictAceColumnType["Size"] = KeePass.App.Configuration.AceColumnType.Size;
+ m_dictAceColumnType["HistoryCount"] = KeePass.App.Configuration.AceColumnType.HistoryCount;
+ m_dictAceColumnType["Count"] = KeePass.App.Configuration.AceColumnType.Count;
+ }
+
+ string strValue = xr.ReadElementString();
+ KeePass.App.Configuration.AceColumnType eResult;
+ if(!m_dictAceColumnType.TryGetValue(strValue, out eResult))
+ { Debug.Assert(false); }
+ return eResult;
+ }
+
+ private static KeePass.App.Configuration.AceUrlSchemeOverride ReadAceUrlSchemeOverride(XmlReader xr)
+ {
+ KeePass.App.Configuration.AceUrlSchemeOverride o = new KeePass.App.Configuration.AceUrlSchemeOverride();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Enabled":
+ o.Enabled = ReadBoolean(xr);
+ break;
+ case "Scheme":
+ o.Scheme = ReadString(xr);
+ break;
+ case "UrlOverride":
+ o.UrlOverride = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePassLib.Translation.KPStringTableItem ReadKPStringTableItem(XmlReader xr)
+ {
+ KeePassLib.Translation.KPStringTableItem o = new KeePassLib.Translation.KPStringTableItem();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "Name":
+ o.Name = ReadString(xr);
+ break;
+ case "Value":
+ o.Value = ReadString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePassLib.Translation.KpccLayout ReadKpccLayout(XmlReader xr)
+ {
+ KeePassLib.Translation.KpccLayout o = new KeePassLib.Translation.KpccLayout();
+
+ while(xr.MoveToNextAttribute())
+ {
+ switch(xr.LocalName)
+ {
+ case "X":
+ o.X = xr.Value;
+ break;
+ case "Y":
+ o.Y = xr.Value;
+ break;
+ case "Width":
+ o.Width = xr.Value;
+ break;
+ case "Height":
+ o.Height = xr.Value;
+ break;
+ default:
+ Debug.Assert(false);
+ break;
+ }
+ }
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ Debug.Assert(false);
+ xr.Skip();
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.Ecas.EcasEvent[] ReadArrayOfEcasEvent(XmlReader xr)
+ {
+ List<KeePass.Ecas.EcasEvent> l = new List<KeePass.Ecas.EcasEvent>();
+
+ if(SkipEmptyElement(xr)) return l.ToArray();
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePass.Ecas.EcasEvent oElem = ReadEcasEvent(xr);
+ l.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return l.ToArray();
+ }
+
+ private static KeePass.Ecas.EcasCondition[] ReadArrayOfEcasCondition(XmlReader xr)
+ {
+ List<KeePass.Ecas.EcasCondition> l = new List<KeePass.Ecas.EcasCondition>();
+
+ if(SkipEmptyElement(xr)) return l.ToArray();
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePass.Ecas.EcasCondition oElem = ReadEcasCondition(xr);
+ l.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return l.ToArray();
+ }
+
+ private static KeePass.Ecas.EcasAction[] ReadArrayOfEcasAction(XmlReader xr)
+ {
+ List<KeePass.Ecas.EcasAction> l = new List<KeePass.Ecas.EcasAction>();
+
+ if(SkipEmptyElement(xr)) return l.ToArray();
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ KeePass.Ecas.EcasAction oElem = ReadEcasAction(xr);
+ l.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return l.ToArray();
+ }
+
+ private static KeePass.Ecas.EcasEvent ReadEcasEvent(XmlReader xr)
+ {
+ KeePass.Ecas.EcasEvent o = new KeePass.Ecas.EcasEvent();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "TypeGuid":
+ o.TypeString = ReadString(xr);
+ break;
+ case "Parameters":
+ o.Parameters = ReadListOfString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.Ecas.EcasCondition ReadEcasCondition(XmlReader xr)
+ {
+ KeePass.Ecas.EcasCondition o = new KeePass.Ecas.EcasCondition();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "TypeGuid":
+ o.TypeString = ReadString(xr);
+ break;
+ case "Parameters":
+ o.Parameters = ReadListOfString(xr);
+ break;
+ case "Negate":
+ o.Negate = ReadBoolean(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static KeePass.Ecas.EcasAction ReadEcasAction(XmlReader xr)
+ {
+ KeePass.Ecas.EcasAction o = new KeePass.Ecas.EcasAction();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ switch(xr.LocalName)
+ {
+ case "TypeGuid":
+ o.TypeString = ReadString(xr);
+ break;
+ case "Parameters":
+ o.Parameters = ReadListOfString(xr);
+ break;
+ default:
+ Debug.Assert(false);
+ xr.Skip();
+ break;
+ }
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+
+ private static System.Collections.Generic.List<System.String> ReadListOfString(XmlReader xr)
+ {
+ System.Collections.Generic.List<System.String> o = new System.Collections.Generic.List<System.String>();
+
+ if(SkipEmptyElement(xr)) return o;
+
+ Debug.Assert(xr.NodeType == XmlNodeType.Element);
+ xr.ReadStartElement();
+ xr.MoveToContent();
+
+ while(true)
+ {
+ XmlNodeType nt = xr.NodeType;
+ if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;
+ if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }
+
+ System.String oElem = ReadString(xr);
+ o.Add(oElem);
+
+ xr.MoveToContent();
+ }
+
+ Debug.Assert(xr.NodeType == XmlNodeType.EndElement);
+ xr.ReadEndElement();
+ return o;
+ }
+ }
+}
diff --git a/KeePass/Util/XmlSerialization/XmlSerializerEx.cs b/KeePass/Util/XmlSerialization/XmlSerializerEx.cs
new file mode 100644
index 0000000..71835be
--- /dev/null
+++ b/KeePass/Util/XmlSerialization/XmlSerializerEx.cs
@@ -0,0 +1,558 @@
+/*
+ KeePass Password Safe - The Open-Source Password Manager
+ Copyright (C) 2003-2012 Dominik Reichl <dominik.reichl at t-online.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Xml;
+using System.Xml.Serialization;
+using System.Reflection;
+using System.Diagnostics;
+
+using KeePass.App.Configuration;
+
+using KeePassLib.Interfaces;
+using KeePassLib.Serialization;
+using KeePassLib.Translation;
+using KeePassLib.Utility;
+
+namespace KeePass.Util.XmlSerialization
+{
+ public sealed partial class XmlSerializerEx : IXmlSerializerEx
+ {
+ private readonly Type m_t;
+
+ public XmlSerializerEx(Type t)
+ {
+ m_t = t;
+ }
+
+ // AppConfigEx with KeePass.XmlSerializers.dll: 811 ms
+ // AppConfigEx with own deserializer: 312 ms
+ /* public object Deserialize(Stream s)
+ {
+ int tStart = Environment.TickCount;
+ object o = Deserialize_(s);
+ MessageService.ShowInfo(Environment.TickCount - tStart);
+ return o;
+ } */
+
+ public object Deserialize(Stream s)
+ {
+ object oResult = null;
+ if((m_t == typeof(AppConfigEx)) || (m_t == typeof(KPTranslation)))
+ {
+ XmlReaderSettings xrs = Kdb4File.CreateStdXmlReaderSettings();
+ XmlReader xr = XmlReader.Create(s, xrs);
+
+ string strRootName = GetXmlName(m_t);
+ bool bRootFound = SkipToRoot(xr, strRootName);
+
+ if(!bRootFound) { Debug.Assert(false); }
+ else if(m_t == typeof(AppConfigEx))
+ oResult = ReadAppConfigEx(xr);
+ else if(m_t == typeof(KPTranslation))
+ oResult = ReadKPTranslation(xr);
+ else { Debug.Assert(false); } // See top-level 'if'
+
+ xr.Close();
+ }
+ if(oResult != null) return oResult;
+
+ XmlSerializer xs = new XmlSerializer(m_t);
+ return xs.Deserialize(s);
+ }
+
+ private static bool SkipToRoot(XmlReader xr, string strRootName)
+ {
+ xr.Read(); // Initialize reader
+
+ bool bRootFound = false;
+ while(true)
+ {
+ if((xr.NodeType == XmlNodeType.Document) ||
+ (xr.NodeType == XmlNodeType.DocumentFragment) ||
+ (xr.NodeType == XmlNodeType.Element))
+ {
+ if(xr.Name == strRootName) { bRootFound = true; break; }
+ xr.Skip();
+ }
+ else if(!xr.Read()) { Debug.Assert(false); break; }
+ }
+
+ return bRootFound;
+ }
+
+ public void Serialize(XmlWriter xmlWriter, object o)
+ {
+ XmlSerializer xs = new XmlSerializer(m_t);
+ xs.Serialize(xmlWriter, o);
+ }
+
+ internal static T GetAttribute<T>(object[] vAttribs)
+ where T : Attribute
+ {
+ if(vAttribs == null) { Debug.Assert(false); return null; }
+
+ foreach(object o in vAttribs)
+ {
+ if(o == null) { Debug.Assert(false); continue; }
+ if(o.GetType() == typeof(T)) return (o as T);
+ }
+
+ return null;
+ }
+
+ internal static string GetXmlName(MemberInfo mi)
+ {
+ object[] vAttribs = mi.GetCustomAttributes(true);
+ string strXmlName = mi.Name;
+
+ XmlTypeAttribute xmlType = GetAttribute<XmlTypeAttribute>(vAttribs);
+ if(xmlType != null) strXmlName = xmlType.TypeName;
+ XmlRootAttribute xmlRoot = GetAttribute<XmlRootAttribute>(vAttribs);
+ if(xmlRoot != null) strXmlName = xmlRoot.ElementName;
+ XmlArrayAttribute xmlArray = GetAttribute<XmlArrayAttribute>(vAttribs);
+ if(xmlArray != null) strXmlName = xmlArray.ElementName;
+ XmlElementAttribute xmlElement = GetAttribute<XmlElementAttribute>(vAttribs);
+ if(xmlElement != null) strXmlName = xmlElement.ElementName;
+
+ return strXmlName;
+ }
+
+ private sealed class XmlsTypeInfo
+ {
+ public bool HasInfo { get { return (m_strReadCode.Length > 0); } }
+
+ private readonly Type m_t;
+ public Type Type { get { return m_t; } }
+
+ private readonly string m_strReadCode;
+ public string ReadCode { get { return m_strReadCode; } }
+
+ // private readonly string m_strWriteCode;
+ // public string WriteCode { get { return m_strWriteCode; } }
+
+ public XmlsTypeInfo(Type t)
+ {
+ m_t = t;
+ m_strReadCode = string.Empty;
+ // m_strWriteCode = string.Empty;
+ }
+
+ public XmlsTypeInfo(Type t, string strReadCode, string strWriteCode)
+ {
+ m_t = t;
+ m_strReadCode = (strReadCode ?? string.Empty);
+ // m_strWriteCode = (strWriteCode ?? string.Empty);
+ }
+ }
+
+ internal static void GenerateSerializers(CommandLineArgs cl)
+ {
+ StringBuilder sb = new StringBuilder();
+ int t = 0;
+
+ AppendLine(sb, "// This is a generated file!", ref t);
+ AppendLine(sb, "// Do not edit manually, changes will be overwritten.", ref t);
+ AppendLine(sb);
+ AppendLine(sb, "using System;", ref t);
+ AppendLine(sb, "using System.Collections.Generic;", ref t);
+ AppendLine(sb, "using System.Xml;", ref t);
+ AppendLine(sb, "using System.Diagnostics;", ref t);
+ AppendLine(sb);
+ AppendLine(sb, "using KeePassLib.Interfaces;", ref t);
+ AppendLine(sb);
+ AppendLine(sb, "namespace KeePass.Util.XmlSerialization", ref t);
+ AppendLine(sb, "{", ref t, 0, 1);
+ AppendLine(sb, "public sealed partial class XmlSerializerEx : IXmlSerializerEx", ref t);
+ AppendLine(sb, "{", ref t, 0, 1);
+ AppendLine(sb, "private static char[] m_vEnumSeps = new char[] {", ref t, 0, 1);
+ AppendLine(sb, "' ', '\\t', '\\r', '\\n', '|', ',', ';', ':'", ref t);
+ AppendLine(sb, "};", ref t, -1, 0);
+
+ Dictionary<string, XmlsTypeInfo> d =
+ new Dictionary<string, XmlsTypeInfo>();
+ d[typeof(AppConfigEx).FullName] = new XmlsTypeInfo(typeof(AppConfigEx));
+ d[typeof(KPTranslation).FullName] = new XmlsTypeInfo(typeof(KPTranslation));
+
+ bool bTypeCreated = true;
+ while(bTypeCreated)
+ {
+ bTypeCreated = false;
+ foreach(KeyValuePair<string, XmlsTypeInfo> kvp in d)
+ {
+ if(!kvp.Value.HasInfo)
+ {
+ d[kvp.Key] = GenerateSerializer(kvp.Value.Type, d, t);
+ bTypeCreated = true;
+ break; // Iterator might be invalid
+ }
+ }
+ }
+
+ foreach(KeyValuePair<string, XmlsTypeInfo> kvp in d)
+ {
+ AppendLine(sb);
+ sb.Append(kvp.Value.ReadCode);
+ }
+
+ AppendLine(sb, "}", ref t, -1, 0);
+ AppendLine(sb, "}", ref t, -1, 0);
+ Debug.Assert(t == 0);
+
+ string strFileData = StrUtil.NormalizeNewLines(sb.ToString(), true);
+
+ string strFile = cl["out"];
+ if(!string.IsNullOrEmpty(strFile))
+ {
+ strFile = UrlUtil.MakeAbsolutePath(WinUtil.GetExecutable(), strFile);
+ File.WriteAllText(strFile, strFileData, StrUtil.Utf8);
+ MessageService.ShowInfo("Saved XmlSerializerEx to:", strFile);
+ }
+ }
+
+ private static bool IsXmlConvertibleType(Type t)
+ {
+ return ((t == typeof(Boolean)) || (t == typeof(Byte)) ||
+ (t == typeof(Char)) || (t == typeof(DateTime)) ||
+ (t == typeof(DateTimeOffset)) || (t == typeof(Decimal)) ||
+ (t == typeof(Double)) || (t == typeof(Guid)) ||
+ (t == typeof(Int16)) || (t == typeof(Int32)) ||
+ (t == typeof(Int64)) || (t == typeof(SByte)) ||
+ (t == typeof(Single)) || (t == typeof(TimeSpan)) ||
+ (t == typeof(UInt16)) || (t == typeof(UInt32)) ||
+ (t == typeof(UInt64)));
+ }
+
+ private static void Append(StringBuilder sb, string strAppend,
+ ref int iIndent, int iIndentChangePre, int iIndentChangePost)
+ {
+ iIndent += iIndentChangePre;
+ Debug.Assert(iIndent >= 0);
+ sb.Append(new string('\t', Math.Max(iIndent, 0)));
+ sb.Append(strAppend);
+ iIndent += iIndentChangePost;
+ }
+
+ private static void AppendLine(StringBuilder sb)
+ {
+ sb.AppendLine();
+ }
+
+ private static void AppendLine(StringBuilder sb, string strAppend,
+ ref int iIndent)
+ {
+ AppendLine(sb, strAppend, ref iIndent, 0, 0);
+ }
+
+ private static void AppendLine(StringBuilder sb, string strAppend,
+ ref int iIndent, int iIndentChangePre, int iIndentChangePost)
+ {
+ Append(sb, strAppend + MessageService.NewLine, ref iIndent,
+ iIndentChangePre, iIndentChangePost);
+ }
+
+ internal static string GetFullTypeNameCS(Type t, out string strPrimarySubType)
+ {
+ string str = t.FullName;
+
+ if(str.StartsWith(@"System.Collections.Generic.List`1"))
+ {
+ int iElemTypeOffset = str.IndexOf("[[");
+ int iElemTypeEnd = str.IndexOfAny(new char[] {
+ ',', ' ', '\t', '\r', '\n', ';', ':', ']' }, iElemTypeOffset);
+ strPrimarySubType = str.Substring(iElemTypeOffset + 2,
+ iElemTypeEnd - iElemTypeOffset - 2);
+
+ str = "System.Collections.Generic.List<" + strPrimarySubType + ">";
+ }
+ else if(str.EndsWith("[]"))
+ strPrimarySubType = str.Substring(0, str.Length - 2);
+ else strPrimarySubType = null;
+
+ return str;
+ }
+
+ internal static string GetTypeDesc(string strFullTypeNameCS)
+ {
+ string str = strFullTypeNameCS;
+
+ int iBackOffset = str.IndexOf('<');
+ if(iBackOffset < 0) iBackOffset = str.Length - 1;
+
+ int i = str.LastIndexOf('.', iBackOffset);
+ if(i >= 0) str = str.Substring(i + 1);
+
+ if(str.StartsWith("List<"))
+ {
+ string strSubType = str.Substring(5, str.Length - 6);
+ return "ListOf" + GetTypeDesc(strSubType);
+ }
+ if(str.EndsWith("[]"))
+ {
+ string strSubType = str.Substring(0, str.Length - 2);
+ return "ArrayOf" + GetTypeDesc(strSubType);
+ }
+
+ Debug.Assert(str.IndexOfAny(new char[] { '<', '>', '[', ']',
+ '`', ':', ' ', '\t', '\r', '\n' }) < 0);
+ return str;
+ }
+
+ internal static bool TypeIsList(string strTypeFullCS)
+ {
+ return strTypeFullCS.StartsWith("System.Collections.Generic.List<");
+ }
+
+ internal static bool TypeIsArray(string strTypeFullCS)
+ {
+ return strTypeFullCS.EndsWith("[]");
+ }
+
+ private static XmlsTypeInfo GenerateSerializer(Type t,
+ Dictionary<string, XmlsTypeInfo> dTypes, int iIndent)
+ {
+ StringBuilder sbr = new StringBuilder();
+ StringBuilder sbw = new StringBuilder();
+
+ string strSubTypeFull;
+ string strTypeFull = GetFullTypeNameCS(t, out strSubTypeFull);
+ string strTypeDesc = GetTypeDesc(strTypeFull);
+
+ string strSubTypeDesc = null;
+ if(strSubTypeFull != null)
+ strSubTypeDesc = GetTypeDesc(strSubTypeFull);
+
+ bool bIsList = TypeIsList(strTypeFull);
+ bool bIsArray = TypeIsArray(strTypeFull);
+ int ir = iIndent;
+
+ if(t.IsEnum)
+ AppendLine(sbr, "private static Dictionary<string, " + strTypeFull +
+ "> m_dict" + strTypeDesc + " = null;", ref ir);
+
+ AppendLine(sbr, "private static " + strTypeFull + " Read" +
+ strTypeDesc + "(XmlReader xr" +
+ // ((bIsList || bIsArray) ? ", string strItemName" : string.Empty) +
+ ")", ref ir);
+ AppendLine(sbr, "{", ref ir, 0, 1);
+
+ if(t == typeof(string))
+ {
+ AppendLine(sbr, "return xr.ReadElementString();", ref ir);
+ }
+ else if(IsXmlConvertibleType(t))
+ {
+ AppendLine(sbr, "string strValue = xr.ReadElementString();", ref ir);
+ AppendLine(sbr, "return XmlConvert.To" + strTypeDesc + "(strValue);", ref ir);
+ }
+ else if(t.IsEnum)
+ {
+ AppendLine(sbr, "if(m_dict" + strTypeDesc + " == null)", ref ir);
+ AppendLine(sbr, "{", ref ir, 0, 1);
+ AppendLine(sbr, "m_dict" + strTypeDesc + " = new Dictionary<string, " +
+ strTypeFull + ">();", ref ir);
+
+ string[] vEnumNames = Enum.GetNames(t);
+ foreach(string strEnumName in vEnumNames)
+ {
+ AppendLine(sbr, "m_dict" + strTypeDesc + "[\"" + strEnumName +
+ "\"] = " + strTypeFull + "." + strEnumName + ";", ref ir);
+ }
+
+ AppendLine(sbr, "}", ref ir, -1, 0);
+ AppendLine(sbr);
+
+ AppendLine(sbr, "string strValue = xr.ReadElementString();", ref ir);
+
+ // AppendLine(sbr, "return Enum.Parse(typeof(" + strTypeFull + "), strValue);", ref ir);
+ object[] vAttribs = t.GetCustomAttributes(true);
+ if(GetAttribute<FlagsAttribute>(vAttribs) != null)
+ {
+ AppendLine(sbr, strTypeFull + " eResult = (" + strTypeFull + ")0;", ref ir);
+ AppendLine(sbr, "string[] vValues = strValue.Split(m_vEnumSeps, StringSplitOptions.RemoveEmptyEntries);", ref ir);
+ AppendLine(sbr, "foreach(string strPart in vValues)", ref ir);
+ AppendLine(sbr, "{", ref ir, 0, 1);
+ AppendLine(sbr, strTypeFull + " ePart;", ref ir);
+ AppendLine(sbr, "if(m_dict" + strTypeDesc + ".TryGetValue(strPart, out ePart))", ref ir);
+ AppendLine(sbr, "eResult |= ePart;", ref ir, 1, -1);
+ AppendLine(sbr, "else { Debug.Assert(false); }", ref ir);
+ AppendLine(sbr, "}", ref ir, -1, 0);
+ }
+ else
+ {
+ AppendLine(sbr, strTypeFull + " eResult;", ref ir);
+ AppendLine(sbr, "if(!m_dict" + strTypeDesc + ".TryGetValue(strValue, out eResult))", ref ir);
+ AppendLine(sbr, "{ Debug.Assert(false); }", ref ir, 1, -1);
+ }
+
+ AppendLine(sbr, "return eResult;", ref ir);
+ }
+ else
+ {
+ if(!bIsArray)
+ AppendLine(sbr, strTypeFull + " o = new " + strTypeFull + "();", ref ir);
+ else
+ AppendLine(sbr, "List<" + strSubTypeFull + "> l = new List<" +
+ strSubTypeFull + ">();", ref ir);
+ AppendLine(sbr);
+
+ byte[] pbInsAttribs = new byte[16];
+ Program.GlobalRandom.NextBytes(pbInsAttribs);
+ string strInsAttribs = Convert.ToBase64String(pbInsAttribs,
+ Base64FormattingOptions.None);
+ sbr.Append(strInsAttribs);
+ StringBuilder sbAttribs = new StringBuilder();
+
+ AppendLine(sbr, "if(SkipEmptyElement(xr)) return " +
+ (bIsArray ? "l.ToArray();" : "o;"), ref ir);
+ AppendLine(sbr);
+
+ AppendLine(sbr, "Debug.Assert(xr.NodeType == XmlNodeType.Element);", ref ir);
+ AppendLine(sbr, "xr.ReadStartElement();", ref ir);
+ AppendLine(sbr, "xr.MoveToContent();", ref ir);
+ AppendLine(sbr);
+ AppendLine(sbr, "while(true)", ref ir);
+ AppendLine(sbr, "{", ref ir, 0, 1);
+ AppendLine(sbr, "XmlNodeType nt = xr.NodeType;", ref ir);
+ AppendLine(sbr, "if((nt == XmlNodeType.EndElement) || (nt == XmlNodeType.None)) break;", ref ir);
+ AppendLine(sbr, "if(nt != XmlNodeType.Element) { Debug.Assert(false); continue; }", ref ir);
+ AppendLine(sbr);
+
+ if(bIsList || bIsArray)
+ {
+ AppendLine(sbr, strSubTypeFull + " oElem = Read" + strSubTypeDesc +
+ "(xr);", ref ir);
+ AppendLine(sbr, (bIsArray ? "l" : "o") + ".Add(oElem);", ref ir);
+
+ if(!dTypes.ContainsKey(strSubTypeFull))
+ dTypes[strSubTypeFull] = new XmlsTypeInfo(Type.GetType(strSubTypeFull));
+ }
+ else
+ {
+ StringBuilder sbs = new StringBuilder();
+ uint uElements = 0;
+
+ AppendLine(sbs, "switch(xr.LocalName)", ref ir);
+ AppendLine(sbs, "{", ref ir, 0, 1);
+
+ PropertyInfo[] vProps = t.GetProperties();
+ foreach(PropertyInfo pi in vProps)
+ {
+ object[] vAttribs = pi.GetCustomAttributes(true);
+ if(GetAttribute<XmlIgnoreAttribute>(vAttribs) != null) continue;
+
+ if(!pi.CanRead || !pi.CanWrite) { Debug.Assert(false); continue; }
+
+ Type tProp = pi.PropertyType;
+ string strPropSubTypeFull;
+ string strPropTypeFull = GetFullTypeNameCS(tProp, out strPropSubTypeFull);
+ string strPropTypeDesc = GetTypeDesc(strPropTypeFull);
+
+ string strXmlName = GetXmlName(pi);
+
+ if(!dTypes.ContainsKey(strPropTypeFull))
+ dTypes[strPropTypeFull] = new XmlsTypeInfo(tProp);
+
+ if(GetAttribute<XmlAttributeAttribute>(vAttribs) == null)
+ {
+ AppendLine(sbs, "case \"" + strXmlName + "\":", ref ir, 0, 1);
+ AppendLine(sbs, "o." + pi.Name + " = Read" + strPropTypeDesc +
+ "(xr);", ref ir);
+ AppendLine(sbs, "break;", ref ir, 0, -1);
+
+ ++uElements;
+ }
+ else
+ {
+ Debug.Assert(tProp == typeof(string));
+
+ AppendLine(sbAttribs, "case \"" + strXmlName + "\":", ref ir, 0, 1);
+ AppendLine(sbAttribs, "o." + pi.Name + " = xr.Value;", ref ir);
+ AppendLine(sbAttribs, "break;", ref ir, 0, -1);
+ }
+ }
+
+ AppendLine(sbs, "default:", ref ir, 0, 1);
+ AppendLine(sbs, "Debug.Assert(false);", ref ir);
+ AppendLine(sbs, "xr.Skip();", ref ir);
+ AppendLine(sbs, "break;", ref ir, 0, -1);
+ AppendLine(sbs, "}", ref ir, -1, 0); // switch
+
+ if(uElements > 0) sbr.Append(sbs.ToString());
+ else
+ {
+ AppendLine(sbr, "Debug.Assert(false);", ref ir);
+ AppendLine(sbr, "xr.Skip();", ref ir);
+ }
+ }
+
+ AppendLine(sbr);
+ AppendLine(sbr, "xr.MoveToContent();", ref ir);
+ AppendLine(sbr, "}", ref ir, -1, 0);
+ AppendLine(sbr);
+ AppendLine(sbr, "Debug.Assert(xr.NodeType == XmlNodeType.EndElement);", ref ir);
+ AppendLine(sbr, "xr.ReadEndElement();", ref ir);
+
+ AppendLine(sbr, (bIsArray ? "return l.ToArray();" : "return o;"), ref ir);
+
+ if(sbAttribs.Length == 0)
+ sbr.Replace(strInsAttribs, string.Empty);
+ else
+ {
+ StringBuilder sba = new StringBuilder();
+ AppendLine(sba, "while(xr.MoveToNextAttribute())", ref ir);
+ AppendLine(sba, "{", ref ir, 0, 1);
+ AppendLine(sba, "switch(xr.LocalName)", ref ir);
+ AppendLine(sba, "{", ref ir, 0, 1);
+ sba.Append(sbAttribs.ToString());
+ AppendLine(sba, "default:", ref ir, 0, 1);
+ AppendLine(sba, "Debug.Assert(false);", ref ir);
+ AppendLine(sba, "break;", ref ir, 0, -1);
+ AppendLine(sba, "}", ref ir, -1, 0); // switch
+ AppendLine(sba, "}", ref ir, -1, 0); // while
+ sba.AppendLine();
+
+ sbr.Replace(strInsAttribs, sba.ToString());
+ }
+ }
+
+ AppendLine(sbr, "}", ref ir, -1, 0);
+
+ Debug.Assert(ir == iIndent);
+
+ XmlsTypeInfo xti = new XmlsTypeInfo(t, sbr.ToString(), sbw.ToString());
+ return xti;
+ }
+
+ private static bool SkipEmptyElement(XmlReader xr)
+ {
+ xr.MoveToElement();
+ if(xr.IsEmptyElement)
+ {
+ xr.Skip();
+ return true;
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/KeePass/Util/XmlUtil.cs b/KeePass/Util/XmlUtil.cs
index aa62d56..94e6c43 100644
--- a/KeePass/Util/XmlUtil.cs
+++ b/KeePass/Util/XmlUtil.cs
@@ -22,8 +22,11 @@ using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
+using System.Reflection;
using System.Diagnostics;
+using KeePass.Util.XmlSerialization;
+
namespace KeePass.Util
{
public static class XmlUtil
@@ -148,5 +151,76 @@ namespace KeePass.Util
else xnRep.InnerText = XmlUtil.SafeInnerText(xnOvrChild);
}
}
+
+ private sealed class XuopContainer
+ {
+ private object m_o;
+ public object Object { get { return m_o; } }
+
+ public XuopContainer(object o)
+ {
+ m_o = o;
+ }
+ }
+
+ private const string GoxpSep = "/";
+ public static string GetObjectXmlPath(object oContainer, object oNeedle)
+ {
+ if(oContainer == null) { Debug.Assert(false); return null; }
+
+ XuopContainer c = new XuopContainer(oContainer);
+ string strXPath = GetObjectXmlPathRec(c, typeof(XuopContainer),
+ oNeedle, string.Empty);
+ if(string.IsNullOrEmpty(strXPath)) return strXPath;
+
+ if(!strXPath.StartsWith("/Object")) { Debug.Assert(false); return null; }
+ strXPath = strXPath.Substring(7);
+
+ Type tRoot = oContainer.GetType();
+ string strRoot = XmlSerializerEx.GetXmlName(tRoot);
+
+ return (GoxpSep + strRoot + strXPath);
+ }
+
+ private static string GetObjectXmlPathRec(object oContainer, Type tContainer,
+ object oNeedle, string strCurPath)
+ {
+ if(oContainer == null) { Debug.Assert(false); return null; }
+ if(oNeedle == null) { Debug.Assert(false); return null; }
+ Debug.Assert(oContainer.GetType() == tContainer);
+
+ PropertyInfo[] vProps = tContainer.GetProperties();
+ foreach(PropertyInfo pi in vProps)
+ {
+ if((pi == null) || !pi.CanRead) continue;
+
+ object[] vPropAttribs = pi.GetCustomAttributes(true);
+ if(XmlSerializerEx.GetAttribute<XmlIgnoreAttribute>(
+ vPropAttribs) != null) continue;
+
+ object oSub = pi.GetValue(oContainer, null);
+ if(oSub == null) continue;
+
+ string strPropName = XmlSerializerEx.GetXmlName(pi);
+ string strSubPath = strCurPath + GoxpSep + strPropName;
+
+ if(oSub == oNeedle) return strSubPath;
+
+ Type tSub = oSub.GetType();
+ string strPrimarySubType;
+ string strPropTypeCS = XmlSerializerEx.GetFullTypeNameCS(tSub,
+ out strPrimarySubType);
+ if(XmlSerializerEx.TypeIsArray(strPropTypeCS) ||
+ XmlSerializerEx.TypeIsList(strPropTypeCS))
+ continue;
+ if(strPropTypeCS.StartsWith("System.")) continue;
+
+ string strSubFound = GetObjectXmlPathRec(oSub, tSub, oNeedle,
+ strSubPath);
+ if(strSubFound != null) return strSubFound;
+ }
+
+ return null;
+ }
}
}
diff --git a/KeePassLib/Cryptography/PasswordGenerator/PwCharSet.cs b/KeePassLib/Cryptography/PasswordGenerator/PwCharSet.cs
index 8a32c6e..3460b02 100644
--- a/KeePassLib/Cryptography/PasswordGenerator/PwCharSet.cs
+++ b/KeePassLib/Cryptography/PasswordGenerator/PwCharSet.cs
@@ -38,7 +38,7 @@ namespace KeePassLib.Cryptography.PasswordGenerator
public const string Punctuation = @",.;:";
public const string Brackets = @"[]{}()<>";
- public const string PrintableAsciiSpecial = "!\"#$%&'()*+,-./:;<=>?[\\]^_{|}~";
+ public const string PrintableAsciiSpecial = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
public const string UpperHex = "0123456789ABCDEF";
public const string LowerHex = "0123456789abcdef";
diff --git a/KeePassLib/Cryptography/PopularPasswords.cs b/KeePassLib/Cryptography/PopularPasswords.cs
index af82756..f4cbec5 100644
--- a/KeePassLib/Cryptography/PopularPasswords.cs
+++ b/KeePassLib/Cryptography/PopularPasswords.cs
@@ -450,7 +450,7 @@ namespace KeePassLib.Cryptography
public static void MakeList()
{
- string strData = File.ReadAllText("MostPopularPasswords.txt", Encoding.UTF8);
+ string strData = File.ReadAllText("MostPopularPasswords.txt", StrUtil.Utf8);
strData += " ";
CharStream cs = new CharStream(strData);
diff --git a/KeePassLib/Cryptography/QualityEstimation.cs b/KeePassLib/Cryptography/QualityEstimation.cs
index de96068..69f8c4c 100644
--- a/KeePassLib/Cryptography/QualityEstimation.cs
+++ b/KeePassLib/Cryptography/QualityEstimation.cs
@@ -34,11 +34,10 @@ namespace KeePassLib.Cryptography
{
private enum CharSpaceBits : uint
{
- Escape = 60,
+ Control = 32,
Alpha = 26,
Number = 10,
- SimpleSpecial = 16,
- ExtendedSpecial = 17,
+ Special = 33,
High = 112
}
@@ -55,8 +54,7 @@ namespace KeePassLib.Cryptography
if(vPasswordChars == null) throw new ArgumentNullException("vPasswordChars");
bool bChLower = false, bChUpper = false, bChNumber = false;
- bool bChSimpleSpecial = false, bChExtSpecial = false, bChHigh = false;
- bool bChEscape = false;
+ bool bChSpecial = false, bChHigh = false, bChControl = false;
Dictionary<char, uint> vCharCounts = new Dictionary<char, uint>();
Dictionary<int, uint> vDifferences = new Dictionary<int, uint>();
double dblEffectiveLength = 0.0;
@@ -65,54 +63,56 @@ namespace KeePassLib.Cryptography
{
char tch = vPasswordChars[i];
- if(tch < ' ') bChEscape = true;
- if((tch >= 'A') && (tch <= 'Z')) bChUpper = true;
- if((tch >= 'a') && (tch <= 'z')) bChLower = true;
- if((tch >= '0') && (tch <= '9')) bChNumber = true;
- if((tch >= ' ') && (tch <= '/')) bChSimpleSpecial = true;
- if((tch >= ':') && (tch <= '@')) bChExtSpecial = true;
- if((tch >= '[') && (tch <= '`')) bChExtSpecial = true;
- if((tch >= '{') && (tch <= '~')) bChExtSpecial = true;
- if(tch > '~') bChHigh = true;
+ if(tch < ' ') bChControl = true;
+ else if((tch >= 'A') && (tch <= 'Z')) bChUpper = true;
+ else if((tch >= 'a') && (tch <= 'z')) bChLower = true;
+ else if((tch >= '0') && (tch <= '9')) bChNumber = true;
+ else if((tch >= ' ') && (tch <= '/')) bChSpecial = true;
+ else if((tch >= ':') && (tch <= '@')) bChSpecial = true;
+ else if((tch >= '[') && (tch <= '`')) bChSpecial = true;
+ else if((tch >= '{') && (tch <= '~')) bChSpecial = true;
+ else if(tch > '~') bChHigh = true;
double dblDiffFactor = 1.0;
if(i >= 1)
{
int iDiff = (int)tch - (int)vPasswordChars[i - 1];
- if(vDifferences.ContainsKey(iDiff) == false)
- vDifferences.Add(iDiff, 1);
- else
+ uint uDiffCount;
+ if(vDifferences.TryGetValue(iDiff, out uDiffCount))
{
- vDifferences[iDiff] = vDifferences[iDiff] + 1;
- dblDiffFactor /= (double)vDifferences[iDiff];
+ ++uDiffCount;
+ vDifferences[iDiff] = uDiffCount;
+ dblDiffFactor /= (double)uDiffCount;
}
+ else vDifferences.Add(iDiff, 1);
}
- if(vCharCounts.ContainsKey(tch) == false)
+ uint uCharCount;
+ if(vCharCounts.TryGetValue(tch, out uCharCount))
{
- vCharCounts.Add(tch, 1);
- dblEffectiveLength += dblDiffFactor;
+ ++uCharCount;
+ vCharCounts[tch] = uCharCount;
+ dblEffectiveLength += dblDiffFactor * (1.0 / (double)uCharCount);
}
else
{
- vCharCounts[tch] = vCharCounts[tch] + 1;
- dblEffectiveLength += dblDiffFactor * (1.0 / (double)vCharCounts[tch]);
+ vCharCounts.Add(tch, 1);
+ dblEffectiveLength += dblDiffFactor;
}
}
- uint charSpace = 0;
- if(bChEscape) charSpace += (uint)CharSpaceBits.Escape;
- if(bChUpper) charSpace += (uint)CharSpaceBits.Alpha;
- if(bChLower) charSpace += (uint)CharSpaceBits.Alpha;
- if(bChNumber) charSpace += (uint)CharSpaceBits.Number;
- if(bChSimpleSpecial) charSpace += (uint)CharSpaceBits.SimpleSpecial;
- if(bChExtSpecial) charSpace += (uint)CharSpaceBits.ExtendedSpecial;
- if(bChHigh) charSpace += (uint)CharSpaceBits.High;
+ uint uCharSpace = 0;
+ if(bChControl) uCharSpace += (uint)CharSpaceBits.Control;
+ if(bChUpper) uCharSpace += (uint)CharSpaceBits.Alpha;
+ if(bChLower) uCharSpace += (uint)CharSpaceBits.Alpha;
+ if(bChNumber) uCharSpace += (uint)CharSpaceBits.Number;
+ if(bChSpecial) uCharSpace += (uint)CharSpaceBits.Special;
+ if(bChHigh) uCharSpace += (uint)CharSpaceBits.High;
- if(charSpace == 0) return 0;
+ if(uCharSpace == 0) return 0;
- double dblBitsPerChar = Math.Log((double)charSpace) / Math.Log(2.0);
+ double dblBitsPerChar = Math.Log((double)uCharSpace) / Math.Log(2.0);
double dblRating = dblBitsPerChar * dblEffectiveLength;
#if !KeePassLibSD
diff --git a/KeePassLib/Cryptography/SelfTest.cs b/KeePassLib/Cryptography/SelfTest.cs
index 1625f25..dda5484 100644
--- a/KeePassLib/Cryptography/SelfTest.cs
+++ b/KeePassLib/Cryptography/SelfTest.cs
@@ -63,11 +63,10 @@ namespace KeePassLib.Cryptography
TestNativeKeyTransform();
- TestGZip();
-
TestHmacOtp();
TestProtectedObjects();
+ TestMemUtil();
TestStrUtil();
TestUrlUtil();
@@ -214,7 +213,7 @@ namespace KeePassLib.Cryptography
#endif
}
- private static void TestGZip()
+ private static void TestMemUtil()
{
#if DEBUG
Random r = new Random();
@@ -224,6 +223,29 @@ namespace KeePassLib.Cryptography
byte[] pbCompressed = MemUtil.Compress(pb);
if(!MemUtil.ArraysEqual(MemUtil.Decompress(pbCompressed), pb))
throw new InvalidOperationException("GZip");
+
+ pb = Encoding.ASCII.GetBytes("012345678901234567890a");
+ byte[] pbN = Encoding.ASCII.GetBytes("9012");
+ if(MemUtil.IndexOf<byte>(pb, pbN) != 9)
+ throw new InvalidOperationException("MemUtil-1");
+ pbN = Encoding.ASCII.GetBytes("01234567890123");
+ if(MemUtil.IndexOf<byte>(pb, pbN) != 0)
+ throw new InvalidOperationException("MemUtil-2");
+ pbN = Encoding.ASCII.GetBytes("a");
+ if(MemUtil.IndexOf<byte>(pb, pbN) != 21)
+ throw new InvalidOperationException("MemUtil-3");
+ pbN = Encoding.ASCII.GetBytes("0a");
+ if(MemUtil.IndexOf<byte>(pb, pbN) != 20)
+ throw new InvalidOperationException("MemUtil-4");
+ pbN = Encoding.ASCII.GetBytes("1");
+ if(MemUtil.IndexOf<byte>(pb, pbN) != 1)
+ throw new InvalidOperationException("MemUtil-5");
+ pbN = Encoding.ASCII.GetBytes("b");
+ if(MemUtil.IndexOf<byte>(pb, pbN) >= 0)
+ throw new InvalidOperationException("MemUtil-6");
+ pbN = Encoding.ASCII.GetBytes("012b");
+ if(MemUtil.IndexOf<byte>(pb, pbN) >= 0)
+ throw new InvalidOperationException("MemUtil-7");
#endif
}
@@ -336,6 +358,10 @@ namespace KeePassLib.Cryptography
throw new InvalidOperationException("StrUtil-V3");
if(StrUtil.VersionToString(0x00FF000000000000UL) != "255")
throw new InvalidOperationException("StrUtil-V4");
+ if(StrUtil.VersionToString(0x00FF000000000000UL, true) != "255.0")
+ throw new InvalidOperationException("StrUtil-V5");
+ if(StrUtil.VersionToString(0x0000000000070000UL, true) != "0.0.7")
+ throw new InvalidOperationException("StrUtil-V6");
#endif
}
diff --git a/KeePass/Ecas/IEcasParameterized.cs b/KeePassLib/Interfaces/IXmlSerializerEx.cs
similarity index 80%
copy from KeePass/Ecas/IEcasParameterized.cs
copy to KeePassLib/Interfaces/IXmlSerializerEx.cs
index 4d8ca3c..e0e627b 100644
--- a/KeePass/Ecas/IEcasParameterized.cs
+++ b/KeePassLib/Interfaces/IXmlSerializerEx.cs
@@ -20,15 +20,14 @@
using System;
using System.Collections.Generic;
using System.Text;
+using System.IO;
+using System.Xml;
-using KeePassLib;
-
-namespace KeePass.Ecas
+namespace KeePassLib.Interfaces
{
- public interface IEcasParameterized
+ public interface IXmlSerializerEx
{
- PwUuid Type { get; }
-
- EcasParameter[] Parameters { get; }
+ void Serialize(XmlWriter xmlWriter, object o);
+ object Deserialize(Stream s);
}
}
diff --git a/KeePassLib/KeePassLib.csproj b/KeePassLib/KeePassLib.csproj
index 0a86798..63b65a8 100644
--- a/KeePassLib/KeePassLib.csproj
+++ b/KeePassLib/KeePassLib.csproj
@@ -69,6 +69,7 @@
<Compile Include="Cryptography\SelfTest.cs" />
<Compile Include="Interfaces\IStructureItem.cs" />
<Compile Include="Interfaces\IUIOperations.cs" />
+ <Compile Include="Interfaces\IXmlSerializerEx.cs" />
<Compile Include="Keys\KcpCustomKey.cs" />
<Compile Include="Keys\KeyProvider.cs" />
<Compile Include="Keys\KeyProviderPool.cs" />
diff --git a/KeePassLib/Keys/KcpKeyFile.cs b/KeePassLib/Keys/KcpKeyFile.cs
index 1dcd8c5..caadde4 100644
--- a/KeePassLib/Keys/KcpKeyFile.cs
+++ b/KeePassLib/Keys/KcpKeyFile.cs
@@ -70,13 +70,18 @@ namespace KeePassLib.Keys
private void Construct(IOConnectionInfo iocFile)
{
- byte[] pbKey = LoadXmlKeyFile(iocFile);
- if(pbKey == null) pbKey = LoadKeyFile(iocFile);
+ byte[] pbFileData = IOConnection.ReadFile(iocFile);
+ if(pbFileData == null) throw new FileNotFoundException();
+
+ byte[] pbKey = LoadXmlKeyFile(pbFileData);
+ if(pbKey == null) pbKey = LoadKeyFile(pbFileData);
if(pbKey == null) throw new InvalidOperationException();
m_strPath = iocFile.Path;
m_pbKeyData = new ProtectedBinary(true, pbKey);
+
+ MemUtil.ZeroByteArray(pbKey);
}
// public void Clear()
@@ -85,31 +90,20 @@ namespace KeePassLib.Keys
// m_pbKeyData = null;
// }
- private static byte[] LoadKeyFile(IOConnectionInfo iocFile)
+ private static byte[] LoadKeyFile(byte[] pbFileData)
{
- Stream sIn = null;
- try { sIn = IOConnection.OpenRead(iocFile); }
- catch(Exception) { }
- if(sIn == null) return null;
+ if(pbFileData == null) { Debug.Assert(false); return null; }
- long lLength = sIn.Length;
- BinaryReader br = new BinaryReader(sIn);
- byte[] pbFileData = br.ReadBytes((int)lLength);
- br.Close();
- sIn.Close();
+ int iLength = pbFileData.Length;
byte[] pbKey = null;
- if(lLength == 32) pbKey = LoadBinaryKey32(pbFileData);
- else if(lLength == 64) pbKey = LoadHexKey32(pbFileData);
+ if(iLength == 32) pbKey = LoadBinaryKey32(pbFileData);
+ else if(iLength == 64) pbKey = LoadHexKey32(pbFileData);
if(pbKey == null)
{
- if(pbFileData.Length == lLength)
- {
- SHA256Managed sha256 = new SHA256Managed();
- pbKey = sha256.ComputeHash(pbFileData);
- }
- else { Debug.Assert(false); pbKey = null; }
+ SHA256Managed sha256 = new SHA256Managed();
+ pbKey = sha256.ComputeHash(pbFileData);
}
return pbKey;
@@ -196,19 +190,17 @@ namespace KeePassLib.Keys
private const string KeyElementName = "Key";
private const string KeyDataElementName = "Data";
- private static byte[] LoadXmlKeyFile(IOConnectionInfo iocFile)
+ private static byte[] LoadXmlKeyFile(byte[] pbFileData)
{
- Debug.Assert(iocFile != null); if(iocFile == null) throw new ArgumentNullException("iocFile");
+ if(pbFileData == null) { Debug.Assert(false); return null; }
- Stream sIn = null;
+ MemoryStream ms = new MemoryStream(pbFileData, false);
byte[] pbKeyData = null;
try
{
- sIn = IOConnection.OpenRead(iocFile);
-
XmlDocument doc = new XmlDocument();
- doc.Load(sIn);
+ doc.Load(ms);
XmlElement el = doc.DocumentElement;
if((el == null) || !el.Name.Equals(RootElementName)) return null;
@@ -231,7 +223,7 @@ namespace KeePassLib.Keys
}
}
catch(Exception) { pbKeyData = null; }
- finally { if(sIn != null) sIn.Close(); }
+ finally { ms.Close(); }
return pbKeyData;
}
@@ -243,7 +235,7 @@ namespace KeePassLib.Keys
Debug.Assert(pbKeyData != null);
if(pbKeyData == null) throw new ArgumentNullException("pbKeyData");
- XmlTextWriter xtw = new XmlTextWriter(strFile, new UTF8Encoding(false));
+ XmlTextWriter xtw = new XmlTextWriter(strFile, StrUtil.Utf8);
xtw.WriteStartDocument();
xtw.WriteWhitespace("\r\n");
diff --git a/KeePassLib/Native/NativeLib.cs b/KeePassLib/Native/NativeLib.cs
index c4af820..bc4e334 100644
--- a/KeePassLib/Native/NativeLib.cs
+++ b/KeePassLib/Native/NativeLib.cs
@@ -22,6 +22,8 @@ using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Diagnostics;
+using KeePassLib.Utility;
+
namespace KeePassLib.Native
{
/// <summary>
@@ -72,9 +74,10 @@ namespace KeePassLib.Native
// Mono defines Unix as 128 in early .NET versions
#if !KeePassLibSD
- m_bIsUnix = ((p == PlatformID.Unix) || ((int)p == 128));
+ m_bIsUnix = ((p == PlatformID.Unix) || (p == PlatformID.MacOSX) ||
+ ((int)p == 128));
#else
- m_bIsUnix = (((int)p == 4) || ((int)p == 128));
+ m_bIsUnix = (((int)p == 4) || ((int)p == 6) || ((int)p == 128));
#endif
return m_bIsUnix.Value;
}
@@ -85,9 +88,65 @@ namespace KeePassLib.Native
if(m_platID.HasValue) return m_platID.Value;
m_platID = Environment.OSVersion.Platform;
+
+#if !KeePassLibSD
+ // Mono returns PlatformID.Unix on Mac OS X, workaround this
+ if(m_platID.Value == PlatformID.Unix)
+ {
+ if((RunConsoleApp("uname", null) ?? string.Empty).Trim().Equals(
+ "Darwin", StrUtil.CaseIgnoreCmp))
+ m_platID = PlatformID.MacOSX;
+ }
+#endif
+
return m_platID.Value;
}
+#if !KeePassLibSD
+ public static string RunConsoleApp(string strAppPath, string strParams)
+ {
+ return RunConsoleApp(strAppPath, strParams, null);
+ }
+
+ public static string RunConsoleApp(string strAppPath, string strParams,
+ string strStdInput)
+ {
+ if(strAppPath == null) throw new ArgumentNullException("strAppPath");
+ if(strAppPath.Length == 0) throw new ArgumentException("strAppPath");
+
+ try
+ {
+ ProcessStartInfo psi = new ProcessStartInfo();
+
+ psi.CreateNoWindow = true;
+ psi.FileName = strAppPath;
+ psi.WindowStyle = ProcessWindowStyle.Hidden;
+ psi.UseShellExecute = false;
+ psi.RedirectStandardOutput = true;
+
+ if(strStdInput != null) psi.RedirectStandardInput = true;
+
+ if(!string.IsNullOrEmpty(strParams)) psi.Arguments = strParams;
+
+ Process p = Process.Start(psi);
+
+ if(strStdInput != null)
+ {
+ p.StandardInput.Write(strStdInput);
+ p.StandardInput.Close();
+ }
+
+ string strOutput = p.StandardOutput.ReadToEnd();
+ p.WaitForExit();
+
+ return strOutput;
+ }
+ catch(Exception) { Debug.Assert(false); }
+
+ return null;
+ }
+#endif
+
/// <summary>
/// Transform a key.
/// </summary>
diff --git a/KeePassLib/Properties/AssemblyInfo.cs b/KeePassLib/Properties/AssemblyInfo.cs
index 2d2b982..8b13823 100644
--- a/KeePassLib/Properties/AssemblyInfo.cs
+++ b/KeePassLib/Properties/AssemblyInfo.cs
@@ -38,5 +38,5 @@ using System.Runtime.InteropServices;
[assembly: Guid("395f6eec-a1e0-4438-aa82-b75099348134")]
// Assembly version information
-[assembly: AssemblyVersion("2.1.8.*")]
-[assembly: AssemblyFileVersion("2.1.8.0")]
+[assembly: AssemblyVersion("2.19.0.*")]
+[assembly: AssemblyFileVersion("2.19.0.0")]
diff --git a/KeePassLib/PwDefs.cs b/KeePassLib/PwDefs.cs
index 89cad13..5d2418b 100644
--- a/KeePassLib/PwDefs.cs
+++ b/KeePassLib/PwDefs.cs
@@ -46,15 +46,23 @@ namespace KeePassLib
/// <summary>
/// Version, encoded as 32-bit unsigned integer.
- /// 2.00 = 0x02000000, 2.01 = 0x02000100, 2.15 = 0x02010500, etc.
+ /// 2.00 = 0x02000000, 2.01 = 0x02000100, ..., 2.18 = 0x02010800.
+ /// As of 2.19, the version is encoded component-wise per byte,
+ /// e.g. 2.19 = 0x02130000.
+ /// It is highly recommended to use <c>FileVersion64</c> instead.
/// </summary>
- public const uint Version32 = 0x02010800;
- public const ulong FileVersion64 = 0x0002001200000000UL;
+ public const uint Version32 = 0x02130000;
+
+ /// <summary>
+ /// Version, encoded as 64-bit unsigned integer
+ /// (component-wise, 16 bits per component).
+ /// </summary>
+ public const ulong FileVersion64 = 0x0002001300000000UL;
/// <summary>
/// Version, encoded as string.
/// </summary>
- public const string VersionString = "2.18";
+ public const string VersionString = "2.19";
public const string Copyright = @"Copyright © 2003-2012 Dominik Reichl";
diff --git a/KeePassLib/PwGroup.cs b/KeePassLib/PwGroup.cs
index 6e79590..be3bad6 100644
--- a/KeePassLib/PwGroup.cs
+++ b/KeePassLib/PwGroup.cs
@@ -1157,9 +1157,14 @@ namespace KeePassLib
/// <param name="strTree">Tree string.</param>
/// <param name="vSeparators">Separators that delimit groups in the
/// <c>strTree</c> parameter.</param>
- /// <returns></returns>
public PwGroup FindCreateSubTree(string strTree, char[] vSeparators)
{
+ return FindCreateSubTree(strTree, vSeparators, true);
+ }
+
+ public PwGroup FindCreateSubTree(string strTree, char[] vSeparators,
+ bool bAllowCreate)
+ {
Debug.Assert(strTree != null); if(strTree == null) return this;
if(strTree.Length == 0) return this;
@@ -1169,8 +1174,7 @@ namespace KeePassLib
PwGroup pgContainer = this;
for(int nGroup = 0; nGroup < vGroups.Length; ++nGroup)
{
- if((vGroups[nGroup] == null) || (vGroups[nGroup].Length == 0))
- continue;
+ if(string.IsNullOrEmpty(vGroups[nGroup])) continue;
bool bFound = false;
foreach(PwGroup pg in pgContainer.Groups)
@@ -1185,10 +1189,10 @@ namespace KeePassLib
if(!bFound)
{
- PwGroup pg = new PwGroup(true, true, vGroups[nGroup], PwIcon.Folder);
+ if(!bAllowCreate) return null;
+ PwGroup pg = new PwGroup(true, true, vGroups[nGroup], PwIcon.Folder);
pgContainer.AddGroup(pg, true);
-
pgContainer = pg;
}
}
diff --git a/KeePassLib/Serialization/HashedBlockStream.cs b/KeePassLib/Serialization/HashedBlockStream.cs
index ca8b189..9c05fdc 100644
--- a/KeePassLib/Serialization/HashedBlockStream.cs
+++ b/KeePassLib/Serialization/HashedBlockStream.cs
@@ -24,6 +24,7 @@ using System.Diagnostics;
using System.Text;
using KeePassLib.Native;
+using KeePassLib.Utility;
#if KeePassLibSD
using KeePassLibSD;
@@ -102,8 +103,7 @@ namespace KeePassLib.Serialization
m_bWriting = bWriting;
m_bVerify = bVerify;
- UTF8Encoding utf8 = new UTF8Encoding(false, false);
-
+ UTF8Encoding utf8 = StrUtil.Utf8;
if(m_bWriting == false) // Reading mode
{
if(m_sBaseStream.CanRead == false)
diff --git a/KeePassLib/Serialization/IOConnection.cs b/KeePassLib/Serialization/IOConnection.cs
index 6bde6f8..274a473 100644
--- a/KeePassLib/Serialization/IOConnection.cs
+++ b/KeePassLib/Serialization/IOConnection.cs
@@ -399,5 +399,29 @@ namespace KeePassLib.Serialization
try { wr.Close(); }
catch(Exception) { Debug.Assert(false); }
}
+
+ public static byte[] ReadFile(IOConnectionInfo ioc)
+ {
+ Stream sIn = null;
+ MemoryStream ms = null;
+ try
+ {
+ sIn = IOConnection.OpenRead(ioc);
+ if(sIn == null) return null;
+
+ ms = new MemoryStream();
+ MemUtil.CopyStream(sIn, ms);
+
+ return ms.ToArray();
+ }
+ catch(Exception) { }
+ finally
+ {
+ if(sIn != null) sIn.Close();
+ if(ms != null) ms.Close();
+ }
+
+ return null;
+ }
}
}
diff --git a/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs b/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs
index fae29ec..2488e49 100644
--- a/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs
+++ b/KeePassLib/Serialization/Kdb4File.Read.Streamed.cs
@@ -87,15 +87,28 @@ namespace KeePassLib.Serialization
ReadDocumentStreamed(CreateXmlReader(readerStream), sParentStream);
}
- private static XmlReader CreateXmlReader(Stream readerStream)
+ internal static XmlReaderSettings CreateStdXmlReaderSettings()
{
- XmlReaderSettings xmlSettings = new XmlReaderSettings();
- xmlSettings.CloseInput = true;
- xmlSettings.IgnoreComments = true;
- xmlSettings.IgnoreProcessingInstructions = true;
- xmlSettings.IgnoreWhitespace = true;
+ XmlReaderSettings xrs = new XmlReaderSettings();
+
+ xrs.CloseInput = true;
+ xrs.IgnoreComments = true;
+ xrs.IgnoreProcessingInstructions = true;
+ xrs.IgnoreWhitespace = true;
+
+#if !KeePassLibSD
+ xrs.ProhibitDtd = true;
+#endif
+
+ xrs.ValidationType = ValidationType.None;
+
+ return xrs;
+ }
- return XmlReader.Create(readerStream, xmlSettings);
+ private static XmlReader CreateXmlReader(Stream readerStream)
+ {
+ XmlReaderSettings xrs = CreateStdXmlReaderSettings();
+ return XmlReader.Create(readerStream, xrs);
}
private void ReadDocumentStreamed(XmlReader xr, Stream sParentStream)
@@ -111,12 +124,14 @@ namespace KeePassLib.Serialization
uint uTagCounter = 0;
bool bSupportsStatus = (m_slLogger != null);
+ long lStreamLength = 1;
try
{
- sParentStream.Position.ToString();
- sParentStream.Length.ToString();
+ sParentStream.Position.ToString(); // Test Position support
+ lStreamLength = sParentStream.Length;
}
catch(Exception) { bSupportsStatus = false; }
+ if(lStreamLength <= 0) { Debug.Assert(false); lStreamLength = 1; }
m_bReadNextNode = true;
@@ -148,8 +163,17 @@ namespace KeePassLib.Serialization
++uTagCounter;
if(((uTagCounter % 256) == 0) && bSupportsStatus)
- m_slLogger.SetProgress((uint)((sParentStream.Position * 100) /
- sParentStream.Length));
+ {
+ Debug.Assert(lStreamLength == sParentStream.Length);
+ uint uPct = (uint)((sParentStream.Position * 100) /
+ lStreamLength);
+
+ // Clip percent value in case the stream reports incorrect
+ // position/length values (M120413)
+ if(uPct > 100) { Debug.Assert(false); uPct = 100; }
+
+ m_slLogger.SetProgress(uPct);
+ }
}
Debug.Assert(ctx == KdbContext.Null);
diff --git a/KeePassLib/Serialization/Kdb4File.Read.cs b/KeePassLib/Serialization/Kdb4File.Read.cs
index 57aea0f..96ba492 100644
--- a/KeePassLib/Serialization/Kdb4File.Read.cs
+++ b/KeePassLib/Serialization/Kdb4File.Read.cs
@@ -75,8 +75,7 @@ namespace KeePassLib.Serialization
HashingStreamEx hashedStream = new HashingStreamEx(sSource, false, null);
- UTF8Encoding encNoBom = new UTF8Encoding(false, false);
-
+ UTF8Encoding encNoBom = StrUtil.Utf8;
try
{
BinaryReaderEx br = null;
diff --git a/KeePassLib/Serialization/Kdb4File.Write.cs b/KeePassLib/Serialization/Kdb4File.Write.cs
index 12e3a8c..b16af6f 100644
--- a/KeePassLib/Serialization/Kdb4File.Write.cs
+++ b/KeePassLib/Serialization/Kdb4File.Write.cs
@@ -83,7 +83,7 @@ namespace KeePassLib.Serialization
HashingStreamEx hashedStream = new HashingStreamEx(sSaveTo, true, null);
- UTF8Encoding encNoBom = new UTF8Encoding(false, false);
+ UTF8Encoding encNoBom = StrUtil.Utf8;
CryptoRandom cr = CryptoRandom.Instance;
try
@@ -806,7 +806,7 @@ namespace KeePassLib.Serialization
f.m_format = Kdb4Format.PlainXml;
XmlTextWriter xtw = null;
- try { xtw = new XmlTextWriter(msOutput, new UTF8Encoding(false)); }
+ try { xtw = new XmlTextWriter(msOutput, StrUtil.Utf8); }
catch(Exception) { Debug.Assert(false); return false; }
if(xtw == null) { Debug.Assert(false); return false; }
diff --git a/KeePassLib/Translation/KPTranslation.cs b/KeePassLib/Translation/KPTranslation.cs
index 27d0e22..2747bfa 100644
--- a/KeePassLib/Translation/KPTranslation.cs
+++ b/KeePassLib/Translation/KPTranslation.cs
@@ -28,6 +28,9 @@ using System.ComponentModel;
using System.Drawing;
using System.Diagnostics;
+using KeePassLib.Interfaces;
+using KeePassLib.Utility;
+
#if !KeePassLibSD
using System.IO.Compression;
#else
@@ -89,8 +92,11 @@ namespace KeePassLib.Translation
}
}
- public static void SaveToFile(KPTranslation kpTrl, string strFileName)
+ public static void SaveToFile(KPTranslation kpTrl, string strFileName,
+ IXmlSerializerEx xs)
{
+ if(xs == null) throw new ArgumentNullException("xs");
+
FileStream fs = new FileStream(strFileName, FileMode.Create,
FileAccess.Write, FileShare.None);
@@ -102,22 +108,24 @@ namespace KeePassLib.Translation
XmlWriterSettings xws = new XmlWriterSettings();
xws.CheckCharacters = true;
- xws.Encoding = new UTF8Encoding(false);
+ xws.Encoding = StrUtil.Utf8;
xws.Indent = true;
xws.IndentChars = "\t";
XmlWriter xw = XmlWriter.Create(gz, xws);
- XmlSerializer xmlSerial = new XmlSerializer(typeof(KPTranslation));
- xmlSerial.Serialize(xw, kpTrl);
+ xs.Serialize(xw, kpTrl);
xw.Close();
gz.Close();
fs.Close();
}
- public static KPTranslation LoadFromFile(string strFile)
+ public static KPTranslation LoadFromFile(string strFile,
+ IXmlSerializerEx xs)
{
+ if(xs == null) throw new ArgumentNullException("xs");
+
FileStream fs = new FileStream(strFile, FileMode.Open,
FileAccess.Read, FileShare.Read);
@@ -127,8 +135,7 @@ namespace KeePassLib.Translation
GZipInputStream gz = new GZipInputStream(fs);
#endif
- XmlSerializer xmlSerial = new XmlSerializer(typeof(KPTranslation));
- KPTranslation kpTrl = (xmlSerial.Deserialize(gz) as KPTranslation);
+ KPTranslation kpTrl = (xs.Deserialize(gz) as KPTranslation);
gz.Close();
fs.Close();
diff --git a/KeePassLib/Utility/MemUtil.cs b/KeePassLib/Utility/MemUtil.cs
index dabf0d8..94e8207 100644
--- a/KeePassLib/Utility/MemUtil.cs
+++ b/KeePassLib/Utility/MemUtil.cs
@@ -326,5 +326,41 @@ namespace KeePassLib.Utility
msData.Close();
return pbData;
}
+
+ public static int IndexOf<T>(T[] vHaystack, T[] vNeedle)
+ where T : IEquatable<T>
+ {
+ if(vHaystack == null) throw new ArgumentNullException("vHaystack");
+ if(vNeedle == null) throw new ArgumentNullException("vNeedle");
+ if(vNeedle.Length == 0) return 0;
+
+ for(int i = 0; i <= (vHaystack.Length - vNeedle.Length); ++i)
+ {
+ bool bFound = true;
+ for(int m = 0; m < vNeedle.Length; ++m)
+ {
+ if(!vHaystack[i + m].Equals(vNeedle[m]))
+ {
+ bFound = false;
+ break;
+ }
+ }
+ if(bFound) return i;
+ }
+
+ return -1;
+ }
+
+ public static T[] Mid<T>(T[] v, int iOffset, int iLength)
+ {
+ if(v == null) throw new ArgumentNullException("v");
+ if(iOffset < 0) throw new ArgumentOutOfRangeException("iOffset");
+ if(iLength < 0) throw new ArgumentOutOfRangeException("iLength");
+ if(iOffset + iLength > v.Length) throw new ArgumentException();
+
+ T[] r = new T[iLength];
+ Array.Copy(v, iOffset, r, 0, iLength);
+ return r;
+ }
}
}
diff --git a/KeePassLib/Utility/MessageService.cs b/KeePassLib/Utility/MessageService.cs
index 00044d5..4085382 100644
--- a/KeePassLib/Utility/MessageService.cs
+++ b/KeePassLib/Utility/MessageService.cs
@@ -346,6 +346,12 @@ namespace KeePassLib.Utility
public static void ShowLoadWarning(string strFilePath, Exception ex)
{
+ ShowLoadWarning(strFilePath, ex, false);
+ }
+
+ public static void ShowLoadWarning(string strFilePath, Exception ex,
+ bool bFullException)
+ {
string str = string.Empty;
if((strFilePath != null) && (strFilePath.Length > 0))
@@ -354,7 +360,11 @@ namespace KeePassLib.Utility
str += KLRes.FileLoadFailed;
if((ex != null) && (ex.Message != null) && (ex.Message.Length > 0))
- str += MessageService.NewParagraph + ex.Message;
+ {
+ str += MessageService.NewParagraph;
+ if(!bFullException) str += ex.Message;
+ else str += ObjectsToMessage(new object[] { ex }, true);
+ }
ShowWarning(str);
}
@@ -362,7 +372,7 @@ namespace KeePassLib.Utility
public static void ShowLoadWarning(IOConnectionInfo ioConnection, Exception ex)
{
if(ioConnection != null)
- ShowLoadWarning(ioConnection.GetDisplayName(), ex);
+ ShowLoadWarning(ioConnection.GetDisplayName(), ex, false);
else ShowWarning(ex);
}
diff --git a/KeePassLib/Utility/StrUtil.cs b/KeePassLib/Utility/StrUtil.cs
index de01625..0ed0281 100644
--- a/KeePassLib/Utility/StrUtil.cs
+++ b/KeePassLib/Utility/StrUtil.cs
@@ -23,7 +23,6 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Drawing;
-// using System.Drawing.Imaging;
using System.IO;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
@@ -112,6 +111,73 @@ namespace KeePassLib.Utility
}
}
+ public enum StrEncodingType
+ {
+ Unknown = 0,
+ Default,
+ Ascii,
+ Utf7,
+ Utf8,
+ Utf16LE,
+ Utf16BE,
+ Utf32LE,
+ Utf32BE
+ }
+
+ public sealed class StrEncodingInfo
+ {
+ private readonly StrEncodingType m_type;
+ public StrEncodingType Type
+ {
+ get { return m_type; }
+ }
+
+ private readonly string m_strName;
+ public string Name
+ {
+ get { return m_strName; }
+ }
+
+ private readonly Encoding m_enc;
+ public Encoding Encoding
+ {
+ get { return m_enc; }
+ }
+
+ private readonly uint m_cbCodePoint;
+ /// <summary>
+ /// Size of a character in bytes.
+ /// </summary>
+ public uint CodePointSize
+ {
+ get { return m_cbCodePoint; }
+ }
+
+ private readonly byte[] m_vSig;
+ /// <summary>
+ /// Start signature of the text (byte order mark).
+ /// May be <c>null</c> or empty, if no signature is known.
+ /// </summary>
+ public byte[] StartSignature
+ {
+ get { return m_vSig; }
+ }
+
+ public StrEncodingInfo(StrEncodingType t, string strName, Encoding enc,
+ uint cbCodePoint, byte[] vStartSig)
+ {
+ if(strName == null) throw new ArgumentNullException("strName");
+ if(enc == null) throw new ArgumentNullException("enc");
+ if(cbCodePoint <= 0) throw new ArgumentOutOfRangeException("cbCodePoint");
+
+ m_type = t;
+ m_strName = strName;
+ m_enc = enc;
+ m_cbCodePoint = cbCodePoint;
+ m_vSig = vStartSig;
+ }
+ }
+
/// <summary>
/// A class containing various string helper methods.
/// </summary>
@@ -136,11 +202,54 @@ namespace KeePassLib.Utility
{
get
{
- if(m_encUtf8 == null) m_encUtf8 = new UTF8Encoding(false);
+ if(m_encUtf8 == null) m_encUtf8 = new UTF8Encoding(false, false);
return m_encUtf8;
}
}
+ private static List<StrEncodingInfo> m_lEncs = null;
+ public static IEnumerable<StrEncodingInfo> Encodings
+ {
+ get
+ {
+ if(m_lEncs == null)
+ {
+ m_lEncs = new List<StrEncodingInfo>();
+
+ m_lEncs.Add(new StrEncodingInfo(StrEncodingType.Default,
+#if !KeePassLibSD
+ Encoding.Default.EncodingName,
+#else
+ Encoding.Default.WebName,
+#endif
+ Encoding.Default,
+ (uint)Encoding.Default.GetBytes("a").Length, null));
+ m_lEncs.Add(new StrEncodingInfo(StrEncodingType.Ascii,
+ "ASCII", Encoding.ASCII, 1, null));
+ m_lEncs.Add(new StrEncodingInfo(StrEncodingType.Utf7,
+ "Unicode (UTF-7)", Encoding.UTF7, 1, null));
+ m_lEncs.Add(new StrEncodingInfo(StrEncodingType.Utf8,
+ "Unicode (UTF-8)", StrUtil.Utf8, 1, new byte[] { 0xEF, 0xBB, 0xBF }));
+ m_lEncs.Add(new StrEncodingInfo(StrEncodingType.Utf16LE,
+ "Unicode (UTF-16 LE)", new UnicodeEncoding(false, false),
+ 2, new byte[] { 0xFF, 0xFE }));
+ m_lEncs.Add(new StrEncodingInfo(StrEncodingType.Utf16BE,
+ "Unicode (UTF-16 BE)", new UnicodeEncoding(true, false),
+ 2, new byte[] { 0xFE, 0xFF }));
+#if !KeePassLibSD
+ m_lEncs.Add(new StrEncodingInfo(StrEncodingType.Utf32LE,
+ "Unicode (UTF-32 LE)", new UTF32Encoding(false, false),
+ 4, new byte[] { 0xFF, 0xFE, 0x0, 0x0 }));
+ m_lEncs.Add(new StrEncodingInfo(StrEncodingType.Utf32BE,
+ "Unicode (UTF-32 BE)", new UTF32Encoding(true, false),
+ 4, new byte[] { 0x0, 0x0, 0xFE, 0xFF }));
+#endif
+ }
+
+ return m_lEncs;
+ }
+ }
+
// public static string RtfPar
// {
// // get { return (m_bRtl ? "\\rtlpar " : "\\par "); }
@@ -685,7 +794,7 @@ namespace KeePassLib.Utility
{
if(string.IsNullOrEmpty(str)) return false; // No assert
- string s = str.ToLower().Trim();
+ string s = str.Trim().ToLower();
if(s == "true") return true;
if(s == "yes") return true;
if(s == "1") return true;
@@ -699,7 +808,7 @@ namespace KeePassLib.Utility
{
if(string.IsNullOrEmpty(str)) return null;
- string s = str.ToLower().Trim();
+ string s = str.Trim().ToLower();
if(s == "true") return true;
if(s == "false") return false;
@@ -806,11 +915,11 @@ namespace KeePassLib.Utility
}
private static readonly char[] m_vVersionSep = new char[]{ '.', ',' };
- public static ulong GetVersion(string strVersion)
+ public static ulong ParseVersion(string strVersion)
{
if(strVersion == null) { Debug.Assert(false); return 0; }
- string[] vVer = strVersion.Trim().Split(m_vVersionSep);
+ string[] vVer = strVersion.Split(m_vVersionSep);
if((vVer == null) || (vVer.Length == 0)) { Debug.Assert(false); return 0; }
ushort uPart;
@@ -840,7 +949,14 @@ namespace KeePassLib.Utility
public static string VersionToString(ulong uVersion)
{
+ return VersionToString(uVersion, false);
+ }
+
+ public static string VersionToString(ulong uVersion,
+ bool bEnsureAtLeastTwoComp)
+ {
string str = string.Empty;
+ bool bMultiComp = false;
for(int i = 0; i < 4; ++i)
{
@@ -848,13 +964,21 @@ namespace KeePassLib.Utility
if((us != 0) || (str.Length > 0))
{
- if(str.Length > 0) str = "." + str;
+ if(str.Length > 0)
+ {
+ str = "." + str;
+ bMultiComp = true;
+ }
+
str = us.ToString() + str;
}
uVersion >>= 16;
}
+ if(bEnsureAtLeastTwoComp && !bMultiComp && (str.Length > 0))
+ str += ".0";
+
return str;
}
@@ -1099,20 +1223,6 @@ namespace KeePassLib.Utility
return ((x.Length > y.Length) ? -1 : 1);
}
- /* public static string ImageToDataUri(Image img)
- {
- if(img == null) { Debug.Assert(false); return string.Empty; }
-
- MemoryStream ms = new MemoryStream();
- img.Save(ms, ImageFormat.Png);
-
- byte[] pbImage = ms.ToArray();
- string strImage = Convert.ToBase64String(pbImage);
-
- ms.Close();
- return ("data:image/png;base64," + strImage);
- } */
-
public static bool IsDataUri(string strUri)
{
if(strUri == null) { Debug.Assert(false); return false; }
@@ -1200,5 +1310,25 @@ namespace KeePassLib.Utility
return str;
}
+
+ public static StrEncodingInfo GetEncoding(StrEncodingType t)
+ {
+ foreach(StrEncodingInfo sei in StrUtil.Encodings)
+ {
+ if(sei.Type == t) return sei;
+ }
+
+ return null;
+ }
+
+ public static StrEncodingInfo GetEncoding(string strName)
+ {
+ foreach(StrEncodingInfo sei in StrUtil.Encodings)
+ {
+ if(sei.Name == strName) return sei;
+ }
+
+ return null;
+ }
}
}
diff --git a/KeePassLib/Utility/UrlUtil.cs b/KeePassLib/Utility/UrlUtil.cs
index 2e88858..5d01cfd 100644
--- a/KeePassLib/Utility/UrlUtil.cs
+++ b/KeePassLib/Utility/UrlUtil.cs
@@ -226,7 +226,7 @@ namespace KeePassLib.Utility
if(strUrl == null) throw new ArgumentNullException("strUrl");
string str = strUrl;
- if(str.ToLower().StartsWith(@"file:///"))
+ if(str.StartsWith(@"file:///", StrUtil.CaseIgnoreCmp))
str = str.Substring(8, str.Length - 8);
str = str.Replace('/', Path.DirectorySeparatorChar);
@@ -563,5 +563,30 @@ namespace KeePassLib.Utility
return str;
}
+
+ public static bool AssemblyEquals(string strExt, string strShort)
+ {
+ if((strExt == null) || (strShort == null)) { Debug.Assert(false); return false; }
+
+ if(strExt.Equals(strShort, StrUtil.CaseIgnoreCmp) ||
+ strExt.StartsWith(strShort + ",", StrUtil.CaseIgnoreCmp))
+ return true;
+
+ if(!strShort.EndsWith(".dll", StrUtil.CaseIgnoreCmp))
+ {
+ if(strExt.Equals(strShort + ".dll", StrUtil.CaseIgnoreCmp) ||
+ strExt.StartsWith(strShort + ".dll,", StrUtil.CaseIgnoreCmp))
+ return true;
+ }
+
+ if(!strShort.EndsWith(".exe", StrUtil.CaseIgnoreCmp))
+ {
+ if(strExt.Equals(strShort + ".exe", StrUtil.CaseIgnoreCmp) ||
+ strExt.StartsWith(strShort + ".exe,", StrUtil.CaseIgnoreCmp))
+ return true;
+ }
+
+ return false;
+ }
}
}
diff --git a/KeePassLibSD/KeePassLibSD.csproj b/KeePassLibSD/KeePassLibSD.csproj
index 278c110..3e4bf78 100644
--- a/KeePassLibSD/KeePassLibSD.csproj
+++ b/KeePassLibSD/KeePassLibSD.csproj
@@ -149,6 +149,9 @@
<Compile Include="..\KeePassLib\Interfaces\IUIOperations.cs">
<Link>Interfaces\IUIOperations.cs</Link>
</Compile>
+ <Compile Include="..\KeePassLib\Interfaces\IXmlSerializerEx.cs">
+ <Link>Interfaces\IXmlSerializerEx.cs</Link>
+ </Compile>
<Compile Include="..\KeePassLib\Keys\CompositeKey.cs">
<Link>Keys\CompositeKey.cs</Link>
</Compile>
diff --git a/KeePassLibSD/Properties/AssemblyInfo.cs b/KeePassLibSD/Properties/AssemblyInfo.cs
index 2e15a1e..7ec1fff 100644
--- a/KeePassLibSD/Properties/AssemblyInfo.cs
+++ b/KeePassLibSD/Properties/AssemblyInfo.cs
@@ -38,4 +38,4 @@ using System.Runtime.InteropServices;
[assembly: Guid("1d3c6f10-e10b-47be-a2f1-af2562d7d470")]
// Assembly version information
-[assembly: AssemblyVersion("2.1.8.*")]
+[assembly: AssemblyVersion("2.19.0.*")]
diff --git a/ShInstUtil/ShInstUtil.rc b/ShInstUtil/ShInstUtil.rc
index 709da0d..a95027b 100644
--- a/ShInstUtil/ShInstUtil.rc
+++ b/ShInstUtil/ShInstUtil.rc
@@ -65,8 +65,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,1,8,0
- PRODUCTVERSION 2,1,8,0
+ FILEVERSION 2,19,0,0
+ PRODUCTVERSION 2,19,0,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -83,12 +83,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Dominik Reichl"
VALUE "FileDescription", "ShInstUtil - KeePass Helper Utility"
- VALUE "FileVersion", "2, 1, 8, 0"
+ VALUE "FileVersion", "2, 19, 0, 0"
VALUE "InternalName", "ShInstUtil"
VALUE "LegalCopyright", "Copyright (c) 2007-2012 Dominik Reichl"
VALUE "OriginalFilename", "ShInstUtil.exe"
VALUE "ProductName", "ShInstUtil - KeePass Helper Utility"
- VALUE "ProductVersion", "2, 1, 8, 0"
+ VALUE "ProductVersion", "2, 19, 0, 0"
END
END
BLOCK "VarFileInfo"
diff --git a/Translation/DefaultText.xml b/Translation/DefaultText.xml
index adddc4f..c751cb3 100644
--- a/Translation/DefaultText.xml
+++ b/Translation/DefaultText.xml
@@ -103,6 +103,9 @@
<Data Name="Author">
<Value>Author</Value>
</Data>
+ <Data Name="Auto">
+ <Value>Auto</Value>
+ </Data>
<Data Name="AutoCreateNew">
<Value>Automatically create new</Value>
</Data>
@@ -139,6 +142,9 @@
<Data Name="AutoTypeGlobalHint">
<Value>If you want KeePass to search the active database for a matching entry and auto-type it, use the 'Global auto-type' hot key.</Value>
</Data>
+ <Data Name="AutoTypeMatchByTagInTitle">
+ <Value>An entry matches if one of its tags is contained in the target window title</Value>
+ </Data>
<Data Name="AutoTypeMatchByTitle">
<Value>An entry matches if its title is contained in the target window title</Value>
</Data>
@@ -253,6 +259,9 @@
<Data Name="CloseButtonMinimizes">
<Value>Close button [X] minimizes main window instead of terminating the application</Value>
</Data>
+ <Data Name="ClosingDatabaseFile">
+ <Value>Closing database file</Value>
+ </Data>
<Data Name="Column">
<Value>Column</Value>
</Data>
@@ -547,9 +556,6 @@
<Data Name="Encoding">
<Value>Encoding</Value>
</Data>
- <Data Name="EncodingAnsi">
- <Value>Default ANSI (System)</Value>
- </Data>
<Data Name="EncodingFail">
<Value>Selected encoding is invalid. The file cannot be interpreted using the selected encoding.</Value>
</Data>
@@ -640,6 +646,9 @@
<Data Name="Feature">
<Value>Feature</Value>
</Data>
+ <Data Name="Field">
+ <Value>Field</Value>
+ </Data>
<Data Name="FieldName">
<Value>Field Name</Value>
</Data>
@@ -1123,6 +1132,9 @@
<Data Name="NeverExpires">
<Value>Never expires</Value>
</Data>
+ <Data Name="New">
+ <Value>New</Value>
+ </Data>
<Data Name="NewDatabase">
<Value>New Database</Value>
</Data>
@@ -1135,6 +1147,9 @@
<Data Name="NewGroup">
<Value>New Group</Value>
</Data>
+ <Data Name="NewLine">
+ <Value>New line</Value>
+ </Data>
<Data Name="NewState">
<Value>New state</Value>
</Data>
@@ -1414,6 +1429,9 @@
<Data Name="RepairMode">
<Value>Repair Mode</Value>
</Data>
+ <Data Name="RepeatOnlyWhenHidden">
+ <Value>Require password repetition only when hiding using asterisks is enabled</Value>
+ </Data>
<Data Name="RestartKeePassQuestion">
<Value>Do you wish to restart KeePass now?</Value>
</Data>
@@ -1453,6 +1471,12 @@
<Data Name="SavingDatabaseFile">
<Value>Saving database file</Value>
</Data>
+ <Data Name="SavingPost">
+ <Value>after saving</Value>
+ </Data>
+ <Data Name="SavingPre">
+ <Value>before saving</Value>
+ </Data>
<Data Name="Scheme">
<Value>Scheme</Value>
</Data>
@@ -1745,7 +1769,7 @@
<Value>KeePass can automatically check for updates on each program start.</Value>
</Data>
<Data Name="UpdateCheckInfoPriv">
- <Value>No personal information is sent to the KeePass server. KeePass just downloads a small version information file and compares the available version with the installed version.</Value>
+ <Value>No personal information is sent to the KeePass web server. KeePass just downloads a small version information file and compares the available version with the installed version.</Value>
</Data>
<Data Name="UpdateCheckInfoRes">
<Value>Automatic update checks are performed unintrusively in the background. A notification is only displayed when an update is available. Updates are not downloaded or installed automatically.</Value>
@@ -1831,6 +1855,9 @@
<Data Name="Wait">
<Value>Wait</Value>
</Data>
+ <Data Name="WaitForExit">
+ <Value>Wait for exit</Value>
+ </Data>
<Data Name="Warnings">
<Value>Warnings</Value>
</Data>
@@ -1870,6 +1897,9 @@
<Data Name="Yes">
<Value>Yes</Value>
</Data>
+ <Data Name="Zoom">
+ <Value>Zoom</Value>
+ </Data>
</StringTable>
<StringTable Name="KLRes" Namespace="KeePassLib.Resources">
diff --git a/Translation/TrlUtil/FormTrlMgr.cs b/Translation/TrlUtil/FormTrlMgr.cs
index c30e8f0..84015f8 100644
--- a/Translation/TrlUtil/FormTrlMgr.cs
+++ b/Translation/TrlUtil/FormTrlMgr.cs
@@ -47,6 +47,7 @@ namespace TrlUtil
AddForm(l, new AutoTypeCtxForm());
AddForm(l, new CharPickerForm());
AddForm(l, new ColumnsForm());
+ AddForm(l, new CsvImportForm());
AddForm(l, new DatabaseOperationsForm());
AddForm(l, new DatabaseSettingsForm());
AddForm(l, new DataEditorForm());
@@ -68,7 +69,6 @@ namespace TrlUtil
AddForm(l, new GroupForm());
AddForm(l, new HelpSourceForm());
AddForm(l, new IconPickerForm());
- AddForm(l, new ImportCsvForm());
AddForm(l, new ImportMethodForm());
AddForm(l, new InternalBrowserForm());
AddForm(l, new IOConnectionForm());
diff --git a/Translation/TrlUtil/MainForm.cs b/Translation/TrlUtil/MainForm.cs
index 30e7d8b..cb3ebd4 100644
--- a/Translation/TrlUtil/MainForm.cs
+++ b/Translation/TrlUtil/MainForm.cs
@@ -30,6 +30,7 @@ using KeePass.App;
using KeePass.Resources;
using KeePass.UI;
using KeePass.Util;
+using KeePass.Util.XmlSerialization;
using KeePassLib;
using KeePassLib.Resources;
@@ -143,6 +144,9 @@ namespace TrlUtil
KPStringTable kpstSM = new KPStringTable();
kpstSM.Name = "KeePass.Forms.PwEntryForm.m_ctxStrMoveToStandard";
m_trl.StringTables.Add(kpstSM);
+ KPStringTable kpstBA = new KPStringTable();
+ kpstBA.Name = "KeePass.Forms.PwEntryForm.m_ctxBinAttach";
+ m_trl.StringTables.Add(kpstBA);
KPStringTable kpstTT = new KPStringTable();
kpstTT.Name = "KeePass.Forms.EcasTriggersForm.m_ctxTools";
m_trl.StringTables.Add(kpstTT);
@@ -279,6 +283,10 @@ namespace TrlUtil
m_lvStrings.Groups.Add(lvg);
TrlAddMenuCommands(kpstSM, lvg, ef.StandardStringMovementContextMenu.Items);
+ lvg = new ListViewGroup("Entry Attachments Context Menu Commands");
+ m_lvStrings.Groups.Add(lvg);
+ TrlAddMenuCommands(kpstBA, lvg, ef.AttachmentsContextMenu.Items);
+
Type tSD = typeof(KSRes);
lvg = new ListViewGroup("KeePassLibSD Strings");
m_lvStrings.Groups.Add(lvg);
@@ -391,7 +399,11 @@ namespace TrlUtil
if(ofd.ShowDialog() != DialogResult.OK) return;
KPTranslation kpTrl = null;
- try { kpTrl = KPTranslation.LoadFromFile(ofd.FileName); }
+ try
+ {
+ XmlSerializerEx xs = new XmlSerializerEx(typeof(KPTranslation));
+ kpTrl = KPTranslation.LoadFromFile(ofd.FileName, xs);
+ }
catch(Exception ex)
{
MessageBox.Show(ex.Message, "TrlUtil", MessageBoxButtons.OK,
@@ -528,7 +540,8 @@ namespace TrlUtil
try
{
- KPTranslation.SaveToFile(m_trl, m_strFile);
+ XmlSerializerEx xs = new XmlSerializerEx(typeof(KPTranslation));
+ KPTranslation.SaveToFile(m_trl, m_strFile, xs);
m_bModified = false;
}
catch(Exception ex)
@@ -638,8 +651,8 @@ namespace TrlUtil
if(iIndex < m_lvStrings.Items.Count - 1)
{
lvsic[0].Selected = false;
- m_lvStrings.Items[iIndex + 1].Selected = true;
- m_lvStrings.FocusedItem = m_lvStrings.Items[iIndex + 1];
+ UIUtil.SetFocusedItem(m_lvStrings, m_lvStrings.Items[
+ iIndex + 1], true);
}
m_bModified = true;
@@ -852,7 +865,7 @@ namespace TrlUtil
{
if(lvsi.Text.IndexOf(strFind, StrUtil.CaseIgnoreCmp) >= 0)
{
- m_lvStrings.FocusedItem = lvi;
+ UIUtil.SetFocusedItem(m_lvStrings, lvi, false);
m_lvStrings.SelectedItems.Clear();
lvi.Selected = true;
diff --git a/Translation/TrlUtil/Properties/AssemblyInfo.cs b/Translation/TrlUtil/Properties/AssemblyInfo.cs
index 80a5c12..aca8622 100644
--- a/Translation/TrlUtil/Properties/AssemblyInfo.cs
+++ b/Translation/TrlUtil/Properties/AssemblyInfo.cs
@@ -38,5 +38,5 @@ using System.Runtime.InteropServices;
[assembly: Guid("39aa6f93-a1c9-497f-bad2-cc42a61d5710")]
// Assembly version information
-[assembly: AssemblyVersion("2.1.8.0")]
-[assembly: AssemblyFileVersion("2.1.8.0")]
+[assembly: AssemblyVersion("2.19.0.*")]
+[assembly: AssemblyFileVersion("2.19.0.0")]
--
keepass2
More information about the Pkg-cli-apps-commits
mailing list