Browse Source

[svn r12750] appshare j#

Patrick Vandermaesen 17 years ago
parent
commit
778c6eb93d

+ 20 - 0
main/app_share/serverbootstrap/DokeosAppShare.sln

@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{E6FDF86B-F3D1-11D4-8576-0002A516ECE8}") = "DokeosAppShare", "DokeosAppShare\DokeosAppShare.vjsproj", "{721A6043-1F29-417E-9075-60030F093DB8}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x86 = Debug|x86
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{721A6043-1F29-417E-9075-60030F093DB8}.Debug|x86.ActiveCfg = Debug|x86
+		{721A6043-1F29-417E-9075-60030F093DB8}.Debug|x86.Build.0 = Debug|x86
+		{721A6043-1F29-417E-9075-60030F093DB8}.Release|x86.ActiveCfg = Release|x86
+		{721A6043-1F29-417E-9075-60030F093DB8}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

BIN
main/app_share/serverbootstrap/DokeosAppShare/App.ico


+ 92 - 0
main/app_share/serverbootstrap/DokeosAppShare/CommandConnection.jsl

@@ -0,0 +1,92 @@
+package DokeosAppShare;
+
+import java.net.*;
+import java.io.*;
+
+/**
+ * Summary description for ConnectionToRelay.
+ */
+public class CommandConnection extends Thread
+{
+
+	/* COMMANDS */
+	public static final int SERVER_CONNECTION = 10;
+	public static final int CLIENT_CONNECTION = 20;
+	public static final int RELAY_CONNECTION = 30;
+	
+	Socket relay;
+	String serverID;
+
+	public CommandConnection(String inServerID) throws IOException
+	{
+		serverID = inServerID;
+		relay = new Socket(Config.getRelayHostName(), Config.getRelayPort());
+		
+		this.setDaemon(true);
+	}
+
+	public void run()
+	{
+		try
+		{
+			InputStream in = relay.getInputStream();
+			OutputStream out = relay.getOutputStream();
+			writeCommand(out, SERVER_CONNECTION, serverID);
+			for (; ; )
+			{
+				//Wait command from relay
+				System.out.println("Waiting command from relay...");
+				int command = in.read();
+				System.out.println("Command receive : " + command);
+				if (command == RELAY_CONNECTION)
+				{
+					String connServerId = readCommandParam(in);
+					System.out.println("relay try connection to : " + connServerId);
+					if (connServerId.equals(serverID))
+					{
+						try
+						{
+							new ConnectionToRelay(serverID);
+						}
+						catch (Exception ex)
+						{
+							System.out.println("Exception on ConnectionToRelay instanciation");
+							ex.printStackTrace();
+						}
+					}
+					else
+					{
+						System.out.println("bad server name : " + connServerId);
+					}
+				}
+
+			}
+		}
+		catch (IOException ex)
+		{
+			System.out.println("Exception in CommandConnection listener thread");
+			ex.printStackTrace();
+		}
+		finally
+		{
+			try { relay.close(); }
+			catch (Exception ex) { }
+			//TODO Exit application
+		}
+	}
+	public static String readCommandParam(InputStream in) throws IOException
+	{
+		int size = in.read();
+		byte[] data = new byte[size];
+		in.read(data);
+		return new String(data);
+	}
+	public static void writeCommand(OutputStream out, int command, String param) throws IOException
+	{
+		out.write(command);
+		byte[] data = param.getBytes();
+		out.write(data.length);
+		out.write(data);
+	}
+
+}

+ 63 - 0
main/app_share/serverbootstrap/DokeosAppShare/Config.jsl

@@ -0,0 +1,63 @@
+package DokeosAppShare;
+
+/**
+ * Summary description for Config.
+ */
+public class Config
+{
+	public static String getVNCExecutableURL()
+	{
+		return "http://dokeos.noctis.be/vnc/winvnc.exe";
+	}
+
+	public static void writeRegOptions()
+	{
+		final String KEY_PATH = "SOFTWARE\\ORL";
+		final String SUB_KEY_PATH = "WinVNC3";
+		Microsoft.Win32.RegistryKey lm = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(KEY_PATH);
+		Microsoft.Win32.RegistryKey cu = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(KEY_PATH);
+		try
+		{
+			lm.DeleteSubKeyTree(SUB_KEY_PATH);
+			cu.DeleteSubKeyTree(SUB_KEY_PATH);
+		}
+		catch (Exception e)
+		{
+		}
+		lm = lm.CreateSubKey(SUB_KEY_PATH);
+		cu = cu.CreateSubKey(SUB_KEY_PATH);
+		lm.SetValue("AllowLoopback", new Integer(1), Microsoft.Win32.RegistryValueKind.DWord);
+		lm.SetValue("LoopbackOnly", new Integer(1), Microsoft.Win32.RegistryValueKind.DWord);
+		//lm.SetValue("DisableTrayIcon", new Integer(1), Microsoft.Win32.RegistryValueKind.DWord);
+		cu.SetValue("Password", (Object)new ubyte[] { (ubyte)0x8C, (ubyte)0xEA, (ubyte)0x0C, (ubyte)0x33, (ubyte)0x74, (ubyte)0xAC, (ubyte)0x87, (ubyte)0x17 }, Microsoft.Win32.RegistryValueKind.Binary);
+		cu.SetValue("InputsEnabled", new Integer(0), Microsoft.Win32.RegistryValueKind.DWord);
+		cu.SetValue("LocalInputsDisabled", new Integer(0), Microsoft.Win32.RegistryValueKind.DWord);
+		cu.SetValue("FileTransferEnabled", new Integer(0), Microsoft.Win32.RegistryValueKind.DWord);
+	}
+
+	public static int getConnexionCount()
+	{
+		return 5;
+	}
+
+	public static String getRelayHostName()
+	{
+		//return "dokeos.noctis.be";
+		return "localhost";
+	}
+
+	public static int getRelayPort()
+	{
+		return 443;
+	}
+
+	public static String getVNCHostName()
+	{
+		return "localhost";
+	}
+
+	public static int getVNCPort()
+	{
+		return 5900;
+	}
+}

+ 101 - 0
main/app_share/serverbootstrap/DokeosAppShare/ConnectionToRelay.jsl

@@ -0,0 +1,101 @@
+package DokeosAppShare;
+
+import java.net.*;
+import java.io.*;
+
+/**
+ * Summary description for ConnectionToRelay.
+ */
+public class ConnectionToRelay
+{
+	Socket relay;
+	ReadWriteThread thrdReadRelay;
+	Socket vnc;
+	ReadWriteThread thrdReadVNC;
+
+	public ConnectionToRelay(String serverID) throws IOException
+	{
+		relay = new Socket(Config.getRelayHostName(), Config.getRelayPort());
+
+		OutputStream out = relay.getOutputStream();
+
+		CommandConnection.writeCommand(out, CommandConnection.RELAY_CONNECTION, serverID);
+
+		InputStream in = relay.getInputStream();
+
+		//Wait for byte from relay
+		System.out.println("Waiting for byte from relay...");
+		int read = in.read();
+		System.out.println("read on relay socket : " + read);
+
+		//Connect to VNC
+		System.out.println("Connecting to VNC...");
+		vnc = new Socket(Config.getVNCHostName(), Config.getVNCPort());
+
+		//Duplex
+		thrdReadRelay = new ReadWriteThread(relay, vnc);
+		thrdReadRelay.setDaemon(true);
+		thrdReadRelay.start();
+		thrdReadVNC = new ReadWriteThread(vnc, relay);
+		thrdReadVNC.setDaemon(true);
+		thrdReadVNC.start();
+		System.out.println("Duplex started");
+	}
+}
+
+class ReadWriteThread extends Thread
+{
+	private final Socket socketIn;
+	private final Socket socketOut;
+
+	public ReadWriteThread(final Socket socketIn, final Socket socketOut)
+	{
+		this.socketIn = socketIn;
+		this.socketOut = socketOut;
+	}
+
+	public void run()
+	{
+		try
+		{
+			readWrite(socketIn.getInputStream(), socketOut.getOutputStream());
+		}
+		catch (Throwable e)
+		{
+			e.printStackTrace();
+			try
+			{
+				socketIn.close();
+			}
+			catch (Exception ex)
+			{
+				ex.printStackTrace();
+			}
+			try
+			{
+				socketOut.close();
+			}
+			catch (Exception ex)
+			{
+				ex.printStackTrace();
+			}
+		}
+		System.out.println("end connection relay.");
+	}
+
+	private void readWrite(InputStream in, OutputStream out) throws IOException
+	{
+		int b = 0;
+		int readCount = 0;
+		byte[] buffer = new byte[1024*10];
+
+		b = in.read();
+		while (b >= 0)
+		{
+			out.write(b);
+			readCount = in.read(buffer, 0, buffer.length);
+			out.write(buffer, 0, readCount);
+			b = in.read();
+		}
+	}
+}

+ 76 - 0
main/app_share/serverbootstrap/DokeosAppShare/DokeosAppShare.vjsproj

@@ -0,0 +1,76 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{721A6043-1F29-417E-9075-60030F093DB8}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>DokeosAppShare</RootNamespace>
+    <AssemblyName>DokeosAppShare</AssemblyName>
+    <WarningLevel>4</WarningLevel>
+    <StartupObject>DokeosAppShare.Program</StartupObject>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+    <Compile Include="Config.jsl" />
+    <Compile Include="ConnectionToRelay.jsl" />
+    <Compile Include="CommandConnection.jsl" />
+    <Compile Include="LocalRelay.jsl">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Program.jsl" />
+    <Compile Include="Properties\AssemblyInfo.jsl" />
+    <Compile Include="Properties\Resources.Designer.jsl">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="LocalRelay.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>LocalRelay.jsl</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.jsl</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DownloadProgressEventListener.java" />
+    <Compile Include="DownloadThread.java" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.VisualJSharp.targets" />
+  <PropertyGroup>
+    <ApplicationIcon>App.ico</ApplicationIcon>
+  </PropertyGroup>
+  <!-- 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>

+ 11 - 0
main/app_share/serverbootstrap/DokeosAppShare/DownloadProgressEventListener.java

@@ -0,0 +1,11 @@
+package DokeosAppShare;
+import java.io.*;
+
+public interface DownloadProgressEventListener
+{
+	void connecting();
+	void started();
+	void progressChange(int progress, int max);
+	void done(File fileDest) throws Exception;
+	void exception(Exception ex);
+}

+ 154 - 0
main/app_share/serverbootstrap/DokeosAppShare/DownloadThread.java

@@ -0,0 +1,154 @@
+package DokeosAppShare;
+import java.net.*;
+import java.io.*;
+import java.util.*;
+
+/**
+ * Summary description for DownloadThread.
+ */
+public class DownloadThread extends Thread
+{
+	private List listeners = new LinkedList();
+	private URL fileURL;
+	private File fileDest;
+
+	private boolean canceling = false;
+
+	public DownloadThread(URL fileURL, File fileDest)
+	{
+		this.fileURL = fileURL;
+		this.fileDest = fileDest;
+	}
+
+	public void cancel()
+	{
+		canceling = true;
+	}
+
+	public void run()
+	{
+		try
+		{
+			fireConnecting();
+			URLConnection connection = fileURL.openConnection();
+			int max = connection.getContentLength();
+			InputStream in = connection.getInputStream();
+			OutputStream out = new FileOutputStream(fileDest);
+			fireStarted();
+			fireProgressChange(0, max);
+			{
+				int count = 0;
+				int b = 0;
+				int readCount = 0;
+				byte[] buffer = new byte[1024*10];
+
+				b = in.read();
+				while (!canceling && b >= 0)
+				{
+					out.write(b);
+					count += 1;
+					readCount = in.read(buffer, 0, buffer.length);
+					out.write(buffer, 0, readCount);
+					count += readCount;
+					fireProgressChange(count, max);
+					b = in.read();
+				}
+			}
+			in.close();
+			out.close();
+			if (!canceling)
+			{
+				fireDone(fileDest);
+			}
+			else
+			{
+				//fireCancel(fileDest);
+			}
+		}
+		catch (Exception ex)
+		{
+			fireException(ex);
+			ex.printStackTrace();
+		}
+	}
+
+	public void addDownloadProgressEventListener(DownloadProgressEventListener eventListener)
+	{
+		synchronized (listeners)
+		{
+			listeners.add(eventListener);
+		}
+	}
+
+	public void removeDownloadProgressEventListener(DownloadProgressEventListener eventListener)
+	{
+		synchronized (listeners)
+		{
+			listeners.remove(eventListener);
+		}
+	}
+
+	protected void fireConnecting()
+	{
+		Object[] ls;
+		synchronized (listeners)
+		{
+			ls = listeners.toArray();
+		}
+		for (int i = 0; i < ls.length; i++)
+		{
+			((DownloadProgressEventListener)ls[i]).connecting();
+		}
+	}
+
+	protected void fireStarted()
+	{
+		Object[] ls;
+		synchronized (listeners)
+		{
+			ls = listeners.toArray();
+		}
+		for (int i = 0; i < ls.length; i++)
+		{
+			((DownloadProgressEventListener)ls[i]).started();
+		}
+	}
+
+	protected void fireProgressChange(int progress, int max)
+	{
+		Object[] ls;
+		synchronized (listeners)
+		{
+			ls = listeners.toArray();
+		}
+		for (int i = 0; i < ls.length; i++)
+		{
+			((DownloadProgressEventListener)ls[i]).progressChange(progress, max);
+		}
+	}
+
+	protected void fireDone(File fileDest) throws Exception
+	{
+		Object[] ls;
+		synchronized (listeners)
+		{
+			ls = listeners.toArray();
+		}
+		for (int i = 0; i < ls.length; i++)
+		{
+			((DownloadProgressEventListener)ls[i]).done(fileDest);
+		}
+	}
+	protected void fireException(Exception ex)
+	{
+		Object[] ls;
+		synchronized (listeners)
+		{
+			ls = listeners.toArray();
+		}
+		for (int i = 0; i < ls.length; i++)
+		{
+			((DownloadProgressEventListener)ls[i]).exception(ex);
+		}
+	}
+}

+ 231 - 0
main/app_share/serverbootstrap/DokeosAppShare/LocalRelay.jsl

@@ -0,0 +1,231 @@
+package DokeosAppShare;
+
+import System.Collections.Generic.*;
+import System.ComponentModel.*;
+import System.Data.*;
+import System.Drawing.*;
+import System.Windows.Forms.*;
+import java.io.*;
+
+/**
+ * Summary description for LocalRelay.
+ */
+public class LocalRelay extends System.Windows.Forms.Form implements DownloadProgressEventListener
+{
+	private Thread thread;
+	private DownloadThread download;
+
+	private Button button1;
+	private PictureBox pictureBox1;
+	private ProgressBar prgDownload;
+	private Label serverID;
+	/**
+	 * Required designer variable.
+	 */
+	private System.ComponentModel.IContainer components;
+
+	public LocalRelay(DownloadThread download)
+	{
+		//
+		// Required for Windows Form Designer support
+		//
+		InitializeComponent();
+
+		this.thread = Thread.currentThread();
+		this.download = download;
+		this.download.addDownloadProgressEventListener(this);
+	}
+
+	#region Windows Form Designer generated code
+	/**
+     * Clean up any resources being used.
+     */
+	protected void Dispose(boolean disposing)
+	{
+		if (disposing)
+		{
+			if (components != null)
+			{
+				components.Dispose();
+			}
+		}
+		super.Dispose(disposing);
+	}
+
+	/**
+	 * Required method for Designer support - do not modify
+	 * the contents of this method with the code editor.
+	 */
+	private void InitializeComponent()
+	{
+		System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(LocalRelay.class.ToType());
+		this.button1 = new System.Windows.Forms.Button();
+		this.pictureBox1 = new System.Windows.Forms.PictureBox();
+		this.prgDownload = new System.Windows.Forms.ProgressBar();
+		this.serverID = new System.Windows.Forms.Label();
+		((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+		this.SuspendLayout();
+		// 
+		// button1
+		// 
+		this.button1.set_Image(((System.Drawing.Image)(resources.GetObject("button1.Image"))));
+		this.button1.set_Location(new System.Drawing.Point(170, 231));
+		this.button1.set_Name("button1");
+		this.button1.set_Size(new System.Drawing.Size(49, 42));
+		this.button1.set_TabIndex(2);
+		this.button1.set_UseVisualStyleBackColor(true);
+		this.button1.add_Click(new System.EventHandler(this.button1_Click));
+		// 
+		// pictureBox1
+		// 
+		this.pictureBox1.set_Image(((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))));
+		this.pictureBox1.set_Location(new System.Drawing.Point(20, 11));
+		this.pictureBox1.set_Name("pictureBox1");
+		this.pictureBox1.set_Size(new System.Drawing.Size(199, 182));
+		this.pictureBox1.set_TabIndex(4);
+		this.pictureBox1.set_TabStop(false);
+		// 
+		// prgDownload
+		// 
+		this.prgDownload.set_Location(new System.Drawing.Point(20, 199));
+		this.prgDownload.set_Name("prgDownload");
+		this.prgDownload.set_Size(new System.Drawing.Size(199, 26));
+		this.prgDownload.set_Style(System.Windows.Forms.ProgressBarStyle.Marquee);
+		this.prgDownload.set_TabIndex(6);
+		this.prgDownload.set_Value(50);
+		// 
+		// serverID
+		// 
+		this.serverID.set_AutoSize(true);
+		this.serverID.set_Location(new System.Drawing.Point(17, 239));
+		this.serverID.set_Name("serverID");
+		this.serverID.set_Size(new System.Drawing.Size(10, 13));
+		this.serverID.set_TabIndex(7);
+		this.serverID.set_Text(".");
+		// 
+		// LocalRelay
+		// 
+		this.set_AutoScaleDimensions(new System.Drawing.SizeF(6F, 13F));
+		this.set_AutoScaleMode(System.Windows.Forms.AutoScaleMode.Font);
+		this.set_ClientSize(new System.Drawing.Size(237, 287));
+		this.get_Controls().Add(this.serverID);
+		this.get_Controls().Add(this.prgDownload);
+		this.get_Controls().Add(this.pictureBox1);
+		this.get_Controls().Add(this.button1);
+		this.set_FormBorderStyle(System.Windows.Forms.FormBorderStyle.FixedSingle);
+		this.set_Icon(((System.Drawing.Icon)(resources.GetObject("$this.Icon"))));
+		this.set_MaximizeBox(false);
+		this.set_Name("LocalRelay");
+		this.set_Text("LocalRelay");
+		this.add_FormClosed(new System.Windows.Forms.FormClosedEventHandler(this.LocalRelay_FormClosed));
+		((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+		this.ResumeLayout(false);
+		this.PerformLayout();
+
+	}
+	#endregion
+
+	/** @delegate */
+	private delegate void connectingDelegate();
+	public void connecting()
+	{
+		if (!Thread.currentThread().equals(thread))
+		{
+			this.BeginInvoke(new connectingDelegate(this.connecting));
+			return;
+		}
+		prgDownload.set_Style(ProgressBarStyle.Marquee);
+		prgDownload.set_Value(prgDownload.get_Maximum());
+	}
+	/** @delegate */
+	private delegate void startedDelegate();
+	public void started()
+	{
+		if (!Thread.currentThread().equals(thread))
+		{
+			this.BeginInvoke(new startedDelegate(this.started));
+			return;
+		}
+		prgDownload.set_Style(ProgressBarStyle.Blocks);
+		prgDownload.set_Value(prgDownload.get_Minimum());
+	}
+	/** @delegate */
+	private delegate void progressChangeIntegerDelegate(Integer progress, Integer max);
+	private void progressChangeInteger(Integer progress, Integer max) { progressChange(progress.intValue(), max.intValue()); }
+	public void progressChange(int progress, int max)
+	{
+		if (!Thread.currentThread().equals(thread))
+		{
+			this.BeginInvoke(new progressChangeIntegerDelegate(this.progressChangeInteger), new Object[] { new Integer(progress), new Integer(max) });
+			return;
+		}
+		if (max <= 0)
+		{
+			max = 364544;
+		}
+		if (progress > max)
+		{
+			progress = max;
+		}
+		prgDownload.set_Value(progress);
+		prgDownload.set_Maximum(max);
+	}
+	/** @delegate */
+	private delegate void doneDelegate(File fileDest);
+	public void done(File fileDest)
+	{
+		if (!Thread.currentThread().equals(thread))
+		{
+			if (download != null)
+			{
+				download.removeDownloadProgressEventListener(this);
+				download = null;
+			}
+
+			this.BeginInvoke(new doneDelegate(this.done), new Object[] { fileDest });
+			return;
+		}
+		//this.set_Text("done");
+		//prgDownload.set_Value(0);
+	}
+	/** @delegate */
+	private delegate void exceptionDelegate(Exception ex);
+	public void exception(Exception ex)
+	{
+		ex.printStackTrace(System.out);
+		if (!Thread.currentThread().equals(thread))
+		{
+			this.BeginInvoke(new exceptionDelegate(this.exception), new Object[] { ex });
+		    return;
+		}
+		//this.set_Text("Exception: " + ex.getMessage());
+		String errorMsg = "Connection error.";
+		if (ex.getMessage() != null)
+		{
+			errorMsg = ex.getMessage();
+		}
+		MessageBox.Show(errorMsg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+		Application.Exit();
+	}
+
+	private void button1_Click(Object sender, System.EventArgs e)
+	{
+		this.Close();
+	}
+
+	private void LocalRelay_FormClosed(Object sender, FormClosedEventArgs e)
+	{
+		if (download != null)
+		{
+			download.removeDownloadProgressEventListener(this);
+			download.cancel();
+			download = null;
+		}
+	}
+
+	public void setServerID(String inServerID)
+	{
+		serverID.set_Text(inServerID);
+	}
+
+}

+ 848 - 0
main/app_share/serverbootstrap/DokeosAppShare/LocalRelay.resx

@@ -0,0 +1,848 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="button1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAABxxJREFUWEell3dM
+        VFkUxi/2uqIUERFcNSq6mth7WXuL3cRYo66F6Lrqura4ltgWe1kTRUGy2aZ/amJBdkFhARUEC0MXWBmG
+        YWBmGGbeMCie/c5jHjIMTZfki86b++73u+ece+4dF9GIv2NCfOMixLVGDK0a0lSIn3cL8e2nvFPr2JNC
+        bLjq7i6VBgaS9dIlZ128SNbz58l67hxJp0+TdPIkWU6coN/9/CS8e+p/AfwkRMBVDw+p5MgR0qxfT2kT
+        JzpqwgRKg1LHj6fUceModexYSh0zhnIXLqSS/fvpNx8fCXMggJ/xFyjElmuenlLJ0aOk2bCB0iZNctTX
+        X1Mai6FqgcgBhHHPHvrV25shDn8SAsy3srnp2DHK55VPniwrfcoUWcpnGaoeiNwFC8iwcyf94uXFEPsa
+        BYG8bQ/28rIo5opp+tSp5CAFpDYIeypSR4+mnPnzSb9tG93AgrCw7+uF4AEhdnP1unWVK2bjadMoffr0
+        j+LP/LwmRI1UpABANWoUZc+bR/otWyjE3d2CBX5XKwTMfwjt0kUOu3rt2o8hZyOYq2fPpnJMlDVjRiWI
+        HUJOR7Uo6AAl4R0uSBUAkgHweuRIGaJo0yYK7tSJ0xHgAIEHe0K9veWw561eXTmhknNMpp41i2xr1pDh
+        5k2yLl5MmXUAFALKsnkzGc+eJRPGMMBrALwCwMsRIyhrzhzSIrJBHTpI3FuqII4LQRJeylu5srKqubAA
+        wSFWY8VlgMrPyCC1Wk3627fJigrPrJECHcZJCLM6N5fy8vLIgP5gwrPqAInDhlEmIlmMXcWeDgBWvMD7
+        mbeUAsBReI9J9Lduyeb5+fmk0WjIcOdOJYQ9/DpMKm3fTgUw5u95XH5aGhHezUAqXiACScOHEwM8HzqU
+        DIhS/QDVosAmZYsWkf7uXSooKCCtVkuFhYVkvHePrEuXUtHcuWTdvZt0MObv5DFZWVSG7ZuNKMrmCH8i
+        AJ4DIGHIEDIEBNQBwN1MiYLS9ZCODIZYtoyMYWGyuU6no6KiIjLhsw3NpgjG/Ex+npNDNqQiG/XwAvlP
+        AkAiAGRzrD4eAPqNG2sBuHChspXaIWqCZACkDIVoioig4uJi0uv1znr7lmw7dlD2zJmO5lh9AgDiAfBs
+        8GDSIzrOKWAA9HFZtYGgNhjCiq1kjowkg8FARqPxo5CC8r17KRs7xmHlMI8fNIieDhhAcf7+FNu3LxWj
+        qJ0BcKKlIGTcvaogFBCOil3FSEX58eNUUlJCJpOpSpbERKpAIb7CHM969aJYT0+KbtuWIps0oQhU/N/Q
+        X1A4pMVczgA4TlOQryoIBaRaVAqXLycbImXC6ktLS2WZzWZZ8v8RGTMKNqZ5c3oEo0iopnkYA2BOJwDp
+        zBlKQbHIsoMwjAJUuGoV2S5fplKEnc0sFgtJqAMrKp4BOBoclVLUiHnFCopu0cLB/CGM2fwBVIB5nQFO
+        naIUFEoKcuYAAhjZPCioauVsbkUUyg8fpgpUdFlsrAzEYDJEVBSVotk8btlSDnt18/v4rMGczgC48ahQ
+        pTKEAgIYHVpnWXAwlcCQVymbY+W2gwdJhVzHwcSCbWeLj6+C4OI0xcSQGTsiAt8rK2fzewyAeZ0AzCis
+        XDQVFfYpgyiy4jZkCQ+vXBmHHvvfhkuKqk8fisZkUVBMq1Zk2bWLylCInA4ea8zOpg+4nkV7eMhhV8zv
+        oyjzMb8DAA6ji3/27Gk17ttHOTgwVNirrGTAJCMapgMHyPLwIZWg4diQKlW/flXmjzE5F1x069ZkPnSI
+        pJcvqRQtme+JMV27Opmn9e5NCd27f3AA4EMBt8cLf/ToYTVs3UpvuH/j5edubvQUIXzStCnxc8JOUWE/
+        KytXzLnaeZs9atOGLACsuHKFYnx8HMwfYI4M9ICnfn4VgS4uxTj+/Z3uBXh4LtTNTSpasoRUfn70BJPG
+        QbEsTJDAe9sedsW85jaLQCQeubo6mjdrRpnchHx9K+BRcESIL+u8GWHAmdCOHaVCnHbJvr6yeQz0D4e5
+        AfOa1c4FF8bmSFmUj8973Ib+xfw+Dd4N+T4f4uoqFaIok7t1czKvrcHUZv4QDelN//4U4e39DsbpSLNn
+        g+bKgKOIRAhuLlr09lfIJ1c7h72x5uFoRNmolzAvr3cnhFAtEaJro80xsC3ktVeIK9fbt7cW4GhNQlE2
+        2hyFmzNwIN3t3PkdfhAk+wkxGPNx6DtA+JVX/x8P+AJi4r64R98IateujG89RThmdbjr6XAd0+KOoMXp
+        qMUpyYcL93cNWqwGrTwfW/eOh0f5j0IkuQsxEfN8BYFDdGwMAOPht6U8uBvkv0OI67xvP0X7hYhrL8Q4
+        uzlXvSvUpKHV1/yeQTgdnaGeUH9oEDQCGguNhybYxWajoCHQAPt4Lro2n2NcFyinh6FaQK2g1nYD/pc/
+        83P+vsE8Kwb/ARnx5FQWQTVzAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        Qk3GjgAAAAAAADIEAAAoAAAAxAAAALUAAAABAAgAAAAAAAAAAADTDgAA0w4AAP8AAAD/AAAAAAMA/wAB
+        Cf8IAgX/BQsF/wIUAv8DAy3/DhEP/wMgCf8CBUH/Ex0S/wgpAv8iGxf/GRwb/wQzA/8MHzH/Aj4D/ywn
+        Jf8MPAn/BTwN/zEvGf8oKin/Iy4j/ys6Cv8bFGb/XzIb/0cyJf8lRQ3/VDMg/xY6K/8IUQT/EhN9/wBS
+        Cf8SSxH/NDU0/xpKFf8yIWL/DFsB/w0OoP8pGof/QEkn/3NEIP8XNWL/BGcH/wVaJP9zPzL/V0wj/z9C
+        QP9nRi3/Aw3D/wAXsf9eRjP/RTRg/wc1eP8CKpD/CAPi/wIA7f9cP1L/BXcH/wFKY/8SCtv/AH0A/wt8
+        AP8MQHb/AAL2/xtTTf8FAP3/AAD//3VTMv8DggD/AoAH/25HUP8AhQD/hVQx/whWXv9dU0j/AlxY/2xV
+        Qv8XdyD/UVRR/xFCjP8QigD/MEl1/yNIf/8MhRP/PFJs/0RhTv8rUnb/FIMh/51fN/8LfTL/KSjP/0Rd
+        Xf+LX0H/lWE6/wNWjP8XkBP/alVs/4hkRv9eYWH/IVGa/zl5Rv8Zbm7/GX5P/ylYlv8TeV//rWdN/z08
+        y/8VZ4b/C3N0/0VjgP8UU7L/gWtc/xxXqf8zb3L/u3E9/75uQv+jcEj/rnFC/7FuR/91bGH/Ol6T/7Vy
+        P/9SZX7/R2CM/zpZof/GbkX/GFqv/yuKTv9BVrH/MVe1/21xcf8DhXz/fXJ4/7x9Tv8Ag4j/D1zQ/w+D
+        hP+ofVz/Fn6S/09R1/9Bjm7/M4KN/7SBYP8ab7z/an2F/yRoyv97f33/vYRb/zyIhf8Ua83/iYB6/5yC
+        cf86b8P/SYaS/wRq4/9aa8T/QXuv/yJ/tP9gY9X/H2ve/3mBlv9WeLX/AGX7/3qUdP9afqz/a4Gh/xd0
+        3v/Kk23/Jnfh/yOB0P8ab/f/Mnje/yV17P+Ykon/w5Z0/6uTg/+BkZj/jpOS/4OEwv97fNb/ZJeq/xl9
+        /v8jfvv/JXz//y1++f97heD/Qojx/9GlhP9olsn/l6Cl/3WXxf9tktP/WJDi/8ankf+ipKX/jZ66/zaQ
+        +P+ppaX/LJT7/zqa9P8um/n/lpvZ/7Gptv9QnvH/1bSb/5el0v+nsrT/t7Kx/7G0sf+ersz/car0/12w
+        8f+8v77/38Ou/5W35P+tvtP/2cW2/6a92v+Kt/L/zMXA/7rC1P9+vfX/tr3j/8XJyP/p0cD/ssvm/87S
+        0f+/097/yc/j/+HWzf/a2NH/2tPd/9rW2P/W2tn/rNj8/+Xi3v/b3ez/3uLi/+/k2v/N4Pn/1ubq/+jr
+        6f/u6+j/6fP4//H18//69fX//fb////+7//s/Pv/+Pv5//P9/f/6+/////74///7/v/8//3//v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v5ydnJy
+        dnJ2cnJ5eXL+/v7+/v7+/v7+/v7+/v7+/v5ydnJ2cnZ5dnl2/v7+/v7+/v7+/nl5dnZy/v7+/v7+/v5y
+        eXJ5dnJ5/v7+/nJ2cnlycnZydnJ2cnZydnL+/v7+/v7+/v5ydnJ2cnZ5dnl2/v7+/v7+/v7+/v7+cnZy
+        dnJ2cnZ2eXb+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+eXl5eXl5eXl5dnZ5cnl5/v7+/v7+/v7+/v7+/nl2eXl5eXl5dnlyeXl5/v7+/v7+
+        /v52dnl5ef7+/v7+/v55eXZ5cnl5/v7+/v55eXl2eXl5eXl5eXl5eXl5/v7+/v7+/nl2eXl5eXl5dnly
+        eXl5/v7+/v7+/v52cnl5eXl5eXl5eXJ5eXn+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/nJ2cnZ2cnZydnJ5eXZ5cnJ2/v7+/v7+/v7+/nZ2dnl2
+        cnZydnJ5cnlycnb+/v7+/v7+dnl5dnL+/v7+/v52eXJ2eXZ5/v7+/v7+cnZydnl2dnJ2cnZydnJ2cv7+
+        /v7+/nZ2dnl2cnZydnJ5cnlycnb+/v7+/v7+dnl5dnJ2cnZydnJyeXJ2cv7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v55eXl5eXl5eXl5cnZ5dnl5
+        eXn+/v7+/v7+/nJ5eXlyeXl5eXl5cnl2eXl5ef7+/v7+/nlycnl5/v7+/v7+eXZ5eXJ5/v7+/v7+/nl5
+        eXlyeXl5eXl5eXl5eXn+/v7+/nJ5eXlyeXl5eXl5cnl2eXl5ef7+/v7+/nlydnl5eXl5eXl5eXZ5eXl5
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        cnZydnL+/v7+/v55eXJ5dnZy/v7+/v7+/nZyeXJycnn+/v7+/v55dnl2dnL+/v7+/v5ycnl5cv7+/v7+
+        cnlyeXZyef7+/v7+/v5ydnJ2cnn+/v7+/v7+/v7+/v7+/nZyeXJycnn+/v7+/v55dnl2dnL+/v7+/v52
+        cnl5/v7+/v7+/v52eXZydnL+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/nl5eXl5/v7+/v7+/nJ5cnl5eXn+/v7+/v55eXZ5eXn+/v7+/v7+/nlyeXl5
+        ef7+/v7+eXl2dnn+/v7+eXl2eXJ5ef7+/v7+/v7+eXl5eXn+/v7+/v7+/v7+/v7+/v55eXZ5eXn+/v7+
+        /v7+/nlyeXl5ef7+/v7+eXn+/v7+/v7+/v7+eXJ5eXl5/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v5ydnJ2cv7+/v7+/v7+eXZ5cnJ2cv7+/v5ydnJ2
+        eXb+/v7+/v7+/v55cnlycnb+/v7+/nJ2dnl5/v7+cnlydnl2ef7+/v7+/v7+/nJ2cnZy/v7+/v7+/v7+
+        /v7+/v5ydnJ2eXb+/v7+/v7+/v55cnlycnb+/v7+/v7+/v7+/v7+/v7+/nZyeXJ2cv7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+eXl5eXn+/v7+/v7+
+        /v55dnl5eXn+/v7+eXl5eXJ5/v7+/v7+/v7+/nl2eXl5ef7+/v55eXlycnL+/nl2eXlyef7+/v7+/v7+
+        /v55eXl5ef7+/v7+/v7+/v7+/v7+eXl5eXJ5/v7+/v7+/v7+/nl2eXl5ef7+/v7+/v7+/v7+/v7+/nl5
+        eXZ5eXn+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/nZ2cnZy/v7+/v7+/v7+eXJ5dnZy/v7+/nJ2cnZyef7+/v7+/v7+/v55dnl2dnL+/v7+cnZycoV5
+        eXZydnl2cnn+/v7+/v7+/v7+cnZydnL+/v7+/v7+/v7+/v7+/nJ2cnZyef7+/v7+/v7+/v55dnl2dnL+
+        /v7+/v7+/v7+/nZyeXl5cnJ2eXZy/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v55eXl5ef7+/v7+/v7+/nZ5cnl5ef7+/v55eXl5ef7+/v7+/v7+/v7+
+        dnlyeXl5/v7+/nl5eXZydnZ5eXlyeXn+/v7+/v7+/v7+/nl5eXl5ef7+/v7+/v7+/v7+/v55eXl5ef7+
+        /v7+/v7+/v7+dnlyeXl5/v7+/v7+/v55eXl5eXJydnl5eXJ5ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+dnJydnL+/v7+/v7+/v7+eXZ5dnL+/v7+
+        eXZydnL+/v7+/v7+/v7+/nJ5cnlycv7+/v5ydnJ2eXl5eXJ2cnn+/v7+/v7+/v7+/v5ydnJ2cnZydnJ2
+        cnZydnL+/v7+eXZydnL+/v7+/v7+/v7+/nJ5cnlycv7+/v7+/nJyeXJydnJ2eXl5dnZyef7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/nl5eXl5/v7+
+        /v7+/v7+/nJ5dnl5/v7+/nZ5eXl5/v7+/v7+/v7+/v55cnl2eXn+/v7+eXl5eXJ2cnJ5eXn+/v7+/v7+
+        /v7+/v7+eXl5eXl5eXl5eXl5eXl5/v7+/nZ5eXl5/v7+/v7+/v7+/v55cnl2eXn+/v7+/nl5eXZ5eXl5
+        eXJ2cnl5ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v52cnZ2cv7+/v7+/v7+/nlyeXJ5cv7+/v55eXJ2cv7+/v7+/v7+/v7+eXZ5dnl2/v7+/nJ2
+        cnZyeXl5eXZydv7+/v7+/v7+/v7+/nJ2cnZydnJ2cnZydnJ2cv7+/v55eXJ2cv7+/v7+/v7+/v7+eXZ5
+        dnl2/v7+/nl2cnZ2eXZ2cnZyeXl5/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+eXl5eXn+/v7+/v7+/v52eXZ5cnn+/v7+dnJ5eXl5/v7+/v7+
+        /v7+/nJ5dnlyef7+/v55eXl5ef7+dnZ5eXl5/v7+/v7+/v7+/v55eXl5eXl5eXl5eXl5eXn+/v7+dnJ5
+        eXl5/v7+/v7+/v7+/nJ5dnlyef7+/v5yeXl5eXJ5eXl5ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/nZydnJy/v7+/v7+/v7+eXl2eXZ5
+        /v7+/nl5eXZydv7+/v7+/v7+/v5yeXJ5cnn+/v7+cnZydnL+/nl5eXJ2cnb+/v7+/v7+/v7+cnZydnL+
+        /v7+/v7+/v7+/v7+/nl5eXZydv7+/v7+/v7+/v5yeXJ5cnn+/v7+eXlydnJyef7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v55eXl5
+        ef7+/v7+/v7+eXZyeXJ5/v7+/v52cnZ5eXn+/v7+/v7+/v55eXZ5cnn+/v7+/nl5eXl5/v7+cnJ5eXl5
+        /v7+/v7+/v7+/nl5eXl5/v7+/v7+/v7+/v7+/v52cnZ5eXn+/v7+/v7+/v55eXZ5cnn+/v7+/nJ2eXl5
+        ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+dnJ2cnb+/v7+/v7+eXJ2eXlyef7+/v7+/nl5eXJ2cv7+/v7+/v55dnJ2eXZ5/v7+
+        /v5ydnJ2cv7+/v55eXZydnL+/v7+/v7+/v5ydnJ2cv7+/v7+/v7+/v7+/v7+/nl5eXJ2cv7+/v7+/v55
+        dnJ2eXZ5/v7+/v55eXl2cnb+/v7+/v7+/v7+cv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/nl5eXl5ef7+/v52cnZ5eXJ2ef7+/v7+/v5ydnJ5eXl5
+        /v7+/v52cnl5eXJ5/v7+/v7+eXl5eXn+/v7+/nZ5eXl5ef7+/v7+/v7+eXl5eXl5/v7+/v7+/v7+/v7+
+        /v5ydnJ5eXl5/v7+/v52cnl5eXJ5/v7+/v7+cnZyeXl5ef7+/v7+/nZyeXn+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v52cnZydnJ2cnZydnl5eXZy
+        eXn+/v7+/v7+/nl5eXZydnJ2cnZydnl5cnZyef7+/v7+/nJ2cnZy/v7+/v7+eXJ2cnZy/v7+/v7+/nJ2
+        cnZydnJ2cnZydnJ2eXb+/v7+/nl5eXZydnJ2cnZydnl5cnZyef7+/v7+/v55eXlydnJ2cnZydnJ2eXly
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        eXl5eXl5eXl5eXlydnJ5ef7+/v7+/v7+/v7+cnZ5eXl5eXl5eXlydnl5ef7+/v7+/v55eXl5ef7+/v7+
+        /nJ5eXl5eXn+/v7+/v55eXl5eXl5eXl5eXl5eXJ5/v7+/v7+cnZ5eXl5eXl5eXlydnl5ef7+/v7+/v7+
+        /nJ2eXl5eXl5eXl5eXJ2ef7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/nZydnJ2cnZydnJ2cnl5ef7+/v7+/v7+/v7+/v55eXJ2cnZydnJ2cnl5/v7+
+        /v7+/v7+cnZydnL+/v7+/v7+eXZydnJ2cv7+/v7+cnZydnJ2cnZydnJ2cnZyef7+/v7+/v55eXJ2cnZy
+        dnJ2cnl5/v7+/v7+/v7+/v7+eXl2cnZydnJ2cnZyeXn+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v55eXl5eXl5eXl5eXn+/v7+/v7+/v7+/v7+/v7+
+        /v55eXl5eXl5eXn+/v7+/v7+/v7+/nl5eXl5/v7+/v7+/v55eXl5eXn+/v7+/nl5eXl5eXl5eXl5eXl5
+        ef7+/v7+/v7+/v55eXl5eXl5eXn+/v7+/v7+/v7+/v7+/v7+eXl5eXl5eXl5ef7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        +/7++/7+/v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f77/v7+/v77/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f7+/v7+/f7+/v7+/vv+
+        /vv++/v+/fz+/P7+/vz+/v78+/z8/v7+/v77+/v++/z8/v7+/P7+/v7+/P79/f7+/P7+/v7+/vz8/vz9
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f3+
+        /v7+/v7+/v7+/v7+/f78/vn++/z8/fv9/f78/v76+v39/vn6+vn5/vz8/Pz7+/z9/fv7+/v+/v7+/vv9
+        +vr7+/v8/v7+/v7+/f37+/39/v7+/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v3+/P7++/v+/v39/v3+/f77/fz8/fv8/Pr8/P78+f33/P7++fX39/fx8e3m
+        5tvPw7C9sbGxvc/b6/L1+/n7+f75/P7+/v7+/P7+/v7+/v79/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv+/v7+/fv9+/z8/P35/vv++/r+/Pz5/Pf3/vn5+vn7
+        +/7z8uvm39TOvbB6bVZSUj4+PlJ8Z3xnY3xSUlFUoM/r9Pz7+/7+/v75+fn9+/z+/vv++fn9/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P39+/7+/v78+/n5/v7+
+        /P36+fn79P38/Pz39O7lz8WSoIJ6UVJ8Y25ukZiYwLy81tbZ2dnR0dHRvr68oWc+VMr1+ff8+/n7+/77
+        +/39/f39/P79/vn+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /f7+/vz9+/39+/77+/v9/fv08/T18qB6bXtRUVE0NE9wcJifkavAwNLNzeTs5/Ly8e3m7ejo6Ojo29vn
+        1NzRw6FR7P3y8/Hy6+bp7e3t8u3x9Pv7+fv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7++f79+/Ty8enp6Ojo6OLi4ujl2NBUeG6BfpGRkavAwL+/1tnv7+zx7fPx
+        7ezs5OPt7fHr7ejo6eLo39vn29vJVKCtkKV6VHttbXt7UXp6oK3P5vn+/P7+/v79/f7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P377enn39TU29TU1NDU1MrOz8/QemeHkZir
+        mLrAwMDSwNLSwMDAy7q6urq6urra8fLx8fLt6ejo6ejf29/c3nwppJykw8PNw8PDw8OlvqV4e1F6zvH+
+        /v3++f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3t6dvf29/U29vU
+        1NTU1M/U0NTP0KA+kZGYkZGrkaaogGCbgYCAgYGAgICAm4Gf0vz79PHx8fLy6eno4ujf28+heuTs6+3r
+        5+ji4tvf39zc3NzRpVag/f39/v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7++/Ht7eni6OLf5Nvb29vU29Tb29TOUZGHn6ufn6ysrHgbI5uAgJuAgJuAm4GBqtL09fT49fLx
+        8fLr6eji6N/coWLk5Ojj7ufo7uXm5t/f29vb3Ne+UfT+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v77/vz8+/318fXy6/Lr7e3p6enp6OLb6HqBn5+fn6yfrLa6m7q6urq6
+        uri4xLi4uLjT+/X7+/X0+/Ht7e3r6eji278pwLrA1vHn7fLo6enp4uLf29vUzVLf+f7+/f7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/7+/v7+/v7+/P37+/Xx+/Lx7PHt6ejo6ejo4t/o4t+x
+        UZ+fn5+4n7q4tbi4uLe3tre4uLe3t7i30vr29fT5/fTx9fLr6ebp5t+/NKi3ttrz8vDt7Ozp6eni4t/b
+        29d4wv77/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/v3+/v7+/f78/v79/v78/Pz+/v7+/v779PT78fTx
+        8fHt8vLy7eno4uLf5OLbylSRn6usrKy4tri4uLi3t7e3t7i3t7i4t9P6/fv0+/309fXx7e3t6ejjoTS6
+        t7ja/PLz9vLt6+vo5eTf29vcmJL5/fz+/f7+/v7+/v7+/v7+/vv7+/v7/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f39/f39/v3+/v7+/f7+/v7+/vz+
+        /vn5/vv7+/39+fv78vTr6+jp6OLf1MrQxcLCsa2xrZZbUp+qq6i4uLe2uLe3t7i3uLe3t7i3t7XL7/f3
+        +/z0+/vx8vHt6e3m3nxPxLe36vT19PXs++3r6+nm5tvb3L6E+f7+/v7+/v7+/v7+/v7+/vv8/Pz8/P7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v78/v7+/v7++fn7+/39+/v9/f319fXy8enp6Nvf29zU1M/PwsLCscKxwsLFwrHFsVFjn6qsrLa2uLa3
+        uLe4t7e4t7i3t7e2y+/39fP0+f318fLy7e3t6M1SkcS3t9r0+/T28fXy8uzt6OLo5eSkgvT9/v79/v7+
+        /v7+/v7+/v78/Pz8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7++/v+/v7++/79+/v7+/399fvx8fHy7e3p6eLi4uLo6Nvi39Tb1NTU1M/Qz9DK0MrC
+        wsLFrcWSUZGsqqysuLa4uLe3uLe4t7i3uLe4t7rq9/v7+/v0+/Hz8u7l5d+hNKu4uLfa+/X8+/b08fHy
+        6+ni6NvcoYT5+f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P78/Pv++f359fT19fLy8e3t6+3t6+no6Ojn6enp6OLi
+        4t/b59/b29vP1M/Q0NDQwsXCwsLFxWJWq7isrLi4uLe3t7e3uLe3uLe3uLe42v719fT88fvx8e7o6OTX
+        Y4G4t7i30vvz+f319Pvx8u3s6ejl3KGx/v7+/v7+/v7+/v7+/v7+/v3+/v39/f78/v39/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f7+/vn89fX08vTy8fHx8fHy
+        8e3r6+zy7e3t7evr5+vm6Obo4t/f39TU3M/U1NDP0NDQz8/Fz8/QkFKrrKysuLi4t7i3uLe3uLi3t7i3
+        uNL49fv19PXy8evo6+fhvzSruLi3uNLz+/T1/fvx8u3t7Ono59xSz/39/f7+/v79/f78/v79/P399vb9
+        /fb2/fv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /vn5+fT09PH08fT08fTy8vHy8vHx8fHx8fHx8fHx7ezp6eLm5ubm4t/f39/b29/b29/i3+Tk3+l6Y5Gs
+        rLisuLa4t6q4t7e3t7e4t7jL7/X19/Ty8e3t7evhvjSYuLi3t7jA8/38/PT78vbt6+vp5d/DUvH5/v7+
+        /fz7+/n8/fb89PDe3smyssnK3uTt+/38/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/f39/f39/f39/f399f319PTx9PT09PHx8fHx8fLy8vLy8vHx7e3t7evr6+vr
+        7e3x7fHy8fLx9fX97aVnkbasuKy4uLe4uLi4uLi4uLe4ut3+9+vy8e3t6eLpw1Jjt7i4t7i3uO/3/PP9
+        9fHx8u3p6ObjpW37/v7+/P79/Pn8/Pfz3rOLOzY3Nzc7O1pqs8rk/f7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++fn+/f39/fX19fX19fX1
+        9PT0+fn5/f39/f39/v7+/v7+/v7+/v79+f75+f70vVF8qJqsrKysuqy4uLi4qri4uLjA7Ovt7e3m6enn
+        zVJPuri3t7i3uLrv/PX0+/Hx8e3t6ebivlbc/v7+/vz7/fX9/fPenlo2P0I/NzZanrnJ3uTp+/3+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f39/f3+/v79/v79/PXfkFKRn6ysrKymrKys
+        rLisrKisn9bs7Onp7Obee1KHrLi4uLi3uLe42vz19fHy7evr5ubi2Xuw9P7+/v77/Pz2/fOzOz8/QT83
+        O4vN8Pj+/Pz8/Pf+/v7++/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v39/f39/f39/f3+/v7+/v7+/v7+/v7+/f3+/v79/f39/f39/f39/f3+/v7+/v3+/f79
+        /fr5/PLRVIGYq6ufrJ+frKyfn6urrKq/5Ojp5N6lUU+Rtba2uLe3t7e4uNLs9fHz8u3r6eLr2Xh66/n+
+        /f7+/vz89/CbOz83P0E/O7Pv+vn8/PX9+fz1/fv+/v38/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7++/7+/v75+vn5/fKSDlFjmIefn5+fn5+sn5+fq7/Rw3pUerGkq6i2uLe4uLi4uLi6
+        7/Xy7enr5uvo13t66fz+/P79+/7+/O+LN0FBQUFBO7ny/f38/PXz8/b1/P38/fv+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv8/vv+/vn+/vWxSpbQoHpRfE9jcJhuboGBcE9SVHqg
+        2/Lx8L6YqLaquLisuLiqutby5unp5uPXw3p66fz9/v77/vv+9PKeNkE/P0FBQYvs9/Xk3rOenp6enrPN
+        4/bz+/z8/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/v78+/n59OlOSs/r7u7l
+        5cXFoIJUe1R6eoSxytvo6/Lu7u7y0aGYrJ+frJ+fn6i/7Obi4uTRoFax6/3++/z+/v35/PazOzdBP0E/
+        QTvN7MmLWjs2NzY3Nzc3O1qLyez7+/n+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /f7+/f7++d9gr+Du7u7u7u7u7u7u7vXu7u7u7u7u7u7u6+jg5e7foHCrqqqfqKyqmNHj182gVJDk+f7+
+        +f7+/fb89/zJOz9CPz9BQT8wm2o2QUFBQUFBQUE/Qjc3O1omstz8/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/f79/OJKl+DV4ODg4ODg5eXl5eXg4ODg4O7l5eXl5eDp5tvg4NulUquf
+        q5WVn4G/pW16kN/3+f37+/7+/vv29/fviz8/QT8/QT8/Nzc3Pz9BQT83QUE/O2qeyc3e3uTp+/7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77/v3+/vJKr9Xg4ODg4ODg4ODg4ODg1eDg4ODg
+        4ODg4Njg5eDn4OfY2IQpfDRnVlJRerHO8Pr+/v78+/z8+/3+9ffzuTtCPz8/QUJBP0FBP0FBQUFBPzda
+        m9zw9PT5/f73/v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f3+/f7+/v7+/v7+/v7+/v7+/v7+/v78/P7+/Otvl9XY1dXV
+        1dXV1dXV1djY1dvV2Njg4NXg1eDB1dXV4NXY1djPd4S9ztTp8fv7/fz9/fv5/vz++/z++vv15GpBQUFB
+        QUFBQUE/P0FBQT83Njay3v73/vr5+fn5/v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f7+/v3+/v7+/f7+/v7+/v7+/v7+/v7+
+        /v7++/n7+/zFb8zV1czV1czV1czV1dXV1dXY1dXY1dXV1dXVwa/V1dXV1czV1cFv2/z+/vf8/Pz8/Pz5
+        /vz8/v78/vr2+7k2P0JCP0JCQkJBP0JCQTdBN4ve+/7+/fv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/f79/f7+/v79
+        /v7+/v7+/v7+/v7+/v7+/v7+/fz5+/vlSsHMzMzMzMzMzMzMzNXM1czVzMzVzMzMzMzM1dWvwdXV1czV
+        zMzKr0ro+vn9+/v7+/37+/n5/v7++fn0/ORaPz9BP0FBQUI/Pz8/QkFBO5vs9vz+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7++/79/f79/v7+/v7+/v7+/v7+/v7+/v7+/v31l5fMzMHMzMzMzMzMzMzMzMzMzMzM
+        zMy7zMzKr4RKSq/MzMzMzMzMwcGXd/Pt6Nvbz8/P2+Xr9fr6+vr6+/3NO0E/QkJCQkJCPz8/Pz8/O7Pw
+        /Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/fz9/v7+/v7+/v7+/v7+/v7+/v7+/v77/vn922+7u8y7
+        u7u7u7u7u7u7u7u7u7u7u7vBzJdvGQsLSq/Mu8y7zMy7u7vBwTIyYVxdXGFcYUNhQ2+X2Ob0+vzznj9B
+        QUFBQUFBQUE3P0I/O7nt9/f5/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77/v7+/fz+/vn5/v7+/vv+/v7+/v7+/Pz+
+        /v7+/v7+/v7+8pavp7u7rru7u7u7u7u7u7u7u7u7u7uuwW8TCwwUEK+7u7u7u7u7u7u7wa6JGF2FeXl5
+        eXl5eXl5XUhhr9j83lo/Pz9CQkJCQkJCP0I/O7Pz/ff3+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/v77/v77/Pz8
+        9P37/fv8/v7+/v7++/v7+/v+/v7+/vv+/utvrqenp6enp6e7rq6urq67p66np6enwW8QBgkJDBCup6eu
+        rq6uu66uu66urigseXJycnl5eXJ5c3J5dFxhyrI2QT9BQUJBQUFBQkE/N2rv/fz++/v+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v79/vv+/vf8/e3De3jD9Pf5/vv9/fz9/fn8/Pz8/P7+/v7+/PetYaenp6enp6enp6enp6enp6en
+        p6enp4kbCwwODAwLl6eup6enrq6up66np650G1yOcnNycnl5eXl5eXl5eUgjNj8/P0JBP0JCP0E/QVrk
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v78/v3+/vr6/fN6eGM0UtT9+/v+/P77/v7+/v7++/7+/v7+/vz8lpeF
+        k5OTk6eTk5OTk5OTk5OTk5OTp5OniTILCxALC0aOjq6nk6eujq6np5OTjkgodHZ2eXmFeXV5eXlycnN1
+        MiU/P0FBQkJBQUFBQjaz8/3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv89/f+/vzjbdpjTz6g+/T+/v7++f75
+        +/z5/vv5/v7+/v7+7UyJhYWTk5OFhZOTk4WFk4WTk5OTk5OThZOOQxMLCQwLLomOjoWOiY6Ok5OTk450
+        GFxddF1cXEhcdFx0eXlycnQzNkJCQkJBQkJBQTdq8P39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v79/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv+/v76/vf39/T0
+        zsO+Pk80w/n7/Pr6+fz8/fb9/fn6+v7+/v7+/tsvhYWFdoWFhXmFhYWFhYV5hYWFhYWFhYVyhZOJb0NM
+        GRkvXHSJXGF1k4WFhYWFWCgvl5avz9jb28+tl2F0dXKFYSVCQUFBQj9BQT87yfT9/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78/vv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/fv8+O/q76XXpE9PNOT1+/z0/vf159vY2+X39/f8/P7+/v7FSIWFdnZ5eXl5hXl5eXl5
+        eYV5eYV1dYV2coV2eXJydl10dI50dXRdeXl5eXl5eVhITO70/v7++vr69OVhXXV5cnQeNz9CQkJCQkE/
+        i+z8+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/P77/v78+/v9/v7+/v7+/vv+/v7+
+        /v7+/v7+/v7+/v7++/77/P7+/P7+/v79/f3289rLqcCc4XhPT1bx/vfmz5dMMi8vLy8ySnfC5v7+/f35
+        klh5eXlyeXl5eXlydnl5eXl5dnl5cnl1eXJzcnJ5hXl5dXV5cnl1dXZ5cnlyeXlYSC/t/vn+/v76+Png
+        SHlydXN1FzZCQkJCPz9BO8n5+/n7/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vn5/Pn7
+        +/v7/vr5+f37+/r+/v39/f39/f39/f39/f39/f38/fz7/f37+vj+/frw1r+RpsbIy79nTzV71s6XQ0Nd
+        WHl5eXNpc3ZdQ0yt5vT884R2c2l5eXl5cnJ2dnl5dnl5dnZ5dnZ5eXlycnl5eXZyeXl0cnlhdHZ5eXJ5
+        eXlyWF0vz/76/P3++/jll1h5eXV5dB43QUFCQkJCP1rz/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7++/vy6/Ly8vHy9Pv19fT5+v7+/v3+/f35/Pz9/f39/v77+f75/P3+/P7+9fXzuqjE
+        tqaVj9KcUk9PcMucSnR1cnJyeXR0eXlycnJYXErb+PF3dWlydnl2dnmFeXl2cnlycnl5cnl5dnZ2eXl2
+        dnZ5eXZydXl2dHR5cnl5eXJ5eXldL5b99f76+/rul1x5eXV1eWElP0JCPz9CQjae9ff9/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v387enp5u3p6ent6/Lx8evr6+vr7evt7fHt7e3t7e3r
+        6+vy6/Ly8e7x6+vw1qnIx8fL3bzqfE9PT6nIyKSTdHV5eXV0eXl5eXV5c4VcQ5blb3VycnZ5cnl5dnJy
+        cnl5cnl5cnJ5cnJ5eXl2dnl5eXJ2eXV2dV11eXl5cnl5eXl5WEh37fLx8O3bYUh1eXSFfXk4O0E/QT8/
+        QkJayfT1/fv7/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v35+evbkpCSkoKQYpBbW1tb
+        W1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbbZzGyMbEx8vd2mNjT0/Lx8aol3V5cnJycnNyeXlyeXl5
+        eV1ILxtdeXVycnlycnl5eXlydnl2dnl5dnl5cnJyeXlycnJ5eXJydXR5eXlyeXl5eXJ1dFhdE1tbW05K
+        TFh5eXV5dXNcJjc3QUI/QkI3JVRVwvz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78
+        /vny31u0mY2UlGyKZWxlZWxsbGxsZWxlZWVlZWVlbGVsbGxsbGxsZWVrbGuVtsTGyMjEx8twTzR+yMjE
+        xKBpc3ZDShUcHC4yXXJ1dnN5dUgYWHl5cnl5dnl5dnZ2dnl5dnl5dnZ5dnaFeXlycoV5eXZycnR0aXJ5
+        cnl5eXJ5eVhYeRNJjUAnSHZ5eXV1eXJ5MztCP0FCP0FBO25sQKD8+fv+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7++f7889BViIiIiIOUg4ODg4OIiIiIiIOGg4OIiIiDg2yDiIaDg4ODiJ2px9Op
+        rIeamqbGxserY2NPboeaxMShhV0nQEuIbIhsQCdKc3NyeXl1XChYdXJycnl5eXl5eXl2cnlycnl5cnly
+        cnZ2eXlydnZ5eXZ5dXJzeXl5dnl5eXV0WFghQEAtYXJyc3l5cnN2RiY3Pz9BQUJBQTBrhkCx/fn+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v799fPOcZSIiIhscXFxcXFxcXFxcXFxcXFxcXFx
+        cWVxbIaGg4aGhp3ExsjHx9Pa0sCRh37SmGNPY8fEn5qmwGIcZYaGioqGhoaKSRNdcnl5eXVdGFiFcmly
+        cnl5eXJycnmFcnl5cnKFcnl5eXl2dnl5eXJ2cnl5eXl5eXl5eXl1WFhYGS0tdXJyeXl1eXJyWB47P0I/
+        QUJBP0ExiIZAsP78/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77/v3xzluDiI2IjbDQ
+        z8/Pz8/Pz8/Pz8/Pz8/Pz8/QzpSIg4OKhoiPxsbEyMfT3erq6uq81lZWPo/HyMjEmm5WiIaGhoaGhoaG
+        hoaKHEh5eXV5dV0sSHl5dnl5eXJ5hXlycnl2dnmFcnl2dnJyeXl2cnJ5eXl2dnJ5eVh5eXZ5WF1YWBtI
+        eXmFdXSTdXl5Rhc2QkI/P0FBQUI3NYiISbD0/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7++f79+dAcZWVJZUuj0NDQztTO0NDQ0NDQ0NDQ0NDQzs5AS0trOmxLj8TGyMjHx8TH093q6sBnZ2Op
+        yMjIxrWRa0lJS0tLS0tLS0tLSRwTSHJ9cnl5XShYdXl5dnZ2eXZydnl5dnl5dnJ2dnl5eXlycnl5eXZy
+        dnl5eXV5eXl5eXVdWEgbXXJ5eXVycnJpKBc7QUE/Pz9CQkJCOzRJSxyw+/3+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/vr+/f3fgmJiLgciktDQ0M/Pz9TU1NTQ1NDU0NTPz9DFJw8PDw8SEkCV
+        xMbIyMbHyMjEx8emcGNjx8fGyMfGpkANEg8SDw8PDw8PDw8PERpIc3JyeXRIKHV1dXJyeXZ5eXl2dnly
+        dnl5eXlycnZ2eYVydnZ5eXlycnl5dnlYeVhyXUhYGEh5eYV5c3NhLRoeNz8/Pz9CQj8/PzFtW5CCz/3+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v76+/39/vvx68IiJKPPz8/Pz8/Pz8/Pz8/P
+        z8/Pz8/QrWQ9U1NHZo2drJqaprbGxsbExsjIq3xnj8TGxsjExMRmPUREREc8REc8PUQ9PVMqGlx1cnl1
+        XSh0dXVycnlyeXJ2cnl5cnl5cnZycoV5eXl2cnl5eXJ2cnl5eXl1eXlyWF1ISBhdeXl5eXZDHSo5NT9B
+        P0FBQkE/Qj8l6f39/f3++v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P398e3C
+        Ik2jytvQz8/PxcXFxcXFz8XPz8/PyspkPURTaNPIxsvLx8SmmprExsjIyH5nT4/Ix8TIyMedWUQ8R0RE
+        REdERDw8UEQ8RCoadZNycnkoXXJ5eXJyeXJ5eYVycoV2cnl5eXlydnJyeXl2cnJ5eXlyeXJyeXl5WFhd
+        SCwYcn19dC0iKj1HPDE/P0JCQkE/Qj82F+L9/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/O3mwiJNZLGjsLClsLCwsLCwsLCwsKCwpaOjTTw8f6nIyMjIy+rq3dO2ppqp0r9j
+        Z0+oxsfGyMjEnVdEREQ9RERERERHREQ8OURQJBZdcnlzKF15dXVpdnZ2eXZycnl5cnJ5dnJ2dnl5eXly
+        dnl5hXZycnlycnl5WFhdWCwsG3RDJyIkOURFRyowQj9BQUFBQT8/Ow7o/f7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/3x6cUiOSpNK3CHboeHh4eHh4eHh4eHh25APTk8PGar
+        xMbGxsjH3erz3dOofs2hZ2dupsbEx8jIxIpTPEREREQ8RDxEPEQ8REQ8PEQkLXJ5eShdcnl5cnl5eXZ5
+        eXlydoV5dnl5eXl2cnZ2eXlydnJ5eXl5cnl5WF1dWEgoGxYaHU09RDxERzwqMEJCQkJCQkFCQjAO4v3+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vz88enKEjw5RyuHoqKioqKi
+        oqKioqKioqKHSzxHRERZiqjEx8fHxMTL0+rqy2PWfHBjfsbGx8fIyKtmPEQ9RD1ER0RER0dERDxERDxE
+        PCAteV0oXXl1dXZ5cnJyeXJ2dnl5dnZ5cnZycnl5eXl2cnl5eXJyeXV5dVhdXUgoKBMgOVBHR0RHPDw8
+        Kzs/QkFBQUFCQj8lB+n+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78
+        /vDmwSI8PD0qSV5eXl5eXl5eXl5eXl5eaytER0Q9UFmKqcTGyMjExsbHy8CkzZxuj8TIxsbIyKaKPT1E
+        REQ8RDxERDw8RDw8PEQ8PFA8IkMvG11yeXVycnl5eXJ5eXl2cnl5cnl5eXlyeXJyeXl2cnZ5eXl5WFhd
+        SEhIKCgWKlBEPD1EPDxEPCs7Qj9CQkJCP0I/NArt/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7x5coPREQ8PDk5PTk5OTk5OTk5OTk5OTk9REQ8PEQ8V2iVpsbIxsjLyMSR
+        vr+Hq8fIxsjHx7aVWUQ8RERERERHPERHREQ8REREPEREPCoaGEhYWHZ1cnJ2eXlyeXl5eXl5cnJ5eXJ2
+        dnl5eXl2dnKFcnZ5WFhdXUhIKCgbCkREPDw8RERHRzwrNj9CQkJBQkFBPykN6fv+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv87enCIkREREQ8REdERERERERHREdERDxHRERE
+        RDw8RDxEUGZrj6bEyMerY8CrxMjGxsjGxKhsWTw8REQ8RDxEPEREPEREREREPEREREREKhovXV1dXXVy
+        cnZIQy8yL1x1dnJyeXl1cnl0dXV5clhIKC8yGUovSEgoQy8sEyRERzxEREREPEdHOjc/P0E/Qj9BQjYr
+        Eeb9/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/u3rxSI8RDxERERE
+        PEREPERERDxEPERERDxEREREPFA9RERTRWZsa52dnXC6xMjIyMbGxo9sWTxHRDxER0RHPERERERERERE
+        PEdEREREUD0gLUgoWFh5XEMvb63Fz61vLy9deXl5eXJ5eXl5dEMyl8XKz8WXMhkvLygsGAoqR0Q8RERE
+        PDxHRzo/P0JCQkJBQkEwKxHp/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/P3y7MIgPERHRERERDxEREREPEQ8R0REPEQ8R0Q8RDxEPEQ8PEQ8PT1XWWiPxsjExsjIxKloPTxE
+        REc8RDxEPERHRDxEPEQ8REQ8Rzw8PUREORoyKFhYSBlK1PD4+PP78ueXGVx0eXl5eXJyXRt35vj09Pn7
+        9emtGRssGBMPOUdHREdEREc8Rz0pN0JCQkFBQj9BMCoS6Pv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v778ejFIjw8RDxEPERHREQ8REREREQ8REdEREQ8REREPTxEPERQR1NE
+        RFNoqcjHxMjGxKlmPEQ8R0RHREREREdERDxER0RHRERER0Q8PDxEPFAqGjIsLBmE8fb29uzb5/L198Uy
+        XFh5eVh2SC+t8/j09Pfb2+zz+c8QGBsKOUVHRDxEPEREPDw5PkJCQj8/QkJCQTU5Eun+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/fHpxSA9REdER0REPEQ8REQ8RDxEREQ8
+        REREREREPDxEPEREPEQ8PERTisTIyMTIxo9oRzxEPDw8PEREPEQ8RERERDxEPEREPDxEPEQ9UEREPSoW
+        Lxl37v319c9OECGW9fXzrTJdWFhYXTKE9fP1/eiCFBBO2/X1ygsMJD1ERERERERHRDxEOT4/P0FCQkJC
+        Qj80ORLn/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvt68UgPERE
+        PEQ8RERHREdER0RHRDxERDxEREQ8REREREQ8UD1EPUREWZ26xsbExJVmPD09REREPDw8RERHREQ8RERE
+        REdEREdEREQ8PDw8PVNEIBMu4/j09M8hAQIBAoLw8/iEG0hIXS9K6fv9/ediBgMAAxDK9vOCCjlEPT08
+        REc8RDxEPDw+Qj9CQkJCP0I3PkcR5/z+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v778enCIDxEREREPEREPEQ8RDxEPERHRERER0Q8REREREQ8RERERERERD2NxMjIxpFoR0Q8
+        REdEREdEREREPEREREQ8PEQ8REQ8REREREREPERERU0NxfX59OaCBgIAAAAGxf3+5jIvSC8Z0PP69f3U
+        IQEBAAABTu392yJNOSpEREQ8REREPEc8Pj9BQUE/P0JCNys8Euj8/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/fLrxSI9PEREREREREc8RERHPEdERDxEPEQ8RERERERERDxE
+        PERERFBXjay4xI9oR0dEREREPEREPEQ8REc8RDxER0REREQ8REREREREREREREVNIuv++/3y5JYGAQAC
+        AmL78/JvGygvMvH0+fX58ehiAgMCAAzQ++2jIB0NPUdER0REREREPDRCQkJCQkJCQjYrPBHo/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvt6cIgPERHRDxEREQ8REREPEQ8
+        REQ8R0RHREREREREPEREREREPEQ9ZLTAh15mREdEPDxERERERDxHREQ8RERERDxERDxEREREREREREQ8
+        REQ8JFX29fz0+fXxTgACAAMU9Pn7xRkoGXf58/n89fT08k4CAQEClvH8sQcCAypERDxERDw8Rzw0Pz9B
+        QkFCQUIxKlcS5v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v798uvF
+        IjxEPDxERERER0REREdER0RER0Q8RDw8RERERERERERERERTPYy0oWtZPDxEPDw8REREPEdERDxERERE
+        RERHPERHRERERERERDxEPERERCSj9v759Pv79MUAAgABAuj0+9sZGwvF9fv9/PX79f2xAgAAAk7p/c4J
+        AgIkRzxERDxEREQ8NEJCQkI/Qj9CNTk8Eub9/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+++3pwiA8RERER0Q8RDxEPEQ8RDxERDxEPEdEREdEREREPERERERHRESMv6FmPUQ8
+        PDw8REREREQ8RDxER0RERDxEPEdEPEQ8RERERERERERHRz0dsfb0+f31+fvUAAAAAAbp/vfbGRsL0Pv1
+        /PT59fvxzwwAAgaS8vniCQICJDxER0RER0Q8PDRCP0JBQkJCPzRNPBLm/f7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvy68UiPDxEREQ8RERHPERERzxERDxEREdEPEREPERE
+        PERERDw8RVNXtL+kTTw8RDxEPEQ8RDxER0REREQ8PDxEREdEPERERERERDxEPEQ8RFA9Hb319Pn0+fT7
+        rQABAAAQ9fz03xMbC7379v30/Pv09cUGAAIGwvX03wwCAB1HPEQ8PEc8PEQ1Qj9CP0JCQjc+PDwR6P3+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v777enFID1EREQ8RERHPERE
+        RDxEREREREQ8RERERERHRDxEREREPEVTV7ShmTlHRDxERERHREdERDxEREQ8RERHREc8RERERERERERH
+        RzxHRERHRSSx/fj1+/v96yECAAICgvX1+tQQGwLC+fT5/fv1/e1OAQIBLuv0/tQLAgISPUREPEc8R0RE
+        JT9CQkJBPz8/OkU5Eun8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /fLrxSA8RERER0RERDxEREREREQ8REREREREPERERDxHRERERDxERX++oYw8R0dHRDxERDxEPEREREQ8
+        R0RERDxEPEQ8REQ8REREPFA8RDxEPD0qVfX79fn12yEBAAACFNT1/frFCxkLhPn1+fv0+/JiAwMCDND7
+        +/utAgACDTlERERHRUQ8PDFBQkI/QkJCNitHPRHo+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/vvt6cUgPERERDxEPEQ8R0Q8RDxEREREPEQ8REREREREPEREPEVFRD2MvpxN
+        RDxHPERERDw8R0REPEQ8RDxHPERER0REREREREdEREc8REREREQ8KiDx9fT99N8uAgEADJL9+/X1ggYC
+        Ai71+/X89PztYhABLsX19fzxYgECAAc5REQ8PEVERTkxQT8/Pz9CPzAqR1MN7Pz+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778uvFID08RERERERER0Q8RERHRDxEPERER0Q8
+        RERERERERDxERERNtLyNPUc9R0RERERHREQ8RERHRERHRDxEREQ8RDxEREREPEREPERERERERFcd0P37
+        /fT+6IIULsLx/fT76SECAgIGxf35+fn1+e3m3+b0+/n03xABAAEEKkREPEQ8Rzw5MUFBQT9CQjcxOUdT
+        Den+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/e3pwiA8REdEPERE
+        RDxEPEdEPERHREdERDxEREREREQ8RERERUQ8TbScZEREPEQ8RDxEPEREREREPDxEPERER0Q8RERERERE
+        RDxHREREPEREPURHKlXr9fT79fTx8uv99fn8/JYBAgICAk7p+/39+/v1+f37/fn7/GICAgACAyRERDw8
+        PEdHOTFBP0I/P0I3NTk5PRHp/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/Pvx68UiPUREPEREPERHREdEPERERDxEPERHPERERERERERERDxERX+8mX9EPDxHPEdEREc8RERE
+        PEdEREdEREQ8RERERERERERHRDxEPERHRDxERzkRhPb8+/n5+fz0+/T7+9QUAgEBAQAMkvv19PT0/Pn9
+        9Pn0+dABAgIAAgAdRDxERERHPE0wQUE/Pz9CNj48RTwS5/v+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v797enFIDxEREREREdEPEQ8REREPEc8R0REPEREREQ8RDxEREREPEWM
+        vJRNUDw8REQ8REQ8REREPEQ8REQ8REQ8REREREREREREPERER0RHPEQ9PUdHHQut7Pz1/fX0+/H79NAh
+        AAACAQACAAKt8fv79fn59Pv18sIQAAAAAAIDDzw8RDw8RTw5MTc/QUE/PzdLPTw8Euj8/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HrxSA8RERERDxEPEREREQ8REdEPEQ8
+        REdERERER0REREQ8PERXlL9/PUREPEdER0Q8R0Q8REdER0RERzxEREREREREREREREc8REQ8RDxEPDxE
+        VyQGDILm/fn0+f318sUQAgICAAAAAAACBoLi9fn5/f3965IMAgAAAAAAAA08RUQ8PERHTTA/QUFBQkI2
+        KzxFPBLn+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P3y6MIgPERE
+        PDxER0REPEREREQ8RERHREQ8RERERDxEPERERDxEV7ShRTxERDxERDxERDxER0Q8RDxERDxHRDxERERE
+        RDxEREQ8R0Q8REdEREU8REckFAEGFJLU6OnfsS4GAAAAAAAAAAIAAgEDEILF39/QgiECAQACAAAAAAIN
+        OUVERzw8PColNjs3P0FBMU08RTwS6Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v778e3CIj08REdEREQ8RERERDxHRDxERDxEREREREREREREREc9RGa/mUQ8RDxEPERHPERE
+        REQ8RERHPERERDxEREREPEREREREREQ8R0REPEREREdEJAkMAgIAAwIGAgICAgIAAgICAgICAAADAAAA
+        AgACAQAAAAAAAgAAAAICBx0dHR0gEg0KBQgFMT83PzU8PFM8Euf7/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/LoxSA8REQ8REREPEdEREREPERER0RERERERERERDxERERT
+        PD2MvGRHPDw8RDxEPEREREREREREPERERDxERERERERHPEREREQ8RzxEREc8R0RHRCoVEAYBAQIAAAAA
+        AAAAAQAAAAAAAAACAQEBAAAAAAAAAgICAgACAAAAAAADAwQAAAADAgICAiU3Pzc0PTxFORLo/P7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3x6cIgPEREREQ8REdEPEQ8REdE
+        PEQ8RERERERERDxHREdERzw9mbRNRERERzxERERERDxEPEQ8RERERERERERERERERDw8PDw8PTw8R0RF
+        RUc8PFAqBxQhDAMAAQAAAAACAgIAAgICAAACAgEQEAIBAQEBAgECDCEDAgABAAICAQACAgACAgECAgII
+        N0I2S0c8RD0S6Pv+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778uvF
+        IDxEREREREQ8RDxHREQ8REREREREREREREREPEQ8REdHV7SUPTxERDxEREc8RERER0REREc8REQ8REQ8
+        REREPERHR0dHR0RQR0dER0dFVzxTTRwUIRAQAQEBAgEAAAAAAAAAAAICAAEABk4uEAsBAgYLLk4uAgAA
+        AAAAAAICAAACAAACAAAABTBCMCtHPEU8Euf8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/fHowiA9PERERDxER0RERDxEREREREREREREREREPERERERERGS+fz1ERERERERE
+        PEREPEQ8RDxEPEQ8RERER0RERERHRDxHPT08PDlNTSoqJB8kHxIEFCEQISELAQEBAgEBAQACAgEAAAAB
+        AAELLmJiTkpiYmIuBgEBAgICAgICAAACAgACAgACAQExPzEqRzxFPBLp+/7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvy7cogPEdHRDxERDxEREREREREREREREREPDxEPERE
+        RERERFeMtD1EPERERDxEPERHREREPEdER0RHR0REPDxEREREPEQ9TR0SEg0HBwQEAwMAAAAAAhAhISEh
+        LhAQAQECAQMBAAAAAAAAAAAAAAMMLk5OTk4QAgICCxQhThQDAQICAAACAAACAAAAHjc0OUQ9RVcS5/z+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v798e3CIDxERDxERERERERE
+        REREREREPERERDxHR0RERERER1c9mZRER0dERDxEREdERDw8RERHPEQ8RDw8REdEREQ8RERHRCoKAwAD
+        AQECAQECAgICAhAMFCEhIS4uLiEhDAELAgIBAQEBAQACAQAAAQICCwIGDCEuYoKCYiECAgICAAACAgAC
+        AgAAABc7K0Q8PURFEuf8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        +/LrxSA8RERERERERERERERERERERERHREREPFA8RDxEREVTV7R/PVA8REREREQ8RDxEREdEPERHRERE
+        REc8REREREdEPEc9DQMCAgAAAAICAAECAQAVThAMECEhISEhEBQhThQUEBQQAgsGBgsQFCEuTmKCkpKS
+        rZJOEAAAAAAAAAICAAACAAACAAEIMTk8RDxFORHo/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/vvx7cIgPEREREQ8REREREREPERERERERDxEREREPEREREREU1eZV0Q8RERE
+        REREREREREREPERERDxEPEREPERERDxEPEREPB0DAgICAgACAAAAAAACAiF3Yi4UEBQQIS5OhCEhYE5i
+        Sk5iYoRigoKSlpKSkpKEYiEGAgAAAgICAgICAAACAgACAgACARw5RTw9RDwR6P7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v798uvFIj1ERDxEREdERERERERERDxEPERERDxE
+        PEREREREREV/lFM9R0Q8REREREREREREREREREQ8REdERERERzxER0RHPEcqBwICAAACAAIAAAIBAAEG
+        IU5igmJiYmKETi4QTk5iYmJiYoRigmKEhIKEkmIuDAEAAAACAgAAAAAAAAICAAACAAAAAAMSRERERUVX
+        Def8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HtwiA8RERERERE
+        PERERDxERzxER0RHRERERERERERERERXjH9FPEQ8R0REREREREREREREREQ8REREPEQ8REQ8REQ8PD1E
+        TQoAAgACAgACAAICAAAAFBQMIS5OTmJOLiEQTk5OYkpOhGJ3YoKEgmJOIQwCAgACAAICAgAAAgICAgIC
+        AAACAgACAAEADURHRT1EPBHo/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v3x68UiPERERERERERHRDxERzxHRDxEPEQ8RERERERHRERETYxXRURERDxHREREREREREQ8RERE
+        REREREREREREREREREdERzwSAAICAAACAAIAAAAAAQshIRQUEBAQEBAuTk5OSmJiYmJigmJOLhAGAAAC
+        AAACAAAAAAACAgAAAAAAAAICAAACAAICAgc5PT08RVcN5/z+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v778evCIDxERERERDxERDxER0Q8RDxEREREREREREREREVFRH+MU0dE
+        PTxERDxEPEQ8REREREREREREPEQ8RDxERDxEREREPUdTIAACAAACAgACAAIAAAALISEuIS4uLi5OTk5O
+        Tk5iTk4uIQwBAwAAAAACAgAAAAACAgICAgAAAgICAgIAAAACAgACAQEEKj1EPEQ8Eej+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v79/fLtxSI8RERERERER0RERDxERERERDxE
+        PEQ8RDw8RUdHUER/fz1ERERERERER0RHREc8RDxHRERERERERERHREREREREPDxHRyQEAgICAAACAAIA
+        AgACAAMMEBAhIS4uLi4hIRAMDAICAgIAAAAAAgICAAAAAAAAAAAAAAACAAAAAQEBAAEAAAAAAAACAx1E
+        RDxTVw3n/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/Pvx7cUgPERE
+        REREREQ8RDxERERERDxER0RERERERDxHR1NXf009RDxERDxEPEQ8RDxEPERERDxEPERERERERDxEPERE
+        REREREcqBwIAAAACAgACAAIAAgAAAAEDBgICAgICAgICAAAAAAAAAAICAgIAAAACAgICAgICAgICAgAA
+        AAAAAgICAAICAAIAAgMPPUc8REUN6P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v758evFIjxERERERDxERERERDxEPERHRDxERERERDw8PEdTV1dXREU8REREREdERERERERE
+        RERERERERERERDxEREREREREPEREPA0BAgICAAACAAIAAgAAAAACAgAAAAAAAAAAAAICAgICAgIAAAAA
+        AgICAAAAAAAAAAAAAAAAAgACAAICAAAAAAICAgIBCjlHPEQ5Eef+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v77+/LrwiA8RERERDxHRERERDxERERERDxEREVERERFRDxHV1dX
+        OUQ8PDxEPEREPEQ8RDxEREQ8RDxERzxERERHRERERERERDw8R0UgAAAAAAACAgAAAAIAAgAAAgAAAgIC
+        AgICAAAAAAAAAAAAAAICAgIAAAACAgICAgICAgICAgICAgICAAAAAAABAQICAgQkRz1HPBHo/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P3x7cUgPEREPEREPEQ8RERERERE
+        REVHRERHRERER0VER0VXV0VEPDxERERERERERERERDxERERERDxEREREPEREREQ8REQ8PFBHJAMAAgIC
+        AAAAAAAAAAAAAgAAAAAAAAAAAAAAAgICAgAAAgIAAAAAAgICAAAAAAAAAAAAAAACAgIAAAACAgICAgAE
+        AAMKHz08RVcR5/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778evF
+        ID1EREREREQ8RERERERER0dFR0VEREVERERFRURXVz1HRzw8PEREREc8REVER0REREREREREREQ8REc8
+        RDxER0REPDxHUCQHAAAAAAAAAgICAQIAAQAAAAAAAAACAgEBAAAAAAAAAAIAAAAAAAAAAAAAAAICAgAC
+        AgACAAQEBAQHBwoNDw8dHR8qKj1EPERFDef+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7++/HtxSI8RERERERER0RERURERD09U1NQX19QU1NFPUVXU1dFRUc8RUQ8PEQ8R0RH
+        PDxERERERERFREREREQ8REdERDxERDw8RDw5EgACAgICAgICAgIBAQAAAAAAAgICAAAAAAAAAAAAAAIA
+        AgICAAIDAAAAAgMEBAcKDRIPDx0kJCoqKjk5OTk8RDw8R0dHPDxHORHn/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvy68ogPEQ8REREREQ9REREUF9fX19QUD1EV1BTX19f
+        X19fUEU8RUVFREVEPERFRTxERDxEPDw8PERFPDxERDxEPEREREQ8PDw8PB0CAgICAAABAAAAAAICAgAA
+        AgICAgACAgICAAAAAwQEBAQHCgoNDw8dJCQqKjk5OTk9OTxEPEdEPEQ8RERHREdEREREREQ8RVcS6fv+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v398e3CIDxER0REREREPDxE
+        UF9EUz08PD08PTw9PEU9RURQUFNfX1BTRTxFPDw9PUVFRDxEPDw8RERFRDxEREQ8RERHREREPDw8PEcd
+        AAICAgICAgICAAMCAgICAgMEBAQEBwoNDQ0PIh0dJCoqKjk9PUREUEQ8RERHRzw8R0dHR0Q8RzxHRERE
+        PEQ8REREPEREPUU9Euf8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        +/HrxSI9REQ8REREPDxEREVEPEQ9RERFRERERERHRTxEPERFRURQX19fX1BTREQ8PD08RTw8REQ8RUVF
+        RDw8RERERDxEREQ8RDw8JAQDAAADBAMEBAQEDQ0PDw8dHyQqKio5PD1EPEREPDxEPEdEPEQ8RDw8PTw8
+        PDw8PTw8RzxER0Q8RDxEPERER0RERDxHRDxERRLp/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/Pvx7cUgPEREREQ8RERERERERzw8PDw8REREREREPEREREU8RTxFPDxER0df
+        X19fX1BQV0VFRT08REVFPERERDxEREREREQ8RDxEPDkdDw8PHSQqKio5OTk8PDw8RERER0RHRzxER0RE
+        R0RHR0dHPDw8PDw8PEQ8REQ9PTw5PD08RDxERERHREdERDxEREREPEQ9RT0S5/z+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778uvFIDxEREREREREPDw8REQ9RERERERFRTw8
+        REVQRURERERHR0U8RDw9PUVFU1NTX1NfX19QU0VFR0VHX19HPEREPERERDw8PDxERDw9PTxERERHR0dH
+        RERER0c8PDw8RDw8PEQ8RDw8PDxERDxEREREPERERDw8PEdEPEQ8RERERERERDxEPEREREREPEREPUQ8
+        Euj8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/PHtxSA8REREPERE
+        REQ8UEREPEQ9RDxTRTxTPD1ERUVEX19fOUVFRD09REQ8U0VFPD1TU1NTX19fUz1FUF9TUERHRERERDxE
+        PEc8R0c8REdER0RERDxEPEREPEdERDxHPEQ8PEQ8REREPEdEPEQ8R0RERDxEREREPEQ8REREREdEPEQ8
+        REQ8R0REPERERERERERFVw3n/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v3x8sUgPDxEPEdERDxEREREREVQRERFX19TPERfRDxFUF9XX1NTUFBERERFPEU8PEVfX0c8PUVF
+        RFM8UF89UFBERDxERERER0REPEQ8REREPEQ8REREREc8REREPEQ8RDxER0REREREREREPERHREc8RDxE
+        REQ8PEdEREREPEREPEREREREREQ8REdEREREPEQ8RDwR6P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/vz+8e3FID08REQ8RERER0Q8REc9X1NFU19fUD1fXzw8RVBfPT1fUF9f
+        V1dfU0RFPF9fUFNQUF9QPUU9PV9QU188PEQ8R0Q8RDxEREREREREREREPEdEPEQ8RERERERERERERDxE
+        REREPEQ8REREPEQ8REdER0REREQ8RzxERERHRERERDxEPEQ8REQ8REREPERHPUVXDef8/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HrxSA8RDxER0REREQ8REREPV9ERVNf
+        U1dTX0Q9RDxQXz1TX19TPV9QXzk9V19fX1M9RF9TU19EPURfUFBQPURHREQ8RERHPEQ8RDxEPEQ8RERE
+        PERERzxEPEQ8RDxEPEREREQ8PEREREREREdEREREPEQ8RDxER0Q8RDxERDxEPERHRERHRERERERERERE
+        RD1EPBHo/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P7y7cUgPERE
+        RDxERERERERERFdfUz09X1dfX1M9RDxFUF89V1NfPT1fV19fUF9QU19fRFdfPUVfU0Q9U19EPDxEPEQ8
+        REdEPERHRERER0RHREdEPERHRDxER0REREdER0RHRDxER0RHRDxEPEQ8REQ8RDxHRERERDxEREdEREQ8
+        R0REPEREPEREPEREREREPERERVcN5/z+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v778u3KID08RERHRDxEREQ8REQ9X1BXV19XX19EPEREPFBfPVdQXz09UFdfV1c8PVNTPT09
+        Xz08X1BEV19EPDw8REc8REREPERERDxEREQ8RDxEPERERDxEREQ8REREPEQ8RDxEREQ8RDxER0RERzxE
+        REdERDxEPERHREREPEQ8REQ8REREREdEPEdERDxEREREPEQ8Eej+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/PHyxSA8REdEPERERDxEPERFV1BQUD1fV19QXz1ERz1XV1BQ
+        PFBQX1BTUFBQPT1fUDw8PVBQV1A9PV9EPEQ8REQ8R0dEPERHRDxERzxEPEdERDxHRDxER0Q8REc8RDxH
+        REQ8R0Q8REdERzxERDxEREQ8REQ8REdEPEQ8RDxHREdEPEdEPEQ8REQ8RERER0Q8RDxFVw3n/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3x8sIgPEREPEREPERHREREU1BQ
+        X1dXX1NFPV9TREQ9X19QPT09UFA9RD09UEQ9UFBQUD1EX19QPV9fU1A8RDxER0Q8PERERDxER0Q8RERE
+        PERHRDxEREQ8REdEPERERDxER0Q8REREPEQ8RERHPEQ8REREREdEPERERERHRDxEPEREPERERzxER0RE
+        REQ8REQ8RDwR6P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v789O3F
+        IDxEREREREREPEREREU9X19QUFNfUFNQRDxHR19fRDw8PDxEPDxEPDxEPDw8PTw8PD09PVBfU1BEPDxE
+        RDxERERHRERERDxEREdEREREPERER0REREQ8RERHRERERDxEREdERERERERHPERHREREPEQ8RERERERE
+        PERERERHRERERDxERDxEREREPEREPFNXDef+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/fHryiA8REREPEc8REdERDxEUF9XU19QUFBQR0REREdQRDw8PEc8PDxEPDw8PDw8
+        PDxEPEQ8PDxHX1BQPTxEPERERERERDxEPEREREREPEQ8REREREQ8RDxERERERDxEPEREREREPEQ8RERE
+        RDxERDxERERER0REPEQ8REc8RDxERDxEPERHRERERERERERHRDxTRQ3o/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3y7cUgPTxEREQ8R0Q8RERHRD1fUD1TPT1EUDw8REQ8
+        PDw8Rzw8RDw8PEREPEQ8PDw8RDw8REQ8PF9QRDw8PEdERDxEPEQ8R0REPEQ8RDxHREQ8RDxEPEdERDxE
+        PEQ8R0REPEQ8RDxHREQ8RDxEREQ8R0Q8RDxERERHREQ8REdER0RER0REPDxEPEREREREPEQ8RT0R5/7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v798fLKIDxHRDxER0Q8RERE
+        RDw8UDw8PDw8PEQ8PDw8RERHR0Q8RDxEPEc8REQ8RERERzxEREdERDw8PDw8RzxEPEdERERHREQ8R0RE
+        REdERDxHRERER0REPEdERERHREQ8R0REREdERDxHRERER0Q8REQ8RERHPEQ8RDxEREREPEQ8RDw8REdE
+        REdERDxEPEdEPFM8Euf7/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /fHtxSA8PERERDxEREREPEQ8R0RERERER0Q8RDxEREREPERERDxEREQ8REREPERERDxEREQ8REREPERE
+        RDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREREREREPERH
+        REdERDxERzxHREREREc8REQ8RERER0Q8RD1FPBLo/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/vvx8sUgPDxERERHREQ8R0RER0Q8REQ8REQ8REdEREQ8REREPERERDxEREQ8
+        REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8
+        REREPERERDxEREQ8REdERDxEPERER0Q8RDxEPEREPEREREREREQ8REQ8RDwS5/v+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv78fHCIDxEREREPERERDxERDxEPEdEREREREQ8
+        REREREdERERHRERER0REREdERERHRERER0REREdERERHRERER0REREdERERHRERER0REREdERERHRERE
+        R0REREdERERHRERER0REREdERERHRERER0REREQ8PEQ8R0RERDxEPEdEREdEREREPEREREREREREPUU9
+        Euj8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/XrxSI9PEQ8REdE
+        PERHRDxEREdEPEREPDxEREQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8
+        RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxER0RER0Q8RDxEREREPERE
+        PEQ8REREREREREQ8RDxEPBLn+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v79/Pzx8cUgPDxEREQ8PEREPERER0Q8RDxHRERER0Q8REdERDxHREQ8R0REPEdERDxHREQ8R0REPEdE
+        RDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdE
+        RDxERDxERERHREQ8RERERERHREQ8REQ8RDxEREc9RVcS6Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v778fLFIDxERERER0RHREREPEQ8RDxERDxEREQ8REREPERERDxEREQ8
+        REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8
+        REREPERERDxEREQ8REREPEREPEREREQ8RDxER0RERDxERDxERERER0RHRDxEPUQ8Eej+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/vtwiA8REQ8RDxEPEQ8REREPERHREQ8
+        R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8
+        R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHRERERzxERERERDxEPERERDxERDxERDxEPERE
+        RzxFVw3n/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vvy68UiPTxE
+        RERHRERER0REREdERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERE
+        RDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8RDxEPERH
+        PERERERHRERERERHREdEREQ9RDwR6P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v788fHFIDw8REREPDxERDxEPEQ8RERER0REREdERERHRERER0REREdERERHRERER0REREdE
+        RERHRERER0REREdERERHRERER0REREdERERHRERER0REREdERERHRERER0REREdERERHRERER0REREdE
+        RERHRERER0REREdEREdEPERHRDxEPEQ8REREPEQ8RERERUVXDef8/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HxxSA8PEQ8REdEREREPERERzxEPEQ8RDxEPEQ8RDxEPEQ8
+        RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8
+        RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEREPERERDxEREc8REREREdEREQ8RDxEPBHo/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/fvx68UgPEREREQ8REQ8RERHRDxE
+        R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8
+        R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHREQ8R0REPEdERDxHRERERDxER0Q8REREREQ8
+        REREREQ8RVcN5/z+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v779fLK
+        ID08RERERERERERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERE
+        RDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERERDxEREQ8REREPERE
+        RDxERDxEREQ8REQ8RERER0Q8RDxEPEQ8Eej+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v78/PHxwiA8REdERERERERERERERERERERERERERERERERERERERERERERERERERERE
+        RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
+        REREREREREREREREREREREREREREREQ8REdERERERDxERERERzxFVw3n/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv08cogPEREPEREREQ8RERERERERERERERERERERERE
+        RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
+        REREREREREREREREREREREREREREREREREREREREREREREREREREREREPERERERHRDxEREQ9U0UR6P7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v778fLFIDxERERHREREREdE
+        RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
+        RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
+        REREPERHRDxHPEU5Def+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /vHywiA9PERERDxERDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8
+        RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8
+        RDxEPEQ8RDxEPEQ8REREREREREdERDxERD1HPBHo/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/P3y8cogPERERERER0RERzxHREdER0RHREdER0RHREdER0RHREdER0RHREdE
+        R0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdE
+        R0RHREdER0RHREdER0RHREdER0RHREdER0RHREdEREREREQ8REREREc8RUUR5/7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v779PHKIDxERzxEREQ8REc8RDxEPEQ8RDxEPEQ8
+        RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8
+        RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPERERDxER0Q8RDxEPUU8
+        Euf7/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v78+/HxxSBERDxERERE
+        REc8REdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdE
+        R0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdER0RHREdE
+        R0RHRERERzxERERERzxFPBLo/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/vvx8sIgPTxEREREPEQ8UDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8
+        RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8
+        RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEREc8REREREQ9RTwS5/v+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/vz79fHKIDxERERERERERDxHRERERERERERERERERERERERERERERERE
+        RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
+        REREREREREREREREREREREREREREREREREREREREREREREREREQ8REQ8RDxHPEU8Euj8/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/HtyiA9RERHPDw8RzxHRDxERERERERE
+        RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
+        RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
+        RD1FPBLn/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/P718sIgPEc8
+        PERERzxHPEdERDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxE
+        PEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxEPEQ8RDxE
+        PEQ8RDxEPEQ8RDxEPEQ8REQ8RTkP5v3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+8vLPIj1EPEREPEQ8RDxEPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8
+        PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8
+        PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDxEREQ5Hen9/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/Pz9ziA9UEVTU1BEUFNQU1BEUERQRFBEUERQRFBEUERQRFBE
+        UERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBE
+        UERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUDxEORLp/f7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v75/M4WIB8fJB0dHR8fHx8fHx8f
+        Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f
+        Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f
+        Hx8fHx8dHSAK6f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7++/3o
+        kpCSlneSlpKEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE
+        hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE
+        hISEhISEhISEhISEhISEhISEhISEkoKjd/H9/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/vz8/v77/v76+vr6/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vn+/v3++/7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vv7/Pz8/P77/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+
+        /v7+/v7+/v7+/g==
+</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAD////////////////////////////////+/v7//v7+//7+/v/+/v7//v79//7+/v///v7//f79//3+
+        /v/9/f7/+vr3/+Xn6P/S1dj/wcfR/8DH0f/X2dz/+vv5//z9/f/9//3//v79//3+/v/+/v7/////////
+        //////////////////////////////////////////////7+/v/8/Pz/9fX1//T09P/u8PD/w8nP/42j
+        wf99mMD/cpG+/2+PvP92lcH/jaXM/6G51f+ywNT/rbjO/5Wlvv92h6j/0tXZ/8rR2f/Ey9X/ztLX/+/v
+        8P/+/v7/////////////////////////////////////////////////7+/v/9PT0//IyMj/wcHB/72+
+        vv+Ik6H/J2nQ/y513P9Mc7z/UHPI/0dwyv9Db8z/krjw/+/x8P/l5eT/1tbW/7O4yP98kK//ub/Q/73C
+        yP+pscD/lJ6y/666yP/+/v7////////////////////////////////////////////6+vr/7+/v/+Tk
+        5P/Y2Nj/ycnK/7W1tv8qYrv/KHTp/yl99P8qfvn/KX79/yp//v+Iufj/+Pj4//Pz8//i4+L/u8TQ/yJo
+        zv/C1fL/5efq/9nb2v/My8j/l6S7//7+/v////////////v7+//4+Pj/8vLy/+3t7f/m5ub/39/f/9TU
+        1P/Hx8f/vLy8/62trf+np6f/oqGh/2R3k/8ldOr/KX76/yl///8pf///KX///22q+//5+ff/9PT0/+Tj
+        4f+OoL//J3fr/8DY+v/39vf/5+fn/9nX1v+bp7r//f39////////////9vb2//T09P/x8fH/7u7u/+vr
+        6//q6ur/5ubm/+Hh4f/b29v/19fX/9TU1P/Y2Nj/2Nnb/2OHu/8mdun/KX34/yt9/P8qf/3/RI35/+7w
+        8f/m6Of/yc7W/zNrv/8sf/3/rMv4//j39//o6Oj/1dfa/6Guw//+/v7//v3+//P09v///////v7+//7+
+        /v/+/v7//v7+//7+/v/+/v7//////////////////v7+//7+/v/+/v7/9/n4/5OnxP8rY7n/JHDi/yZy
+        5/8lcub/kq7a/6KtvP9Gcrb/Kn76/yyA/v+BsPb/7Ozr/93d3f+VpLn/5Ofo///////i4/P/MzTs////
+        //////////////////////////////////////////////////////////////39/f/4+fj/raag/9DH
+        wP+vrrT/jJqx/4yXsP+oqrP/2tXQ/8/P0/9Ngcv/JHLp/z9/4/+8xM//lqKz/9fa3v/9/f3/+fn5/0RE
+        7P8BA/n//////////////////////////////////////////////////////////////////f7+/7yw
+        p//dwrL/4si1/+PJtv/gybj/4sq5/+LLuf/awrH/38q5/8+7r/9ue5f/mazE/8rQ0//5+/j//v79//v9
+        /P+rre3/AwP5/wIC/f///////////////////////v7+//7+/v/+/v7/////////////////////////
+        ///l4d//waCH/9Otkf/UrpL/1a+S/9Wvk//SsJP/p4x6/4V1aP/UsJf/17KZ/7KWg/+7raP/wKud/8Ku
+        oP/Ty8T/9vj2/0RH6P8AAP3/AAH9//////////////////3+/v/4+vn/obDI/+Pn6//9/f7//v7+//7+
+        /f////7//////7+vov/Ikmz/yJNu/8aTbv/HlG//yJRw/6N6Yf8bHhr/dltK/8iXc//HmHf/xpZz/5Jf
+        Pv+4cUD/t3NA/7NwQf+mfGD/DQzj/wEA/v8BAv3////////////+/v//+fv5/8LS4v9AaKP/qrjM//b4
+        9v/k4d7/5ePh//n7+v/+////qoZo/7l4S/+5ekr/uXpK/7l6TP+4ek3/u3pN/41gPf9qSjT/pnJT/6l0
+        Uf+7fVH/lmA5/7Sciv/It6j/tZ2H/7JwQf84KJ//AAD+/wEB/f/8/Pz/+vv6/9/q9v9bnOv/Qo7c/yFP
+        lP9wlb3/oXJK/6NpPf+laD3/onlc/9TRy/+mclL/tXE//7ZxQP+2cT//tnFA/7ZxQP+2cUD/tnFA/7Vx
+        P/+ucEH/sHFC/7ZxQP+maDz/x8K6//f6+v+7n43/snA//0Evl/8BAfz/FRPv/yZ4dP8zeY3/MHm1/yiI
+        8P9NnO//F0yZ/y2L8f+WcFr/YmJJ/1tjS/+kajz/pmpB/5JbNP+3cUH/tXE//7ZxQP+2cUD/tnFA/7Zx
+        QP+2cUD/tnFA/65vRP+2cT//tXFA/6prOv9HVkz/eWJL/7FvP/+lZ0P/Dwva/wIC/P8LMLj/Amlp/yuJ
+        5P9IpPr/bLL0/1GHyP8mbbj/I4vz/xtff/8DZ2X/Amll/xRWTv+XYjf/pGY7/6FkPP+1ckD/tnFA/7Zx
+        QP+2cUD/tnFA/7ZxQP+2cUD/tnFA/7RxQP+zcUD/oWU4/4FTNv+1cz7/qWw8/y0eoP8BAvn/AwH9/w5I
+        jv8jhoP/OI/p/zqS8f8qi/H/M3XD/yh+1/80mPz/FH9O/wN+Af8BfQH/BXsC/xpsDf+lbDn/mmE4/7Vx
+        Qf+2cUD/tnFA/7dyQf+2cUD/tnFA/7ZxQP+2cUD/t3FA/69uPv+RWjL/hlEw/3VnKf8bcwv/Aw7Y/wAB
+        /f8FA/T/tbjI/yCEmf8ylvf/YK77/1qV2f87brb/LI3x/y2P6f8IgRb/A4EA/wCBAP8BgAD/A4AB/zlm
+        FP+NWTP/tHA//7ZxQP+3ckH/t3JB/7ZxQP+2cUD/tnFA/7dyQf+ybz//mmA1/3hKKv8TYgX/BH8C/wN8
+        Bf8BB+r/AAD+/wMN1f++xMH/A4AF/w58Rf8fhZv/LHrD/zCU9/8rjub/Cn5G/wKBAP8AgQD/AIEA/wCB
+        AP8AgQD/BX8D/1JSH/+bXzb/mHJW/6uaif+cdlv/sG8//7VxQv+gaUH/qpGB/6OQg/9yTjL/TTwa/wF+
+        A/8AgQD/A3gL/wED9P8AAP7/BiCv/77Hvv8BgAD/A4EB/wOBA/8qjcr/L4/s/wt/Pv8CgQH/AIAB/wCB
+        AP8AgQD/AIEA/wCBAP8DfwL/DXEE/2hcTf/j4uP/X11f/7u5uP+Rd2T/kVs2/8C7tv+8vbv/W1tb/7q2
+        tv8WVA//AoEB/wCBAP8DcxL/AQL4/wAA/v8EM4v/vsfA/wCBAP8AgQD/BoAG/zuCvf8Nf0//AoEB/wCB
+        AP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8EgQL/pbal/+zs7P86Ojr/QEBA/8W/vP9tVD//9vf3/9XU
+        1P8WFhb/j4+P/0NfQf8EbQP/AIEA/wJzEv8BAvr/AAD+/wJFZv++x7//AIEA/wGAAf8VhiD/P4J8/wKB
+        Af8AgAH/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wN/A/+9xr3/+Pj4/1NTU/8/Pz//1NTS/2FW
+        Tv/6+fn/9fX0/yoqKv+cnJz/W1pY/wJdAv8AgAD/AnAY/wEB+v8BAf3/A1ZF/77Hv/8AgQD/AIAB/y6I
+        T/8hgEH/AIEB/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/A4AC/46sjv/v7+//V1dX/7m5
+        uf+mpaX/JSAf//Hx8f/i4uL/iIiI/+/v7/8qKSr/A0sD/wCAAP8CayD/AQL6/wED+P8FbCH/vsbA/wCB
+        AP8BgAL/Ools/w2AE/8AgQH/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8DgAP/ImIg/9XV
+        1f/6+vr/3t7e/ycmJv8CAgL/cHBw//b29v/39/f/goKC/wEBAf8DOQT/AYAA/wJpJv8EA/j/Agjo/wN2
+        DP++xr//AIEA/wOAAv86iGz/AYAC/wGAAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCAAP8BgAD/AIAB/wGA
+        Af8NWg3/FBUU/zIyMv8MDAz/AQEB/wEBAf8GBgb/Gxsb/x8fH/8FBgX/AQEB/wIXA/8EOQP/BSQP/wcD
+        dv8DGcH/A30C/77Gv/8AgQD/C4IS/yyHTP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/An8C/wRr
+        A/8EXgT/BFIG/ww7DP8tLiz/FxcW/wMDA/8CAgL/AQEB/wQEBP8uLi7/Njc2/yorKf8PDw//CgoK/wEB
+        Af8BAQH/AwIb/wQxj/8DfgL/vse//wCBAP8ahS7/EYQY/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCB
+        AP8EfgP/AxMC/wECAv8CAQP/CwsL/zs8Ov85Ojn/Ozs7/zMzM/8xMTH/NDQ0/0FBQf9XV1b/UVJR/ysr
+        K/8DAwP/AQEB/wEBAf8CAQT/A1Qy/wN9Av+/xr//AIEA/x6GM/8DgAX/AIEA/wCBAP8AgQD/AIEA/wCB
+        AP8AgQD/AIEA/wKBAf8FKwX/AQEB/wEBAf8CAgL/MTIw/0REQ/9FRUX/UlJS/1tbW/9QUFD/Nzc3/xYW
+        Fv8CAgL/AQEB/wEBAf8BAQH/AQEB/wIBAv8EVwT/A34D/8DGv/8BggH/F4Qj/wKAAf8AgQD/AIEA/wCB
+        AP8AgQD/AIEA/wCBAP8AgQD/AoEA/wRGBP8BAQH/AQEB/wEBAf8HBwb/ExQT/xYWFv8NDQ3/AwMD/wEB
+        Af8BAQH/AQEB/wEBAf8BAQH/AgEB/wMBAf8BAwL/AwIC/wY9Bf8DfwL/wMa//wOBBf8MgxH/AH8D/wCB
+        AP8AgQD/AIEA/wCBAP8BgQD/AIEA/wCBAP8BgAH/BWIF/wEBAf8CAQL/AgEC/wABAP8BAgH/AQEB/wAB
+        AP8BAQH/AQEB/wIBAv8BAQH/AQQB/wELAf8DEgP/Ax4D/wQoBP8ENwP/BFQE/wN+Av/Axr//DIYM/wqF
+        DP8JhQv/BoMG/wOAA/8BfgH/AX8A/wKAAP8CgAH/AIEA/wGAAf8DdwL/BggD/wMJAf8EEQP/BBsF/wUl
+        Bv8EMgP/BD8D/wVKBP8FVgX/BWID/wRsA/8CdgP/BnoG/wKBAf8AgQD/AIEA/wCBAP8AgQD/A34C/77H
+        v/8GhAX/CIQH/wOAA/8FgQb/C4UK/w6HDf8Lhgv/B4MG/wyIC/8AgQD/AYEA/wKAAf8EdgP/AnsC/wKA
+        Av8CgQH/AoEA/wGBAv8BgAH/AYEB/wCBAP8BgQH/AYEB/wKAAP8BgAH/AIEB/wCBAP8AgQD/AIEA/wCB
+        AP8DfgL/v8a//wyGCv8Qhg7/D4YP/xGHEf8SixL/DocO/w2GDP8MhQv/CoQK/wCBAP8AgQD/AIEA/wCB
+        AP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCBAP8AgQD/AIEA/wCB
+        AP8AgQD/AIEA/wJ+Av/Axr//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
+</value>
+  </data>
+</root>

+ 134 - 0
main/app_share/serverbootstrap/DokeosAppShare/Program.jsl

@@ -0,0 +1,134 @@
+package DokeosAppShare;
+
+import System.Windows.Forms.*;
+import java.io.*;
+import java.net.*;
+
+/**
+ * Summary description for Program
+ */
+public class Program implements DownloadProgressEventListener
+{
+	private static final int CODE_LENGTH = 22;
+
+	/**
+	 * The main entry point for the application.
+	 */
+	/** @attribute System.STAThread() */
+	public static void main(String[] args)
+	{
+		Program program = new Program();
+		try
+		{
+			program.instanceMain(args);
+		}
+		catch (SecurityException ex)
+		{
+			MessageBox.Show("Security Error: Execute the application from your desktop.", "Security Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+		}
+	}
+
+	private System.Diagnostics.Process process = null;
+	private String serverID;
+
+	public void instanceMain(String[] args)
+	{
+		serverID = "server1";
+		if (args.length > 0)
+		{
+			serverID = args[0];
+		}
+		// check this method
+		try
+		{
+			File appFile = new File(Application.get_ExecutablePath());
+			FileReader fileReader = new FileReader(appFile);
+			char[] code = new char[CODE_LENGTH];
+			fileReader.skip(appFile.length() - code.length);
+			int readLength = fileReader.read(code, 0, code.length);
+
+			serverID = new String(code);
+		}
+		catch (FileNotFoundException ex)
+		{
+			ex.printStackTrace();
+		}
+		catch (IOException ex)
+		{
+			ex.printStackTrace();
+		}
+
+		if (serverID != null)
+		{
+			DownloadThread download = null;
+			//Prepare download VNC
+			try
+			{
+				File vncFile = File.createTempFile("dokeosVNC", ".exe");
+				download = new DownloadThread(new URL(Config.getVNCExecutableURL()), vncFile);
+			}
+			catch (IOException ex)
+			{
+				System.out.println("Exception during VNC download prepare");
+				ex.printStackTrace();
+			}
+			if (download != null)
+			{
+				download.addDownloadProgressEventListener(this);
+
+				Application.EnableVisualStyles();
+				Application.SetCompatibleTextRenderingDefault(false);
+				LocalRelay localRelay = new LocalRelay(download);
+				localRelay.setServerID(serverID);
+				localRelay.Show();
+				download.start();
+
+				Application.Run(localRelay);
+				if (process != null && !process.get_HasExited())
+				{
+					try
+					{
+						process.Kill();
+					}
+					catch (Exception ex)
+					{
+						ex.printStackTrace();
+					}
+				}
+			}
+		}
+		else
+		{
+			System.out.println("ERROR: server id not defined.");
+		}
+	}
+	public void connecting() {
+		System.out.println("VNC download connecting ...");
+	}
+	public void started() {
+		System.out.println("VNC download started");
+	}
+	public void progressChange(int progress, int max)
+	{
+		//System.out.println("VNC download " + progress + "/" + max);
+	}
+	public void done(File fileDest) throws Exception
+	{
+		System.out.println("VNC download done");
+		//Start VNC
+		System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo(fileDest.getPath());
+		si.set_UseShellExecute(false);
+		Config.writeRegOptions();
+		process = System.Diagnostics.Process.Start(si);
+		System.out.println("VNC executed");
+
+		System.out.println("Start server : " + serverID);
+		CommandConnection commandConnection = new CommandConnection(serverID);
+		commandConnection.start();
+	}
+	public void exception(Exception ex)
+	{
+		ex.printStackTrace();
+		System.out.println("VNC download Exception");
+	}
+}

+ 36 - 0
main/app_share/serverbootstrap/DokeosAppShare/Properties/AssemblyInfo.jsl

@@ -0,0 +1,36 @@
+import System.Reflection.*;
+import System.Runtime.CompilerServices.*;
+import 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("JWindowsApplication1") */
+/** @assembly AssemblyDescription("") */
+/** @assembly AssemblyCompany("TBNetworks") */
+/** @assembly AssemblyProduct("JWindowsApplication1") */
+/** @assembly AssemblyCopyright("Copyright © TBNetworks 2007") */
+/** @assembly AssemblyTrademark("") */
+/** @assembly AssemblyCulture("") */
+
+
+// The ComVisible attribute controls accessibility of an individual type
+// or member, or of all types within this assembly, from COM.  To access
+// a type or member in this assembly from COM, set the ComVisible attribute
+// on that type or member to true.
+/** @assembly ComVisible(false) */
+
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+
+/** @assembly AssemblyVersion("1.0.0.0") */

+ 61 - 0
main/app_share/serverbootstrap/DokeosAppShare/Properties/Resources.Designer.jsl

@@ -0,0 +1,61 @@
+/*******************************************************************************
+ *
+ *     This code was generated by a tool.
+ *     Runtime Version: 2.0.50727.42
+ *
+ *     Changes to this file may cause incorrect behavior and will be lost if 
+ *     the code is regenerated.
+ *
+ ******************************************************************************/
+
+package DokeosAppShare.Properties;
+import System.*;
+
+
+/**   A strongly-typed resource class, for looking up localized strings, etc. */
+// This class was auto-generated by the StronglyTypedResourceBuilder
+// class via a tool like ResGen or Visual Studio.
+// To add or remove a member, edit your .ResX file then rerun ResGen
+// with the /str option, or rebuild your VS project.
+/** @attribute System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")*/
+/** @attribute System.Diagnostics.DebuggerNonUserCodeAttribute()*/
+/** @attribute System.Runtime.CompilerServices.CompilerGeneratedAttribute()*/
+public class Resources {
+    
+    private static System.Resources.ResourceManager resourceMan;
+    
+    private static System.Globalization.CultureInfo resourceCulture;
+    
+    /** @attribute System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")*/
+    Resources() {
+    }
+    
+    /**   Returns the cached ResourceManager instance used by this class. */
+    /** @attribute System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)*/
+    /** @property */
+    public static System.Resources.ResourceManager get_ResourceManager() {
+        if (System.Object.ReferenceEquals(resourceMan, null)) {
+            System.Resources.ResourceManager temp = new System.Resources.ResourceManager("DokeosAppShare.Properties.Resources", Resources.class.ToType().get_Assembly());
+            resourceMan = temp;
+        }
+        return resourceMan;
+    }
+    
+    /**   Overrides the current thread's CurrentUICulture property for all */
+    /**   resource lookups using this strongly typed resource class. */
+    /** @attribute System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)*/
+    /** @property */
+    public static System.Globalization.CultureInfo get_Culture() {
+        return resourceCulture;
+    }
+    /** @property */
+    public static void set_Culture(System.Globalization.CultureInfo value) {
+        resourceCulture = value;
+    }
+    
+    /**   Looks up a localized string similar to asdfhye². */
+    /** @property */
+    public static String get_session() {
+        return get_ResourceManager().GetString("session", resourceCulture);
+    }
+}

+ 123 - 0
main/app_share/serverbootstrap/DokeosAppShare/Properties/Resources.resx

@@ -0,0 +1,123 @@
+<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="session" xml:space="preserve">
+    <value>asdfhye²</value>
+  </data>
+</root>