Compare commits

...

42 commits

Author SHA1 Message Date
Justin Aquadro
15b1b2891f Missing a check in nbtutil 2017-11-24 03:05:29 -05:00
Justin Aquadro
e26a29580a forgot to update typeprinter 2017-11-24 03:02:59 -05:00
Justin Aquadro
d29f249d7e Add support for long array tags 2017-11-24 02:42:34 -05:00
Justin Aquadro
931ac752f5 Fix InnerException reporting 2015-08-10 23:19:56 -04:00
Justin Aquadro
97386a4e5f Updated sln 2015-08-10 23:19:43 -04:00
Justin Aquadro
9d640079b8 Add JSON exporter to NBTUtil 2015-06-16 01:16:31 -04:00
Justin Aquadro
2882fcde17 Add a few more known NBT extensions to the file pattern for directory enumeration. Closes #21. File-based open can already handle all extensions, from #31. 2015-04-18 16:41:58 -04:00
Justin Aquadro
60a7bbf8e9 Add read/modify/delete support for short array tags. As this is nonstandard NBT, creation will not be supported. Will be changed in the future if Mojang updates their specification. 2015-04-18 16:37:10 -04:00
Justin Aquadro
27110539a8 Allow deleting chunks from region files. 2015-04-18 14:23:41 -04:00
Justin Aquadro
5d456cf743 Merge pull request #32 from codewarrior0/open-unknown-as-nbt
When opening files directly, try opening as NBT if no registered filetypes were able to open them.
2015-04-14 02:02:10 -04:00
David Vierra
a279bb281e When opening files directly, try opening as NBT if no registered filetypes were able to open them.
Allows associating *.bpt, *.rs, *.thaum, and other extensions with NBTExplorer.
2015-04-10 21:29:12 -10:00
Justin Aquadro
a9f40fc596 Merge pull request #29 from maruohon/paste-into-empty-list
Allow pasting tags to an empty List. Converts the list's type.
2015-03-18 01:48:55 -04:00
Justin Aquadro
3916b8d362 Merge pull request #28 from codewarrior0/unsort-lists
When sorting the children of a TAG_LIST, preserve the original order.
2015-03-18 01:46:56 -04:00
Matti Ruohonen
26780b841d Allow pasting tags to an empty List. Converts the list's type. 2015-03-17 12:11:34 +02:00
David Vierra
f2688a8f9f When sorting the children of a TAG_LIST, preserve the original order. Order matters for TAG_LISTs. 2015-03-06 00:51:58 -10:00
Justin Aquadro
abde7d87c9 Merge pull request #27 from TepigMC/master
Fixed Typo
2015-03-03 08:02:05 -05:00
Andrew Archibald
3dc86b8b7c Fixed Typo 2015-03-02 21:22:05 -08:00
Justin Aquadro
1fd6ec2680 Add absolute world chunk coordinate to chunk names. 2015-02-28 14:50:42 -05:00
Justin Aquadro
975c11d3d8 Merge pull request #26 from codewarrior0/natural-sort
Change natural comparer to respect negative numbers
2015-02-27 00:11:55 -05:00
David Vierra
7a151d3e6f Change natural comparer to respect negative numbers 2015-02-26 18:53:55 -10:00
Justin Aquadro
db5d2a05c0 Change string compare to natural compare 2015-02-26 23:21:44 -05:00
David Vierra
5c32832281 Make directories sort before files in sort order.
Change identifiers to match existing style.
2015-02-25 23:32:57 -10:00
David Vierra
d8229f7ec5 Add new sort order to NBT Tree view.
Compounds first, then lists, then plain old data, then array types.
2015-02-25 23:23:18 -10:00
Justin Aquadro
fc63457d8e Fix key collision crash in some searches. Add version to About dialog. 2014-09-16 02:04:27 -04:00
Justin Aquadro
d3e53ac559 Update version info 2014-04-01 22:30:08 -04:00
Justin Aquadro
c9014d8b1f Change checkbox behavior on Basic Find 2014-04-01 22:26:05 -04:00
Justin Aquadro
2a043ba09c Fix crash when refreshing nodes with list tag on modified path. 2014-04-01 22:21:38 -04:00
Justin Aquadro
6412629678 Make logging actually succeed 2014-04-01 21:41:45 -04:00
Justin Aquadro
f3304f51a1 Fix crash when refreshing an unexpanded node. Improve error logging. 2014-03-31 20:53:41 -04:00
Justin Aquadro
3e6240d895 Fix array editor disabled 2014-03-31 00:10:39 -04:00
Justin Aquadro
e1096e29ca fix absolute path crash 2014-02-20 02:23:38 -05:00
Justin Aquadro
b303551fa0 Update installer version 2014-02-20 02:03:45 -05:00
Justin Aquadro
16ec47a411 File organization; added wildcard and glob matching to NBTUtil paths 2014-02-20 01:58:40 -05:00
Justin Aquadro
c5debf12d4 Fix bugs in search rule matching 2014-02-19 20:29:22 -05:00
Justin Aquadro
d4ad1bd99a Restructuring project to support separate command-line utility 2014-02-16 02:56:27 -05:00
Justin Aquadro
a03537bb99 Add Open in Explorer to context menu 2013-12-18 23:12:42 -05:00
Justin Aquadro
2d70d2af10 Merge branch 'master' of https://github.com/flarn2006/NBTExplorer 2013-12-18 22:47:27 -05:00
Justin Aquadro
5d51967501 Try to improve control flicker 2013-12-18 22:45:05 -05:00
flarn2006
ab4e789114 Added a menu item to open a directory in Explorer 2013-12-17 19:39:21 -05:00
flarn2006
b642b3aee4 Don't want to mess with the keyboard shortcut
See previous commit/added comments
2013-12-17 19:24:15 -05:00
flarn2006
400eb1f80a Hold down Ctrl to avoid using folder browse dlg
That dialog just plain sucks...you can't type in a path, for instance.
2013-12-17 19:17:15 -05:00
Justin Aquadro
366ec3fe9e More rigorous startup failure checking and reporting 2013-11-17 13:26:19 -05:00
90 changed files with 4259 additions and 1186 deletions

1
.gitignore vendored
View file

@ -5,3 +5,4 @@ obj
*.cache *.cache
*.userprefs *.userprefs
Staging/ Staging/
UpgradeLog*.htm

Binary file not shown.

View file

@ -3,7 +3,7 @@
<Product Id="*" <Product Id="*"
Name="NBTExplorer" Name="NBTExplorer"
Language="1033" Language="1033"
Version="2.6.0.0" Version="2.8.0.0"
Manufacturer="Justin Aquadro" Manufacturer="Justin Aquadro"
UpgradeCode="0bfb1026-21f2-4552-ad71-ca90aae10a25"> UpgradeCode="0bfb1026-21f2-4552-ad71-ca90aae10a25">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
@ -81,6 +81,15 @@
<Component Id="C.NBTExplorer.visualelementsmanifest.xml" Guid="*"> <Component Id="C.NBTExplorer.visualelementsmanifest.xml" Guid="*">
<File Source="../Staging/Windows/NBTExplorer.visualelementsmanifest.xml" KeyPath="yes" /> <File Source="../Staging/Windows/NBTExplorer.visualelementsmanifest.xml" KeyPath="yes" />
</Component> </Component>
<Component Id="C.NBTUtil.exe" Guid="*">
<File Source="../Staging/NBTUtil.exe" KeyPath="yes" />
</Component>
<Component Id="C.NBTUtil.exe.config" Guid="*">
<File Source="../Staging/NBTUtil.exe.config" KeyPath="yes" />
</Component>
<Component Id="C.NBTModel.dll" Guid="*">
<File Source="../Staging/NBTModel.dll" KeyPath="yes" />
</Component>
<Component Id="C.Substrate.dll" Guid="*"> <Component Id="C.Substrate.dll" Guid="*">
<File Source="../Staging/Substrate.dll" KeyPath="yes" /> <File Source="../Staging/Substrate.dll" KeyPath="yes" />
</Component> </Component>

View file

@ -1,13 +1,22 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 14
VisualStudioVersion = 12.0.21005.1 VisualStudioVersion = 14.0.23107.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTExplorer", "NBTExplorer\NBTExplorer.csproj", "{8A458245-8176-4599-95CD-3CA39F2435CE}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTExplorer", "NBTExplorer\NBTExplorer.csproj", "{8A458245-8176-4599-95CD-3CA39F2435CE}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTExplorerMac", "NBTExplorer\NBTExplorerMac.csproj", "{01F9A296-C477-4CBF-A0D0-41E697048257}"
EndProject
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "NBTExplorer.Installer", "NBTExplorer.Installer\NBTExplorer.Installer.wixproj", "{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}" Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "NBTExplorer.Installer", "NBTExplorer.Installer\NBTExplorer.Installer.wixproj", "{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}"
ProjectSection(ProjectDependencies) = postProject
{8A458245-8176-4599-95CD-3CA39F2435CE} = {8A458245-8176-4599-95CD-3CA39F2435CE}
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC} = {20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF} = {BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTUtil", "NBTUtil\NBTUtil.csproj", "{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTModel", "NBTModel\NBTModel.csproj", "{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Substrate (NET2)", "..\Substrate\SubstrateCS\Substrate (NET2).csproj", "{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -40,22 +49,6 @@ Global
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Mixed Platforms.Build.0 = Release|Any CPU {8A458245-8176-4599-95CD-3CA39F2435CE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|x86.ActiveCfg = Release|x86 {8A458245-8176-4599-95CD-3CA39F2435CE}.Release|x86.ActiveCfg = Release|x86
{8A458245-8176-4599-95CD-3CA39F2435CE}.Release|x86.Build.0 = Release|x86 {8A458245-8176-4599-95CD-3CA39F2435CE}.Release|x86.Build.0 = Release|x86
{01F9A296-C477-4CBF-A0D0-41E697048257}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.AppStore|Any CPU.Build.0 = AppStore|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.AppStore|Mixed Platforms.ActiveCfg = AppStore|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.AppStore|x86.ActiveCfg = AppStore|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|Any CPU.Build.0 = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|x86.ActiveCfg = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Debug|x86.Build.0 = Debug|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|Any CPU.ActiveCfg = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|Any CPU.Build.0 = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|x86.ActiveCfg = Release|Any CPU
{01F9A296-C477-4CBF-A0D0-41E697048257}.Release|x86.Build.0 = Release|Any CPU
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Any CPU.ActiveCfg = Release|x86 {A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Any CPU.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Mixed Platforms.ActiveCfg = Release|x86 {A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Mixed Platforms.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Mixed Platforms.Build.0 = Release|x86 {A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.AppStore|Mixed Platforms.Build.0 = Release|x86
@ -71,6 +64,55 @@ Global
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|Mixed Platforms.Build.0 = Release|x86 {A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|Mixed Platforms.Build.0 = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.ActiveCfg = Release|x86 {A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.Build.0 = Release|x86 {A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.Build.0 = Release|x86
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Any CPU.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|x86.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|x86.ActiveCfg = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Any CPU.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|x86.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Any CPU.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|x86.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|x86.ActiveCfg = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Any CPU.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|x86.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|x86.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|Any CPU.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|x86.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.AppStore|x86.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|x86.ActiveCfg = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Debug|x86.Build.0 = Debug|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|Any CPU.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|x86.ActiveCfg = Release|Any CPU
{AFE30E14-3F2F-4461-9F7D-147AB4DCA4C3}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View file

@ -6,6 +6,8 @@ using NBTExplorer.Model;
using NBTExplorer.Vendor.MultiSelectTreeView; using NBTExplorer.Vendor.MultiSelectTreeView;
using NBTExplorer.Windows; using NBTExplorer.Windows;
using Substrate.Nbt; using Substrate.Nbt;
using System.Collections;
using NBTExplorer.Utility;
namespace NBTExplorer.Controllers namespace NBTExplorer.Controllers
{ {
@ -20,6 +22,87 @@ namespace NBTExplorer.Controllers
} }
} }
public class NodeTreeComparer : IComparer
{
private NaturalComparer _comparer = new NaturalComparer();
public int OrderForTag(TagType tagID)
{
switch (tagID)
{
case TagType.TAG_COMPOUND:
return 0;
case TagType.TAG_LIST:
return 1;
case TagType.TAG_BYTE:
case TagType.TAG_SHORT:
case TagType.TAG_INT:
case TagType.TAG_LONG:
case TagType.TAG_FLOAT:
case TagType.TAG_DOUBLE:
case TagType.TAG_STRING:
return 2;
default:
return 3;
}
}
public int OrderForNode(object node)
{
if (node is DirectoryDataNode)
{
return 0;
}
else
{
return 1;
}
}
public int Compare(object x, object y)
{
TreeNode tx = x as TreeNode;
TreeNode ty = y as TreeNode;
TagDataNode dx = tx.Tag as TagDataNode;
TagDataNode dy = ty.Tag as TagDataNode;
if (dx == null || dy == null)
{
int nodeOrder = this.OrderForNode(tx.Tag).CompareTo(this.OrderForNode(ty.Tag));
if (nodeOrder != 0)
{
return nodeOrder;
}
else
{
return _comparer.Compare(tx.Text, ty.Text);
}
}
TagDataNode px = dx.Parent as TagDataNode;
TagDataNode py = dy.Parent as TagDataNode;
if (px != null && py != null)
{
if (px.Tag.GetTagType() == TagType.TAG_LIST || py.Tag.GetTagType() == TagType.TAG_LIST)
{
return 0;
}
}
TagType idx = dx.Tag.GetTagType();
TagType idy = dy.Tag.GetTagType();
int tagOrder = this.OrderForTag(idx).CompareTo(this.OrderForTag(idy));
if (tagOrder != 0)
{
return tagOrder;
}
else
{
return _comparer.Compare(dx.NodeDisplay, dy.NodeDisplay);
}
}
}
public class NodeTreeController public class NodeTreeController
{ {
private TreeView _nodeTree; private TreeView _nodeTree;
@ -33,6 +116,7 @@ namespace NBTExplorer.Controllers
public NodeTreeController (TreeView nodeTree) public NodeTreeController (TreeView nodeTree)
{ {
_nodeTree = nodeTree; _nodeTree = nodeTree;
nodeTree.TreeViewNodeSorter = new NodeTreeComparer();
_multiTree = nodeTree as MultiSelectTreeView; _multiTree = nodeTree as MultiSelectTreeView;
InitializeIconRegistry(); InitializeIconRegistry();
@ -147,6 +231,8 @@ namespace NBTExplorer.Controllers
node = item.Value.NodeCreate(path); node = item.Value.NodeCreate(path);
} }
if (node == null)
node = NbtFileDataNode.TryCreateFrom(path);
if (node != null) if (node != null)
_nodeTree.Nodes.Add(CreateUnexpandedNode(node)); _nodeTree.Nodes.Add(CreateUnexpandedNode(node));
else else
@ -676,7 +762,9 @@ namespace NBTExplorer.Controllers
_iconRegistry.Register(typeof(CubicRegionDataNode), 11); _iconRegistry.Register(typeof(CubicRegionDataNode), 11);
_iconRegistry.Register(typeof(NbtFileDataNode), 12); _iconRegistry.Register(typeof(NbtFileDataNode), 12);
_iconRegistry.Register(typeof(TagIntArrayDataNode), 14); _iconRegistry.Register(typeof(TagIntArrayDataNode), 14);
_iconRegistry.Register(typeof(RootDataNode), 16); _iconRegistry.Register(typeof(TagShortArrayDataNode), 16);
_iconRegistry.Register(typeof(TagLongArrayDataNode), 17);
_iconRegistry.Register(typeof(RootDataNode), 18);
} }
private void UpdateNodeText (TreeNode node) private void UpdateNodeText (TreeNode node)
@ -751,6 +839,14 @@ namespace NBTExplorer.Controllers
menu.Items.Add(itemDn); menu.Items.Add(itemDn);
} }
if (node is DirectoryDataNode) {
if (menu.Items.Count > 0)
menu.Items.Add(new ToolStripSeparator());
ToolStripMenuItem itemOpenExplorer = new ToolStripMenuItem("Open in E&xplorer", null, _contextOpenInExplorer_Click);
menu.Items.Add(itemOpenExplorer);
}
return (menu.Items.Count > 0) ? menu : null; return (menu.Items.Count > 0) ? menu : null;
} }
@ -791,6 +887,20 @@ namespace NBTExplorer.Controllers
MoveSelectionDown(); MoveSelectionDown();
} }
private void _contextOpenInExplorer_Click (object sender, EventArgs e)
{
if (_multiTree.SelectedNode != null && _multiTree.SelectedNode.Tag is DirectoryDataNode) {
DirectoryDataNode ddNode = _multiTree.SelectedNode.Tag as DirectoryDataNode;
try {
string path = (!Interop.IsWindows ? "file://" : "") + ddNode.NodeDirPath;
System.Diagnostics.Process.Start(path);
}
catch (Exception ex) {
MessageBox.Show(ex.Message, "Can't open directory", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
#region Capability Checking #region Capability Checking
#region Capability Predicates #region Capability Predicates
@ -847,6 +957,12 @@ namespace NBTExplorer.Controllers
return (dataNode != null) && dataNode.CanCreateTag(TagType.TAG_INT_ARRAY); return (dataNode != null) && dataNode.CanCreateTag(TagType.TAG_INT_ARRAY);
} }
public static bool CreateLongArrayNodePred (DataNode dataNode, out GroupCapabilities caps)
{
caps = GroupCapabilities.Single;
return (dataNode != null) && dataNode.CanCreateTag(TagType.TAG_LONG_ARRAY);
}
public static bool CreateStringNodePred (DataNode dataNode, out GroupCapabilities caps) public static bool CreateStringNodePred (DataNode dataNode, out GroupCapabilities caps)
{ {
caps = GroupCapabilities.Single; caps = GroupCapabilities.Single;

View file

@ -30,10 +30,10 @@ namespace NBTExplorer.Controllers
_iconRegistry = new IconRegistry(); _iconRegistry = new IconRegistry();
_iconRegistry.DefaultIcon = 15; _iconRegistry.DefaultIcon = 15;
_iconRegistry.Register(typeof(RootRule), 16); _iconRegistry.Register(typeof(RootRule), 18);
_iconRegistry.Register(typeof(UnionRule), 19); _iconRegistry.Register(typeof(UnionRule), 21);
_iconRegistry.Register(typeof(IntersectRule), 18); _iconRegistry.Register(typeof(IntersectRule), 20);
_iconRegistry.Register(typeof(WildcardRule), 17); _iconRegistry.Register(typeof(WildcardRule), 19);
_iconRegistry.Register(typeof(ByteTagRule), 0); _iconRegistry.Register(typeof(ByteTagRule), 0);
_iconRegistry.Register(typeof(ShortTagRule), 1); _iconRegistry.Register(typeof(ShortTagRule), 1);
_iconRegistry.Register(typeof(IntTagRule), 2); _iconRegistry.Register(typeof(IntTagRule), 2);

60
NBTExplorer/Interop.cs Normal file
View file

@ -0,0 +1,60 @@
using System;
using System.Runtime.InteropServices;
namespace NBTExplorer
{
internal static class Interop
{
public static bool WinInteropAvailable
{
get { return IsWindows && Type.GetType("Mono.Runtime") == null; }
}
public static bool IsWindows
{
get { return Environment.OSVersion.Platform == PlatformID.Win32NT; }
}
public static bool IsWinXP
{
get
{
OperatingSystem OS = Environment.OSVersion;
return (OS.Platform == PlatformID.Win32NT) &&
((OS.Version.Major > 5) || ((OS.Version.Major == 5) && (OS.Version.Minor == 1)));
}
}
public static bool IsWinVista
{
get
{
OperatingSystem OS = Environment.OSVersion;
return (OS.Platform == PlatformID.Win32NT) && (OS.Version.Major >= 6);
}
}
public static IntPtr SendMessage (IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
{
if (WinInteropAvailable)
return NativeInterop.SendMessage(hWnd, msg, wParam, lParam);
else
return IntPtr.Zero;
}
}
internal static class NativeInterop
{
public const int WM_PRINTCLIENT = 0x0318;
public const int PRF_CLIENT = 0x00000004;
public const int TV_FIRST = 0x1100;
public const int TVM_SETBKCOLOR = TV_FIRST + 29;
public const int TVM_SETEXTENDEDSTYLE = TV_FIRST + 44;
public const int TVS_EX_DOUBLEBUFFER = 0x0004;
[DllImport("user32.dll")]
public static extern IntPtr SendMessage (IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
}
}

View file

@ -1,24 +0,0 @@
using Substrate.Core;
namespace NBTExplorer.Model
{
public class CubicRegionFile : RegionFile
{
private const int _sectorBytes = 256;
private static byte[] _emptySector = new byte[_sectorBytes];
public CubicRegionFile (string path)
: base(path)
{ }
protected override int SectorBytes
{
get { return _sectorBytes; }
}
protected override byte[] EmptySector
{
get { return _emptySector; }
}
}
}

View file

@ -1,38 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class ListTagContainer : IOrderedTagContainer
{
private TagNodeList _tag;
public ListTagContainer (TagNodeList tag)
{
_tag = tag;
}
public int TagCount
{
get { return _tag.Count; }
}
public bool DeleteTag (TagNode tag)
{
return _tag.Remove(tag);
}
public int GetTagIndex (TagNode tag)
{
return _tag.IndexOf(tag);
}
public bool InsertTag (TagNode tag, int index)
{
if (index < 0 || index > _tag.Count)
return false;
_tag.Insert(index, tag);
return true;
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagDoubleDataNode : TagDataNode
{
public TagDoubleDataNode (TagNodeDouble tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagFloatDataNode : TagDataNode
{
public TagFloatDataNode (TagNodeFloat tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagIntDataNode : TagDataNode
{
public TagIntDataNode (TagNodeInt tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagLongDataNode : TagDataNode
{
public TagLongDataNode (TagNodeLong tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagShortDataNode : TagDataNode
{
public TagShortDataNode (TagNodeShort tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -12,6 +12,7 @@
<AssemblyName>NBTExplorer</AssemblyName> <AssemblyName>NBTExplorer</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion> <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl> <PublishUrl>publish\</PublishUrl>
<Install>true</Install> <Install>true</Install>
<InstallFrom>Disk</InstallFrom> <InstallFrom>Disk</InstallFrom>
@ -24,7 +25,6 @@
<MapFileExtensions>true</MapFileExtensions> <MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision> <ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion> <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled> <BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup> </PropertyGroup>
@ -84,10 +84,12 @@
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories> <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Substrate, Version=1.3.8.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Substrate">
<SpecificVersion>False</SpecificVersion> <HintPath>..\References\Substrate.dll</HintPath>
<HintPath>References\Substrate.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
@ -98,11 +100,8 @@
<ItemGroup> <ItemGroup>
<Compile Include="Controllers\ExplorerBarController.cs" /> <Compile Include="Controllers\ExplorerBarController.cs" />
<Compile Include="Controllers\NodeTreeController.cs" /> <Compile Include="Controllers\NodeTreeController.cs" />
<Compile Include="FormRegistry.cs" />
<Compile Include="Controllers\RuleTreeController.cs" /> <Compile Include="Controllers\RuleTreeController.cs" />
<Compile Include="Model\Search\SearchRule.cs" /> <Compile Include="Interop.cs" />
<Compile Include="NbtClipboardController.cs" />
<Compile Include="SnapshotList.cs" />
<Compile Include="Vendor\MultiSelectTreeView\MultiSelectTreeview.cs"> <Compile Include="Vendor\MultiSelectTreeView\MultiSelectTreeview.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
@ -173,32 +172,6 @@
<Compile Include="Windows\EditHex.Designer.cs"> <Compile Include="Windows\EditHex.Designer.cs">
<DependentUpon>EditHex.cs</DependentUpon> <DependentUpon>EditHex.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Model\CompoundTagContainer.cs" />
<Compile Include="Model\CubicRegionDataNode.cs" />
<Compile Include="Model\CubicRegionFile.cs" />
<Compile Include="Model\DataNode.cs" />
<Compile Include="Model\DataNodeCollection.cs" />
<Compile Include="Model\DirectoryDataNode.cs" />
<Compile Include="Model\FileTypeRegistry.cs" />
<Compile Include="Model\ListTagContainer.cs" />
<Compile Include="Model\NbtFileDataNode.cs" />
<Compile Include="Model\NodeCapabilities.cs" />
<Compile Include="Model\RegionChunkDataNode.cs" />
<Compile Include="Model\RegionFileDataNode.cs" />
<Compile Include="Model\TagByteArrayDataNode.cs" />
<Compile Include="Model\TagByteDataNode.cs" />
<Compile Include="Model\TagCompoundDataNode.cs" />
<Compile Include="Model\TagContainerInterface.cs" />
<Compile Include="Model\TagDataNode.cs" />
<Compile Include="Model\TagDoubleDataNode.cs" />
<Compile Include="Model\TagFloatDataNode.cs" />
<Compile Include="Model\TagIntArrayDataNode.cs" />
<Compile Include="Model\TagIntDataNode.cs" />
<Compile Include="Model\TagListDataNode.cs" />
<Compile Include="Model\TagLongDataNode.cs" />
<Compile Include="Model\TagShortDataNode.cs" />
<Compile Include="Model\TagStringDataNode.cs" />
<Compile Include="NbtClipboardData.cs" />
<Compile Include="Program.cs" /> <Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Settings.Designer.cs"> <Compile Include="Properties\Settings.Designer.cs">
@ -207,7 +180,6 @@
<DependentUpon>Settings.settings</DependentUpon> <DependentUpon>Settings.settings</DependentUpon>
</Compile> </Compile>
<Compile Include="SearchWorker.cs" /> <Compile Include="SearchWorker.cs" />
<Compile Include="Model\TagKey.cs" />
<Compile Include="Vendor\Be.Windows.Forms.HexBox\BuiltInContextMenu.cs"> <Compile Include="Vendor\Be.Windows.Forms.HexBox\BuiltInContextMenu.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
@ -336,6 +308,12 @@
<Install>true</Install> <Install>true</Install>
</BootstrapperPackage> </BootstrapperPackage>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NBTModel\NBTModel.csproj">
<Project>{20d7cba3-5b6d-40b0-8d28-4c9a58e4ffbc}</Project>
<Name>NBTModel</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -1,4 +1,8 @@
using System; using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms; using System.Windows.Forms;
using NBTExplorer.Windows; using NBTExplorer.Windows;
@ -10,8 +14,13 @@ namespace NBTExplorer
/// The main entry point for the application. /// The main entry point for the application.
/// </summary> /// </summary>
[STAThread] [STAThread]
static void Main () static void Main (string[] args)
{ {
Application.ThreadException += AppThreadFailureHandler;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += AppDomainFailureHandler;
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm()); Application.Run(new MainForm());
@ -31,5 +40,107 @@ namespace NBTExplorer
MessageBox.Show("Application failed during static initialization: " + original.Message); MessageBox.Show("Application failed during static initialization: " + original.Message);
Application.Exit(); Application.Exit();
} }
private static void AppThreadFailureHandler (object sender, ThreadExceptionEventArgs e)
{
ProcessException(e.Exception);
}
private static void AppDomainFailureHandler (object sender, UnhandledExceptionEventArgs e)
{
if (e.ExceptionObject is Exception)
ProcessException(e.ExceptionObject as Exception);
else if (e.IsTerminating) {
MessageBox.Show("NBTExplorer encountered an unknown exception object: " + e.ExceptionObject.GetType().FullName,
"NBTExplorer failed to run", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
private static void ProcessException (Exception ex)
{
if (IsMissingSubstrate(ex)) {
MessageBox.Show("NBTExplorer could not find required assembly \"Substrate.dll\".\n\nIf you obtained NBTExplorer from a ZIP distribution, make sure you've extracted NBTExplorer and all of its supporting files into another directory before running it.",
"NBTExplorer failed to run", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
return;
}
if (IsMissingNBTModel(ex)) {
MessageBox.Show("NBTExplorer could not find required assembly \"NBTModel.dll\".\n\nIf you obtained NBTExplorer from a ZIP distribution, make sure you've extracted NBTExplorer and all of its supporting files into another directory before running it.",
"NBTExplorer failed to run", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
return;
}
StringBuilder errorText = new StringBuilder();
errorText.AppendLine("NBTExplorer encountered the following exception while trying to run: " + ex.GetType().Name);
errorText.AppendLine("Message: " + ex.Message);
Exception ix = ex;
while (ix.InnerException != null) {
ix = ix.InnerException;
errorText.AppendLine();
errorText.AppendLine("Caused by Inner Exception: " + ix.GetType().Name);
errorText.AppendLine("Message: " + ix.Message);
}
try {
string logDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "NBTExplorer");
if (!Directory.Exists(logDir))
Directory.CreateDirectory(logDir);
string logPath = Path.Combine(logDir, "error.log");
using (var writer = new StreamWriter(logPath, true)) {
writer.WriteLine("NBTExplorer Error Report");
writer.WriteLine(DateTime.Now);
writer.WriteLine("-------");
writer.WriteLine(errorText);
writer.WriteLine("-------");
ix = ex;
while (ix != null) {
writer.WriteLine(ex.StackTrace);
writer.WriteLine("-------");
ix = ix.InnerException;
}
writer.WriteLine();
}
errorText.AppendLine();
errorText.AppendLine("Additional error detail has been written to:\n" + logPath);
}
catch { }
MessageBox.Show(errorText.ToString(), "NBTExplorer failed to run", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
private static bool IsMissingSubstrate (Exception ex)
{
if (ex is TypeInitializationException && ex.InnerException != null)
ex = ex.InnerException;
if (ex is FileNotFoundException) {
FileNotFoundException fileEx = ex as FileNotFoundException;
if (fileEx.FileName.Contains("Substrate"))
return true;
}
return false;
}
private static bool IsMissingNBTModel (Exception ex)
{
if (ex is TypeInitializationException && ex.InnerException != null)
ex = ex.InnerException;
if (ex is FileNotFoundException) {
FileNotFoundException fileEx = ex as FileNotFoundException;
if (fileEx.FileName.Contains("NBTModel"))
return true;
}
return false;
}
} }
} }

View file

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NBTExplorer")] [assembly: AssemblyProduct("NBTExplorer")]
[assembly: AssemblyCopyright("Copyright © Justin Aquadro 2011-2012")] [assembly: AssemblyCopyright("Copyright © Justin Aquadro 2011-2017")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.6.0.0")] [assembly: AssemblyVersion("2.8.0.0")]
[assembly: AssemblyFileVersion("2.6.0.0")] [assembly: AssemblyFileVersion("2.8.0.0")]

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

View file

@ -1,7 +1,7 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using NBTExplorer.Model;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization;
using NBTExplorer.Model;
namespace NBTExplorer namespace NBTExplorer
{ {
@ -53,12 +53,12 @@ namespace NBTExplorer
if (SearchName != null) { if (SearchName != null) {
string tagName = node.NodeName; string tagName = node.NodeName;
if (tagName != null) if (tagName != null)
mName = tagName.Contains(SearchName); mName = CultureInfo.InvariantCulture.CompareInfo.IndexOf(tagName, SearchName, CompareOptions.IgnoreCase) >= 0;
} }
if (SearchValue != null) { if (SearchValue != null) {
string tagValue = node.NodeDisplay; string tagValue = node.NodeDisplay;
if (tagValue != null) if (tagValue != null)
mValue = tagValue.Contains(SearchValue); mValue = CultureInfo.InvariantCulture.CompareInfo.IndexOf(tagValue, SearchValue, CompareOptions.IgnoreCase) >= 0;
} }
if (mName && mValue) { if (mName && mValue) {

View file

@ -11,7 +11,6 @@ namespace NBTExplorer.Vendor.MultiSelectTreeView
{ {
public class MultiSelectTreeView : TreeView public class MultiSelectTreeView : TreeView
{ {
#region Selected Node(s) Properties #region Selected Node(s) Properties
private List<TreeNode> m_SelectedNodes = null; private List<TreeNode> m_SelectedNodes = null;
@ -57,14 +56,40 @@ namespace NBTExplorer.Vendor.MultiSelectTreeView
public MultiSelectTreeView() public MultiSelectTreeView()
{ {
DoubleBuffered = true;
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
m_SelectedNodes = new List<TreeNode>(); m_SelectedNodes = new List<TreeNode>();
base.SelectedNode = null; base.SelectedNode = null;
} }
private void UpdateExtendedStyles ()
{
if (Interop.WinInteropAvailable) {
int style = 0;
if (DoubleBuffered)
style |= NativeInterop.TVS_EX_DOUBLEBUFFER;
if (style != 0)
Interop.SendMessage(Handle, NativeInterop.TVM_SETEXTENDEDSTYLE, (IntPtr)NativeInterop.TVS_EX_DOUBLEBUFFER, (IntPtr)style);
}
}
#region Overridden Events #region Overridden Events
protected override void OnHandleCreated (EventArgs e)
{
base.OnHandleCreated(e);
if (Interop.WinInteropAvailable) {
UpdateExtendedStyles();
if (!Interop.IsWinXP)
Interop.SendMessage(Handle, NativeInterop.TVM_SETBKCOLOR, IntPtr.Zero, (IntPtr)ColorTranslator.ToWin32(BackColor));
}
}
protected override void OnGotFocus( EventArgs e ) protected override void OnGotFocus( EventArgs e )
{ {
// Make sure at least one node has a selection // Make sure at least one node has a selection

View file

@ -35,17 +35,14 @@
// //
// linkLabel1 // linkLabel1
// //
this.linkLabel1.AutoSize = true;
this.linkLabel1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.linkLabel1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.linkLabel1.LinkArea = new System.Windows.Forms.LinkArea(165, 31); this.linkLabel1.LinkArea = new System.Windows.Forms.LinkArea(171, 32);
this.linkLabel1.Location = new System.Drawing.Point(96, 12); this.linkLabel1.Location = new System.Drawing.Point(96, 12);
this.linkLabel1.Name = "linkLabel1"; this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.Size = new System.Drawing.Size(256, 133); this.linkLabel1.Size = new System.Drawing.Size(272, 133);
this.linkLabel1.TabIndex = 0; this.linkLabel1.TabIndex = 0;
this.linkLabel1.TabStop = true; this.linkLabel1.TabStop = true;
this.linkLabel1.Text = "NBTExplorer\r\nCopyright ©2011-2013 Justin Aquadro\r\n\r\nNBTExplorer is based on NBTEd" + this.linkLabel1.Text = resources.GetString("linkLabel1.Text");
"it by copyboy\r\nFugue icon set: p.yusukekamiyamane.com\r\n\r\nEmail: jaquadro@gmail.c" +
"om\r\nNBTExplorer Github Project Page";
this.linkLabel1.UseCompatibleTextRendering = true; this.linkLabel1.UseCompatibleTextRendering = true;
this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
// //
@ -63,7 +60,7 @@
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(350, 144); this.ClientSize = new System.Drawing.Size(380, 144);
this.Controls.Add(this.pictureBox1); this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.linkLabel1); this.Controls.Add(this.linkLabel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
@ -73,7 +70,6 @@
this.Text = "About NBTExplorer"; this.Text = "About NBTExplorer";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout();
} }

View file

@ -7,6 +7,14 @@ namespace NBTExplorer.Windows
public About () public About ()
{ {
InitializeComponent(); InitializeComponent();
int len = linkLabel1.Text.Length;
System.Version version = typeof(About).Assembly.GetName().Version;
linkLabel1.Text = linkLabel1.Text.Replace("{ver}", version.Major + "." + version.Minor + "." + version.Build);
int adj = linkLabel1.Text.Length - len;
linkLabel1.LinkArea = new LinkArea(linkLabel1.LinkArea.Start + adj, linkLabel1.LinkArea.Length);
} }
private void linkLabel1_LinkClicked (object sender, LinkLabelLinkClickedEventArgs e) private void linkLabel1_LinkClicked (object sender, LinkLabelLinkClickedEventArgs e)

View file

@ -117,6 +117,16 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="linkLabel1.Text" xml:space="preserve">
<value>NBTExplorer {ver}
Copyright ©2011-2017 Justin Aquadro
NBTExplorer is based on NBTEdit by copygirl
Fugue icon set: p.yusukekamiyamane.com
Email: jaquadro@gmail.com
NBTExplorer Github Project Page</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>

View file

@ -107,6 +107,8 @@ namespace NBTExplorer.Windows
return new TagNodeList(TagType.TAG_BYTE); return new TagNodeList(TagType.TAG_BYTE);
case TagType.TAG_LONG: case TagType.TAG_LONG:
return new TagNodeLong(); return new TagNodeLong();
case TagType.TAG_LONG_ARRAY:
return new TagNodeLongArray(new long[_size]);
case TagType.TAG_SHORT: case TagType.TAG_SHORT:
return new TagNodeShort(); return new TagNodeShort();
case TagType.TAG_STRING: case TagType.TAG_STRING:
@ -163,6 +165,8 @@ namespace NBTExplorer.Windows
switch (_type) { switch (_type) {
case TagType.TAG_BYTE_ARRAY: case TagType.TAG_BYTE_ARRAY:
case TagType.TAG_INT_ARRAY: case TagType.TAG_INT_ARRAY:
case TagType.TAG_SHORT_ARRAY:
case TagType.TAG_LONG_ARRAY:
return true; return true;
default: default:
return false; return false;

View file

@ -38,8 +38,6 @@
// _cbName // _cbName
// //
this._cbName.AutoSize = true; this._cbName.AutoSize = true;
this._cbName.Checked = true;
this._cbName.CheckState = System.Windows.Forms.CheckState.Checked;
this._cbName.Location = new System.Drawing.Point(13, 13); this._cbName.Location = new System.Drawing.Point(13, 13);
this._cbName.Name = "_cbName"; this._cbName.Name = "_cbName";
this._cbName.Size = new System.Drawing.Size(57, 17); this._cbName.Size = new System.Drawing.Size(57, 17);
@ -65,6 +63,7 @@
this._textName.Name = "_textName"; this._textName.Name = "_textName";
this._textName.Size = new System.Drawing.Size(273, 20); this._textName.Size = new System.Drawing.Size(273, 20);
this._textName.TabIndex = 2; this._textName.TabIndex = 2;
this._textName.TextChanged += new System.EventHandler(this._textName_TextChanged);
// //
// _textValue // _textValue
// //
@ -74,6 +73,7 @@
this._textValue.Name = "_textValue"; this._textValue.Name = "_textValue";
this._textValue.Size = new System.Drawing.Size(273, 20); this._textValue.Size = new System.Drawing.Size(273, 20);
this._textValue.TabIndex = 3; this._textValue.TabIndex = 3;
this._textValue.TextChanged += new System.EventHandler(this._textValue_TextChanged);
// //
// _buttonFind // _buttonFind
// //

View file

@ -41,5 +41,15 @@ namespace NBTExplorer.Windows
DialogResult = DialogResult.Cancel; DialogResult = DialogResult.Cancel;
Close(); Close();
} }
private void _textName_TextChanged (object sender, EventArgs e)
{
_cbName.Checked = true;
}
private void _textValue_TextChanged (object sender, EventArgs e)
{
_cbValue.Checked = true;
}
} }
} }

View file

@ -112,9 +112,9 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
</root> </root>

View file

@ -64,6 +64,7 @@
this._tbReplaceDouble = new System.Windows.Forms.ToolStripButton(); this._tbReplaceDouble = new System.Windows.Forms.ToolStripButton();
this._tbReplaceByteArray = new System.Windows.Forms.ToolStripButton(); this._tbReplaceByteArray = new System.Windows.Forms.ToolStripButton();
this._tbReplaceIntArray = new System.Windows.Forms.ToolStripButton(); this._tbReplaceIntArray = new System.Windows.Forms.ToolStripButton();
this._tbReplaceLongArray = new System.Windows.Forms.ToolStripButton();
this._tbReplaceString = new System.Windows.Forms.ToolStripButton(); this._tbReplaceString = new System.Windows.Forms.ToolStripButton();
this._tbReplaceList = new System.Windows.Forms.ToolStripButton(); this._tbReplaceList = new System.Windows.Forms.ToolStripButton();
this._tbReplaceCompound = new System.Windows.Forms.ToolStripButton(); this._tbReplaceCompound = new System.Windows.Forms.ToolStripButton();
@ -90,7 +91,7 @@
this.groupBox1.Controls.Add(this.panel1); this.groupBox1.Controls.Add(this.panel1);
this.groupBox1.Location = new System.Drawing.Point(3, 3); this.groupBox1.Location = new System.Drawing.Point(3, 3);
this.groupBox1.Name = "groupBox1"; this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(324, 211); this.groupBox1.Size = new System.Drawing.Size(341, 211);
this.groupBox1.TabIndex = 0; this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false; this.groupBox1.TabStop = false;
this.groupBox1.Text = "Find"; this.groupBox1.Text = "Find";
@ -104,7 +105,7 @@
this.panel1.Controls.Add(this.toolStrip1); this.panel1.Controls.Add(this.toolStrip1);
this.panel1.Location = new System.Drawing.Point(6, 19); this.panel1.Location = new System.Drawing.Point(6, 19);
this.panel1.Name = "panel1"; this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(312, 186); this.panel1.Size = new System.Drawing.Size(329, 186);
this.panel1.TabIndex = 0; this.panel1.TabIndex = 0;
// //
// treeView1 // treeView1
@ -118,7 +119,7 @@
this.treeView1.SelectedImageIndex = 0; this.treeView1.SelectedImageIndex = 0;
this.treeView1.ShowPlusMinus = false; this.treeView1.ShowPlusMinus = false;
this.treeView1.ShowRootLines = false; this.treeView1.ShowRootLines = false;
this.treeView1.Size = new System.Drawing.Size(312, 161); this.treeView1.Size = new System.Drawing.Size(329, 161);
this.treeView1.TabIndex = 1; this.treeView1.TabIndex = 1;
// //
// imageList1 // imageList1
@ -141,10 +142,12 @@
this.imageList1.Images.SetKeyName(13, "map.png"); this.imageList1.Images.SetKeyName(13, "map.png");
this.imageList1.Images.SetKeyName(14, "edit-code-i.png"); this.imageList1.Images.SetKeyName(14, "edit-code-i.png");
this.imageList1.Images.SetKeyName(15, "question-white.png"); this.imageList1.Images.SetKeyName(15, "question-white.png");
this.imageList1.Images.SetKeyName(16, "arrow-315.png"); this.imageList1.Images.SetKeyName(16, "edit-code-s.png");
this.imageList1.Images.SetKeyName(17, "asterisk-yellow.png"); this.imageList1.Images.SetKeyName(17, "edit-code-l.png");
this.imageList1.Images.SetKeyName(18, "sql-join-inner.png"); this.imageList1.Images.SetKeyName(18, "arrow-315.png");
this.imageList1.Images.SetKeyName(19, "sql-join-outer.png"); this.imageList1.Images.SetKeyName(19, "asterisk-yellow.png");
this.imageList1.Images.SetKeyName(20, "sql-join-inner.png");
this.imageList1.Images.SetKeyName(21, "sql-join-outer.png");
// //
// toolStrip1 // toolStrip1
// //
@ -166,7 +169,7 @@
this._tbFindString}); this._tbFindString});
this.toolStrip1.Location = new System.Drawing.Point(0, 0); this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1"; this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(312, 25); this.toolStrip1.Size = new System.Drawing.Size(329, 25);
this.toolStrip1.TabIndex = 0; this.toolStrip1.TabIndex = 0;
this.toolStrip1.Text = "toolStrip1"; this.toolStrip1.Text = "toolStrip1";
// //
@ -307,9 +310,9 @@
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.groupBox2.Controls.Add(this._deleteTagsCheckbox); this.groupBox2.Controls.Add(this._deleteTagsCheckbox);
this.groupBox2.Controls.Add(this.panel2); this.groupBox2.Controls.Add(this.panel2);
this.groupBox2.Location = new System.Drawing.Point(333, 3); this.groupBox2.Location = new System.Drawing.Point(350, 3);
this.groupBox2.Name = "groupBox2"; this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(324, 211); this.groupBox2.Size = new System.Drawing.Size(341, 211);
this.groupBox2.TabIndex = 1; this.groupBox2.TabIndex = 1;
this.groupBox2.TabStop = false; this.groupBox2.TabStop = false;
this.groupBox2.Text = "Replace"; this.groupBox2.Text = "Replace";
@ -334,7 +337,7 @@
this.panel2.Controls.Add(this.toolStrip2); this.panel2.Controls.Add(this.toolStrip2);
this.panel2.Location = new System.Drawing.Point(6, 19); this.panel2.Location = new System.Drawing.Point(6, 19);
this.panel2.Name = "panel2"; this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(312, 163); this.panel2.Size = new System.Drawing.Size(329, 163);
this.panel2.TabIndex = 0; this.panel2.TabIndex = 0;
// //
// treeView2 // treeView2
@ -348,7 +351,7 @@
this.treeView2.SelectedImageIndex = 0; this.treeView2.SelectedImageIndex = 0;
this.treeView2.ShowPlusMinus = false; this.treeView2.ShowPlusMinus = false;
this.treeView2.ShowRootLines = false; this.treeView2.ShowRootLines = false;
this.treeView2.Size = new System.Drawing.Size(312, 138); this.treeView2.Size = new System.Drawing.Size(329, 138);
this.treeView2.TabIndex = 1; this.treeView2.TabIndex = 1;
// //
// toolStrip2 // toolStrip2
@ -366,12 +369,13 @@
this._tbReplaceDouble, this._tbReplaceDouble,
this._tbReplaceByteArray, this._tbReplaceByteArray,
this._tbReplaceIntArray, this._tbReplaceIntArray,
this._tbReplaceLongArray,
this._tbReplaceString, this._tbReplaceString,
this._tbReplaceList, this._tbReplaceList,
this._tbReplaceCompound}); this._tbReplaceCompound});
this.toolStrip2.Location = new System.Drawing.Point(0, 0); this.toolStrip2.Location = new System.Drawing.Point(0, 0);
this.toolStrip2.Name = "toolStrip2"; this.toolStrip2.Name = "toolStrip2";
this.toolStrip2.Size = new System.Drawing.Size(312, 25); this.toolStrip2.Size = new System.Drawing.Size(329, 25);
this.toolStrip2.TabIndex = 0; this.toolStrip2.TabIndex = 0;
this.toolStrip2.Text = "toolStrip2"; this.toolStrip2.Text = "toolStrip2";
// //
@ -480,6 +484,16 @@
this._tbReplaceIntArray.Text = "Add Int Array Tag"; this._tbReplaceIntArray.Text = "Add Int Array Tag";
this._tbReplaceIntArray.Click += new System.EventHandler(this._tbReplaceIntArray_Click); this._tbReplaceIntArray.Click += new System.EventHandler(this._tbReplaceIntArray_Click);
// //
// _tbReplaceLongArray
//
this._tbReplaceLongArray.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this._tbReplaceLongArray.Image = ((System.Drawing.Image)(resources.GetObject("_tbReplaceLongArray.Image")));
this._tbReplaceLongArray.ImageTransparentColor = System.Drawing.Color.Magenta;
this._tbReplaceLongArray.Name = "_tbReplaceLongArray";
this._tbReplaceLongArray.Size = new System.Drawing.Size(23, 22);
this._tbReplaceLongArray.Text = "Add Long Array Tag";
this._tbReplaceLongArray.Click += new System.EventHandler(this._tbReplaceLongArray_Click);
//
// _tbReplaceString // _tbReplaceString
// //
this._tbReplaceString.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this._tbReplaceString.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -513,7 +527,7 @@
// _buttonFind // _buttonFind
// //
this._buttonFind.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this._buttonFind.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this._buttonFind.Location = new System.Drawing.Point(516, 251); this._buttonFind.Location = new System.Drawing.Point(550, 251);
this._buttonFind.Name = "_buttonFind"; this._buttonFind.Name = "_buttonFind";
this._buttonFind.Size = new System.Drawing.Size(75, 23); this._buttonFind.Size = new System.Drawing.Size(75, 23);
this._buttonFind.TabIndex = 2; this._buttonFind.TabIndex = 2;
@ -524,7 +538,7 @@
// _buttonReplace // _buttonReplace
// //
this._buttonReplace.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this._buttonReplace.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this._buttonReplace.Location = new System.Drawing.Point(597, 251); this._buttonReplace.Location = new System.Drawing.Point(631, 251);
this._buttonReplace.Name = "_buttonReplace"; this._buttonReplace.Name = "_buttonReplace";
this._buttonReplace.Size = new System.Drawing.Size(75, 23); this._buttonReplace.Size = new System.Drawing.Size(75, 23);
this._buttonReplace.TabIndex = 3; this._buttonReplace.TabIndex = 3;
@ -535,7 +549,7 @@
// _buttonReplaceAll // _buttonReplaceAll
// //
this._buttonReplaceAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this._buttonReplaceAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this._buttonReplaceAll.Location = new System.Drawing.Point(597, 280); this._buttonReplaceAll.Location = new System.Drawing.Point(631, 280);
this._buttonReplaceAll.Name = "_buttonReplaceAll"; this._buttonReplaceAll.Name = "_buttonReplaceAll";
this._buttonReplaceAll.Size = new System.Drawing.Size(75, 23); this._buttonReplaceAll.Size = new System.Drawing.Size(75, 23);
this._buttonReplaceAll.TabIndex = 4; this._buttonReplaceAll.TabIndex = 4;
@ -558,7 +572,7 @@
// //
this._explorerStrip.Location = new System.Drawing.Point(0, 0); this._explorerStrip.Location = new System.Drawing.Point(0, 0);
this._explorerStrip.Name = "_explorerStrip"; this._explorerStrip.Name = "_explorerStrip";
this._explorerStrip.Size = new System.Drawing.Size(684, 25); this._explorerStrip.Size = new System.Drawing.Size(718, 25);
this._explorerStrip.TabIndex = 7; this._explorerStrip.TabIndex = 7;
this._explorerStrip.Text = "toolStrip3"; this._explorerStrip.Text = "toolStrip3";
// //
@ -576,14 +590,14 @@
this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 1; this.tableLayoutPanel1.RowCount = 1;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(660, 217); this.tableLayoutPanel1.Size = new System.Drawing.Size(694, 217);
this.tableLayoutPanel1.TabIndex = 8; this.tableLayoutPanel1.TabIndex = 8;
// //
// FindReplace // FindReplace
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(684, 314); this.ClientSize = new System.Drawing.Size(718, 314);
this.Controls.Add(this.tableLayoutPanel1); this.Controls.Add(this.tableLayoutPanel1);
this.Controls.Add(this._explorerStrip); this.Controls.Add(this._explorerStrip);
this.Controls.Add(this._buttonCancel); this.Controls.Add(this._buttonCancel);
@ -658,5 +672,6 @@
private System.Windows.Forms.ToolStrip _explorerStrip; private System.Windows.Forms.ToolStrip _explorerStrip;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.CheckBox _deleteTagsCheckbox; private System.Windows.Forms.CheckBox _deleteTagsCheckbox;
private System.Windows.Forms.ToolStripButton _tbReplaceLongArray;
} }
} }

View file

@ -162,6 +162,11 @@ namespace NBTExplorer.Windows
_replaceController.CreateNode(TagType.TAG_INT_ARRAY); _replaceController.CreateNode(TagType.TAG_INT_ARRAY);
} }
private void _tbReplaceLongArray_Click(object sender, EventArgs e)
{
_replaceController.CreateNode(TagType.TAG_LONG_ARRAY);
}
private void _tbReplaceString_Click (object sender, EventArgs e) private void _tbReplaceString_Click (object sender, EventArgs e)
{ {
_replaceController.CreateNode(TagType.TAG_STRING); _replaceController.CreateNode(TagType.TAG_STRING);

View file

@ -117,9 +117,6 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>235, 17</value> <value>235, 17</value>
</metadata> </metadata>
@ -127,290 +124,300 @@
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABA ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACC
QgAAAk1TRnQBSQFMAgEBFAEAAcABAQHAAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA RAAAAk1TRnQBSQFMAgEBFgEAAdgBAQHYAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABYAMAAQEBAAEYBgABSP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AOEAA/8D/AP6GPgD+QP6A/wMAAP9 AwABYAMAAQEBAAEYBgABSP8AkwAD/wP9A/oD+AP5A/oD+wb8A/sD+gP5A/gD+gP9Bv8D/QP6A/gD+QP6
A/oS+AP5A/0D/2kAA/4D+QPxAboBogGKAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFW A/sG/AP7A/oD+QP4A/oD/QP/YAAD/gP6Ae8B7gHtAeIB2wHUAd8B0gHFAdwBzAG8AeAB0wHFAd8B1QHO
AbYBhgFWAbYBhgFWAbwBpAGNA/cMAAP8A/YD8wG8AcoBzQFVAZUBowFVAZUBowHQAdcB2QPzA/UD+wP/ Ad8B1QHOAeAB0wHFAdwBzAG8Ad8B0gHFAeIB2wHUAe8B7gHtA/oG/gP6AekB5gHlAdwBqAGcAeYBgAFl
BgAD/wP9A/oD+AP5A/oD+wb8A/sD+gP5A/gD+gP9Bv8D/QP6A/gD+QP6A/sG/AP7A/oD+QP4A/oD/QP/ AeYBaAFIAecBgQFoAeABqwGeAeABqwGeAecBgQFnAeYBaAFIAeYBgAFlAdwBqAGcAekB5gHlA/oD/mMA
DAAB6AHfAdQBuQGJAVkB/AG4ARwB/AGzAQ4B/AGzAQ0B/AGzAQwB/AGyAQsB/AGyAQsB/AGzAQ4BuQGJ AfYB9QHzAeEB1AHGAeIB1QHHAekB3gHTAeoB3wHUAeQBvAGrAeIBbwFPAeIBbwFPAeQBvAGrAeoB3wHU
AVkPAAH4AvkGAAFeAZkBpgFHAdQB5QFIAcwB3gFZAZYBpAYAAfgC+QkAA/4D+gHvAe4B7QHiAdsB1AHf AekB3gHTAeIB1QHHAeEB1AHGAfYB9QHzBgAB7AHiAd8B3AF2AVkB5AGWAXwB5wG2AaEB6QHBAa4B4wGw
AdIBxQHcAcwBvAHgAdMBxQHfAdUBzgHfAdUBzgHgAdMBxQHcAcwBvAHfAdIBxQHiAdsB1AHvAe4B7QP6 AZkB2wGPAXIB2wGPAXIB4wGwAZkB6QHBAa4B5wG2AaIB5AGWAXwB3AF2AVkB7AHiAd9jAAP7AeMB1wHK
Bv4D+gHpAeYB5QHcAagBnAHmAYABZQHmAWgBSAHnAYEBaAHgAasBngHgAasBngHnAYEBZwHmAWgBSAHm AekB3wHVAekB3wHUAekB3wHUAeYB0QHDAdMBaQFJAeYBsQGcAeYBsQGcAdMBaQFJAeYB0QHDAekB3wHU
AYABZQHcAagBnAHpAeYB5QP6A/4PAAHpAd8B1QG+AY4BXQH3AbYBKAH1AasBDgH1AasBDgH1AasBDgH1 AekB3wHUAekB3wHVAeMB1wHKA/sB+AH1AfQBzwFtAVEB5QGuAZkB6QHDAbEB6AHDAbEB6AHBAa4B3wG0
AasBDgH2Aa4BFAG+AY4BXQwAAc0B3gHiAVwBnwGtAX4BsQG8AeAB6gHsAX4BsQG8AUQBzwHgAUwB1AHl AZ0B6QHAAawB6QHAAawB3wG0AZ0B6AHBAa4B6AHDAbEB6QHDAbEB5QGuAZkBzwFvAVMB+AH1AfRgAAHw
AVwBnwGtAeAB6gHsAX4BsQG8AVwBnwGtAc0B3gHiCQAB9gH1AfMB4QHUAcYB4gHVAccB6QHeAdMB6gHf AeoB5QHmAdoBzQHrAeEB1wHqAeAB1gHqAeAB1gHRAZIBegHYAY8BdgHpAcQBsgHpAcQBsgHYAY8BdgHR
AdQB5AG8AasB4gFvAU8B4gFvAU8B5AG8AasB6gHfAdQB6QHeAdMB4gHVAccB4QHUAcYB9gH1AfMGAAHs AZIBegHqAeAB1gHqAeAB1gHqAeAB1QHlAdoBzQHwAeoB5QHZAa4BoQHWAZABdwHrAcQBswHpAcQBsQHq
AeIB3wHcAXYBWQHkAZYBfAHnAbYBoQHpAcEBrgHjAbABmQHbAY8BcgHbAY8BcgHjAbABmQHpAcEBrgHn AcQBsgHiAbkBpAHlAbwBpwHpAcQBsgHpAcQBsgHlAbwBpwHiAbkBpAHqAcQBsgHpAcQBsgHpAcQBsgHX
AbYBogHkAZYBfAHcAXYBWQHsAeIB3xUAAdoBwgGqAcMBkwFgAfEBtAE2AewBpgEZAewBpgEZAewBpgEZ AZABeAHZAa4BoWAAAekB4AHXAe0B5QHdAe0B5QHdAewB4wHaAesB4gHZAbYBXAE9AeQBtQGiAekBxQGz
Ae4BqgEjAcMBkwFgDAABYQGoAbUBRAHLAdwBRgHFAdQBVQGqAbkBfQG2AcABRwHGAdYBUQHPAd8BYQGo AekBxQGzAeQBtQGiAbYBXAE9AesB4QHYAeoB4QHYAeoB4QHYAesB4gHYAekB4AHXAbsBagFRAeYBtQGj
AbUBVQGqAbkBRgHFAdQBRAHLAdwBYQGoAbUGAAP7AeMB1wHKAekB3wHVAekB3wHUAekB3wHUAeYB0QHD Ae0BxgG1AewBxQG0AesBxQGzAeABtgGfAeoBxAGxAekBxQGzAekBxQGzAeoBxAGxAeABtgGfAesBxQGz
AdMBaQFJAeYBsQGcAeYBsQGcAdMBaQFJAeYB0QHDAekB3wHUAekB3wHUAekB3wHVAeMB1wHKA/sB+AH1 AekBxQGzAekBxQGzAeQBtgGiAbsBagFRYAAB6AHdAdIB8QHqAeMB7wHnAd8B7wHnAd8B8AHoAeIBrAFK
AfQBzwFtAVEB5QGuAZkB6QHDAbEB6AHDAbEB6AHBAa4B3wG0AZ0B6QHAAawB6QHAAawB3wG0AZ0B6AHB
Aa4B6AHDAbEB6QHDAbEB5QGuAZkBzwFvAVMB+AH1AfQPAAHsAeIB1wHJAZkBZAHsAbYBSgHjAaABJQHj
AaABJQHjAaABJQHjAaABJQHmAacBMQHJAZkBZAwAAWIBrQG6AWkBzwHeAUsByQHaAUQBxgHXAVcBrgG7
AUkBvgHOAVYBzgHeAVcBrgG7AUQBxgHXAUgByAHYAVUByAHXAWIBrQG6BgAB8AHqAeUB5gHaAc0B6wHh
AdcB6gHgAdYB6gHgAdYB0QGSAXoB2AGPAXYB6QHEAbIB6QHEAbIB2AGPAXYB0QGSAXoB6gHgAdYB6gHg
AdYB6gHgAdUB5QHaAc0B8AHqAeUB2QGuAaEB1gGQAXcB6wHEAbMB6QHEAbEB6gHEAbIB4gG5AaQB5QG8
AacB6QHEAbIB6QHEAbIB5QG8AacB4gG5AaQB6gHEAbIB6QHEAbIB6QHEAbIB1wGQAXgB2QGuAaEMAAHt
AeMB2AHNAZ4BaQHqAbkBXAHbAZoBMQHbAZoBMQHbAZoBMQHmAbIBUgHbAZoBMQHgAaQBPwHNAZ4BaQwA
AekB8QHyAYQBvwHJAWYBuwHIAV0BvwHPAUQBwwHUAUQBwwHUAU8ByAHYAUQBwwHUAVgBvAHMAV8BuAHG
AYQBvwHJAekB8QHyBgAB6QHgAdcB7QHlAd0B7QHlAd0B7AHjAdoB6wHiAdkBtgFcAT0B5AG1AaIB6QHF
AbMB6QHFAbMB5AG1AaIBtgFcAT0B6wHhAdgB6gHhAdgB6gHhAdgB6wHiAdgB6QHgAdcBuwFqAVEB5gG1
AaMB7QHGAbUB7AHFAbQB6wHFAbMB4AG2AZ8B6gHEAbEB6QHFAbMB6QHFAbMB6gHEAbEB4AG2AZ8B6wHF
AbMB6QHFAbMB6QHFAbMB5AG2AaIBuwFqAVEJAAHuAeQB2QHTAaMBbQHuAcIBcQHUAZYBPQHTAZUBOwHT
AZUBOwHlAbYBYQHTAaMBbQHjAbIBXQHaAaIBSwHTAaMBbRIAAeUB7gHwAWUBtAHBAU4BvgHOAUgBxQHW
AUgBxQHWAU4BvgHOAWUBtAHBAeUB7gHwDAAB6AHdAdIB8QHqAeMB7wHnAd8B7wHnAd8B8AHoAeIBrAFK
ASkB6wHGAbYB6gHGAbYB6gHGAbYB6wHHAbUBrAFKASkB6wHiAdkB7AHjAdoB7AHjAdoB7AHjAdoB6AHd ASkB6wHGAbYB6gHGAbYB6gHGAbYB6wHHAbUBrAFKASkB6wHiAdkB7AHjAdoB7AHjAdoB7AHjAdoB6AHd
AdIBrgFNASsB7gHFAbQB7gHIAbgB7gHIAbgB7wHIAbgB3wG3AaAB6wHGAbYB6gHGAbYB6gHGAbYB6wHH AdIBrgFNASsB7gHFAbQB7gHIAbgB7gHIAbgB7wHIAbgB3wG3AaAB6wHGAbYB6gHGAbYB6gHGAbYB6wHH
AbUB3wG3AaAB6wHFAbUB6gHGAbYB6gHGAbYB6gHDAbEBrgFNASsGAAHvAeUC2QGpAXEB+QHQAYQB7gGy AbUB3wG3AaAB6wHFAbUB6gHGAbYB6gHGAbYB6gHDAbEBrgFNAStgAAHsAeQB2wHvAegB4gHvAegB4QHv
AWYB6QGtAWEB3wGjAVUB6wHAAXIB2QGpAXEB5QHOAbIB2QGpAXEB5AG1AWgB2QGpAXEMAAHqAfIB8wGG AegB4QHyAesB5AG9AWkBSgHnAbgBpgHsAccBtgHrAccBtgHlAbgBpgG8AWgBSQHsAeQB2wHsAeQB3AHs
AcQBzwFaAboByQFXAb8BzwFlAdIB4gFlAdIB4gFTAcsB3AFjAdEB4QFXAb8BzwFaAboByQGGAcQBzwHq AeQB2wHtAeYB3gHsAeQB2wG/AXIBWAHoAbkBpwHvAckBuAHvAckBuAHwAckBuAHiAboBpAHuAccBuAHs
AfIB8wYAAewB5AHbAe8B6AHiAe8B6AHhAe8B6AHhAfIB6wHkAb0BaQFKAecBuAGmAewBxwG2AesBxwG2 AccBtgHrAccBtgHqAcUBtAHiAbkBpAHsAccBtwHqAccBtgHrAccBtgHmAbkBpgG/AXIBWGAAAfMB7wHr
AeUBuAGmAbwBaAFJAewB5AHbAewB5AHcAewB5AHbAe0B5gHeAewB5AHbAb8BcgFYAegBuQGnAe8ByQG4 AekB3wHVAfEB6wHlAfEB6gHkAfEB6wHlAdkBoQGMAd0BnQGEAfAByQG5AfAByQG5Ad0BnQGEAdkBoQGM
Ae8ByQG4AfAByQG4AeIBugGkAe4BxwG4AewBxwG2AesBxwG2AeoBxQG0AeIBuQGkAewBxwG3AeoBxwG2 AfEB6wHlAfEB6gHkAfEB6wHlAekB3wHVAfMB7wHrAdwBtgGpAdwBmgGCAfAByQG5Ae8BygG6AfABygG6
AesBxwG2AeYBuQGmAb8BcgFYBgAB3gGuAXUB+gHVAYkB8QG2AWoB8QG2AWoB8QG2AWoB+QHSAYYB3gGu AecBvwGsAekBwQGuAfAByQG5AfAByQG5AekBwQGuAecBvwGsAfABygG6Ae8BygG6AfAByQG5AdwBmgGC
AXUB7wHmAdoDAAHvAeYB2gHeAa4BdQHeAa4BdQwAAWgBugHHAWABzgHgAWEB1AHlAXMB2gHqAWsBwAHO AdwBtgGpYAAD/AHsAeMB2wHvAekB4wHyAewB5gHxAesB5QHvAd0B1QHeAYcBaAHtAbsBqAHtAbsBqAHe
AYMB4QHvAWEBzQHdAWoBwAHNAXAB2QHpAWEB1AHlAWABzgHgAWgBugHHBgAB8wHvAesB6QHfAdUB8QHr AYcBaAHvAd0B1QHxAesB5QHyAewB5gHvAekB4wHsAeMB2wP8AfgB9gH1AdYBhgFqAeoBtwGkAfABygG6
AeUB8QHqAeQB8QHrAeUB2QGhAYwB3QGdAYQB8AHJAbkB8AHJAbkB3QGdAYQB2QGhAYwB8QHrAeUB8QHq AfABygG6Ae8ByQG5AeYBvwGrAe8BxwG4Ae8BxwG4AeYBvwGrAe8ByQG5AfABygG6AfABygG6AeoBtwGk
AeQB8QHrAeUB6QHfAdUB8wHvAesB3AG2AakB3AGaAYIB8AHJAbkB7wHKAboB8AHKAboB5wG/AawB6QHB AdYBhgFqAfgB9gH1YwAC+QH4AewB5AHcAesB4AHWAfIB7AHmAfUB8AHsAe0B0AHCAeoBkgFzAeoBkgFz
Aa4B8AHJAbkB8AHJAbkB6QHBAa4B5wG/AawB8AHKAboB7wHKAboB8AHJAbkB3AGaAYIB3AG2AakGAAHx Ae0B0AHCAfUB8AHsAfIB7AHmAesB4AHWAewB5AHcAvkB+AYAAfIB6AHkAeMBkAF0AeoBqQGQAe8BwQGw
AecB2wHjAbMBeAH9AdsBjwH3AcQBeAH8AdoBjgHjAbMBeAHxAecB2wkAAfEB5wHbAegBzQGsDAABaQG+ AfIByQG6AewBvAGqAeQBpQGLAeQBpQGLAewBvAGqAfIByQG6Ae8BwQGwAeoBqQGQAeMBkAF0AfIB6AHk
AcsBkwHqAfcBjgHiAfABbwHFAdEBaQG+AcsBjwHoAfYBbAHYAeoBhAHIAdIBbgHEAdEBhwHgAe4BigHm aQAD/AH0AfEB7gHvAekB4gHtAeQB3AHvAekB4gHxAeoB5AHxAeoB5AHvAekB4gHtAeQB3AHvAekB4gH0
AfQBaQG+AcsGAAP8AewB4wHbAe8B6QHjAfIB7AHmAfEB6wHlAe8B3QHVAd4BhwFoAe0BuwGoAe0BuwGo AfEB7gP8DAAB+QH2AfUB7QHGAbkB6wGdAYMB6wGJAWkB6wGdAYMB7QHEAbcB7QHEAbcB6wGdAYMB6wGJ
Ad4BhwFoAe8B3QHVAfEB6wHlAfIB7AHmAe8B6QHjAewB4wHbA/wB+AH2AfUB1gGGAWoB6gG3AaQB8AHK AWkB6wGdAYMB7QHGAbkB+QH2AfX/AP8A/wAMAAP/A/wD+hj4A/kD+gP8DAAD/QP6EvgD+QP9A/9pAAP+
AboB8AHKAboB7wHJAbkB5gG/AasB7wHHAbgB7wHHAbgB5gG/AasB7wHJAbkB8AHKAboB8AHKAboB6gG3 A/kD8QG6AaIBigG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG2AYYBVgG8
AaQB1gGGAWoB+AH2AfUJAAHxAegB3AHnAbcBewH/Ad8BkwHnAbcBewHxAegB3B4AAdEB5wHqAWsBwAHM AaQBjQP3DAAD/AP2A/MBvAHKAc0BVQGVAaMBVQGVAaMB0AHXAdkD8wP1A/sD/wwAA/4D/Ab5A/oG/AP7
AYkBywHUAeIB7gHwAWsBwAHMAZkB7gH7AXsB5AH1AYkBywHUAeIB7gHwAYkBywHUAWsBwAHMAdEB5wHq BvkD/AP+DAAD/gP8BvkD+gb8A/sG+QP8A/4SAAHoAd8B1AG5AYkBWQH8AbgBHAH8AbMBDgH8AbMBDQH8
CQAC+QH4AewB5AHcAesB4AHWAfIB7AHmAfUB8AHsAe0B0AHCAeoBkgFzAeoBkgFzAe0B0AHCAfUB8AHs AbMBDAH8AbIBCwH8AbIBCwH8AbMBDgG5AYkBWQ8AAfgC+QYAAV4BmQGmAUcB1AHlAUgBzAHeAVkBlgGk
AfIB7AHmAesB4AHWAewB5AHcAvkB+AYAAfIB6AHkAeMBkAF0AeoBqQGQAe8BwQGwAfIByQG6AewBvAGq BgAB+AL5DwAD/gP8A/kDswNcBvwDXAO0A/kD/AP+DAAD/gP8A/kDswNcBvwDXAO0A/kD/AP+FQAB6QHf
AeQBpQGLAeQBpQGLAewBvAGqAfIByQG6Ae8BwQGwAeoBqQGQAeMBkAF0AfIB6AHkDwAB8gHoAdwB6QG5 AdUBvgGOAV0B9wG2ASgB9QGrAQ4B9QGrAQ4B9QGrAQ4B9QGrAQ4B9gGuARQBvgGOAV0MAAHNAd4B4gFc
AX0B8gHoAdwkAAH5AfoB+wYAAWsBwgHPAZ4B7AH2AZkB7QH7AXABxAHQBgAB+QH6AfsPAAP8AfQB8QHu AZ8BrQF+AbEBvAHgAeoB7AF+AbEBvAFEAc8B4AFMAdQB5QFcAZ8BrQHgAeoB7AF+AbEBvAFcAZ8BrQHN
Ae8B6QHiAe0B5AHcAe8B6QHiAfEB6gHkAfEB6gHkAe8B6QHiAe0B5AHcAe8B6QHiAfQB8QHuA/wMAAH5 Ad4B4hIAA8sDdQP4BgAD+AN1A8sYAAPLA3UD+AYAA/gDdQPLHgAB2gHCAaoBwwGTAWAB8QG0ATYB7AGm
AfYB9QHtAcYBuQHrAZ0BgwHrAYkBaQHrAZ0BgwHtAcQBtwHtAcQBtwHrAZ0BgwHrAYkBaQHrAZ0BgwHt ARkB7AGmARkB7AGmARkB7gGqASMBwwGTAWAMAAFhAagBtQFEAcsB3AFGAcUB1AFVAaoBuQF9AbYBwAFH
AcYBuQH5AfYB9UgAAeUB8AHyAWwBxAHRAWwBxAHRAdIB6AHr/wAzAAP8A/kh+AP5A/wDAAP9A/kh+AP5 AcYB1gFRAc8B3wFhAagBtQFVAaoBuQFGAcUB1AFEAcsB3AFhAagBtQ8AA84DfwP5AYIBwgG0AVkBrgGd
A/05AAP/A/wD+RL4A/kD+wP+BgABlgGpAbwBXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGE AVkBrgGdAakB0wHIA/kDfwPOEgADzgN/A/kBvwF9AUoBvwF9AUoBwAF+AU0B4gHOAb8D+QN/A84YAAHs
Aa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BlgGpAbwDAALPAcsCuQGw AeIB1wHJAZkBZAHsAbYBSgHjAaABJQHjAaABJQHjAaABJQHjAaABJQHmAacBMQHJAZkBZAwAAWIBrQG6
ArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwAs8ByzkAA/4D+AHo AWkBzwHeAUsByQHaAUQBxgHXAVcBrgG7AUkBvgHOAVYBzgHeAVcBrgG7AUQBxgHXAUgByAHYAVUByAHX
AuUB2QG0AasB6gGOAXcB7gFwAVAB7gFwAVAB6gGOAXcB2QG0AasB6AHlAeQD9gP+BgABbAGTAboBVQGI AWIBrQG6DAAD0AOGA/kJAAHSAegB4AFgAbUBpAMAA/kDhgPQDAAD0AOGA/kDAAHGAYIBUQHiAcsBuQkA
AbsBcAGjAdYBZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGa A/kDhgPQEgAB7QHjAdgBzQGeAWkB6gG5AVwB2wGaATEB2wGaATEB2wGaATEB5gGyAVIB2wGaATEB4AGk
Ac0BcAGjAdYBVQGIAbsBbAGTAboDAALBAbkC+QHpAvMB4gLzAeIC8wHiAvMB4gLzAeIC8wHiAvMB4gLz AT8BzQGeAWkMAAHpAfEB8gGEAb8ByQFmAbsByAFdAb8BzwFEAcMB1AFEAcMB1AFPAcgB2AFEAcMB1AFY
AeIC8wHiAvMB4gLzAeIC+QHpAsEBuTwAAeoB3AHYAe4BggFnAfUBogGPAfoB0QHKAfwB5wHlAfwB5gHl AbwBzAFfAbgBxgGEAb8ByQHpAfEB8gkAA+8DbAPvBgABsgHcAdIBaAG9AawBaAG9AawBrgHZAc0GAAPv
AfkB0QHJAfQBoQGOAe4BgQFmAeoB3AHYCQABfgGiAccBcQGkAdcBVQGIAbsBcQGkAdcBcQGkAdcBcQGk A2wD7wYAA+8DbAPvBgABzgGKAVkB5AHNAboMAAPvA2wD7wwAAe4B5AHZAdMBowFtAe4BwgFxAdQBlgE9
AdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBVQGIAbsBcQGkAdcBfgGiAccDAALL AdMBlQE7AdMBlQE7AeUBtgFhAdMBowFtAeMBsgFdAdoBogFLAdMBowFtEgAB5QHuAfABZQG0AcEBTgG+
AcMC9AHkAXoBpwGbAYcBtwGnAYcBtQGjAYkBswGiAWgBoAGGAVcBlwF4AVgBkwF5AWgBkAF+AZIBpAGT Ac4BSAHFAdYBSAHFAdYBTgG+Ac4BZQG0AcEB5QHuAfASAAPUA5ED+QMAAXABxQG0AdUB6wHiCQAD+QOR
AYYBlwGAAqgBjgL0AeQCywHDCQAD/gP8BvkD+gb8A/sG+QP8A/4MAAHzAd8B2gHuAXsBYAH3AdQBzgH3 A9QMAAPUA5ED+QMAAdYBkgFhAecBzwG8CQAD+QORA9QMAAHvAeUC2QGpAXEB+QHQAYQB7gGyAWYB6QGt
AukB9wLoAfwC9AH8AvQB9wLoAfcC6QH2AdEBygHuAXsBXwHzAd8B2gYAAYYBqgHNAXMBpgHZAWoBnQHQ AWEB3wGjAVUB6wHAAXIB2QGpAXEB5QHOAbIB2QGpAXEB5AG1AWgB2QGpAXEMAAHqAfIB8wGGAcQBzwFa
AUgBewGuAV8BkgHFAUwBfwGyAV8BkgHFAUwBfwGyAV8BkgHFAUwBfwGyAV8BkgHFAUgBewGuAWoBnQHQ AboByQFXAb8BzwFlAdIB4gFlAdIB4gFTAcsB3AFjAdEB4QFXAb8BzwFaAboByQGGAcQBzwHqAfIB8w8A
AXMBpgHZAYYBqgHNAwACzwHHAvUB5gGEAbUBqwGYAdcBxwGQAdEBvgFzAbABmQGXAcsBtgGnAc4BvQGX A9UDlgP5AbcB4QHVAXYBywG6AXYBywG6AZUB1QHGA/kDlgPVEgAD1QOWA/kB3QGhAXUB6QHRAb4GAAP5
Ab0BrAGUAboBqAGpAb8BrwGOAa0BoQG3Aa0BiwL1AeYCzwHHCQAD/gP8A/kDswNcBvwDXAO0A/kD/AP+ A5YD1Q8AAd4BrgF1AfoB1QGJAfEBtgFqAfEBtgFqAfEBtgFqAfkB0gGGAd4BrgF1Ae8B5gHaAwAB7wHm
CQAB+gH4AfcB5wF+AWIB8wHTAc0B8ALlAe8C5AHvAuQB5QFhAT8B5QFhAT8B7wLkAe8C5AHvAuQB7wHN AdoB3gGuAXUB3gGuAXUMAAFoAboBxwFgAc4B4AFhAdQB5QFzAdoB6gFrAcABzgGDAeEB7wFhAc0B3QFq
AccB5wF+AWIB+gH4AfcDAAGLAa0BzwF1AagB2wFsAZ8B0gFKAX0BsAFsAZ8B0gFSAYUBuAFsAZ8B0gFS AcABzQFwAdkB6QFhAdQB5QFgAc4B4AFoAboBxxIAA9cDmQP6BgAD+gOZA9cYAAPXA5kD+gYAA/oDmQPX
AYUBuAFsAZ8B0gFSAYUBuAFsAZ8B0gFKAX0BsAFsAZ8B0gF1AagB2wGLAa0BzwMAAtEByQL2AekBkAG8 EgAB8QHnAdsB4wGzAXgB/QHbAY8B9wHEAXgB/AHaAY4B4wGzAXgB8QHnAdsJAAHxAecB2wHoAc0BrAwA
AbUBuQHlAdsBpgHdAdABiAHAAbIBhwHJAbUBfgG+AaQBiAG5AaMBrgHQAb8BqQHHAbUBlAG6AagBtgG1 AWkBvgHLAZMB6gH3AY4B4gHwAW8BxQHRAWkBvgHLAY8B6AH2AWwB2AHqAYQByAHSAW4BxAHRAYcB4AHu
AZEC9gHpAtEByQ8AA8sDdQP4BgAD+AN1A8sPAAHoAcUBvAHlAZ0BigHqAuIB5wLfAecC3wHnAt8B1gFZ AYoB5gH0AWkBvgHLFQAD2AOdBgADnQPYHgAD2AOdBgADnQPYGAAB8QHoAdwB5wG3AXsB/wHfAZMB5wG3
ATcB1gFZATcB5wLfAecC3wHnAt8B6ALgAeEBlwGEAegBxQG8AwABjwGxAdIBdwGqAd0BbgGhAdQBRwF6 AXsB8QHoAdweAAHRAecB6gFrAcABzAGJAcsB1AHiAe4B8AFrAcABzAGZAe4B+wF7AeQB9QGJAcsB1AHi
Aa0BbgGhAdQBTwGCAbUBbgGhAdQBTwGCAbUBbgGhAdQBTwGCAbUBbgGhAdQBRwF6Aa0BbgGhAdQBdwGq Ae4B8AGJAcsB1AFrAcABzAHRAecB6nIAAfIB6AHcAekBuQF9AfIB6AHcJAAB+QH6AfsGAAFrAcIBzwGe
Ad0BjwGxAdIDAALTAcwC9wHrAcUBuAGHAf8B3gGMAfgB5wGtAdUB0QGwAcoB6wHiAb0B5QHZAaABygG7 AewB9gGZAe0B+wFwAcQB0AYAAfkB+gH7qwAB5QHwAfIBbAHEAdEBbAHEAdEB0gHoAevSAAP8A/kh+AP5
AaoBzgGvAYIBwQGkAX4BtgKYAawBhAL3AesC0wHMDAADzgN/A/kB3QGzAbkBwAFJAVoBwAFJAVoB3QGz A/wDAAP9A/kh+AP5A/05AAP/A/wD+RL4A/kD+wP+BgABlgGpAbwBXAGEAa4BXAGEAa4BXAGEAa4BXAGE
AbkD+QN/A84MAAHSAYQBbgHqAdAByAHhAtoB4ALZAeAC2QHgAtkB8QLtAfEC7QHgAtkB4ALZAeAC2QHg Aa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BXAGEAa4BlgGp
AtkB4QHEAb0B0gGEAW4DAAGTAbQB1AF4AasB3gFvAaIB1QFEAXcBqgFvAaIB1QFMAX8BsgFvAaIB1QFM AbwDAALPAcsCuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGw
AX8BsgFvAaIB1QFMAX8BsgFvAaIB1QFEAXcBqgFvAaIB1QF4AasB3gGTAbQB1AMAAtUBzQL4Ae4B0QGu As8ByzkAA/4D+AHoAuUB2QG0AasB6gGOAXcB7gFwAVAB7gFwAVAB6gGOAXcB2QG0AasB6AHlAeQD9gP+
AWkB2wG6AXEB3gG+AXQB6QHJAXwBvwHNAagBlQHMAcIBoQHPAb4BkQHEAa8BfwG9AaYBdwG3AZ0BqAGq BgABbAGTAboBVQGIAbsBcAGjAdYBZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGaAc0BZwGa
AXcC+AHuAtUBzQkAA9ADhgP5BgAB4AG2AbwB0QF7AYcGAAP5A4YD0AkAAbsBVAE1AfQB7gHtAecC5QHa Ac0BZwGaAc0BZwGaAc0BcAGjAdYBVQGIAbsBbAGTAboDAALBAbkC+QHpAvMB4gLzAeIC8wHiAvMB4gLz
AtYB2ALUAdgC1AG3AUgBJgG3AUgBJgHjAt8B2ALUAdgC1AHYAtQB4QHYAdYBuwFUATUDAAGYAbgB1wF6 AeIC8wHiAvMB4gLzAeIC8wHiAvMB4gLzAeIC+QHpAsEBuTwAAeoB3AHYAe4BggFnAfUBogGPAfoB0QHK
Aa0B4AFxAaQB1wFBAXQBpwFxAaQB1wFJAXwBrwFxAaQB1wFJAXwBrwFxAaQB1wFJAXwBrwFxAaQB1wFB AfwB5wHlAfwB5gHlAfkB0QHJAfQBoQGOAe4BgQFmAeoB3AHYCQABfgGiAccBcQGkAdcBVQGIAbsBcQGk
AXQBpwFxAaQB1wF6Aa0B4AGYAbgB1wMAAtcBzwL5AfEB0wGsAWYB/wHTAX4B/wHWAYIB4AG+AXQB9gHh AdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBcQGkAdcBVQGIAbsBcQGk
AZkBsAHtAeQBrwHRAb8BogHgAdMBmAHYAcYBjgHQAboBuAGyAYAC+QHxAtcBzwYAA+8DbAPvCQAB4wG4 AdcBfgGiAccDAALLAcMC9AHkAXoBpwGbAYcBtwGnAYcBtQGjAYkBswGiAWgBoAGGAVcBlwF4AVgBkwF5
Ab8B1wGBAY0JAAPvA2wD7wYAAbEBUAExAfQB7wHtA+4D6gHcAtsB0wLRAccBpgGcAa4BRwElAcEBcwFa AWgBkAF+AZIBpAGTAYYBlwGAAqgBjgL0AeQCywHDCQAD/gP8BvkD+gb8A/sG+QP8A/4MAAHzAd8B2gHu
Ad4C3AHSAtAB0gLQAd8B2AHXAbEBUAExAwABmwG6AdkBfAGvAeIBcwGmAdkBPwFyAaUBcwGmAdkBRwF6 AXsBYAH3AdQBzgH3AukB9wLoAfwC9AH8AvQB9wLoAfcC6QH2AdEBygHuAXsBXwHzAd8B2gYAAYYBqgHN
Aa0BcwGmAdkBRwF6Aa0BcwGmAdkBRwF6Aa0BcwGmAdkBPwFyAaUBcwGmAdkBfAGvAeIBmwG6AdkDAALZ AXMBpgHZAWoBnQHQAUgBewGuAV8BkgHFAUwBfwGyAV8BkgHFAUwBfwGyAV8BkgHFAUwBfwGyAV8BkgHF
AdEC+wH0AdUBqQFiAf8BzgF5Af8B0gF9Ad8BugFvAf8B2AGDAeYB6gG9AaYB2AHNAbMB7AHiAbkB5AHQ AUgBewGuAWoBnQHQAXMBpgHZAYYBqgHNAwACzwHHAvUB5gGEAbUBqwGYAdcBxwGQAdEBvgFzAbABmQGX
AbYB3AHEAasBvgGXAvsB9ALZAdEJAAPUA5ED+QYAAeYBuwHBAd0BhwGTBgAD+QORA9QJAAHAAX0BZgHq AcsBtgGnAc4BvQGXAb0BrAGUAboBqAGpAb8BrwGOAa0BoQG3Aa0BiwL1AeYCzwHHCQAD/gP8A/kDswNc
AdUBzQnwA+sD4AHIAZwBjQGrAUYBJAG9AYoBeQPOAdIC0QHcAccCwAF9AWYDAAGdAb0B2wF+AbEB5AF1 BvwDXAO0A/kD/AP+CQAB+gH4AfcB5wF+AWIB8wHTAc0B8ALlAe8C5AHvAuQB5QFhAT8B5QFhAT8B7wLk
AagB2wE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngF1 Ae8C5AHvAuQB7wHNAccB5wF+AWIB+gH4AfcDAAGLAa0BzwF1AagB2wFsAZ8B0gFKAX0BsAFsAZ8B0gFS
AagB2wF+AbEB5AGdAb0B2wMAAtoB0wL8AfcB1wGnAV8B2gGsAWQB3AGwAWcB5wG8AXAB4AG6AW8B4wG+ AYUBuAFsAZ8B0gFSAYUBuAFsAZ8B0gFSAYUBuAFsAZ8B0gFKAX0BsAFsAZ8B0gF1AagB2wGLAa0BzwMA
AXMB3wHRAZgB2wHPAZYB1QHRAZwBxAHNAaQBnQHRAcMC/AH3AtoB0wwAA9UDlgP5AegBvQHDAd0BZgF3 AtEByQL2AekBkAG8AbUBuQHlAdsBpgHdAdABiAHAAbIBhwHJAbUBfgG+AaQBiAG5AaMBrgHQAb8BqQHH
Ad0BZgF3AegBvQHDA/kDlgPVDAAB3wHDAbkB1AGdAYoD9QbzAdoBqQGYAdoBqQGYAc8BjgF4AbMBTwEt AbUBlAG6AagBtgG1AZEC9gHpAtEByQ8AA8sDdQP4BgAD+AN1A8sPAAHoAcUBvAHlAZ0BigHqAuIB5wLf
AdMBoQGQA/MD9QHUAZwBiQHfAcMBuQMAAaABvgHcAX8BsgHlAWYBmQHMAXYBqQHcAXYBqQHcAXYBqQHc AecC3wHnAt8B1gFZATcB1gFZATcB5wLfAecC3wHnAt8B6ALgAeEBlwGEAegBxQG8AwABjwGxAdIBdwGq
AXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAWYBmQHMAX8BsgHlAaABvgHcAwAC2wHU Ad0BbgGhAdQBRwF6Aa0BbgGhAdQBTwGCAbUBbgGhAdQBTwGCAbUBbgGhAdQBTwGCAbUBbgGhAdQBRwF6
Av0B+QHZAaQBXAH/AcQBbwH/AcgBcwHeAbABZwH/Ac4BeQH/AdIBfQHkAb4BcgH/AdgBgwHtAeQBqAHi Aa0BbgGhAdQBdwGqAd0BjwGxAdIDAALTAcwC9wHrAcUBuAGHAf8B3gGMAfgB5wGtAdUB0QGwAcoB6wHi
AeYBtgHQAdcBrQL9AfkC2wHUDwAD1wOZA/oGAAP6A5kD1w8AAfkB+AH3AcsBewFgAfIB3wHZA/gD9wHB Ab0B5QHZAaABygG7AaoBzgGvAYIBwQGkAX4BtgKYAawBhAL3AesC0wHMDAADzgN/A/kB3QGzAbkBwAFJ
AV0BOwHBAV0BOwHBAV0BOwHBAV0BOwHpAdAByAP4AfIB3wHZAcsBewFgAfkB+AH3AwABowHAAd4BawGe AVoBwAFJAVoB3QGzAbkD+QN/A84MAAHSAYQBbgHqAdAByAHhAtoB4ALZAeAC2QHgAtkB8QLtAfEC7QHg
AdEBdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGq AtkB4ALZAeAC2QHgAtkB4QHEAb0B0gGEAW4DAAGTAbQB1AF4AasB3gFvAaIB1QFEAXcBqgFvAaIB1QFM
Ad0BdwGqAd0BawGeAdEBowHAAd4DAALdAdUC/gH8AdoBowFaAf8BvwFrAf8BwgFuAd4BrAFiAf8ByQF0 AX8BsgFvAaIB1QFMAX8BsgFvAaIB1QFMAX8BsgFvAaIB1QFEAXcBqgFvAaIB1QF4AasB3gGTAbQB1AMA
Af8BzQF4AeMBuQFuAf8B0wF+Af8B1wGDAfwB3gGVAewBygF8Av4B/ALdAdUSAAPYA50GAAOdA9gVAAHu AtUBzQL4Ae4B0QGuAWkB2wG6AXEB3gG+AXQB6QHJAXwBvwHNAagBlQHMAcIBoQHPAb4BkQHEAa8BfwG9
AeAB2wHYAYQBaAH2AeMB3AP8DPsD/AH2AeMB3AHYAYQBaAHuAeAB2wYAAaYBwwHgAaAB0wH6AZgBywH1 AaYBdwG3AZ0BqAGqAXcC+AHuAtUBzQkAA9ADhgP5BgAB4AG2AbwB0QF7AYcGAAP5A4YD0AkAAbsBVAE1
AZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZgBywH1 AfQB7gHtAecC5QHaAtYB2ALUAdgC1AG3AUgBJgG3AUgBJgHjAt8B2ALUAdgC1AHYAtQB4QHYAdYBuwFU
AaAB0wH6AaYBwwHgAwAC3gHXAv8B/gHbAaEBWAHbAaIBWQHbAaQBWwHbAaUBXQHbAakBYAHbAawBYwHb ATUDAAGYAbgB1wF6Aa0B4AFxAaQB1wFBAXQBpwFxAaQB1wFJAXwBrwFxAaQB1wFJAXwBrwFxAaQB1wFJ
Aa8BZgHbAbEBaAHbAbQBawHbAbcBbgHbAbkBcQL/Af4C3gHXPAAB8AHiAd0B5AGUAXgB7wG3AaQB+gHk AXwBrwFxAaQB1wFBAXQBpwFxAaQB1wF6Aa0B4AGYAbgB1wMAAtcBzwL5AfEB0wGsAWYB/wHTAX4B/wHW
Ad0B/gH5AfcB/gH5AfcB+gHkAd0B7wG3AaQB5AGUAXgB8AHiAd0JAAHoAe0B8wGoAcQB4QGXAcoB9QGS AYIB4AG+AXQB9gHhAZkBsAHtAeQBrwHRAb8BogHgAdMBmAHYAcYBjgHQAboBuAGyAYAC+QHxAtcBzwYA
AcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGXAcoB9QGo A+8DbAPvCQAB4wG4Ab8B1wGBAY0JAAPvA2wD7wYAAbEBUAExAfQB7wHtA+4D6gHcAtsB0wLRAccBpgGc
AcQB4QHoAe0B8wMAAt8B2Sf/At8B2T8AAfoC+AHvAdIByAHsAagBkgHsAY4BbgHsAY4BbgHsAagBkgHv Aa4BRwElAcEBcwFaAd4C3AHSAtAB0gLQAd8B2AHXAbEBUAExAwABmwG6AdkBfAGvAeIBcwGmAdkBPwFy
AdIByAH6AvgPAAHoAe0B8wGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGp AaUBcwGmAdkBRwF6Aa0BcwGmAdkBRwF6Aa0BcwGmAdkBRwF6Aa0BcwGmAdkBPwFyAaUBcwGmAdkBfAGv
AcUB4gGpAcUB4gGpAcUB4gGpAcUB4gHoAe0B8wYAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLg AeIBmwG6AdkDAALZAdEC+wH0AdUBqQFiAf8BzgF5Af8B0gF9Ad8BugFvAf8B2AGDAeYB6gG9AaYB2AHN
AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC6gHmwwAD+wPxAZUBrwG8AWgBmwG2AWgBmwG2AWgBmwG2 AbMB7AHiAbkB5AHQAbYB3AHEAasBvgGXAvsB9ALZAdEJAAPUA5ED+QYAAeYBuwHBAd0BhwGTBgAD+QOR
AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AZUBrwG8A/ED+xUAEvgD+QP9 A9QJAAHAAX0BZgHqAdUBzQnwA+sD4AHIAZwBjQGrAUYBJAG9AYoBeQPOAdIC0QHcAccCwAF9AWYDAAGd
MwAD/AP5JPgD+QP8A/0D+gF3AagBwQGGAc8B8AGBAcsB7QGBAcsB7QGBAcsB7QGBAcsB7QGBAcsB7QGB Ab0B2wF+AbEB5AF1AagB2wE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngFRAYQBtwE4AWsBngFR
AcsB7QGGAc8B8AFLAY8BsQGGAc8B8AF3AagBwQHcAeIB5Qb9A/kM+APzAYkBpQGPAVUBiwFfAVUBiwFf AYQBtwE4AWsBngF1AagB2wF+AbEB5AGdAb0B2wMAAtoB0wL8AfcB1wGnAV8B2gGsAWQB3AGwAWcB5wG8
AVUBiwFfAVUBiwFfAVUBiwFfAVUBiwFfAZQBrQGZBgADwAMsA8ADAAP7G/gD+wP3AZMBpgG6AWABiAGv AXAB4AG6AW8B4wG+AXMB3wHRAZgB2wHPAZYB1QHRAZwBxAHNAaQBnQHRAcMC/AH3AtoB0wwAA9UDlgP5
AWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGv AegBvQHDAd0BZgF3Ad0BZgF3AegBvQHDA/kDlgPVDAAB3wHDAbkB1AGdAYoD9QbzAdoBqQGYAdoBqQGY
AWABiAGvAZMBpgG6A/cGAAGGAbUBzQGEAc4B7gF8AccB6AF8AccB6AF8AccB6AF8AccB6AF8AccB6AF8 Ac8BjgF4AbMBTwEtAdMBoQGQA/MD9QHUAZwBiQHfAcMBuQMAAaABvgHcAX8BsgHlAWYBmQHMAXYBqQHc
AccB6AGEAc4B7gFXAZsBvQGEAc4B7gH0AbYBLgGGAbUBzQMAApQBuAJVAaMCVQGjAlUBowJVAaMCVQGj AXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAXYBqQHcAWYBmQHMAX8BsgHl
AlUBowFVAXoBiQE1Ab0BeQFDAcsBhwE+AcYBggE+AcYBggE+AcYBggFDAcsBhwFVAaABcAYAA0ABZwJW AaABvgHcAwAC2wHUAv0B+QHZAaQBXAH/AcQBbwH/AcgBcwHeAbABZwH/Ac4BeQH/AdIBfQHkAb4BcgH/
A0ADAAP7A2EDXgNcA1kDVANJAzwDLwNsA/sDAAFyAZgBvwF7Aa4B4AF6Aa0B3wF6Aa0B3wF6Aa0B3wF6 AdgBgwHtAeQBqAHiAeYBtgHQAdcBrQL9AfkC2wHUDwAD1wOZA/oGAAP6A5kD1w8AAfkB+AH3AcsBewFg
Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF7Aa4B4AFyAZgBvwkAAZEBvgHU AfIB3wHZA/gD9wHBAV0BOwHBAV0BOwHBAV0BOwHBAV0BOwHpAdAByAP4AfIB3wHZAcsBewFgAfkB+AH3
AYcB0AHvAX8BygHpAX8BygHpAX8BygHpAX8BygHpAX8BygHpAX8BygHpAYcB0AHvAV8BowHFAYcB0AHv AwABowHAAd4BawGeAdEBdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGqAd0BdwGq
Af4ByQFBAZEBvgHUAwACVQG0AS8BHgHcASUBEwHYASUBEwHYASUBEwHYASUBEwHYASUBEwHYAVUBfgGV Ad0BdwGqAd0BdwGqAd0BdwGqAd0BawGeAdEBowHAAd4DAALdAdUC/gH8AdoBowFaAf8BvwFrAf8BwgFu
ATcBvwF7AUIBygGGATcBvwF7ATcBvwF7ATcBvwF7AUIBygGGAVUBpwF2BgADywNVA8snAAGEAacBywGB Ad4BrAFiAf8ByQF0Af8BzQF4AeMBuQFuAf8B0wF+Af8B1wGDAfwB3gGVAewBygF8Av4B/ALdAdUSAAPY
AbQB5AF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9 A50GAAOdA9gVAAHuAeAB2wHYAYQBaAH2AeMB3AP8DPsD/AH2AeMB3AHYAYQBaAHuAeAB2wYAAaYBwwHg
AbAB4QGBAbQB5AGEAacBywkAAZQBwAHWAYoB0wHwAYIBzQHrAYIBzQHrAYIBzQHrAYIBzQHrAYIBzQHr AaAB0wH6AZgBywH1AZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHzAZMBxgHz
AYIBzQHrAYoB0wHwAWIBpgHIAYoB0wHwAukB2wGUAcAB1gMAAlUBuQEtARwB3gEVAQAB1QEVAQAB1QEV AZMBxgHzAZgBywH1AaAB0wH6AaYBwwHgAwAC3gHXAv8B/gHbAaEBWAHbAaIBWQHbAaQBWwHbAaUBXQHb
AQAB1QEVAQAB1QEVAQAB1QFVAYEBmgE7AcMBfwFIAc8BjAE7AcMBfwE7AcMBfwE7AcMBfwFIAc8BjAFV AakBYAHbAawBYwHbAa8BZgHbAbEBaAHbAbQBawHbAbcBbgHbAbkBcQL/Af4C3gHXPAAB8AHiAd0B5AGU
Aa0BezYAAYoBrQHPAYgBuwHqAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHl AXgB7wG3AaQB+gHkAd0B/gH5AfcB/gH5AfcB+gHkAd0B7wG3AaQB5AGUAXgB8AHiAd0JAAHoAe0B8wGo
AYIBtQHlAYIBtQHlAYIBtQHlAYgBuwHqAYoBrQHPCQABmAHDAdgBjgHWAfIBhwHQAe0BhwHQAe0BhwHQ AcQB4QGXAcoB9QGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGSAcUB8wGS
Ae0BhwHQAe0BhwHQAe0BhwHQAe0BjgHWAfIBZgGqAcwBjgHWAfIC8AHmAZgBwwHYAwACVQG/ATYBJQHk AcUB8wGXAcoB9QGoAcQB4QHoAe0B8wMAAt8B2Sf/At8B2T8AAfoC+AHvAdIByAHsAagBkgHsAY4BbgHs
ARkBAAHbARkBAAHbARkBAAHbARkBAAHbARkBAAHbAVUBhAGgAT4BxgGCAU0B1QGRAT4BxgGCAT4BxgGC AY4BbgHsAagBkgHvAdIByAH6AvgPAAHoAe0B8wGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGp
AT4BxgGCAU0B1QGRAVUBswGANgABjgGwAdEBjwHCAe4BhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6 AcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gGpAcUB4gHoAe0B8wYAAuoB5gLgAdkC4AHZAuAB2QLg
AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBjwHCAe4BjgGwAdEJAAGbAcYB2gGSAdoB9AGL AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC6gHmwwAD+wPxAZUBrwG8AWgBmwG2
AdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGSAdoB9AFpAa0BzwGSAdoB9AL4AfMBmwHG AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AWgBmwG2AZUBrwG8
AdoDAAJVAcQBPgEtAewBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBVQGGAaQBQgHKAYYBUQHZ A/ED+xUAEvgD+QP9MwAD/AP5JPgD+QP8A/0D+gF3AagBwQGGAc8B8AGBAcsB7QGBAcsB7QGBAcsB7QGB
AZUBQgHKAYYBQgHKAYYBQgHKAYYBUQHZAZUBVQG5AYQGAAPQA2cD0CcAAZMBtAHUAZYByQHyAYwBvwHs AcsB7QGBAcsB7QGBAcsB7QGGAc8B8AFLAY8BsQGGAc8B8AF3AagBwQHcAeIB5Qb9A/kM+APzAYkBpQGP
AYwBvwHsAYwBvwHsAUQBdwGqAYwBvwHsAUQBdwGqAYwBvwHsAYwBvwHsAYwBvwHsAYwBvwHsAZYByQHy AVUBiwFfAVUBiwFfAVUBiwFfAVUBiwFfAVUBiwFfAVUBiwFfAZQBrQGZBgADwAMsA8ADAAP7G/gD+wP3
AZMBtAHUCQABnwHIAd0BlwHeAfYBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBlwHe AZMBpgG6AWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGvAWABiAGv
AfYBeQG9AdwBeAG9AdwC/gH9AZ8ByAHdAwACVQHIAUYBNQHyASABAAHpASABAAHpASABAAHpASABAAHp AWABiAGvAWABiAGvAWABiAGvAZMBpgG6A/cGAAGGAbUBzQGEAc4B7gF8AccB6AF8AccB6AF8AccB6AF8
ASABAAHpAVUBiQGoAUQBzAGIAWUB7QGpAWUB7QGpAWUB7QGpAWUB7QGpAVgB1gGWAX8BywGkBgADbAFv AccB6AF8AccB6AF8AccB6AGEAc4B7gFXAZsBvQGEAc4B7gH0AbYBLgGGAbUBzQMAApQBuAJVAaMCVQGj
AmkDbAYAA3UDdANxA24DbANoA2UDYwNgBgABmAG4AdcBmwHOAfYBkQHEAfABkQHEAfABkQHEAfABVQGI AlUBowJVAaMCVQGjAlUBowFVAXoBiQE1Ab0BeQFDAcsBhwE+AcYBggE+AcYBggE+AcYBggFDAcsBhwFV
AbsBRAF3AaoBVQGIAbsBQAFzAaYBkQHEAfABkQHEAfABkQHEAfABmwHOAfYBmAG4AdcJAAGiAcoB3gGb AaABcAYAA0ABZwJWA0ADAAP7A2EDXgNcA1kDVANJAzwDLwNsA/sDAAFyAZgBvwF7Aa4B4AF6Aa0B3wF6
AeEB9wGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGeAeQB+QF8AcAB3gGi Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF6Aa0B3wF7Aa4B4AFy
AcoB3gHuAfMB9QMAAn8B1QFiAWEB5wF2AXUB/gF2AXUB/gF5AWIBowF7AVABVQF7AVABVQFqAVkBPwFq AZgBvwkAAZEBvgHUAYcB0AHvAX8BygHpAX8BygHpAX8BygHpAX8BygHpAX8BygHpAX8BygHpAYcB0AHv
AW4BMgFqAW4BMgFhAYsBUQFVAcEBigFVAcEBigFVAcEBigHiAe8B6AYAA9MDcQPTJwABmwG6AdkBnwHS AV8BowHFAYcB0AHvAf4ByQFBAZEBvgHUAwACVQG0AS8BHgHcASUBEwHYASUBEwHYASUBEwHYASUBEwHY
AfkBlQHIAfMBlQHIAfMBlQHIAfMBVQGIAbsBVQGIAbsBVQGIAbsBTQGAAbMBlQHIAfMBlQHIAfMBlQHI ASUBEwHYAVUBfgGVATcBvwF7AUIBygGGATcBvwF7ATcBvwF7ATcBvwF7AUIBygGGAVUBpwF2BgADywNV
AfMBnwHSAfkBmwG6AdkJAAGlAc0B4AGeAeUB+QGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGY A8snAAGEAacBywGBAbQB5AF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9AbAB4QF9
Ad8B9gGYAd8B9gGYAd8B9gGhAegB+gGlAc0B4AYAAuIB8QJVAc4CVQHOAlUBzgFtAVMBdQHcAakBMgHX AbAB4QF9AbAB4QF9AbAB4QGBAbQB5AGEAacBywkAAZQBwAHWAYoB0wHwAYIBzQHrAYIBzQHrAYIBzQHr
AaQBLQHXAaQBLQHXAaQBLQHcAakBMgGwAYYBSEIAAZ8BvQHbAakB2wH+AaoB3QH/AaoB3QH/AaoB3QH/ AYIBzQHrAYIBzQHrAYIBzQHrAYoB0wHwAWIBpgHIAYoB0wHwAukB2wGUAcAB1gMAAlUBuQEtARwB3gEV
AXcBqgHdAXcBqgHdAXcBqgHdAWYBmQHMAaoB3QH/AaoB3QH/AaoB3QH/AakB2wH+AZ8BvQHbCQABqAHO AQAB1QEVAQAB1QEVAQAB1QEVAQAB1QEVAQAB1QFVAYEBmgE7AcMBfwFIAc8BjAE7AcMBfwE7AcMBfwE7
AeIBowHoAfsBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBowHo AcMBfwFIAc8BjAFVAa0BezYAAYoBrQHPAYgBuwHqAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHl
AfsBqAHOAeISAAG2AYsBRQHcAakBMgHRAZ4BJwHRAZ4BJwHRAZ4BJwHcAakBMgG2AYsBRUIAAccB1wHn AYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYIBtQHlAYgBuwHqAYoBrQHPCQABmAHDAdgBjgHWAfIBhwHQ
AYgBtgHiAYABswHmAYABswHmAYABswHmAU4BgQG0AU4BgQG0AU4BgQG0AUgBewGuAYABswHmAYABswHm Ae0BhwHQAe0BhwHQAe0BhwHQAe0BhwHQAe0BhwHQAe0BjgHWAfIBZgGqAcwBjgHWAfIC8AHmAZgBwwHY
AYABswHmAYgBtgHiAccB1wHnCQABqwHQAeMBpgHrAfwBoQHmAfsBoQHmAfsBoQHmAfsBoQHmAfsBoQHm AwACVQG/ATYBJQHkARkBAAHbARkBAAHbARkBAAHbARkBAAHbARkBAAHbAVUBhAGgAT4BxgGCAU0B1QGR
AfsBoQHmAfsBoQHmAfsBoQHmAfsBpgHrAfwBqwHQAeMSAAG7AZABQQHhAa4BOAHWAaMBLAHWAaMBLAHW AT4BxgGCAT4BxgGCAT4BxgGCAU0B1QGRAVUBswGANgABjgGwAdEBjwHCAe4BhwG6AekBhwG6AekBhwG6
AaMBLAHhAa4BOAG7AZABQRIAA9cDfQPXJwAB4wHqAfEBjgG4AeEBiQG8Ae8BiAG7Ae4BiAG7Ae4BQQF0 AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBhwG6AekBjwHCAe4BjgGwAdEJAAGb
AacBQQF0AacBQQF0AacBPgFxAaQBiAG7Ae4BiAG7Ae4BiQG8Ae8BjgG4AeEB4wHqAfEJAAGuAdIB5AGp AcYB2gGSAdoB9AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGLAdQB8AGSAdoB9AFpAa0BzwGS
Ae4B/QGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGpAe4B/QGu AdoB9AL4AfMBmwHGAdoDAAJVAcQBPgEtAewBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBHAEAAeMBVQGG
AdIB5BIAAcABlQE/AecBtAE9AdoBpwEwAdoBpwEwAdoBpwEwAecBtAE9AcABlQE/EgADfwN3A38GAAOC AaQBQgHKAYYBUQHZAZUBQgHKAYYBQgHKAYYBQgHKAYYBUQHZAZUBVQG5AYQGAAPQA2cD0CcAAZMBtAHU
A4EDfwN+A3wDegN5A3YDqwYAAfUB9wH5AZsBvgHfAYkBvAHvAYgBuwHuAYgBuwHuATUBaAGbATUBaAGb AZYByQHyAYwBvwHsAYwBvwHsAYwBvwHsAUQBdwGqAYwBvwHsAUQBdwGqAYwBvwHsAYwBvwHsAYwBvwHs
ATUBaAGbATUBaAGbAYgBuwHuAYgBuwHuAYkBvAHvAZsBvgHfAfUB9wH5CQABsAHUAeYBrAHxAf8BpwHs AYwBvwHsAZYByQHyAZMBtAHUCQABnwHIAd0BlwHeAfYBkAHYAfIBkAHYAfIBkAHYAfIBkAHYAfIBkAHY
Af4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BrAHxAf8BsAHUAeYSAAHG AfIBkAHYAfIBlwHeAfYBeQG9AdwBeAG9AdwC/gH9AZ8ByAHdAwACVQHIAUYBNQHyASABAAHpASABAAHp
AZoBPQHrAbgBQQHdAaoBMwHdAaoBMwHdAaoBMwHrAbgBQQHGAZoBPRIAA9gDggPYJwAD/gHLAdoB6gGp ASABAAHpASABAAHpASABAAHpAVUBiQGoAUQBzAGIAWUB7QGpAWUB7QGpAWUB7QGpAWUB7QGpAVgB1gGW
AcUB4gGpAcUB4gGpAcUB4gFVAX0BpgFVAX0BpgFVAX0BpgFVAX0BpgGpAcUB4gGpAcUB4gGpAcUB4gHL AX8BywGkBgADbAFvAmkDbAYAA3UDdANxA24DbANoA2UDYwNgBgABmAG4AdcBmwHOAfYBkQHEAfABkQHE
AdoB6gP+CQABsgHVAeYBsQH1Af8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHy AfABkQHEAfABVQGIAbsBRAF3AaoBVQGIAbsBQAFzAaYBkQHEAfABkQHEAfABkQHEAfABmwHOAfYBmAG4
Af8BrgHyAf8BsQH1Af8BsgHVAeYSAAHUAbMBbAHnAbgBRgH+AcsBVAH+AcsBVAH+AcsBVAHnAbgBRgHU AdcJAAGiAcoB3gGbAeEB9wGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGUAdsB9AGe
AbMBbHUAAdAB5AHuAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHn AeQB+QF8AcAB3gGiAcoB3gHuAfMB9QMAAn8B1QFiAWEB5wF2AXUB/gF2AXUB/gF5AWIBowF7AVABVQF7
AbMB1gHnAbMB1gHnAdAB5AHuEgAB8AHrAd4BzQGgATkBzQGgATkBzQGgATkBzQGgATkBzQGgATkB8AHr AVABVQFqAVkBPwFqAW4BMgFqAW4BMgFhAYsBUQFVAcEBigFVAcEBigFVAcEBigHiAe8B6AYAA9MDcQPT
Ad4PAAP7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7 JwABmwG6AdkBnwHSAfkBlQHIAfMBlQHIAfMBlQHIAfMBVQGIAbsBVQGIAbsBVQGIAbsBTQGAAbMBlQHI
A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8QP7YAAD/QP6 AfMBlQHIAfMBlQHIAfMBnwHSAfkBmwG6AdkJAAGlAc0B4AGeAeUB+QGYAd8B9gGYAd8B9gGYAd8B9gGY
AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9 Ad8B9gGYAd8B9gGYAd8B9gGYAd8B9gGYAd8B9gGhAegB+gGlAc0B4AYAAuIB8QJVAc4CVQHOAlUBzgFt
AfoC/AH4Av4B+QLAAbgD+gP9ZgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHB AVMBdQHcAakBMgHXAaQBLQHXAaQBLQHXAaQBLQHcAakBMgGwAYYBSEIAAZ8BvQHbAakB2wH+AaoB3QH/
DAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBbAACzwHHA/8D/gL9AfwC/QH7 AaoB3QH/AaoB3QH/AXcBqgHdAXcBqgHdAXcBqgHdAWYBmQHMAaoB3QH/AaoB3QH/AaoB3QH/AakB2wH+
AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4 AZ8BvQHbCQABqAHOAeIBowHoAfsBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHjAfkBnQHj
AfQC9wHyAvsB9QLPAccMAAP+A/wG+QP6BvwD+wb5A/wD/gYAA/0D/AP6HvgD+gP8A/0GAALQAcgC/wH+ AfkBnQHjAfkBowHoAfsBqAHOAeISAAG2AYsBRQHcAakBMgHRAZ4BJwHRAZ4BJwHRAZ4BJwHcAakBMgG2
Av0B/AL9AfsBvwFIAa4B7AHOAeUC+gH2AvgB9AL3AfIC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AHp AYsBRUIAAccB1wHnAYgBtgHiAYABswHmAYABswHmAYABswHmAU4BgQG0AU4BgQG0AU4BgQG0AUgBewGu
Ac8B6wGuAUgBvwGuAUgBvwGuAUgBvwHTAaEB2gL3AfIC9gHwAvoB8wLQAcgMAAP+A/wD+QOzA1wG/ANc AYABswHmAYABswHmAYABswHmAYgBtgHiAccB1wHnCQABqwHQAeMBpgHrAfwBoQHmAfsBoQHmAfsBoQHm
A7QD+QP8A/4GAAP9A4QDNAOEA/gD4gY0A4QD4gN1A6QD+AOEAzQD6QYAAtIBywL+A/0B+wL8AfkBxgFP AfsBoQHmAfsBoQHmAfsBoQHmAfsBoQHmAfsBoQHmAfsBpgHrAfwBqwHQAeMSAAG7AZABQQHhAa4BOAHW
AbUB7AHPAeUC+AH0AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALSAcsC/gP9AfsB6gHRAe0BtQFPAcYC+gH2 AaMBLAHWAaMBLAHWAaMBLAHhAa4BOAG7AZABQRIAA9cDfQPXJwAB4wHqAfEBjgG4AeEBiQG8Ae8BiAG7
AecBzgHoAbUBTwHGAe4B4QHrAvUB7gL6AfIC0gHLEgADywN1A/gGAAP4A3UDyxIAA3kD9QYAA6oDeQYA Ae4BiAG7Ae4BQQF0AacBQQF0AacBQQF0AacBPgFxAaQBiAG7Ae4BiAG7Ae4BiQG8Ae8BjgG4AeEB4wHq
A8sDvgPuA6oDwgkAAtUBzQL+A/wB+QL7AfgBzgFXAb0BzgFXAb0BzgFXAb0B4gGmAdYC9QHuAvQB7AL5 AfEJAAGuAdIB5AGpAe4B/QGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGkAekB/AGk
Ae8C1QHNDAAC1QHNAv4D/AH5AesB0gHtAb0BVwHOAvgB9AL3AfIBvQFXAc4B5wHNAeUC9AHsAvkB7wLV AekB/AGpAe4B/QGuAdIB5BIAAcABlQE/AecBtAE9AdoBpwEwAdoBpwEwAdoBpwEwAecBtAE9AcABlQE/
Ac0PAAPOA38D+QwAA/kDfwPODwADxgxgA8YGAAP1CWAD6QkAAtYBzgL9A/sB+AL6AfYB1gFfAcUB7wHR EgADfwN3A38GAAOCA4EDfwN+A3wDegN5A3YDqwYAAfUB9wH5AZsBvgHfAYkBvAHvAYgBuwHuAYgBuwHu
AeYC9gHwAvUB7gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgB7AHTAe4BxQFfAdYC9wHyAeoB0QHq ATUBaAGbATUBaAGbATUBaAGbATUBaAGbAYgBuwHuAYgBuwHuAYkBvAHvAZsBvgHfAfUB9wH5CQABsAHU
AcUBXwHWAe0B4QHpAvEB5wL3AeoC1gHODAAD0AOGA/kSAAP5A4YD0AwAA/UDlAPvA9EDaAP1CQADkwPv AeYBrAHxAf8BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BpwHsAf4BrAHx
A2gMAALYAdAC/QP6AfYC+AH0AdwBZQHLAdwBZQHLAdwBZQHLAeIBiQHTAvEB5wLsAd8C9AHlAtgB0AwA Af8BsAHUAeYSAAHGAZoBPQHrAbgBQQHdAaoBMwHdAaoBMwHdAaoBMwHrAbgBQQHGAZoBPRIAA9gDggPY
AtgB0AL9A/oB9gHtAdMB7gHLAWUB3AHLAWUB3AHLAWUB3AHfAawB4wLxAecC7AHfAvQB5QLYAdAJAAPv JwAD/gHLAdoB6gGpAcUB4gGpAcUB4gGpAcUB4gFVAX0BpgFVAX0BpgFVAX0BpgFVAX0BpgGpAcUB4gGp
A2wD7xgAA+8DbAPvDAADjwP2A7cDjwwAA8wDfQPMDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALx AcUB4gGpAcUB4gHLAdoB6gP+CQABsgHVAeYBsQH1Af8BrgHyAf8BrgHyAf8BrgHyAf8BrgHyAf8BrgHy
AecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLz Af8BrgHyAf8BrgHyAf8BrgHyAf8BsQH1Af8BsgHVAeYSAAHUAbMBbAHnAbgBRgH+AcsBVAH+AcsBVAH+
AeIC2gHSDAAD1AORA/kSAAP5A5ED1A8AA84D1QN3A84MAAPsA3cD7AwAAtsB0wL8A/cB8gL2AfAC9QHu AcsBVAHnAbgBRgHUAbMBbHUAAdAB5AHuAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHn
AvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHf AbMB1gHnAbMB1gHnAbMB1gHnAbMB1gHnAdAB5AHuEgAB8AHrAd4BzQGgATkBzQGgATkBzQGgATkBzQGg
AugB2QLmAdUC8gHhAtsB0w8AA9UDlgP5DAAD+QOWA9USAAP2A6IDfgP2IQAC3AHVAvsD9gHwAvUB7gL0 ATkBzQGgATkB8AHrAd4PAAP7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGw
AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3AHVAvsD9gHwAvUB7gL0AewC8QHnAuwB3wLo ArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALI
AdkC5gHVAuUB1ALyAeEC3AHVEgAD1wOZA/oGAAP6A5kD1xgABpwkAALdAdYC+gH0AvUB7gL0AewC8QHn AcMD8QP7YAAD/QP6AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+
AuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLm Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gP9ZgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2
AdUCpAGTAqQBkwKkAZMCyQHAFQAD2AOdBgADnQPYRQAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHV AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBbAACzwHH
AuUB1AK2AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLe A/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8Av0B+wL8
AdcC9wH2bAAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8 AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAAP+A/wG+QP6BvwD+wb5A/wD/gYAA/0D/AP6HvgD+gP8
AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfZvAALqAeYC4AHZAuAB2QLgAdkC4AHZ A/0GAALQAcgC/wH+Av0B/AL9AfsBvwFIAa4B7AHOAeUC+gH2AvgB9AL3AfIC9gHwAvoB8wLQAcgMAALQ
AuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3 AcgC/wH+Av0B/AHpAc8B6wGuAUgBvwGuAUgBvwGuAUgBvwHTAaEB2gL3AfIC9gHwAvoB8wLQAcgMAAP+
AfZsAAP7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7 A/wD+QOzA1wG/ANcA7QD+QP8A/4GAAP9A4QDNAOEA/gD4gY0A4QD4gN1A6QD+AOEAzQD6QYAAtIBywL+
A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7A/ECyAHD A/0B+wL8AfkBxgFPAbUB7AHPAeUC+AH0AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALSAcsC/gP9AfsB6gHR
ArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4 Ae0BtQFPAcYC+gH2AecBzgHoAbUBTwHGAe4B4QHrAvUB7gL6AfIC0gHLEgADywN1A/gGAAP4A3UDyxIA
AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8QP7A/0D+gLAAbgL/wP+Af0C/gH8 A3kD9QYAA6oDeQYAA8sDvgPuA6oDwgkAAtUBzQL+A/wB+QL7AfgBzgFXAb0BzgFXAb0BzgFXAb0B4gGm
Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gb9A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4 AdYC9QHuAvQB7AL5Ae8C1QHNDAAC1QHNAv4D/AH5AesB0gHtAb0BVwHOAvgB9AL3AfIBvQFXAc4B5wHN
A/oG/QP6AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8 AeUC9AHsAvkB7wLVAc0PAAPOA38D+QwAA/kDfwPODwADxgxgA8YGAAP1CWAD6QkAAtYBzgL9A/sB+AL6
Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gP9BgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7 AfYB1gFfAcUB7wHRAeYC9gHwAvUB7gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgB7AHTAe4BxQFf
AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9 AdYC9wHyAeoB0QHqAcUBXwHWAe0B4QHpAvEB5wL3AeoC1gHODAAD0AOGA/kSAAP5A4YD0AwAA/UDlAPv
AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2 A9EDaAP1CQADkwPvA2gMAALYAdAC/QP6AfYC+AH0AdwBZQHLAdwBZQHLAdwBZQHLAeIBiQHTAvEB5wLs
AvgB9AL7AfYCyQHBDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwA Ad8C9AHlAtgB0AwAAtgB0AL9A/oB9gHtAdMB7gHLAWUB3AHLAWUB3AHLAWUB3AHfAawB4wLxAecC7AHf
As8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9 AvQB5QLYAdAJAAPvA2wD7xgAA+8DbAPvDAADjwP2A7cDjwwAA8wDfQPMDAAC2gHSAvwD+AH0AvcB8gL2
AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHHDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2 AfAC9QHuAvQB7ALxAecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALx
AvgB9AL3AfIC+wH1As8BxwwAAtAByAL/Af4C/QH8AdwBzwHrAXsBSAG/AXsBSAG/AXsBSAG/AYsBXgHG AecC7AHfAugB2QLzAeIC2gHSDAAD1AORA/kSAAP5A5ED1A8AA84D1QN3A84MAAPsA3cD7AwAAtsB0wL8
AegB4QHrAvYB8AL6AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7AYIBwgG0AVkBrgGdAVkBrgGdAakB0wHI A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHu
AvcB8gL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8Av0B+wHeAaIBqQG/AUgBWQG/AUgBWQHcAaABpgL3 AvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0w8AA9UDlgP5DAAD+QOWA9USAAP2A6IDfgP2IQAC3AHV
AfIC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AL9AfsBvwF7AUgBvwF7AUgBvwF7AUgB3AG6AZ4C9wHy AvsD9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3AHVAvsD9gHwAvUB7gL0
AvYB8AL6AfMC0AHIDAAC0gHLAv4D/QH7Ad0B0QHtAYIBTwHGAvoB9gL4AfQBggFPAcYB2QHMAeUC9QHu AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVEgAD1wOZA/oGAAP6A5kD1xgABpwkAALdAdYC+gH0
AvoB8gLSAcsMAALSAcsC/gP9AfsC/AH5AvsB+AL6AfYB0gHoAeABYAG1AaQC9gHwAvUB7gL6AfIC0gHL AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALx
DAAC0gHLAv4D/QH7AvwB+QL7AfgB4AGlAasB0wF6AYUC9wHyAvYB8AL1Ae4C+gHyAtIBywwAAtIBywL+ AecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHAFQAD2AOdBgADnQPYRQAC3gHXAvoB8wL0AewC8QHn
A/0B+wL8AfkBxgGCAU8B7AHbAcwC+AH0AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALVAc0C/gP8AfkB3wHS AuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHV
Ae0BigFXAc4BmAFsAdMBigFXAc4BpQF/AdcB5wHhAekC9AHsAvkB7wLVAc0MAALVAc0C/gP8AfkC+wH4 AuUB1AK2AaUD/wLeAdcC9wH2bAAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZ
AbIB3AHSAWgBvQGsAWgBvQGsAa4B2QHNAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QL7AfgC+gH2 AvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfZvAALqAeYC4AHZ
AeMBqAGuAdkBfwGLAvYB8AL1Ae4C9AHsAvkB7wLVAc0MAALVAc0C/gP8AfkC+wH4Ac4BigFXAe4B3QHM AuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLg
AvcB8gL2AfAC9QHuAvQB7AL5Ae8C1QHNDAAC1gHOAv0D+wH4AeAB0wHuAZIBXwHWAvcB8gHdAdAB6QGS AdkC4AHZAuAB2QL3AfZsAAP7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGw
AV8B1gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgC+gH2AXABxQG0AdUB6wHiAvYB8AL1Ae4C9AHs ArgBsALIAcMD8Qb7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALI
AvEB5wL3AeoC1gHODAAC1gHOAv0D+wH4AvoB9gL4AfQB5wGrAbEB3gGFAZAC9QHuAvQB7ALxAecC9wHq AcMD8Qb7A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8Qb7
AtYBzgwAAtYBzgL9A/sB+AL6AfYB1gGSAV8B7wHeAc0C9gHwAvUB7gL0AewC8QHnAvcB6gLWAc4MAALY A/ECyAHDArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsALIAcMD8QP7A/0D+gLA
AdAC/QP6AfYB4AHTAe4BmAFlAdwBmAFlAdwBmAFlAdwBxQGsAeMC8QHnAuwB3wL0AeUC2AHQDAAC2AHQ AbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gb9A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6
Av0D+gH2AvgB9AG3AeEB1QF2AcsBugF2AcsBugGVAdUBxgLxAecC7AHfAvQB5QLYAdAMAALYAdAC/QP6 AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/A/4B/QL+AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLA
AfYC+AH0AeoBrwG0AdwBZQF2AdwBZQF2AegBrAGxAvEB5wLsAd8C9AHlAtgB0AwAAtgB0AL9A/oB9gL4 AbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gP9BgACyQHBBv8D/gL9AfwC/QH7AvwB+QL7
AfQB3AGYAWUB7wHeAc0C9QHuAvQB7ALxAecC7AHfAvQB5QLYAdAMAALaAdIC/AP4AfQC9wHyAvYB8AL1 AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHB
DAACyQHBBv8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACyQHBBv8D/gL9AfwC/QH7
AvwB+QL7AfgC+gH2AvgB9AL7AfYCyQHBDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3
AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALP
AccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHHDAACzwHHA/8D/gL9AfwC/QH7
AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAtAByAL/Af4C/QH8AdwBzwHrAXsBSAG/AXsBSAG/
AXsBSAG/AYsBXgHGAegB4QHrAvYB8AL6AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7AYIBwgG0AVkBrgGd
AVkBrgGdAakB0wHIAvcB8gL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8Av0B+wHeAaIBqQG/AUgBWQG/
AUgBWQHcAaABpgL3AfIC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AL9AfsBvwF7AUgBvwF7AUgBvwF7
AUgB3AG6AZ4C9wHyAvYB8AL6AfMC0AHIDAAC0gHLAv4D/QH7Ad0B0QHtAYIBTwHGAvoB9gL4AfQBggFP
AcYB2QHMAeUC9QHuAvoB8gLSAcsMAALSAcsC/gP9AfsC/AH5AvsB+AL6AfYB0gHoAeABYAG1AaQC9gHw
AvUB7gL6AfIC0gHLDAAC0gHLAv4D/QH7AvwB+QL7AfgB4AGlAasB0wF6AYUC9wHyAvYB8AL1Ae4C+gHy
AtIBywwAAtIBywL+A/0B+wL8AfkBxgGCAU8B7AHbAcwC+AH0AvcB8gL2AfAC9QHuAvoB8gLSAcsMAALV
Ac0C/gP8AfkB3wHSAe0BigFXAc4BmAFsAdMBigFXAc4BpQF/AdcB5wHhAekC9AHsAvkB7wLVAc0MAALV
Ac0C/gP8AfkC+wH4AbIB3AHSAWgBvQGsAWgBvQGsAa4B2QHNAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+
A/wB+QL7AfgC+gH2AeMBqAGuAdkBfwGLAvYB8AL1Ae4C9AHsAvkB7wLVAc0MAALVAc0C/gP8AfkC+wH4
Ac4BigFXAe4B3QHMAvcB8gL2AfAC9QHuAvQB7AL5Ae8C1QHNDAAC1gHOAv0D+wH4AeAB0wHuAZIBXwHW
AvcB8gHdAdAB6QGSAV8B1gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgC+gH2AXABxQG0AdUB6wHi
AvYB8AL1Ae4C9AHsAvEB5wL3AeoC1gHODAAC1gHOAv0D+wH4AvoB9gL4AfQB5wGrAbEB3gGFAZAC9QHu
AvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9A/sB+AL6AfYB1gGSAV8B7wHeAc0C9gHwAvUB7gL0AewC8QHn
AvcB6gLWAc4MAALYAdAC/QP6AfYB4AHTAe4BmAFlAdwBmAFlAdwBmAFlAdwBxQGsAeMC8QHnAuwB3wL0
AeUC2AHQDAAC2AHQAv0D+gH2AvgB9AG3AeEB1QF2AcsBugF2AcsBugGVAdUBxgLxAecC7AHfAvQB5QLY
AdAMAALYAdAC/QP6AfYC+AH0AeoBrwG0AdwBZQF2AdwBZQF2AegBrAGxAvEB5wLsAd8C9AHlAtgB0AwA
AtgB0AL9A/oB9gL4AfQB3AGYAWUB7wHeAc0C9QHuAvQB7ALxAecC7AHfAvQB5QLYAdAMAALaAdIC/AP4
AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1
Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLs Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLs
Ad8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLa Ad8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLa
AdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAvMB4gLaAdIMAALbAdMC/AP3 AdIMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3
AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0 AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0
AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLo AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLo
AdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLb AdkC5gHVAvIB4QLbAdMMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLc
AdMMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2 AdUMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2
AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALx AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALx
AecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLm AecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALdAdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHV
AdUC5QHUAvIB4QLcAdUMAALdAdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGT AqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKk
AskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHADAAC3QHW AZMCyQHADAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALd
AvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALdAdYC+gH0AvUB7gL0 AdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt4B1wL6AfMC9AHs
AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZ AvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZ
AuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGl AuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGl
A/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwA A/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwA
At4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt8B2QL8AfUC+QHv At8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfYPAALfAdkC/AH1AvkB7wL2
AvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfYPAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLy AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHh
AeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZ AvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3
AvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGxAt8B2QL3AfYPAALqAeYC4AHZ AfYPAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLg
AuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLg AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
AdkC4AHZAuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYSAALq AuAB2QL3AfYSAALqAeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYMAAFCAU0BPgcA
AeYC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QL3AfYMAAFCAU0BPgcAAT4DAAEoAwABQAMA AT4DAAEoAwABQAMAAWADAAEBAQABAQYAAQMWAAP/AQAE/wQABP8UAAGAAQEBgAEBPAABgAEBAYABAQQA
AWADAAEBAQABAQYAAQMWAAP/gQAI/wGAAQEB4AEDBP8BgAEBAeABAwQAAfABAwHsATcEAAH4AQMBwAED AcABAwHAAQMEAAT/BAAE/wQADP8BgAEBAeABAwT/AYABAQHgAQMBwAEDAcABAwHwAQMB7AE3AcABAwHA
AYABAQGAAQEB/AEDAcABAwQAAfgBAwHAAQMEAAHwAQMBwAEDBAAB4AEDAfABDwQAAcABAwHAAQMEAAHA AQMB+AEDAcABAwHxAY8B8QGPAfwBAwHAAQMB4AEHAeABBwH4AQMBwAEDAccBIwHEAeMB8AEDAcABAwGM
ASMBwAEDBAABwAFzAcABAwQAAeAB/wHAAQMBgAEBAYABAQHxAf8B7AE3AcABAwHAAQMC/wH8AT8M/wEA ATEBjAHxAeABAwHwAQ8BxAHjAcQB4wHAAQMBwAEDAeABBwHgAccBwAEjAcABAwHxAY8B8QGPAcABcwHA
AQEBAAEBAv8BwAEDAQABAQEAAQEC/wHAAQMBAAEBAQABAQL/AeABBwEAAQEBAAEBAcABAwHAAQMBAAEB AQMB+QGfAfkBnwHgAf8BwAEDBP8B8QH/AewBNwb/AfwBPwj/AQABAQEAAQEC/wHAAQMBAAEBAQABAQL/
AQABAQHAAQMBgAEBAQABAQEAAQEB8QGPAYABAQEAAQEBAAEBAeABBwGAAQEBAAEBAQABAQHGAWMBgAEB AcABAwEAAQEBAAEBAv8B4AEHAQABAQEAAQEBwAEDAcABAwEAAQEBAAEBAcABAwGAAQEBAAEBAQABAQHx
AQABAQEAAQEBjgFxAYABAQEAAQEBAAEBAcYBYwGAAQEBAAEBAQABAQHgAQcBgAEBAQABAQEAAQEB8QGP AY8BgAEBAQABAQEAAQEB4AEHAYABAQEAAQEBAAEBAcYBYwGAAQEBAAEBAQABAQGOAXEBgAEBAQABAQEA
AYABAQEAAQEBAAEBAfkBnwHAAQMBAAEBAQABAQL/AeABBwEAAQEBAAEBAv8B8AEPAYABAwEAAQEI/wIA AQEBxgFjAYABAQEAAQEBAAEBAeABBwGAAQEBAAEBAQABAQHxAY8BgAEBAQABAQEAAQEB+QGfAcABAwEA
Af4BAQL/BQABAQGIAwABwAEBAQABAQGIAQABgAEBAcABAQEAAQEBjwH/AYABAQHAAQEBAAEBAv8BgAEB AQEBAAEBAv8B4AEHAQABAQEAAQEC/wHwAQ8BgAEDAQABAQj/AgAB/gEBAv8FAAEBAYgDAAHAAQEBAAEB
AcABAQEAAQEC/wGAAQEBwAEBAQABAQGPAf8BgAEBAcABAQEAAQEBjAEBAYABAQHAAQEBAAEBAY8B/wGA AYgBAAGAAQEBwAEBAQABAQGPAf8BgAEBAcABAQEAAQEC/wGAAQEBwAEBAQABAQL/AYABAQHAAQEBAAEB
AQEBwAEDAQABHwL/AYABAQHAAQMB8AEfAv8BgAEBAcABAwHwAR8BjwH/AYABAQHAAQMB8AEfAYwBAQGA AY8B/wGAAQEBwAEBAQABAQGMAQEBgAEBAcABAQEAAQEBjwH/AYABAQHAAQMBAAEfAv8BgAEBAcABAwHw
AQEBwAEDAfABHwGPAf8BgAEBAcABAwHwAR8E/wHAAQMB8AEfBAAE/wQABP8BwAEDAcABAwT/AcABAwHA AR8C/wGAAQEBwAEDAfABHwGPAf8BgAEBAcABAwHwAR8BjAEBAYABAQHAAQMB8AEfAY8B/wGAAQEBwAED
AQMBwAEDAgABwAEDAcABAwHAAQMCAAHAAQMBwAEDAfEBjwHMAcEBwAEDAcABAwHjAccBwAHBAcABAwHA AfABHwT/AcABAwHwAR8EAAT/BAAE/wHAAQMBwAEDBP8BwAEDAcABAwHAAQMCAAHAAQMBwAEDAcABAwIA
AQMBxwHjAcAB4wHAAQMBwAEDAY8B8QHhAeMBwAEDAcABAwHHAeMB4QHjAcABAwHAAQMB4wHHAeEB/wHA AcABAwHAAQMB8QGPAcwBwQHAAQMBwAEDAeMBxwHAAcEBwAEDAcABAwHHAeMBwAHjAcABAwHAAQMBjwHx
AQMBwAEDAfEBjwHzAf8BwAEDAcABAwH5AZ8C/wHAAQMBwAEDBP8BwAEHAcABBwT/AcABDwHAAQ8E/xAA AeEB4wHAAQMBwAEDAccB4wHhAeMBwAEDAcABAwHjAccB4QH/AcABAwHAAQMB8QGPAfMB/wHAAQMBwAED
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED AfkBnwL/AcABAwHAAQME/wHAAQcBwAEHBP8BwAEPAcABDwT/EAABwAEDAcABAwHAAQMBwAEDAcABAwHA
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
AcABAwHAAQMBwAEDAcABBwHAAQcBwAEHAcABBwHAAQ8BwAEPAcABDwHAAQ8L AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEHAcABBwHA
AQcBwAEHAcABDwHAAQ8BwAEPAcABDws=
</value> </value>
</data> </data>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -446,48 +453,48 @@
<data name="_tbFindGroupAnd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="_tbFindGroupAnd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJOSURBVDhPzZHdT1JxHMbPqqsuwpdq5kVrqzbW9CZl66ab YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJPSURBVDhPzZHdT1JxHMbPqqsuwpdq5kVrqzbW9KKMrZtu
WnrRlmu9jLbUrTVrsVW4wF4ssOYs0F6Ul8awqWkJwiCgcAfDWGhIRlmRogcBDyCCmmDUTRedh05b/0H9 aulFW671MtpSt9asxVbpAnuxwJqzQHtBXhrDpqYlCIOAwh0MY6EhGWVFih4EPIAIaoJRN110Hjpt/Qf1
ts/Od8/zfDY2iP/nlTU4OLvF5B7mW1V2mTyBb6Vk4hD4O2M3HFb7/Zhga+Wt4er+EVoVTn0fTKV/+PqG 2z473z3P89nYIP6fV9bg4OwSkXuYb2XZZfIEvhXi8UPg74zdcFjt92OCzRW3hqr6hmlVOPV9IJX+4esd
lt2nW+g0wI0MHTbYwvkjcw5InbX+SNoQWcw6Q8ksOfJx2cNvpDIK40IE4EaGDhts4eR+SelF697HrlkV XHKfbqHTADcydNhgC+ePzDkgcdb4I2lDZCHrDCWz5PDHJQ+/kcoojPMRgBsZOmywhZP7JaUXrXsfu2ZU
Uzqo+Yx9NpkdEsg/hS7IphK9jq9fAG5k6LDBFg5cgnvezJ+MZmyfWYIL2eHSw/b0nZ745H1jyt38JOm4 TOmg5jL2mWR2UCD7FLognUz0OL5+AbiRocMGWzhwCe55M38imrF9ZgnOZ4dKD9vTd7rjE/eNKXfzk6Tj
rgm95fEtKzZfvKP3dbjZ6KFbRwOLPXAJrsBURyW+uT6EV0xgis6QO8oHfrbpU65rnXELkOtTr5BZx2MP uib0lse3LNt88fae1+Fmo4duHQksdMMluAJTLZX45voQXjaBSTpDbtvZ/7NNn3Jd64hbgEyfeoXMOhZ7
lSR1QzVISV68m9fAJbaf0deMB5fMYzNLBvv7hNbkjam5B41pUXvI26CNWQFuZPpRWnHveUAKDB5aCZfY qCSpG6oBSvzi3ZwGLrH1jL56LLhoHp1eNNjfJ7Qmb0zNPWhMC+Uhb4M2ZgW4kelHaMW95wEJMHhoJVxi
duppxQObX2P20lq5JXBTTQZlVUL39BGxb+5qZ9QOcCNDJ3sWaFLYZ25L+n134RLF1d2FJQJdfbeT6miz y6mn5Q9sfo3ZS2tllsBNNRmUVta5p46IfLNXO6J2gBsZOumzQJPCPn1b3Oe7C5coruoqLBHo6rucVHub
BlqaBvzSVgOl450cWxW1RycAbmTosMF21zmdEG7uryysuMLdWdcnEnd52h85g2rDm7kukWL6Ja82tApw NdDS1O+XtBooHe/k6IpQHh0HuJGhwwbbHed0dXBzf2Vh+RXu9tpeoajTI3/kDKoNb2Y7hYqpl7ya0ArA
I0OHDbZwcjLz1jJsXFdUUp63/1JN/lFlfcFxTWPBMbWwaJ/kLMCNDB022MJhXWINw3o2KGbYwrCJIY9h jQwdNtjCycnMW82wfk1Rye68/Zeq848q6wuOaxoLjqnrivaJzwLcyNBhgy0c1iVWMaxlg2KGTQwbGPIY
A0s+w2YGdNhgCwfuP30E8QtHOZOg6MLdcgAAAABJRU5ErkJggg== 1rHkM2xkQIcNtnDg/tNHEL8AOkOTmpr+SJIAAAAASUVORK5CYII=
</value> </value>
</data> </data>
<data name="_tbFindGroupOr.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="_tbFindGroupOr.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI+SURBVDhPzZHvaxJxHMePetaDKGjBehgRwoLoUbCI6AcS YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI9SURBVDhPzZHda1JxHMYPdddFFLRgXUaEsCC6ChYRvSDR
jVhp0Vq/GO1B4CBi6UgZK6dWzo0e1BimzsxdqISkbtecbXNpsViclnO2svPEu3OeQ9tDH3VvM6K/oL7w WAMtWuuN0S4CBxFLR8qonFo5N7qoMUydmTuhEpK62Zxtc2mxWBxdztnK9IjnZR7HsV161XnMiP6C+sGH
4t68P+/XoyP+n3fNKMq6DaLj+qDInB3gavh2G8ou8HcnOrBtaL/ehTuMolPLClprSXgaKH/zvfmRv+8S 8/B8n8/VIf6fd80oyHoMguP6oJA/e5ep4dtjqLjA353gwLah/XoX7uQVXVqa01rL3LNA5Zvv7Y/iA5dA
6Uv6XBIgo8MNG2zh1GV5z5Ls9E1aMJOlLBneyLgjlbRzurLcZc767aFqCiCjww0bbOHAJVo75x0qQ0Zw XdIXUgAZHW7YYAunLst7l2TtNynOTJZzZGQz646KGee0uNJtzvntoWoaIKPDDRts4cAlWrvmHSpDlnPP
z1TSz8PVFBmprPRZ2VmDm4+jA8jocMMGHRy4REtbgBkm+VXn6+on4I5sfOkwrARtr8r0o5dizEiWZiye iJkXkWqajIqr/VZ61uBmE+gAMjrcsEEHBy7R0hbID5PsmvNNdRm4o5tfOg2rQdvrCvX4lRA3kuUZi4df
4sI5/XJgyLM2q3cVp0zuUnhwnE3AJZrlvtp4aP2rbbJMAxdVSZ/SJvzDXjGqs/MBMOQV59FZPH+6B6QQ OKdfCQx51mf1Ln7K5C5HBsfpJFyiWe6rjYc2vtomKxRwhcXMGW3SP+wVYjo7GwBDXmEencXzp3tIcnG4
g0vsPu5jTE42M+pf/2jxirGHpBhV3v08aSSL0T4bFwTI9W5ibe531/uYWYRL7D055bisS/LmF6W3aisX xN6TvrzJSWdH/RufLF4h/ogUYsp7nyeNJB/rtzFBgFzvJtbnfnd9T/KLcIn9p6ccl3Up1vyy/E5tZUID
6ncI0zdGViO3nmTntPYCBZDR4aYZ44LozqsTObjEPkVcdkC5WOyxsLTGWqB6x/JBvZNfaO9PUvecfBwg Dm76xsha9NbT3JzWXgoDZHS4acaYILrz6mQBLnFAkZAdUi7yvRaa0lhL4b6xYlDvZBc6BlLh+042AZDR
o8NNYytQ2O5vjwlw67+y5cQzxaErmeJFHcveHi18ME1w71Uj35eOqVIZgIxOLd2wwRZOXZbeZokdTXuU 4aaxlcLYHuyIc3Drv7Ll1HPFkStZ/qKOpm+Plj6aJpgPqpHvSydU6SxARqeWbthgC6cuS2+rxK6mfUr5
8oPKd74jXSx79AxXO3w1n2vtoL0AGR1u2GALp+ESmyS2NIpdEs0STRLbJLY22C6xUwI3bLCFA/efPoL4 YeV737Fumj7eztSOXi0WWjspL0BGhxs22MJpuMQWiW2NYo9Es0STxA6J7Q12SuyWwA0bbOHA/aePIH4C
CcCwqZ4FAx1nAAAAAElFTkSuQmCC pr6pkmHLOpUAAAAASUVORK5CYII=
</value> </value>
</data> </data>
<data name="_tbFindAny.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="_tbFindAny.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIGSURBVDhPY6AZ2LWY2XnXYsa9ILxzMVM8VBg/2DKfQQLK YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIFSURBVDhPY6AZ2LWY2XnXYsa9ILxzMVM8VBg/2DKfQQLK
ZNg2j3Hf+9f931/ebv2zbQHjLqgwihoUsHEOU8KmuYz7Ns1lXr5xNrMHiP373cz/jy6m/UWIMS8HiYPU ZNg2j3Hf+9f935/daPqzbQHjLqgwihoUsHEOU8KmuYz7Ns1lXr5xNrMHiP373cz/988l/0WIMS8HiYPU
QrUhwIaZjPu/v5r8//3D9u8HN+ieB/G/vej///JE9I91MxlXH1yjc/7t+YbvX551/QfJQbUhwOrJTAfu QrUhwIaZjPu/v5r8//3D9u8HN+ieB/G/vej///JE9I91MxlXH1yjc/7t+YbvX551/QfJQbUhwOrJTAfu
nwj/8fRK4v9Xt4r/71+lceH9w+b/t08GftoHZL+8WfAfJAdSA1IL1YYAyycyWC3vZ1y5Z4XyzZPbLF48 nwj/8fRK4v9Xt4r/71+lceH9w+b/t08GftoHZL+8WfAfJAdSA1IL1YYAyycyWC3vZ1y5Z4XyzZPbLF48
upT6H4TvnA7+//Bi8n+QGEgOpAakFqoNEyzsYnZZ0M106PAmqw/Xjnr8B2EQGyQGkoMqwwSzWxms57Qx upT6H4TvnA7+//Bi8n+QGEgOpAakFqoNEyzsYnZZ0M106PAmqw/Xjnr8B2EQGyQGkoMqwwSzWxms57Qx
rt6x0ujmyc32L68cdvkPwjdO+IPpY5utX+5YonUTpAakFqoNAabWMx25CwywWye9/18/5vJ/6SThyye3 rt6x0ujmyc32L68cdvkPwjdO+IPpY5utX+5YonUTpAakFqoNAabWMx25CwywWye9/18/5vJ/6SThyye3
mH6+dy4MzAaJ3Tjh8f/EUZ8fILVQbQjQV8F09M5pl/8nDpn9WNQtdKW/knHDicNmP+6fD/wPkgOJgeRA mH6+dy4MzAaJ3Tjh8f/EUZ8fILVQbQjQV8F09M5pl/8nDpn9WNQtdKW/knHDicNmP+6fD/wPkgOJgeRA
akB8qDYEaC9gSGnJYTzRksu4Hsj2BtFn99v/fXrF5z9IHCYGZadAtaECK0MGKSiToTKZ8dilg/Z/7+63 akB8qDYEaC9gSGnJYTzRksu4Hsj2BtGn9tv/fXrF5z9IHCYGZadAtaECK0MGKSiToTKZ8dh5oAF399v/
/1mZxHgKKoyiBhvgBWJFIFb3s2eoqMvkuADC9iYMiSAxIFYGYgEgZgRirIADiMWAGGQLNiwOxFxAjNMA rExiPAUVRlGDDfACsSIQq/vZM1TUZXJcAGF7E4ZEkBgQKwOxABAzAjFWwAHEYkAMsgUbFgdiLiDGaQCJ
EgEDAwA7NBxCd851BwAAAABJRU5ErkJggg== gIEBAPfdHChaYCrPAAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<data name="_tbFindByte.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="_tbFindByte.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -716,6 +723,16 @@
1OygebHD1uVKsedMdz6DUVQRmKFmxRrTr51sLzid1RIeYaYq9kkBixWrWKHrHW2ncggfIJFZEmAxR3XF 1OygebHD1uVKsedMdz6DUVQRmKFmxRrTr51sLzid1RIeYaYq9kkBixWrWKHrHW2ncggfIJFZEmAxR3XF
GlMv7WxQ2oYPuJoJxL7SQGCB6nrFtfWLmyvFnjPdNRj8RBvBJWpe7J28ztpio4lBcYifOIb2UAJKaj+C GlMv7WxQ2oYPuJoJxL7SQGCB6nrFtfWLmyvFnjPdNRj8RBvBJWpe7J28ztpio4lBcYifOIb2UAJKaj+C
cuqZfSF8gP+Qhh4HUjr7eOAnMeYGV3014C2A0QAAAAAASUVORK5CYII= cuqZfSF8gP+Qhh4HUjr7eOAnMeYGV3014C2A0QAAAAAASUVORK5CYII=
</value>
</data>
<data name="_tbReplaceLongArray.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADxSURBVDhPYxi+IIyRkXEalM0AZYdBeIRBBFDDTCAtBuGC
gRhULALCxQ2igArnAGnx1Om33s/c+XQ/RBgMxKFyURAuJogBKlgApMVBnPgJV/5N3fEQ2QAQABkCUhMD
4SKAAVBiD4iGcBkYwjvO/Ju06e4+KBcZYKiFgUSgxEogLQni+Dcc+de7/uZeEBsJSELVJEK4mCAZqGAd
kJb0qN77D4wr9/4umnluHkgMKpcMUogPpAMVbgPS0hAuGEhDxdIhXOyABYh5gRgUiI1AfByI+YCYH8pu
AGIJKB+kFgMgGwAKBxEghhkgDBXDa8CQBAwMAFHnNaGM/318AAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<data name="_tbReplaceString.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="_tbReplaceString.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -739,13 +756,13 @@
<data name="_tbReplaceCompound.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="_tbReplaceCompound.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFzSURBVDhPrdE/SAJhHMbx33FCY2PQ0NLUHK1SIFRE0VAR YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFySURBVDhPrdE/SAJhHMbx33FCY2PQ0NLUHK1SIFRE0VAR
Ev2DQoiGKBCSUBvKKIhAoxByyE5QEkEF0cIIAwtpaGsQDSroDxYFQUO8+ch7L3fbSR18OXjf53PL0b88 Ev2DQoiGKBCSUBvKKIhAoxByyE5QEkEF0cIIhQppaGsQDSoqwqIgaIg3H3nv5W47qYMvB+/7fG45+pcn
WSeZstMm29mUvKnmNFNBm/YOWxjOiU7HG1qvHG1HbycbrJLx1PLbOnSp59hgC8M5UXpS7r719uW0Hwgt 6yRTdtpkO5uSN9WcZipo095hC8M50el4Q+uVo+3o7WSDVTKeWn5bhy71HBtsYTgnSk/K3bfevpz2A6Gl
dYmCC2bdB7CF4ZwoNWGaLylz5ce4i6kl3AOiqKNHnCNsYTgnSo7Jvpd86IcVw0ytGLaLCvuz4hxhC8M5 LlFwwaz7ALYwnBOlJkzzJWWu/Bh3MbWEe0AUdfSIc4QtDOdEyTHZ95QP/bBimKkVw3ZRYX9WnCNsYTgn
Udwq733fBNhn3ifKeIZFcVe/7g5bGM6JYlbZ/3XtZ++5HRFg2G6pvZXFTt0dtjCcE0VG5cDH5S57zW6J ilvlve+bAPu88IkynmFR3NWvu8MWhnOimFX2f1372XtuRwQYtltqb2WxU3eHLQznRJFROfBxuctes1si
gLVvbdjCcE4UGpEPK+fb7Cm9bihsYTgnCg5JynP1Fz0kVw2FLQznRIFBKXKfcLO72IqhsIXhnMjbK6XK YO1bG7YwnBOFRuTDyvk2e06vGwpbGM6JgkOS8lL9RQ/JVUNhC8M5UWBQitwn3OwutmIobGE4J/L2Sqly
UQcrHS8bClsYzqllpl06WLNIF/UEA4sPNFZrqtZcZzCwf3mIfgHu4t1w+i+rTAAAAABJRU5ErkJggg== 1MFKx8uGwhaGc2qZaZcO1ixSvp5gYPGBxmpN1ZrrDAb2Lw/RL87Y3WT+gOBKAAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<metadata name="_explorerStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="_explorerStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Windows.Forms; using System.Windows.Forms;
using NBTModel.Interop;
namespace NBTExplorer.Windows namespace NBTExplorer.Windows
{ {

View file

@ -31,42 +31,54 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemOpen = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemOpenFolder = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemOpenMinecraftSaveFolder = new System.Windows.Forms.ToolStripMenuItem(); this._menuItemOpenMinecraftSaveFolder = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemOpenInExplorer = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemSave = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemRefresh = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemRecentFiles = new System.Windows.Forms.ToolStripMenuItem(); this._menuItemRecentFiles = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemRecentFolders = new System.Windows.Forms.ToolStripMenuItem(); this._menuItemRecentFolders = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemExit = new System.Windows.Forms.ToolStripMenuItem();
this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemCut = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemCopy = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemPaste = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemRename = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemEditValue = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemDelete = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
this._menuItemMoveUp = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemMoveDown = new System.Windows.Forms.ToolStripMenuItem();
this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemFind = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemFindNext = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
this.replaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.replaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
this.findBlockToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemAbout = new System.Windows.Forms.ToolStripMenuItem();
this.imageList1 = new System.Windows.Forms.ImageList(this.components); this.imageList1 = new System.Windows.Forms.ImageList(this.components);
this.toolStrip1 = new System.Windows.Forms.ToolStrip(); this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
this.BottomToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.TopToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.RightToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.LeftToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this.ContentPanel = new System.Windows.Forms.ToolStripContentPanel();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._buttonOpen = new System.Windows.Forms.ToolStripButton(); this._buttonOpen = new System.Windows.Forms.ToolStripButton();
this._buttonOpenFolder = new System.Windows.Forms.ToolStripButton(); this._buttonOpenFolder = new System.Windows.Forms.ToolStripButton();
this._buttonSave = new System.Windows.Forms.ToolStripButton(); this._buttonSave = new System.Windows.Forms.ToolStripButton();
this._buttonRefresh = new System.Windows.Forms.ToolStripButton(); this._buttonRefresh = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this._buttonCut = new System.Windows.Forms.ToolStripButton(); this._buttonCut = new System.Windows.Forms.ToolStripButton();
this._buttonCopy = new System.Windows.Forms.ToolStripButton(); this._buttonCopy = new System.Windows.Forms.ToolStripButton();
this._buttonPaste = new System.Windows.Forms.ToolStripButton(); this._buttonPaste = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this._buttonRename = new System.Windows.Forms.ToolStripButton(); this._buttonRename = new System.Windows.Forms.ToolStripButton();
this._buttonEdit = new System.Windows.Forms.ToolStripButton(); this._buttonEdit = new System.Windows.Forms.ToolStripButton();
this._buttonDelete = new System.Windows.Forms.ToolStripButton(); this._buttonDelete = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this._buttonAddTagByte = new System.Windows.Forms.ToolStripButton(); this._buttonAddTagByte = new System.Windows.Forms.ToolStripButton();
this._buttonAddTagShort = new System.Windows.Forms.ToolStripButton(); this._buttonAddTagShort = new System.Windows.Forms.ToolStripButton();
this._buttonAddTagInt = new System.Windows.Forms.ToolStripButton(); this._buttonAddTagInt = new System.Windows.Forms.ToolStripButton();
@ -78,26 +90,17 @@
this._buttonAddTagString = new System.Windows.Forms.ToolStripButton(); this._buttonAddTagString = new System.Windows.Forms.ToolStripButton();
this._buttonAddTagList = new System.Windows.Forms.ToolStripButton(); this._buttonAddTagList = new System.Windows.Forms.ToolStripButton();
this._buttonAddTagCompound = new System.Windows.Forms.ToolStripButton(); this._buttonAddTagCompound = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
this._buttonFindNext = new System.Windows.Forms.ToolStripButton(); this._buttonFindNext = new System.Windows.Forms.ToolStripButton();
this._menuItemOpen = new System.Windows.Forms.ToolStripMenuItem(); this.BottomToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this._menuItemOpenFolder = new System.Windows.Forms.ToolStripMenuItem(); this.TopToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this._menuItemSave = new System.Windows.Forms.ToolStripMenuItem(); this.RightToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this._menuItemRefresh = new System.Windows.Forms.ToolStripMenuItem(); this.LeftToolStripPanel = new System.Windows.Forms.ToolStripPanel();
this._menuItemExit = new System.Windows.Forms.ToolStripMenuItem(); this.ContentPanel = new System.Windows.Forms.ToolStripContentPanel();
this._menuItemCut = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this._menuItemCopy = new System.Windows.Forms.ToolStripMenuItem(); this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemPaste = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemRename = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemEditValue = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemDelete = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemMoveUp = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemMoveDown = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemFind = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemFindNext = new System.Windows.Forms.ToolStripMenuItem();
this._menuItemAbout = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
this.findBlockToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this._nodeTree = new NBTExplorer.Vendor.MultiSelectTreeView.MultiSelectTreeView(); this._nodeTree = new NBTExplorer.Vendor.MultiSelectTreeView.MultiSelectTreeView();
this._buttonAddTagLongArray = new System.Windows.Forms.ToolStripButton();
this.menuStrip1.SuspendLayout(); this.menuStrip1.SuspendLayout();
this.toolStrip1.SuspendLayout(); this.toolStrip1.SuspendLayout();
this.contextMenuStrip1.SuspendLayout(); this.contextMenuStrip1.SuspendLayout();
@ -122,6 +125,8 @@
this._menuItemOpen, this._menuItemOpen,
this._menuItemOpenFolder, this._menuItemOpenFolder,
this._menuItemOpenMinecraftSaveFolder, this._menuItemOpenMinecraftSaveFolder,
this.toolStripSeparator12,
this._menuItemOpenInExplorer,
this.toolStripSeparator3, this.toolStripSeparator3,
this._menuItemSave, this._menuItemSave,
this._menuItemRefresh, this._menuItemRefresh,
@ -134,38 +139,94 @@
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "&File"; this.fileToolStripMenuItem.Text = "&File";
// //
// _menuItemOpen
//
this._menuItemOpen.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemOpen.Image")));
this._menuItemOpen.Name = "_menuItemOpen";
this._menuItemOpen.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
this._menuItemOpen.Size = new System.Drawing.Size(233, 22);
this._menuItemOpen.Text = "&Open...";
//
// _menuItemOpenFolder
//
this._menuItemOpenFolder.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemOpenFolder.Image")));
this._menuItemOpenFolder.Name = "_menuItemOpenFolder";
this._menuItemOpenFolder.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.O)));
this._menuItemOpenFolder.Size = new System.Drawing.Size(233, 22);
this._menuItemOpenFolder.Text = "Open &Folder...";
//
// _menuItemOpenMinecraftSaveFolder // _menuItemOpenMinecraftSaveFolder
// //
this._menuItemOpenMinecraftSaveFolder.Name = "_menuItemOpenMinecraftSaveFolder"; this._menuItemOpenMinecraftSaveFolder.Name = "_menuItemOpenMinecraftSaveFolder";
this._menuItemOpenMinecraftSaveFolder.Size = new System.Drawing.Size(223, 22); this._menuItemOpenMinecraftSaveFolder.Size = new System.Drawing.Size(233, 22);
this._menuItemOpenMinecraftSaveFolder.Text = "Open &Minecraft Save Folder"; this._menuItemOpenMinecraftSaveFolder.Text = "Open &Minecraft Save Folder";
// //
// toolStripSeparator12
//
this.toolStripSeparator12.Name = "toolStripSeparator12";
this.toolStripSeparator12.Size = new System.Drawing.Size(230, 6);
//
// _menuItemOpenInExplorer
//
this._menuItemOpenInExplorer.Enabled = false;
this._menuItemOpenInExplorer.Name = "_menuItemOpenInExplorer";
this._menuItemOpenInExplorer.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.E)));
this._menuItemOpenInExplorer.Size = new System.Drawing.Size(233, 22);
this._menuItemOpenInExplorer.Text = "Open in &Explorer";
//
// toolStripSeparator3 // toolStripSeparator3
// //
this.toolStripSeparator3.Name = "toolStripSeparator3"; this.toolStripSeparator3.Name = "toolStripSeparator3";
this.toolStripSeparator3.Size = new System.Drawing.Size(220, 6); this.toolStripSeparator3.Size = new System.Drawing.Size(230, 6);
//
// _menuItemSave
//
this._menuItemSave.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemSave.Image")));
this._menuItemSave.Name = "_menuItemSave";
this._menuItemSave.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
this._menuItemSave.Size = new System.Drawing.Size(233, 22);
this._menuItemSave.Text = "&Save";
//
// _menuItemRefresh
//
this._menuItemRefresh.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemRefresh.Image")));
this._menuItemRefresh.Name = "_menuItemRefresh";
this._menuItemRefresh.ShortcutKeys = System.Windows.Forms.Keys.F5;
this._menuItemRefresh.Size = new System.Drawing.Size(233, 22);
this._menuItemRefresh.Text = "Refresh";
this._menuItemRefresh.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click);
// //
// toolStripSeparator4 // toolStripSeparator4
// //
this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(220, 6); this.toolStripSeparator4.Size = new System.Drawing.Size(230, 6);
// //
// _menuItemRecentFiles // _menuItemRecentFiles
// //
this._menuItemRecentFiles.Name = "_menuItemRecentFiles"; this._menuItemRecentFiles.Name = "_menuItemRecentFiles";
this._menuItemRecentFiles.Size = new System.Drawing.Size(223, 22); this._menuItemRecentFiles.Size = new System.Drawing.Size(233, 22);
this._menuItemRecentFiles.Text = "Recent Files"; this._menuItemRecentFiles.Text = "Recent Files";
// //
// _menuItemRecentFolders // _menuItemRecentFolders
// //
this._menuItemRecentFolders.Name = "_menuItemRecentFolders"; this._menuItemRecentFolders.Name = "_menuItemRecentFolders";
this._menuItemRecentFolders.Size = new System.Drawing.Size(223, 22); this._menuItemRecentFolders.Size = new System.Drawing.Size(233, 22);
this._menuItemRecentFolders.Text = "Recent Folders"; this._menuItemRecentFolders.Text = "Recent Folders";
// //
// toolStripSeparator8 // toolStripSeparator8
// //
this.toolStripSeparator8.Name = "toolStripSeparator8"; this.toolStripSeparator8.Name = "toolStripSeparator8";
this.toolStripSeparator8.Size = new System.Drawing.Size(220, 6); this.toolStripSeparator8.Size = new System.Drawing.Size(230, 6);
//
// _menuItemExit
//
this._menuItemExit.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemExit.Image")));
this._menuItemExit.Name = "_menuItemExit";
this._menuItemExit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));
this._menuItemExit.Size = new System.Drawing.Size(233, 22);
this._menuItemExit.Text = "E&xit";
// //
// editToolStripMenuItem // editToolStripMenuItem
// //
@ -185,16 +246,82 @@
this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20); this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20);
this.editToolStripMenuItem.Text = "&Edit"; this.editToolStripMenuItem.Text = "&Edit";
// //
// _menuItemCut
//
this._menuItemCut.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemCut.Image")));
this._menuItemCut.Name = "_menuItemCut";
this._menuItemCut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X)));
this._menuItemCut.Size = new System.Drawing.Size(203, 22);
this._menuItemCut.Text = "Cu&t";
//
// _menuItemCopy
//
this._menuItemCopy.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemCopy.Image")));
this._menuItemCopy.Name = "_menuItemCopy";
this._menuItemCopy.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));
this._menuItemCopy.Size = new System.Drawing.Size(203, 22);
this._menuItemCopy.Text = "&Copy";
//
// _menuItemPaste
//
this._menuItemPaste.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemPaste.Image")));
this._menuItemPaste.Name = "_menuItemPaste";
this._menuItemPaste.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V)));
this._menuItemPaste.Size = new System.Drawing.Size(203, 22);
this._menuItemPaste.Text = "&Paste";
//
// toolStripSeparator7 // toolStripSeparator7
// //
this.toolStripSeparator7.Name = "toolStripSeparator7"; this.toolStripSeparator7.Name = "toolStripSeparator7";
this.toolStripSeparator7.Size = new System.Drawing.Size(200, 6); this.toolStripSeparator7.Size = new System.Drawing.Size(200, 6);
// //
// _menuItemRename
//
this._menuItemRename.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemRename.Image")));
this._menuItemRename.Name = "_menuItemRename";
this._menuItemRename.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)));
this._menuItemRename.Size = new System.Drawing.Size(203, 22);
this._menuItemRename.Text = "&Rename";
//
// _menuItemEditValue
//
this._menuItemEditValue.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemEditValue.Image")));
this._menuItemEditValue.Name = "_menuItemEditValue";
this._menuItemEditValue.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E)));
this._menuItemEditValue.Size = new System.Drawing.Size(203, 22);
this._menuItemEditValue.Text = "&Edit Value";
//
// _menuItemDelete
//
this._menuItemDelete.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemDelete.Image")));
this._menuItemDelete.Name = "_menuItemDelete";
this._menuItemDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete;
this._menuItemDelete.Size = new System.Drawing.Size(203, 22);
this._menuItemDelete.Text = "&Delete";
//
// toolStripSeparator10 // toolStripSeparator10
// //
this.toolStripSeparator10.Name = "toolStripSeparator10"; this.toolStripSeparator10.Name = "toolStripSeparator10";
this.toolStripSeparator10.Size = new System.Drawing.Size(200, 6); this.toolStripSeparator10.Size = new System.Drawing.Size(200, 6);
// //
// _menuItemMoveUp
//
this._menuItemMoveUp.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemMoveUp.Image")));
this._menuItemMoveUp.Name = "_menuItemMoveUp";
this._menuItemMoveUp.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up)));
this._menuItemMoveUp.Size = new System.Drawing.Size(203, 22);
this._menuItemMoveUp.Text = "Move &Up";
this._menuItemMoveUp.Click += new System.EventHandler(this._menuItemMoveUp_Click);
//
// _menuItemMoveDown
//
this._menuItemMoveDown.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemMoveDown.Image")));
this._menuItemMoveDown.Name = "_menuItemMoveDown";
this._menuItemMoveDown.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down)));
this._menuItemMoveDown.Size = new System.Drawing.Size(203, 22);
this._menuItemMoveDown.Text = "Move Do&wn";
this._menuItemMoveDown.Click += new System.EventHandler(this._menuItemMoveDown_Click);
//
// searchToolStripMenuItem // searchToolStripMenuItem
// //
this.searchToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.searchToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -208,6 +335,22 @@
this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20); this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
this.searchToolStripMenuItem.Text = "&Search"; this.searchToolStripMenuItem.Text = "&Search";
// //
// _menuItemFind
//
this._menuItemFind.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemFind.Image")));
this._menuItemFind.Name = "_menuItemFind";
this._menuItemFind.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));
this._menuItemFind.Size = new System.Drawing.Size(167, 22);
this._menuItemFind.Text = "&Find...";
//
// _menuItemFindNext
//
this._menuItemFindNext.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemFindNext.Image")));
this._menuItemFindNext.Name = "_menuItemFindNext";
this._menuItemFindNext.ShortcutKeys = System.Windows.Forms.Keys.F3;
this._menuItemFindNext.Size = new System.Drawing.Size(167, 22);
this._menuItemFindNext.Text = "Find &Next";
//
// toolStripSeparator9 // toolStripSeparator9
// //
this.toolStripSeparator9.Name = "toolStripSeparator9"; this.toolStripSeparator9.Name = "toolStripSeparator9";
@ -221,6 +364,18 @@
this.replaceToolStripMenuItem.Text = "&Replace..."; this.replaceToolStripMenuItem.Text = "&Replace...";
this.replaceToolStripMenuItem.Click += new System.EventHandler(this.replaceToolStripMenuItem_Click); this.replaceToolStripMenuItem.Click += new System.EventHandler(this.replaceToolStripMenuItem_Click);
// //
// toolStripSeparator11
//
this.toolStripSeparator11.Name = "toolStripSeparator11";
this.toolStripSeparator11.Size = new System.Drawing.Size(164, 6);
//
// findBlockToolStripMenuItem
//
this.findBlockToolStripMenuItem.Name = "findBlockToolStripMenuItem";
this.findBlockToolStripMenuItem.Size = new System.Drawing.Size(167, 22);
this.findBlockToolStripMenuItem.Text = "&Chunk Finder...";
this.findBlockToolStripMenuItem.Click += new System.EventHandler(this.findBlockToolStripMenuItem_Click);
//
// helpToolStripMenuItem // helpToolStripMenuItem
// //
this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -229,6 +384,14 @@
this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
this.helpToolStripMenuItem.Text = "&Help"; this.helpToolStripMenuItem.Text = "&Help";
// //
// _menuItemAbout
//
this._menuItemAbout.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemAbout.Image")));
this._menuItemAbout.Name = "_menuItemAbout";
this._menuItemAbout.ShortcutKeys = System.Windows.Forms.Keys.F1;
this._menuItemAbout.Size = new System.Drawing.Size(126, 22);
this._menuItemAbout.Text = "&About";
//
// imageList1 // imageList1
// //
this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
@ -249,6 +412,8 @@
this.imageList1.Images.SetKeyName(13, "map.png"); this.imageList1.Images.SetKeyName(13, "map.png");
this.imageList1.Images.SetKeyName(14, "edit-code-i.png"); this.imageList1.Images.SetKeyName(14, "edit-code-i.png");
this.imageList1.Images.SetKeyName(15, "question-white.png"); this.imageList1.Images.SetKeyName(15, "question-white.png");
this.imageList1.Images.SetKeyName(16, "edit-code-s.png");
this.imageList1.Images.SetKeyName(17, "edit-code-l.png");
// //
// toolStrip1 // toolStrip1
// //
@ -274,6 +439,7 @@
this._buttonAddTagDouble, this._buttonAddTagDouble,
this._buttonAddTagByteArray, this._buttonAddTagByteArray,
this._buttonAddTagIntArray, this._buttonAddTagIntArray,
this._buttonAddTagLongArray,
this._buttonAddTagString, this._buttonAddTagString,
this._buttonAddTagList, this._buttonAddTagList,
this._buttonAddTagCompound, this._buttonAddTagCompound,
@ -285,75 +451,6 @@
this.toolStrip1.Stretch = true; this.toolStrip1.Stretch = true;
this.toolStrip1.TabIndex = 0; this.toolStrip1.TabIndex = 0;
// //
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
//
// toolStripSeparator6
//
this.toolStripSeparator6.Name = "toolStripSeparator6";
this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
//
// toolStripSeparator5
//
this.toolStripSeparator5.Name = "toolStripSeparator5";
this.toolStripSeparator5.Size = new System.Drawing.Size(6, 25);
//
// BottomToolStripPanel
//
this.BottomToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.BottomToolStripPanel.Name = "BottomToolStripPanel";
this.BottomToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.BottomToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.BottomToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// TopToolStripPanel
//
this.TopToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.TopToolStripPanel.Name = "TopToolStripPanel";
this.TopToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.TopToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.TopToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// RightToolStripPanel
//
this.RightToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.RightToolStripPanel.Name = "RightToolStripPanel";
this.RightToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.RightToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.RightToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// LeftToolStripPanel
//
this.LeftToolStripPanel.Location = new System.Drawing.Point(0, 0);
this.LeftToolStripPanel.Name = "LeftToolStripPanel";
this.LeftToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this.LeftToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.LeftToolStripPanel.Size = new System.Drawing.Size(0, 0);
//
// ContentPanel
//
this.ContentPanel.Size = new System.Drawing.Size(562, 376);
//
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.testToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(97, 26);
//
// testToolStripMenuItem
//
this.testToolStripMenuItem.Name = "testToolStripMenuItem";
this.testToolStripMenuItem.Size = new System.Drawing.Size(96, 22);
this.testToolStripMenuItem.Text = "Test";
//
// _buttonOpen // _buttonOpen
// //
this._buttonOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this._buttonOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -391,6 +488,11 @@
this._buttonRefresh.Text = "Refresh Content From Disk"; this._buttonRefresh.Text = "Refresh Content From Disk";
this._buttonRefresh.Click += new System.EventHandler(this._buttonRefresh_Click); this._buttonRefresh.Click += new System.EventHandler(this._buttonRefresh_Click);
// //
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
//
// _buttonCut // _buttonCut
// //
this._buttonCut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this._buttonCut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -418,6 +520,11 @@
this._buttonPaste.Size = new System.Drawing.Size(23, 22); this._buttonPaste.Size = new System.Drawing.Size(23, 22);
this._buttonPaste.Text = "Paste"; this._buttonPaste.Text = "Paste";
// //
// toolStripSeparator6
//
this.toolStripSeparator6.Name = "toolStripSeparator6";
this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25);
//
// _buttonRename // _buttonRename
// //
this._buttonRename.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this._buttonRename.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -445,6 +552,11 @@
this._buttonDelete.Size = new System.Drawing.Size(23, 22); this._buttonDelete.Size = new System.Drawing.Size(23, 22);
this._buttonDelete.Text = "Delete Tag"; this._buttonDelete.Text = "Delete Tag";
// //
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
//
// _buttonAddTagByte // _buttonAddTagByte
// //
this._buttonAddTagByte.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this._buttonAddTagByte.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -545,6 +657,11 @@
this._buttonAddTagCompound.Size = new System.Drawing.Size(23, 22); this._buttonAddTagCompound.Size = new System.Drawing.Size(23, 22);
this._buttonAddTagCompound.Text = "Add Compound Tag"; this._buttonAddTagCompound.Text = "Add Compound Tag";
// //
// toolStripSeparator5
//
this.toolStripSeparator5.Name = "toolStripSeparator5";
this.toolStripSeparator5.Size = new System.Drawing.Size(6, 25);
//
// _buttonFindNext // _buttonFindNext
// //
this._buttonFindNext.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this._buttonFindNext.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -554,149 +671,54 @@
this._buttonFindNext.Size = new System.Drawing.Size(23, 22); this._buttonFindNext.Size = new System.Drawing.Size(23, 22);
this._buttonFindNext.Text = "Find / Find Next"; this._buttonFindNext.Text = "Find / Find Next";
// //
// _menuItemOpen // BottomToolStripPanel
// //
this._menuItemOpen.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemOpen.Image"))); this.BottomToolStripPanel.Location = new System.Drawing.Point(0, 0);
this._menuItemOpen.Name = "_menuItemOpen"; this.BottomToolStripPanel.Name = "BottomToolStripPanel";
this._menuItemOpen.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); this.BottomToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this._menuItemOpen.Size = new System.Drawing.Size(223, 22); this.BottomToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this._menuItemOpen.Text = "&Open..."; this.BottomToolStripPanel.Size = new System.Drawing.Size(0, 0);
// //
// _menuItemOpenFolder // TopToolStripPanel
// //
this._menuItemOpenFolder.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemOpenFolder.Image"))); this.TopToolStripPanel.Location = new System.Drawing.Point(0, 0);
this._menuItemOpenFolder.Name = "_menuItemOpenFolder"; this.TopToolStripPanel.Name = "TopToolStripPanel";
this._menuItemOpenFolder.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) this.TopToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
| System.Windows.Forms.Keys.O))); this.TopToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this._menuItemOpenFolder.Size = new System.Drawing.Size(223, 22); this.TopToolStripPanel.Size = new System.Drawing.Size(0, 0);
this._menuItemOpenFolder.Text = "Open &Folder...";
// //
// _menuItemSave // RightToolStripPanel
// //
this._menuItemSave.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemSave.Image"))); this.RightToolStripPanel.Location = new System.Drawing.Point(0, 0);
this._menuItemSave.Name = "_menuItemSave"; this.RightToolStripPanel.Name = "RightToolStripPanel";
this._menuItemSave.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); this.RightToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this._menuItemSave.Size = new System.Drawing.Size(223, 22); this.RightToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this._menuItemSave.Text = "&Save"; this.RightToolStripPanel.Size = new System.Drawing.Size(0, 0);
// //
// _menuItemRefresh // LeftToolStripPanel
// //
this._menuItemRefresh.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemRefresh.Image"))); this.LeftToolStripPanel.Location = new System.Drawing.Point(0, 0);
this._menuItemRefresh.Name = "_menuItemRefresh"; this.LeftToolStripPanel.Name = "LeftToolStripPanel";
this._menuItemRefresh.ShortcutKeys = System.Windows.Forms.Keys.F5; this.LeftToolStripPanel.Orientation = System.Windows.Forms.Orientation.Horizontal;
this._menuItemRefresh.Size = new System.Drawing.Size(223, 22); this.LeftToolStripPanel.RowMargin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this._menuItemRefresh.Text = "Refresh"; this.LeftToolStripPanel.Size = new System.Drawing.Size(0, 0);
this._menuItemRefresh.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click);
// //
// _menuItemExit // ContentPanel
// //
this._menuItemExit.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemExit.Image"))); this.ContentPanel.Size = new System.Drawing.Size(562, 376);
this._menuItemExit.Name = "_menuItemExit";
this._menuItemExit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));
this._menuItemExit.Size = new System.Drawing.Size(223, 22);
this._menuItemExit.Text = "E&xit";
// //
// _menuItemCut // contextMenuStrip1
// //
this._menuItemCut.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemCut.Image"))); this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this._menuItemCut.Name = "_menuItemCut"; this.testToolStripMenuItem});
this._menuItemCut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); this.contextMenuStrip1.Name = "contextMenuStrip1";
this._menuItemCut.Size = new System.Drawing.Size(203, 22); this.contextMenuStrip1.Size = new System.Drawing.Size(96, 26);
this._menuItemCut.Text = "Cu&t";
// //
// _menuItemCopy // testToolStripMenuItem
// //
this._menuItemCopy.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemCopy.Image"))); this.testToolStripMenuItem.Name = "testToolStripMenuItem";
this._menuItemCopy.Name = "_menuItemCopy"; this.testToolStripMenuItem.Size = new System.Drawing.Size(95, 22);
this._menuItemCopy.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); this.testToolStripMenuItem.Text = "Test";
this._menuItemCopy.Size = new System.Drawing.Size(203, 22);
this._menuItemCopy.Text = "&Copy";
//
// _menuItemPaste
//
this._menuItemPaste.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemPaste.Image")));
this._menuItemPaste.Name = "_menuItemPaste";
this._menuItemPaste.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V)));
this._menuItemPaste.Size = new System.Drawing.Size(203, 22);
this._menuItemPaste.Text = "&Paste";
//
// _menuItemRename
//
this._menuItemRename.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemRename.Image")));
this._menuItemRename.Name = "_menuItemRename";
this._menuItemRename.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)));
this._menuItemRename.Size = new System.Drawing.Size(203, 22);
this._menuItemRename.Text = "&Rename";
//
// _menuItemEditValue
//
this._menuItemEditValue.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemEditValue.Image")));
this._menuItemEditValue.Name = "_menuItemEditValue";
this._menuItemEditValue.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E)));
this._menuItemEditValue.Size = new System.Drawing.Size(203, 22);
this._menuItemEditValue.Text = "&Edit Value";
//
// _menuItemDelete
//
this._menuItemDelete.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemDelete.Image")));
this._menuItemDelete.Name = "_menuItemDelete";
this._menuItemDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete;
this._menuItemDelete.Size = new System.Drawing.Size(203, 22);
this._menuItemDelete.Text = "&Delete";
//
// _menuItemMoveUp
//
this._menuItemMoveUp.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemMoveUp.Image")));
this._menuItemMoveUp.Name = "_menuItemMoveUp";
this._menuItemMoveUp.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up)));
this._menuItemMoveUp.Size = new System.Drawing.Size(203, 22);
this._menuItemMoveUp.Text = "Move &Up";
this._menuItemMoveUp.Click += new System.EventHandler(this._menuItemMoveUp_Click);
//
// _menuItemMoveDown
//
this._menuItemMoveDown.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemMoveDown.Image")));
this._menuItemMoveDown.Name = "_menuItemMoveDown";
this._menuItemMoveDown.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down)));
this._menuItemMoveDown.Size = new System.Drawing.Size(203, 22);
this._menuItemMoveDown.Text = "Move Do&wn";
this._menuItemMoveDown.Click += new System.EventHandler(this._menuItemMoveDown_Click);
//
// _menuItemFind
//
this._menuItemFind.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemFind.Image")));
this._menuItemFind.Name = "_menuItemFind";
this._menuItemFind.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));
this._menuItemFind.Size = new System.Drawing.Size(167, 22);
this._menuItemFind.Text = "&Find...";
//
// _menuItemFindNext
//
this._menuItemFindNext.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemFindNext.Image")));
this._menuItemFindNext.Name = "_menuItemFindNext";
this._menuItemFindNext.ShortcutKeys = System.Windows.Forms.Keys.F3;
this._menuItemFindNext.Size = new System.Drawing.Size(167, 22);
this._menuItemFindNext.Text = "Find &Next";
//
// _menuItemAbout
//
this._menuItemAbout.Image = ((System.Drawing.Image)(resources.GetObject("_menuItemAbout.Image")));
this._menuItemAbout.Name = "_menuItemAbout";
this._menuItemAbout.ShortcutKeys = System.Windows.Forms.Keys.F1;
this._menuItemAbout.Size = new System.Drawing.Size(126, 22);
this._menuItemAbout.Text = "&About";
//
// toolStripSeparator11
//
this.toolStripSeparator11.Name = "toolStripSeparator11";
this.toolStripSeparator11.Size = new System.Drawing.Size(164, 6);
//
// findBlockToolStripMenuItem
//
this.findBlockToolStripMenuItem.Name = "findBlockToolStripMenuItem";
this.findBlockToolStripMenuItem.Size = new System.Drawing.Size(167, 22);
this.findBlockToolStripMenuItem.Text = "&Chunk Finder...";
this.findBlockToolStripMenuItem.Click += new System.EventHandler(this.findBlockToolStripMenuItem_Click);
// //
// _nodeTree // _nodeTree
// //
@ -715,6 +737,16 @@
this._nodeTree.Size = new System.Drawing.Size(619, 374); this._nodeTree.Size = new System.Drawing.Size(619, 374);
this._nodeTree.TabIndex = 0; this._nodeTree.TabIndex = 0;
// //
// _buttonAddTagLongArray
//
this._buttonAddTagLongArray.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this._buttonAddTagLongArray.Image = ((System.Drawing.Image)(resources.GetObject("_buttonAddTagLongArray.Image")));
this._buttonAddTagLongArray.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this._buttonAddTagLongArray.ImageTransparentColor = System.Drawing.Color.Magenta;
this._buttonAddTagLongArray.Name = "_buttonAddTagLongArray";
this._buttonAddTagLongArray.Size = new System.Drawing.Size(23, 22);
this._buttonAddTagLongArray.Text = "Add Long Array Tag";
//
// MainForm // MainForm
// //
this.AllowDrop = true; this.AllowDrop = true;
@ -809,6 +841,9 @@
private System.Windows.Forms.ToolStripMenuItem _menuItemMoveDown; private System.Windows.Forms.ToolStripMenuItem _menuItemMoveDown;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;
private System.Windows.Forms.ToolStripMenuItem findBlockToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem findBlockToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator12;
private System.Windows.Forms.ToolStripMenuItem _menuItemOpenInExplorer;
private System.Windows.Forms.ToolStripButton _buttonAddTagLongArray;
} }
} }

View file

@ -13,6 +13,7 @@ using NBTExplorer.Controllers;
namespace NBTExplorer.Windows namespace NBTExplorer.Windows
{ {
using Predicates = NodeTreeController.Predicates; using Predicates = NodeTreeController.Predicates;
using NBTModel.Interop;
public partial class MainForm : Form public partial class MainForm : Form
{ {
@ -38,6 +39,8 @@ namespace NBTExplorer.Windows
_tagIconIndex[TagType.TAG_LIST] = 8; _tagIconIndex[TagType.TAG_LIST] = 8;
_tagIconIndex[TagType.TAG_COMPOUND] = 9; _tagIconIndex[TagType.TAG_COMPOUND] = 9;
_tagIconIndex[TagType.TAG_INT_ARRAY] = 14; _tagIconIndex[TagType.TAG_INT_ARRAY] = 14;
_tagIconIndex[TagType.TAG_SHORT_ARRAY] = 16;
_tagIconIndex[TagType.TAG_LONG_ARRAY] = 17;
} }
catch (Exception e) { catch (Exception e) {
Program.StaticInitFailure(e); Program.StaticInitFailure(e);
@ -83,6 +86,7 @@ namespace NBTExplorer.Windows
_buttonAddTagIntArray.Click += _buttonAddTagIntArray_Click; _buttonAddTagIntArray.Click += _buttonAddTagIntArray_Click;
_buttonAddTagList.Click += _buttonAddTagList_Click; _buttonAddTagList.Click += _buttonAddTagList_Click;
_buttonAddTagLong.Click += _buttonAddTagLong_Click; _buttonAddTagLong.Click += _buttonAddTagLong_Click;
_buttonAddTagLongArray.Click += _buttonAddTagLongArray_Click;
_buttonAddTagShort.Click += _buttonAddTagShort_Click; _buttonAddTagShort.Click += _buttonAddTagShort_Click;
_buttonAddTagString.Click += _buttonAddTagString_Click; _buttonAddTagString.Click += _buttonAddTagString_Click;
_buttonFindNext.Click += _buttonFindNext_Click; _buttonFindNext.Click += _buttonFindNext_Click;
@ -101,6 +105,7 @@ namespace NBTExplorer.Windows
_menuItemFind.Click += _menuItemFind_Click; _menuItemFind.Click += _menuItemFind_Click;
_menuItemFindNext.Click += _menuItemFindNext_Click; _menuItemFindNext.Click += _menuItemFindNext_Click;
_menuItemAbout.Click += _menuItemAbout_Click; _menuItemAbout.Click += _menuItemAbout_Click;
_menuItemOpenInExplorer.Click += _menuItemOpenInExplorer_Click;
string[] args = Environment.GetCommandLineArgs(); string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1) { if (args.Length > 1) {
@ -115,6 +120,19 @@ namespace NBTExplorer.Windows
UpdateOpenMenu(); UpdateOpenMenu();
} }
void _menuItemOpenInExplorer_Click(object sender, EventArgs e)
{
if (_nodeTree.SelectedNode.Tag is DirectoryDataNode) {
DirectoryDataNode ddNode = _nodeTree.SelectedNode.Tag as DirectoryDataNode;
try {
string path = (!Interop.IsWindows ? "file://" : "") + ddNode.NodeDirPath;
System.Diagnostics.Process.Start(path);
} catch (Win32Exception ex) {
MessageBox.Show(ex.Message, "Can't open directory", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void InitializeIconRegistry () private void InitializeIconRegistry ()
{ {
_iconRegistry = new IconRegistry(); _iconRegistry = new IconRegistry();
@ -136,6 +154,7 @@ namespace NBTExplorer.Windows
_iconRegistry.Register(typeof(CubicRegionDataNode), 11); _iconRegistry.Register(typeof(CubicRegionDataNode), 11);
_iconRegistry.Register(typeof(NbtFileDataNode), 12); _iconRegistry.Register(typeof(NbtFileDataNode), 12);
_iconRegistry.Register(typeof(TagIntArrayDataNode), 14); _iconRegistry.Register(typeof(TagIntArrayDataNode), 14);
_iconRegistry.Register(typeof(TagShortArrayDataNode), 16);
} }
private void OpenFile () private void OpenFile ()
@ -162,6 +181,23 @@ namespace NBTExplorer.Windows
if (!ConfirmAction("Open new folder anyway?")) if (!ConfirmAction("Open new folder anyway?"))
return; return;
if ((ModifierKeys & Keys.Control) > 0 && (ModifierKeys & Keys.Shift) == 0) {
// If the user is holding Control, use a file open dialog and open whichever directory has the selected file.
// But not if the user is also holding Shift, as Ctrl+Shift+O is the keyboard shortcut for this menu item.
using (OpenFileDialog ofd = new OpenFileDialog()) {
ofd.Title = "Select any file in the directory to open";
ofd.Filter = "All files (*.*)|*.*";
if (_openFolderPath != null)
ofd.InitialDirectory = _openFolderPath;
if (ofd.ShowDialog() == DialogResult.OK) {
_openFolderPath = Path.GetDirectoryName(ofd.FileName);
OpenPaths(new string[] { _openFolderPath });
}
}
} else {
// Otherwise, use the standard folder browser dialog.
using (FolderBrowserDialog ofd = new FolderBrowserDialog()) { using (FolderBrowserDialog ofd = new FolderBrowserDialog()) {
if (_openFolderPath != null) if (_openFolderPath != null)
ofd.SelectedPath = _openFolderPath; ofd.SelectedPath = _openFolderPath;
@ -171,6 +207,7 @@ namespace NBTExplorer.Windows
OpenPaths(new string[] { ofd.SelectedPath }); OpenPaths(new string[] { ofd.SelectedPath });
} }
} }
}
UpdateUI(); UpdateUI();
} }
@ -394,7 +431,7 @@ namespace NBTExplorer.Windows
} }
else { else {
DisableButtons(_buttonAddTagByte, _buttonAddTagByteArray, _buttonAddTagCompound, _buttonAddTagDouble, _buttonAddTagFloat, DisableButtons(_buttonAddTagByte, _buttonAddTagByteArray, _buttonAddTagCompound, _buttonAddTagDouble, _buttonAddTagFloat,
_buttonAddTagInt, _buttonAddTagIntArray, _buttonAddTagList, _buttonAddTagLong, _buttonAddTagShort, _buttonAddTagInt, _buttonAddTagIntArray, _buttonAddTagList, _buttonAddTagLong, _buttonAddTagLongArray, _buttonAddTagShort,
_buttonAddTagString, _buttonCopy, _buttonCut, _buttonDelete, _buttonEdit, _buttonPaste, _buttonRefresh, _buttonAddTagString, _buttonCopy, _buttonCut, _buttonDelete, _buttonEdit, _buttonPaste, _buttonRefresh,
_buttonRename); _buttonRename);
@ -436,6 +473,7 @@ namespace NBTExplorer.Windows
_buttonAddTagIntArray.Enabled = node.CanCreateTag(TagType.TAG_INT_ARRAY); _buttonAddTagIntArray.Enabled = node.CanCreateTag(TagType.TAG_INT_ARRAY);
_buttonAddTagList.Enabled = node.CanCreateTag(TagType.TAG_LIST); _buttonAddTagList.Enabled = node.CanCreateTag(TagType.TAG_LIST);
_buttonAddTagLong.Enabled = node.CanCreateTag(TagType.TAG_LONG); _buttonAddTagLong.Enabled = node.CanCreateTag(TagType.TAG_LONG);
_buttonAddTagLongArray.Enabled = node.CanCreateTag(TagType.TAG_LONG_ARRAY);
_buttonAddTagShort.Enabled = node.CanCreateTag(TagType.TAG_SHORT); _buttonAddTagShort.Enabled = node.CanCreateTag(TagType.TAG_SHORT);
_buttonAddTagString.Enabled = node.CanCreateTag(TagType.TAG_STRING); _buttonAddTagString.Enabled = node.CanCreateTag(TagType.TAG_STRING);
@ -462,6 +500,7 @@ namespace NBTExplorer.Windows
_menuItemFindNext.Enabled = _searchState != null; _menuItemFindNext.Enabled = _searchState != null;
_menuItemMoveUp.Enabled = node.CanMoveNodeUp; _menuItemMoveUp.Enabled = node.CanMoveNodeUp;
_menuItemMoveDown.Enabled = node.CanMoveNodeDown; _menuItemMoveDown.Enabled = node.CanMoveNodeDown;
_menuItemOpenInExplorer.Enabled = node is DirectoryDataNode;
UpdateUI(_nodeTree.SelectedNodes); UpdateUI(_nodeTree.SelectedNodes);
} }
@ -480,6 +519,7 @@ namespace NBTExplorer.Windows
_buttonAddTagDouble.Enabled = _controller.CanOperateOnSelection(Predicates.CreateDoubleNodePred); _buttonAddTagDouble.Enabled = _controller.CanOperateOnSelection(Predicates.CreateDoubleNodePred);
_buttonAddTagByteArray.Enabled = _controller.CanOperateOnSelection(Predicates.CreateByteArrayNodePred); _buttonAddTagByteArray.Enabled = _controller.CanOperateOnSelection(Predicates.CreateByteArrayNodePred);
_buttonAddTagIntArray.Enabled = _controller.CanOperateOnSelection(Predicates.CreateIntArrayNodePred); _buttonAddTagIntArray.Enabled = _controller.CanOperateOnSelection(Predicates.CreateIntArrayNodePred);
_buttonAddTagLongArray.Enabled = _controller.CanOperateOnSelection(Predicates.CreateLongArrayNodePred);
_buttonAddTagString.Enabled = _controller.CanOperateOnSelection(Predicates.CreateStringNodePred); _buttonAddTagString.Enabled = _controller.CanOperateOnSelection(Predicates.CreateStringNodePred);
_buttonAddTagList.Enabled = _controller.CanOperateOnSelection(Predicates.CreateListNodePred); _buttonAddTagList.Enabled = _controller.CanOperateOnSelection(Predicates.CreateListNodePred);
_buttonAddTagCompound.Enabled = _controller.CanOperateOnSelection(Predicates.CreateCompoundNodePred); _buttonAddTagCompound.Enabled = _controller.CanOperateOnSelection(Predicates.CreateCompoundNodePred);
@ -718,6 +758,11 @@ namespace NBTExplorer.Windows
_controller.CreateNode(TagType.TAG_LONG); _controller.CreateNode(TagType.TAG_LONG);
} }
private void _buttonAddTagLongArray_Click (object sender, EventArgs e)
{
_controller.CreateNode(TagType.TAG_LONG_ARRAY);
}
private void _buttonAddTagShort_Click (object sender, EventArgs e) private void _buttonAddTagShort_Click (object sender, EventArgs e)
{ {
_controller.CreateNode(TagType.TAG_SHORT); _controller.CreateNode(TagType.TAG_SHORT);

View file

@ -369,229 +369,239 @@
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADQ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA6
MwAAAk1TRnQBSQFMAgEBEAEAATgBAgE4AQIBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA NgAAAk1TRnQBSQFMAgEBEgEAAVABAgFQAQIBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABUAMAAQEBAAEYBgABPP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AB4AA/wD+SH4A/kD/AMAA/0D+SH4 AwABUAMAAQEBAAEYBgABPP8A/wBaAAP+A/wG+QP6BvwD+wb5A/wD/gwAA/4D/Ab5A/oG/AP7BvkD/AP+
A/kD/TkAA/8D/AP5EvgD+QP7A/4GAAGWAakBvAFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFc bAAD/gP8A/kDswNcBvwDXAO0A/kD/AP+DAAD/gP8A/kDswNcBvwDXAO0A/kD/AP+cgADywN1A/gGAAP4
AYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgFcAYQBrgGWAakBvAMAAs8BywK5 A3UDyxgAA8sDdQP4BgAD+AN1A8t1AAPOA38D+QGCAcIBtAFZAa4BnQFZAa4BnQGpAdMByAP5A38DzhIA
AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACzwHLOQAD/gP4 A84DfwP5Ab8BfQFKAb8BfQFKAcABfgFNAeIBzgG/A/kDfwPObwAD0AOGA/kJAAHSAegB4AFgAbUBpAMA
AegC5QHZAbQBqwHqAY4BdwHuAXABUAHuAXABUAHqAY4BdwHZAbQBqwHoAeUB5AP2A/4GAAFsAZMBugFV A/kDhgPQDAAD0AOGA/kDAAHGAYIBUQHiAcsBuQkAA/kDhgPQaQAD7wNsA+8GAAGyAdwB0gFoAb0BrAFo
AYgBuwFwAaMB1gFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFnAZoBzQFn Ab0BrAGuAdkBzQYAA+8DbAPvBgAD7wNsA+8GAAHOAYoBWQHkAc0BugwAA+8DbAPvaQAD1AORA/kDAAFw
AZoBzQFwAaMB1gFVAYgBuwFsAZMBugMAAsEBuQL5AekC8wHiAvMB4gLzAeIC8wHiAvMB4gLzAeIC8wHi AcUBtAHVAesB4gkAA/kDkQPUDAAD1AORA/kDAAHWAZIBYQHnAc8BvAkAA/kDkQPUbwAD1QOWA/kBtwHh
AvMB4gLzAeIC8wHiAvMB4gL5AekCwQG5PAAB6gHcAdgB7gGCAWcB9QGiAY8B+gHRAcoB/AHnAeUB/AHm AdUBdgHLAboBdgHLAboBlQHVAcYD+QOWA9USAAPVA5YD+QHdAaEBdQHpAdEBvgYAA/kDlgPVdQAD1wOZ
AeUB+QHRAckB9AGhAY4B7gGBAWYB6gHcAdgJAAF+AaIBxwFxAaQB1wFVAYgBuwFxAaQB1wFxAaQB1wFx A/oGAAP6A5kD1xgAA9cDmQP6BgAD+gOZA9d7AAPYA50GAAOdA9geAAPYA50GAAOdA9j/AP8AsQAD/AP5
AaQB1wFxAaQB1wFxAaQB1wFxAaQB1wFxAaQB1wFxAaQB1wFxAaQB1wFVAYgBuwFxAaQB1wF+AaIBxwMA IfgD+QP8AwAD/QP5IfgD+QP9OQAD/wP8A/kS+AP5A/sD/gYAAZYBqQG8AVwBhAGuAVwBhAGuAVwBhAGu
AssBwwL0AeQBegGnAZsBhwG3AacBhwG1AaMBiQGzAaIBaAGgAYYBVwGXAXgBWAGTAXkBaAGQAX4BkgGk AVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGu
AZMBhgGXAYACqAGOAvQB5ALLAcMJAAP+A/wG+QP6BvwD+wb5A/wD/gwAAfMB3wHaAe4BewFgAfcB1AHO AZYBqQG8AwACzwHLArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGw
AfcC6QH3AugB/AL0AfwC9AH3AugB9wLpAfYB0QHKAe4BewFfAfMB3wHaBgABhgGqAc0BcwGmAdkBagGd ArkBsALPAcs5AAP+A/gB6ALlAdkBtAGrAeoBjgF3Ae4BcAFQAe4BcAFQAeoBjgF3AdkBtAGrAegB5QHk
AdABSAF7Aa4BXwGSAcUBTAF/AbIBXwGSAcUBTAF/AbIBXwGSAcUBTAF/AbIBXwGSAcUBSAF7Aa4BagGd A/YD/gYAAWwBkwG6AVUBiAG7AXABowHWAWcBmgHNAWcBmgHNAWcBmgHNAWcBmgHNAWcBmgHNAWcBmgHN
AdABcwGmAdkBhgGqAc0DAALPAccC9QHmAYQBtQGrAZgB1wHHAZAB0QG+AXMBsAGZAZcBywG2AacBzgG9 AWcBmgHNAWcBmgHNAWcBmgHNAXABowHWAVUBiAG7AWwBkwG6AwACwQG5AvkB6QLzAeIC8wHiAvMB4gLz
AZcBvQGsAZQBugGoAakBvwGvAY4BrQGhAbcBrQGLAvUB5gLPAccJAAP+A/wD+QOzA1wG/ANcA7QD+QP8 AeIC8wHiAvMB4gLzAeIC8wHiAvMB4gLzAeIC8wHiAvkB6QLBAbk8AAHqAdwB2AHuAYIBZwH1AaIBjwH6
A/4JAAH6AfgB9wHnAX4BYgHzAdMBzQHwAuUB7wLkAe8C5AHlAWEBPwHlAWEBPwHvAuQB7wLkAe8C5AHv AdEBygH8AecB5QH8AeYB5QH5AdEByQH0AaEBjgHuAYEBZgHqAdwB2AkAAX4BogHHAXEBpAHXAVUBiAG7
Ac0BxwHnAX4BYgH6AfgB9wMAAYsBrQHPAXUBqAHbAWwBnwHSAUoBfQGwAWwBnwHSAVIBhQG4AWwBnwHS AXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAXEBpAHXAVUBiAG7
AVIBhQG4AWwBnwHSAVIBhQG4AWwBnwHSAUoBfQGwAWwBnwHSAXUBqAHbAYsBrQHPAwAC0QHJAvYB6QGQ AXEBpAHXAX4BogHHAwACywHDAvQB5AF6AacBmwGHAbcBpwGHAbUBowGJAbMBogFoAaABhgFXAZcBeAFY
AbwBtQG5AeUB2wGmAd0B0AGIAcABsgGHAckBtQF+Ab4BpAGIAbkBowGuAdABvwGpAccBtQGUAboBqAG2 AZMBeQFoAZABfgGSAaQBkwGGAZcBgAKoAY4C9AHkAssBwwkAA/4D/Ab5A/oG/AP7BvkD/AP+DAAB8wHf
AbUBkQL2AekC0QHJDwADywN1A/gGAAP4A3UDyw8AAegBxQG8AeUBnQGKAeoC4gHnAt8B5wLfAecC3wHW AdoB7gF7AWAB9wHUAc4B9wLpAfcC6AH8AvQB/AL0AfcC6AH3AukB9gHRAcoB7gF7AV8B8wHfAdoGAAGG
AVkBNwHWAVkBNwHnAt8B5wLfAecC3wHoAuAB4QGXAYQB6AHFAbwDAAGPAbEB0gF3AaoB3QFuAaEB1AFH AaoBzQFzAaYB2QFqAZ0B0AFIAXsBrgFfAZIBxQFMAX8BsgFfAZIBxQFMAX8BsgFfAZIBxQFMAX8BsgFf
AXoBrQFuAaEB1AFPAYIBtQFuAaEB1AFPAYIBtQFuAaEB1AFPAYIBtQFuAaEB1AFHAXoBrQFuAaEB1AF3 AZIBxQFIAXsBrgFqAZ0B0AFzAaYB2QGGAaoBzQMAAs8BxwL1AeYBhAG1AasBmAHXAccBkAHRAb4BcwGw
AaoB3QGPAbEB0gMAAtMBzAL3AesBxQG4AYcB/wHeAYwB+AHnAa0B1QHRAbABygHrAeIBvQHlAdkBoAHK AZkBlwHLAbYBpwHOAb0BlwG9AawBlAG6AagBqQG/Aa8BjgGtAaEBtwGtAYsC9QHmAs8BxwkAA/4D/AP5
AbsBqgHOAa8BggHBAaQBfgG2ApgBrAGEAvcB6wLTAcwMAAPOA38D+QHdAbMBuQHAAUkBWgHAAUkBWgHd A7MDXAb8A1wDtAP5A/wD/gkAAfoB+AH3AecBfgFiAfMB0wHNAfAC5QHvAuQB7wLkAeUBYQE/AeUBYQE/
AbMBuQP5A38DzgwAAdIBhAFuAeoB0AHIAeEC2gHgAtkB4ALZAeAC2QHxAu0B8QLtAeAC2QHgAtkB4ALZ Ae8C5AHvAuQB7wLkAe8BzQHHAecBfgFiAfoB+AH3AwABiwGtAc8BdQGoAdsBbAGfAdIBSgF9AbABbAGf
AeAC2QHhAcQBvQHSAYQBbgMAAZMBtAHUAXgBqwHeAW8BogHVAUQBdwGqAW8BogHVAUwBfwGyAW8BogHV AdIBUgGFAbgBbAGfAdIBUgGFAbgBbAGfAdIBUgGFAbgBbAGfAdIBSgF9AbABbAGfAdIBdQGoAdsBiwGt
AUwBfwGyAW8BogHVAUwBfwGyAW8BogHVAUQBdwGqAW8BogHVAXgBqwHeAZMBtAHUAwAC1QHNAvgB7gHR Ac8DAALRAckC9gHpAZABvAG1AbkB5QHbAaYB3QHQAYgBwAGyAYcByQG1AX4BvgGkAYgBuQGjAa4B0AG/
Aa4BaQHbAboBcQHeAb4BdAHpAckBfAG/Ac0BqAGVAcwBwgGhAc8BvgGRAcQBrwF/Ab0BpgF3AbcBnQGo AakBxwG1AZQBugGoAbYBtQGRAvYB6QLRAckPAAPLA3UD+AYAA/gDdQPLDwAB6AHFAbwB5QGdAYoB6gLi
AaoBdwL4Ae4C1QHNCQAD0AOGA/kGAAHgAbYBvAHRAXsBhwYAA/kDhgPQCQABuwFUATUB9AHuAe0B5wLl AecC3wHnAt8B5wLfAdYBWQE3AdYBWQE3AecC3wHnAt8B5wLfAegC4AHhAZcBhAHoAcUBvAMAAY8BsQHS
AdoC1gHYAtQB2ALUAbcBSAEmAbcBSAEmAeMC3wHYAtQB2ALUAdgC1AHhAdgB1gG7AVQBNQMAAZgBuAHX AXcBqgHdAW4BoQHUAUcBegGtAW4BoQHUAU8BggG1AW4BoQHUAU8BggG1AW4BoQHUAU8BggG1AW4BoQHU
AXoBrQHgAXEBpAHXAUEBdAGnAXEBpAHXAUkBfAGvAXEBpAHXAUkBfAGvAXEBpAHXAUkBfAGvAXEBpAHX AUcBegGtAW4BoQHUAXcBqgHdAY8BsQHSAwAC0wHMAvcB6wHFAbgBhwH/Ad4BjAH4AecBrQHVAdEBsAHK
AUEBdAGnAXEBpAHXAXoBrQHgAZgBuAHXAwAC1wHPAvkB8QHTAawBZgH/AdMBfgH/AdYBggHgAb4BdAH2 AesB4gG9AeUB2QGgAcoBuwGqAc4BrwGCAcEBpAF+AbYCmAGsAYQC9wHrAtMBzAwAA84DfwP5Ad0BswG5
AeEBmQGwAe0B5AGvAdEBvwGiAeAB0wGYAdgBxgGOAdABugG4AbIBgAL5AfEC1wHPBgAD7wNsA+8JAAHj AcABSQFaAcABSQFaAd0BswG5A/kDfwPODAAB0gGEAW4B6gHQAcgB4QLaAeAC2QHgAtkB4ALZAfEC7QHx
AbgBvwHXAYEBjQkAA+8DbAPvBgABsQFQATEB9AHvAe0D7gPqAdwC2wHTAtEBxwGmAZwBrgFHASUBwQFz Au0B4ALZAeAC2QHgAtkB4ALZAeEBxAG9AdIBhAFuAwABkwG0AdQBeAGrAd4BbwGiAdUBRAF3AaoBbwGi
AVoB3gLcAdIC0AHSAtAB3wHYAdcBsQFQATEDAAGbAboB2QF8Aa8B4gFzAaYB2QE/AXIBpQFzAaYB2QFH AdUBTAF/AbIBbwGiAdUBTAF/AbIBbwGiAdUBTAF/AbIBbwGiAdUBRAF3AaoBbwGiAdUBeAGrAd4BkwG0
AXoBrQFzAaYB2QFHAXoBrQFzAaYB2QFHAXoBrQFzAaYB2QE/AXIBpQFzAaYB2QF8Aa8B4gGbAboB2QMA AdQDAALVAc0C+AHuAdEBrgFpAdsBugFxAd4BvgF0AekByQF8Ab8BzQGoAZUBzAHCAaEBzwG+AZEBxAGv
AtkB0QL7AfQB1QGpAWIB/wHOAXkB/wHSAX0B3wG6AW8B/wHYAYMB5gHqAb0BpgHYAc0BswHsAeIBuQHk AX8BvQGmAXcBtwGdAagBqgF3AvgB7gLVAc0JAAPQA4YD+QYAAeABtgG8AdEBewGHBgAD+QOGA9AJAAG7
AdABtgHcAcQBqwG+AZcC+wH0AtkB0QkAA9QDkQP5BgAB5gG7AcEB3QGHAZMGAAP5A5ED1AkAAcABfQFm AVQBNQH0Ae4B7QHnAuUB2gLWAdgC1AHYAtQBtwFIASYBtwFIASYB4wLfAdgC1AHYAtQB2ALUAeEB2AHW
AeoB1QHNCfAD6wPgAcgBnAGNAasBRgEkAb0BigF5A84B0gLRAdwBxwLAAX0BZgMAAZ0BvQHbAX4BsQHk AbsBVAE1AwABmAG4AdcBegGtAeABcQGkAdcBQQF0AacBcQGkAdcBSQF8Aa8BcQGkAdcBSQF8Aa8BcQGk
AXUBqAHbATgBawGeAVEBhAG3ATgBawGeAVEBhAG3ATgBawGeAVEBhAG3ATgBawGeAVEBhAG3ATgBawGe AdcBSQF8Aa8BcQGkAdcBQQF0AacBcQGkAdcBegGtAeABmAG4AdcDAALXAc8C+QHxAdMBrAFmAf8B0wF+
AXUBqAHbAX4BsQHkAZ0BvQHbAwAC2gHTAvwB9wHXAacBXwHaAawBZAHcAbABZwHnAbwBcAHgAboBbwHj Af8B1gGCAeABvgF0AfYB4QGZAbAB7QHkAa8B0QG/AaIB4AHTAZgB2AHGAY4B0AG6AbgBsgGAAvkB8QLX
Ab4BcwHfAdEBmAHbAc8BlgHVAdEBnAHEAc0BpAGdAdEBwwL8AfcC2gHTDAAD1QOWA/kB6AG9AcMB3QFm Ac8GAAPvA2wD7wkAAeMBuAG/AdcBgQGNCQAD7wNsA+8GAAGxAVABMQH0Ae8B7QPuA+oB3ALbAdMC0QHH
AXcB3QFmAXcB6AG9AcMD+QOWA9UMAAHfAcMBuQHUAZ0BigP1BvMB2gGpAZgB2gGpAZgBzwGOAXgBswFP AaYBnAGuAUcBJQHBAXMBWgHeAtwB0gLQAdIC0AHfAdgB1wGxAVABMQMAAZsBugHZAXwBrwHiAXMBpgHZ
AS0B0wGhAZAD8wP1AdQBnAGJAd8BwwG5AwABoAG+AdwBfwGyAeUBZgGZAcwBdgGpAdwBdgGpAdwBdgGp AT8BcgGlAXMBpgHZAUcBegGtAXMBpgHZAUcBegGtAXMBpgHZAUcBegGtAXMBpgHZAT8BcgGlAXMBpgHZ
AdwBdgGpAdwBdgGpAdwBdgGpAdwBdgGpAdwBdgGpAdwBdgGpAdwBZgGZAcwBfwGyAeUBoAG+AdwDAALb AXwBrwHiAZsBugHZAwAC2QHRAvsB9AHVAakBYgH/Ac4BeQH/AdIBfQHfAboBbwH/AdgBgwHmAeoBvQGm
AdQC/QH5AdkBpAFcAf8BxAFvAf8ByAFzAd4BsAFnAf8BzgF5Af8B0gF9AeQBvgFyAf8B2AGDAe0B5AGo AdgBzQGzAewB4gG5AeQB0AG2AdwBxAGrAb4BlwL7AfQC2QHRCQAD1AORA/kGAAHmAbsBwQHdAYcBkwYA
AeIB5gG2AdAB1wGtAv0B+QLbAdQPAAPXA5kD+gYAA/oDmQPXDwAB+QH4AfcBywF7AWAB8gHfAdkD+AP3 A/kDkQPUCQABwAF9AWYB6gHVAc0J8APrA+AByAGcAY0BqwFGASQBvQGKAXkDzgHSAtEB3AHHAsABfQFm
AcEBXQE7AcEBXQE7AcEBXQE7AcEBXQE7AekB0AHIA/gB8gHfAdkBywF7AWAB+QH4AfcDAAGjAcAB3gFr AwABnQG9AdsBfgGxAeQBdQGoAdsBOAFrAZ4BUQGEAbcBOAFrAZ4BUQGEAbcBOAFrAZ4BUQGEAbcBOAFr
AZ4B0QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3AaoB3QF3 AZ4BUQGEAbcBOAFrAZ4BdQGoAdsBfgGxAeQBnQG9AdsDAALaAdMC/AH3AdcBpwFfAdoBrAFkAdwBsAFn
AaoB3QF3AaoB3QFrAZ4B0QGjAcAB3gMAAt0B1QL+AfwB2gGjAVoB/wG/AWsB/wHCAW4B3gGsAWIB/wHJ AecBvAFwAeABugFvAeMBvgFzAd8B0QGYAdsBzwGWAdUB0QGcAcQBzQGkAZ0B0QHDAvwB9wLaAdMMAAPV
AXQB/wHNAXgB4wG5AW4B/wHTAX4B/wHXAYMB/AHeAZUB7AHKAXwC/gH8At0B1RIAA9gDnQYAA50D2BUA A5YD+QHoAb0BwwHdAWYBdwHdAWYBdwHoAb0BwwP5A5YD1QwAAd8BwwG5AdQBnQGKA/UG8wHaAakBmAHa
Ae4B4AHbAdgBhAFoAfYB4wHcA/wM+wP8AfYB4wHcAdgBhAFoAe4B4AHbBgABpgHDAeABoAHTAfoBmAHL AakBmAHPAY4BeAGzAU8BLQHTAaEBkAPzA/UB1AGcAYkB3wHDAbkDAAGgAb4B3AF/AbIB5QFmAZkBzAF2
AfUBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBkwHGAfMBmAHL AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AF2AakB3AFmAZkBzAF/
AfUBoAHTAfoBpgHDAeADAALeAdcC/wH+AdsBoQFYAdsBogFZAdsBpAFbAdsBpQFdAdsBqQFgAdsBrAFj AbIB5QGgAb4B3AMAAtsB1AL9AfkB2QGkAVwB/wHEAW8B/wHIAXMB3gGwAWcB/wHOAXkB/wHSAX0B5AG+
AdsBrwFmAdsBsQFoAdsBtAFrAdsBtwFuAdsBuQFxAv8B/gLeAdc8AAHwAeIB3QHkAZQBeAHvAbcBpAH6 AXIB/wHYAYMB7QHkAagB4gHmAbYB0AHXAa0C/QH5AtsB1A8AA9cDmQP6BgAD+gOZA9cPAAH5AfgB9wHL
AeQB3QH+AfkB9wH+AfkB9wH6AeQB3QHvAbcBpAHkAZQBeAHwAeIB3QkAAegB7QHzAagBxAHhAZcBygH1 AXsBYAHyAd8B2QP4A/cBwQFdATsBwQFdATsBwQFdATsBwQFdATsB6QHQAcgD+AHyAd8B2QHLAXsBYAH5
AZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZIBxQHzAZcBygH1 AfgB9wMAAaMBwAHeAWsBngHRAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHd
AagBxAHhAegB7QHzAwAC3wHZJ/8C3wHZPwAB+gL4Ae8B0gHIAewBqAGSAewBjgFuAewBjgFuAewBqAGS AXcBqgHdAXcBqgHdAXcBqgHdAXcBqgHdAWsBngHRAaMBwAHeAwAC3QHVAv4B/AHaAaMBWgH/Ab8BawH/
Ae8B0gHIAfoC+A8AAegB7QHzAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHiAakBxQHi AcIBbgHeAawBYgH/AckBdAH/Ac0BeAHjAbkBbgH/AdMBfgH/AdcBgwH8Ad4BlQHsAcoBfAL+AfwC3QHV
AakBxQHiAakBxQHiAakBxQHiAakBxQHiAegB7QHzBgAC6gHmAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ EgAD2AOdBgADnQPYFQAB7gHgAdsB2AGEAWgB9gHjAdwD/Az7A/wB9gHjAdwB2AGEAWgB7gHgAdsGAAGm
AuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLqAebDAAP7A/EBlQGvAbwBaAGbAbYBaAGbAbYBaAGb AcMB4AGgAdMB+gGYAcsB9QGTAcYB8wGTAcYB8wGTAcYB8wGTAcYB8wGTAcYB8wGTAcYB8wGTAcYB8wGT
AbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBaAGbAbYBlQGvAbwD8QP7FQAS+AP5 AcYB8wGTAcYB8wGYAcsB9QGgAdMB+gGmAcMB4AMAAt4B1wL/Af4B2wGhAVgB2wGiAVkB2wGkAVsB2wGl
A/0zAAP8A/kk+AP5A/wD/QP6AXcBqAHBAYYBzwHwAYEBywHtAYEBywHtAYEBywHtAYEBywHtAYEBywHt AV0B2wGpAWAB2wGsAWMB2wGvAWYB2wGxAWgB2wG0AWsB2wG3AW4B2wG5AXEC/wH+At4B1zwAAfAB4gHd
AYEBywHtAYYBzwHwAUsBjwGxAYYBzwHwAXcBqAHBAdwB4gHlBv0D+Qz4A/MBiQGlAY8BVQGLAV8BVQGL AeQBlAF4Ae8BtwGkAfoB5AHdAf4B+QH3Af4B+QH3AfoB5AHdAe8BtwGkAeQBlAF4AfAB4gHdCQAB6AHt
AV8BVQGLAV8BVQGLAV8BVQGLAV8BVQGLAV8BlAGtAZkGAAPAAywDwAMAA/sb+AP7A/cBkwGmAboBYAGI AfMBqAHEAeEBlwHKAfUBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHFAfMBkgHF
Aa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGIAa8BYAGI AfMBkgHFAfMBlwHKAfUBqAHEAeEB6AHtAfMDAALfAdkn/wLfAdk/AAH6AvgB7wHSAcgB7AGoAZIB7AGO
Aa8BYAGIAa8BkwGmAboD9wYAAYYBtQHNAYQBzgHuAXwBxwHoAXwBxwHoAXwBxwHoAXwBxwHoAXwBxwHo AW4B7AGOAW4B7AGoAZIB7wHSAcgB+gL4DwAB6AHtAfMBqQHFAeIBqQHFAeIBqQHFAeIBqQHFAeIBqQHF
AXwBxwHoAYQBzgHuAVcBmwG9AYQBzgHuAfQBtgEuAYYBtQHNAwAClAG4AlUBowJVAaMCVQGjAlUBowJV AeIBqQHFAeIBqQHFAeIBqQHFAeIBqQHFAeIBqQHFAeIBqQHFAeIB6AHtAfMGAALqAeYC4AHZAuAB2QLg
AaMCVQGjAVUBegGJATUBvQF5AUMBywGHAT4BxgGCAT4BxgGCAT4BxgGCAUMBywGHAVUBoAFwBgADQAFn AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuoB5sMAA/sD8QGVAa8BvAFo
AlYDQAMAA/sDYQNeA1wDWQNUA0kDPAMvA2wD+wMAAXIBmAG/AXsBrgHgAXoBrQHfAXoBrQHfAXoBrQHf AZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgFoAZsBtgGV
AXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXoBrQHfAXsBrgHgAXIBmAG/CQABkQG+ Aa8BvAPxA/sVABL4A/kD/TMAA/wD+ST4A/kD/AP9A/oBdwGoAcEBhgHPAfABgQHLAe0BgQHLAe0BgQHL
AdQBhwHQAe8BfwHKAekBfwHKAekBfwHKAekBfwHKAekBfwHKAekBfwHKAekBhwHQAe8BXwGjAcUBhwHQ Ae0BgQHLAe0BgQHLAe0BgQHLAe0BhgHPAfABSwGPAbEBhgHPAfABdwGoAcEB3AHiAeUG/QP5DPgD8wGJ
Ae8B/gHJAUEBkQG+AdQDAAJVAbQBLwEeAdwBJQETAdgBJQETAdgBJQETAdgBJQETAdgBJQETAdgBVQF+ AaUBjwFVAYsBXwFVAYsBXwFVAYsBXwFVAYsBXwFVAYsBXwFVAYsBXwGUAa0BmQYAA8ADLAPAAwAD+xv4
AZUBNwG/AXsBQgHKAYYBNwG/AXsBNwG/AXsBNwG/AXsBQgHKAYYBVQGnAXYGAAPLA1UDyycAAYQBpwHL A/sD9wGTAaYBugFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFgAYgBrwFg
AYEBtAHkAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHhAX0BsAHh AYgBrwFgAYgBrwFgAYgBrwFgAYgBrwGTAaYBugP3BgABhgG1Ac0BhAHOAe4BfAHHAegBfAHHAegBfAHH
AX0BsAHhAYEBtAHkAYQBpwHLCQABlAHAAdYBigHTAfABggHNAesBggHNAesBggHNAesBggHNAesBggHN AegBfAHHAegBfAHHAegBfAHHAegBhAHOAe4BVwGbAb0BhAHOAe4B9AG2AS4BhgG1Ac0DAAKUAbgCVQGj
AesBggHNAesBigHTAfABYgGmAcgBigHTAfAC6QHbAZQBwAHWAwACVQG5AS0BHAHeARUBAAHVARUBAAHV AlUBowJVAaMCVQGjAlUBowJVAaMBVQF6AYkBNQG9AXkBQwHLAYcBPgHGAYIBPgHGAYIBPgHGAYIBQwHL
ARUBAAHVARUBAAHVARUBAAHVAVUBgQGaATsBwwF/AUgBzwGMATsBwwF/ATsBwwF/ATsBwwF/AUgBzwGM AYcBVQGgAXAGAANAAWcCVgNAAwAD+wNhA14DXANZA1QDSQM8Ay8DbAP7AwABcgGYAb8BewGuAeABegGt
AVUBrQF7NgABigGtAc8BiAG7AeoBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1AeUBggG1 Ad8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BegGtAd8BewGu
AeUBggG1AeUBggG1AeUBggG1AeUBiAG7AeoBigGtAc8JAAGYAcMB2AGOAdYB8gGHAdAB7QGHAdAB7QGH AeABcgGYAb8JAAGRAb4B1AGHAdAB7wF/AcoB6QF/AcoB6QF/AcoB6QF/AcoB6QF/AcoB6QF/AcoB6QGH
AdAB7QGHAdAB7QGHAdAB7QGHAdAB7QGOAdYB8gFmAaoBzAGOAdYB8gLwAeYBmAHDAdgDAAJVAb8BNgEl AdAB7wFfAaMBxQGHAdAB7wH+AckBQQGRAb4B1AMAAlUBtAEvAR4B3AElARMB2AElARMB2AElARMB2AEl
AeQBGQEAAdsBGQEAAdsBGQEAAdsBGQEAAdsBGQEAAdsBVQGEAaABPgHGAYIBTQHVAZEBPgHGAYIBPgHG ARMB2AElARMB2AFVAX4BlQE3Ab8BewFCAcoBhgE3Ab8BewE3Ab8BewE3Ab8BewFCAcoBhgFVAacBdgYA
AYIBPgHGAYIBTQHVAZEBVQGzAYA2AAGOAbAB0QGPAcIB7gGHAboB6QGHAboB6QGHAboB6QGHAboB6QGH A8sDVQPLJwABhAGnAcsBgQG0AeQBfQGwAeEBfQGwAeEBfQGwAeEBfQGwAeEBfQGwAeEBfQGwAeEBfQGw
AboB6QGHAboB6QGHAboB6QGHAboB6QGHAboB6QGHAboB6QGPAcIB7gGOAbAB0QkAAZsBxgHaAZIB2gH0 AeEBfQGwAeEBfQGwAeEBfQGwAeEBgQG0AeQBhAGnAcsJAAGUAcAB1gGKAdMB8AGCAc0B6wGCAc0B6wGC
AYsB1AHwAYsB1AHwAYsB1AHwAYsB1AHwAYsB1AHwAYsB1AHwAZIB2gH0AWkBrQHPAZIB2gH0AvgB8wGb Ac0B6wGCAc0B6wGCAc0B6wGCAc0B6wGKAdMB8AFiAaYByAGKAdMB8ALpAdsBlAHAAdYDAAJVAbkBLQEc
AcYB2gMAAlUBxAE+AS0B7AEcAQAB4wEcAQAB4wEcAQAB4wEcAQAB4wEcAQAB4wFVAYYBpAFCAcoBhgFR Ad4BFQEAAdUBFQEAAdUBFQEAAdUBFQEAAdUBFQEAAdUBVQGBAZoBOwHDAX8BSAHPAYwBOwHDAX8BOwHD
AdkBlQFCAcoBhgFCAcoBhgFCAcoBhgFRAdkBlQFVAbkBhAYAA9ADZwPQJwABkwG0AdQBlgHJAfIBjAG/ AX8BOwHDAX8BSAHPAYwBVQGtAXs2AAGKAa0BzwGIAbsB6gGCAbUB5QGCAbUB5QGCAbUB5QGCAbUB5QGC
AewBjAG/AewBjAG/AewBRAF3AaoBjAG/AewBRAF3AaoBjAG/AewBjAG/AewBjAG/AewBjAG/AewBlgHJ AbUB5QGCAbUB5QGCAbUB5QGCAbUB5QGCAbUB5QGCAbUB5QGIAbsB6gGKAa0BzwkAAZgBwwHYAY4B1gHy
AfIBkwG0AdQJAAGfAcgB3QGXAd4B9gGQAdgB8gGQAdgB8gGQAdgB8gGQAdgB8gGQAdgB8gGQAdgB8gGX AYcB0AHtAYcB0AHtAYcB0AHtAYcB0AHtAYcB0AHtAYcB0AHtAY4B1gHyAWYBqgHMAY4B1gHyAvAB5gGY
Ad4B9gF5Ab0B3AF4Ab0B3AL+Af0BnwHIAd0DAAJVAcgBRgE1AfIBIAEAAekBIAEAAekBIAEAAekBIAEA AcMB2AMAAlUBvwE2ASUB5AEZAQAB2wEZAQAB2wEZAQAB2wEZAQAB2wEZAQAB2wFVAYQBoAE+AcYBggFN
AekBIAEAAekBVQGJAagBRAHMAYgBZQHtAakBZQHtAakBZQHtAakBZQHtAakBWAHWAZYBfwHLAaQGAANs AdUBkQE+AcYBggE+AcYBggE+AcYBggFNAdUBkQFVAbMBgDYAAY4BsAHRAY8BwgHuAYcBugHpAYcBugHp
AW8CaQNsBgADdQN0A3EDbgNsA2gDZQNjA2AGAAGYAbgB1wGbAc4B9gGRAcQB8AGRAcQB8AGRAcQB8AFV AYcBugHpAYcBugHpAYcBugHpAYcBugHpAYcBugHpAYcBugHpAYcBugHpAYcBugHpAY8BwgHuAY4BsAHR
AYgBuwFEAXcBqgFVAYgBuwFAAXMBpgGRAcQB8AGRAcQB8AGRAcQB8AGbAc4B9gGYAbgB1wkAAaIBygHe CQABmwHGAdoBkgHaAfQBiwHUAfABiwHUAfABiwHUAfABiwHUAfABiwHUAfABiwHUAfABkgHaAfQBaQGt
AZsB4QH3AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZQB2wH0AZ4B5AH5AXwBwAHe Ac8BkgHaAfQC+AHzAZsBxgHaAwACVQHEAT4BLQHsARwBAAHjARwBAAHjARwBAAHjARwBAAHjARwBAAHj
AaIBygHeAe4B8wH1AwACfwHVAWIBYQHnAXYBdQH+AXYBdQH+AXkBYgGjAXsBUAFVAXsBUAFVAWoBWQE/ AVUBhgGkAUIBygGGAVEB2QGVAUIBygGGAUIBygGGAUIBygGGAVEB2QGVAVUBuQGEBgAD0ANnA9AnAAGT
AWoBbgEyAWoBbgEyAWEBiwFRAVUBwQGKAVUBwQGKAVUBwQGKAeIB7wHoBgAD0wNxA9MnAAGbAboB2QGf AbQB1AGWAckB8gGMAb8B7AGMAb8B7AGMAb8B7AFEAXcBqgGMAb8B7AFEAXcBqgGMAb8B7AGMAb8B7AGM
AdIB+QGVAcgB8wGVAcgB8wGVAcgB8wFVAYgBuwFVAYgBuwFVAYgBuwFNAYABswGVAcgB8wGVAcgB8wGV Ab8B7AGMAb8B7AGWAckB8gGTAbQB1AkAAZ8ByAHdAZcB3gH2AZAB2AHyAZAB2AHyAZAB2AHyAZAB2AHy
AcgB8wGfAdIB+QGbAboB2QkAAaUBzQHgAZ4B5QH5AZgB3wH2AZgB3wH2AZgB3wH2AZgB3wH2AZgB3wH2 AZAB2AHyAZAB2AHyAZcB3gH2AXkBvQHcAXgBvQHcAv4B/QGfAcgB3QMAAlUByAFGATUB8gEgAQAB6QEg
AZgB3wH2AZgB3wH2AZgB3wH2AaEB6AH6AaUBzQHgBgAC4gHxAlUBzgJVAc4CVQHOAW0BUwF1AdwBqQEy AQAB6QEgAQAB6QEgAQAB6QEgAQAB6QFVAYkBqAFEAcwBiAFlAe0BqQFlAe0BqQFlAe0BqQFlAe0BqQFY
AdcBpAEtAdcBpAEtAdcBpAEtAdwBqQEyAbABhgFIQgABnwG9AdsBqQHbAf4BqgHdAf8BqgHdAf8BqgHd AdYBlgF/AcsBpAYAA2wBbwJpA2wGAAN1A3QDcQNuA2wDaANlA2MDYAYAAZgBuAHXAZsBzgH2AZEBxAHw
Af8BdwGqAd0BdwGqAd0BdwGqAd0BZgGZAcwBqgHdAf8BqgHdAf8BqgHdAf8BqQHbAf4BnwG9AdsJAAGo AZEBxAHwAZEBxAHwAVUBiAG7AUQBdwGqAVUBiAG7AUABcwGmAZEBxAHwAZEBxAHwAZEBxAHwAZsBzgH2
Ac4B4gGjAegB+wGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGdAeMB+QGj AZgBuAHXCQABogHKAd4BmwHhAfcBlAHbAfQBlAHbAfQBlAHbAfQBlAHbAfQBlAHbAfQBlAHbAfQBlAHb
AegB+wGoAc4B4hIAAbYBiwFFAdwBqQEyAdEBngEnAdEBngEnAdEBngEnAdwBqQEyAbYBiwFFQgABxwHX AfQBngHkAfkBfAHAAd4BogHKAd4B7gHzAfUDAAJ/AdUBYgFhAecBdgF1Af4BdgF1Af4BeQFiAaMBewFQ
AecBiAG2AeIBgAGzAeYBgAGzAeYBgAGzAeYBTgGBAbQBTgGBAbQBTgGBAbQBSAF7Aa4BgAGzAeYBgAGz AVUBewFQAVUBagFZAT8BagFuATIBagFuATIBYQGLAVEBVQHBAYoBVQHBAYoBVQHBAYoB4gHvAegGAAPT
AeYBgAGzAeYBiAG2AeIBxwHXAecJAAGrAdAB4wGmAesB/AGhAeYB+wGhAeYB+wGhAeYB+wGhAeYB+wGh A3ED0ycAAZsBugHZAZ8B0gH5AZUByAHzAZUByAHzAZUByAHzAVUBiAG7AVUBiAG7AVUBiAG7AU0BgAGz
AeYB+wGhAeYB+wGhAeYB+wGhAeYB+wGmAesB/AGrAdAB4xIAAbsBkAFBAeEBrgE4AdYBowEsAdYBowEs AZUByAHzAZUByAHzAZUByAHzAZ8B0gH5AZsBugHZCQABpQHNAeABngHlAfkBmAHfAfYBmAHfAfYBmAHf
AdYBowEsAeEBrgE4AbsBkAFBEgAD1wN9A9cnAAHjAeoB8QGOAbgB4QGJAbwB7wGIAbsB7gGIAbsB7gFB AfYBmAHfAfYBmAHfAfYBmAHfAfYBmAHfAfYBmAHfAfYBoQHoAfoBpQHNAeAGAALiAfECVQHOAlUBzgJV
AXQBpwFBAXQBpwFBAXQBpwE+AXEBpAGIAbsB7gGIAbsB7gGJAbwB7wGOAbgB4QHjAeoB8QkAAa4B0gHk Ac4BbQFTAXUB3AGpATIB1wGkAS0B1wGkAS0B1wGkAS0B3AGpATIBsAGGAUhCAAGfAb0B2wGpAdsB/gGq
AakB7gH9AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AaQB6QH8AakB7gH9 Ad0B/wGqAd0B/wGqAd0B/wF3AaoB3QF3AaoB3QF3AaoB3QFmAZkBzAGqAd0B/wGqAd0B/wGqAd0B/wGp
Aa4B0gHkEgABwAGVAT8B5wG0AT0B2gGnATAB2gGnATAB2gGnATAB5wG0AT0BwAGVAT8SAAN/A3cDfwYA AdsB/gGfAb0B2wkAAagBzgHiAaMB6AH7AZ0B4wH5AZ0B4wH5AZ0B4wH5AZ0B4wH5AZ0B4wH5AZ0B4wH5
A4IDgQN/A34DfAN6A3kDdgOrBgAB9QH3AfkBmwG+Ad8BiQG8Ae8BiAG7Ae4BiAG7Ae4BNQFoAZsBNQFo AZ0B4wH5AZ0B4wH5AaMB6AH7AagBzgHiEgABtgGLAUUB3AGpATIB0QGeAScB0QGeAScB0QGeAScB3AGp
AZsBNQFoAZsBNQFoAZsBiAG7Ae4BiAG7Ae4BiQG8Ae8BmwG+Ad8B9QH3AfkJAAGwAdQB5gGsAfEB/wGn ATIBtgGLAUVCAAHHAdcB5wGIAbYB4gGAAbMB5gGAAbMB5gGAAbMB5gFOAYEBtAFOAYEBtAFOAYEBtAFI
AewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGnAewB/gGsAfEB/wGwAdQB5hIA AXsBrgGAAbMB5gGAAbMB5gGAAbMB5gGIAbYB4gHHAdcB5wkAAasB0AHjAaYB6wH8AaEB5gH7AaEB5gH7
AcYBmgE9AesBuAFBAd0BqgEzAd0BqgEzAd0BqgEzAesBuAFBAcYBmgE9EgAD2AOCA9gnAAP+AcsB2gHq AaEB5gH7AaEB5gH7AaEB5gH7AaEB5gH7AaEB5gH7AaEB5gH7AaYB6wH8AasB0AHjEgABuwGQAUEB4QGu
AakBxQHiAakBxQHiAakBxQHiAVUBfQGmAVUBfQGmAVUBfQGmAVUBfQGmAakBxQHiAakBxQHiAakBxQHi ATgB1gGjASwB1gGjASwB1gGjASwB4QGuATgBuwGQAUESAAPXA30D1ycAAeMB6gHxAY4BuAHhAYkBvAHv
AcsB2gHqA/4JAAGyAdUB5gGxAfUB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGuAfIB/wGu AYgBuwHuAYgBuwHuAUEBdAGnAUEBdAGnAUEBdAGnAT4BcQGkAYgBuwHuAYgBuwHuAYkBvAHvAY4BuAHh
AfIB/wGuAfIB/wGxAfUB/wGyAdUB5hIAAdQBswFsAecBuAFGAf4BywFUAf4BywFUAf4BywFUAecBuAFG AeMB6gHxCQABrgHSAeQBqQHuAf0BpAHpAfwBpAHpAfwBpAHpAfwBpAHpAfwBpAHpAfwBpAHpAfwBpAHp
AdQBswFsdQAB0AHkAe4BswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHWAecBswHW AfwBpAHpAfwBqQHuAf0BrgHSAeQSAAHAAZUBPwHnAbQBPQHaAacBMAHaAacBMAHaAacBMAHnAbQBPQHA
AecBswHWAecBswHWAecB0AHkAe4SAAHwAesB3gHNAaABOQHNAaABOQHNAaABOQHNAaABOQHNAaABOQHw AZUBPxIAA38DdwN/BgADggOBA38DfgN8A3oDeQN2A6sGAAH1AfcB+QGbAb4B3wGJAbwB7wGIAbsB7gGI
AesB3g8AA/sD8QLIAcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPx AbsB7gE1AWgBmwE1AWgBmwE1AWgBmwE1AWgBmwGIAbsB7gGIAbsB7gGJAbwB7wGbAb4B3wH1AfcB+QkA
BvsD8QLIAcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxA/tgAAP9 AbAB1AHmAawB8QH/AacB7AH+AacB7AH+AacB7AH+AacB7AH+AacB7AH+AacB7AH+AacB7AH+AacB7AH+
AawB8QH/AbAB1AHmEgABxgGaAT0B6wG4AUEB3QGqATMB3QGqATMB3QGqATMB6wG4AUEBxgGaAT0SAAPY
A4ID2CcAA/4BywHaAeoBqQHFAeIBqQHFAeIBqQHFAeIBVQF9AaYBVQF9AaYBVQF9AaYBVQF9AaYBqQHF
AeIBqQHFAeIBqQHFAeIBywHaAeoD/gkAAbIB1QHmAbEB9QH/Aa4B8gH/Aa4B8gH/Aa4B8gH/Aa4B8gH/
Aa4B8gH/Aa4B8gH/Aa4B8gH/Aa4B8gH/AbEB9QH/AbIB1QHmEgAB1AGzAWwB5wG4AUYB/gHLAVQB/gHL
AVQB/gHLAVQB5wG4AUYB1AGzAWx1AAHQAeQB7gGzAdYB5wGzAdYB5wGzAdYB5wGzAdYB5wGzAdYB5wGz
AdYB5wGzAdYB5wGzAdYB5wGzAdYB5wGzAdYB5wHQAeQB7hIAAfAB6wHeAc0BoAE5Ac0BoAE5Ac0BoAE5
Ac0BoAE5Ac0BoAE5AfAB6wHeDwAD+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGw
ArgBsAK4AbACyAHDA/EG+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4
AbACyAHDA/ED+2AAA/0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gb9A/oCwAG4
C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oD/WYAAskBwQb/A/4C/QH8Av0B+wL8AfkC+wH4
AvoB9gL4AfQC+wH2AskBwQwAAskBwQb/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC+wH2AskBwWwA
As8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9
AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHHDAAD/gP8BvkD+gb8A/sG+QP8A/4GAAP9A/wD+h74
A/oD/AP9BgAC0AHIAv8B/gL9AfwC/QH7Ab8BSAGuAewBzgHlAvoB9gL4AfQC9wHyAvYB8AL6AfMC0AHI
DAAC0AHIAv8B/gL9AfwB6QHPAesBrgFIAb8BrgFIAb8BrgFIAb8B0wGhAdoC9wHyAvYB8AL6AfMC0AHI
DAAD/gP8A/kDswNcBvwDXAO0A/kD/AP+BgAD/QOEAzQDhAP4A+IGNAOEA+IDdQOkA/gDhAM0A+kGAALS
AcsC/gP9AfsC/AH5AcYBTwG1AewBzwHlAvgB9AL3AfIC9gHwAvUB7gL6AfIC0gHLDAAC0gHLAv4D/QH7
AeoB0QHtAbUBTwHGAvoB9gHnAc4B6AG1AU8BxgHuAeEB6wL1Ae4C+gHyAtIByxIAA8sDdQP4BgAD+AN1
A8sSAAN5A/UGAAOqA3kGAAPLA74D7gOqA8IJAALVAc0C/gP8AfkC+wH4Ac4BVwG9Ac4BVwG9Ac4BVwG9
AeIBpgHWAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QHrAdIB7QG9AVcBzgL4AfQC9wHyAb0BVwHO
AecBzQHlAvQB7AL5Ae8C1QHNDwADzgN/A/kMAAP5A38Dzg8AA8YMYAPGBgAD9QlgA+kJAALWAc4C/QP7
AfgC+gH2AdYBXwHFAe8B0QHmAvYB8AL1Ae4C9AHsAvEB5wL3AeoC1gHODAAC1gHOAv0D+wH4AewB0wHu
AcUBXwHWAvcB8gHqAdEB6gHFAV8B1gHtAeEB6QLxAecC9wHqAtYBzgwAA9ADhgP5EgAD+QOGA9AMAAP1
A5QD7wPRA2gD9QkAA5MD7wNoDAAC2AHQAv0D+gH2AvgB9AHcAWUBywHcAWUBywHcAWUBywHiAYkB0wLx
AecC7AHfAvQB5QLYAdAMAALYAdAC/QP6AfYB7QHTAe4BywFlAdwBywFlAdwBywFlAdwB3wGsAeMC8QHn
AuwB3wL0AeUC2AHQCQAD7wNsA+8YAAPvA2wD7wwAA48D9gO3A48MAAPMA30DzAwAAtoB0gL8A/gB9AL3
AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0
AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAA9QDkQP5EgAD+QORA9QPAAPOA9UDdwPODAAD7AN3A+wMAALb
AdMC/AP3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMMAALbAdMC/AP3AfIC9gHw
AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAvIB4QLbAdMPAAPVA5YD+QwAA/kDlgPVEgAD9gOiA34D9iEA
AtwB1QL7A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7A/YB8AL1
Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1RIAA9cDmQP6BgAD+gOZA9cYAAacJAAC3QHW
AvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALdAdYC+gH0AvUB7gL0
AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwBUAA9gDnQYAA50D2EUAAt4B1wL6AfMC9AHs
AvEB5wLsAd8C6AHZAuYB1QLlAdQCtgGlA/8C3gHXAvcB9gwAAt4B1wL6AfMC9AHsAvEB5wLsAd8C6AHZ
AuYB1QLlAdQCtgGlA/8C3gHXAvcB9mwAAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHiAvIB4QLyAeECwgGx
At8B2QL3AfYPAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2bwAC6gHm
AuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC9wH2EgAC6gHmAuAB2QLgAdkC4AHZAuAB2QLg
AdkC4AHZAuAB2QLgAdkC9wH2bAAD+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGw
ArgBsAK4AbACyAHDA/EG+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4
AbACyAHDA/EG+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACyAHD
A/EG+wPxAsgBwwK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACyAHDA/ED+wP9
A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/A/4B/QL+AfwC/QH7 A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/A/4B/QL+AfwC/QH7
Av0B+gL8AfgC/gH5AsABuAP6A/1mAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJ Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLAAbgD+gb9
AcEMAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcFsAALPAccD/wP+Av0B/AL9 A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oD/QYAAskBwQb/A/4C/QH8Av0B+wL8
AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHHDAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2 AfkC+wH4AvoB9gL4AfQC+wH2AskBwQwAAskBwQb/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC+wH2
AvgB9AL3AfIC+wH1As8BxwwAA/4D/Ab5A/oG/AP7BvkD/AP+BgAD/QP8A/oe+AP6A/wD/QYAAtAByAL/ AskBwQwAAskBwQb/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4AfQC+wH2AskBwQwAAskBwQb/A/4C/QH8
Af4C/QH8Av0B+wG/AUgBrgHsAc4B5QL6AfYC+AH0AvcB8gL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8 Av0B+wL8AfkC+wH4AvoB9gL4AfQC+wH2AskBwQwAAs8BxwP/A/4C/QH8Av0B+wL8AfkC+wH4AvoB9gL4
AekBzwHrAa4BSAG/Aa4BSAG/Aa4BSAG/AdMBoQHaAvcB8gL2AfAC+gHzAtAByAwAA/4D/AP5A7MDXAb8 AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHH
A1wDtAP5A/wD/gYAA/0DhAM0A4QD+APiBjQDhAPiA3UDpAP4A4QDNAPpBgAC0gHLAv4D/QH7AvwB+QHG
AU8BtQHsAc8B5QL4AfQC9wHyAvYB8AL1Ae4C+gHyAtIBywwAAtIBywL+A/0B+wHqAdEB7QG1AU8BxgL6
AfYB5wHOAegBtQFPAcYB7gHhAesC9QHuAvoB8gLSAcsSAAPLA3UD+AYAA/gDdQPLEgADeQP1BgADqgN5
BgADywO+A+4DqgPCCQAC1QHNAv4D/AH5AvsB+AHOAVcBvQHOAVcBvQHOAVcBvQHiAaYB1gL1Ae4C9AHs
AvkB7wLVAc0MAALVAc0C/gP8AfkB6wHSAe0BvQFXAc4C+AH0AvcB8gG9AVcBzgHnAc0B5QL0AewC+QHv
AtUBzQ8AA84DfwP5DAAD+QN/A84PAAPGDGADxgYAA/UJYAPpCQAC1gHOAv0D+wH4AvoB9gHWAV8BxQHv
AdEB5gL2AfAC9QHuAvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9A/sB+AHsAdMB7gHFAV8B1gL3AfIB6gHR
AeoBxQFfAdYB7QHhAekC8QHnAvcB6gLWAc4MAAPQA4YD+RIAA/kDhgPQDAAD9QOUA+8D0QNoA/UJAAOT
A+8DaAwAAtgB0AL9A/oB9gL4AfQB3AFlAcsB3AFlAcsB3AFlAcsB4gGJAdMC8QHnAuwB3wL0AeUC2AHQ
DAAC2AHQAv0D+gH2Ae0B0wHuAcsBZQHcAcsBZQHcAcsBZQHcAd8BrAHjAvEB5wLsAd8C9AHlAtgB0AkA
A+8DbAPvGAAD7wNsA+8MAAOPA/YDtwOPDAADzAN9A8wMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHs
AvEB5wLsAd8C6AHZAvMB4gLaAdIMAALaAdIC/AP4AfQC9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZ
AvMB4gLaAdIMAAPUA5ED+RIAA/kDkQPUDwADzgPVA3cDzgwAA+wDdwPsDAAC2wHTAvwD9wHyAvYB8AL1
Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLyAeEC2wHTDAAC2wHTAvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLs
Ad8C6AHZAuYB1QLyAeEC2wHTDwAD1QOWA/kMAAP5A5YD1RIAA/YDogN+A/YhAALcAdUC+wP2AfAC9QHu
AvQB7ALxAecC7AHfAugB2QLmAdUC5QHUAvIB4QLcAdUMAALcAdUC+wP2AfAC9QHuAvQB7ALxAecC7AHf
AugB2QLmAdUC5QHUAvIB4QLcAdUSAAPXA5kD+gYAA/oDmQPXGAAGnCQAAt0B1gL6AfQC9QHuAvQB7ALx
AecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHADAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZ
AuYB1QKkAZMCpAGTAqQBkwLJAcAVAAPYA50GAAOdA9hFAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLm
AdUC5QHUArYBpQP/At4B1wL3AfYMAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUArYBpQP/
At4B1wL3AfZsAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZ
AvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9m8AAuoB5gLgAdkC4AHZAuAB2QLg
AdkC4AHZAuAB2QLgAdkC4AHZAvcB9hIAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
AvcB9mwAA/sD8QLIAcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPx
BvsD8QLIAcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxBvsD8QLI
AcMCuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxBvsD8QLIAcMCuAGw
ArgBsAK4AbACuAGwArgBsAK4AbACuAGwArgBsAK4AbACuAGwAsgBwwPxA/sD/QP6AsABuAv/A/4B/QL+
AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6Bv0D+gLAAbgL/wP+Af0C/gH8Av0B+wL9AfoC/AH4Av4B+QLA
AbgD+gb9A/oCwAG4C/8D/gH9Av4B/AL9AfsC/QH6AvwB+AL+AfkCwAG4A/oG/QP6AsABuAv/A/4B/QL+
AfwC/QH7Av0B+gL8AfgC/gH5AsABuAP6A/0GAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0
AvsB9gLJAcEMAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcEMAALJAcEG/wP+
Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvsB9gLJAcEMAALJAcEG/wP+Av0B/AL9AfsC/AH5AvsB+AL6
AfYC+AH0AvsB9gLJAcEMAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6AfYC+AH0AvcB8gL7AfUCzwHH
DAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8 DAACzwHHA/8D/gL9AfwC/QH7AvwB+QL7AfgC+gH2AvgB9AL3AfIC+wH1As8BxwwAAs8BxwP/A/4C/QH8
Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALPAccD/wP+Av0B/AL9AfsC/AH5AvsB+AL6 Av0B+wL8AfkC+wH4AvoB9gL4AfQC9wHyAvsB9QLPAccMAALQAcgC/wH+Av0B/AHcAc8B6wF7AUgBvwF7
AfYC+AH0AvcB8gL7AfUCzwHHDAAC0AHIAv8B/gL9AfwB3AHPAesBewFIAb8BewFIAb8BewFIAb8BiwFe AUgBvwF7AUgBvwGLAV4BxgHoAeEB6wL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8Av0B+wGCAcIBtAFZ
AcYB6AHhAesC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AL9AfsBggHCAbQBWQGuAZ0BWQGuAZ0BqQHT Aa4BnQFZAa4BnQGpAdMByAL3AfIC9gHwAvoB8wLQAcgMAALQAcgC/wH+Av0B/AL9AfsB3gGiAakBvwFI
AcgC9wHyAvYB8AL6AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7Ad4BogGpAb8BSAFZAb8BSAFZAdwBoAGm AVkBvwFIAVkB3AGgAaYC9wHyAvYB8AL6AfMC0AHIDAAC0AHIAv8B/gL9AfwC/QH7Ab8BewFIAb8BewFI
AvcB8gL2AfAC+gHzAtAByAwAAtAByAL/Af4C/QH8Av0B+wG/AXsBSAG/AXsBSAG/AXsBSAHcAboBngL3 Ab8BewFIAdwBugGeAvcB8gL2AfAC+gHzAtAByAwAAtIBywL+A/0B+wHdAdEB7QGCAU8BxgL6AfYC+AH0
AfIC9gHwAvoB8wLQAcgMAALSAcsC/gP9AfsB3QHRAe0BggFPAcYC+gH2AvgB9AGCAU8BxgHZAcwB5QL1 AYIBTwHGAdkBzAHlAvUB7gL6AfIC0gHLDAAC0gHLAv4D/QH7AvwB+QL7AfgC+gH2AdIB6AHgAWABtQGk
Ae4C+gHyAtIBywwAAtIBywL+A/0B+wL8AfkC+wH4AvoB9gHSAegB4AFgAbUBpAL2AfAC9QHuAvoB8gLS AvYB8AL1Ae4C+gHyAtIBywwAAtIBywL+A/0B+wL8AfkC+wH4AeABpQGrAdMBegGFAvcB8gL2AfAC9QHu
AcsMAALSAcsC/gP9AfsC/AH5AvsB+AHgAaUBqwHTAXoBhQL3AfIC9gHwAvUB7gL6AfIC0gHLDAAC0gHL AvoB8gLSAcsMAALSAcsC/gP9AfsC/AH5AcYBggFPAewB2wHMAvgB9AL3AfIC9gHwAvUB7gL6AfIC0gHL
Av4D/QH7AvwB+QHGAYIBTwHsAdsBzAL4AfQC9wHyAvYB8AL1Ae4C+gHyAtIBywwAAtUBzQL+A/wB+QHf DAAC1QHNAv4D/AH5Ad8B0gHtAYoBVwHOAZgBbAHTAYoBVwHOAaUBfwHXAecB4QHpAvQB7AL5Ae8C1QHN
AdIB7QGKAVcBzgGYAWwB0wGKAVcBzgGlAX8B1wHnAeEB6QL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QL7 DAAC1QHNAv4D/AH5AvsB+AGyAdwB0gFoAb0BrAFoAb0BrAGuAdkBzQL1Ae4C9AHsAvkB7wLVAc0MAALV
AfgBsgHcAdIBaAG9AawBaAG9AawBrgHZAc0C9QHuAvQB7AL5Ae8C1QHNDAAC1QHNAv4D/AH5AvsB+AL6 Ac0C/gP8AfkC+wH4AvoB9gHjAagBrgHZAX8BiwL2AfAC9QHuAvQB7AL5Ae8C1QHNDAAC1QHNAv4D/AH5
AfYB4wGoAa4B2QF/AYsC9gHwAvUB7gL0AewC+QHvAtUBzQwAAtUBzQL+A/wB+QL7AfgBzgGKAVcB7gHd AvsB+AHOAYoBVwHuAd0BzAL3AfIC9gHwAvUB7gL0AewC+QHvAtUBzQwAAtYBzgL9A/sB+AHgAdMB7gGS
AcwC9wHyAvYB8AL1Ae4C9AHsAvkB7wLVAc0MAALWAc4C/QP7AfgB4AHTAe4BkgFfAdYC9wHyAd0B0AHp AV8B1gL3AfIB3QHQAekBkgFfAdYC9AHsAvEB5wL3AeoC1gHODAAC1gHOAv0D+wH4AvoB9gFwAcUBtAHV
AZIBXwHWAvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9A/sB+AL6AfYBcAHFAbQB1QHrAeIC9gHwAvUB7gL0 AesB4gL2AfAC9QHuAvQB7ALxAecC9wHqAtYBzgwAAtYBzgL9A/sB+AL6AfYC+AH0AecBqwGxAd4BhQGQ
AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgC+gH2AvgB9AHnAasBsQHeAYUBkAL1Ae4C9AHsAvEB5wL3 AvUB7gL0AewC8QHnAvcB6gLWAc4MAALWAc4C/QP7AfgC+gH2AdYBkgFfAe8B3gHNAvYB8AL1Ae4C9AHs
AeoC1gHODAAC1gHOAv0D+wH4AvoB9gHWAZIBXwHvAd4BzQL2AfAC9QHuAvQB7ALxAecC9wHqAtYBzgwA AvEB5wL3AeoC1gHODAAC2AHQAv0D+gH2AeAB0wHuAZgBZQHcAZgBZQHcAZgBZQHcAcUBrAHjAvEB5wLs
AtgB0AL9A/oB9gHgAdMB7gGYAWUB3AGYAWUB3AGYAWUB3AHFAawB4wLxAecC7AHfAvQB5QLYAdAMAALY Ad8C9AHlAtgB0AwAAtgB0AL9A/oB9gL4AfQBtwHhAdUBdgHLAboBdgHLAboBlQHVAcYC8QHnAuwB3wL0
AdAC/QP6AfYC+AH0AbcB4QHVAXYBywG6AXYBywG6AZUB1QHGAvEB5wLsAd8C9AHlAtgB0AwAAtgB0AL9 AeUC2AHQDAAC2AHQAv0D+gH2AvgB9AHqAa8BtAHcAWUBdgHcAWUBdgHoAawBsQLxAecC7AHfAvQB5QLY
A/oB9gL4AfQB6gGvAbQB3AFlAXYB3AFlAXYB6AGsAbEC8QHnAuwB3wL0AeUC2AHQDAAC2AHQAv0D+gH2 AdAMAALYAdAC/QP6AfYC+AH0AdwBmAFlAe8B3gHNAvUB7gL0AewC8QHnAuwB3wL0AeUC2AHQDAAC2gHS
AvgB9AHcAZgBZQHvAd4BzQL1Ae4C9AHsAvEB5wLsAd8C9AHlAtgB0AwAAtoB0gL8A/gB9AL3AfIC9gHw AvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2
AvUB7gL0AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHn AfAC9QHuAvQB7ALxAecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALx
AuwB3wLoAdkC8wHiAtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC8wHi AecC7AHfAugB2QLzAeIC2gHSDAAC2gHSAvwD+AH0AvcB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLz
AtoB0gwAAtoB0gL8A/gB9AL3AfIC9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC8wHiAtoB0gwAAtsB0wL8 AeIC2gHSDAAC2wHTAvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLyAeEC2wHTDAAC2wHT
A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHu AvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLyAeEC2wHTDAAC2wHTAvwD9wHyAvYB8AL1
AvQB7ALxAecC7AHfAugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHf Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLyAeEC2wHTDAAC2wHTAvwD9wHyAvYB8AL1Ae4C9AHsAvEB5wLs
AugB2QLmAdUC8gHhAtsB0wwAAtsB0wL8A/cB8gL2AfAC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUC8gHh Ad8C6AHZAuYB1QLyAeEC2wHTDAAC3AHVAvsD9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALy
AtsB0wwAAtwB1QL7A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7 AeEC3AHVDAAC3AHVAvsD9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3AHV
A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7A/YB8AL1Ae4C9AHs AvsD9gHwAvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3AHVAvsD9gHwAvUB7gL0
AvEB5wLsAd8C6AHZAuYB1QLlAdQC8gHhAtwB1QwAAtwB1QL7A/YB8AL1Ae4C9AHsAvEB5wLsAd8C6AHZ AewC8QHnAuwB3wLoAdkC5gHVAuUB1ALyAeEC3AHVDAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZ
AuYB1QLlAdQC8gHhAtwB1QwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKk AuYB1QKkAZMCpAGTAqQBkwLJAcAMAALdAdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKk
AZMCyQHADAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALd AZMCpAGTAskBwAwAAt0B1gL6AfQC9QHuAvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHA
AdYC+gH0AvUB7gL0AewC8QHnAuwB3wLoAdkC5gHVAqQBkwKkAZMCpAGTAskBwAwAAt0B1gL6AfQC9QHu DAAC3QHWAvoB9AL1Ae4C9AHsAvEB5wLsAd8C6AHZAuYB1QKkAZMCpAGTAqQBkwLJAcAMAALeAdcC+gHz
AvQB7ALxAecC7AHfAugB2QLmAdUCpAGTAqQBkwKkAZMCyQHADAAC3gHXAvoB8wL0AewC8QHnAuwB3wLo AvQB7ALxAecC7AHfAugB2QLmAdUC5QHUArYBpQP/At4B1wL3AfYMAALeAdcC+gHzAvQB7ALxAecC7AHf
AdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2 AugB2QLmAdUC5QHUArYBpQP/At4B1wL3AfYMAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLmAdUC5QHU
AaUD/wLeAdcC9wH2DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2 ArYBpQP/At4B1wL3AfYMAALeAdcC+gHzAvQB7ALxAecC7AHfAugB2QLmAdUC5QHUArYBpQP/At4B1wL3
DAAC3gHXAvoB8wL0AewC8QHnAuwB3wLoAdkC5gHVAuUB1AK2AaUD/wLeAdcC9wH2DAAC3wHZAvwB9QL5 AfYMAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLfAdkC9wH2DwAC3wHZAvwB9QL5
Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHi Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAt8B2QL8AfUC+QHvAvYB6gL0AeUC8wHi
AvIB4QLyAeECwgGxAt8B2QL3AfYPAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLf AvIB4QLyAeECwgGxAt8B2QL3AfYPAALfAdkC/AH1AvkB7wL2AeoC9AHlAvMB4gLyAeEC8gHhAsIBsQLf
AdkC9wH2DwAC3wHZAvwB9QL5Ae8C9gHqAvQB5QLzAeIC8gHhAvIB4QLCAbEC3wHZAvcB9g8AAuoB5gLg AdkC9wH2DwAC6gHmAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC9wH2EgAC6gHmAuAB2QLg
AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAvcB9hIAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZ AdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC9wH2EgAC6gHmAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZ
AuAB2QLgAdkC4AHZAvcB9hIAAuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAvcB9hIA AuAB2QLgAdkC9wH2EgAC6gHmAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC9wH2DAABQgFN
AuoB5gLgAdkC4AHZAuAB2QLgAdkC4AHZAuAB2QLgAdkC4AHZAvcB9gwAAUIBTQE+BwABPgMAASgDAAFA AT4HAAE+AwABKAMAAUADAAFQAwABAQEAAQEFAAGAAQIWAAP/AQAE/wQABP8EAAT/BAABwAEDAcABAwQA
AwABUAMAAQEBAAEBBQABgAECFgAD/4IAAQEBAAEBAv8BwAEDAQABAQEAAQEC/wHAAQMBAAEBAQABAQL/ AcABAwHAAQMEAAHxAY8B8QGPBAAB4AEHAeABBwQAAccBIwHEAeMEAAGMATEBjAHxBAABxAHjAcQB4wQA
AeABBwEAAQEBAAEBAcABAwHAAQMBAAEBAQABAQHAAQMBgAEBAQABAQEAAQEB8QGPAYABAQEAAQEBAAEB AeABBwHgAccEAAHxAY8B8QGPBAAB+QGfAfkBnwQABP8EAAT/BAAE/wUAAQEBAAEBAv8BwAEDAQABAQEA
AeABBwGAAQEBAAEBAQABAQHGAWMBgAEBAQABAQEAAQEBjgFxAYABAQEAAQEBAAEBAcYBYwGAAQEBAAEB AQEC/wHAAQMBAAEBAQABAQL/AeABBwEAAQEBAAEBAcABAwHAAQMBAAEBAQABAQHAAQMBgAEBAQABAQEA
AQABAQHgAQcBgAEBAQABAQEAAQEB8QGPAYABAQEAAQEBAAEBAfkBnwHAAQMBAAEBAQABAQL/AeABBwEA AQEB8QGPAYABAQEAAQEBAAEBAeABBwGAAQEBAAEBAQABAQHGAWMBgAEBAQABAQEAAQEBjgFxAYABAQEA
AQEBAAEBAv8B8AEPAYABAwEAAQEI/wIAAf4BAQL/BQABAQGIAwABwAEBAQABAQGIAQABgAEBAcABAQEA AQEBAAEBAcYBYwGAAQEBAAEBAQABAQHgAQcBgAEBAQABAQEAAQEB8QGPAYABAQEAAQEBAAEBAfkBnwHA
AQEBjwH/AYABAQHAAQEBAAEBAv8BgAEBAcABAQEAAQEC/wGAAQEBwAEBAQABAQGPAf8BgAEBAcABAQEA AQMBAAEBAQABAQL/AeABBwEAAQEBAAEBAv8B8AEPAYABAwEAAQEI/wIAAf4BAQL/BQABAQGIAwABwAEB
AQEBjAEBAYABAQHAAQEBAAEBAY8B/wGAAQEBwAEDAQABHwL/AYABAQHAAQMB8AEfAv8BgAEBAcABAwHw AQABAQGIAQABgAEBAcABAQEAAQEBjwH/AYABAQHAAQEBAAEBAv8BgAEBAcABAQEAAQEC/wGAAQEBwAEB
AR8BjwH/AYABAQHAAQMB8AEfAYwBAQGAAQEBwAEDAfABHwGPAf8BgAEBAcABAwHwAR8E/wHAAQMB8AEf AQABAQGPAf8BgAEBAcABAQEAAQEBjAEBAYABAQHAAQEBAAEBAY8B/wGAAQEBwAEDAQABHwL/AYABAQHA
BAAE/wQABP8BwAEDAcABAwT/AcABAwHAAQMBwAEDAgABwAEDAcABAwHAAQMCAAHAAQMBwAEDAfEBjwHM AQMB8AEfAv8BgAEBAcABAwHwAR8BjwH/AYABAQHAAQMB8AEfAYwBAQGAAQEBwAEDAfABHwGPAf8BgAEB
AcEBwAEDAcABAwHjAccBwAHBAcABAwHAAQMBxwHjAcAB4wHAAQMBwAEDAY8B8QHhAeMBwAEDAcABAwHH AcABAwHwAR8E/wHAAQMB8AEfBAAE/wQABP8BwAEDAcABAwT/AcABAwHAAQMBwAEDAgABwAEDAcABAwHA
AeMB4QHjAcABAwHAAQMB4wHHAeEB/wHAAQMBwAEDAfEBjwHzAf8BwAEDAcABAwH5AZ8C/wHAAQMBwAED AQMCAAHAAQMBwAEDAfEBjwHMAcEBwAEDAcABAwHjAccBwAHBAcABAwHAAQMBxwHjAcAB4wHAAQMBwAED
BP8BwAEHAcABBwT/AcABDwHAAQ8E/xAAAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED AY8B8QHhAeMBwAEDAcABAwHHAeMB4QHjAcABAwHAAQMB4wHHAeEB/wHAAQMBwAEDAfEBjwHzAf8BwAED
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED AcABAwH5AZ8C/wHAAQMBwAEDBP8BwAEHAcABBwT/AcABDwHAAQ8E/xAAAcABAwHAAQMBwAEDAcABAwHA
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAED AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
AcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABBwHAAQcBwAEHAcABBwHAAQ8BwAEP AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA
AcABDwHAAQ8L AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABBwHA
AQcBwAEHAcABBwHAAQ8BwAEPAcABDwHAAQ8L
</value> </value>
</data> </data>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -665,15 +675,15 @@
<data name="_buttonCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="_buttonCut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHASURBVDhPrZI/SEJhFMXv2yWKiP4YJIKIQzwnQQJBcBFp YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHBSURBVDhPrZI/SEJhFMXv2yWKiP4YJIKIQzwnQQJBcBFp
UFrCJmsWKTB5i2AEzjUYRdAWNUgtEQnhIAQhvJC3JC1CIeHSUlCQX/d8foaVSUMXDp/nnN+9Okj/MrFY UFrCJmsWKTB5i2AEzjUYRdAWNUgtEQnhIEQhvIi3JC1CIeHSUlCQX/d8foaVSUMXDvfdc373vjc8+peK
bD4ajerKDhxw4JXtTCKRMKBIJDLwCPouq6LOuFwuwzRNEY/HjWAw2PcIcvTgwKv4c3SElmUJ/omG1+v9 xWKz0WhUV2PfAgdeje1KJBIGFIlE+h5B3mGV1S6Xy2WYpini8bgRDAZ7HoGPHBx4ZX+WDtOyLMGfaHi9
cgQeOXq13PdLdLfbbdTrdREOhw0GJYQXHjl6cMh/G3mk0WiIQCBg2O32Bbzwf1mWM8eQx+Mxms2mCIVC 3i9HMMNHrpZ7vkR3u91GrVYT4XDYYFBC6JjhIwcH/7eSR+r1uggEAobdbp9Dx/yXZVkzDHk8HqPRaIhQ
F+VyWcAjV8jPeSSyPRAt3mvaFuu4qGmlDYfDarVaomKzWTfskaMHB16tElls7jRts+X3V1+SyadaNtsW KHRWLpcFZvgK+VmPRLYHovl7TdtgHRY1rbTmcFjNZlNUbDbrmmf4yMGBV6tEFg93mrbe9PurL8nkk5nN
+byopVLikugZn6XnHD048NiTB0yipYbPZwI6cTpvt4mq77mcOOP3nKiAFx45enDgsScPVDRtv3f5NZ0W tkQ+L25SKXFO9IxnCD5ycOCxJw+YRAt1n88EdOR03m4SVd9zOXHC/ZSogI4ZPnJw4LEnD1Q0bbd7+TWd
p/yyJIAXHnnvEezJA0WiUjWdbqN8y2TEIb9H3etq4JGjBwcee7LcIdq91vUmrh5wuf5tuTvI0YMDjz1Z FsfcWRJAxwy/+wj25IEiUekynW4hfMtkxD73g851VZjhIwcHHnsy3CLavtL1Bq7ucbj6bblT8JGDA489
uPlfWiDa4+BqmWiNo1mWizXDsrOmWU6WZ4VoFRx47HEmZ6pHk6xx1ihrmDWkNMIaY02weniiDzfL66dM Gbj5Ly0Q7bBxsUi0wtY0y8WaYtlZkywny7NEtAwOPPbYkzXRpXHWKGuYNcgaUBpijbDGWF080QcoZeub
bAjUAAAAAElFTkSuQmCC /rhQAgAAAABJRU5ErkJggg==
</value> </value>
</data> </data>
<data name="_buttonCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="_buttonCopy.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -906,6 +916,16 @@
AgAAAAkEAAAAAAAAAAEAAAAMBQAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w AgAAAAkEAAAAAAAAAAEAAAAMBQAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkHBAAAAAABAAAA LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkHBAAAAAABAAAA
AAAAAAQdU3lzdGVtLldpbmRvd3MuRm9ybXMuVHJlZU5vZGUFAAAACw== AAAAAAQdU3lzdGVtLldpbmRvd3MuRm9ybXMuVHJlZU5vZGUFAAAACw==
</value>
</data>
<data name="_buttonAddTagLongArray.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADxSURBVDhPYxi+IIyRkXEalM0AZYdBeIRBBFDDTCAtBuGC
gRhULALCxQ2igArnAGnx1Om338/c9XQ/RBgMxKFyURAuJogBKlgApMVBnPiJV/9N3fEI2QAQABkCUhMD
4SKAAVBiD4iGcBkYwjvP/pu0+e4+KBcZYKiFgUSgxEogLQni+Dce/de7/uZeEBsJSELVJEK4mCAZqGAd
kJb0qN73D4yr9v0umnVuHkgMKpcMUogPpAMVbgPS0hAuGEhDxdIhXOyABYh5gRgUiI1AfByI+YCYH8pu
AGIJKB+kFgMgGwAKBxEghhkgDBXDa8CQBAwMAHEvNbCJ+DaqAAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Windows.Forms; using System.Windows.Forms;
using NBTModel.Interop;
using Substrate.Nbt; using Substrate.Nbt;
namespace NBTExplorer.Windows namespace NBTExplorer.Windows

View file

@ -1,8 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
using System.Windows.Forms; using System.Windows.Forms;
using NBTExplorer.Model;
namespace NBTExplorer.Windows namespace NBTExplorer.Windows
{ {

View file

@ -0,0 +1,44 @@
using System;
using System.Text.RegularExpressions;
using Substrate.Core;
namespace NBTExplorer.Model
{
public class CubicRegionFile : RegionFile
{
private static Regex _namePattern = new Regex("r2\\.(-?[0-9]+)\\.(-?[0-9]+)\\.(-?[0-9]+)\\.mc[ar]$");
private const int _sectorBytes = 256;
private static byte[] _emptySector = new byte[_sectorBytes];
public CubicRegionFile (string path)
: base(path)
{ }
protected override int SectorBytes
{
get { return _sectorBytes; }
}
protected override byte[] EmptySector
{
get { return _emptySector; }
}
public override RegionKey parseCoordinatesFromName ()
{
int x = 0;
int z = 0;
Match match = _namePattern.Match(fileName);
if (!match.Success) {
return RegionKey.InvalidRegion;
}
x = Convert.ToInt32(match.Groups[1].Value);
z = Convert.ToInt32(match.Groups[3].Value);
return new RegionKey(x, z);
}
}
}

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using NBTExplorer.Utility;
namespace NBTExplorer.Model namespace NBTExplorer.Model
{ {

View file

@ -0,0 +1,66 @@
using System;
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class ListTagContainer : IOrderedTagContainer
{
private TagNodeList _tag;
private Action<bool> _modifyHandler;
public ListTagContainer (TagNodeList tag, Action<bool> modifyHandler)
{
_tag = tag;
}
public int TagCount
{
get { return _tag.Count; }
}
public bool DeleteTag (TagNode tag)
{
bool result = _tag.Remove(tag);
if (result)
SetModified();
return result;
}
public int GetTagIndex (TagNode tag)
{
return _tag.IndexOf(tag);
}
public bool InsertTag (TagNode tag, int index)
{
if (index < 0 || index > _tag.Count)
return false;
if (_tag.ValueType != tag.GetTagType())
return false;
_tag.Insert(index, tag);
SetModified();
return true;
}
public bool AppendTag (TagNode tag)
{
if (_tag.ValueType != tag.GetTagType())
return false;
_tag.Add(tag);
SetModified();
return true;
}
private void SetModified ()
{
if (_modifyHandler != null)
_modifyHandler(true);
}
}
}

View file

@ -1,6 +1,7 @@
using System.IO; using System.IO;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Collections.Generic; using System.Collections.Generic;
using NBTModel.Interop;
namespace NBTExplorer.Model namespace NBTExplorer.Model
{ {
@ -90,7 +91,7 @@ namespace NBTExplorer.Model
Release(); Release();
RestoreExpandSet(this, expandSet); RestoreExpandSet(this, expandSet);
return true; return expandSet != null;
} }
} }
} }

View file

@ -65,6 +65,11 @@ namespace NBTExplorer.Model
internal set { _parent = value; } internal set { _parent = value; }
} }
public DataNode Root
{
get { return (_parent == null) ? this : _parent.Root; }
}
public DataNodeCollection Nodes public DataNodeCollection Nodes
{ {
get { return _children; } get { return _children; }
@ -214,10 +219,7 @@ namespace NBTExplorer.Model
foreach (DataNode child in node.Nodes) { foreach (DataNode child in node.Nodes) {
Dictionary<string, object> childDict = BuildExpandSet(child); Dictionary<string, object> childDict = BuildExpandSet(child);
if (childDict != null) { if (childDict != null) {
if (!String.IsNullOrEmpty(child.NodeName)) dict[child.NodePathName] = childDict;
dict[child.NodeName] = childDict;
else
dict[child.NodeDisplay] = childDict;
} }
} }
@ -226,16 +228,14 @@ namespace NBTExplorer.Model
protected void RestoreExpandSet (DataNode node, Dictionary<string, object> expandSet) protected void RestoreExpandSet (DataNode node, Dictionary<string, object> expandSet)
{ {
if (expandSet == null)
return;
node.Expand(); node.Expand();
foreach (DataNode child in node.Nodes) { foreach (DataNode child in node.Nodes) {
if (expandSet.ContainsKey(child.NodeName)) { if (expandSet.ContainsKey(child.NodePathName)) {
Dictionary<string, object> childDict = (Dictionary<string, object>)expandSet[child.NodeName]; Dictionary<string, object> childDict = (Dictionary<string, object>)expandSet[child.NodePathName];
if (childDict != null)
RestoreExpandSet(child, childDict);
}
else if (expandSet.ContainsKey(child.NodeDisplay)) {
Dictionary<string, object> childDict = (Dictionary<string, object>)expandSet[child.NodeDisplay];
if (childDict != null) if (childDict != null)
RestoreExpandSet(child, childDict); RestoreExpandSet(child, childDict);
} }

View file

@ -22,13 +22,18 @@ namespace NBTExplorer.Model
} }
} }
public string NodeDirPath
{
get { return _path; }
}
public override string NodePathName public override string NodePathName
{ {
get get
{ {
string path = (_path.EndsWith("/") || _path.EndsWith("\\")) ? _path : _path + '/'; string path = (_path.EndsWith("/") || _path.EndsWith("\\")) ? _path : _path + '/';
string name = Path.GetDirectoryName(path); string name = Path.GetDirectoryName(path) ?? path.Substring(0, path.Length - 1);
int sepIndex = Math.Max(name.LastIndexOf('/'), name.LastIndexOf('\\')); int sepIndex = Math.Max(name.LastIndexOf('/'), name.LastIndexOf('\\'));
return (sepIndex > 0) ? name.Substring(sepIndex + 1) : name; return (sepIndex > 0) ? name.Substring(sepIndex + 1) : name;
@ -79,7 +84,7 @@ namespace NBTExplorer.Model
Release(); Release();
RestoreExpandSet(this, expandSet); RestoreExpandSet(this, expandSet);
return true; return expandSet != null;
} }
} }
} }

View file

@ -4,6 +4,7 @@ using Substrate.Core;
using Substrate.Nbt; using Substrate.Nbt;
using System.Collections.Generic; using System.Collections.Generic;
using System; using System;
using NBTModel.Interop;
namespace NBTExplorer.Model namespace NBTExplorer.Model
{ {
@ -15,7 +16,7 @@ namespace NBTExplorer.Model
private CompoundTagContainer _container; private CompoundTagContainer _container;
private static Regex _namePattern = new Regex(@"\.(dat|nbt|schematic)$"); private static Regex _namePattern = new Regex(@"\.(dat|nbt|schematic|dat_mcr|dat_old|bpt|rc)$");
private NbtFileDataNode (string path, CompressionType compressionType) private NbtFileDataNode (string path, CompressionType compressionType)
{ {
@ -144,7 +145,7 @@ namespace NBTExplorer.Model
Release(); Release();
RestoreExpandSet(this, expandSet); RestoreExpandSet(this, expandSet);
return true; return expandSet != null;
} }
public override bool CanRenameNode public override bool CanRenameNode

View file

@ -31,13 +31,19 @@ namespace NBTExplorer.Model
get { return _z; } get { return _z; }
} }
protected RegionFileDataNode RegionParent
{
get { return Parent as RegionFileDataNode; }
}
protected override NodeCapabilities Capabilities protected override NodeCapabilities Capabilities
{ {
get get
{ {
return NodeCapabilities.CreateTag return NodeCapabilities.CreateTag
| NodeCapabilities.PasteInto | NodeCapabilities.PasteInto
| NodeCapabilities.Search; | NodeCapabilities.Search
| NodeCapabilities.Delete;
} }
} }
@ -53,7 +59,15 @@ namespace NBTExplorer.Model
public override string NodeDisplay public override string NodeDisplay
{ {
get { return "Chunk [" + _x + ", " + _z + "]"; } get
{
RegionKey key = _regionFile.parseCoordinatesFromName();
string absChunk = "";
if (key != RegionKey.InvalidRegion)
absChunk = " in world at (" + (key.X * 32 + _x) + ", " + (key.Z * 32 + _z) + ")";
return "Chunk [" + _x + ", " + _z + "]" + absChunk;
}
} }
protected override void ExpandCore () protected override void ExpandCore ()
@ -91,6 +105,17 @@ namespace NBTExplorer.Model
get { return true; } get { return true; }
} }
public override bool DeleteNode ()
{
if (CanDeleteNode && _regionFile.HasChunk(_x, _z)) {
RegionParent.QueueDeleteChunk(_x, _z);
IsParentModified = true;
return Parent.Nodes.Remove(this);
}
return false;
}
public bool IsNamedContainer public bool IsNamedContainer
{ {
get { return true; } get { return true; }

View file

@ -2,6 +2,8 @@
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Substrate.Core; using Substrate.Core;
using System.Collections.Generic; using System.Collections.Generic;
using NBTModel.Interop;
using System;
namespace NBTExplorer.Model namespace NBTExplorer.Model
{ {
@ -9,6 +11,7 @@ namespace NBTExplorer.Model
{ {
private string _path; private string _path;
private RegionFile _region; private RegionFile _region;
private List<RegionKey> _deleteQueue = new List<RegionKey>();
private static Regex _namePattern = new Regex(@"^r\.(-?\d+)\.(-?\d+)\.(mcr|mca)$"); private static Regex _namePattern = new Regex(@"^r\.(-?\d+)\.(-?\d+)\.(mcr|mca)$");
@ -85,7 +88,7 @@ namespace NBTExplorer.Model
} }
} }
} }
catch { catch (Exception e) {
if (FormRegistry.MessageBox != null) if (FormRegistry.MessageBox != null)
FormRegistry.MessageBox("Not a valid region file."); FormRegistry.MessageBox("Not a valid region file.");
} }
@ -99,13 +102,30 @@ namespace NBTExplorer.Model
Nodes.Clear(); Nodes.Clear();
} }
protected override void SaveCore ()
{
foreach (RegionKey key in _deleteQueue) {
if (_region.HasChunk(key.X, key.Z))
_region.DeleteChunk(key.X, key.Z);
}
_deleteQueue.Clear();
}
public override bool RefreshNode () public override bool RefreshNode ()
{ {
Dictionary<string, object> expandSet = BuildExpandSet(this); Dictionary<string, object> expandSet = BuildExpandSet(this);
Release(); Release();
RestoreExpandSet(this, expandSet); RestoreExpandSet(this, expandSet);
return true; return expandSet != null;
}
public void QueueDeleteChunk (int rx, int rz)
{
RegionKey key = new RegionKey(rx, rz);
if (!_deleteQueue.Contains(key))
_deleteQueue.Add(key);
} }
} }
} }

View file

@ -13,6 +13,18 @@ namespace NBTExplorer.Model
get { return base.Tag as TagNodeByte; } get { return base.Tag as TagNodeByte; }
} }
public override bool Parse (string value)
{
byte data;
if (!byte.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode () public override bool EditNode ()
{ {
return EditScalarValue(Tag); return EditScalarValue(Tag);

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using NBTModel.Interop;
using Substrate.Nbt; using Substrate.Nbt;
namespace NBTExplorer.Model namespace NBTExplorer.Model

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using NBTModel.Interop;
using Substrate.Nbt; using Substrate.Nbt;
namespace NBTExplorer.Model namespace NBTExplorer.Model
@ -44,6 +45,9 @@ namespace NBTExplorer.Model
return false; return false;
} }
public virtual void Clear ()
{ }
#endregion #endregion
protected override NodeCapabilities Capabilities protected override NodeCapabilities Capabilities
@ -91,7 +95,9 @@ namespace NBTExplorer.Model
_tagRegistry[TagType.TAG_INT_ARRAY] = typeof(TagIntArrayDataNode); _tagRegistry[TagType.TAG_INT_ARRAY] = typeof(TagIntArrayDataNode);
_tagRegistry[TagType.TAG_LIST] = typeof(TagListDataNode); _tagRegistry[TagType.TAG_LIST] = typeof(TagListDataNode);
_tagRegistry[TagType.TAG_LONG] = typeof(TagLongDataNode); _tagRegistry[TagType.TAG_LONG] = typeof(TagLongDataNode);
_tagRegistry[TagType.TAG_LONG_ARRAY] = typeof(TagLongArrayDataNode);
_tagRegistry[TagType.TAG_SHORT] = typeof(TagShortDataNode); _tagRegistry[TagType.TAG_SHORT] = typeof(TagShortDataNode);
_tagRegistry[TagType.TAG_SHORT_ARRAY] = typeof(TagShortArrayDataNode);
_tagRegistry[TagType.TAG_STRING] = typeof(TagStringDataNode); _tagRegistry[TagType.TAG_STRING] = typeof(TagStringDataNode);
} }
@ -124,8 +130,12 @@ namespace NBTExplorer.Model
return new TagNodeList(TagType.TAG_BYTE); return new TagNodeList(TagType.TAG_BYTE);
case TagType.TAG_LONG: case TagType.TAG_LONG:
return new TagNodeLong(0); return new TagNodeLong(0);
case TagType.TAG_LONG_ARRAY:
return new TagNodeLongArray(new long[0]);
case TagType.TAG_SHORT: case TagType.TAG_SHORT:
return new TagNodeShort(0); return new TagNodeShort(0);
case TagType.TAG_SHORT_ARRAY:
return new TagNodeShortArray(new short[0]);
case TagType.TAG_STRING: case TagType.TAG_STRING:
return new TagNodeString(""); return new TagNodeString("");
default: default:
@ -155,6 +165,11 @@ namespace NBTExplorer.Model
} }
} }
public virtual bool Parse (string value)
{
return false;
}
protected override NodeCapabilities Capabilities protected override NodeCapabilities Capabilities
{ {
get get
@ -348,6 +363,36 @@ namespace NBTExplorer.Model
return false; return false;
} }
protected bool EditShortHexValue (TagNode tag)
{
if (FormRegistry.EditByteArray != null) {
TagNodeShortArray iatag = tag.ToTagShortArray();
byte[] byteData = new byte[iatag.Length * 2];
for (int i = 0; i < iatag.Length; i++) {
byte[] buf = BitConverter.GetBytes(iatag.Data[i]);
Array.Copy(buf, 0, byteData, 2 * i, 2);
}
ByteArrayFormData data = new ByteArrayFormData() {
NodeName = NodeName,
BytesPerElement = 2,
Data = byteData,
};
if (FormRegistry.EditByteArray(data)) {
iatag.Data = new short[data.Data.Length / 2];
for (int i = 0; i < iatag.Length; i++) {
iatag.Data[i] = BitConverter.ToInt16(data.Data, i * 2);
}
IsDataModified = true;
return true;
}
}
return false;
}
protected bool EditIntHexValue (TagNode tag) protected bool EditIntHexValue (TagNode tag)
{ {
if (FormRegistry.EditByteArray != null) { if (FormRegistry.EditByteArray != null) {
@ -378,6 +423,41 @@ namespace NBTExplorer.Model
return false; return false;
} }
protected bool EditLongHexValue(TagNode tag)
{
if (FormRegistry.EditByteArray != null)
{
TagNodeLongArray latag = tag.ToTagLongArray();
byte[] byteData = new byte[latag.Length * 8];
for (int i = 0; i < latag.Length; i++)
{
byte[] buf = BitConverter.GetBytes(latag.Data[i]);
Array.Copy(buf, 0, byteData, 8 * i, 8);
}
ByteArrayFormData data = new ByteArrayFormData()
{
NodeName = NodeName,
BytesPerElement = 8,
Data = byteData,
};
if (FormRegistry.EditByteArray(data))
{
latag.Data = new long[data.Data.Length / 8];
for (int i = 0; i < latag.Length; i++)
{
latag.Data[i] = BitConverter.ToInt64(data.Data, i * 8);
}
IsDataModified = true;
return true;
}
}
return false;
}
public virtual void SyncTag () public virtual void SyncTag ()
{ {
} }

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagDoubleDataNode : TagDataNode
{
public TagDoubleDataNode (TagNodeDouble tag)
: base(tag)
{ }
protected new TagNodeDouble Tag
{
get { return base.Tag as TagNodeDouble; }
}
public override bool Parse (string value)
{
double data;
if (!double.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagFloatDataNode : TagDataNode
{
public TagFloatDataNode (TagNodeFloat tag)
: base(tag)
{ }
protected new TagNodeFloat Tag
{
get { return base.Tag as TagNodeFloat; }
}
public override bool Parse (string value)
{
float data;
if (!float.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagIntDataNode : TagDataNode
{
public TagIntDataNode (TagNodeInt tag)
: base(tag)
{ }
protected new TagNodeInt Tag
{
get { return base.Tag as TagNodeInt; }
}
public override bool Parse (string value)
{
int data;
if (!int.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,4 +1,5 @@
using System; using System;
using NBTModel.Interop;
using Substrate.Nbt; using Substrate.Nbt;
namespace NBTExplorer.Model namespace NBTExplorer.Model
@ -10,10 +11,10 @@ namespace NBTExplorer.Model
public TagListDataNode (TagNodeList tag) public TagListDataNode (TagNodeList tag)
: base(tag) : base(tag)
{ {
_container = new ListTagContainer(tag); _container = new ListTagContainer(tag, res => IsDataModified = true);
} }
protected new TagNodeList Tag public new TagNodeList Tag
{ {
get { return base.Tag as TagNodeList; } get { return base.Tag as TagNodeList; }
set { base.Tag = value; } set { base.Tag = value; }
@ -45,7 +46,7 @@ namespace NBTExplorer.Model
if (data == null) if (data == null)
return false; return false;
if (data.Node != null && data.Node.GetTagType() == Tag.ValueType) if (data.Node != null && (data.Node.GetTagType() == Tag.ValueType || Tag.Count == 0))
return true; return true;
} }
@ -75,6 +76,10 @@ namespace NBTExplorer.Model
if (clipboard == null || clipboard.Node == null) if (clipboard == null || clipboard.Node == null)
return false; return false;
if (Tag.Count == 0) {
Tag.ChangeValueType(clipboard.Node.GetTagType());
}
AppendTag(clipboard.Node); AppendTag(clipboard.Node);
return true; return true;
} }
@ -99,8 +104,22 @@ namespace NBTExplorer.Model
return _container.DeleteTag(tag); return _container.DeleteTag(tag);
} }
private void AppendTag (TagNode tag) public override void Clear ()
{ {
if (TagCount == 0)
return;
Nodes.Clear();
Tag.Clear();
IsDataModified = true;
}
public bool AppendTag (TagNode tag)
{
if (tag == null || !CanCreateTag(tag.GetTagType()))
return false;
_container.InsertTag(tag, _container.TagCount); _container.InsertTag(tag, _container.TagCount);
IsDataModified = true; IsDataModified = true;
@ -109,6 +128,8 @@ namespace NBTExplorer.Model
if (node != null) if (node != null)
Nodes.Add(node); Nodes.Add(node);
} }
return true;
} }
} }
} }

View file

@ -0,0 +1,36 @@
using System;
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagLongArrayDataNode : TagDataNode
{
public TagLongArrayDataNode(TagNodeLongArray tag)
: base(tag)
{ }
protected new TagNodeLongArray Tag
{
get { return base.Tag as TagNodeLongArray; }
}
public override bool CanEditNode
{
#if WINDOWS
get { return true; }
#else
get { return false; }
#endif
}
public override bool EditNode()
{
return EditLongHexValue(Tag);
}
public override string NodeDisplay
{
get { return NodeDisplayPrefix + Tag.Data.Length + " long integers"; }
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagLongDataNode : TagDataNode
{
public TagLongDataNode (TagNodeLong tag)
: base(tag)
{ }
protected new TagNodeLong Tag
{
get { return base.Tag as TagNodeLong; }
}
public override bool Parse (string value)
{
long data;
if (!long.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -0,0 +1,36 @@
using System;
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagShortArrayDataNode : TagDataNode
{
public TagShortArrayDataNode (TagNodeShortArray tag)
: base(tag)
{ }
protected new TagNodeShortArray Tag
{
get { return base.Tag as TagNodeShortArray; }
}
public override bool CanEditNode
{
#if WINDOWS
get { return true; }
#else
get { return false; }
#endif
}
public override bool EditNode ()
{
return EditShortHexValue(Tag);
}
public override string NodeDisplay
{
get { return NodeDisplayPrefix + Tag.Data.Length + " shorts"; }
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagShortDataNode : TagDataNode
{
public TagShortDataNode (TagNodeShort tag)
: base(tag)
{ }
protected new TagNodeShort Tag
{
get { return base.Tag as TagNodeShort; }
}
public override bool Parse (string value)
{
short data;
if (!short.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -8,6 +8,19 @@ namespace NBTExplorer.Model
: base(tag) : base(tag)
{ } { }
protected new TagNodeString Tag
{
get { return base.Tag as TagNodeString; }
}
public override bool Parse (string value)
{
Tag.Data = value;
IsDataModified = true;
return true;
}
public override bool EditNode () public override bool EditNode ()
{ {
return EditStringValue(Tag); return EditStringValue(Tag);

View file

@ -36,5 +36,6 @@ namespace NBTExplorer.Model
{ {
int GetTagIndex (TagNode tag); int GetTagIndex (TagNode tag);
bool InsertTag (TagNode tag, int index); bool InsertTag (TagNode tag, int index);
bool AppendTag (TagNode tag);
} }
} }

View file

@ -22,7 +22,7 @@ namespace NBTExplorer.Model
if (typeDiff != 0) if (typeDiff != 0)
return typeDiff; return typeDiff;
return String.Compare(x.Name, y.Name, true); return String.Compare(x.Name, y.Name, false);
} }
#endregion #endregion

View file

@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NBTExplorer.Model
{
class FilterExpressionParser
{
private Stack<string> argStack = new Stack<string>();
/*public bool Parse (DataNode targetNode, List<string> tokens)
{
Queue<string> tokenQueue = new Queue<string>(FilterExpressionConverter.Convert(tokens));
while (tokenQueue.Count > 0) {
string token = tokenQueue.Dequeue();
switch (token) {
case "equal":
}
}
}*/
}
static class FilterExpressionConverter
{
private static List<List<string>> OperatorGroups = new List<List<string>> {
new List<string> { "equal", "greater", "less", "contains", "begins", "ends" },
new List<string> { "not" },
new List<string> { "and", "or" },
};
public static List<string> Convert (List<string> tokens)
{
Queue<string> tokenQueue = new Queue<string>(tokens);
List<string> output = new List<string>();
Stack<string> opStack = new Stack<string>();
while (tokenQueue.Count > 0) {
string token = tokenQueue.Dequeue();
if (IsGroupStart(token)) {
opStack.Push(token);
}
else if (IsGroupEnd(token)) {
while (opStack.Count > 0 && !IsGroupStart(opStack.Peek()))
output.Add(opStack.Pop());
if (opStack.Count == 0)
throw new Exception("Mismatched grouping");
opStack.Pop();
}
else if (IsOperator(token)) {
while (opStack.Count > 0 && IsOperator(opStack.Peek())) {
if (Precedence(token) > Precedence(opStack.Peek()))
output.Add(opStack.Pop());
}
opStack.Push(token);
}
else {
output.Add(token);
}
}
while (opStack.Count > 0) {
if (IsGroupStart(opStack.Peek()))
throw new Exception("Mismatched grouping");
output.Add(opStack.Pop());
}
return output;
}
private static bool IsGroupStart (string token)
{
return token == "(";
}
private static bool IsGroupEnd (string token)
{
return token == ")";
}
private static bool IsOperator (string token)
{
foreach (var group in OperatorGroups) {
if (group.Contains(token))
return true;
}
return false;
}
private static int Precedence (string op) {
for (int i = 0; i < OperatorGroups.Count; i++) {
if (OperatorGroups[i].Contains(op))
return i;
}
return int.MaxValue;
}
}
}

View file

@ -2,7 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Substrate.Nbt; using Substrate.Nbt;
namespace NBTExplorer namespace NBTModel.Interop
{ {
public static class FormRegistry public static class FormRegistry
{ {

View file

@ -1,6 +1,6 @@
using System; using System;
namespace NBTExplorer namespace NBTModel.Interop
{ {
public static class NbtClipboardController public static class NbtClipboardController
{ {

View file

@ -2,7 +2,7 @@
using System.IO; using System.IO;
using Substrate.Nbt; using Substrate.Nbt;
namespace NBTExplorer namespace NBTModel.Interop
{ {
public class NbtClipboardData public class NbtClipboardData
{ {

88
NBTModel/NBTModel.csproj Normal file
View file

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NBTExplorer.Model</RootNamespace>
<AssemblyName>NBTModel</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG;WINDOWS</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;WINDOWS</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Substrate">
<HintPath>..\References\Substrate.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Data\CompoundTagContainer.cs" />
<Compile Include="Data\Nodes\CubicRegionDataNode.cs" />
<Compile Include="Data\CubicRegionFile.cs" />
<Compile Include="Data\Nodes\DataNode.cs" />
<Compile Include="Data\DataNodeCollection.cs" />
<Compile Include="Data\Nodes\DirectoryDataNode.cs" />
<Compile Include="Data\FileTypeRegistry.cs" />
<Compile Include="Data\Nodes\TagLongArrayDataNode.cs" />
<Compile Include="Data\Nodes\TagShortArrayDataNode.cs" />
<Compile Include="FilterExpressionParser.cs" />
<Compile Include="Interop\FormRegistry.cs" />
<Compile Include="Interop\NbtClipboardController.cs" />
<Compile Include="Interop\NbtClipboardData.cs" />
<Compile Include="Data\ListTagContainer.cs" />
<Compile Include="Data\Nodes\NbtFileDataNode.cs" />
<Compile Include="Data\Nodes\NodeCapabilities.cs" />
<Compile Include="NbtPath.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Data\Nodes\RegionChunkDataNode.cs" />
<Compile Include="Data\Nodes\RegionFileDataNode.cs" />
<Compile Include="Search\SearchRule.cs" />
<Compile Include="Data\Nodes\TagByteArrayDataNode.cs" />
<Compile Include="Data\Nodes\TagByteDataNode.cs" />
<Compile Include="Data\Nodes\TagCompoundDataNode.cs" />
<Compile Include="Data\TagContainerInterface.cs" />
<Compile Include="Data\Nodes\TagDataNode.cs" />
<Compile Include="Data\Nodes\TagDoubleDataNode.cs" />
<Compile Include="Data\Nodes\TagFloatDataNode.cs" />
<Compile Include="Data\Nodes\TagIntArrayDataNode.cs" />
<Compile Include="Data\Nodes\TagIntDataNode.cs" />
<Compile Include="Data\TagKey.cs" />
<Compile Include="Data\Nodes\TagListDataNode.cs" />
<Compile Include="Data\Nodes\TagLongDataNode.cs" />
<Compile Include="Data\Nodes\TagShortDataNode.cs" />
<Compile Include="Data\Nodes\TagStringDataNode.cs" />
<Compile Include="Utility\NaturalComparer.cs" />
<Compile Include="Utility\SnapshotList.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

147
NBTModel/NbtPath.cs Normal file
View file

@ -0,0 +1,147 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
namespace NBTExplorer.Model
{
public class NbtPathEnumerator : IEnumerable<DataNode>
{
private class PathPartDesc
{
public string Name;
public DataNode Node;
}
private string _pathRoot;
private List<string> _pathParts = new List<string>();
public NbtPathEnumerator (string path)
{
_pathRoot = Path.GetPathRoot(path);
_pathParts = new List<string>(path.Substring(_pathRoot.Length).Split('/', '\\'));
if (string.IsNullOrEmpty(_pathRoot))
_pathRoot = Directory.GetCurrentDirectory();
}
public IEnumerator<DataNode> GetEnumerator ()
{
DataNode dataNode = new DirectoryDataNode(_pathRoot);
dataNode.Expand();
foreach (DataNode childNode in EnumerateNodes(dataNode, _pathParts))
yield return childNode;
}
IEnumerator IEnumerable.GetEnumerator ()
{
return GetEnumerator();
}
private IEnumerable<DataNode> EnumerateNodes (DataNode containerNode, List<string> nextLevels)
{
containerNode.Expand();
if (nextLevels.Count == 0) {
yield return containerNode;
yield break;
}
if (containerNode.Nodes.Count == 0)
yield break;
string part = nextLevels[0];
List<string> remainingLevels = nextLevels.GetRange(1, nextLevels.Count - 1);
if (part == "*") {
foreach (DataNode childNode in containerNode.Nodes) {
foreach (DataNode grandChildNode in EnumerateNodes(childNode, remainingLevels))
yield return grandChildNode;
}
}
else if (part == "**") {
foreach (DataNode childNode in containerNode.Nodes) {
foreach (DataNode grandChildNode in EnumerateNodes(childNode, remainingLevels))
yield return grandChildNode;
foreach (DataNode grandChildNode in EnumerateNodes(childNode, nextLevels))
yield return grandChildNode;
}
}
else {
foreach (var childNode in containerNode.Nodes) {
if (childNode.NodePathName == part) {
foreach (DataNode grandChildNode in EnumerateNodes(childNode, remainingLevels))
yield return grandChildNode;
}
}
}
}
}
public class NbtPath
{
private class PathPart
{
public string Name;
public DataNode Node;
}
//private List<PathPart> _pathParts = new List<PathPart>();
private List<DataNode> _nodes;
internal NbtPath (List<DataNode> nodes)
{
_nodes = nodes;
}
/*public NbtPath (string path)
{
Path = path;
string[] parts = path.Split('/', '\\');
foreach (var p in parts) {
_pathParts.Add(new PathPart() {
Name = p,
});
}
}
public string Path { get; private set; }
public DataNode RootNode
{
get { return (_pathParts.Count == 0) ? null : _pathParts[0].Node; }
}
public DataNode TargetNode
{
get { return (_pathParts.Count == 0) ? null : _pathParts[_pathParts.Count - 1].Node; }
}
public DataNode Open ()
{
DataNode dataNode = new DirectoryDataNode(Directory.GetCurrentDirectory());
dataNode.Expand();
foreach (var part in _pathParts) {
DataNode match = null;
foreach (var child in dataNode.Nodes) {
if (child.NodePathName == part.Name)
match = child;
}
if (match == null)
return null;
part.Node = match;
dataNode = match;
dataNode.Expand();
}
return dataNode;
}*/
}
}

View file

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("NBTModel")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NBTModel")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("0dd78c98-e4af-4898-a0f5-4ea5675933c8")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.0.0")]
[assembly: AssemblyFileVersion("1.1.0.0")]

View file

@ -169,8 +169,9 @@ namespace NBTExplorer.Model.Search
{ {
TagDataNode childNode = GetChild(container, Name); TagDataNode childNode = GetChild(container, Name);
T data = LookupTag<T>(container, Name); T data = LookupTag<T>(container, Name);
if (data == null)
return false;
if (data != null) {
switch (Operator) { switch (Operator) {
case NumericOperator.Equals: case NumericOperator.Equals:
if (data.ToTagLong() != Value) if (data.ToTagLong() != Value)
@ -188,7 +189,10 @@ namespace NBTExplorer.Model.Search
if (data.ToTagLong() >= Value) if (data.ToTagLong() >= Value)
return false; return false;
break; break;
} case NumericOperator.Any:
break;
default:
return false;
} }
if (!matchedNodes.Contains(childNode)) if (!matchedNodes.Contains(childNode))
@ -226,8 +230,9 @@ namespace NBTExplorer.Model.Search
{ {
TagDataNode childNode = GetChild(container, Name); TagDataNode childNode = GetChild(container, Name);
T data = LookupTag<T>(container, Name); T data = LookupTag<T>(container, Name);
if (data == null)
return false;
if (data != null) {
switch (Operator) { switch (Operator) {
case NumericOperator.Equals: case NumericOperator.Equals:
if (data.ToTagDouble() != Value) if (data.ToTagDouble() != Value)
@ -245,7 +250,10 @@ namespace NBTExplorer.Model.Search
if (data.ToTagDouble() >= Value) if (data.ToTagDouble() >= Value)
return false; return false;
break; break;
} case NumericOperator.Any:
break;
default:
return false;
} }
if (!matchedNodes.Contains(childNode)) if (!matchedNodes.Contains(childNode))
@ -276,8 +284,9 @@ namespace NBTExplorer.Model.Search
{ {
TagDataNode childNode = GetChild(container, Name); TagDataNode childNode = GetChild(container, Name);
TagNodeString data = LookupTag<TagNodeString>(container, Name); TagNodeString data = LookupTag<TagNodeString>(container, Name);
if (data == null)
return false;
if (data != null) {
switch (Operator) { switch (Operator) {
case StringOperator.Equals: case StringOperator.Equals:
if (data.ToTagString().Data != Value) if (data.ToTagString().Data != Value)
@ -303,7 +312,10 @@ namespace NBTExplorer.Model.Search
if (!data.ToTagString().Data.EndsWith(Value)) if (!data.ToTagString().Data.EndsWith(Value))
return false; return false;
break; break;
} case StringOperator.Any:
break;
default:
return false;
} }
if (!matchedNodes.Contains(childNode)) if (!matchedNodes.Contains(childNode))

View file

@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace NBTExplorer.Utility
{
// NaturalComparer implementation by Justin.Jones
// Licensed under The Code Project Open License (CPOL) (http://www.codeproject.com/info/cpol10.aspx)
public class NaturalComparer : Comparer<string>, IDisposable
{
private Dictionary<string, string[]> table;
public NaturalComparer ()
{
table = new Dictionary<string, string[]>();
}
public void Dispose ()
{
table.Clear();
table = null;
}
public override int Compare (string x, string y)
{
if (x == y) {
return 0;
}
string[] x1, y1;
if (!table.TryGetValue(x, out x1)) {
x1 = Regex.Split(x.Replace(" ", ""), "(-?[0-9]+)");
table.Add(x, x1);
}
if (!table.TryGetValue(y, out y1)) {
y1 = Regex.Split(y.Replace(" ", ""), "(-?[0-9]+)");
table.Add(y, y1);
}
for (int i = 0; i < x1.Length && i < y1.Length; i++) {
if (x1[i] != y1[i]) {
return PartCompare(x1[i], y1[i]);
}
}
if (y1.Length > x1.Length) {
return 1;
}
else if (x1.Length > y1.Length) {
return -1;
}
else {
return 0;
}
}
private static int PartCompare (string left, string right)
{
int x, y;
if (!int.TryParse(left, out x)) {
return left.CompareTo(right);
}
if (!int.TryParse(right, out y)) {
return left.CompareTo(right);
}
return x.CompareTo(y);
}
}
}

View file

@ -4,7 +4,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Text; using System.Text;
namespace NBTExplorer namespace NBTExplorer.Utility
{ {
public class SnapshotState<T> : IDisposable public class SnapshotState<T> : IDisposable
{ {

6
NBTUtil/App.config Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/></startup>
</configuration>

81
NBTUtil/ConsoleOptions.cs Normal file
View file

@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.Text;
using NDesk.Options;
namespace NBTUtil
{
public enum ConsoleCommand
{
None,
Print,
PrintTree,
SetValue,
SetList,
Json,
Help,
}
class ConsoleOptions
{
private OptionSet _options;
private string _currentKey;
//public string FilePath { get; private set; }
//public string TagPath { get; private set; }
public string Path { get; private set; }
public ConsoleCommand Command { get; private set; }
public List<string> Values { get; private set; }
public bool ShowTypes { get; private set; }
public ConsoleOptions ()
{
Command = ConsoleCommand.None;
Values = new List<string>();
_options = new OptionSet() {
{ "path=", "Path to NBT tag from current directory", v => Path = v },
{ "print", "Print the value(s) of a tag", v => Command = ConsoleCommand.Print },
{ "printtree", "Print the NBT tree rooted at a tag", v => Command = ConsoleCommand.PrintTree },
{ "types", "Show data types when printing tags", v => ShowTypes = true },
{ "json=", "Export the NBT tree rooted at a tag as JSON", v => {
Command = ConsoleCommand.Json;
Values.Add(v);
}},
{ "setvalue=", "Set a single tag value", v => {
Command = ConsoleCommand.SetValue;
_currentKey = "setvalue";
if (!string.IsNullOrEmpty(v))
Values.Add(v);
}},
{ "setlist=", "Replace a list tag's contents with one or more values.", v => {
Command = ConsoleCommand.SetList;
_currentKey = "setlist";
if (!string.IsNullOrEmpty(v))
Values.Add(v);
}},
{ "help", "Print this help message", v => Command = ConsoleCommand.Help },
{ "<>", v => {
switch (_currentKey) {
case "setvalue":
case "setlist":
Values.Add(v);
break;
}
}},
};
}
public void Parse (string[] args)
{
_options.Parse(args);
}
public void PrintUsage ()
{
Console.WriteLine("Program Options:");
_options.WriteOptionDescriptions(Console.Out);
}
}
}

130
NBTUtil/ConsoleRunner.cs Normal file
View file

@ -0,0 +1,130 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using NBTExplorer.Model;
using NBTUtil.Ops;
using Substrate.Nbt;
namespace NBTUtil
{
class ConsoleRunner
{
private static readonly Dictionary<ConsoleCommand, ConsoleOperation> _commandTable = new Dictionary<ConsoleCommand, ConsoleOperation>() {
{ ConsoleCommand.SetValue, new EditOperation() },
{ ConsoleCommand.SetList, new SetListOperation() },
{ ConsoleCommand.Print, new PrintOperation() },
{ ConsoleCommand.PrintTree, new PrintTreeOperation() },
{ ConsoleCommand.Json, new JsonOperation() },
};
private ConsoleOptions _options;
public ConsoleRunner ()
{
_options = new ConsoleOptions();
}
public bool Run (string[] args)
{
_options.Parse(args);
if (_options.Command == ConsoleCommand.Help)
return PrintHelp();
if (_options.Path == null)
return PrintUsage("Error: You must specify a path");
if (!_commandTable.ContainsKey(_options.Command))
return PrintUsage("Error: No command specified");
ConsoleOperation op = _commandTable[_options.Command];
if (!op.OptionsValid(_options))
return PrintError("Error: Invalid options specified for the given command");
int successCount = 0;
int failCount = 0;
foreach (var targetNode in new NbtPathEnumerator(_options.Path)) {
if (!op.CanProcess(targetNode)) {
Console.WriteLine(targetNode.NodePath + ": ERROR (invalid command)");
failCount++;
}
if (!op.Process(targetNode, _options)) {
Console.WriteLine(targetNode.NodePath + ": ERROR (apply)");
failCount++;
}
targetNode.Root.Save();
Console.WriteLine(targetNode.NodePath + ": OK");
successCount++;
}
Console.WriteLine("Operation complete. Nodes succeeded: {0} Nodes failed: {1}", successCount, failCount);
return true;
}
private DataNode OpenFile (string path)
{
DataNode node = null;
foreach (var item in FileTypeRegistry.RegisteredTypes) {
if (item.Value.NamePatternTest(path))
node = item.Value.NodeCreate(path);
}
return node;
}
private DataNode ExpandDataNode (DataNode dataNode, string tagPath)
{
string[] pathParts = tagPath.Split('/');
DataNode curTag = dataNode;
curTag.Expand();
foreach (var part in pathParts) {
TagDataNode.Container container = curTag as TagDataNode.Container;
if (curTag == null)
throw new Exception("Invalid tag path");
DataNode childTag = null;
foreach (var child in curTag.Nodes) {
if (child.NodePathName == part)
childTag = child;
}
if (childTag == null)
throw new Exception("Invalid tag path");
curTag.Expand();
}
return curTag;
}
private bool PrintHelp ()
{
Console.WriteLine("NBTUtil - Copyright 2014 Justin Aquadro");
_options.PrintUsage();
return true;
}
private bool PrintUsage (string error)
{
Console.WriteLine(error);
_options.PrintUsage();
return false;
}
private bool PrintError (string error)
{
Console.WriteLine(error);
return false;
}
}
}

82
NBTUtil/NBTUtil.csproj Normal file
View file

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NBTUtil</RootNamespace>
<AssemblyName>NBTUtil</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Substrate">
<HintPath>..\References\Substrate.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ConsoleOptions.cs" />
<Compile Include="ConsoleRunner.cs" />
<Compile Include="NDesk\Options.cs" />
<Compile Include="Ops\ConsoleOperation.cs" />
<Compile Include="Ops\EditOperation.cs" />
<Compile Include="Ops\JsonOperation.cs" />
<Compile Include="Ops\PrintOperation.cs" />
<Compile Include="Ops\PrintTreeOperation.cs" />
<Compile Include="Ops\SetListOperation.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TypePrinter.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NBTModel\NBTModel.csproj">
<Project>{20d7cba3-5b6d-40b0-8d28-4c9a58e4ffbc}</Project>
<Name>NBTModel</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<Target Name="AfterBuild">
<ItemGroup>
<Staging Include="$(OutputPath)\**\*.dll" />
<Staging Include="$(OutputPath)\**\*.exe" />
<Staging Include="$(OutputPath)\**\*.exe.config" />
</ItemGroup>
<Copy SourceFiles="@(Staging)" DestinationFolder="..\Staging\%(RecursiveDir)" />
</Target>
</Project>

1123
NBTUtil/NDesk/Options.cs Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
abstract class ConsoleOperation
{
public virtual bool OptionsValid (ConsoleOptions options)
{
return true;
}
public abstract bool CanProcess (DataNode dataNode);
public abstract bool Process (DataNode dataNode, ConsoleOptions options);
}
}

View file

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
class EditOperation : ConsoleOperation
{
public override bool OptionsValid (ConsoleOptions options)
{
if (options.Values.Count == 0)
return false;
return true;
}
public override bool CanProcess (DataNode dataNode)
{
if (!(dataNode is TagDataNode) || !dataNode.CanEditNode)
return false;
if (dataNode is TagByteArrayDataNode || dataNode is TagIntArrayDataNode || dataNode is TagShortArrayDataNode || dataNode is TagLongArrayDataNode)
return false;
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
string value = options.Values[0];
TagDataNode tagDataNode = dataNode as TagDataNode;
return tagDataNode.Parse(value);
}
}
}

View file

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using NBTExplorer.Model;
using Substrate.Nbt;
namespace NBTUtil.Ops
{
class JsonOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
return dataNode is NbtFileDataNode || dataNode is TagDataNode;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
if (options.Values.Count == 0)
return false;
string jsonPath = options.Values[0];
using (FileStream stream = File.OpenWrite(jsonPath)) {
using (StreamWriter writer = new StreamWriter(stream)) {
if (dataNode is TagDataNode) {
TagDataNode tagNode = dataNode as TagDataNode;
WriteNbtTag(writer, tagNode.Tag);
}
else if (dataNode is NbtFileDataNode) {
dataNode.Expand();
TagNodeCompound root = new TagNodeCompound();
foreach (DataNode child in dataNode.Nodes) {
TagDataNode childTagNode = child as TagDataNode;
if (childTagNode == null)
continue;
if (childTagNode.Tag != null)
root.Add(childTagNode.NodeName, childTagNode.Tag);
}
WriteNbtTag(writer, root);
}
}
}
return true;
}
private void WriteNbtTag (StreamWriter writer, TagNode tag)
{
if (tag == null)
return;
writer.Write(JSONSerializer.Serialize(tag));
}
}
}

View file

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
class PrintOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
Console.WriteLine(TypePrinter.Print(dataNode, options.ShowTypes));
if (dataNode.IsContainerType) {
foreach (var child in dataNode.Nodes)
Console.WriteLine(" | " + TypePrinter.Print(child, options.ShowTypes));
}
return true;
}
}
}

View file

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
class PrintTreeOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
PrintSubTree(dataNode, options, "", true);
return true;
}
private void PrintSubTree (DataNode dataNode, ConsoleOptions options, string indent, bool last)
{
Console.WriteLine(indent + " + " + TypePrinter.Print(dataNode, options.ShowTypes));
indent += last ? " " : " |";
int cnt = 0;
dataNode.Expand();
foreach (DataNode child in dataNode.Nodes) {
cnt++;
PrintSubTree(child, options, indent, cnt == dataNode.Nodes.Count);
}
}
}
}

View file

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
using Substrate.Nbt;
namespace NBTUtil.Ops
{
class SetListOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
if (!(dataNode is TagListDataNode))
return false;
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
TagListDataNode listNode = dataNode as TagListDataNode;
listNode.Clear();
foreach (string value in options.Values) {
TagNode tag = TagDataNode.DefaultTag(listNode.Tag.ValueType);
TagDataNode tagData = TagDataNode.CreateFromTag(tag);
if (!tagData.Parse(value))
return false;
if (!listNode.AppendTag(tagData.Tag))
return false;
}
return true;
}
}
}

15
NBTUtil/Program.cs Normal file
View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NBTUtil
{
class Program
{
static void Main (string[] args)
{
ConsoleRunner runner = new ConsoleRunner();
runner.Run(args);
}
}
}

View file

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("NBTUtil")]
[assembly: AssemblyDescription("A command-line utility to inspect and modify NBT data.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NBTUtil")]
[assembly: AssemblyCopyright("Copyright © Justin Aquadro 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("14c36789-324a-4cbf-8cb4-1f2bd711a631")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.1.0")]
[assembly: AssemblyFileVersion("1.0.1.0")]

42
NBTUtil/TypePrinter.cs Normal file
View file

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil
{
static class TypePrinter
{
private static Dictionary<Type, string> _key = new Dictionary<Type, string>() {
{ typeof(TagByteDataNode), "b" },
{ typeof(TagShortDataNode), "s" },
{ typeof(TagIntDataNode), "i" },
{ typeof(TagLongDataNode), "l" },
{ typeof(TagFloatDataNode), "f" },
{ typeof(TagDoubleDataNode), "d" },
{ typeof(TagStringDataNode), "T" },
{ typeof(TagByteArrayDataNode), "B" },
{ typeof(TagIntArrayDataNode), "I" },
{ typeof(TagShortArrayDataNode), "S" },
{ typeof(TagLongArrayDataNode), "L" },
{ typeof(TagListDataNode), "L" },
{ typeof(TagCompoundDataNode), "C" },
{ typeof(NbtFileDataNode), "N" },
{ typeof(RegionFileDataNode), "R" },
{ typeof(RegionChunkDataNode), "r" },
{ typeof(CubicRegionDataNode), "R" },
{ typeof(DirectoryDataNode), "/" },
};
public static string Print (DataNode node, bool showType)
{
if (!_key.ContainsKey(node.GetType()))
return "";
if (showType)
return "<" + _key[node.GetType()] + "> " + node.NodeDisplay;
else
return node.NodeDisplay;
}
}
}

Binary file not shown.