Content packages & MD5 hash comparison between client and server

This commit is contained in:
Regalis
2015-07-20 21:27:44 +03:00
parent 4aa3d9d7ee
commit 326b46cf18
45 changed files with 1217 additions and 158 deletions
+46 -25
View File
@@ -34,30 +34,36 @@
this.resolutionBox = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.fullscreenBox = new System.Windows.Forms.CheckBox();
this.comboBox2 = new System.Windows.Forms.ComboBox();
this.contentPackageBox = new System.Windows.Forms.ComboBox();
this.label2 = new System.Windows.Forms.Label();
this.button2 = new System.Windows.Forms.Button();
this.packageManagerButton = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.BackColor = System.Drawing.Color.OrangeRed;
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(57, 25);
this.pictureBox1.Location = new System.Drawing.Point(-11, 33);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(508, 69);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox1.Size = new System.Drawing.Size(650, 42);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// launchButton
//
this.launchButton.BackColor = System.Drawing.Color.OrangeRed;
this.launchButton.FlatAppearance.BorderColor = System.Drawing.Color.OrangeRed;
this.launchButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.launchButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.launchButton.ForeColor = System.Drawing.SystemColors.ControlText;
this.launchButton.Location = new System.Drawing.Point(455, 399);
this.launchButton.Name = "launchButton";
this.launchButton.Size = new System.Drawing.Size(161, 42);
this.launchButton.TabIndex = 1;
this.launchButton.Text = "LAUNCH";
this.launchButton.UseVisualStyleBackColor = true;
this.launchButton.UseVisualStyleBackColor = false;
this.launchButton.Click += new System.EventHandler(this.launchButton_Click);
//
// resolutionBox
@@ -72,6 +78,8 @@
// label1
//
this.label1.AutoSize = true;
this.label1.BackColor = System.Drawing.Color.Transparent;
this.label1.ForeColor = System.Drawing.SystemColors.Window;
this.label1.Location = new System.Drawing.Point(54, 191);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(60, 13);
@@ -81,52 +89,65 @@
// fullscreenBox
//
this.fullscreenBox.AutoSize = true;
this.fullscreenBox.BackColor = System.Drawing.Color.Transparent;
this.fullscreenBox.ForeColor = System.Drawing.SystemColors.Window;
this.fullscreenBox.Location = new System.Drawing.Point(57, 252);
this.fullscreenBox.Name = "fullscreenBox";
this.fullscreenBox.Size = new System.Drawing.Size(74, 17);
this.fullscreenBox.TabIndex = 4;
this.fullscreenBox.Text = "Fullscreen";
this.fullscreenBox.UseVisualStyleBackColor = true;
this.fullscreenBox.UseVisualStyleBackColor = false;
//
// comboBox2
// contentPackageBox
//
this.comboBox2.FormattingEnabled = true;
this.comboBox2.Location = new System.Drawing.Point(368, 207);
this.comboBox2.Name = "comboBox2";
this.comboBox2.Size = new System.Drawing.Size(212, 21);
this.comboBox2.TabIndex = 5;
this.contentPackageBox.FormattingEnabled = true;
this.contentPackageBox.Location = new System.Drawing.Point(368, 207);
this.contentPackageBox.Name = "contentPackageBox";
this.contentPackageBox.Size = new System.Drawing.Size(212, 21);
this.contentPackageBox.TabIndex = 5;
this.contentPackageBox.SelectedIndexChanged += new System.EventHandler(this.contentPackageBox_SelectedIndexChanged);
//
// label2
//
this.label2.AutoSize = true;
this.label2.BackColor = System.Drawing.Color.Transparent;
this.label2.ForeColor = System.Drawing.SystemColors.Window;
this.label2.Location = new System.Drawing.Point(365, 191);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(92, 13);
this.label2.TabIndex = 6;
this.label2.Text = "Content package:";
//
// button2
// packageManagerButton
//
this.button2.Location = new System.Drawing.Point(368, 234);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(130, 35);
this.button2.TabIndex = 7;
this.button2.Text = "Package manager";
this.button2.UseVisualStyleBackColor = true;
this.packageManagerButton.BackColor = System.Drawing.Color.OrangeRed;
this.packageManagerButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.packageManagerButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.packageManagerButton.Location = new System.Drawing.Point(368, 234);
this.packageManagerButton.Name = "packageManagerButton";
this.packageManagerButton.Size = new System.Drawing.Size(120, 35);
this.packageManagerButton.TabIndex = 7;
this.packageManagerButton.Text = "Package manager";
this.packageManagerButton.UseVisualStyleBackColor = false;
this.packageManagerButton.Click += new System.EventHandler(this.packageManagerButton_Click);
//
// LauncherMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ButtonHighlight;
this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.ClientSize = new System.Drawing.Size(628, 453);
this.Controls.Add(this.button2);
this.Controls.Add(this.packageManagerButton);
this.Controls.Add(this.label2);
this.Controls.Add(this.comboBox2);
this.Controls.Add(this.contentPackageBox);
this.Controls.Add(this.fullscreenBox);
this.Controls.Add(this.label1);
this.Controls.Add(this.resolutionBox);
this.Controls.Add(this.launchButton);
this.Controls.Add(this.resolutionBox);
this.Controls.Add(this.pictureBox1);
this.DoubleBuffered = true;
this.Name = "LauncherMain";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
@@ -142,9 +163,9 @@
private System.Windows.Forms.ComboBox resolutionBox;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.CheckBox fullscreenBox;
private System.Windows.Forms.ComboBox comboBox2;
private System.Windows.Forms.ComboBox contentPackageBox;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button packageManagerButton;
}
}
+28
View File
@@ -17,6 +17,7 @@ namespace Launcher
{
public partial class LauncherMain : Form
{
public static string ContentPackageFolder = "Data/ContentPackages/";
private const string configPath = "config.xml";
private Subsurface.GameSettings settings;
@@ -41,6 +42,9 @@ namespace Launcher
{
InitializeComponent();
ContentPackage.LoadAll(LauncherMain.ContentPackageFolder);
contentPackageBox.DataSource = ContentPackage.list;
supportedModes = new List<GraphicsMode>();
DEVMODE vDevMode = new DEVMODE();
@@ -77,6 +81,15 @@ namespace Launcher
fullscreenBox.DataBindings.Add("Checked", this, "FullscreenEnabled");
if (settings.SelectedContentPackage == null)
{
if (contentPackageBox.Items.Count > 0) contentPackageBox.SelectedItem = contentPackageBox.Items[0];
}
else
{
contentPackageBox.SelectedItem = settings.SelectedContentPackage;
}
//resolutionBox.SelectedItem = selectedMode;
}
@@ -95,6 +108,21 @@ namespace Launcher
Process.Start(Directory.GetCurrentDirectory() + "/Subsurface.exe");
Application.Exit();
}
private void packageManagerButton_Click(object sender, EventArgs e)
{
var packageManager = new PackageManager(settings.SelectedContentPackage);
packageManager.Show();
}
private void contentPackageBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (settings == null) return;
ComboBox comboBox = sender as ComboBox;
settings.SelectedContentPackage = comboBox.SelectedItem as ContentPackage;
}
}
public class GraphicsMode
+58 -1
View File
@@ -121,7 +121,7 @@
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAABpQAAAD4CAYAAADivwW2AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1
MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAACxAAAAsQAa0jvXUAAP+WSURBVHhe7P35u67XWR94VizF
MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAACwwAAAsMAT9AIsgAAP+WSURBVHhe7P35u67XWR94VizF
tiyUYx0UqStd1dVDdVe6OnO6M1QlDAFCKDBUIHTTFZKqQBLsDAbiGALYhhCwfZwUIInRkmwfa5Y1WbYG
azBKDD+k+7J+7T8nvT6vnu/2fdZZ7x7O2Xu/w17Pdd3SPnu/7/Os4V7f+3sPaz3/2X/6T/9pypQpU6ZM
mTJlypQpU6ZMmTJlyiHyn//H/9+U3Zc/ckx5xzFk9L11MmrLlClTzklGmD5lypQbk+Eim3KojIhBLyOi
@@ -2886,6 +2886,63 @@
WyP8ncXqNfvPG90TG41htdVWW2211VZbbbXLs5Emq9bruGpV7/U2en9s9DnVRvd5Kfbnf/7nq6222gXZ
cJGtdiobEeJF2+hzV1vtNDbC1WXa6B5WW2211a6jjTjwom30uautdhob4eoybXQPq6222mqrrbbaaqsd
p430Hhu9d5E2KoqvttpqZ7E//8/+fzvjQ0uhlEjNAAAAAElFTkSuQmCC
</value>
</data>
<data name="$this.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1
MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAACw4AAAsOAUC+4UEAAAveSURBVHhe7d3vch23DcbhvZz4
v2Q7tmQnjpO2Se//hrYEQ7AvcbiS26/v78MTkgCI3XMyg3FmpPh48eLhBODpePny8QTgiQEAGDtevfpy
AvB0vH799QTg6Xjz5usJwFMbAL+0DQBHx9u3v54APB3v3n07AXg67u6+nQA8Hff3v50APB3377+f7++/
n7HelzXjsc6apLFYh6xVmr+5r/G6l9isbbH3QWNDniOfdVqf99PlfYl1US/n7DvPsUps9skardf9heX5
rfbmfUSt1VyYeX1+xGOt9Zv7EYsey3c44rE+F8vvYInFuuk3vy+J1fP2vZXkar94Xj57iljWtXX7binr
hvr+mpvnH7lT75ZY3Jnv9VRtrLuacb55dnO8//D7+eH97+3StQ+tpq8l3o1c7qMm63tO81lT63Y0J/sn
74QfyC89Yl/vRE1b8/PefO5Sf5O/snlO7mePiGX8R+tzr7FSu3vHZ79LUWuf/A7bvj+v3LnJj33N67su
7/1E7VP9Mv6/fN6lT70XvfQs8V1trLv6iM13kntLbYv3Oo1dqc8e9HPXPkckAXg6Pn784wTg6fj553+c
ADwdnz798wTgiQEAGDs+f/7XCcBTHwAP45Dr9PDf/VJT43JetPi8l/uoVVn7hOyRez3f0J5jP98h48WM
X71Pi9/cfe7dd3eG+C6W+7kvPev9/A77/VgjHvuU51iLfi/2Lb/rO9fIb2r0GUuu1GavRcayVu/IPtbM
593du2V++6xiPkdlr7Z/rsdT95dzW7NW7/S95LVGcz3W9jW2U/ssee03LPkUdc3x8PBne3Dx+Of52NaQ
sTz32MhnfN6r56hrMt7345x6PM+aK3Vh9pBz37dY7vs6anZ9lx5xL+9GbMTrecaKm/5SfxPTXLP0K7mU
35e+r67b7yLFvRLLfhpbSN+bZ6qIabzU6/fS91Kr75zxqFneNWvyfrOs9Z72HDK+1FzVqVKj+aVW+s1n
DPXcY9p3t29rvbMlz8xY7p+6r8/XuuPx8a+WBODoePzy9+ZLBMZ+nnMv8S7vtDXvzb3m8ywitvQOo76q
/XKf8b7qc0Xm6t2ZE3FePkvm8v7Q6zS3W+t+mHdHTj/z0jfPLa+r1vVzua+rWmqzp+x7Lvajpq8j1/NZ
k/sR7zbxpW/Gx372k9jSW+7meyx9Rm7Wj/OsldjNOfdD9Jr9Sn3mej490S/rrup7r/GMpbaeq3FHYzef
tZJc1E5Sk8+OPX8CAIwdX778u00IAI7aACh/VABgg/8EAIwxAABjDADA2PxBoPjhgPqDBD2mP7QwYjc/
tJA1uo6aWZe5EdvFl/tt7TWxb7J+3kuS0/v1vcPus6h5f+xnPNZxrvFq5qR+2ceaRi7vzZicb+61/XyX
yI+z3sn9POt9ob31u6n38pz1Mz/Oy1riWpv3Z03E4lx66Luo5blxlrrYR74b+x4foneN5XnaPHd5v3HO
fv084l3kdvGRm2vWaG3b57Nqzxkb+07yWT/XUZP91dK72f8kIAALDADA2N+/DZi/hLDRf6Gg/HKC1tZ7
vX64qcnnSL96XpS61M+R2+T1nHs993XcqzVdy83a3Et9Pne5mzGJ91rZzzVqx3mJJclV2rOfx52lr6wZ
n/cilzQW69Bjupb8zX2N173EZm2LZc/lvpifS1a9n2u9n+ebvnlnqJ+p10dsxGefrJPcsr+w9H+uVs+b
2pnPXF3VRSw/3+5Z/DowYGwOgE+fLkRe9rHGeXen10Vc72Rs7Jd4GPVLrNFeNbcY+Vmvuf8jfkXfZ7k7
YrU+9LrwTM1SN9bt91tiV//elp5Jei9xNXLZt/do++X9xnn7jCLvzx6xxjnjWpP750Rt9siz5lWtvbB9
J5HnJa536jPkrHe2n09rtU/2beJe7dPPWa/3NpZaiQX+j0CAMQYAYIz/KzBgjAEAGDs+tn90H1ugiTXP
k5zjUl+HzGd86bWrFfXOjMu+i/yw7ZMu6q7uLPtxZ77ThazVc8p431+Jmqwrfeo+8rO3rKrmb/byjErr
83xVn3XLGu833lFrdz2iJi25UTtz0u+mNmK75yl5du23vJfuh+W5ea/2k/08b3qlrKnrpeiV2rk/R/ZL
bchnt7XXZizjSvpkHX8zEGDs+PDhj/ND2/RVRWxn5OLyUjfufSzrTXzU1rr+QrEv+bmPfORGfmfWabzW
P5cX2W+XU8/Vzc8WtE7jPyjq53efsXF+9j2G/txaF2eJLe+1qV3yTe8d8VE7nyWWmNTpufbOOz2WNbu9
nGd9Fb1LXd7b1oesj7sS630yJ6766F29t9RnvK3ze4y91lyYdXEv7w61Ts/85aCAsUP/quApkuUc601s
yHhfR+1cc1/qUtbovpP7S077Nr3P6N/P8pzMZ1zr+zpk7SW5u1v7PnqOui3Njdpen1pc+6abu3Ke9TUf
sVhLfPbbWJ4n+ntqLHtq79iXZ6X5Hhd5VWvnc9t5+25i9pf785z7eh61tXf9Pmf+Kh5KLtR/v93FXp8R
+37OfKx6T1y+W96R+O5ztQHwvR0AODre338/79umi32ec9/MmpLLJnm+6ZFnjTdLvzhLXeR6vho1mpt7
7T96zLjmmt39WPs+azf39Nzft57H/ik331fEhhmLmrFf3knVWJx3sc156S3yWbH298yYyh6yZk2tX/bl
Xqf73flCfYaee6z0mTWbd+i5PJd1iTfzORnXveaHPG+fIbllLfmq94r9eF7ee65OY3qO/HF//1sLAHB0
3MXm7rfzbtB91/K673m5E00yH7HMa2zWxT3NyV7lna28E73ynPuNGtc7Mz72u/eZ9WOv/fIz6Vnrryzf
gcS7krvJh1GTz+syFvk8116jvsb7PnMaEzOXfZPW1LPsp11NiVXaR5+xvFOJdRl/rr/WpZoT8xmbXIp7
y93YRyxy45xr1mdN0s8y78k6RX3EZZ01o9esLY67u29tA8ARAwAwdrx79+0E4KkNgF/bBoCj4+3bX08A
ntoA+KVtADg63rz55QTgqQ2Ar20DwNHx+vXXE4AnBgBg7Hj16ssJwBMDADDWBsBj2wBwdLx8+XgC8MQA
AIy1AfDQNgAcHS9ePJwAPDEAAGMMAMDY8dNPn08AnhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAtj6f/wEIzWam3AHpbQAAAABJRU5ErkJggg==
</value>
</data>
</root>
+10
View File
@@ -37,6 +37,7 @@
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.DirectoryServices" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
@@ -53,11 +54,20 @@
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="PackageManager.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="PackageManager.Designer.cs">
<DependentUpon>PackageManager.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="PackageManager.resx">
<DependentUpon>PackageManager.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
+307
View File
@@ -0,0 +1,307 @@
namespace Launcher
{
partial class PackageManager
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PackageManager));
this.packageList = new System.Windows.Forms.ListBox();
this.newPackageName = new System.Windows.Forms.TextBox();
this.newPackage = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.itemList = new System.Windows.Forms.ListBox();
this.itemButton = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.characterList = new System.Windows.Forms.ListBox();
this.characterButton = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.structureList = new System.Windows.Forms.ListBox();
this.structureButton = new System.Windows.Forms.Button();
this.jobButton = new System.Windows.Forms.Button();
this.jobList = new System.Windows.Forms.ListBox();
this.label4 = new System.Windows.Forms.Label();
this.okButton = new System.Windows.Forms.Button();
this.characterFolder = new System.Windows.Forms.Button();
this.itemFolder = new System.Windows.Forms.Button();
this.structureFolder = new System.Windows.Forms.Button();
this.jobFolder = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// packageList
//
this.packageList.FormattingEnabled = true;
this.packageList.Location = new System.Drawing.Point(12, 73);
this.packageList.Name = "packageList";
this.packageList.Size = new System.Drawing.Size(180, 342);
this.packageList.TabIndex = 3;
this.packageList.SelectedIndexChanged += new System.EventHandler(this.packageList_SelectedIndexChanged);
//
// newPackageName
//
this.newPackageName.Location = new System.Drawing.Point(12, 421);
this.newPackageName.Name = "newPackageName";
this.newPackageName.Size = new System.Drawing.Size(129, 20);
this.newPackageName.TabIndex = 4;
this.newPackageName.TextChanged += new System.EventHandler(this.newPackageName_TextChanged);
//
// newPackage
//
this.newPackage.Enabled = false;
this.newPackage.Location = new System.Drawing.Point(147, 421);
this.newPackage.Name = "newPackage";
this.newPackage.Size = new System.Drawing.Size(45, 20);
this.newPackage.TabIndex = 5;
this.newPackage.Text = "New";
this.newPackage.UseVisualStyleBackColor = true;
this.newPackage.Click += new System.EventHandler(this.newPackage_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.BackColor = System.Drawing.Color.Transparent;
this.label1.ForeColor = System.Drawing.SystemColors.Control;
this.label1.Location = new System.Drawing.Point(215, 285);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(51, 13);
this.label1.TabIndex = 7;
this.label1.Text = "Item files:";
//
// itemList
//
this.itemList.FormattingEnabled = true;
this.itemList.Location = new System.Drawing.Point(218, 307);
this.itemList.Name = "itemList";
this.itemList.Size = new System.Drawing.Size(255, 134);
this.itemList.TabIndex = 8;
//
// itemButton
//
this.itemButton.Location = new System.Drawing.Point(301, 281);
this.itemButton.Name = "itemButton";
this.itemButton.Size = new System.Drawing.Size(75, 23);
this.itemButton.TabIndex = 9;
this.itemButton.Text = "Add file";
this.itemButton.UseVisualStyleBackColor = true;
this.itemButton.Click += new System.EventHandler(this.addFileButton_Click);
//
// label2
//
this.label2.AutoSize = true;
this.label2.BackColor = System.Drawing.Color.Transparent;
this.label2.ForeColor = System.Drawing.SystemColors.Control;
this.label2.Location = new System.Drawing.Point(215, 120);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(77, 13);
this.label2.TabIndex = 7;
this.label2.Text = "Character files:";
//
// characterList
//
this.characterList.FormattingEnabled = true;
this.characterList.Location = new System.Drawing.Point(218, 145);
this.characterList.Name = "characterList";
this.characterList.Size = new System.Drawing.Size(255, 121);
this.characterList.TabIndex = 8;
//
// characterButton
//
this.characterButton.Location = new System.Drawing.Point(301, 116);
this.characterButton.Name = "characterButton";
this.characterButton.Size = new System.Drawing.Size(75, 23);
this.characterButton.TabIndex = 9;
this.characterButton.Text = "Add file";
this.characterButton.UseVisualStyleBackColor = true;
this.characterButton.Click += new System.EventHandler(this.addFileButton_Click);
//
// label3
//
this.label3.AutoSize = true;
this.label3.BackColor = System.Drawing.Color.Transparent;
this.label3.ForeColor = System.Drawing.SystemColors.Control;
this.label3.Location = new System.Drawing.Point(489, 121);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(96, 13);
this.label3.TabIndex = 7;
this.label3.Text = "Map structure files:";
//
// structureList
//
this.structureList.FormattingEnabled = true;
this.structureList.Location = new System.Drawing.Point(492, 145);
this.structureList.Name = "structureList";
this.structureList.Size = new System.Drawing.Size(255, 121);
this.structureList.TabIndex = 8;
//
// structureButton
//
this.structureButton.Location = new System.Drawing.Point(603, 116);
this.structureButton.Name = "structureButton";
this.structureButton.Size = new System.Drawing.Size(75, 23);
this.structureButton.TabIndex = 9;
this.structureButton.Text = "Add file";
this.structureButton.UseVisualStyleBackColor = true;
this.structureButton.Click += new System.EventHandler(this.addFileButton_Click);
//
// jobButton
//
this.jobButton.Location = new System.Drawing.Point(603, 281);
this.jobButton.Name = "jobButton";
this.jobButton.Size = new System.Drawing.Size(75, 23);
this.jobButton.TabIndex = 12;
this.jobButton.Text = "Add file";
this.jobButton.UseVisualStyleBackColor = true;
this.jobButton.Click += new System.EventHandler(this.addFileButton_Click);
//
// jobList
//
this.jobList.FormattingEnabled = true;
this.jobList.Location = new System.Drawing.Point(492, 307);
this.jobList.Name = "jobList";
this.jobList.Size = new System.Drawing.Size(255, 134);
this.jobList.TabIndex = 11;
//
// label4
//
this.label4.AutoSize = true;
this.label4.BackColor = System.Drawing.Color.Transparent;
this.label4.ForeColor = System.Drawing.SystemColors.Control;
this.label4.Location = new System.Drawing.Point(489, 286);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(48, 13);
this.label4.TabIndex = 10;
this.label4.Text = "Job files:";
//
// okButton
//
this.okButton.Location = new System.Drawing.Point(623, 503);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(124, 37);
this.okButton.TabIndex = 13;
this.okButton.Text = "OK";
this.okButton.UseVisualStyleBackColor = true;
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
// characterFolder
//
this.characterFolder.Location = new System.Drawing.Point(398, 116);
this.characterFolder.Name = "characterFolder";
this.characterFolder.Size = new System.Drawing.Size(75, 23);
this.characterFolder.TabIndex = 9;
this.characterFolder.Text = "Add folder";
this.characterFolder.UseVisualStyleBackColor = true;
this.characterFolder.Click += new System.EventHandler(this.addFolderButton_Click);
//
// itemFolder
//
this.itemFolder.Location = new System.Drawing.Point(398, 280);
this.itemFolder.Name = "itemFolder";
this.itemFolder.Size = new System.Drawing.Size(75, 23);
this.itemFolder.TabIndex = 14;
this.itemFolder.Text = "Add folder";
this.itemFolder.UseVisualStyleBackColor = true;
this.itemFolder.Click += new System.EventHandler(this.addFolderButton_Click);
//
// structureFolder
//
this.structureFolder.Location = new System.Drawing.Point(672, 116);
this.structureFolder.Name = "structureFolder";
this.structureFolder.Size = new System.Drawing.Size(75, 23);
this.structureFolder.TabIndex = 15;
this.structureFolder.Text = "Add folder";
this.structureFolder.UseVisualStyleBackColor = true;
this.structureFolder.Click += new System.EventHandler(this.addFolderButton_Click);
//
// jobFolder
//
this.jobFolder.Location = new System.Drawing.Point(672, 281);
this.jobFolder.Name = "jobFolder";
this.jobFolder.Size = new System.Drawing.Size(75, 23);
this.jobFolder.TabIndex = 16;
this.jobFolder.Text = "Add folder";
this.jobFolder.UseVisualStyleBackColor = true;
this.jobFolder.Click += new System.EventHandler(this.addFolderButton_Click);
//
// PackageManager
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.ClientSize = new System.Drawing.Size(784, 562);
this.Controls.Add(this.jobFolder);
this.Controls.Add(this.structureFolder);
this.Controls.Add(this.itemFolder);
this.Controls.Add(this.okButton);
this.Controls.Add(this.jobButton);
this.Controls.Add(this.jobList);
this.Controls.Add(this.label4);
this.Controls.Add(this.structureButton);
this.Controls.Add(this.characterFolder);
this.Controls.Add(this.characterButton);
this.Controls.Add(this.itemButton);
this.Controls.Add(this.structureList);
this.Controls.Add(this.label3);
this.Controls.Add(this.characterList);
this.Controls.Add(this.label2);
this.Controls.Add(this.itemList);
this.Controls.Add(this.label1);
this.Controls.Add(this.newPackage);
this.Controls.Add(this.newPackageName);
this.Controls.Add(this.packageList);
this.DoubleBuffered = true;
this.Name = "PackageManager";
this.Text = "PackageManager";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ListBox packageList;
private System.Windows.Forms.TextBox newPackageName;
private System.Windows.Forms.Button newPackage;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ListBox itemList;
private System.Windows.Forms.Button itemButton;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ListBox characterList;
private System.Windows.Forms.Button characterButton;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.ListBox structureList;
private System.Windows.Forms.Button structureButton;
private System.Windows.Forms.Button jobButton;
private System.Windows.Forms.ListBox jobList;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Button okButton;
private System.Windows.Forms.Button characterFolder;
private System.Windows.Forms.Button itemFolder;
private System.Windows.Forms.Button structureFolder;
private System.Windows.Forms.Button jobFolder;
}
}
+228
View File
@@ -0,0 +1,228 @@
using Subsurface;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Launcher
{
public partial class PackageManager : Form
{
private ContentPackage selectedPackage;
private List<ListBox> fileBoxes;
private List<Button> fileButtons;
public PackageManager(ContentPackage _selectedPackage)
{
InitializeComponent();
packageList.DisplayMember = "Name";
packageList.ValueMember = "MD5hash";
foreach (ContentPackage package in ContentPackage.list)
{
packageList.Items.Add(package);
}
fileBoxes = new List<ListBox>();
fileButtons = new List<Button>();
fileBoxes.Add(itemList);
itemList.Tag = ContentType.Item;
itemButton.Tag = ContentType.Item;
itemFolder.Tag = ContentType.Item;
fileButtons.Add(itemButton);
fileButtons.Add(itemFolder);
fileBoxes.Add(characterList);
characterList.Tag = ContentType.Character;
characterButton.Tag = ContentType.Character;
characterFolder.Tag = ContentType.Character;
fileButtons.Add(characterButton);
fileButtons.Add(characterFolder);
fileBoxes.Add(structureList);
structureList.Tag = ContentType.Structure;
structureButton.Tag = ContentType.Structure;
structureFolder.Tag = ContentType.Structure;
fileButtons.Add(structureButton);
fileButtons.Add(structureFolder);
fileBoxes.Add(jobList);
jobList.Tag = ContentType.Jobs;
jobButton.Tag = ContentType.Jobs;
jobFolder.Tag = ContentType.Jobs;
fileButtons.Add(jobButton);
fileButtons.Add(jobFolder);
foreach (Button fileButton in fileButtons)
{
fileButton.Enabled = false;
}
selectedPackage = _selectedPackage;
SelectPackage(selectedPackage);
}
private void packageList_SelectedIndexChanged(object sender, EventArgs e)
{
ListBox listBox = sender as ListBox;
SelectPackage(listBox.SelectedItem as ContentPackage);
}
private void SelectPackage(ContentPackage package)
{
selectedPackage = package;
foreach (Button fileButton in fileButtons)
{
fileButton.Enabled = (selectedPackage != null);
}
if (selectedPackage == null)
{
foreach (ListBox fileBox in fileBoxes)
{
fileBox.Items.Clear();
}
}
else
{
foreach (ListBox fileBox in fileBoxes)
{
ContentType type = (fileBox.Tag is ContentType) ? (ContentType)fileBox.Tag : ContentType.None;
foreach (ContentFile file in selectedPackage.files)
{
if (file.type != type) continue;
fileBox.Items.Add(file);
}
}
}
}
private void newPackage_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(newPackageName.Text)) return;
ContentPackage newPackage = ContentPackage.CreatePackage(newPackageName.Text);
packageList.Items.Add(newPackage);
packageList.SelectedItem = newPackage;
newPackageName.Text = "";
}
private void newPackageName_TextChanged(object sender, EventArgs e)
{
newPackage.Enabled = !string.IsNullOrEmpty(newPackageName.Text);
}
private void addFileButton_Click(object sender, EventArgs e)
{
Button button = sender as Button;
ContentType type = (button.Tag is ContentType) ? (ContentType)button.Tag : ContentType.None;
Debug.Assert(type != ContentType.None, "ContentType of a button tag was ContentType.None");
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "XML files (*.xml)|*.xml;*.XML";
//ofd.RestoreDirectory?
if (ofd.ShowDialog() == DialogResult.OK)
{
string[] fileNames = ofd.FileNames;
foreach (string file in fileNames)
{
AddFile(type, file);
}
}
}
private void AddFile(ContentType type, string path)
{
ListBox selectedBox = null;
foreach (ListBox fileBox in fileBoxes)
{
if (type != ((fileBox.Tag is ContentType) ? (ContentType)fileBox.Tag : ContentType.None)) continue;
selectedBox = fileBox;
break;
}
ContentFile newPackage = selectedPackage.AddFile(GetRelativePath(path, Directory.GetCurrentDirectory()), type);
if (newPackage!=null) selectedBox.Items.Add(newPackage);
}
private void addFolderButton_Click(object sender, EventArgs e)
{
Button button = sender as Button;
ContentType type = (button.Tag is ContentType) ? (ContentType)button.Tag : ContentType.None;
Debug.Assert(type != ContentType.None, "ContentType of a button tag was ContentType.None");
FolderBrowserDialog fbd = new FolderBrowserDialog();
//OpenFileDialog ofd = new OpenFileDialog();
//ofd.Filter = "XML files (*.xml)|*.xml;*.XML";
//ofd.RestoreDirectory?
if (fbd.ShowDialog() == DialogResult.OK)
{
AddFilesInFolder(type, fbd.SelectedPath);
}
}
private void AddFilesInFolder(ContentType type, string folder, string searchPattern ="*xml")
{
if (!Directory.Exists(folder)) return;
string[] files = Directory.GetFiles(folder, "*.xml");
foreach (string filePath in files)
{
AddFile(type, filePath);
}
string[] subDirectories = Directory.GetDirectories(folder, "*");
foreach (string subDir in subDirectories)
{
AddFilesInFolder(type, subDir, searchPattern);
}
}
string GetRelativePath(string filespec, string folder)
{
Uri pathUri = new Uri(filespec);
// Folders must end in a slash
if (!folder.EndsWith(Path.DirectorySeparatorChar.ToString()))
{
folder += Path.DirectorySeparatorChar;
}
Uri folderUri = new Uri(folder);
return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString().Replace('/', Path.DirectorySeparatorChar));
}
private void okButton_Click(object sender, EventArgs e)
{
if (selectedPackage!=null) selectedPackage.Save(LauncherMain.ContentPackageFolder);
this.Close();
}
}
}
+178
View File
@@ -0,0 +1,178 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1
MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAveSURBVHhe7d3vch23DcbhvZz4
v2Q7tmQnjpO2Se//hrYEQ7AvcbiS26/v78MTkgCI3XMyg3FmpPh48eLhBODpePny8QTgiQEAGDtevfpy
AvB0vH799QTg6Xjz5usJwFMbAL+0DQBHx9u3v54APB3v3n07AXg67u6+nQA8Hff3v50APB3377+f7++/
n7HelzXjsc6apLFYh6xVmr+5r/G6l9isbbH3QWNDniOfdVqf99PlfYl1US/n7DvPsUps9skardf9heX5
rfbmfUSt1VyYeX1+xGOt9Zv7EYsey3c44rE+F8vvYInFuuk3vy+J1fP2vZXkar94Xj57iljWtXX7binr
hvr+mpvnH7lT75ZY3Jnv9VRtrLuacb55dnO8//D7+eH97+3StQ+tpq8l3o1c7qMm63tO81lT63Y0J/sn
74QfyC89Yl/vRE1b8/PefO5Sf5O/snlO7mePiGX8R+tzr7FSu3vHZ79LUWuf/A7bvj+v3LnJj33N67su
7/1E7VP9Mv6/fN6lT70XvfQs8V1trLv6iM13kntLbYv3Oo1dqc8e9HPXPkckAXg6Pn784wTg6fj553+c
ADwdnz798wTgiQEAGDs+f/7XCcBTHwAP45Dr9PDf/VJT43JetPi8l/uoVVn7hOyRez3f0J5jP98h48WM
X71Pi9/cfe7dd3eG+C6W+7kvPev9/A77/VgjHvuU51iLfi/2Lb/rO9fIb2r0GUuu1GavRcayVu/IPtbM
593du2V++6xiPkdlr7Z/rsdT95dzW7NW7/S95LVGcz3W9jW2U/ssee03LPkUdc3x8PBne3Dx+Of52NaQ
sTz32MhnfN6r56hrMt7345x6PM+aK3Vh9pBz37dY7vs6anZ9lx5xL+9GbMTrecaKm/5SfxPTXLP0K7mU
35e+r67b7yLFvRLLfhpbSN+bZ6qIabzU6/fS91Kr75zxqFneNWvyfrOs9Z72HDK+1FzVqVKj+aVW+s1n
DPXcY9p3t29rvbMlz8xY7p+6r8/XuuPx8a+WBODoePzy9+ZLBMZ+nnMv8S7vtDXvzb3m8ywitvQOo76q
/XKf8b7qc0Xm6t2ZE3FePkvm8v7Q6zS3W+t+mHdHTj/z0jfPLa+r1vVzua+rWmqzp+x7Lvajpq8j1/NZ
k/sR7zbxpW/Gx372k9jSW+7meyx9Rm7Wj/OsldjNOfdD9Jr9Sn3mej490S/rrup7r/GMpbaeq3FHYzef
tZJc1E5Sk8+OPX8CAIwdX778u00IAI7aACh/VABgg/8EAIwxAABjDADA2PxBoPjhgPqDBD2mP7QwYjc/
tJA1uo6aWZe5EdvFl/tt7TWxb7J+3kuS0/v1vcPus6h5f+xnPNZxrvFq5qR+2ceaRi7vzZicb+61/XyX
yI+z3sn9POt9ob31u6n38pz1Mz/Oy1riWpv3Z03E4lx66Luo5blxlrrYR74b+x4foneN5XnaPHd5v3HO
fv084l3kdvGRm2vWaG3b57Nqzxkb+07yWT/XUZP91dK72f8kIAALDADA2N+/DZi/hLDRf6Gg/HKC1tZ7
vX64qcnnSL96XpS61M+R2+T1nHs993XcqzVdy83a3Et9Pne5mzGJ91rZzzVqx3mJJclV2rOfx52lr6wZ
n/cilzQW69Bjupb8zX2N173EZm2LZc/lvpifS1a9n2u9n+ebvnlnqJ+p10dsxGefrJPcsr+w9H+uVs+b
2pnPXF3VRSw/3+5Z/DowYGwOgE+fLkRe9rHGeXen10Vc72Rs7Jd4GPVLrNFeNbcY+Vmvuf8jfkXfZ7k7
YrU+9LrwTM1SN9bt91tiV//elp5Jei9xNXLZt/do++X9xnn7jCLvzx6xxjnjWpP750Rt9siz5lWtvbB9
J5HnJa536jPkrHe2n09rtU/2beJe7dPPWa/3NpZaiQX+j0CAMQYAYIz/KzBgjAEAGDs+tn90H1ugiTXP
k5zjUl+HzGd86bWrFfXOjMu+i/yw7ZMu6q7uLPtxZ77ThazVc8p431+Jmqwrfeo+8rO3rKrmb/byjErr
83xVn3XLGu833lFrdz2iJi25UTtz0u+mNmK75yl5du23vJfuh+W5ea/2k/08b3qlrKnrpeiV2rk/R/ZL
bchnt7XXZizjSvpkHX8zEGDs+PDhj/ND2/RVRWxn5OLyUjfufSzrTXzU1rr+QrEv+bmPfORGfmfWabzW
P5cX2W+XU8/Vzc8WtE7jPyjq53efsXF+9j2G/txaF2eJLe+1qV3yTe8d8VE7nyWWmNTpufbOOz2WNbu9
nGd9Fb1LXd7b1oesj7sS630yJ6766F29t9RnvK3ze4y91lyYdXEv7w61Ts/85aCAsUP/quApkuUc601s
yHhfR+1cc1/qUtbovpP7S077Nr3P6N/P8pzMZ1zr+zpk7SW5u1v7PnqOui3Njdpen1pc+6abu3Ke9TUf
sVhLfPbbWJ4n+ntqLHtq79iXZ6X5Hhd5VWvnc9t5+25i9pf785z7eh61tXf9Pmf+Kh5KLtR/v93FXp8R
+37OfKx6T1y+W96R+O5ztQHwvR0AODre338/79umi32ec9/MmpLLJnm+6ZFnjTdLvzhLXeR6vho1mpt7
7T96zLjmmt39WPs+azf39Nzft57H/ik331fEhhmLmrFf3knVWJx3sc156S3yWbH298yYyh6yZk2tX/bl
Xqf73flCfYaee6z0mTWbd+i5PJd1iTfzORnXveaHPG+fIbllLfmq94r9eF7ee65OY3qO/HF//1sLAHB0
3MXm7rfzbtB91/K673m5E00yH7HMa2zWxT3NyV7lna28E73ynPuNGtc7Mz72u/eZ9WOv/fIz6Vnrryzf
gcS7krvJh1GTz+syFvk8116jvsb7PnMaEzOXfZPW1LPsp11NiVXaR5+xvFOJdRl/rr/WpZoT8xmbXIp7
y93YRyxy45xr1mdN0s8y78k6RX3EZZ01o9esLY67u29tA8ARAwAwdrx79+0E4KkNgF/bBoCj4+3bX08A
ntoA+KVtADg63rz55QTgqQ2Ar20DwNHx+vXXE4AnBgBg7Hj16ssJwBMDADDWBsBj2wBwdLx8+XgC8MQA
AIy1AfDQNgAcHS9ePJwAPDEAAGMMAMDY8dNPn08AnhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAAxhgAgDEGAGCMAQAYYwAA
xhgAgDEGAGCMAQAYYwAAtj6f/wEIzWam3AHpbQAAAABJRU5ErkJggg==
</value>
</data>
</root>