Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/AvailablePluginsView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/AvailablePluginsView.Designer.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/AvailablePluginsView.Designer.cs	(revision 3627)
@@ -0,0 +1,317 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class AvailablePluginsView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.pluginsListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
+      this.nameHeader = new System.Windows.Forms.ColumnHeader();
+      this.versionHeader = new System.Windows.Forms.ColumnHeader();
+      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginsImageList = new System.Windows.Forms.ImageList(this.components);
+      this.productsListView = new System.Windows.Forms.ListView();
+      this.productNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.productVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.productLargeImageList = new System.Windows.Forms.ImageList(this.components);
+      this.productImageList = new System.Windows.Forms.ImageList(this.components);
+      this.productsGroupBox = new System.Windows.Forms.GroupBox();
+      this.showDetailsButton = new System.Windows.Forms.RadioButton();
+      this.showLargeIconsButton = new System.Windows.Forms.RadioButton();
+      this.installProductsButton = new System.Windows.Forms.Button();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.pluginsGroupBox = new System.Windows.Forms.GroupBox();
+      this.installPluginsButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.productsGroupBox.SuspendLayout();
+      this.pluginsGroupBox.SuspendLayout();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // pluginsListView
+      // 
+      this.pluginsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginsListView.CheckBoxes = true;
+      this.pluginsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameHeader,
+            this.versionHeader,
+            this.descriptionHeader});
+      this.pluginsListView.Location = new System.Drawing.Point(6, 19);
+      this.pluginsListView.Name = "pluginsListView";
+      this.pluginsListView.ShowGroups = false;
+      this.pluginsListView.Size = new System.Drawing.Size(266, 502);
+      this.pluginsListView.SmallImageList = this.pluginsImageList;
+      this.pluginsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.pluginsListView.SuppressItemCheckedEvents = false;
+      this.pluginsListView.TabIndex = 0;
+      this.pluginsListView.UseCompatibleStateImageBehavior = false;
+      this.pluginsListView.View = System.Windows.Forms.View.Details;
+      this.pluginsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.remotePluginsListView_ItemChecked);
+      // 
+      // nameHeader
+      // 
+      this.nameHeader.Text = "Name";
+      this.nameHeader.Width = 185;
+      // 
+      // versionHeader
+      // 
+      this.versionHeader.Text = "Version";
+      this.versionHeader.Width = 93;
+      // 
+      // descriptionHeader
+      // 
+      this.descriptionHeader.Text = "Description";
+      this.descriptionHeader.Width = 250;
+      // 
+      // pluginsImageList
+      // 
+      this.pluginsImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginsImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginsImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // productsListView
+      // 
+      this.productsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.productsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.productNameHeader,
+            this.productVersionHeader});
+      this.productsListView.HideSelection = false;
+      this.productsListView.LargeImageList = this.productLargeImageList;
+      this.productsListView.Location = new System.Drawing.Point(6, 50);
+      this.productsListView.MultiSelect = false;
+      this.productsListView.Name = "productsListView";
+      this.productsListView.ShowGroups = false;
+      this.productsListView.Size = new System.Drawing.Size(240, 471);
+      this.productsListView.SmallImageList = this.productImageList;
+      this.productsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.productsListView.TabIndex = 18;
+      this.productsListView.UseCompatibleStateImageBehavior = false;
+      this.productsListView.View = System.Windows.Forms.View.Details;
+      this.productsListView.SelectedIndexChanged += new System.EventHandler(this.productsListView_SelectedIndexChanged);
+      // 
+      // productNameHeader
+      // 
+      this.productNameHeader.Text = "Name";
+      // 
+      // productVersionHeader
+      // 
+      this.productVersionHeader.Text = "Version";
+      // 
+      // productLargeImageList
+      // 
+      this.productLargeImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.productLargeImageList.ImageSize = new System.Drawing.Size(32, 32);
+      this.productLargeImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // productImageList
+      // 
+      this.productImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.productImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.productImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // productsGroupBox
+      // 
+      this.productsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.productsGroupBox.Controls.Add(this.showDetailsButton);
+      this.productsGroupBox.Controls.Add(this.showLargeIconsButton);
+      this.productsGroupBox.Controls.Add(this.installProductsButton);
+      this.productsGroupBox.Controls.Add(this.refreshButton);
+      this.productsGroupBox.Controls.Add(this.productsListView);
+      this.productsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.productsGroupBox.Name = "productsGroupBox";
+      this.productsGroupBox.Size = new System.Drawing.Size(252, 558);
+      this.productsGroupBox.TabIndex = 19;
+      this.productsGroupBox.TabStop = false;
+      this.productsGroupBox.Text = "Products";
+      // 
+      // showDetailsButton
+      // 
+      this.showDetailsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.showDetailsButton.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsButton.Checked = true;
+      this.showDetailsButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.show_details;
+      this.showDetailsButton.Location = new System.Drawing.Point(221, 19);
+      this.showDetailsButton.Name = "showDetailsButton";
+      this.showDetailsButton.Size = new System.Drawing.Size(25, 25);
+      this.showDetailsButton.TabIndex = 22;
+      this.showDetailsButton.TabStop = true;
+      this.toolTip.SetToolTip(this.showDetailsButton, "Show Details");
+      this.showDetailsButton.UseVisualStyleBackColor = true;
+      this.showDetailsButton.CheckedChanged += new System.EventHandler(this.showDetailsButton_CheckedChanged);
+      // 
+      // showLargeIconsButton
+      // 
+      this.showLargeIconsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.showLargeIconsButton.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showLargeIconsButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.show_icons;
+      this.showLargeIconsButton.Location = new System.Drawing.Point(190, 19);
+      this.showLargeIconsButton.Name = "showLargeIconsButton";
+      this.showLargeIconsButton.Size = new System.Drawing.Size(25, 25);
+      this.showLargeIconsButton.TabIndex = 21;
+      this.toolTip.SetToolTip(this.showLargeIconsButton, "Show Large Icons");
+      this.showLargeIconsButton.UseVisualStyleBackColor = true;
+      this.showLargeIconsButton.CheckedChanged += new System.EventHandler(this.showLargeIconsButton_CheckedChanged);
+      // 
+      // installProductsButton
+      // 
+      this.installProductsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.installProductsButton.Enabled = false;
+      this.installProductsButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Install;
+      this.installProductsButton.Location = new System.Drawing.Point(6, 527);
+      this.installProductsButton.Name = "installProductsButton";
+      this.installProductsButton.Size = new System.Drawing.Size(146, 25);
+      this.installProductsButton.TabIndex = 20;
+      this.installProductsButton.Text = "Install Selected Product";
+      this.installProductsButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.installProductsButton, "Install all plugins for the selected product");
+      this.installProductsButton.UseVisualStyleBackColor = true;
+      this.installProductsButton.Click += new System.EventHandler(this.installProductsButton_Click);
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
+      this.refreshButton.Location = new System.Drawing.Point(6, 19);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(72, 25);
+      this.refreshButton.TabIndex = 16;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh available products from HeuristicLab deployment service");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshRemoteButton_Click);
+      // 
+      // pluginsGroupBox
+      // 
+      this.pluginsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginsGroupBox.Controls.Add(this.pluginsListView);
+      this.pluginsGroupBox.Controls.Add(this.installPluginsButton);
+      this.pluginsGroupBox.Location = new System.Drawing.Point(-1, 0);
+      this.pluginsGroupBox.Name = "pluginsGroupBox";
+      this.pluginsGroupBox.Size = new System.Drawing.Size(278, 558);
+      this.pluginsGroupBox.TabIndex = 20;
+      this.pluginsGroupBox.TabStop = false;
+      this.pluginsGroupBox.Text = "Plugins";
+      // 
+      // installPluginsButton
+      // 
+      this.installPluginsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.installPluginsButton.Enabled = false;
+      this.installPluginsButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Install;
+      this.installPluginsButton.Location = new System.Drawing.Point(6, 527);
+      this.installPluginsButton.Name = "installPluginsButton";
+      this.installPluginsButton.Size = new System.Drawing.Size(140, 25);
+      this.installPluginsButton.TabIndex = 17;
+      this.installPluginsButton.Text = "Install Selected Plugins";
+      this.installPluginsButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.installPluginsButton, "Install only checked plugins");
+      this.installPluginsButton.UseVisualStyleBackColor = true;
+      this.installPluginsButton.Click += new System.EventHandler(this.installPluginsButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.productsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.pluginsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(533, 558);
+      this.splitContainer.SplitterDistance = 252;
+      this.splitContainer.TabIndex = 21;
+      // 
+      // RemotePluginInstallerView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "RemotePluginInstallerView";
+      this.Size = new System.Drawing.Size(533, 558);
+      this.productsGroupBox.ResumeLayout(false);
+      this.pluginsGroupBox.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private MultiSelectListView pluginsListView;
+    private System.Windows.Forms.ColumnHeader nameHeader;
+    private System.Windows.Forms.ColumnHeader versionHeader;
+    private System.Windows.Forms.ColumnHeader descriptionHeader;
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.Button installPluginsButton;
+    private System.Windows.Forms.ListView productsListView;
+    private System.Windows.Forms.GroupBox productsGroupBox;
+    private System.Windows.Forms.GroupBox pluginsGroupBox;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.Button installProductsButton;
+    private System.Windows.Forms.ColumnHeader productNameHeader;
+    private System.Windows.Forms.ColumnHeader productVersionHeader;
+    private System.Windows.Forms.ImageList productImageList;
+    private System.Windows.Forms.ImageList pluginsImageList;
+    private System.Windows.Forms.RadioButton showDetailsButton;
+    private System.Windows.Forms.RadioButton showLargeIconsButton;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ImageList productLargeImageList;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/AvailablePluginsView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/AvailablePluginsView.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/AvailablePluginsView.cs	(revision 3627)
@@ -0,0 +1,325 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class AvailablePluginsView : InstallationManagerControl {
+    private class RefreshBackgroundWorkerResult {
+      public IEnumerable<IPluginDescription> RemotePlugins { get; set; }
+      public IEnumerable<DeploymentService.ProductDescription> RemoteProducts { get; set; }
+    }
+    private class UpdateOrInstallPluginsBackgroundWorkerArgument {
+      public IEnumerable<IPluginDescription> PluginsToUpdate { get; set; }
+      public IEnumerable<IPluginDescription> PluginsToInstall { get; set; }
+    }
+    private const string PluginDiscoveryMessage = "Looking for new plugins...";
+    private BackgroundWorker refreshServerPluginsBackgroundWorker;
+    private BackgroundWorker updateOrInstallPluginsBackgroundWorker;
+
+    private IEnumerable<DeploymentService.ProductDescription> products;
+    private IEnumerable<IPluginDescription> plugins;
+
+    private IEnumerable<IPluginDescription> CheckedPlugins {
+      get {
+        return (from item in pluginsListView.Items.OfType<ListViewItem>()
+                where item.Checked
+                let plugin = item.Tag as IPluginDescription
+                where plugin != null
+                select plugin).ToList();
+      }
+    }
+
+    private InstallationManager installationManager;
+    public InstallationManager InstallationManager {
+      get { return installationManager; }
+      set { installationManager = value; }
+    }
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set { pluginManager = value; }
+    }
+    public AvailablePluginsView() {
+      InitializeComponent();
+      productImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.Setup_Install);
+      productLargeImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.Setup_Install);
+      pluginsImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.plugin_16);
+      refreshServerPluginsBackgroundWorker = new BackgroundWorker();
+      refreshServerPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(refreshServerPluginsBackgroundWorker_DoWork);
+      refreshServerPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshServerPluginsBackgroundWorker_RunWorkerCompleted);
+
+      updateOrInstallPluginsBackgroundWorker = new BackgroundWorker();
+      updateOrInstallPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updateOrInstallPluginsBackgroundWorker_DoWork);
+      updateOrInstallPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted);
+    }
+
+
+    #region event handlers for refresh server plugins background worker
+    void refreshServerPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+          "Please check your connection settings and user credentials.");
+      } else {
+        RefreshBackgroundWorkerResult refreshResult = (RefreshBackgroundWorkerResult)e.Result;
+        products = refreshResult.RemoteProducts;
+        plugins = refreshResult.RemotePlugins;
+        UpdateControl();
+      }
+      StatusView.UnlockUI();
+      StatusView.RemoveMessage(PluginDiscoveryMessage);
+      StatusView.HideProgressIndicator();
+    }
+
+    void refreshServerPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      RefreshBackgroundWorkerResult result = new RefreshBackgroundWorkerResult();
+      result.RemotePlugins = installationManager.GetRemotePluginList();
+      result.RemoteProducts = installationManager.GetRemoteProductList();
+      e.Result = result;
+    }
+    #endregion
+    #region event handlers for plugin update background worker
+    void updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+          "Please check your connection settings and user credentials.");
+      } else {
+        UpdateControl();
+      }
+      StatusView.UnlockUI();
+      StatusView.HideProgressIndicator();
+    }
+
+    void updateOrInstallPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      UpdateOrInstallPluginsBackgroundWorkerArgument info = (UpdateOrInstallPluginsBackgroundWorkerArgument)e.Argument;
+      if (info.PluginsToInstall.Count() > 0)
+        installationManager.Install(info.PluginsToInstall);
+      if (info.PluginsToUpdate.Count() > 0)
+        installationManager.Update(info.PluginsToUpdate);
+
+      if (info.PluginsToInstall.Count() > 0 || info.PluginsToUpdate.Count() > 0)
+        pluginManager.DiscoverAndCheckPlugins();
+    }
+    #endregion
+
+
+    #region button events
+    private void refreshRemoteButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(PluginDiscoveryMessage);
+      refreshServerPluginsBackgroundWorker.RunWorkerAsync();
+    }
+    private void installPluginsButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      var updateOrInstallInfo = new UpdateOrInstallPluginsBackgroundWorkerArgument();
+      // if there is a local plugin with same name and same major and minor version then it's an update
+      var pluginsToUpdate = from remotePlugin in CheckedPlugins
+                            let matchingLocalPlugins = from localPlugin in pluginManager.Plugins
+                                                       where localPlugin.Name == remotePlugin.Name
+                                                       where localPlugin.Version.Major == remotePlugin.Version.Major
+                                                       where localPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                       where IsNewerThan(remotePlugin, localPlugin)
+                                                       select localPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select remotePlugin;
+
+      // otherwise install a new plugin
+      var pluginsToInstall = CheckedPlugins.Except(pluginsToUpdate);
+
+      updateOrInstallInfo.PluginsToInstall = pluginsToInstall;
+      updateOrInstallInfo.PluginsToUpdate = pluginsToUpdate;
+      updateOrInstallPluginsBackgroundWorker.RunWorkerAsync(updateOrInstallInfo);
+    }
+    private void installProductsButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      var updateOrInstallInfo = new UpdateOrInstallPluginsBackgroundWorkerArgument();
+      var selectedProduct = (DeploymentService.ProductDescription)productsListView.SelectedItems[0].Tag;
+      // if there is a local plugin with same name and same major and minor version then it's an update
+      var pluginsToUpdate = from plugin in selectedProduct.Plugins
+                            let matchingLocalPlugins = from localPlugin in pluginManager.Plugins
+                                                       where localPlugin.Name == plugin.Name
+                                                       where localPlugin.Version.Major == plugin.Version.Major
+                                                       where localPlugin.Version.Minor == plugin.Version.Minor
+                                                       where IsNewerThan(plugin, localPlugin)
+                                                       select localPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select plugin;
+
+      // otherwise install a new plugin
+      var pluginsToInstall = selectedProduct.Plugins.Except(pluginsToUpdate);
+
+      updateOrInstallInfo.PluginsToInstall = (IEnumerable<IPluginDescription>)pluginsToInstall.ToList();
+      updateOrInstallInfo.PluginsToUpdate = (IEnumerable<IPluginDescription>)pluginsToUpdate.ToList();
+      updateOrInstallPluginsBackgroundWorker.RunWorkerAsync(updateOrInstallInfo);
+    }
+
+    private void showLargeIconsButton_CheckedChanged(object sender, EventArgs e) {
+      productsListView.View = View.LargeIcon;
+    }
+
+    private void showDetailsButton_CheckedChanged(object sender, EventArgs e) {
+      productsListView.View = View.Details;
+    }
+
+    #endregion
+
+    private void UpdateControl() {
+      // clear products view
+      List<ListViewItem> productItemsToDelete = new List<ListViewItem>(productsListView.Items.OfType<ListViewItem>());
+      productItemsToDelete.ForEach(item => productsListView.Items.Remove(item));
+
+      // populate products list view
+      foreach (var product in products) {
+        var item = CreateListViewItem(product);
+        productsListView.Items.Add(item);
+      }
+      var allPluginsListViewItem = new ListViewItem();
+      allPluginsListViewItem.Text = "All Plugins";
+      allPluginsListViewItem.ImageIndex = 0;
+      productsListView.Items.Add(allPluginsListViewItem);
+      Util.ResizeColumns(productsListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private void UpdatePluginsList() {
+      pluginsListView.Items.Clear();
+
+      // populate plugins list
+      if (productsListView.SelectedItems.Count > 0) {
+        pluginsListView.SuppressItemCheckedEvents = true;
+
+        var selectedItem = productsListView.SelectedItems[0];
+        if (selectedItem.Text == "All Plugins") {
+          foreach (var plugin in plugins) {
+            var item = CreateListViewItem(plugin);
+            pluginsListView.Items.Add(item);
+          }
+        } else {
+          var selectedProduct = (DeploymentService.ProductDescription)productsListView.SelectedItems[0].Tag;
+          foreach (var plugin in selectedProduct.Plugins) {
+            var item = CreateListViewItem(plugin);
+            pluginsListView.Items.Add(item);
+          }
+        }
+
+        Util.ResizeColumns(pluginsListView.Columns.OfType<ColumnHeader>());
+        pluginsListView.SuppressItemCheckedEvents = false;
+      }
+    }
+
+    private ListViewItem CreateListViewItem(DeploymentService.ProductDescription product) {
+      ListViewItem item = new ListViewItem(new string[] { product.Name, product.Version.ToString() });
+      item.Tag = product;
+      item.ImageIndex = 0;
+      return item;
+    }
+
+    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
+      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });
+      item.Tag = plugin;
+      item.ImageIndex = 0;
+      return item;
+    }
+
+    #region products list view events
+    private void productsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdatePluginsList();
+      installProductsButton.Enabled = (productsListView.SelectedItems.Count > 0 &&
+        productsListView.SelectedItems[0].Text != "All Plugins");
+    }
+    #endregion
+
+    #region item checked event handler
+    private void remotePluginsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      foreach (ListViewItem item in pluginsListView.SelectedItems) {
+        IPluginDescription plugin = (IPluginDescription)item.Tag;
+        if (e.Item.Checked)
+          HandlePluginChecked(plugin);
+        else
+          HandlePluginUnchecked(plugin);
+      }
+      installPluginsButton.Enabled = pluginsListView.CheckedItems.Count > 0;
+    }
+
+    private void HandlePluginUnchecked(IPluginDescription plugin) {
+      // also uncheck all dependent plugins
+      List<ListViewItem> modifiedItems = new List<ListViewItem>();
+      modifiedItems.AddRange(FindItemsForPlugin(plugin));
+      var dependentPlugins = Util.GetAllDependents(plugin, plugins);
+      foreach (var dependentPlugin in dependentPlugins) {
+        // there can be multiple entries for a single plugin in different groups
+        foreach (var item in FindItemsForPlugin(dependentPlugin)) {
+          if (item != null && item.Checked) {
+            if (!modifiedItems.Contains(item))
+              modifiedItems.Add(item);
+          }
+        }
+      }
+      pluginsListView.UncheckItems(modifiedItems);
+    }
+
+    private void HandlePluginChecked(IPluginDescription plugin) {
+      // also check all dependencies
+      List<ListViewItem> modifiedItems = new List<ListViewItem>();
+      modifiedItems.AddRange(FindItemsForPlugin(plugin));
+      foreach (var dep in Util.GetAllDependencies(plugin)) {
+        // there can be multiple entries for a single plugin in different groups
+        foreach (ListViewItem item in FindItemsForPlugin(dep)) {
+          if (item != null && !item.Checked) {
+            if (!modifiedItems.Contains(item))
+              modifiedItems.Add(item);
+          }
+        }
+      }
+      pluginsListView.CheckItems(modifiedItems);
+    }
+
+    #endregion
+
+    #region helper methods
+    private IEnumerable<ListViewItem> FindItemsForPlugin(IPluginDescription plugin) {
+      return (from item in pluginsListView.Items.OfType<ListViewItem>()
+              let otherPlugin = item.Tag as IPluginDescription
+              where otherPlugin != null && otherPlugin.Name == plugin.Name && otherPlugin.Version == plugin.Version
+              select item);
+    }
+
+    private bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
+      // newer: build version is higher, or if build version is the same revision is higher
+      if (plugin1.Version.Build < plugin2.Version.Build) return false;
+      else if (plugin1.Version.Build > plugin2.Version.Build) return true;
+      else return plugin1.Version.Revision > plugin2.Version.Revision;
+    }
+    #endregion
+
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/AvailablePluginsView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/AvailablePluginsView.resx	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/AvailablePluginsView.resx	(revision 3627)
@@ -0,0 +1,132 @@
+<?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>
+  <metadata name="pluginsImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>365, 17</value>
+  </metadata>
+  <metadata name="productLargeImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>29, 18</value>
+  </metadata>
+  <metadata name="productImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>191, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>508, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/EditProductsView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/EditProductsView.Designer.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/EditProductsView.Designer.cs	(revision 3627)
@@ -0,0 +1,367 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class EditProductsView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.uploadButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.productsGroupBox = new System.Windows.Forms.GroupBox();
+      this.deleteProductButton = new System.Windows.Forms.Button();
+      this.newProductButton = new System.Windows.Forms.Button();
+      this.productsListView = new System.Windows.Forms.ListView();
+      this.productNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.productVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.productImageList = new System.Windows.Forms.ImageList(this.components);
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.pluginsGroupBox = new System.Windows.Forms.GroupBox();
+      this.pluginListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
+      this.pluginNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginDescriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
+      this.versionTextBox = new System.Windows.Forms.TextBox();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.versionLabel = new System.Windows.Forms.Label();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.productsGroupBox.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.pluginsGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
+      this.refreshButton.Location = new System.Drawing.Point(6, 394);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(73, 26);
+      this.refreshButton.TabIndex = 1;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh list of plugins and products from server");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // uploadButton
+      // 
+      this.uploadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.uploadButton.Enabled = false;
+      this.uploadButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.PublishToWebHS;
+      this.uploadButton.Location = new System.Drawing.Point(85, 394);
+      this.uploadButton.Name = "uploadButton";
+      this.uploadButton.Size = new System.Drawing.Size(120, 26);
+      this.uploadButton.TabIndex = 2;
+      this.uploadButton.Text = "Upload Products";
+      this.uploadButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.uploadButton, "Upload changed products to server");
+      this.uploadButton.UseVisualStyleBackColor = true;
+      this.uploadButton.Click += new System.EventHandler(this.saveButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.productsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(665, 426);
+      this.splitContainer.SplitterDistance = 321;
+      this.splitContainer.TabIndex = 4;
+      // 
+      // productsGroupBox
+      // 
+      this.productsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.productsGroupBox.Controls.Add(this.deleteProductButton);
+      this.productsGroupBox.Controls.Add(this.uploadButton);
+      this.productsGroupBox.Controls.Add(this.newProductButton);
+      this.productsGroupBox.Controls.Add(this.productsListView);
+      this.productsGroupBox.Controls.Add(this.refreshButton);
+      this.productsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.productsGroupBox.Name = "productsGroupBox";
+      this.productsGroupBox.Size = new System.Drawing.Size(321, 426);
+      this.productsGroupBox.TabIndex = 5;
+      this.productsGroupBox.TabStop = false;
+      this.productsGroupBox.Text = "Products";
+      // 
+      // deleteProductButton
+      // 
+      this.deleteProductButton.Enabled = false;
+      this.deleteProductButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Actions_Remove;
+      this.deleteProductButton.Location = new System.Drawing.Point(116, 19);
+      this.deleteProductButton.Name = "deleteProductButton";
+      this.deleteProductButton.Size = new System.Drawing.Size(104, 26);
+      this.deleteProductButton.TabIndex = 5;
+      this.deleteProductButton.Text = "Delete Product";
+      this.deleteProductButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.deleteProductButton, "Deletes the selected product");
+      this.deleteProductButton.UseVisualStyleBackColor = true;
+      this.deleteProductButton.Click += new System.EventHandler(this.deleteProductButton_Click);
+      // 
+      // newProductButton
+      // 
+      this.newProductButton.Enabled = false;
+      this.newProductButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Actions_Add;
+      this.newProductButton.Location = new System.Drawing.Point(6, 19);
+      this.newProductButton.Name = "newProductButton";
+      this.newProductButton.Size = new System.Drawing.Size(104, 26);
+      this.newProductButton.TabIndex = 3;
+      this.newProductButton.Text = "Create Product";
+      this.newProductButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.newProductButton, "Create a new product");
+      this.newProductButton.UseVisualStyleBackColor = true;
+      this.newProductButton.Click += new System.EventHandler(this.newProductButton_Click);
+      // 
+      // productsListView
+      // 
+      this.productsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.productsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.productNameHeader,
+            this.productVersionHeader});
+      this.productsListView.Enabled = false;
+      this.productsListView.FullRowSelect = true;
+      this.productsListView.HideSelection = false;
+      this.productsListView.Location = new System.Drawing.Point(6, 51);
+      this.productsListView.MultiSelect = false;
+      this.productsListView.Name = "productsListView";
+      this.productsListView.Size = new System.Drawing.Size(309, 337);
+      this.productsListView.SmallImageList = this.productImageList;
+      this.productsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.productsListView.TabIndex = 4;
+      this.productsListView.UseCompatibleStateImageBehavior = false;
+      this.productsListView.View = System.Windows.Forms.View.Details;
+      this.productsListView.SelectedIndexChanged += new System.EventHandler(this.productsListBox_SelectedIndexChanged);
+      // 
+      // productNameHeader
+      // 
+      this.productNameHeader.Text = "Name";
+      this.productNameHeader.Width = 40;
+      // 
+      // productVersionHeader
+      // 
+      this.productVersionHeader.Text = "Version";
+      this.productVersionHeader.Width = 265;
+      // 
+      // productImageList
+      // 
+      this.productImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.productImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.productImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.detailsGroupBox.Controls.Add(this.pluginsGroupBox);
+      this.detailsGroupBox.Controls.Add(this.versionTextBox);
+      this.detailsGroupBox.Controls.Add(this.nameLabel);
+      this.detailsGroupBox.Controls.Add(this.nameTextBox);
+      this.detailsGroupBox.Controls.Add(this.versionLabel);
+      this.detailsGroupBox.Enabled = false;
+      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(340, 426);
+      this.detailsGroupBox.TabIndex = 8;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // pluginsGroupBox
+      // 
+      this.pluginsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginsGroupBox.Controls.Add(this.pluginListView);
+      this.pluginsGroupBox.Location = new System.Drawing.Point(6, 71);
+      this.pluginsGroupBox.Name = "pluginsGroupBox";
+      this.pluginsGroupBox.Size = new System.Drawing.Size(328, 349);
+      this.pluginsGroupBox.TabIndex = 6;
+      this.pluginsGroupBox.TabStop = false;
+      this.pluginsGroupBox.Text = "Plugins";
+      // 
+      // pluginListView
+      // 
+      this.pluginListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginListView.CheckBoxes = true;
+      this.pluginListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.pluginNameHeader,
+            this.pluginVersionHeader,
+            this.pluginDescriptionHeader});
+      this.pluginListView.Location = new System.Drawing.Point(3, 16);
+      this.pluginListView.Name = "pluginListView";
+      this.pluginListView.Size = new System.Drawing.Size(322, 330);
+      this.pluginListView.SmallImageList = this.pluginImageList;
+      this.pluginListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.pluginListView.SuppressItemCheckedEvents = false;
+      this.pluginListView.TabIndex = 7;
+      this.pluginListView.UseCompatibleStateImageBehavior = false;
+      this.pluginListView.View = System.Windows.Forms.View.Details;
+      this.pluginListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listView_ItemChecked);
+      // 
+      // pluginNameHeader
+      // 
+      this.pluginNameHeader.Text = "Name";
+      // 
+      // pluginVersionHeader
+      // 
+      this.pluginVersionHeader.Text = "Version";
+      // 
+      // pluginDescriptionHeader
+      // 
+      this.pluginDescriptionHeader.Text = "Description";
+      // 
+      // pluginImageList
+      // 
+      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // versionTextBox
+      // 
+      this.versionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.versionTextBox.Location = new System.Drawing.Point(57, 45);
+      this.versionTextBox.Name = "versionTextBox";
+      this.versionTextBox.Size = new System.Drawing.Size(243, 20);
+      this.versionTextBox.TabIndex = 5;
+      this.versionTextBox.TextChanged += new System.EventHandler(this.versionTextBox_TextChanged);
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(13, 22);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 2;
+      this.nameLabel.Text = "Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Location = new System.Drawing.Point(57, 19);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(243, 20);
+      this.nameTextBox.TabIndex = 3;
+      this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
+      // 
+      // versionLabel
+      // 
+      this.versionLabel.AutoSize = true;
+      this.versionLabel.Location = new System.Drawing.Point(6, 48);
+      this.versionLabel.Name = "versionLabel";
+      this.versionLabel.Size = new System.Drawing.Size(45, 13);
+      this.versionLabel.TabIndex = 4;
+      this.versionLabel.Text = "Version:";
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // ProductEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ProductEditor";
+      this.Size = new System.Drawing.Size(665, 426);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.productsGroupBox.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.detailsGroupBox.PerformLayout();
+      this.pluginsGroupBox.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.Button uploadButton;
+    private System.Windows.Forms.Button newProductButton;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.TextBox versionTextBox;
+    private System.Windows.Forms.Label versionLabel;
+    private System.Windows.Forms.TextBox nameTextBox;
+    private System.Windows.Forms.Label nameLabel;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.ListView productsListView;
+    private System.Windows.Forms.ColumnHeader productNameHeader;
+    private System.Windows.Forms.ColumnHeader productVersionHeader;
+    private System.Windows.Forms.ImageList productImageList;
+    private System.Windows.Forms.ImageList pluginImageList;
+    private MultiSelectListView pluginListView;
+    private System.Windows.Forms.GroupBox productsGroupBox;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private System.Windows.Forms.GroupBox pluginsGroupBox;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button deleteProductButton;
+    private System.Windows.Forms.ColumnHeader pluginNameHeader;
+    private System.Windows.Forms.ColumnHeader pluginVersionHeader;
+    private System.Windows.Forms.ColumnHeader pluginDescriptionHeader;
+
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/EditProductsView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/EditProductsView.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/EditProductsView.cs	(revision 3627)
@@ -0,0 +1,460 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.ServiceModel;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class EditProductsView : InstallationManagerControl {
+    private const string RefreshMessage = "Downloading product and plugin information...";
+    private const string UploadMessage = "Uploading product and plugin information...";
+    private const string DeleteProductMessage = "Deleting product...";
+
+    private BackgroundWorker refreshProductsWorker;
+    private BackgroundWorker uploadChangedProductsWorker;
+    private BackgroundWorker deleteProductWorker;
+
+    private List<DeploymentService.ProductDescription> products;
+    private List<DeploymentService.PluginDescription> plugins;
+    private HashSet<DeploymentService.ProductDescription> dirtyProducts;
+
+    public EditProductsView() {
+      InitializeComponent();
+
+      productImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.Setup_Install);
+      productImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.ArrowUp);
+      pluginImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.plugin_16);
+
+      dirtyProducts = new HashSet<DeploymentService.ProductDescription>();
+      refreshProductsWorker = new BackgroundWorker();
+      refreshProductsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshProductsWorker_RunWorkerCompleted);
+      refreshProductsWorker.DoWork += new DoWorkEventHandler(refreshProductsWorker_DoWork);
+
+      uploadChangedProductsWorker = new BackgroundWorker();
+      uploadChangedProductsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(uploadChangedProductsWorker_RunWorkerCompleted);
+      uploadChangedProductsWorker.DoWork += new DoWorkEventHandler(uploadChangedProductsWorker_DoWork);
+
+      deleteProductWorker = new BackgroundWorker();
+      deleteProductWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(deleteProductWorker_RunWorkerCompleted);
+      deleteProductWorker.DoWork += new DoWorkEventHandler(deleteProductWorker_DoWork);
+    }
+
+    #region event handlers for delete product background worker
+    void deleteProductWorker_DoWork(object sender, DoWorkEventArgs e) {
+      var products = (IEnumerable<DeploymentService.ProductDescription>)e.Argument;
+      var adminClient = DeploymentService.AdminClientFactory.CreateClient();
+      // upload
+      try {
+        foreach (var product in products) {
+          adminClient.DeleteProduct(product);
+        }
+        adminClient.Close();
+      }
+      catch (TimeoutException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        adminClient.Abort();
+        throw;
+      }
+      // refresh      
+      var updateClient = DeploymentService.UpdateClientFactory.CreateClient();
+      try {
+        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
+        updateClient.Close();
+      }
+      catch (TimeoutException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        updateClient.Abort();
+        throw;
+      }
+    }
+
+    void deleteProductWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+        "There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+        this.products.Clear();
+        this.plugins.Clear();
+      } else {
+        this.products = new List<DeploymentService.ProductDescription>(
+  (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
+        this.plugins = new List<DeploymentService.PluginDescription>(
+          (DeploymentService.PluginDescription[])((object[])e.Result)[1]);
+
+        EnableControls();
+      }
+      UpdateProductsList();
+      dirtyProducts.Clear();
+      StatusView.HideProgressIndicator();
+      StatusView.RemoveMessage(DeleteProductMessage);
+      StatusView.UnlockUI();
+    }
+    #endregion
+
+    #region event handlers for upload products background worker
+    private void uploadChangedProductsWorker_DoWork(object sender, DoWorkEventArgs e) {
+      var products = (IEnumerable<DeploymentService.ProductDescription>)e.Argument;
+      var adminClient = DeploymentService.AdminClientFactory.CreateClient();
+      // upload
+      try {
+        foreach (var product in products) {
+          adminClient.DeployProduct(product);
+        }
+        adminClient.Close();
+      }
+      catch (TimeoutException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        adminClient.Abort();
+        throw;
+      }
+      // refresh      
+      var updateClient = DeploymentService.UpdateClientFactory.CreateClient();
+      try {
+        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
+        updateClient.Close();
+      }
+      catch (TimeoutException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        updateClient.Abort();
+        throw;
+      }
+    }
+
+    private void uploadChangedProductsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+        "There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+        this.products.Clear();
+        this.plugins.Clear();
+      } else {
+        this.products = new List<DeploymentService.ProductDescription>(
+  (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
+        this.plugins = new List<DeploymentService.PluginDescription>(
+          (DeploymentService.PluginDescription[])((object[])e.Result)[1]);
+
+      }
+      UpdateProductsList();
+      dirtyProducts.Clear();
+      EnableControls();
+      StatusView.HideProgressIndicator();
+      StatusView.RemoveMessage(UploadMessage);
+      StatusView.UnlockUI();
+    }
+    #endregion
+
+    #region event handlers for refresh products background worker
+    private void refreshProductsWorker_DoWork(object sender, DoWorkEventArgs e) {
+      var updateClient = DeploymentService.UpdateClientFactory.CreateClient();
+      try {
+        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
+        updateClient.Close();
+      }
+      catch (TimeoutException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        updateClient.Abort();
+        throw;
+      }
+    }
+
+    private void refreshProductsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+                   "Please check your connection settings and user credentials.");
+        this.products.Clear();
+        this.plugins.Clear();
+
+      } else {
+        this.products = new List<DeploymentService.ProductDescription>(
+          (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
+        this.plugins = new List<DeploymentService.PluginDescription>(
+          (DeploymentService.PluginDescription[])((object[])e.Result)[1]);
+      }
+      UpdateProductsList();
+      dirtyProducts.Clear();
+      EnableControls();
+      StatusView.HideProgressIndicator();
+      StatusView.RemoveMessage(RefreshMessage);
+      StatusView.UnlockUI();
+    }
+    #endregion
+
+    private void UpdateProductsList() {
+      productsListView.SelectedItems.Clear();
+      productsListView.Items.Clear();
+      foreach (var prodDesc in products) {
+        productsListView.Items.Add(CreateListViewItem(prodDesc));
+      }
+      Util.ResizeColumns(productsListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private void productsListBox_SelectedIndexChanged(object sender, EventArgs e) {
+      bool productSelected = productsListView.SelectedItems.Count > 0;
+      detailsGroupBox.Enabled = productSelected;
+      UpdateProductButtons();
+      if (productSelected) {
+        DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)((ListViewItem)productsListView.SelectedItems[0]).Tag;
+        nameTextBox.Text = activeProduct.Name;
+        versionTextBox.Text = activeProduct.Version.ToString();
+
+        // populate plugins list view
+        ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
+        pluginListView.SuppressItemCheckedEvents = true;
+        foreach (var plugin in plugins.OfType<IPluginDescription>()) {
+          pluginListView.Items.Add(CreateListViewItem(plugin));
+        }
+        pluginListView.SuppressItemCheckedEvents = false;
+        foreach (var plugin in activeProduct.Plugins) {
+          pluginListView.CheckItems(FindItemsForPlugin(plugin));
+        }
+      } else {
+        nameTextBox.Text = string.Empty;
+        versionTextBox.Text = string.Empty;
+        pluginListView.Items.Clear();
+      }
+      Util.ResizeColumns(pluginListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private void UpdateProductButtons() {
+      uploadButton.Enabled = dirtyProducts.Count > 0;
+      if (productsListView.SelectedItems.Count > 0) {
+        var selectedProduct = (DeploymentService.ProductDescription)productsListView.SelectedItems[0].Tag;
+        deleteProductButton.Enabled = !dirtyProducts.Contains(selectedProduct);
+      } else {
+        deleteProductButton.Enabled = false;
+      }
+    }
+
+
+    #region button event handlers
+    private void newProductButton_Click(object sender, EventArgs e) {
+      var newProduct = new DeploymentService.ProductDescription("New product", new Version("0.0.0.0"));
+      products.Add(newProduct);
+      UpdateProductsList();
+      MarkProductDirty(newProduct);
+    }
+
+    private void saveButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(UploadMessage);
+      uploadChangedProductsWorker.RunWorkerAsync(dirtyProducts);
+    }
+    private void refreshButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(RefreshMessage);
+      refreshProductsWorker.RunWorkerAsync();
+    }
+    private void deleteProductButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(DeleteProductMessage);
+      var selectedProducts = from item in productsListView.SelectedItems.OfType<ListViewItem>()
+                             select (DeploymentService.ProductDescription)item.Tag;
+      deleteProductWorker.RunWorkerAsync(selectedProducts.ToList());
+    }
+
+    #endregion
+
+    #region textbox changed event handlers
+    private void nameTextBox_TextChanged(object sender, EventArgs e) {
+      if (productsListView.SelectedItems.Count > 0) {
+        ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
+        DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)activeItem.Tag;
+        if (string.IsNullOrEmpty(nameTextBox.Name)) {
+          errorProvider.SetError(nameTextBox, "Invalid value");
+        } else {
+          if (activeProduct.Name != nameTextBox.Text) {
+            activeProduct.Name = nameTextBox.Text;
+            activeItem.SubItems[0].Text = activeProduct.Name;
+            errorProvider.SetError(nameTextBox, string.Empty);
+            MarkProductDirty(activeProduct);
+          }
+        }
+      }
+    }
+
+
+    private void versionTextBox_TextChanged(object sender, EventArgs e) {
+      if (productsListView.SelectedItems.Count > 0) {
+        ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
+        DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)activeItem.Tag;
+        try {
+          var newVersion = new Version(versionTextBox.Text);
+          if (activeProduct.Version != newVersion) {
+            activeProduct.Version = newVersion;
+            activeItem.SubItems[1].Text = versionTextBox.Text;
+            errorProvider.SetError(versionTextBox, string.Empty);
+            MarkProductDirty(activeProduct);
+          }
+        }
+        catch (OverflowException) {
+          errorProvider.SetError(versionTextBox, "Invalid value");
+        }
+
+        catch (ArgumentException) {
+          errorProvider.SetError(versionTextBox, "Invalid value");
+        }
+        catch (FormatException) {
+          errorProvider.SetError(versionTextBox, "Invalid value");
+        }
+      }
+    }
+    #endregion
+
+
+    #region plugin list view
+    private void OnItemChecked(ItemCheckedEventArgs e) {
+      ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
+      DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)activeItem.Tag;
+      activeProduct.Plugins = (from item in pluginListView.CheckedItems.OfType<ListViewItem>()
+                               select (DeploymentService.PluginDescription)item.Tag).ToArray();
+      MarkProductDirty(activeProduct);
+    }
+
+    private void listView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      List<IPluginDescription> modifiedPlugins = new List<IPluginDescription>();
+      if (e.Item.Checked) {
+        foreach (ListViewItem item in pluginListView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          // also check all dependencies
+          if (!modifiedPlugins.Contains(plugin))
+            modifiedPlugins.Add(plugin);
+          foreach (var dep in Util.GetAllDependencies(plugin)) {
+            if (!modifiedPlugins.Contains(dep))
+              modifiedPlugins.Add(dep);
+          }
+        }
+        pluginListView.CheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
+        OnItemChecked(e);
+      } else {
+        foreach (ListViewItem item in pluginListView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          // also uncheck all dependent plugins
+          if (!modifiedPlugins.Contains(plugin))
+            modifiedPlugins.Add(plugin);
+          foreach (var dep in Util.GetAllDependents(plugin, plugins.Cast<IPluginDescription>())) {
+            if (!modifiedPlugins.Contains(dep))
+              modifiedPlugins.Add(dep);
+          }
+
+        }
+        pluginListView.UncheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
+        OnItemChecked(e);
+      }
+    }
+
+
+    #endregion
+
+    #region helper
+    private void MarkProductDirty(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription activeProduct) {
+      if (!dirtyProducts.Contains(activeProduct)) {
+        dirtyProducts.Add(activeProduct);
+        var item = FindItemForProduct(activeProduct);
+        item.ImageIndex = 1;
+        UpdateProductButtons();
+      }
+    }
+    private ListViewItem CreateListViewItem(DeploymentService.ProductDescription productDescription) {
+      ListViewItem item = new ListViewItem(new string[] { productDescription.Name, productDescription.Version.ToString() });
+      item.Tag = productDescription;
+      item.ImageIndex = 0;
+      return item;
+    }
+
+    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
+      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
+          string.Empty, plugin.Description });
+      item.Tag = plugin;
+      item.ImageIndex = 0;
+      item.Checked = false;
+      return item;
+    }
+
+    private ListViewItem FindItemForProduct(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription activeProduct) {
+      return (from item in productsListView.Items.OfType<ListViewItem>()
+              let product = item.Tag as DeploymentService.ProductDescription
+              where product != null
+              where product == activeProduct
+              select item).Single();
+    }
+    private IEnumerable<ListViewItem> FindItemsForPlugin(IPluginDescription plugin) {
+      return from item in pluginListView.Items.OfType<ListViewItem>()
+             let p = item.Tag as IPluginDescription
+             where p.Name == plugin.Name
+             where p.Version == plugin.Version
+             select item;
+    }
+
+    private void EnableControls() {
+      newProductButton.Enabled = true;
+      productsListView.Enabled = true;
+    }
+    #endregion
+
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/EditProductsView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/EditProductsView.resx	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/EditProductsView.resx	(revision 3627)
@@ -0,0 +1,132 @@
+<?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>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>425, 17</value>
+  </metadata>
+  <metadata name="productImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>140, 17</value>
+  </metadata>
+  <metadata name="pluginImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>287, 17</value>
+  </metadata>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs	(revision 3626)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs	(revision 3627)
@@ -53,11 +53,11 @@
       this.basicUpdateView = new HeuristicLab.PluginInfrastructure.Advanced.BasicUpdateView();
       this.localPluginsTabPage = new System.Windows.Forms.TabPage();
-      this.localPluginsView = new HeuristicLab.PluginInfrastructure.Advanced.LocalPluginsView();
+      this.localPluginsView = new HeuristicLab.PluginInfrastructure.Advanced.InstalledPluginsView();
       this.availablePluginsTabPage = new System.Windows.Forms.TabPage();
-      this.remotePluginInstaller = new HeuristicLab.PluginInfrastructure.Advanced.RemotePluginInstallerView();
+      this.remotePluginInstaller = new HeuristicLab.PluginInfrastructure.Advanced.AvailablePluginsView();
       this.uploadPluginsTabPage = new System.Windows.Forms.TabPage();
-      this.pluginEditor = new HeuristicLab.PluginInfrastructure.Advanced.PluginEditor();
+      this.pluginEditor = new HeuristicLab.PluginInfrastructure.Advanced.UploadPluginsView();
       this.manageProductsTabPage = new System.Windows.Forms.TabPage();
-      this.productEditor = new HeuristicLab.PluginInfrastructure.Advanced.ProductEditor();
+      this.productEditor = new HeuristicLab.PluginInfrastructure.Advanced.EditProductsView();
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logTextBox = new System.Windows.Forms.TextBox();
@@ -324,5 +324,5 @@
     private System.Windows.Forms.ToolStripProgressBar toolStripProgressBar;
     private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel;
-    private RemotePluginInstallerView remotePluginInstaller;
+    private AvailablePluginsView remotePluginInstaller;
     private System.Windows.Forms.TabControl tabControl;
     private System.Windows.Forms.TabPage localPluginsTabPage;
@@ -335,7 +335,7 @@
     private System.Windows.Forms.TabPage uploadPluginsTabPage;
     private System.Windows.Forms.TabPage manageProductsTabPage;
-    private PluginEditor pluginEditor;
-    private ProductEditor productEditor;
-    private LocalPluginsView localPluginsView;
+    private UploadPluginsView pluginEditor;
+    private EditProductsView productEditor;
+    private InstalledPluginsView localPluginsView;
     private System.Windows.Forms.TabPage updateAllPluginsTabPage;
     private BasicUpdateView basicUpdateView;
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.cs	(revision 3626)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.cs	(revision 3627)
@@ -172,5 +172,5 @@
       foreach (var plugin in plugins) {
         if (!string.IsNullOrEmpty(plugin.LicenseText)) {
-          var licenseConfirmationBox = new LicenseConfirmationBox(plugin);
+          var licenseConfirmationBox = new LicenseConfirmationDialog(plugin);
           if (licenseConfirmationBox.ShowDialog() != DialogResult.OK)
             return false;
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstalledPluginsView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstalledPluginsView.Designer.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstalledPluginsView.Designer.cs	(revision 3627)
@@ -0,0 +1,182 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class InstalledPluginsView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.Windows.Forms.ListViewGroup listViewGroup3 = new System.Windows.Forms.ListViewGroup("Active Plugins", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup4 = new System.Windows.Forms.ListViewGroup("Disabled Plugins", System.Windows.Forms.HorizontalAlignment.Left);
+      this.localPluginsListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
+      this.nameHeader = new System.Windows.Forms.ColumnHeader();
+      this.versionHeader = new System.Windows.Forms.ColumnHeader();
+      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.updateSelectedButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // localPluginsListView
+      // 
+      this.localPluginsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.localPluginsListView.CheckBoxes = true;
+      this.localPluginsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameHeader,
+            this.versionHeader,
+            this.descriptionHeader});
+      listViewGroup3.Header = "Active Plugins";
+      listViewGroup3.Name = "activePluginsGroup";
+      listViewGroup4.Header = "Disabled Plugins";
+      listViewGroup4.Name = "disabledPluginsGroup";
+      this.localPluginsListView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
+            listViewGroup3,
+            listViewGroup4});
+      this.localPluginsListView.Location = new System.Drawing.Point(0, 0);
+      this.localPluginsListView.Name = "localPluginsListView";
+      this.localPluginsListView.Size = new System.Drawing.Size(539, 477);
+      this.localPluginsListView.SmallImageList = this.pluginImageList;
+      this.localPluginsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.localPluginsListView.SuppressItemCheckedEvents = false;
+      this.localPluginsListView.TabIndex = 13;
+      this.localPluginsListView.UseCompatibleStateImageBehavior = false;
+      this.localPluginsListView.View = System.Windows.Forms.View.Details;
+      this.localPluginsListView.ItemActivate += new System.EventHandler(this.localPluginsListView_ItemActivate);
+      this.localPluginsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.pluginsListView_ItemChecked);
+      // 
+      // nameHeader
+      // 
+      this.nameHeader.Text = "Name";
+      this.nameHeader.Width = 199;
+      // 
+      // versionHeader
+      // 
+      this.versionHeader.Text = "Version";
+      this.versionHeader.Width = 84;
+      // 
+      // descriptionHeader
+      // 
+      this.descriptionHeader.Text = "Description";
+      this.descriptionHeader.Width = 245;
+      // 
+      // pluginImageList
+      // 
+      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.RepeatHS1;
+      this.refreshButton.Location = new System.Drawing.Point(0, 483);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(96, 25);
+      this.refreshButton.TabIndex = 14;
+      this.refreshButton.Text = "Refresh List";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh List of Installed Plugins");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Actions_Remove;
+      this.removeButton.Location = new System.Drawing.Point(222, 483);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(110, 25);
+      this.removeButton.TabIndex = 12;
+      this.removeButton.Text = "Delete Selected";
+      this.removeButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.removeButton, "Delete all selected plugins from disk");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // updateSelectedButton
+      // 
+      this.updateSelectedButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.updateSelectedButton.Enabled = false;
+      this.updateSelectedButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
+      this.updateSelectedButton.Location = new System.Drawing.Point(102, 483);
+      this.updateSelectedButton.Name = "updateSelectedButton";
+      this.updateSelectedButton.Size = new System.Drawing.Size(114, 25);
+      this.updateSelectedButton.TabIndex = 6;
+      this.updateSelectedButton.Text = "Update Selected";
+      this.updateSelectedButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.updateSelectedButton, "Update all selected plugins");
+      this.updateSelectedButton.UseVisualStyleBackColor = true;
+      this.updateSelectedButton.Click += new System.EventHandler(this.updateSelectedButton_Click);
+      // 
+      // LocalPluginsView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.refreshButton);
+      this.Controls.Add(this.localPluginsListView);
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.updateSelectedButton);
+      this.Name = "LocalPluginsView";
+      this.Size = new System.Drawing.Size(539, 508);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button updateSelectedButton;
+    private System.Windows.Forms.Button removeButton;
+    private MultiSelectListView localPluginsListView;
+    private System.Windows.Forms.ColumnHeader nameHeader;
+    private System.Windows.Forms.ColumnHeader versionHeader;
+    private System.Windows.Forms.ColumnHeader descriptionHeader;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ImageList pluginImageList;
+    private System.Windows.Forms.Button refreshButton;
+    // private LocalPluginManagerView localPluginManagerView;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstalledPluginsView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstalledPluginsView.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstalledPluginsView.cs	(revision 3627)
@@ -0,0 +1,248 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.ServiceModel;
+using ICSharpCode.SharpZipLib.Zip;
+using System.IO;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class InstalledPluginsView : InstallationManagerControl {
+    private const string CheckingPluginsMessage = "Checking for updated plugins...";
+    private const string NoUpdatesAvailableMessage = "No updates available.";
+    private BackgroundWorker removePluginsBackgroundWorker;
+    private BackgroundWorker updatePluginsBackgroundWorker;
+
+    private ListViewGroup enabledPluginsGroup;
+    private ListViewGroup disabledPluginsGroup;
+
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set {
+        pluginManager = value;
+        UpdateControl();
+      }
+    }
+
+    private InstallationManager installationManager;
+    public InstallationManager InstallationManager {
+      get { return installationManager; }
+      set { installationManager = value; }
+    }
+
+    public InstalledPluginsView()
+      : base() {
+      InitializeComponent();
+      enabledPluginsGroup = localPluginsListView.Groups["activePluginsGroup"];
+      disabledPluginsGroup = localPluginsListView.Groups["disabledPluginsGroup"];
+      pluginImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.plugin_16);
+      removePluginsBackgroundWorker = new BackgroundWorker();
+      removePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(removePluginsBackgroundWorker_DoWork);
+      removePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(removePluginsBackgroundWorker_RunWorkerCompleted);
+      updatePluginsBackgroundWorker = new BackgroundWorker();
+      updatePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updatePluginsBackgroundWorker_DoWork);
+      updatePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updatePluginsBackgroundWorker_RunWorkerCompleted);
+
+      UpdateControl();
+    }
+
+
+
+    #region event handlers for plugin removal background worker
+    void removePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("File Deletion Error", "There was problem while deleting files." + Environment.NewLine + e.Error.Message);
+      }
+      UpdateControl();
+      StatusView.HideProgressIndicator();
+      StatusView.UnlockUI();
+    }
+
+    void removePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      IEnumerable<IPluginDescription> pluginsToRemove = (IEnumerable<IPluginDescription>)e.Argument;
+      if (pluginsToRemove.Count() > 0) {
+        installationManager.Remove(pluginsToRemove);
+        pluginManager.DiscoverAndCheckPlugins();
+      }
+    }
+    #endregion
+
+    #region event handlers for update plugins backgroundworker
+    void updatePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+      }
+      StatusView.RemoveMessage(CheckingPluginsMessage);
+      StatusView.HideProgressIndicator();
+      StatusView.UnlockUI();
+    }
+
+    void updatePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      IEnumerable<IPluginDescription> selectedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
+      var remotePlugins = installationManager.GetRemotePluginList();
+      // if there is a local plugin with same name and same major and minor version then it's an update
+      var pluginsToUpdate = from remotePlugin in remotePlugins
+                            let matchingLocalPlugins = from installedPlugin in selectedPlugins
+                                                       where installedPlugin.Name == remotePlugin.Name
+                                                       where installedPlugin.Version.Major == remotePlugin.Version.Major
+                                                       where installedPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                       where IsNewerThan(remotePlugin, installedPlugin)
+                                                       select installedPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select remotePlugin;
+      if (pluginsToUpdate.Count() > 0) {
+        installationManager.Update(pluginsToUpdate);
+      }
+      pluginManager.DiscoverAndCheckPlugins();
+    }
+
+    private bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
+      // newer: build version is higher, or if build version is the same revision is higher
+      if (plugin1.Version.Build < plugin2.Version.Build) return false;
+      else if (plugin1.Version.Build > plugin2.Version.Build) return true;
+      else return plugin1.Version.Revision > plugin2.Version.Revision;
+    }
+    #endregion
+
+    private void UpdateControl() {
+      ClearPluginList();
+      if (pluginManager != null) {
+        localPluginsListView.SuppressItemCheckedEvents = true;
+        foreach (var plugin in pluginManager.Plugins) {
+          var item = CreateListViewItem(plugin);
+          if (plugin.PluginState == PluginState.Enabled) {
+            item.Group = enabledPluginsGroup;
+          } else if (plugin.PluginState == PluginState.Disabled) {
+            item.Group = disabledPluginsGroup;
+          }
+          localPluginsListView.Items.Add(item);
+        }
+        localPluginsListView.SuppressItemCheckedEvents = false;
+      }
+      removeButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+      updateSelectedButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+      Util.ResizeColumns(localPluginsListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private void ClearPluginList() {
+      List<ListViewItem> itemsToRemove = new List<ListViewItem>(localPluginsListView.Items.OfType<ListViewItem>());
+      itemsToRemove.ForEach(item => localPluginsListView.Items.Remove(item));
+    }
+
+    private ListViewItem CreateListViewItem(PluginDescription plugin) {
+      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });
+      item.Tag = plugin;
+      item.ImageIndex = 0;
+      return item;
+    }
+
+    private void pluginsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      // checked items are marked for removal
+      if (e.Item.Checked) {
+        List<ListViewItem> modifiedItems = new List<ListViewItem>();
+        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
+          modifiedItems.Add(item);
+          int oldItemsCount = 0;
+          while (oldItemsCount < modifiedItems.Count) {
+            oldItemsCount = modifiedItems.Count;
+            var oldModifiedItems = new List<ListViewItem>(modifiedItems);
+            foreach (var modifiedItem in oldModifiedItems) {
+              var plugin = (IPluginDescription)modifiedItem.Tag;
+              // also check all dependent plugins
+              foreach (ListViewItem dependentItem in localPluginsListView.Items) {
+                var dependent = (IPluginDescription)dependentItem.Tag;
+                if (!modifiedItems.Contains(dependentItem) &&
+                  !dependentItem.Checked && (from dep in dependent.Dependencies
+                                             where dep.Name == plugin.Name
+                                             where dep.Version == plugin.Version
+                                             select dep).Any()) {
+                  modifiedItems.Add(dependentItem);
+                }
+              }
+            }
+          }
+        }
+        localPluginsListView.CheckItems(modifiedItems);
+      } else {
+        List<ListViewItem> modifiedItems = new List<ListViewItem>();
+        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          modifiedItems.Add(item);
+        }
+        localPluginsListView.UncheckItems(modifiedItems);
+      }
+      OnItemsCheckedChanged(EventArgs.Empty);
+    }
+
+    private void localPluginsListView_ItemActivate(object sender, EventArgs e) {
+      if (localPluginsListView.SelectedItems.Count > 0) {
+        var plugin = (PluginDescription)localPluginsListView.SelectedItems[0].Tag;
+        PluginView pluginView = new PluginView(plugin);
+        pluginView.Show();
+      }
+    }
+
+    private void OnItemsCheckedChanged(EventArgs eventArgs) {
+      removeButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+      updateSelectedButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+    }
+
+    private void updateSelectedButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.RemoveMessage(NoUpdatesAvailableMessage);
+      StatusView.ShowMessage(CheckingPluginsMessage);
+      var checkedPlugins = localPluginsListView.CheckedItems.OfType<ListViewItem>()
+        .Select(item => item.Tag)
+        .OfType<IPluginDescription>()
+        .ToList();
+      updatePluginsBackgroundWorker.RunWorkerAsync(checkedPlugins);
+    }
+
+    private void removeButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      var checkedPlugins = localPluginsListView.CheckedItems.OfType<ListViewItem>()
+        .Select(item => item.Tag)
+        .OfType<IPluginDescription>()
+        .ToList();
+      removePluginsBackgroundWorker.RunWorkerAsync(checkedPlugins);
+    }
+
+    private void refreshButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      // refresh = update empty list of plugins (plugins are reloaded)
+      updatePluginsBackgroundWorker.RunWorkerAsync(new IPluginDescription[0]);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstalledPluginsView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstalledPluginsView.resx	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstalledPluginsView.resx	(revision 3627)
@@ -0,0 +1,126 @@
+<?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>
+  <metadata name="pluginImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.Designer.cs	(revision 3626)
+++ 	(revision )
@@ -1,200 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  partial class LicenseConfirmationBox {
-    /// <summary>
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary>
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Windows Form Designer generated code
-
-    /// <summary>
-    /// Required method for Designer support - do not modify
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.components = new System.ComponentModel.Container();
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LicenseConfirmationBox));
-      this.richTextBox = new System.Windows.Forms.RichTextBox();
-      this.acceptButton = new System.Windows.Forms.Button();
-      this.rejectButton = new System.Windows.Forms.Button();
-      this.licenseLabel = new System.Windows.Forms.Label();
-      this.label1 = new System.Windows.Forms.Label();
-      this.radioButtonGroupBox = new System.Windows.Forms.GroupBox();
-      this.rejectRadioButton = new System.Windows.Forms.RadioButton();
-      this.acceptRadioButton = new System.Windows.Forms.RadioButton();
-      this.panel1 = new System.Windows.Forms.Panel();
-      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.radioButtonGroupBox.SuspendLayout();
-      this.panel1.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // richTextBox
-      // 
-      this.richTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.richTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
-      this.richTextBox.Location = new System.Drawing.Point(12, 48);
-      this.richTextBox.Name = "richTextBox";
-      this.richTextBox.ReadOnly = true;
-      this.richTextBox.Size = new System.Drawing.Size(494, 287);
-      this.richTextBox.TabIndex = 0;
-      this.richTextBox.Text = "";
-      // 
-      // acceptButton
-      // 
-      this.acceptButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.acceptButton.Enabled = false;
-      this.acceptButton.Location = new System.Drawing.Point(347, 53);
-      this.acceptButton.Name = "acceptButton";
-      this.acceptButton.Size = new System.Drawing.Size(75, 23);
-      this.acceptButton.TabIndex = 1;
-      this.acceptButton.Text = "Next >";
-      this.toolTip.SetToolTip(this.acceptButton, "Accept license agreement and continue installation");
-      this.acceptButton.UseVisualStyleBackColor = true;
-      this.acceptButton.Click += new System.EventHandler(this.acceptButton_Click);
-      // 
-      // rejectButton
-      // 
-      this.rejectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.rejectButton.Location = new System.Drawing.Point(428, 53);
-      this.rejectButton.Name = "rejectButton";
-      this.rejectButton.Size = new System.Drawing.Size(79, 23);
-      this.rejectButton.TabIndex = 2;
-      this.rejectButton.Text = "Cancel";
-      this.toolTip.SetToolTip(this.rejectButton, "Cancel installation");
-      this.rejectButton.UseVisualStyleBackColor = true;
-      this.rejectButton.Click += new System.EventHandler(this.rejectButton_Click);
-      // 
-      // licenseLabel
-      // 
-      this.licenseLabel.AutoSize = true;
-      this.licenseLabel.Location = new System.Drawing.Point(12, 32);
-      this.licenseLabel.Name = "licenseLabel";
-      this.licenseLabel.Size = new System.Drawing.Size(241, 13);
-      this.licenseLabel.TabIndex = 3;
-      this.licenseLabel.Text = "Please read following license agreement carefully.";
-      // 
-      // label1
-      // 
-      this.label1.AutoSize = true;
-      this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      this.label1.Location = new System.Drawing.Point(12, 9);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(115, 13);
-      this.label1.TabIndex = 4;
-      this.label1.Text = "License Agreement";
-      // 
-      // radioButtonGroupBox
-      // 
-      this.radioButtonGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.radioButtonGroupBox.Controls.Add(this.rejectRadioButton);
-      this.radioButtonGroupBox.Controls.Add(this.acceptRadioButton);
-      this.radioButtonGroupBox.Location = new System.Drawing.Point(13, 5);
-      this.radioButtonGroupBox.Name = "radioButtonGroupBox";
-      this.radioButtonGroupBox.Size = new System.Drawing.Size(281, 71);
-      this.radioButtonGroupBox.TabIndex = 5;
-      this.radioButtonGroupBox.TabStop = false;
-      // 
-      // rejectRadioButton
-      // 
-      this.rejectRadioButton.AutoSize = true;
-      this.rejectRadioButton.Location = new System.Drawing.Point(6, 42);
-      this.rejectRadioButton.Name = "rejectRadioButton";
-      this.rejectRadioButton.Size = new System.Drawing.Size(264, 17);
-      this.rejectRadioButton.TabIndex = 1;
-      this.rejectRadioButton.TabStop = true;
-      this.rejectRadioButton.Text = "I do not accept the terms in the license agreement.";
-      this.rejectRadioButton.UseVisualStyleBackColor = true;
-      this.rejectRadioButton.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
-      // 
-      // acceptRadioButton
-      // 
-      this.acceptRadioButton.AutoSize = true;
-      this.acceptRadioButton.Location = new System.Drawing.Point(6, 19);
-      this.acceptRadioButton.Name = "acceptRadioButton";
-      this.acceptRadioButton.Size = new System.Drawing.Size(231, 17);
-      this.acceptRadioButton.TabIndex = 0;
-      this.acceptRadioButton.TabStop = true;
-      this.acceptRadioButton.Text = "I accept the terms in the license agreement.";
-      this.acceptRadioButton.UseVisualStyleBackColor = true;
-      this.acceptRadioButton.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
-      // 
-      // panel1
-      // 
-      this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.panel1.BackColor = System.Drawing.SystemColors.Control;
-      this.panel1.Controls.Add(this.acceptButton);
-      this.panel1.Controls.Add(this.radioButtonGroupBox);
-      this.panel1.Controls.Add(this.rejectButton);
-      this.panel1.Location = new System.Drawing.Point(-1, 341);
-      this.panel1.Name = "panel1";
-      this.panel1.Size = new System.Drawing.Size(520, 88);
-      this.panel1.TabIndex = 6;
-      // 
-      // LicenseConfirmationBox
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.BackColor = System.Drawing.SystemColors.HighlightText;
-      this.ClientSize = new System.Drawing.Size(518, 429);
-      this.Controls.Add(this.panel1);
-      this.Controls.Add(this.label1);
-      this.Controls.Add(this.licenseLabel);
-      this.Controls.Add(this.richTextBox);
-      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-      this.Name = "LicenseConfirmationBox";
-      this.radioButtonGroupBox.ResumeLayout(false);
-      this.radioButtonGroupBox.PerformLayout();
-      this.panel1.ResumeLayout(false);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.RichTextBox richTextBox;
-    private System.Windows.Forms.Button acceptButton;
-    private System.Windows.Forms.Button rejectButton;
-    private System.Windows.Forms.Label licenseLabel;
-    private System.Windows.Forms.Label label1;
-    private System.Windows.Forms.GroupBox radioButtonGroupBox;
-    private System.Windows.Forms.RadioButton rejectRadioButton;
-    private System.Windows.Forms.RadioButton acceptRadioButton;
-    private System.Windows.Forms.Panel panel1;
-    private System.Windows.Forms.ToolTip toolTip;
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.cs	(revision 3626)
+++ 	(revision )
@@ -1,57 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class LicenseConfirmationBox : Form {
-    public LicenseConfirmationBox() {
-      InitializeComponent();
-    }
-
-    public LicenseConfirmationBox(IPluginDescription plugin) {
-      InitializeComponent();
-      richTextBox.Text = plugin.LicenseText;
-      this.Text = plugin.ToString();
-      this.DialogResult = DialogResult.Cancel;
-    }
-
-    private void acceptButton_Click(object sender, EventArgs e) {
-      DialogResult = DialogResult.OK;
-      this.Close();
-    }
-
-    private void rejectButton_Click(object sender, EventArgs e) {
-      DialogResult = DialogResult.Cancel;
-      this.Close();
-    }
-
-    private void radioButton1_CheckedChanged(object sender, EventArgs e) {
-      acceptButton.Enabled = acceptRadioButton.Checked;
-    }
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.resx	(revision 3626)
+++ 	(revision )
@@ -1,437 +1,0 @@
-<?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>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
-        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
-        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
-        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
-        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
-        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
-        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
-        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
-        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
-        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
-        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
-        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
-        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
-        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
-        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
-        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
-        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
-        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
-        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
-        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
-        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
-        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
-        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
-        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
-        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
-        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
-        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
-        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
-        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
-        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
-        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
-        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
-        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
-        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
-        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
-        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
-        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
-        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
-        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
-        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
-        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
-        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
-        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
-        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
-        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
-        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
-        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
-        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
-        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
-        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
-        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
-        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
-        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
-        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
-        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
-        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
-        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
-        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
-        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
-        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
-        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
-        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
-        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
-        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
-        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
-        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
-        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
-        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
-        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
-        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
-        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
-        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
-        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
-        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
-        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
-        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
-        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
-        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
-        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
-        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
-        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
-        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
-        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
-        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
-        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
-        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
-        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
-        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
-        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
-        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
-        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
-        ///////////////////////wD//////////////////////////////wD///////////////////////
-        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
-        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
-        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
-        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
-        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
-        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
-        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
-        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
-        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
-        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
-        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
-        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
-        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
-        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
-        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
-        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
-        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
-        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
-        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
-        /////////////////wAA////////////////////////////////////////////////////////////
-        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
-        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
-        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
-        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
-        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
-        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
-        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
-        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
-        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
-        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
-        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
-        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
-        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
-        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
-        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
-        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
-        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
-        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
-        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
-        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
-        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
-        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
-        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
-        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
-        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
-        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
-        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
-        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
-        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
-        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
-        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
-        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
-        /////////////////////////////////////////////////wAA////////////////////////////
-        /////////////////////////////////wAA////////////////////////////////////////////
-        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
-        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
-        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
-        //////////////////AP////////////////////////////////////////8A//////////////////
-        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
-        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
-        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
-        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
-        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
-        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
-        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
-        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
-        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
-        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
-        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
-        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
-        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
-        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
-        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
-        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
-        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
-        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
-        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
-        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
-        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
-        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
-        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
-        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
-        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
-        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
-        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
-        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
-        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
-        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
-        ////////////8A/////////////////////////////////////////wD///////////////////////
-        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
-        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
-        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
-        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
-        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
-        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
-        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
-        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
-        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
-        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
-        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
-        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
-        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
-        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
-        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
-        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
-        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
-        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
-        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
-        //////////////////////////////////////////////////////8KCv//////////////////////
-        ////////////////////////////////////////////////////////////Cgr/////////////////
-        /////////////////////////////////////////////////////////////////woK////////////
-        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
-        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
-        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
-        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
-        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
-        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
-        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
-        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
-        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
-        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
-        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
-        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
-        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
-        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
-        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
-        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
-        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
-        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
-        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
-        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
-        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
-        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
-        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
-        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
-        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
-        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
-        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
-        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
-        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
-        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
-        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
-        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
-        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
-        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
-        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
-        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
-        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
-        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
-        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
-        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
-        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
-        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
-        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
-        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
-        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
-        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
-        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
-        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
-        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
-        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
-        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
-        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
-        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
-        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
-        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
-        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
-        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
-        ////////////////////////////////////////////Cgr/////////////////////////////////
-        /////////////////////////////////////////////////woK////////////////////////////
-        //////////////////////////////////////////////////////8KCv//////////////////////
-        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-</value>
-  </data>
-</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationDialog.Designer.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationDialog.Designer.cs	(revision 3627)
@@ -0,0 +1,206 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class LicenseConfirmationDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LicenseConfirmationDialog));
+      this.richTextBox = new System.Windows.Forms.RichTextBox();
+      this.acceptButton = new System.Windows.Forms.Button();
+      this.rejectButton = new System.Windows.Forms.Button();
+      this.licenseLabel = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.radioButtonGroupBox = new System.Windows.Forms.GroupBox();
+      this.rejectRadioButton = new System.Windows.Forms.RadioButton();
+      this.acceptRadioButton = new System.Windows.Forms.RadioButton();
+      this.panel1 = new System.Windows.Forms.Panel();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.radioButtonGroupBox.SuspendLayout();
+      this.panel1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // richTextBox
+      // 
+      this.richTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.richTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.richTextBox.Location = new System.Drawing.Point(12, 48);
+      this.richTextBox.Name = "richTextBox";
+      this.richTextBox.ReadOnly = true;
+      this.richTextBox.Size = new System.Drawing.Size(494, 287);
+      this.richTextBox.TabIndex = 0;
+      this.richTextBox.Text = "";
+      // 
+      // acceptButton
+      // 
+      this.acceptButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.acceptButton.Enabled = false;
+      this.acceptButton.Location = new System.Drawing.Point(347, 53);
+      this.acceptButton.Name = "acceptButton";
+      this.acceptButton.Size = new System.Drawing.Size(75, 23);
+      this.acceptButton.TabIndex = 1;
+      this.acceptButton.Text = "Next >";
+      this.toolTip.SetToolTip(this.acceptButton, "Accept license agreement and continue installation");
+      this.acceptButton.UseVisualStyleBackColor = true;
+      this.acceptButton.Click += new System.EventHandler(this.acceptButton_Click);
+      // 
+      // rejectButton
+      // 
+      this.rejectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.rejectButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.rejectButton.Location = new System.Drawing.Point(428, 53);
+      this.rejectButton.Name = "rejectButton";
+      this.rejectButton.Size = new System.Drawing.Size(79, 23);
+      this.rejectButton.TabIndex = 2;
+      this.rejectButton.Text = "Cancel";
+      this.toolTip.SetToolTip(this.rejectButton, "Cancel installation");
+      this.rejectButton.UseVisualStyleBackColor = true;
+      this.rejectButton.Click += new System.EventHandler(this.rejectButton_Click);
+      // 
+      // licenseLabel
+      // 
+      this.licenseLabel.AutoSize = true;
+      this.licenseLabel.Location = new System.Drawing.Point(12, 32);
+      this.licenseLabel.Name = "licenseLabel";
+      this.licenseLabel.Size = new System.Drawing.Size(241, 13);
+      this.licenseLabel.TabIndex = 3;
+      this.licenseLabel.Text = "Please read following license agreement carefully.";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.label1.Location = new System.Drawing.Point(12, 9);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(115, 13);
+      this.label1.TabIndex = 4;
+      this.label1.Text = "License Agreement";
+      // 
+      // radioButtonGroupBox
+      // 
+      this.radioButtonGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.radioButtonGroupBox.Controls.Add(this.rejectRadioButton);
+      this.radioButtonGroupBox.Controls.Add(this.acceptRadioButton);
+      this.radioButtonGroupBox.Location = new System.Drawing.Point(13, 5);
+      this.radioButtonGroupBox.Name = "radioButtonGroupBox";
+      this.radioButtonGroupBox.Size = new System.Drawing.Size(281, 71);
+      this.radioButtonGroupBox.TabIndex = 5;
+      this.radioButtonGroupBox.TabStop = false;
+      // 
+      // rejectRadioButton
+      // 
+      this.rejectRadioButton.AutoSize = true;
+      this.rejectRadioButton.Location = new System.Drawing.Point(6, 42);
+      this.rejectRadioButton.Name = "rejectRadioButton";
+      this.rejectRadioButton.Size = new System.Drawing.Size(264, 17);
+      this.rejectRadioButton.TabIndex = 1;
+      this.rejectRadioButton.TabStop = true;
+      this.rejectRadioButton.Text = "I do not accept the terms in the license agreement.";
+      this.rejectRadioButton.UseVisualStyleBackColor = true;
+      this.rejectRadioButton.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
+      // 
+      // acceptRadioButton
+      // 
+      this.acceptRadioButton.AutoSize = true;
+      this.acceptRadioButton.Location = new System.Drawing.Point(6, 19);
+      this.acceptRadioButton.Name = "acceptRadioButton";
+      this.acceptRadioButton.Size = new System.Drawing.Size(231, 17);
+      this.acceptRadioButton.TabIndex = 0;
+      this.acceptRadioButton.TabStop = true;
+      this.acceptRadioButton.Text = "I accept the terms in the license agreement.";
+      this.acceptRadioButton.UseVisualStyleBackColor = true;
+      this.acceptRadioButton.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
+      // 
+      // panel1
+      // 
+      this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel1.BackColor = System.Drawing.SystemColors.Control;
+      this.panel1.Controls.Add(this.acceptButton);
+      this.panel1.Controls.Add(this.radioButtonGroupBox);
+      this.panel1.Controls.Add(this.rejectButton);
+      this.panel1.Location = new System.Drawing.Point(-1, 341);
+      this.panel1.Name = "panel1";
+      this.panel1.Size = new System.Drawing.Size(520, 88);
+      this.panel1.TabIndex = 6;
+      // 
+      // LicenseConfirmationDialog
+      // 
+      this.AcceptButton = this.acceptButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.CancelButton = this.rejectButton;
+      this.ClientSize = new System.Drawing.Size(518, 429);
+      this.Controls.Add(this.panel1);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.licenseLabel);
+      this.Controls.Add(this.richTextBox);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "LicenseConfirmationDialog";
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.radioButtonGroupBox.ResumeLayout(false);
+      this.radioButtonGroupBox.PerformLayout();
+      this.panel1.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.RichTextBox richTextBox;
+    private System.Windows.Forms.Button acceptButton;
+    private System.Windows.Forms.Button rejectButton;
+    private System.Windows.Forms.Label licenseLabel;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.GroupBox radioButtonGroupBox;
+    private System.Windows.Forms.RadioButton rejectRadioButton;
+    private System.Windows.Forms.RadioButton acceptRadioButton;
+    private System.Windows.Forms.Panel panel1;
+    private System.Windows.Forms.ToolTip toolTip;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationDialog.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationDialog.cs	(revision 3627)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class LicenseConfirmationDialog : Form {
+    public LicenseConfirmationDialog() {
+      InitializeComponent();
+    }
+
+    public LicenseConfirmationDialog(IPluginDescription plugin) {
+      InitializeComponent();
+      richTextBox.Text = plugin.LicenseText;
+      this.Text = plugin.ToString();
+      this.DialogResult = DialogResult.Cancel;
+    }
+
+    private void acceptButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.OK;
+      this.Close();
+    }
+
+    private void rejectButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.Cancel;
+      this.Close();
+    }
+
+    private void radioButton1_CheckedChanged(object sender, EventArgs e) {
+      acceptButton.Enabled = acceptRadioButton.Checked;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationDialog.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationDialog.resx	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationDialog.resx	(revision 3627)
@@ -0,0 +1,437 @@
+<?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>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
+        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
+        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
+        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
+        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
+        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
+        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
+        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
+        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
+        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
+        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
+        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
+        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
+        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
+        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
+        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
+        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
+        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
+        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
+        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
+        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
+        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
+        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
+        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
+        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
+        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
+        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
+        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
+        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
+        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
+        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
+        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
+        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
+        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
+        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
+        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
+        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
+        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
+        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
+        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
+        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
+        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
+        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
+        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
+        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
+        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
+        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
+        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
+        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
+        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
+        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
+        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
+        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
+        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
+        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
+        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
+        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
+        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
+        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
+        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
+        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
+        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
+        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
+        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
+        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
+        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
+        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
+        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
+        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
+        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
+        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
+        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
+        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
+        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
+        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
+        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
+        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
+        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
+        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
+        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
+        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
+        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
+        ///////////////////////wD//////////////////////////////wD///////////////////////
+        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
+        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
+        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
+        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
+        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
+        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
+        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
+        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
+        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
+        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
+        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
+        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
+        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
+        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
+        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
+        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
+        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
+        /////////////////wAA////////////////////////////////////////////////////////////
+        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
+        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
+        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
+        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
+        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
+        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
+        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
+        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
+        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
+        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
+        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
+        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
+        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
+        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
+        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
+        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
+        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
+        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
+        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
+        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
+        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
+        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
+        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
+        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
+        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
+        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
+        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
+        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
+        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
+        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
+        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
+        /////////////////////////////////////////////////wAA////////////////////////////
+        /////////////////////////////////wAA////////////////////////////////////////////
+        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
+        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
+        //////////////////AP////////////////////////////////////////8A//////////////////
+        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
+        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
+        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
+        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
+        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
+        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
+        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
+        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
+        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
+        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
+        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
+        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
+        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
+        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
+        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
+        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
+        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
+        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
+        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
+        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
+        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
+        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
+        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
+        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
+        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
+        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
+        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
+        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
+        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
+        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
+        ////////////8A/////////////////////////////////////////wD///////////////////////
+        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
+        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
+        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
+        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
+        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
+        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
+        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
+        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
+        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
+        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
+        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
+        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
+        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
+        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
+        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
+        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
+        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
+        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
+        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////Cgr/////////////////
+        /////////////////////////////////////////////////////////////////woK////////////
+        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
+        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
+        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
+        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
+        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
+        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
+        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
+        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
+        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
+        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
+        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
+        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
+        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
+        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
+        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
+        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
+        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
+        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
+        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
+        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
+        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
+        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
+        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
+        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
+        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
+        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
+        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
+        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
+        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
+        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
+        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
+        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
+        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
+        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
+        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
+        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
+        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
+        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
+        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
+        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
+        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
+        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
+        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
+        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
+        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
+        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
+        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
+        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
+        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
+        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
+        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
+        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
+        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
+        ////////////////////////////////////////////Cgr/////////////////////////////////
+        /////////////////////////////////////////////////woK////////////////////////////
+        //////////////////////////////////////////////////////8KCv//////////////////////
+        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
+        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+</value>
+  </data>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.Designer.cs	(revision 3626)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.Designer.cs	(revision 3627)
@@ -67,4 +67,5 @@
       this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
       this.Name = "LicenseView";
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
       this.Text = "License Agreement";
       this.ResumeLayout(false);
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.Designer.cs	(revision 3626)
+++ 	(revision )
@@ -1,182 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  partial class LocalPluginsView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.components = new System.ComponentModel.Container();
-      System.Windows.Forms.ListViewGroup listViewGroup3 = new System.Windows.Forms.ListViewGroup("Active Plugins", System.Windows.Forms.HorizontalAlignment.Left);
-      System.Windows.Forms.ListViewGroup listViewGroup4 = new System.Windows.Forms.ListViewGroup("Disabled Plugins", System.Windows.Forms.HorizontalAlignment.Left);
-      this.localPluginsListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
-      this.nameHeader = new System.Windows.Forms.ColumnHeader();
-      this.versionHeader = new System.Windows.Forms.ColumnHeader();
-      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
-      this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
-      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.refreshButton = new System.Windows.Forms.Button();
-      this.removeButton = new System.Windows.Forms.Button();
-      this.updateSelectedButton = new System.Windows.Forms.Button();
-      this.SuspendLayout();
-      // 
-      // localPluginsListView
-      // 
-      this.localPluginsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.localPluginsListView.CheckBoxes = true;
-      this.localPluginsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.nameHeader,
-            this.versionHeader,
-            this.descriptionHeader});
-      listViewGroup3.Header = "Active Plugins";
-      listViewGroup3.Name = "activePluginsGroup";
-      listViewGroup4.Header = "Disabled Plugins";
-      listViewGroup4.Name = "disabledPluginsGroup";
-      this.localPluginsListView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
-            listViewGroup3,
-            listViewGroup4});
-      this.localPluginsListView.Location = new System.Drawing.Point(0, 0);
-      this.localPluginsListView.Name = "localPluginsListView";
-      this.localPluginsListView.Size = new System.Drawing.Size(539, 477);
-      this.localPluginsListView.SmallImageList = this.pluginImageList;
-      this.localPluginsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
-      this.localPluginsListView.SuppressItemCheckedEvents = false;
-      this.localPluginsListView.TabIndex = 13;
-      this.localPluginsListView.UseCompatibleStateImageBehavior = false;
-      this.localPluginsListView.View = System.Windows.Forms.View.Details;
-      this.localPluginsListView.ItemActivate += new System.EventHandler(this.localPluginsListView_ItemActivate);
-      this.localPluginsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.pluginsListView_ItemChecked);
-      // 
-      // nameHeader
-      // 
-      this.nameHeader.Text = "Name";
-      this.nameHeader.Width = 199;
-      // 
-      // versionHeader
-      // 
-      this.versionHeader.Text = "Version";
-      this.versionHeader.Width = 84;
-      // 
-      // descriptionHeader
-      // 
-      this.descriptionHeader.Text = "Description";
-      this.descriptionHeader.Width = 245;
-      // 
-      // pluginImageList
-      // 
-      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
-      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
-      // 
-      // refreshButton
-      // 
-      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.RepeatHS1;
-      this.refreshButton.Location = new System.Drawing.Point(0, 483);
-      this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(96, 25);
-      this.refreshButton.TabIndex = 14;
-      this.refreshButton.Text = "Refresh List";
-      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.refreshButton, "Refresh List of Installed Plugins");
-      this.refreshButton.UseVisualStyleBackColor = true;
-      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
-      // 
-      // removeButton
-      // 
-      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.removeButton.Enabled = false;
-      this.removeButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Actions_Remove;
-      this.removeButton.Location = new System.Drawing.Point(222, 483);
-      this.removeButton.Name = "removeButton";
-      this.removeButton.Size = new System.Drawing.Size(110, 25);
-      this.removeButton.TabIndex = 12;
-      this.removeButton.Text = "Delete Selected";
-      this.removeButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.removeButton, "Delete all selected plugins from disk");
-      this.removeButton.UseVisualStyleBackColor = true;
-      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
-      // 
-      // updateSelectedButton
-      // 
-      this.updateSelectedButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.updateSelectedButton.Enabled = false;
-      this.updateSelectedButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
-      this.updateSelectedButton.Location = new System.Drawing.Point(102, 483);
-      this.updateSelectedButton.Name = "updateSelectedButton";
-      this.updateSelectedButton.Size = new System.Drawing.Size(114, 25);
-      this.updateSelectedButton.TabIndex = 6;
-      this.updateSelectedButton.Text = "Update Selected";
-      this.updateSelectedButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.updateSelectedButton, "Update all selected plugins");
-      this.updateSelectedButton.UseVisualStyleBackColor = true;
-      this.updateSelectedButton.Click += new System.EventHandler(this.updateSelectedButton_Click);
-      // 
-      // LocalPluginsView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.refreshButton);
-      this.Controls.Add(this.localPluginsListView);
-      this.Controls.Add(this.removeButton);
-      this.Controls.Add(this.updateSelectedButton);
-      this.Name = "LocalPluginsView";
-      this.Size = new System.Drawing.Size(539, 508);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Button updateSelectedButton;
-    private System.Windows.Forms.Button removeButton;
-    private MultiSelectListView localPluginsListView;
-    private System.Windows.Forms.ColumnHeader nameHeader;
-    private System.Windows.Forms.ColumnHeader versionHeader;
-    private System.Windows.Forms.ColumnHeader descriptionHeader;
-    private System.Windows.Forms.ToolTip toolTip;
-    private System.Windows.Forms.ImageList pluginImageList;
-    private System.Windows.Forms.Button refreshButton;
-    // private LocalPluginManagerView localPluginManagerView;
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.cs	(revision 3626)
+++ 	(revision )
@@ -1,240 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-using System.ServiceModel;
-using ICSharpCode.SharpZipLib.Zip;
-using System.IO;
-using HeuristicLab.PluginInfrastructure.Manager;
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class LocalPluginsView : InstallationManagerControl {
-    private const string CheckingPluginsMessage = "Checking for updated plugins...";
-    private const string NoUpdatesAvailableMessage = "No updates available.";
-    private BackgroundWorker removePluginsBackgroundWorker;
-    private BackgroundWorker updatePluginsBackgroundWorker;
-
-    private ListViewGroup enabledPluginsGroup;
-    private ListViewGroup disabledPluginsGroup;
-
-    private PluginManager pluginManager;
-    public PluginManager PluginManager {
-      get { return pluginManager; }
-      set {
-        pluginManager = value;
-        UpdateControl();
-      }
-    }
-
-    private InstallationManager installationManager;
-    public InstallationManager InstallationManager {
-      get { return installationManager; }
-      set { installationManager = value; }
-    }
-
-    public LocalPluginsView()
-      : base() {
-      InitializeComponent();
-      enabledPluginsGroup = localPluginsListView.Groups["activePluginsGroup"];
-      disabledPluginsGroup = localPluginsListView.Groups["disabledPluginsGroup"];
-      pluginImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.plugin_16);
-      removePluginsBackgroundWorker = new BackgroundWorker();
-      removePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(removePluginsBackgroundWorker_DoWork);
-      removePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(removePluginsBackgroundWorker_RunWorkerCompleted);
-      updatePluginsBackgroundWorker = new BackgroundWorker();
-      updatePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updatePluginsBackgroundWorker_DoWork);
-      updatePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updatePluginsBackgroundWorker_RunWorkerCompleted);
-
-      UpdateControl();
-    }
-
-
-
-    #region event handlers for plugin removal background worker
-    void removePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        StatusView.ShowError("File Deletion Error", "There was problem while deleting files." + Environment.NewLine + e.Error.Message);
-      }
-      UpdateControl();
-      StatusView.HideProgressIndicator();
-      StatusView.UnlockUI();
-    }
-
-    void removePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      IEnumerable<IPluginDescription> pluginsToRemove = (IEnumerable<IPluginDescription>)e.Argument;
-      if (pluginsToRemove.Count() > 0) {
-        installationManager.Remove(pluginsToRemove);
-        pluginManager.DiscoverAndCheckPlugins();
-      }
-    }
-    #endregion
-
-    #region event handlers for update plugins backgroundworker
-    void updatePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        StatusView.ShowError("Connection Error",
-          "There was an error while connecting to the server." + Environment.NewLine +
-           "Please check your connection settings and user credentials.");
-      }
-      StatusView.RemoveMessage(CheckingPluginsMessage);
-      StatusView.HideProgressIndicator();
-      StatusView.UnlockUI();
-    }
-
-    void updatePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      IEnumerable<IPluginDescription> selectedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
-      var remotePlugins = installationManager.GetRemotePluginList();
-      // if there is a local plugin with same name and same major and minor version then it's an update
-      var pluginsToUpdate = from remotePlugin in remotePlugins
-                            let matchingLocalPlugins = from installedPlugin in selectedPlugins
-                                                       where installedPlugin.Name == remotePlugin.Name
-                                                       where installedPlugin.Version.Major == remotePlugin.Version.Major
-                                                       where installedPlugin.Version.Minor == remotePlugin.Version.Minor
-                                                       where IsNewerThan(remotePlugin, installedPlugin)
-                                                       select installedPlugin
-                            where matchingLocalPlugins.Count() > 0
-                            select remotePlugin;
-      if (pluginsToUpdate.Count() > 0) {
-        installationManager.Update(pluginsToUpdate);
-      }
-      pluginManager.DiscoverAndCheckPlugins();
-    }
-
-    private bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
-      // newer: build version is higher, or if build version is the same revision is higher
-      if (plugin1.Version.Build < plugin2.Version.Build) return false;
-      else if (plugin1.Version.Build > plugin2.Version.Build) return true;
-      else return plugin1.Version.Revision > plugin2.Version.Revision;
-    }
-    #endregion
-
-    private void UpdateControl() {
-      ClearPluginList();
-      if (pluginManager != null) {
-        localPluginsListView.SuppressItemCheckedEvents = true;
-        foreach (var plugin in pluginManager.Plugins) {
-          var item = CreateListViewItem(plugin);
-          if (plugin.PluginState == PluginState.Enabled) {
-            item.Group = enabledPluginsGroup;
-          } else if (plugin.PluginState == PluginState.Disabled) {
-            item.Group = disabledPluginsGroup;
-          }
-          localPluginsListView.Items.Add(item);
-        }
-        localPluginsListView.SuppressItemCheckedEvents = false;
-      }
-      removeButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
-      updateSelectedButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
-      Util.ResizeColumns(localPluginsListView.Columns.OfType<ColumnHeader>());
-    }
-
-    private void ClearPluginList() {
-      List<ListViewItem> itemsToRemove = new List<ListViewItem>(localPluginsListView.Items.OfType<ListViewItem>());
-      itemsToRemove.ForEach(item => localPluginsListView.Items.Remove(item));
-    }
-
-    private ListViewItem CreateListViewItem(PluginDescription plugin) {
-      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });
-      item.Tag = plugin;
-      item.ImageIndex = 0;
-      return item;
-    }
-
-    private void pluginsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
-      // checked items are marked for removal
-      if (e.Item.Checked) {
-        List<ListViewItem> modifiedItems = new List<ListViewItem>();
-        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          modifiedItems.Add(item);
-          // also uncheck all dependent plugins
-          foreach (ListViewItem dependentItem in localPluginsListView.Items) {
-            var dependent = (IPluginDescription)dependentItem.Tag;
-            if (!dependentItem.Checked && (from dep in dependent.Dependencies
-                                           where dep.Name == plugin.Name
-                                           where dep.Version == plugin.Version
-                                           select dep).Any()) {
-              modifiedItems.Add(dependentItem);
-            }
-          }
-        }
-        localPluginsListView.CheckItems(modifiedItems);
-      } else {
-        List<ListViewItem> modifiedItems = new List<ListViewItem>();
-        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          modifiedItems.Add(item);
-        }
-        localPluginsListView.UncheckItems(modifiedItems);
-      }
-      OnItemsCheckedChanged(EventArgs.Empty);
-    }
-
-    private void localPluginsListView_ItemActivate(object sender, EventArgs e) {
-      if (localPluginsListView.SelectedItems.Count > 0) {
-        var plugin = (PluginDescription)localPluginsListView.SelectedItems[0].Tag;
-        PluginView pluginView = new PluginView(plugin);
-        pluginView.Show();
-      }
-    }
-
-    private void OnItemsCheckedChanged(EventArgs eventArgs) {
-      removeButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
-      updateSelectedButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
-    }
-
-    private void updateSelectedButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      StatusView.RemoveMessage(NoUpdatesAvailableMessage);
-      StatusView.ShowMessage(CheckingPluginsMessage);
-      var checkedPlugins = localPluginsListView.CheckedItems.OfType<ListViewItem>()
-        .Select(item => item.Tag)
-        .OfType<IPluginDescription>()
-        .ToList();
-      updatePluginsBackgroundWorker.RunWorkerAsync(checkedPlugins);
-    }
-
-    private void removeButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      var checkedPlugins = localPluginsListView.CheckedItems.OfType<ListViewItem>()
-        .Select(item => item.Tag)
-        .OfType<IPluginDescription>()
-        .ToList();
-      removePluginsBackgroundWorker.RunWorkerAsync(checkedPlugins);
-    }
-
-    private void refreshButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      // refresh = update empty list of plugins (plugins are reloaded)
-      updatePluginsBackgroundWorker.RunWorkerAsync(new IPluginDescription[0]);
-    }
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.resx	(revision 3626)
+++ 	(revision )
@@ -1,126 +1,0 @@
-<?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>
-  <metadata name="pluginImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>107, 17</value>
-  </metadata>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginComparisonView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginComparisonView.Designer.cs	(revision 3626)
+++ 	(revision )
@@ -1,82 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  partial class PluginComparisonView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PluginComparisonView));
-      this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
-      this.SuspendLayout();
-      // 
-      // tableLayoutPanel
-      // 
-      this.tableLayoutPanel.ColumnCount = 2;
-      this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
-      this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
-      this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.tableLayoutPanel.Location = new System.Drawing.Point(0, 0);
-      this.tableLayoutPanel.Name = "tableLayoutPanel";
-      this.tableLayoutPanel.RowCount = 1;
-      this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
-      this.tableLayoutPanel.Size = new System.Drawing.Size(849, 444);
-      this.tableLayoutPanel.TabIndex = 0;
-      // 
-      // PluginComparisonView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.ClientSize = new System.Drawing.Size(849, 444);
-      this.Controls.Add(this.tableLayoutPanel);
-      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-      this.Name = "PluginComparisonView";
-      this.Text = "Compare Plugin Details";
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
-
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginComparisonView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginComparisonView.cs	(revision 3626)
+++ 	(revision )
@@ -1,58 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-using HeuristicLab.PluginInfrastructure.Manager;
-using System.ServiceModel;
-using ICSharpCode.SharpZipLib.Zip;
-using System.IO;
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class PluginComparisonView : Form {
-
-    public PluginComparisonView(IPluginDescription localPlugin, IPluginDescription serverPlugin) {
-      InitializeComponent();
-      //Caption = "Compare plugins";
-
-      var localPluginView = new PluginView(localPlugin);
-      localPluginView.Dock = DockStyle.Fill;
-      tableLayoutPanel.Controls.Add(localPluginView, 0, 0);
-      if (serverPlugin != null) {
-        var serverPluginView = new PluginView(serverPlugin);
-        serverPluginView.Dock = DockStyle.Fill;
-        tableLayoutPanel.Controls.Add(serverPluginView, 1, 0);
-      } else {
-        Label emptyLabel = new Label();
-        emptyLabel.Text = "No matching server plugin";
-        emptyLabel.TextAlign = ContentAlignment.MiddleCenter;
-        emptyLabel.Dock = DockStyle.Fill;
-        tableLayoutPanel.Controls.Add(emptyLabel, 1, 0);
-      }
-    }
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginComparisonView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginComparisonView.resx	(revision 3626)
+++ 	(revision )
@@ -1,434 +1,0 @@
-<?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="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAABAAgAEBAQAAAAAAAoAQAAhgAAABAQAAAAAAAAaAUAAK4BAAAgIBAAAAAAAOgCAAAWBwAAICAAAAAA
-        AACoCAAA/gkAADAwEAAAAAAAaAYAAKYSAAAwMAAAAAAAAKgOAAAOGQAAQEAQAAAAAABoCgAAticAAEBA
-        AAAAAAAAKBYAAB4yAAAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
-        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
-        AAAAAAAAD/////////APD///gAAA8A8H//9wj//wDwj///gP//APgH//9wf/8A/wj///AP/wD/gIiIiA
-        f/AP/wAAAACP8A//gHd3eAfwD/9wj///CPAP//gP//+A8A//9w////DwD///D///+PAP////////8AAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAACAAACA
-        AAAAgIAAgAAAAIAAgACAgAAAwMDAAMDcwADwyqYABAQEAAgICAAMDAwAERERABYWFgAcHBwAIiIiACkp
-        KQBVVVUATU1NAEJCQgA5OTkAgHz/AFBQ/wCTANYA/+zMAMbW7wDW5+cAkKmtAAAAMwAAAGYAAACZAAAA
-        zAAAMwAAADMzAAAzZgAAM5kAADPMAAAz/wAAZgAAAGYzAABmZgAAZpkAAGbMAABm/wAAmQAAAJkzAACZ
-        ZgAAmZkAAJnMAACZ/wAAzAAAAMwzAADMZgAAzJkAAMzMAADM/wAA/2YAAP+ZAAD/zAAzAAAAMwAzADMA
-        ZgAzAJkAMwDMADMA/wAzMwAAMzMzADMzZgAzM5kAMzPMADMz/wAzZgAAM2YzADNmZgAzZpkAM2bMADNm
-        /wAzmQAAM5kzADOZZgAzmZkAM5nMADOZ/wAzzAAAM8wzADPMZgAzzJkAM8zMADPM/wAz/zMAM/9mADP/
-        mQAz/8wAM///AGYAAABmADMAZgBmAGYAmQBmAMwAZgD/AGYzAABmMzMAZjNmAGYzmQBmM8wAZjP/AGZm
-        AABmZjMAZmZmAGZmmQBmZswAZpkAAGaZMwBmmWYAZpmZAGaZzABmmf8AZswAAGbMMwBmzJkAZszMAGbM
-        /wBm/wAAZv8zAGb/mQBm/8wAzAD/AP8AzACZmQAAmTOZAJkAmQCZAMwAmQAAAJkzMwCZAGYAmTPMAJkA
-        /wCZZgAAmWYzAJkzZgCZZpkAmWbMAJkz/wCZmTMAmZlmAJmZmQCZmcwAmZn/AJnMAACZzDMAZsxmAJnM
-        mQCZzMwAmcz/AJn/AACZ/zMAmcxmAJn/mQCZ/8wAmf//AMwAAACZADMAzABmAMwAmQDMAMwAmTMAAMwz
-        MwDMM2YAzDOZAMwzzADMM/8AzGYAAMxmMwCZZmYAzGaZAMxmzACZZv8AzJkAAMyZMwDMmWYAzJmZAMyZ
-        zADMmf8AzMwAAMzMMwDMzGYAzMyZAMzMzADMzP8AzP8AAMz/MwCZ/2YAzP+ZAMz/zADM//8AzAAzAP8A
-        ZgD/AJkAzDMAAP8zMwD/M2YA/zOZAP8zzAD/M/8A/2YAAP9mMwDMZmYA/2aZAP9mzADMZv8A/5kAAP+Z
-        MwD/mWYA/5mZAP+ZzAD/mf8A/8wAAP/MMwD/zGYA/8yZAP/MzAD/zP8A//8zAMz/ZgD//5kA///MAGZm
-        /wBm/2YAZv//AP9mZgD/Zv8A//9mACEApQBfX18Ad3d3AIaGhgCWlpYAy8vLALKysgDX19cA3d3dAOPj
-        4wDq6uoA8fHxAPj4+ADw+/8ApKCgAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8ACgoKCgoK
-        CgoKCgoKCgoKCgr//////////////////woK/xT//////20KFBQUFP8KCv8K8f/////xCpL/////Cgr/
-        EG3//////20U/////woK/5IK8f////8HCgf///8KCv//Duz//////xQU////Cgr//+wO7Ozs7OwSCvH/
-        /woK///zDgoKCgoKCgpt//8KCv///+sOBwcHBwfsCvH/Cgr////xCpL//////w7s/woK/////21D////
-        ///sDv8KCv////+8Cv//////8w7/Cgr//////xT///////9t/woK//////////////////8KCgoKCgoK
-        CgoKCgoKCgoKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAACAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAA
-        gAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
-        AAAAAAAAAAAAAAAAAAAP///////////////////wB3f///////93d3d3d3d38AcAj///////AAAAAAAA
-        CPAPAA///////4AAAAAAAABwD4AI//////9wAAAAAAAAgA/wAP//////+AB///////AP+ACP//////cA
-        D//////wD/8AD///////AAf/////8A//gAf//////4AI//////AP/3AA///////wAH/////wD//4AH//
-        ////+ACP////8A//9wCP//////8AD/////AP//8AB///////gAj////wD///cAj///////AA////8A//
-        //AAAAAAAAAAAI////AP///4AAAAAAAAAAAP///wD////wAAAAAAAAAAB///8A////+AAIiIiIiIgAD/
-        //AP////8AD///////AAf//wD/////gAf//////4AI//8A/////3AA///////wAH//AP/////4AH////
-        //+ACP/wD/////9wCP//////8AD/8A//////8AB///////gAj/AP//////cAj///////AA/wD///////
-        AA///////4AI8A///////4AI//////9wAPAP///////wAP//////+ABwD///////94h///////eIcA//
-        //////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
-        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQE
-        BAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/s
-        zADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABm
-        MwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADM
-        zAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMz
-        zAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPM
-        MwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA
-        /wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZ
-        mQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkz
-        mQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZ
-        ZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn/
-        /wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxm
-        mQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/
-        AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9m
-        AAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/M
-        mQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3
-        dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/
-        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////
-        /////////////////////////////////wAA8QcH8//////////////zBwcHBwcHBwcHBwcHB/H/AADv
-        Cgpt//////////////MKCgoKCgoKCgoKCgoKEv8AAP8QCg7z/////////////20KCgoKCgoKCgoKCgoK
-        8QAA/5IKCuz/////////////8QoKCgoKCgoKCgoKCgptAAD//w4KDv//////////////EgoKB///////
-        //////8AAP//7AoKkv////////////8HCgoU/////////////wAA///zDgoQ//////////////8UCgq8
-        ////////////AAD///9tCgrv/////////////5IKCm3///////////8AAP////EKChT/////////////
-        /xAKCvH//////////wAA/////20KCgf/////////////kgoK6///////////AAD/////BwoKbf//////
-        ///////zDgoO8/////////8AAP//////FAoK8f/////////////sCgrs/////////wAA///////vCgpt
-        //////////////MKChD/////////AAD///////8QCg4UFBQUFBQUFBQUFA4KCpL///////8AAP//////
-        /5IKCgoKCgoKCgoKCgoKCgoKEP///////wAA/////////w4KCgoKCgoKCgoKCgoKCgoKB///////AAD/
-        ////////7AoKFOzs7Ozs7Ozs7OzrCgoU//////8AAP/////////zDgoQ//////////////8UCgq8////
-        /wAA//////////9tCgrv/////////////5IKCm3/////AAD///////////EKChT//////////////xAK
-        CvH///8AAP///////////20KCgf/////////////kgoK6////wAA////////////BwoKbf//////////
-        ////DgoO8///AAD/////////////FAoK8f/////////////sCgrs//8AAP/////////////vCgpt////
-        //////////MOChD//wAA//////////////8QCg7z/////////////20KCpL/AAD//////////////5IK
-        Cuz/////////////8QoKEP8AAP///////////////w4KDvP/////////////bQoKBwAA////////////
-        ////7+zs8f////////////+87OzvAAD///////////////////////////////////////8AAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEABAAAAAAAgAQAAAAA
-        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD/
-        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
-        ///////wD//////////////////////////////wD//////////////////////////////wDwAAj///
-        ///////4AAAAAAAAAAAAAP/wD3AAD///////////AAAAAAAAAAAAAI/wD/AACP//////////gAAAAAAA
-        AAAAAA/wD/gAAP//////////cAAAAAAAAAAAAAjwD/8AAI//////////+AAAAAAAAAAAAAjwD/+AAA//
-        ////////9wAAf//////////wD//wAAj//////////wAAD//////////wD//4AAD//////////3AAB///
-        ///////wD//3AAB///////////AACP/////////wD///gACP//////////gAAH/////////wD///cAAH
-        //////////8AAI/////////wD///8AAI//////////+AAA/////////wD///9wAA///////////wAAj/
-        ///////wD////wAAj//////////4AAD////////wD////4AAD//////////3AACP///////wD/////AA
-        CP//////////gAAP///////wD/////gAAP//////////cAAI///////wD/////8AAI//////////8AAA
-        ///////wD/////+AAA//////////9wAAf//////wD/////9wAAAAAAAAAAAAAAAAj//////wD//////4
-        AAAAAAAAAAAAAAAAB//////wD//////3AAAAAAAAAAAAAAAACP/////wD///////AAAAAAAAAAAAAAAA
-        AP/////wD///////cAAAAAAAAAAAAAAAAI/////wD///////8AAI//////////+AAA/////wD///////
-        +AAA//////////9wAAj////wD////////wAAj//////////4AAD////wD////////4AAD//////////3
-        AACP///wD/////////AACP//////////AAAP///wD/////////gAAP//////////cAAH///wD///////
-        //cAAH//////////8AAI///wD/////////+AAA//////////+AAAf//wD/////////9wAAf/////////
-        /wAAj//wD//////////wAAj//////////4AAD//wD//////////3AAB///////////AACP/wD///////
-        ////AACP//////////gAAP/wD///////////gAAP//////////cAAI/wD///////////8AAI////////
-        //+AAA/wD///////////+AAA//////////9wAAjwD////////////wAAj//////////wAADwD///////
-        ///////////////////////wD//////////////////////////////wD///////////////////////
-        ///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
-        AABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
-        AADAwMAAwNzAAPDKpgAEBAQACAgIAAwMDAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5
-        OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAz
-        mQAAM8wAADP/AABmAAAAZjMAAGZmAABmmQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADM
-        AAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMz
-        AAAzMzMAMzNmADMzmQAzM8wAMzP/ADNmAAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZ
-        mQAzmcwAM5n/ADPMAAAzzDMAM8xmADPMmQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYA
-        MwBmAGYAZgCZAGYAzABmAP8AZjMAAGYzMwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZm
-        zABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ/wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/
-        zADMAP8A/wDMAJmZAACZM5kAmQCZAJkAzACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlm
-        mQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZzACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/
-        MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkAMwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz
-        /wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm/wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzM
-        ZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8z
-        ZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxmZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z
-        /wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M/wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m
-        /wD//2YAIQClAF9fXwB3d3cAhoaGAJaWlgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7
-        /wCkoKAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////
-        /////////////////wAA////////////////////////////////////////////////////////////
-        /wAA/////////////////////////////////////////////////////////////wAA/xQKCgpt////
-        /////////////////+wKCgoKCgoKCgoKCgoKCgoKCgoKDvP//wAA/wcKCgoK8///////////////////
-        //MOCgoKCgoKCgoKCgoKCgoKCgoKCuz//wAA//8QCgoK7P////////////////////9tCgoKCgoKCgoK
-        CgoKCgoKCgoKCg7//wAA//+SCgoKDvP////////////////////xCgoKCgoKCgoKCgoKCgoKCgoKCgqS
-        /wAA////EAoKCpL/////////////////////bQoKCgoUFBQUFBQUFBQUFBQUFBRt/wAA////7AoKChD/
-        ////////////////////BwoKCgrv/////////////////////wAA////8w4KCgqS////////////////
-        /////xQKCgoU/////////////////////wAA/////+sKCgoU/////////////////////+8KCgoKB///
-        /////////////////wAA//////EKCgoKB/////////////////////8QCgoKbf//////////////////
-        /wAA//////9tCgoKEv////////////////////+SCgoKCvH//////////////////wAA//////+8CgoK
-        CvH/////////////////////DgoKCm3//////////////////wAA////////FAoKCm3/////////////
-        ////////7AoKCgrz/////////////////wAA////////BwoKCgrz////////////////////8w4KCgrs
-        /////////////////wAA/////////xAKCgrs/////////////////////20KCgoO8///////////////
-        /wAA/////////5IKCgoO8/////////////////////EKCgoKkv///////////////wAA//////////8Q
-        CgoKkv////////////////////9tCgoKEP///////////////wAA///////////sCgoKEP//////////
-        //////////8HCgoKCpL//////////////wAA///////////zDgoKCpL/////////////////////FAoK
-        ChT//////////////wAA////////////6woKChT/////////////////////7woKCgoH////////////
-        /wAA////////////8QoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoS/////////////wAA////////////
-        /20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK8f///////////wAA/////////////7wKCgoKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgoKbf///////////wAA//////////////8UCgoKCgoKCgoKCgoKCgoKCgoKCgoK
-        CgoKCvP//////////wAA//////////////8HCgoKCkMUFBQUFBQUFBQUFBQUFBQUDgoKCuz/////////
-        /wAA////////////////EAoKCuz/////////////////////bQoKCg7z/////////wAA////////////
-        ////kgoKCg7z////////////////////8QoKCgqS/////////wAA/////////////////xAKCgrs////
-        /////////////////20KCgoQ/////////wAA/////////////////+wKCgoQ////////////////////
-        /7wKCgoKkv///////wAA//////////////////MOCgoKkv////////////////////8UCgoKFP//////
-        /wAA///////////////////rCgoKQ/////////////////////8HCgoKCgf//////wAA////////////
-        ///////xCgoKCgf/////////////////////EAoKChL//////wAA////////////////////bQoKChT/
-        ////////////////////kgoKCgrx/////wAA////////////////////vAoKCgrx////////////////
-        /////xAKCgpt/////wAA/////////////////////xQKCgpt/////////////////////+wKCgoK8///
-        /wAA/////////////////////wcKCgoK8f////////////////////MOCgoK7P///wAA////////////
-        //////////9DCgoK7P/////////////////////rCgoKDvP//wAA//////////////////////+SCgoK
-        DvP////////////////////xCgoKCpL//wAA////////////////////////EAoKCuz/////////////
-        ////////bQoKChD//wAA////////////////////////7AoKChD/////////////////////vAoKCgqS
-        /wAA////////////////////////8w4KCgqS/////////////////////xQKCgoU/wAA////////////
-        /////////////////////////////////////////////////wAA////////////////////////////
-        /////////////////////////////////wAA////////////////////////////////////////////
-        /////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABAAQAAAAAAAAIAAAAAAAAAAAAABAA
-        AAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A
-        /wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////
-        //////////////////AP////////////////////////////////////////8A//////////////////
-        ///////////////////////wD/////////////////////////////////////////AP+IiIf///////
-        ///////4iIiIiIiIiIiIiIiIiH//8A/wAAAP//////////////gAAAAAAAAAAAAAAAAAD//wD/gAAAj/
-        /////////////wAAAAAAAAAAAAAAAAAI//AP/wAAAP//////////////gAAAAAAAAAAAAAAAAAD/8A//
-        gAAAj//////////////wAAAAAAAAAAAAAAAAAI/wD//wAAAP//////////////gAAAAAAAAAAAAAAAAA
-        D/AP//gAAAf/////////////9wAAAAAAAAAAAAAAAAAH8A//9wAACP//////////////gAAAf///////
-        ///////wD///gAAAf/////////////9wAAAP//////////////AP//9wAACP//////////////AAAAf/
-        ////////////8A////AAAA//////////////+AAACP/////////////wD///9wAACP//////////////
-        AAAAf/////////////AP////AAAA//////////////+AAACP////////////8A////+AAACP////////
-        //////AAAA/////////////wD/////AAAA//////////////+AAACP////////////AP////+AAACP//
-        ////////////AAAA////////////8A//////AAAA//////////////+AAACP///////////wD/////+A
-        AAB//////////////3AAAA////////////AP/////3AAAI//////////////+AAAB///////////8A//
-        ////+AAAB//////////////3AAAA///////////wD//////3AAAI//////////////8AAAB/////////
-        //AP//////8AAAD//////////////3AAAI//////////8A///////3AAAI//////////////8AAAB///
-        ///////wD///////8AAAD//////////////4AAAI//////////AP///////4AAAI//////////////8A
-        AAD/////////8A////////8AAAB3d3d3d3d3d3d3d4AAAI/////////wD////////4AAAAAAAAAAAAAA
-        AAAAAAAAD/////////AP////////8AAAAAAAAAAAAAAAAAAAAAAI////////8A/////////4AAAAAAAA
-        AAAAAAAAAAAAAAD////////wD/////////cAAAAAAAAAAAAAAAAAAAAAAI////////AP/////////4AA
-        AAAAAAAAAAAAAAAAAAAAD///////8A//////////cAAAAAAAAAAAAAAAAAAAAAAH///////wD///////
-        ///wAAAH//////////////cAAAj///////AP//////////cAAAj//////////////wAAAH//////8A//
-        /////////wAAAP//////////////gAAAj//////wD///////////gAAAj//////////////wAAAP////
-        //AP///////////wAAAP//////////////gAAAj/////8A////////////gAAAj//////////////wAA
-        AP/////wD////////////wAAAP//////////////gAAAj/////AP////////////gAAAf///////////
-        //9wAAAP////8A////////////9wAAAP//////////////gAAAj////wD/////////////gAAAf/////
-        ////////9wAAAP////AP////////////9wAACP//////////////AAAAf///8A//////////////AAAA
-        f/////////////9wAACP///wD/////////////9wAACP//////////////AAAAf///AP////////////
-        //AAAA//////////////+AAACP//8A//////////////+AAACP//////////////AAAA///wD///////
-        ////////AAAA//////////////+AAACP//AP//////////////+AAACP//////////////AAAA//8A//
-        //////////////AAAA//////////////+AAACP/wD///////////////+AAAB//////////////3AAAA
-        //AP///////////////3AAAA//////////////+AAACP8A////////////////+AAAB/////////////
-        /3AAAA/wD////////////////3AAAI//////////////8AAAB/AP////////////////////////////
-        ////////////8A/////////////////////////////////////////wD///////////////////////
-        //////////////////AP////////////////////////////////////////8AAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAA
-        AAABAAgAAAAAAAAQAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDA
-        wADA3MAA8MqmAAQEBAAICAgADAwMABEREQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8
-        /wBQUP8AkwDWAP/szADG1u8A1ufnAJCprQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAz
-        zAAAM/8AAGYAAABmMwAAZmYAAGaZAABmzAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADM
-        MwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMz
-        MwAzM2YAMzOZADMzzAAzM/8AM2YAADNmMwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZ
-        zAAzmf8AM8wAADPMMwAzzGYAM8yZADPMzAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYA
-        ZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYzZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZ
-        AABmmTMAZplmAGaZmQBmmcwAZpn/AGbMAABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA
-        /wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkAAACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlm
-        zACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ/wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnM
-        ZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwAZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxm
-        AADMZjMAmWZmAMxmmQDMZswAmWb/AMyZAADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzM
-        mQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8z
-        mQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9mmQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/M
-        AAD/zDMA/8xmAP/MmQD/zMwA/8z/AP//MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//
-        ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvLywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSg
-        oACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK////////////////////////////
-        //////////////////////////////////////////////////////8KCv//////////////////////
-        ////////////////////////////////////////////////////////////Cgr/////////////////
-        /////////////////////////////////////////////////////////////////woK////////////
-        //////////////////////////////////////////////////////////////////////8KCv/z7Ozs
-        7Ozv/////////////////////////////5Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//////Cgr/
-        /xAKCgoKDvP///////////////////////////+SCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8///
-        /woK//+SCgoKCgqS////////////////////////////8w4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
-        Cuz///8KCv///xAKCgoKEP/////////////////////////////sCgoKCgoKCgoKCgoKCgoKCgoKCgoK
-        CgoKCgoQ////Cgr////sCgoKCgqS////////////////////////////8woKCgoKCgoKCgoKCgoKCgoK
-        CgoKCgoKCgoKCpL//woK////8w4KCgoKFP////////////////////////////9tCgoKCgoKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgpD//8KCv/////rCgoKCgoH////////////////////////////8QoKCgoKChQU
-        FBQUFBQUFBQUFBQUFBQUFBQUFPH/Cgr/////8QoKCgoKEv////////////////////////////8SCgoK
-        Cgrv/////////////////////////////woK//////9tCgoKCgrx////////////////////////////
-        BwoKCgoKFP////////////////////////////8KCv//////vAoKCgoKbf//////////////////////
-        //////8UCgoKCgoH////////////////////////////Cgr///////8UCgoKCgrz////////////////
-        ////////////kgoKCgoKbf///////////////////////////woK////////BwoKCgoK7P//////////
-        //////////////////8QCgoKCgrx//////////////////////////8KCv////////8QCgoKCg7z////
-        ////////////////////////kgoKCgoKbf//////////////////////////Cgr/////////kgoKCgoK
-        kv////////////////////////////MOCgoKCg7z/////////////////////////woK//////////8Q
-        CgoKChD/////////////////////////////7AoKCgoK7P////////////////////////8KCv//////
-        ////7AoKCgoKkv////////////////////////////MOCgoKCg7/////////////////////////Cgr/
-        //////////MOCgoKChT/////////////////////////////bQoKCgoKkv//////////////////////
-        /woK////////////6woKCgoKB/////////////////////////////EKCgoKChD/////////////////
-        //////8KCv////////////EKCgoKChL/////////////////////////////bQoKCgoK7///////////
-        ////////////Cgr/////////////bQoKCgoK8f///////////////////////////wcKCgoKChT/////
-        /////////////////woK/////////////7wKCgoKCm3/////////////////////////////FAoKCgoK
-        B/////////////////////8KCv//////////////FAoKCgoK8////////////////////////////+8K
-        CgoKCm3/////////////////////Cgr//////////////wcKCgoKCuz/////////////////////////
-        ////EAoKCgoK8f///////////////////woK////////////////EAoKCgoO8///////////////////
-        /////////5IKCgoKCm3///////////////////8KCv///////////////5IKCgoKCpL/////////////
-        ////////////////DgoKCgoK8///////////////////Cgr/////////////////EAoKCgoQBwcHBwcH
-        BwcHBwcHBwcHBwcHBwcHBxIKCgoKCuz//////////////////woK/////////////////+wKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoO8/////////////////8KCv/////////////////zDgoK
-        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL/////////////////Cgr/////////////////
-        /+sKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoQ/////////////////woK////////////
-        ///////xCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCpL///////////////8KCv//////
-        /////////////20KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoU////////////////Cgr/
-        //////////////////+8CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgf/////////////
-        /woK/////////////////////xQKCgoKCvH////////////////////////////vCgoKCgoS////////
-        //////8KCv////////////////////8HCgoKCgrs/////////////////////////////xAKCgoKCvH/
-        ////////////Cgr//////////////////////xAKCgoKDvP///////////////////////////+SCgoK
-        Cgpt/////////////woK//////////////////////+SCgoKCgrs////////////////////////////
-        /w4KCgoKCvP///////////8KCv///////////////////////xAKCgoKEP//////////////////////
-        ///////sCgoKCgrs////////////Cgr////////////////////////sCgoKCgqS////////////////
-        ////////////8w4KCgoKDvP//////////woK////////////////////////8w4KCgoKQ///////////
-        //////////////////9tCgoKCgqS//////////8KCv/////////////////////////sCgoKCgoH////
-        ////////////////////////8QoKCgoKEP//////////Cgr/////////////////////////8QoKCgoK
-        FP////////////////////////////9tCgoKCgqS/////////woK//////////////////////////9t
-        CgoKCgrx////////////////////////////BwoKCgoKFP////////8KCv//////////////////////
-        ////8QoKCgoKbf////////////////////////////8UCgoKCgoH////////Cgr/////////////////
-        //////////8UCgoKCgrx////////////////////////////7woKCgoKEv///////woK////////////
-        ////////////////BwoKCgoK7P////////////////////////////8QCgoKCgrx//////8KCv//////
-        //////////////////////9DCgoKCg7z////////////////////////////kgoKCgoKbf//////Cgr/
-        ////////////////////////////kgoKCgoK7P////////////////////////////8OCgoKCgrz////
-        /woK//////////////////////////////8QCgoKChD/////////////////////////////7AoKCgoK
-        7P////8KCv//////////////////////////////7AoKCgoKkv////////////////////////////MO
-        CgoKCg7z////Cgr///////////////////////////////MOCgoKCkP/////////////////////////
-        ////bQoKCgoKkv///woK////////////////////////////////7AoKCgoKB///////////////////
-        //////////EKCgoKChD///8KCv////////////////////////////////EKCgoKChT/////////////
-        ////////////////bQoKCgoKkv//Cgr/////////////////////////////////bQoKCgoK8f//////
-        /////////////////////wcKCgoKChT//woK//////////////////////////////////EKCgoKCm3/
-        ////////////////////////////FAoKCgoKB/8KCv//////////////////////////////////////
-        ////////////////////////////////////////////Cgr/////////////////////////////////
-        /////////////////////////////////////////////////woK////////////////////////////
-        //////////////////////////////////////////////////////8KCv//////////////////////
-        ////////////////////////////////////////////////////////////CgoKCgoKCgoKCgoKCgoK
-        CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
-</value>
-  </data>
-</root>
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.Designer.cs	(revision 3626)
+++ 	(revision )
@@ -1,161 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  partial class PluginEditor {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.components = new System.ComponentModel.Container();
-      this.uploadButton = new System.Windows.Forms.Button();
-      this.refreshButton = new System.Windows.Forms.Button();
-      this.listView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
-      this.pluginNameHeader = new System.Windows.Forms.ColumnHeader();
-      this.localVersionHeader = new System.Windows.Forms.ColumnHeader();
-      this.serverVersionHeader = new System.Windows.Forms.ColumnHeader();
-      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
-      this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
-      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.SuspendLayout();
-      // 
-      // uploadButton
-      // 
-      this.uploadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.uploadButton.Enabled = false;
-      this.uploadButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.PublishToWebHS;
-      this.uploadButton.Location = new System.Drawing.Point(78, 482);
-      this.uploadButton.Name = "uploadButton";
-      this.uploadButton.Size = new System.Drawing.Size(114, 26);
-      this.uploadButton.TabIndex = 7;
-      this.uploadButton.Text = "Upload Selected";
-      this.uploadButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.uploadButton, "Upload selected plugins to the server");
-      this.uploadButton.UseVisualStyleBackColor = true;
-      this.uploadButton.Click += new System.EventHandler(this.uploadButton_Click);
-      // 
-      // refreshButton
-      // 
-      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
-      this.refreshButton.Location = new System.Drawing.Point(0, 482);
-      this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(72, 26);
-      this.refreshButton.TabIndex = 6;
-      this.refreshButton.Text = "Refresh";
-      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.refreshButton, "Update list of plugins from the server");
-      this.refreshButton.UseVisualStyleBackColor = true;
-      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
-      // 
-      // listView
-      // 
-      this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.listView.CheckBoxes = true;
-      this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.pluginNameHeader,
-            this.localVersionHeader,
-            this.serverVersionHeader,
-            this.descriptionHeader});
-      this.listView.Location = new System.Drawing.Point(0, 0);
-      this.listView.Name = "listView";
-      this.listView.Size = new System.Drawing.Size(539, 476);
-      this.listView.SmallImageList = this.pluginImageList;
-      this.listView.Sorting = System.Windows.Forms.SortOrder.Ascending;
-      this.listView.SuppressItemCheckedEvents = false;
-      this.listView.TabIndex = 8;
-      this.listView.UseCompatibleStateImageBehavior = false;
-      this.listView.View = System.Windows.Forms.View.Details;
-      this.listView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listView_ItemChecked);
-      // 
-      // pluginNameHeader
-      // 
-      this.pluginNameHeader.Text = "Name";
-      this.pluginNameHeader.Width = 40;
-      // 
-      // localVersionHeader
-      // 
-      this.localVersionHeader.Text = "Local Version";
-      this.localVersionHeader.Width = 76;
-      // 
-      // serverVersionHeader
-      // 
-      this.serverVersionHeader.Text = "Server Version";
-      this.serverVersionHeader.Width = 81;
-      // 
-      // descriptionHeader
-      // 
-      this.descriptionHeader.Text = "Description";
-      this.descriptionHeader.Width = 335;
-      // 
-      // pluginImageList
-      // 
-      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
-      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
-      // 
-      // PluginEditor
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.listView);
-      this.Controls.Add(this.uploadButton);
-      this.Controls.Add(this.refreshButton);
-      this.Name = "PluginEditor";
-      this.Size = new System.Drawing.Size(539, 508);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Button refreshButton;
-    private System.Windows.Forms.Button uploadButton;
-    private MultiSelectListView listView;
-    private System.Windows.Forms.ColumnHeader pluginNameHeader;
-    private System.Windows.Forms.ColumnHeader localVersionHeader;
-    private System.Windows.Forms.ColumnHeader serverVersionHeader;
-    private System.Windows.Forms.ColumnHeader descriptionHeader;
-    private System.Windows.Forms.ToolTip toolTip;
-    private System.Windows.Forms.ImageList pluginImageList;
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.cs	(revision 3626)
+++ 	(revision )
@@ -1,324 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-using System.ServiceModel;
-using ICSharpCode.SharpZipLib.Zip;
-using System.IO;
-using HeuristicLab.PluginInfrastructure.Manager;
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class PluginEditor : InstallationManagerControl {
-    private const string UploadMessage = "Uploading plugins...";
-    private const string RefreshMessage = "Downloading plugin information from deployment service...";
-
-    private Dictionary<IPluginDescription, IPluginDescription> localAndServerPlugins;
-    private BackgroundWorker pluginUploadWorker;
-    private BackgroundWorker refreshPluginsWorker;
-
-    private PluginManager pluginManager;
-    public PluginManager PluginManager {
-      get { return pluginManager; }
-      set { pluginManager = value; }
-    }
-
-    public PluginEditor() {
-      InitializeComponent();
-      pluginImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.plugin_16);
-      localAndServerPlugins = new Dictionary<IPluginDescription, IPluginDescription>();
-
-      #region initialize backgroundworkers
-      pluginUploadWorker = new BackgroundWorker();
-      pluginUploadWorker.DoWork += new DoWorkEventHandler(pluginUploadWorker_DoWork);
-      pluginUploadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(pluginUploadWorker_RunWorkerCompleted);
-
-      refreshPluginsWorker = new BackgroundWorker();
-      refreshPluginsWorker.DoWork += new DoWorkEventHandler(refreshPluginsWorker_DoWork);
-      refreshPluginsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshPluginsWorker_RunWorkerCompleted);
-      #endregion
-    }
-
-    #region refresh plugins from server backgroundworker
-    void refreshPluginsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        StatusView.ShowError("Connection Error",
-          "There was an error while connecting to the server." + Environment.NewLine +
-                   "Please check your connection settings and user credentials.");
-      } else {
-        UpdatePluginListView((IEnumerable<IPluginDescription>)e.Result);
-      }
-      StatusView.HideProgressIndicator();
-      StatusView.RemoveMessage(RefreshMessage);
-      StatusView.UnlockUI();
-    }
-
-    void refreshPluginsWorker_DoWork(object sender, DoWorkEventArgs e) {
-      // refresh available plugins
-      var client = DeploymentService.UpdateClientFactory.CreateClient();
-      try {
-        e.Result = client.GetPlugins();
-        client.Close();
-      }
-      catch (TimeoutException) {
-        client.Abort();
-        throw;
-      }
-      catch (FaultException) {
-        client.Abort();
-        throw;
-      }
-      catch (CommunicationException) {
-        client.Abort();
-        throw;
-      }
-    }
-    #endregion
-
-    #region upload plugins to server backgroundworker
-    void pluginUploadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        StatusView.ShowError("Connection Error",
-          "There was an error while connecting to the server." + Environment.NewLine +
-                   "Please check your connection settings and user credentials.");
-      } else {
-        UpdatePluginListView((IEnumerable<IPluginDescription>)e.Result);
-      }
-      StatusView.RemoveMessage(UploadMessage);
-      StatusView.HideProgressIndicator();
-      StatusView.UnlockUI();
-    }
-
-    void pluginUploadWorker_DoWork(object sender, DoWorkEventArgs e) {
-      // upload plugins
-      var selectedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
-      DeploymentService.AdminClient adminClient = DeploymentService.AdminClientFactory.CreateClient();
-      try {
-        foreach (var plugin in IteratePlugins(selectedPlugins)) {
-          adminClient.DeployPlugin(MakePluginDescription(plugin), CreateZipPackage(plugin));
-        }
-        adminClient.Close();
-      }
-      catch (TimeoutException) {
-        adminClient.Abort();
-        throw;
-      }
-      catch (FaultException) {
-        adminClient.Abort();
-        throw;
-      }
-      catch (CommunicationException) {
-        adminClient.Abort();
-        throw;
-      }
-      // refresh available plugins
-      var client = DeploymentService.UpdateClientFactory.CreateClient();
-      try {
-        e.Result = client.GetPlugins();
-        client.Close();
-      }
-      catch (TimeoutException) {
-        client.Abort();
-        throw;
-      }
-      catch (FaultException) {
-        client.Abort();
-        throw;
-      }
-      catch (CommunicationException) {
-        client.Abort();
-        throw;
-      }
-    }
-    #endregion
-
-
-    #region button events
-    private void uploadButton_Click(object sender, EventArgs e) {
-      var selectedPlugins = from item in listView.Items.Cast<ListViewItem>()
-                            where item.Checked
-                            where item.Tag is IPluginDescription
-                            select item.Tag as IPluginDescription;
-      if (selectedPlugins.Count() > 0) {
-        StatusView.LockUI();
-        StatusView.ShowProgressIndicator();
-        StatusView.ShowMessage(UploadMessage);
-        pluginUploadWorker.RunWorkerAsync(selectedPlugins.ToList());
-      }
-    }
-
-    private void refreshButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      StatusView.ShowMessage(RefreshMessage);
-      refreshPluginsWorker.RunWorkerAsync();
-    }
-
-    #endregion
-
-    #region item list events
-    private bool ignoreItemCheckedEvents = false;
-    private void listView_ItemChecked(object sender, ItemCheckedEventArgs e) {
-      if (ignoreItemCheckedEvents) return;
-      List<IPluginDescription> modifiedPlugins = new List<IPluginDescription>();
-      if (e.Item.Checked) {
-        foreach (ListViewItem item in listView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          // also check all dependencies
-          if (!modifiedPlugins.Contains(plugin))
-            modifiedPlugins.Add(plugin);
-          foreach (var dep in GetAllDependencies(plugin)) {
-            if (!modifiedPlugins.Contains(dep))
-              modifiedPlugins.Add(dep);
-          }
-        }
-        listView.CheckItems(modifiedPlugins.Select(x => FindItemForPlugin(x)));
-      } else {
-        foreach (ListViewItem item in listView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          // also uncheck all dependent plugins
-          if (!modifiedPlugins.Contains(plugin))
-            modifiedPlugins.Add(plugin);
-          foreach (var dep in GetAllDependents(plugin)) {
-            if (!modifiedPlugins.Contains(dep))
-              modifiedPlugins.Add(dep);
-          }
-        }
-        listView.UncheckItems(modifiedPlugins.Select(x => FindItemForPlugin(x)));
-      }
-      uploadButton.Enabled = (from i in listView.Items.OfType<ListViewItem>()
-                              where i.Checked
-                              select i).Any();
-    }
-    #endregion
-
-    #region helper methods
-    private void UpdatePluginListView(IEnumerable<IPluginDescription> remotePlugins) {
-      // refresh local plugins
-      localAndServerPlugins.Clear();
-      foreach (var plugin in pluginManager.Plugins) {
-        localAndServerPlugins.Add(plugin, null);
-      }
-      foreach (var plugin in remotePlugins) {
-        var matchingLocalPlugin = (from localPlugin in localAndServerPlugins.Keys
-                                   where localPlugin.Name == plugin.Name
-                                   where localPlugin.Version == localPlugin.Version
-                                   select localPlugin).SingleOrDefault();
-        if (matchingLocalPlugin != null) {
-          localAndServerPlugins[matchingLocalPlugin] = plugin;
-        }
-      }
-      // refresh the list view with plugins
-      listView.Items.Clear();
-      ignoreItemCheckedEvents = true;
-      foreach (var pair in localAndServerPlugins) {
-        var item = MakeListViewItem(pair.Key);
-        listView.Items.Add(item);
-      }
-      Util.ResizeColumns(listView.Columns.OfType<ColumnHeader>());
-      ignoreItemCheckedEvents = false;
-    }
-
-    private IEnumerable<IPluginDescription> GetAllDependents(IPluginDescription plugin) {
-      return from p in localAndServerPlugins.Keys
-             let matchingEntries = from dep in GetAllDependencies(p)
-                                   where dep.Name == plugin.Name
-                                   where dep.Version == plugin.Version
-                                   select dep
-             where matchingEntries.Any()
-             select p;
-    }
-
-    private IEnumerable<IPluginDescription> GetAllDependencies(IPluginDescription plugin) {
-      foreach (var dep in plugin.Dependencies) {
-        foreach (var recDep in GetAllDependencies(dep)) {
-          yield return recDep;
-        }
-        yield return dep;
-      }
-    }
-
-    private IEnumerable<IPluginDescription> IteratePlugins(IEnumerable<IPluginDescription> plugins) {
-      HashSet<IPluginDescription> yieldedItems = new HashSet<IPluginDescription>();
-      foreach (var plugin in plugins) {
-        foreach (var dependency in IteratePlugins(plugin.Dependencies)) {
-          if (!yieldedItems.Contains(dependency)) {
-            yieldedItems.Add(dependency);
-            yield return dependency;
-          }
-        }
-        if (!yieldedItems.Contains(plugin)) {
-          yieldedItems.Add(plugin);
-          yield return plugin;
-        }
-      }
-    }
-
-    private byte[] CreateZipPackage(IPluginDescription plugin) {
-      using (MemoryStream stream = new MemoryStream()) {
-        ZipFile zipFile = new ZipFile(stream);
-        zipFile.BeginUpdate();
-        foreach (var file in plugin.Files) {
-          zipFile.Add(file.Name);
-        }
-        zipFile.CommitUpdate();
-        stream.Seek(0, SeekOrigin.Begin);
-        return stream.GetBuffer();
-      }
-    }
-
-    private ListViewItem MakeListViewItem(IPluginDescription plugin) {
-      ListViewItem item;
-      if (localAndServerPlugins[plugin] != null) {
-        item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
-          localAndServerPlugins[plugin].Version.ToString(), localAndServerPlugins[plugin].Description });
-        if (plugin.Version <= localAndServerPlugins[plugin].Version)
-          item.ForeColor = Color.Gray;
-      } else {
-        item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
-          string.Empty, plugin.Description });
-      }
-      item.Tag = plugin;
-      item.ImageIndex = 0;
-      item.Checked = false;
-      return item;
-    }
-
-    private ListViewItem FindItemForPlugin(IPluginDescription dep) {
-      return (from i in listView.Items.Cast<ListViewItem>()
-              where i.Tag == dep
-              select i).Single();
-    }
-
-    private DeploymentService.PluginDescription MakePluginDescription(IPluginDescription plugin) {
-      var dependencies = from dep in plugin.Dependencies
-                         select MakePluginDescription(dep);
-      return new DeploymentService.PluginDescription(plugin.Name, plugin.Version, dependencies, plugin.ContactName, plugin.ContactEmail, plugin.LicenseText);
-    }
-    #endregion
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.resx	(revision 3626)
+++ 	(revision )
@@ -1,126 +1,0 @@
-<?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>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <metadata name="pluginImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>107, 17</value>
-  </metadata>
-</root>
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginListView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginListView.Designer.cs	(revision 3626)
+++ 	(revision )
@@ -1,96 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  partial class PluginListView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.listView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
-      this.nameHeader = new System.Windows.Forms.ColumnHeader();
-      this.versionHeader = new System.Windows.Forms.ColumnHeader();
-      this.SuspendLayout();
-      // 
-      // listView
-      // 
-      this.listView.CheckBoxes = true;
-      this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.nameHeader,
-            this.versionHeader});
-      this.listView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.listView.Location = new System.Drawing.Point(0, 0);
-      this.listView.Name = "listView";
-      this.listView.Size = new System.Drawing.Size(341, 320);
-      this.listView.SuppressItemCheckedEvents = false;
-      this.listView.TabIndex = 1;
-      this.listView.UseCompatibleStateImageBehavior = false;
-      this.listView.View = System.Windows.Forms.View.Details;
-      this.listView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listView_ItemChecked);
-      // 
-      // nameHeader
-      // 
-      this.nameHeader.Text = "Name";
-      this.nameHeader.Width = 40;
-      // 
-      // versionHeader
-      // 
-      this.versionHeader.Text = "Version";
-      this.versionHeader.Width = 297;
-      // 
-      // PluginListView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.listView);
-      this.Name = "PluginListView";
-      this.Size = new System.Drawing.Size(341, 320);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private MultiSelectListView listView;
-    private System.Windows.Forms.ColumnHeader nameHeader;
-    private System.Windows.Forms.ColumnHeader versionHeader;
-
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginListView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginListView.cs	(revision 3626)
+++ 	(revision )
@@ -1,171 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-using HeuristicLab.PluginInfrastructure;
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  /// <summary>
-  /// Wraps a ListView and adds functionality to automatically check and uncheck dependencies of plugins.
-  /// </summary>
-  internal partial class PluginListView : UserControl {
-    public event ItemCheckedEventHandler ItemChecked;
-
-    private IEnumerable<IPluginDescription> plugins;
-    public IEnumerable<IPluginDescription> Plugins {
-      get { return plugins; }
-      set {
-        plugins = value;
-        checkedPlugins.Clear();
-        UpdateControls();
-      }
-    }
-
-    private Dictionary<IPluginDescription, bool> checkedPlugins = new Dictionary<IPluginDescription, bool>();
-    public IEnumerable<IPluginDescription> CheckedPlugins {
-      get {
-        return from pair in checkedPlugins
-               where pair.Value
-               select pair.Key;
-      }
-    }
-
-    public PluginListView() {
-      InitializeComponent();
-    }
-
-    public void CheckPlugin(IPluginDescription plugin) {
-      MarkPluginChecked(plugin);
-      listView.CheckItems(new IPluginDescription[] { plugin }.Select(x => FindItemsForPlugin(x).Single()));
-    }
-
-
-    private void UpdateControls() {
-      if (plugins != null) {
-        listView.Items.Clear();
-        listView.SuppressItemCheckedEvents = true;
-        foreach (var plugin in plugins) {
-          listView.Items.Add(CreateListViewItem(plugin));
-        }
-        foreach (ColumnHeader column in listView.Columns)
-          column.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
-
-        listView.SuppressItemCheckedEvents = false;
-      }
-    }
-
-    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
-      var item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString() });
-      item.Checked = checkedPlugins.ContainsKey(plugin) ? checkedPlugins[plugin] : false;
-      item.Tag = plugin;
-      return item;
-    }
-
-    private void listView_ItemChecked(object sender, ItemCheckedEventArgs e) {
-      List<IPluginDescription> modifiedPlugins = new List<IPluginDescription>();
-      if (e.Item.Checked) {
-        foreach (ListViewItem item in listView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          // also check all dependencies
-          MarkPluginChecked(plugin);
-          if (!modifiedPlugins.Contains(plugin))
-            modifiedPlugins.Add(plugin);
-          foreach (var dep in GetAllDependencies(plugin)) {
-            MarkPluginChecked(dep);
-            if (!modifiedPlugins.Contains(dep))
-              modifiedPlugins.Add(dep);
-          }
-        }
-        listView.CheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
-        OnItemChecked(e);
-      } else {
-        foreach (ListViewItem item in listView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          // also uncheck all dependent plugins
-          MarkPluginUnchecked(plugin);
-          if (!modifiedPlugins.Contains(plugin))
-            modifiedPlugins.Add(plugin);
-          foreach (var dep in GetAllDependents(plugin)) {
-            MarkPluginUnchecked(dep);
-            if (!modifiedPlugins.Contains(dep))
-              modifiedPlugins.Add(dep);
-          }
-
-        }
-        listView.UncheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
-        OnItemChecked(e);
-      }
-    }
-
-    private void MarkPluginChecked(IPluginDescription plugin) {
-      checkedPlugins[plugin] = true;
-    }
-
-    private void MarkPluginUnchecked(IPluginDescription plugin) {
-      checkedPlugins[plugin] = false;
-    }
-
-    private IEnumerable<ListViewItem> FindItemsForPlugin(IPluginDescription plugin) {
-      return from item in listView.Items.OfType<ListViewItem>()
-             let p = item.Tag as IPluginDescription
-             where p.Name == plugin.Name
-             where p.Version == plugin.Version
-             select item;
-    }
-
-    private IEnumerable<IPluginDescription> GetAllDependents(IPluginDescription plugin) {
-      return from p in plugins
-             let matchingEntries = from dep in GetAllDependencies(p)
-                                   where dep.Name == plugin.Name
-                                   where dep.Version == plugin.Version
-                                   select dep
-             where matchingEntries.Any()
-             select p;
-    }
-
-    private IEnumerable<IPluginDescription> GetAllDependencies(IPluginDescription plugin) {
-      HashSet<IPluginDescription> yieldedPlugins = new HashSet<IPluginDescription>();
-      foreach (var dep in plugin.Dependencies) {
-        foreach (var recDep in GetAllDependencies(dep)) {
-          if (!yieldedPlugins.Contains(recDep)) {
-            yieldedPlugins.Add(recDep);
-            yield return recDep;
-          }
-        }
-        if (!yieldedPlugins.Contains(dep)) {
-          yieldedPlugins.Add(dep);
-          yield return dep;
-        }
-      }
-    }
-
-    private void OnItemChecked(ItemCheckedEventArgs e) {
-      if (ItemChecked != null) ItemChecked(this, e);
-    }
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginListView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginListView.resx	(revision 3626)
+++ 	(revision )
@@ -1,120 +1,0 @@
-<?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>
-</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.Designer.cs	(revision 3626)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.Designer.cs	(revision 3627)
@@ -52,5 +52,4 @@
       this.contactTextBox = new System.Windows.Forms.TextBox();
       this.contactInfoLabel = new System.Windows.Forms.Label();
-      this.licenseButton = new System.Windows.Forms.Button();
       this.dependenciesGroupBox = new System.Windows.Forms.GroupBox();
       this.dependenciesListView = new System.Windows.Forms.ListView();
@@ -70,4 +69,6 @@
       this.descriptionTextBox = new System.Windows.Forms.TextBox();
       this.errorTextBox = new System.Windows.Forms.TextBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.showLicenseButton = new System.Windows.Forms.Button();
       this.dependenciesGroupBox.SuspendLayout();
       this.filesGroupBox.SuspendLayout();
@@ -131,15 +132,4 @@
       this.contactInfoLabel.Text = "Contact:";
       // 
-      // licenseButton
-      // 
-      this.licenseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.licenseButton.Location = new System.Drawing.Point(3, 575);
-      this.licenseButton.Name = "licenseButton";
-      this.licenseButton.Size = new System.Drawing.Size(103, 23);
-      this.licenseButton.TabIndex = 10;
-      this.licenseButton.Text = "Show license";
-      this.licenseButton.UseVisualStyleBackColor = true;
-      this.licenseButton.Click += new System.EventHandler(this.licenseButton_Click);
-      // 
       // dependenciesGroupBox
       // 
@@ -150,5 +140,5 @@
       this.dependenciesGroupBox.Location = new System.Drawing.Point(12, 324);
       this.dependenciesGroupBox.Name = "dependenciesGroupBox";
-      this.dependenciesGroupBox.Size = new System.Drawing.Size(663, 229);
+      this.dependenciesGroupBox.Size = new System.Drawing.Size(663, 198);
       this.dependenciesGroupBox.TabIndex = 1;
       this.dependenciesGroupBox.TabStop = false;
@@ -164,5 +154,5 @@
       this.dependenciesListView.Location = new System.Drawing.Point(3, 16);
       this.dependenciesListView.Name = "dependenciesListView";
-      this.dependenciesListView.Size = new System.Drawing.Size(657, 210);
+      this.dependenciesListView.Size = new System.Drawing.Size(657, 179);
       this.dependenciesListView.SmallImageList = this.pluginsImageList;
       this.dependenciesListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
@@ -294,4 +284,16 @@
       this.errorTextBox.TabIndex = 21;
       // 
+      // showLicenseButton
+      // 
+      this.showLicenseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.showLicenseButton.Location = new System.Drawing.Point(12, 528);
+      this.showLicenseButton.Name = "showLicenseButton";
+      this.showLicenseButton.Size = new System.Drawing.Size(87, 23);
+      this.showLicenseButton.TabIndex = 22;
+      this.showLicenseButton.Text = "Show License";
+      this.toolTip.SetToolTip(this.showLicenseButton, "Show Plugin License");
+      this.showLicenseButton.UseVisualStyleBackColor = true;
+      this.showLicenseButton.Click += new System.EventHandler(this.showLicenseButton_Click);
+      // 
       // PluginView
       // 
@@ -299,4 +301,5 @@
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
       this.ClientSize = new System.Drawing.Size(687, 565);
+      this.Controls.Add(this.showLicenseButton);
       this.Controls.Add(this.errorTextBox);
       this.Controls.Add(this.descriptionTextBox);
@@ -307,5 +310,4 @@
       this.Controls.Add(this.dependenciesGroupBox);
       this.Controls.Add(this.filesGroupBox);
-      this.Controls.Add(this.licenseButton);
       this.Controls.Add(this.contactTextBox);
       this.Controls.Add(this.contactInfoLabel);
@@ -331,5 +333,4 @@
     protected System.Windows.Forms.TextBox contactTextBox;
     protected System.Windows.Forms.Label contactInfoLabel;
-    protected System.Windows.Forms.Button licenseButton;
     protected System.Windows.Forms.GroupBox dependenciesGroupBox;
     private System.Windows.Forms.ColumnHeader pluginNameHeader;
@@ -349,4 +350,6 @@
     private System.Windows.Forms.ImageList filesImageList;
     private System.Windows.Forms.ColumnHeader pluginDescriptionHeader;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button showLicenseButton;
 
   }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs	(revision 3626)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs	(revision 3627)
@@ -66,9 +66,13 @@
       versionTextBox.Text = plugin.Version.ToString();
       contactTextBox.Text = CombineStrings(plugin.ContactName, plugin.ContactEmail);
+      toolTip.SetToolTip(contactTextBox, contactTextBox.Text);
       descriptionTextBox.Text = plugin.Description;
+      toolTip.SetToolTip(descriptionTextBox, plugin.Description);
       var localPlugin = plugin as PluginDescription;
       if (localPlugin != null) {
         stateTextBox.Text = localPlugin.PluginState.ToString();
         errorTextBox.Text = localPlugin.LoadingErrorInformation;
+        toolTip.SetToolTip(stateTextBox, stateTextBox.Text + Environment.NewLine + errorTextBox.Text);
+        toolTip.SetToolTip(errorTextBox, errorTextBox.Text);
       }
       foreach (PluginDescription dependency in plugin.Dependencies) {
@@ -92,5 +96,5 @@
       Util.ResizeColumns(filesListView.Columns.OfType<ColumnHeader>());
 
-      licenseButton.Enabled = !string.IsNullOrEmpty(plugin.LicenseText);
+      showLicenseButton.Enabled = !string.IsNullOrEmpty(plugin.LicenseText);
     }
 
@@ -106,9 +110,4 @@
     }
 
-    private void licenseButton_Click(object sender, EventArgs e) {
-      LicenseView view = new LicenseView(plugin);
-      view.Show();
-    }
-
     private void dependenciesListView_ItemActivate(object sender, EventArgs e) {
       if (dependenciesListView.SelectedItems.Count > 0) {
@@ -118,4 +117,9 @@
       }
     }
+
+    private void showLicenseButton_Click(object sender, EventArgs e) {
+      LicenseView view = new LicenseView(plugin);
+      view.Show();
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.resx	(revision 3626)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.resx	(revision 3627)
@@ -123,4 +123,7 @@
   <metadata name="filesImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>181, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>306, 17</value>
   </metadata>
   <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.Designer.cs	(revision 3626)
+++ 	(revision )
@@ -1,367 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  partial class ProductEditor {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.components = new System.ComponentModel.Container();
-      this.refreshButton = new System.Windows.Forms.Button();
-      this.uploadButton = new System.Windows.Forms.Button();
-      this.splitContainer = new System.Windows.Forms.SplitContainer();
-      this.productsGroupBox = new System.Windows.Forms.GroupBox();
-      this.deleteProductButton = new System.Windows.Forms.Button();
-      this.newProductButton = new System.Windows.Forms.Button();
-      this.productsListView = new System.Windows.Forms.ListView();
-      this.productNameHeader = new System.Windows.Forms.ColumnHeader();
-      this.productVersionHeader = new System.Windows.Forms.ColumnHeader();
-      this.productImageList = new System.Windows.Forms.ImageList(this.components);
-      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
-      this.pluginsGroupBox = new System.Windows.Forms.GroupBox();
-      this.pluginListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
-      this.pluginNameHeader = new System.Windows.Forms.ColumnHeader();
-      this.pluginVersionHeader = new System.Windows.Forms.ColumnHeader();
-      this.pluginDescriptionHeader = new System.Windows.Forms.ColumnHeader();
-      this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
-      this.versionTextBox = new System.Windows.Forms.TextBox();
-      this.nameLabel = new System.Windows.Forms.Label();
-      this.nameTextBox = new System.Windows.Forms.TextBox();
-      this.versionLabel = new System.Windows.Forms.Label();
-      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
-      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.splitContainer.Panel1.SuspendLayout();
-      this.splitContainer.Panel2.SuspendLayout();
-      this.splitContainer.SuspendLayout();
-      this.productsGroupBox.SuspendLayout();
-      this.detailsGroupBox.SuspendLayout();
-      this.pluginsGroupBox.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.SuspendLayout();
-      // 
-      // refreshButton
-      // 
-      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
-      this.refreshButton.Location = new System.Drawing.Point(6, 394);
-      this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(73, 26);
-      this.refreshButton.TabIndex = 1;
-      this.refreshButton.Text = "Refresh";
-      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.refreshButton, "Refresh list of plugins and products from server");
-      this.refreshButton.UseVisualStyleBackColor = true;
-      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
-      // 
-      // uploadButton
-      // 
-      this.uploadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.uploadButton.Enabled = false;
-      this.uploadButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.PublishToWebHS;
-      this.uploadButton.Location = new System.Drawing.Point(85, 394);
-      this.uploadButton.Name = "uploadButton";
-      this.uploadButton.Size = new System.Drawing.Size(120, 26);
-      this.uploadButton.TabIndex = 2;
-      this.uploadButton.Text = "Upload Products";
-      this.uploadButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.uploadButton, "Upload changed products to server");
-      this.uploadButton.UseVisualStyleBackColor = true;
-      this.uploadButton.Click += new System.EventHandler(this.saveButton_Click);
-      // 
-      // splitContainer
-      // 
-      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.splitContainer.Location = new System.Drawing.Point(0, 0);
-      this.splitContainer.Name = "splitContainer";
-      // 
-      // splitContainer.Panel1
-      // 
-      this.splitContainer.Panel1.Controls.Add(this.productsGroupBox);
-      // 
-      // splitContainer.Panel2
-      // 
-      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
-      this.splitContainer.Size = new System.Drawing.Size(665, 426);
-      this.splitContainer.SplitterDistance = 321;
-      this.splitContainer.TabIndex = 4;
-      // 
-      // productsGroupBox
-      // 
-      this.productsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.productsGroupBox.Controls.Add(this.deleteProductButton);
-      this.productsGroupBox.Controls.Add(this.uploadButton);
-      this.productsGroupBox.Controls.Add(this.newProductButton);
-      this.productsGroupBox.Controls.Add(this.productsListView);
-      this.productsGroupBox.Controls.Add(this.refreshButton);
-      this.productsGroupBox.Location = new System.Drawing.Point(0, 0);
-      this.productsGroupBox.Name = "productsGroupBox";
-      this.productsGroupBox.Size = new System.Drawing.Size(321, 426);
-      this.productsGroupBox.TabIndex = 5;
-      this.productsGroupBox.TabStop = false;
-      this.productsGroupBox.Text = "Products";
-      // 
-      // deleteProductButton
-      // 
-      this.deleteProductButton.Enabled = false;
-      this.deleteProductButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Actions_Remove;
-      this.deleteProductButton.Location = new System.Drawing.Point(116, 19);
-      this.deleteProductButton.Name = "deleteProductButton";
-      this.deleteProductButton.Size = new System.Drawing.Size(104, 26);
-      this.deleteProductButton.TabIndex = 5;
-      this.deleteProductButton.Text = "Delete Product";
-      this.deleteProductButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.deleteProductButton, "Deletes the selected product");
-      this.deleteProductButton.UseVisualStyleBackColor = true;
-      this.deleteProductButton.Click += new System.EventHandler(this.deleteProductButton_Click);
-      // 
-      // newProductButton
-      // 
-      this.newProductButton.Enabled = false;
-      this.newProductButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Actions_Add;
-      this.newProductButton.Location = new System.Drawing.Point(6, 19);
-      this.newProductButton.Name = "newProductButton";
-      this.newProductButton.Size = new System.Drawing.Size(104, 26);
-      this.newProductButton.TabIndex = 3;
-      this.newProductButton.Text = "Create Product";
-      this.newProductButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.newProductButton, "Create a new product");
-      this.newProductButton.UseVisualStyleBackColor = true;
-      this.newProductButton.Click += new System.EventHandler(this.newProductButton_Click);
-      // 
-      // productsListView
-      // 
-      this.productsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.productsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.productNameHeader,
-            this.productVersionHeader});
-      this.productsListView.Enabled = false;
-      this.productsListView.FullRowSelect = true;
-      this.productsListView.HideSelection = false;
-      this.productsListView.Location = new System.Drawing.Point(6, 51);
-      this.productsListView.MultiSelect = false;
-      this.productsListView.Name = "productsListView";
-      this.productsListView.Size = new System.Drawing.Size(309, 337);
-      this.productsListView.SmallImageList = this.productImageList;
-      this.productsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
-      this.productsListView.TabIndex = 4;
-      this.productsListView.UseCompatibleStateImageBehavior = false;
-      this.productsListView.View = System.Windows.Forms.View.Details;
-      this.productsListView.SelectedIndexChanged += new System.EventHandler(this.productsListBox_SelectedIndexChanged);
-      // 
-      // productNameHeader
-      // 
-      this.productNameHeader.Text = "Name";
-      this.productNameHeader.Width = 40;
-      // 
-      // productVersionHeader
-      // 
-      this.productVersionHeader.Text = "Version";
-      this.productVersionHeader.Width = 265;
-      // 
-      // productImageList
-      // 
-      this.productImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.productImageList.ImageSize = new System.Drawing.Size(16, 16);
-      this.productImageList.TransparentColor = System.Drawing.Color.Transparent;
-      // 
-      // detailsGroupBox
-      // 
-      this.detailsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.detailsGroupBox.Controls.Add(this.pluginsGroupBox);
-      this.detailsGroupBox.Controls.Add(this.versionTextBox);
-      this.detailsGroupBox.Controls.Add(this.nameLabel);
-      this.detailsGroupBox.Controls.Add(this.nameTextBox);
-      this.detailsGroupBox.Controls.Add(this.versionLabel);
-      this.detailsGroupBox.Enabled = false;
-      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
-      this.detailsGroupBox.Name = "detailsGroupBox";
-      this.detailsGroupBox.Size = new System.Drawing.Size(340, 426);
-      this.detailsGroupBox.TabIndex = 8;
-      this.detailsGroupBox.TabStop = false;
-      this.detailsGroupBox.Text = "Details";
-      // 
-      // pluginsGroupBox
-      // 
-      this.pluginsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.pluginsGroupBox.Controls.Add(this.pluginListView);
-      this.pluginsGroupBox.Location = new System.Drawing.Point(6, 71);
-      this.pluginsGroupBox.Name = "pluginsGroupBox";
-      this.pluginsGroupBox.Size = new System.Drawing.Size(328, 349);
-      this.pluginsGroupBox.TabIndex = 6;
-      this.pluginsGroupBox.TabStop = false;
-      this.pluginsGroupBox.Text = "Plugins";
-      // 
-      // pluginListView
-      // 
-      this.pluginListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.pluginListView.CheckBoxes = true;
-      this.pluginListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.pluginNameHeader,
-            this.pluginVersionHeader,
-            this.pluginDescriptionHeader});
-      this.pluginListView.Location = new System.Drawing.Point(3, 16);
-      this.pluginListView.Name = "pluginListView";
-      this.pluginListView.Size = new System.Drawing.Size(322, 330);
-      this.pluginListView.SmallImageList = this.pluginImageList;
-      this.pluginListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
-      this.pluginListView.SuppressItemCheckedEvents = false;
-      this.pluginListView.TabIndex = 7;
-      this.pluginListView.UseCompatibleStateImageBehavior = false;
-      this.pluginListView.View = System.Windows.Forms.View.Details;
-      this.pluginListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listView_ItemChecked);
-      // 
-      // pluginNameHeader
-      // 
-      this.pluginNameHeader.Text = "Name";
-      // 
-      // pluginVersionHeader
-      // 
-      this.pluginVersionHeader.Text = "Version";
-      // 
-      // pluginDescriptionHeader
-      // 
-      this.pluginDescriptionHeader.Text = "Description";
-      // 
-      // pluginImageList
-      // 
-      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
-      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
-      // 
-      // versionTextBox
-      // 
-      this.versionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.versionTextBox.Location = new System.Drawing.Point(57, 45);
-      this.versionTextBox.Name = "versionTextBox";
-      this.versionTextBox.Size = new System.Drawing.Size(243, 20);
-      this.versionTextBox.TabIndex = 5;
-      this.versionTextBox.TextChanged += new System.EventHandler(this.versionTextBox_TextChanged);
-      // 
-      // nameLabel
-      // 
-      this.nameLabel.AutoSize = true;
-      this.nameLabel.Location = new System.Drawing.Point(13, 22);
-      this.nameLabel.Name = "nameLabel";
-      this.nameLabel.Size = new System.Drawing.Size(38, 13);
-      this.nameLabel.TabIndex = 2;
-      this.nameLabel.Text = "Name:";
-      // 
-      // nameTextBox
-      // 
-      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.nameTextBox.Location = new System.Drawing.Point(57, 19);
-      this.nameTextBox.Name = "nameTextBox";
-      this.nameTextBox.Size = new System.Drawing.Size(243, 20);
-      this.nameTextBox.TabIndex = 3;
-      this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
-      // 
-      // versionLabel
-      // 
-      this.versionLabel.AutoSize = true;
-      this.versionLabel.Location = new System.Drawing.Point(6, 48);
-      this.versionLabel.Name = "versionLabel";
-      this.versionLabel.Size = new System.Drawing.Size(45, 13);
-      this.versionLabel.TabIndex = 4;
-      this.versionLabel.Text = "Version:";
-      // 
-      // errorProvider
-      // 
-      this.errorProvider.ContainerControl = this;
-      // 
-      // ProductEditor
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.splitContainer);
-      this.Name = "ProductEditor";
-      this.Size = new System.Drawing.Size(665, 426);
-      this.splitContainer.Panel1.ResumeLayout(false);
-      this.splitContainer.Panel2.ResumeLayout(false);
-      this.splitContainer.ResumeLayout(false);
-      this.productsGroupBox.ResumeLayout(false);
-      this.detailsGroupBox.ResumeLayout(false);
-      this.detailsGroupBox.PerformLayout();
-      this.pluginsGroupBox.ResumeLayout(false);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Button refreshButton;
-    private System.Windows.Forms.Button uploadButton;
-    private System.Windows.Forms.Button newProductButton;
-    private System.Windows.Forms.SplitContainer splitContainer;
-    private System.Windows.Forms.TextBox versionTextBox;
-    private System.Windows.Forms.Label versionLabel;
-    private System.Windows.Forms.TextBox nameTextBox;
-    private System.Windows.Forms.Label nameLabel;
-    private System.Windows.Forms.ErrorProvider errorProvider;
-    private System.Windows.Forms.ListView productsListView;
-    private System.Windows.Forms.ColumnHeader productNameHeader;
-    private System.Windows.Forms.ColumnHeader productVersionHeader;
-    private System.Windows.Forms.ImageList productImageList;
-    private System.Windows.Forms.ImageList pluginImageList;
-    private MultiSelectListView pluginListView;
-    private System.Windows.Forms.GroupBox productsGroupBox;
-    private System.Windows.Forms.GroupBox detailsGroupBox;
-    private System.Windows.Forms.GroupBox pluginsGroupBox;
-    private System.Windows.Forms.ToolTip toolTip;
-    private System.Windows.Forms.Button deleteProductButton;
-    private System.Windows.Forms.ColumnHeader pluginNameHeader;
-    private System.Windows.Forms.ColumnHeader pluginVersionHeader;
-    private System.Windows.Forms.ColumnHeader pluginDescriptionHeader;
-
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.cs	(revision 3626)
+++ 	(revision )
@@ -1,485 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-using System.ServiceModel;
-using HeuristicLab.PluginInfrastructure;
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class ProductEditor : InstallationManagerControl {
-    private const string RefreshMessage = "Downloading product and plugin information...";
-    private const string UploadMessage = "Uploading product and plugin information...";
-    private const string DeleteProductMessage = "Deleting product...";
-
-    private BackgroundWorker refreshProductsWorker;
-    private BackgroundWorker uploadChangedProductsWorker;
-    private BackgroundWorker deleteProductWorker;
-
-    private List<DeploymentService.ProductDescription> products;
-    private List<DeploymentService.PluginDescription> plugins;
-    private HashSet<DeploymentService.ProductDescription> dirtyProducts;
-
-    public ProductEditor() {
-      InitializeComponent();
-
-      productImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.Setup_Install);
-      productImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.ArrowUp);
-      pluginImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.plugin_16);
-
-      dirtyProducts = new HashSet<DeploymentService.ProductDescription>();
-      refreshProductsWorker = new BackgroundWorker();
-      refreshProductsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshProductsWorker_RunWorkerCompleted);
-      refreshProductsWorker.DoWork += new DoWorkEventHandler(refreshProductsWorker_DoWork);
-
-      uploadChangedProductsWorker = new BackgroundWorker();
-      uploadChangedProductsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(uploadChangedProductsWorker_RunWorkerCompleted);
-      uploadChangedProductsWorker.DoWork += new DoWorkEventHandler(uploadChangedProductsWorker_DoWork);
-
-      deleteProductWorker = new BackgroundWorker();
-      deleteProductWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(deleteProductWorker_RunWorkerCompleted);
-      deleteProductWorker.DoWork += new DoWorkEventHandler(deleteProductWorker_DoWork);
-    }
-
-    #region event handlers for delete product background worker
-    void deleteProductWorker_DoWork(object sender, DoWorkEventArgs e) {
-      var products = (IEnumerable<DeploymentService.ProductDescription>)e.Argument;
-      var adminClient = DeploymentService.AdminClientFactory.CreateClient();
-      // upload
-      try {
-        foreach (var product in products) {
-          adminClient.DeleteProduct(product);
-        }
-        adminClient.Close();
-      }
-      catch (TimeoutException) {
-        adminClient.Abort();
-        throw;
-      }
-      catch (FaultException) {
-        adminClient.Abort();
-        throw;
-      }
-      catch (CommunicationException) {
-        adminClient.Abort();
-        throw;
-      }
-      // refresh      
-      var updateClient = DeploymentService.UpdateClientFactory.CreateClient();
-      try {
-        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
-        updateClient.Close();
-      }
-      catch (TimeoutException) {
-        updateClient.Abort();
-        throw;
-      }
-      catch (FaultException) {
-        updateClient.Abort();
-        throw;
-      }
-      catch (CommunicationException) {
-        updateClient.Abort();
-        throw;
-      }
-    }
-
-    void deleteProductWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        StatusView.ShowError("Connection Error",
-        "There was an error while connecting to the server." + Environment.NewLine +
-           "Please check your connection settings and user credentials.");
-        this.products.Clear();
-        this.plugins.Clear();
-      } else {
-        this.products = new List<DeploymentService.ProductDescription>(
-  (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
-        this.plugins = new List<DeploymentService.PluginDescription>(
-          (DeploymentService.PluginDescription[])((object[])e.Result)[1]);
-
-        EnableControls();
-      }
-      UpdateProductsList();
-      dirtyProducts.Clear();
-      StatusView.HideProgressIndicator();
-      StatusView.RemoveMessage(DeleteProductMessage);
-      StatusView.UnlockUI();
-    }
-    #endregion
-
-    #region event handlers for upload products background worker
-    private void uploadChangedProductsWorker_DoWork(object sender, DoWorkEventArgs e) {
-      var products = (IEnumerable<DeploymentService.ProductDescription>)e.Argument;
-      var adminClient = DeploymentService.AdminClientFactory.CreateClient();
-      // upload
-      try {
-        foreach (var product in products) {
-          adminClient.DeployProduct(product);
-        }
-        adminClient.Close();
-      }
-      catch (TimeoutException) {
-        adminClient.Abort();
-        throw;
-      }
-      catch (FaultException) {
-        adminClient.Abort();
-        throw;
-      }
-      catch (CommunicationException) {
-        adminClient.Abort();
-        throw;
-      }
-      // refresh      
-      var updateClient = DeploymentService.UpdateClientFactory.CreateClient();
-      try {
-        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
-        updateClient.Close();
-      }
-      catch (TimeoutException) {
-        updateClient.Abort();
-        throw;
-      }
-      catch (FaultException) {
-        updateClient.Abort();
-        throw;
-      }
-      catch (CommunicationException) {
-        updateClient.Abort();
-        throw;
-      }
-    }
-
-    private void uploadChangedProductsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        StatusView.ShowError("Connection Error",
-        "There was an error while connecting to the server." + Environment.NewLine +
-           "Please check your connection settings and user credentials.");
-        this.products.Clear();
-        this.plugins.Clear();
-      } else {
-        this.products = new List<DeploymentService.ProductDescription>(
-  (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
-        this.plugins = new List<DeploymentService.PluginDescription>(
-          (DeploymentService.PluginDescription[])((object[])e.Result)[1]);
-
-      }
-      UpdateProductsList();
-      dirtyProducts.Clear();
-      EnableControls();
-      StatusView.HideProgressIndicator();
-      StatusView.RemoveMessage(UploadMessage);
-      StatusView.UnlockUI();
-    }
-    #endregion
-
-    #region event handlers for refresh products background worker
-    private void refreshProductsWorker_DoWork(object sender, DoWorkEventArgs e) {
-      var updateClient = DeploymentService.UpdateClientFactory.CreateClient();
-      try {
-        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
-        updateClient.Close();
-      }
-      catch (TimeoutException) {
-        updateClient.Abort();
-        throw;
-      }
-      catch (FaultException) {
-        updateClient.Abort();
-        throw;
-      }
-      catch (CommunicationException) {
-        updateClient.Abort();
-        throw;
-      }
-    }
-
-    private void refreshProductsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        StatusView.ShowError("Connection Error",
-          "There was an error while connecting to the server." + Environment.NewLine +
-                   "Please check your connection settings and user credentials.");
-        this.products.Clear();
-        this.plugins.Clear();
-
-      } else {
-        this.products = new List<DeploymentService.ProductDescription>(
-          (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
-        this.plugins = new List<DeploymentService.PluginDescription>(
-          (DeploymentService.PluginDescription[])((object[])e.Result)[1]);
-      }
-      UpdateProductsList();
-      dirtyProducts.Clear();
-      EnableControls();
-      StatusView.HideProgressIndicator();
-      StatusView.RemoveMessage(RefreshMessage);
-      StatusView.UnlockUI();
-    }
-    #endregion
-
-    private void UpdateProductsList() {
-      productsListView.SelectedItems.Clear();
-      productsListView.Items.Clear();
-      foreach (var prodDesc in products) {
-        productsListView.Items.Add(CreateListViewItem(prodDesc));
-      }
-      Util.ResizeColumns(productsListView.Columns.OfType<ColumnHeader>());
-    }
-
-    private void productsListBox_SelectedIndexChanged(object sender, EventArgs e) {
-      bool productSelected = productsListView.SelectedItems.Count > 0;
-      detailsGroupBox.Enabled = productSelected;
-      UpdateProductButtons();
-      if (productSelected) {
-        DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)((ListViewItem)productsListView.SelectedItems[0]).Tag;
-        nameTextBox.Text = activeProduct.Name;
-        versionTextBox.Text = activeProduct.Version.ToString();
-
-        // populate plugins list view
-        ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
-        pluginListView.SuppressItemCheckedEvents = true;
-        foreach (var plugin in plugins.OfType<IPluginDescription>()) {
-          pluginListView.Items.Add(CreateListViewItem(plugin));
-        }
-        pluginListView.SuppressItemCheckedEvents = false;
-        foreach (var plugin in activeProduct.Plugins) {
-          pluginListView.CheckItems(FindItemsForPlugin(plugin));
-        }
-      } else {
-        nameTextBox.Text = string.Empty;
-        versionTextBox.Text = string.Empty;
-        pluginListView.Items.Clear();
-      }
-      Util.ResizeColumns(pluginListView.Columns.OfType<ColumnHeader>());
-    }
-
-    private void UpdateProductButtons() {
-      uploadButton.Enabled = dirtyProducts.Count > 0;
-      if (productsListView.SelectedItems.Count > 0) {
-        var selectedProduct = (DeploymentService.ProductDescription)productsListView.SelectedItems[0].Tag;
-        deleteProductButton.Enabled = !dirtyProducts.Contains(selectedProduct);
-      } else {
-        deleteProductButton.Enabled = false;
-      }
-    }
-
-
-    #region button event handlers
-    private void newProductButton_Click(object sender, EventArgs e) {
-      var newProduct = new DeploymentService.ProductDescription("New product", new Version("0.0.0.0"));
-      products.Add(newProduct);
-      UpdateProductsList();
-      MarkProductDirty(newProduct);
-    }
-
-    private void saveButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      StatusView.ShowMessage(UploadMessage);
-      uploadChangedProductsWorker.RunWorkerAsync(dirtyProducts);
-    }
-    private void refreshButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      StatusView.ShowMessage(RefreshMessage);
-      refreshProductsWorker.RunWorkerAsync();
-    }
-    private void deleteProductButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      StatusView.ShowMessage(DeleteProductMessage);
-      var selectedProducts = from item in productsListView.SelectedItems.OfType<ListViewItem>()
-                             select (DeploymentService.ProductDescription)item.Tag;
-      deleteProductWorker.RunWorkerAsync(selectedProducts.ToList());
-    }
-
-    #endregion
-
-    #region textbox changed event handlers
-    private void nameTextBox_TextChanged(object sender, EventArgs e) {
-      if (productsListView.SelectedItems.Count > 0) {
-        ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
-        DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)activeItem.Tag;
-        if (string.IsNullOrEmpty(nameTextBox.Name)) {
-          errorProvider.SetError(nameTextBox, "Invalid value");
-        } else {
-          if (activeProduct.Name != nameTextBox.Text) {
-            activeProduct.Name = nameTextBox.Text;
-            activeItem.SubItems[0].Text = activeProduct.Name;
-            errorProvider.SetError(nameTextBox, string.Empty);
-            MarkProductDirty(activeProduct);
-          }
-        }
-      }
-    }
-
-
-    private void versionTextBox_TextChanged(object sender, EventArgs e) {
-      if (productsListView.SelectedItems.Count > 0) {
-        ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
-        DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)activeItem.Tag;
-        try {
-          var newVersion = new Version(versionTextBox.Text);
-          if (activeProduct.Version != newVersion) {
-            activeProduct.Version = newVersion;
-            activeItem.SubItems[1].Text = versionTextBox.Text;
-            errorProvider.SetError(versionTextBox, string.Empty);
-            MarkProductDirty(activeProduct);
-          }
-        }
-        catch (OverflowException) {
-          errorProvider.SetError(versionTextBox, "Invalid value");
-        }
-
-        catch (ArgumentException) {
-          errorProvider.SetError(versionTextBox, "Invalid value");
-        }
-        catch (FormatException) {
-          errorProvider.SetError(versionTextBox, "Invalid value");
-        }
-      }
-    }
-    #endregion
-
-
-    #region plugin list view
-    private void OnItemChecked(ItemCheckedEventArgs e) {
-      ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
-      DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)activeItem.Tag;
-      activeProduct.Plugins = (from item in pluginListView.CheckedItems.OfType<ListViewItem>()
-                               select (DeploymentService.PluginDescription)item.Tag).ToArray();
-      MarkProductDirty(activeProduct);
-    }
-
-    private void listView_ItemChecked(object sender, ItemCheckedEventArgs e) {
-      List<IPluginDescription> modifiedPlugins = new List<IPluginDescription>();
-      if (e.Item.Checked) {
-        foreach (ListViewItem item in pluginListView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          // also check all dependencies
-          if (!modifiedPlugins.Contains(plugin))
-            modifiedPlugins.Add(plugin);
-          foreach (var dep in GetAllDependencies(plugin)) {
-            if (!modifiedPlugins.Contains(dep))
-              modifiedPlugins.Add(dep);
-          }
-        }
-        pluginListView.CheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
-        OnItemChecked(e);
-      } else {
-        foreach (ListViewItem item in pluginListView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          // also uncheck all dependent plugins
-          if (!modifiedPlugins.Contains(plugin))
-            modifiedPlugins.Add(plugin);
-          foreach (var dep in GetAllDependents(plugin)) {
-            if (!modifiedPlugins.Contains(dep))
-              modifiedPlugins.Add(dep);
-          }
-
-        }
-        pluginListView.UncheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
-        OnItemChecked(e);
-      }
-    }
-
-
-    #endregion
-
-    #region helper
-    private IEnumerable<IPluginDescription> GetAllDependents(IPluginDescription plugin) {
-      return from p in plugins
-             let matchingEntries = from dep in GetAllDependencies(p)
-                                   where dep.Name == plugin.Name
-                                   where dep.Version == plugin.Version
-                                   select dep
-             where matchingEntries.Any()
-             select p as IPluginDescription;
-    }
-
-    private IEnumerable<IPluginDescription> GetAllDependencies(IPluginDescription plugin) {
-      HashSet<IPluginDescription> yieldedPlugins = new HashSet<IPluginDescription>();
-      foreach (var dep in plugin.Dependencies) {
-        foreach (var recDep in GetAllDependencies(dep)) {
-          if (!yieldedPlugins.Contains(recDep)) {
-            yieldedPlugins.Add(recDep);
-            yield return recDep;
-          }
-        }
-        if (!yieldedPlugins.Contains(dep)) {
-          yieldedPlugins.Add(dep);
-          yield return dep;
-        }
-      }
-    }
-    private void MarkProductDirty(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription activeProduct) {
-      if (!dirtyProducts.Contains(activeProduct)) {
-        dirtyProducts.Add(activeProduct);
-        var item = FindItemForProduct(activeProduct);
-        item.ImageIndex = 1;
-        UpdateProductButtons();
-      }
-    }
-    private ListViewItem CreateListViewItem(DeploymentService.ProductDescription productDescription) {
-      ListViewItem item = new ListViewItem(new string[] { productDescription.Name, productDescription.Version.ToString() });
-      item.Tag = productDescription;
-      item.ImageIndex = 0;
-      return item;
-    }
-
-    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
-      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
-          string.Empty, plugin.Description });
-      item.Tag = plugin;
-      item.ImageIndex = 0;
-      item.Checked = false;
-      return item;
-    }
-
-    private ListViewItem FindItemForProduct(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription activeProduct) {
-      return (from item in productsListView.Items.OfType<ListViewItem>()
-              let product = item.Tag as DeploymentService.ProductDescription
-              where product != null
-              where product == activeProduct
-              select item).Single();
-    }
-    private IEnumerable<ListViewItem> FindItemsForPlugin(IPluginDescription plugin) {
-      return from item in pluginListView.Items.OfType<ListViewItem>()
-             let p = item.Tag as IPluginDescription
-             where p.Name == plugin.Name
-             where p.Version == plugin.Version
-             select item;
-    }
-
-    private void EnableControls() {
-      newProductButton.Enabled = true;
-      productsListView.Enabled = true;
-    }
-    #endregion
-
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.resx	(revision 3626)
+++ 	(revision )
@@ -1,132 +1,0 @@
-<?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>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>425, 17</value>
-  </metadata>
-  <metadata name="productImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>140, 17</value>
-  </metadata>
-  <metadata name="pluginImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>287, 17</value>
-  </metadata>
-  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.Designer.cs	(revision 3626)
+++ 	(revision )
@@ -1,317 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  partial class RemotePluginInstallerView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.components = new System.ComponentModel.Container();
-      this.pluginsListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
-      this.nameHeader = new System.Windows.Forms.ColumnHeader();
-      this.versionHeader = new System.Windows.Forms.ColumnHeader();
-      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
-      this.pluginsImageList = new System.Windows.Forms.ImageList(this.components);
-      this.productsListView = new System.Windows.Forms.ListView();
-      this.productNameHeader = new System.Windows.Forms.ColumnHeader();
-      this.productVersionHeader = new System.Windows.Forms.ColumnHeader();
-      this.productLargeImageList = new System.Windows.Forms.ImageList(this.components);
-      this.productImageList = new System.Windows.Forms.ImageList(this.components);
-      this.productsGroupBox = new System.Windows.Forms.GroupBox();
-      this.showDetailsButton = new System.Windows.Forms.RadioButton();
-      this.showLargeIconsButton = new System.Windows.Forms.RadioButton();
-      this.installProductsButton = new System.Windows.Forms.Button();
-      this.refreshButton = new System.Windows.Forms.Button();
-      this.pluginsGroupBox = new System.Windows.Forms.GroupBox();
-      this.installPluginsButton = new System.Windows.Forms.Button();
-      this.splitContainer = new System.Windows.Forms.SplitContainer();
-      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-      this.productsGroupBox.SuspendLayout();
-      this.pluginsGroupBox.SuspendLayout();
-      this.splitContainer.Panel1.SuspendLayout();
-      this.splitContainer.Panel2.SuspendLayout();
-      this.splitContainer.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // pluginsListView
-      // 
-      this.pluginsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.pluginsListView.CheckBoxes = true;
-      this.pluginsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.nameHeader,
-            this.versionHeader,
-            this.descriptionHeader});
-      this.pluginsListView.Location = new System.Drawing.Point(6, 19);
-      this.pluginsListView.Name = "pluginsListView";
-      this.pluginsListView.ShowGroups = false;
-      this.pluginsListView.Size = new System.Drawing.Size(266, 502);
-      this.pluginsListView.SmallImageList = this.pluginsImageList;
-      this.pluginsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
-      this.pluginsListView.SuppressItemCheckedEvents = false;
-      this.pluginsListView.TabIndex = 0;
-      this.pluginsListView.UseCompatibleStateImageBehavior = false;
-      this.pluginsListView.View = System.Windows.Forms.View.Details;
-      this.pluginsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.remotePluginsListView_ItemChecked);
-      // 
-      // nameHeader
-      // 
-      this.nameHeader.Text = "Name";
-      this.nameHeader.Width = 185;
-      // 
-      // versionHeader
-      // 
-      this.versionHeader.Text = "Version";
-      this.versionHeader.Width = 93;
-      // 
-      // descriptionHeader
-      // 
-      this.descriptionHeader.Text = "Description";
-      this.descriptionHeader.Width = 250;
-      // 
-      // pluginsImageList
-      // 
-      this.pluginsImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.pluginsImageList.ImageSize = new System.Drawing.Size(16, 16);
-      this.pluginsImageList.TransparentColor = System.Drawing.Color.Transparent;
-      // 
-      // productsListView
-      // 
-      this.productsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.productsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.productNameHeader,
-            this.productVersionHeader});
-      this.productsListView.HideSelection = false;
-      this.productsListView.LargeImageList = this.productLargeImageList;
-      this.productsListView.Location = new System.Drawing.Point(6, 50);
-      this.productsListView.MultiSelect = false;
-      this.productsListView.Name = "productsListView";
-      this.productsListView.ShowGroups = false;
-      this.productsListView.Size = new System.Drawing.Size(240, 471);
-      this.productsListView.SmallImageList = this.productImageList;
-      this.productsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
-      this.productsListView.TabIndex = 18;
-      this.productsListView.UseCompatibleStateImageBehavior = false;
-      this.productsListView.View = System.Windows.Forms.View.Details;
-      this.productsListView.SelectedIndexChanged += new System.EventHandler(this.productsListView_SelectedIndexChanged);
-      // 
-      // productNameHeader
-      // 
-      this.productNameHeader.Text = "Name";
-      // 
-      // productVersionHeader
-      // 
-      this.productVersionHeader.Text = "Version";
-      // 
-      // productLargeImageList
-      // 
-      this.productLargeImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.productLargeImageList.ImageSize = new System.Drawing.Size(32, 32);
-      this.productLargeImageList.TransparentColor = System.Drawing.Color.Transparent;
-      // 
-      // productImageList
-      // 
-      this.productImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.productImageList.ImageSize = new System.Drawing.Size(16, 16);
-      this.productImageList.TransparentColor = System.Drawing.Color.Transparent;
-      // 
-      // productsGroupBox
-      // 
-      this.productsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.productsGroupBox.Controls.Add(this.showDetailsButton);
-      this.productsGroupBox.Controls.Add(this.showLargeIconsButton);
-      this.productsGroupBox.Controls.Add(this.installProductsButton);
-      this.productsGroupBox.Controls.Add(this.refreshButton);
-      this.productsGroupBox.Controls.Add(this.productsListView);
-      this.productsGroupBox.Location = new System.Drawing.Point(0, 0);
-      this.productsGroupBox.Name = "productsGroupBox";
-      this.productsGroupBox.Size = new System.Drawing.Size(252, 558);
-      this.productsGroupBox.TabIndex = 19;
-      this.productsGroupBox.TabStop = false;
-      this.productsGroupBox.Text = "Products";
-      // 
-      // showDetailsButton
-      // 
-      this.showDetailsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.showDetailsButton.Appearance = System.Windows.Forms.Appearance.Button;
-      this.showDetailsButton.Checked = true;
-      this.showDetailsButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.show_details;
-      this.showDetailsButton.Location = new System.Drawing.Point(221, 19);
-      this.showDetailsButton.Name = "showDetailsButton";
-      this.showDetailsButton.Size = new System.Drawing.Size(25, 25);
-      this.showDetailsButton.TabIndex = 22;
-      this.showDetailsButton.TabStop = true;
-      this.toolTip.SetToolTip(this.showDetailsButton, "Show Details");
-      this.showDetailsButton.UseVisualStyleBackColor = true;
-      this.showDetailsButton.CheckedChanged += new System.EventHandler(this.showDetailsButton_CheckedChanged);
-      // 
-      // showLargeIconsButton
-      // 
-      this.showLargeIconsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.showLargeIconsButton.Appearance = System.Windows.Forms.Appearance.Button;
-      this.showLargeIconsButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.show_icons;
-      this.showLargeIconsButton.Location = new System.Drawing.Point(190, 19);
-      this.showLargeIconsButton.Name = "showLargeIconsButton";
-      this.showLargeIconsButton.Size = new System.Drawing.Size(25, 25);
-      this.showLargeIconsButton.TabIndex = 21;
-      this.toolTip.SetToolTip(this.showLargeIconsButton, "Show Large Icons");
-      this.showLargeIconsButton.UseVisualStyleBackColor = true;
-      this.showLargeIconsButton.CheckedChanged += new System.EventHandler(this.showLargeIconsButton_CheckedChanged);
-      // 
-      // installProductsButton
-      // 
-      this.installProductsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.installProductsButton.Enabled = false;
-      this.installProductsButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Install;
-      this.installProductsButton.Location = new System.Drawing.Point(6, 527);
-      this.installProductsButton.Name = "installProductsButton";
-      this.installProductsButton.Size = new System.Drawing.Size(146, 25);
-      this.installProductsButton.TabIndex = 20;
-      this.installProductsButton.Text = "Install Selected Product";
-      this.installProductsButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.installProductsButton, "Install all plugins for the selected product");
-      this.installProductsButton.UseVisualStyleBackColor = true;
-      this.installProductsButton.Click += new System.EventHandler(this.installProductsButton_Click);
-      // 
-      // refreshButton
-      // 
-      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
-      this.refreshButton.Location = new System.Drawing.Point(6, 19);
-      this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(72, 25);
-      this.refreshButton.TabIndex = 16;
-      this.refreshButton.Text = "Refresh";
-      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.refreshButton, "Refresh available products from HeuristicLab deployment service");
-      this.refreshButton.UseVisualStyleBackColor = true;
-      this.refreshButton.Click += new System.EventHandler(this.refreshRemoteButton_Click);
-      // 
-      // pluginsGroupBox
-      // 
-      this.pluginsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.pluginsGroupBox.Controls.Add(this.pluginsListView);
-      this.pluginsGroupBox.Controls.Add(this.installPluginsButton);
-      this.pluginsGroupBox.Location = new System.Drawing.Point(-1, 0);
-      this.pluginsGroupBox.Name = "pluginsGroupBox";
-      this.pluginsGroupBox.Size = new System.Drawing.Size(278, 558);
-      this.pluginsGroupBox.TabIndex = 20;
-      this.pluginsGroupBox.TabStop = false;
-      this.pluginsGroupBox.Text = "Plugins";
-      // 
-      // installPluginsButton
-      // 
-      this.installPluginsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.installPluginsButton.Enabled = false;
-      this.installPluginsButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Install;
-      this.installPluginsButton.Location = new System.Drawing.Point(6, 527);
-      this.installPluginsButton.Name = "installPluginsButton";
-      this.installPluginsButton.Size = new System.Drawing.Size(140, 25);
-      this.installPluginsButton.TabIndex = 17;
-      this.installPluginsButton.Text = "Install Selected Plugins";
-      this.installPluginsButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.toolTip.SetToolTip(this.installPluginsButton, "Install only checked plugins");
-      this.installPluginsButton.UseVisualStyleBackColor = true;
-      this.installPluginsButton.Click += new System.EventHandler(this.installPluginsButton_Click);
-      // 
-      // splitContainer
-      // 
-      this.splitContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.splitContainer.Location = new System.Drawing.Point(0, 0);
-      this.splitContainer.Name = "splitContainer";
-      // 
-      // splitContainer.Panel1
-      // 
-      this.splitContainer.Panel1.Controls.Add(this.productsGroupBox);
-      // 
-      // splitContainer.Panel2
-      // 
-      this.splitContainer.Panel2.Controls.Add(this.pluginsGroupBox);
-      this.splitContainer.Size = new System.Drawing.Size(533, 558);
-      this.splitContainer.SplitterDistance = 252;
-      this.splitContainer.TabIndex = 21;
-      // 
-      // RemotePluginInstallerView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.splitContainer);
-      this.Name = "RemotePluginInstallerView";
-      this.Size = new System.Drawing.Size(533, 558);
-      this.productsGroupBox.ResumeLayout(false);
-      this.pluginsGroupBox.ResumeLayout(false);
-      this.splitContainer.Panel1.ResumeLayout(false);
-      this.splitContainer.Panel2.ResumeLayout(false);
-      this.splitContainer.ResumeLayout(false);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private MultiSelectListView pluginsListView;
-    private System.Windows.Forms.ColumnHeader nameHeader;
-    private System.Windows.Forms.ColumnHeader versionHeader;
-    private System.Windows.Forms.ColumnHeader descriptionHeader;
-    private System.Windows.Forms.Button refreshButton;
-    private System.Windows.Forms.Button installPluginsButton;
-    private System.Windows.Forms.ListView productsListView;
-    private System.Windows.Forms.GroupBox productsGroupBox;
-    private System.Windows.Forms.GroupBox pluginsGroupBox;
-    private System.Windows.Forms.SplitContainer splitContainer;
-    private System.Windows.Forms.Button installProductsButton;
-    private System.Windows.Forms.ColumnHeader productNameHeader;
-    private System.Windows.Forms.ColumnHeader productVersionHeader;
-    private System.Windows.Forms.ImageList productImageList;
-    private System.Windows.Forms.ImageList pluginsImageList;
-    private System.Windows.Forms.RadioButton showDetailsButton;
-    private System.Windows.Forms.RadioButton showLargeIconsButton;
-    private System.Windows.Forms.ToolTip toolTip;
-    private System.Windows.Forms.ImageList productLargeImageList;
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.cs	(revision 3626)
+++ 	(revision )
@@ -1,387 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-using HeuristicLab.PluginInfrastructure.Manager;
-
-namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class RemotePluginInstallerView : InstallationManagerControl {
-    private class RefreshBackgroundWorkerResult {
-      public IEnumerable<IPluginDescription> RemotePlugins { get; set; }
-      public IEnumerable<DeploymentService.ProductDescription> RemoteProducts { get; set; }
-    }
-    private class UpdateOrInstallPluginsBackgroundWorkerArgument {
-      public IEnumerable<IPluginDescription> PluginsToUpdate { get; set; }
-      public IEnumerable<IPluginDescription> PluginsToInstall { get; set; }
-    }
-    private const string PluginDiscoveryMessage = "Looking for new plugins...";
-    private BackgroundWorker refreshServerPluginsBackgroundWorker;
-    private BackgroundWorker updateOrInstallPluginsBackgroundWorker;
-
-    private IEnumerable<DeploymentService.ProductDescription> products;
-    private IEnumerable<IPluginDescription> plugins;
-
-    private IEnumerable<IPluginDescription> CheckedPlugins {
-      get {
-        return (from item in pluginsListView.Items.OfType<ListViewItem>()
-                where item.Checked
-                let plugin = item.Tag as IPluginDescription
-                where plugin != null
-                select plugin).ToList();
-      }
-    }
-
-    private InstallationManager installationManager;
-    public InstallationManager InstallationManager {
-      get { return installationManager; }
-      set { installationManager = value; }
-    }
-    private PluginManager pluginManager;
-    public PluginManager PluginManager {
-      get { return pluginManager; }
-      set { pluginManager = value; }
-    }
-    public RemotePluginInstallerView() {
-      InitializeComponent();
-      productImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.Setup_Install);
-      productLargeImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.Setup_Install);
-      pluginsImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.plugin_16);
-      refreshServerPluginsBackgroundWorker = new BackgroundWorker();
-      refreshServerPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(refreshServerPluginsBackgroundWorker_DoWork);
-      refreshServerPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshServerPluginsBackgroundWorker_RunWorkerCompleted);
-
-      updateOrInstallPluginsBackgroundWorker = new BackgroundWorker();
-      updateOrInstallPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updateOrInstallPluginsBackgroundWorker_DoWork);
-      updateOrInstallPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted);
-    }
-
-
-    #region event handlers for refresh server plugins background worker
-    void refreshServerPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        StatusView.ShowError("Connection Error",
-          "There was an error while connecting to the server." + Environment.NewLine +
-          "Please check your connection settings and user credentials.");
-      } else {
-        RefreshBackgroundWorkerResult refreshResult = (RefreshBackgroundWorkerResult)e.Result;
-        products = refreshResult.RemoteProducts;
-        plugins = refreshResult.RemotePlugins;
-        UpdateControl();
-      }
-      StatusView.UnlockUI();
-      StatusView.RemoveMessage(PluginDiscoveryMessage);
-      StatusView.HideProgressIndicator();
-    }
-
-    void refreshServerPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      RefreshBackgroundWorkerResult result = new RefreshBackgroundWorkerResult();
-      result.RemotePlugins = installationManager.GetRemotePluginList();
-      result.RemoteProducts = installationManager.GetRemoteProductList();
-      e.Result = result;
-    }
-    #endregion
-    #region event handlers for plugin update background worker
-    void updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        StatusView.ShowError("Connection Error",
-          "There was an error while connecting to the server." + Environment.NewLine +
-          "Please check your connection settings and user credentials.");
-      } else {
-        UpdateControl();
-      }
-      StatusView.UnlockUI();
-      StatusView.HideProgressIndicator();
-    }
-
-    void updateOrInstallPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      UpdateOrInstallPluginsBackgroundWorkerArgument info = (UpdateOrInstallPluginsBackgroundWorkerArgument)e.Argument;
-      if (info.PluginsToInstall.Count() > 0)
-        installationManager.Install(info.PluginsToInstall);
-      if (info.PluginsToUpdate.Count() > 0)
-        installationManager.Update(info.PluginsToUpdate);
-
-      if (info.PluginsToInstall.Count() > 0 || info.PluginsToUpdate.Count() > 0)
-        pluginManager.DiscoverAndCheckPlugins();
-    }
-    #endregion
-
-
-    #region button events
-    private void refreshRemoteButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      StatusView.ShowMessage(PluginDiscoveryMessage);
-      refreshServerPluginsBackgroundWorker.RunWorkerAsync();
-    }
-    private void installPluginsButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      var updateOrInstallInfo = new UpdateOrInstallPluginsBackgroundWorkerArgument();
-      // if there is a local plugin with same name and same major and minor version then it's an update
-      var pluginsToUpdate = from remotePlugin in CheckedPlugins
-                            let matchingLocalPlugins = from localPlugin in pluginManager.Plugins
-                                                       where localPlugin.Name == remotePlugin.Name
-                                                       where localPlugin.Version.Major == remotePlugin.Version.Major
-                                                       where localPlugin.Version.Minor == remotePlugin.Version.Minor
-                                                       where IsNewerThan(remotePlugin, localPlugin)
-                                                       select localPlugin
-                            where matchingLocalPlugins.Count() > 0
-                            select remotePlugin;
-
-      // otherwise install a new plugin
-      var pluginsToInstall = CheckedPlugins.Except(pluginsToUpdate);
-
-      updateOrInstallInfo.PluginsToInstall = pluginsToInstall;
-      updateOrInstallInfo.PluginsToUpdate = pluginsToUpdate;
-      updateOrInstallPluginsBackgroundWorker.RunWorkerAsync(updateOrInstallInfo);
-    }
-    private void installProductsButton_Click(object sender, EventArgs e) {
-      StatusView.LockUI();
-      StatusView.ShowProgressIndicator();
-      var updateOrInstallInfo = new UpdateOrInstallPluginsBackgroundWorkerArgument();
-      var selectedProduct = (DeploymentService.ProductDescription)productsListView.SelectedItems[0].Tag;
-      // if there is a local plugin with same name and same major and minor version then it's an update
-      var pluginsToUpdate = from plugin in selectedProduct.Plugins
-                            let matchingLocalPlugins = from localPlugin in pluginManager.Plugins
-                                                       where localPlugin.Name == plugin.Name
-                                                       where localPlugin.Version.Major == plugin.Version.Major
-                                                       where localPlugin.Version.Minor == plugin.Version.Minor
-                                                       where IsNewerThan(plugin, localPlugin)
-                                                       select localPlugin
-                            where matchingLocalPlugins.Count() > 0
-                            select plugin;
-
-      // otherwise install a new plugin
-      var pluginsToInstall = selectedProduct.Plugins.Except(pluginsToUpdate);
-
-      updateOrInstallInfo.PluginsToInstall = (IEnumerable<IPluginDescription>)pluginsToInstall.ToList();
-      updateOrInstallInfo.PluginsToUpdate = (IEnumerable<IPluginDescription>)pluginsToUpdate.ToList();
-      updateOrInstallPluginsBackgroundWorker.RunWorkerAsync(updateOrInstallInfo);
-    }
-
-    private void showLargeIconsButton_CheckedChanged(object sender, EventArgs e) {
-      productsListView.View = View.LargeIcon;
-    }
-
-    private void showDetailsButton_CheckedChanged(object sender, EventArgs e) {
-      productsListView.View = View.Details;
-    }
-
-    #endregion
-
-    private void UpdateControl() {
-      // clear products view
-      List<ListViewItem> productItemsToDelete = new List<ListViewItem>(productsListView.Items.OfType<ListViewItem>());
-      productItemsToDelete.ForEach(item => productsListView.Items.Remove(item));
-
-      // populate products list view
-      foreach (var product in products) {
-        var item = CreateListViewItem(product);
-        productsListView.Items.Add(item);
-      }
-      var allPluginsListViewItem = new ListViewItem();
-      allPluginsListViewItem.Text = "All Plugins";
-      allPluginsListViewItem.ImageIndex = 0;
-      productsListView.Items.Add(allPluginsListViewItem);
-      Util.ResizeColumns(productsListView.Columns.OfType<ColumnHeader>());
-    }
-
-    private void UpdatePluginsList() {
-      // clear plugins list view
-      List<ListViewItem> pluginItemsToDelete = new List<ListViewItem>(pluginsListView.Items.OfType<ListViewItem>());
-      pluginItemsToDelete.ForEach(item => pluginsListView.Items.Remove(item));
-
-      // populate plugins list
-      if (productsListView.SelectedItems.Count > 0) {
-        pluginsListView.SuppressItemCheckedEvents = true;
-
-        var selectedItem = productsListView.SelectedItems[0];
-        if (selectedItem.Text == "All Plugins") {
-          foreach (var plugin in plugins) {
-            var item = CreateListViewItem(plugin);
-            pluginsListView.Items.Add(item);
-          }
-        } else {
-          var selectedProduct = (DeploymentService.ProductDescription)productsListView.SelectedItems[0].Tag;
-          foreach (var plugin in selectedProduct.Plugins) {
-            var item = CreateListViewItem(plugin);
-            pluginsListView.Items.Add(item);
-          }
-        }
-
-        Util.ResizeColumns(pluginsListView.Columns.OfType<ColumnHeader>());
-        pluginsListView.SuppressItemCheckedEvents = false;
-      }
-    }
-
-    private ListViewItem CreateListViewItem(DeploymentService.ProductDescription product) {
-      ListViewItem item = new ListViewItem(new string[] { product.Name, product.Version.ToString() });
-      item.Tag = product;
-      item.ImageIndex = 0;
-      return item;
-    }
-
-    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
-      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });
-      item.Tag = plugin;
-      item.ImageIndex = 0;
-      return item;
-    }
-
-    #region products list view events
-    private void productsListView_SelectedIndexChanged(object sender, EventArgs e) {
-      UpdatePluginsList();
-      installProductsButton.Enabled = (productsListView.SelectedItems.Count > 0 &&
-        productsListView.SelectedItems[0].Text != "All Plugins");
-    }
-    #endregion
-
-    #region item checked event handler
-    private void remotePluginsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
-      foreach (ListViewItem item in pluginsListView.SelectedItems) {
-        // dispatch by check state and type of item (product/plugin)
-        IPluginDescription plugin = item.Tag as IPluginDescription;
-        if (plugin != null)
-          if (e.Item.Checked)
-            HandlePluginChecked(plugin);
-          else
-            HandlePluginUnchecked(plugin);
-        else {
-          DeploymentService.ProductDescription product = item.Tag as DeploymentService.ProductDescription;
-          if (product != null)
-            if (e.Item.Checked)
-              HandleProductChecked(product);
-            else
-              HandleProductUnchecked(product);
-        }
-      }
-      installPluginsButton.Enabled = pluginsListView.CheckedItems.Count > 0;
-    }
-
-    private void HandleProductUnchecked(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription product) {
-      // also uncheck the plugins of the product
-      List<ListViewItem> modifiedItems = new List<ListViewItem>();
-      modifiedItems.Add(FindItemForProduct(product));
-      foreach (var plugin in product.Plugins) {
-        // there can be multiple entries for a single plugin in different groups
-        foreach (var item in FindItemsForPlugin(plugin)) {
-          if (item != null && item.Checked)
-            modifiedItems.Add(item);
-        }
-      }
-      pluginsListView.UncheckItems(modifiedItems);
-    }
-
-    private void HandleProductChecked(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription product) {
-      // also check all plugins of the product
-      List<ListViewItem> modifiedItems = new List<ListViewItem>();
-      modifiedItems.Add(FindItemForProduct(product));
-      foreach (var plugin in product.Plugins) {
-        // there can be multiple entries for a single plugin in different groups
-        foreach (var item in FindItemsForPlugin(plugin)) {
-          if (item != null && !item.Checked) {
-            if (!modifiedItems.Contains(item))
-              modifiedItems.Add(item);
-          }
-        }
-      }
-      pluginsListView.CheckItems(modifiedItems);
-    }
-
-    private void HandlePluginUnchecked(IPluginDescription plugin) {
-      // also uncheck all dependent plugins
-      List<ListViewItem> modifiedItems = new List<ListViewItem>();
-      modifiedItems.AddRange(FindItemsForPlugin(plugin));
-      var dependentPlugins = from otherPlugin in plugins
-                             where otherPlugin.Dependencies.Any(dep => dep.Name == plugin.Name && dep.Version == plugin.Version)
-                             select otherPlugin;
-      foreach (var dependentPlugin in dependentPlugins) {
-        // there can be multiple entries for a single plugin in different groups
-        foreach (var item in FindItemsForPlugin(dependentPlugin)) {
-          if (item != null && item.Checked) {
-            if (!modifiedItems.Contains(item))
-              modifiedItems.Add(item);
-          }
-        }
-      }
-      // also uncheck all products containing this plugin
-      var dependentProducts = from product in products
-                              where product.Plugins.Any(p => p.Name == plugin.Name && p.Version == plugin.Version)
-                              select product;
-      foreach (var dependentProduct in dependentProducts) {
-        var item = FindItemForProduct(dependentProduct);
-        if (item != null && item.Checked) {
-          if (!modifiedItems.Contains(item))
-            modifiedItems.Add(item);
-        }
-      }
-      pluginsListView.UncheckItems(modifiedItems);
-    }
-
-    private void HandlePluginChecked(IPluginDescription plugin) {
-      // also check all dependencies
-      List<ListViewItem> modifiedItems = new List<ListViewItem>();
-      modifiedItems.AddRange(FindItemsForPlugin(plugin));
-      foreach (var dep in plugin.Dependencies) {
-        // there can be multiple entries for a single plugin in different groups
-        foreach (ListViewItem item in FindItemsForPlugin(dep)) {
-          if (item != null && !item.Checked) {
-            if (!modifiedItems.Contains(item))
-              modifiedItems.Add(item);
-          }
-        }
-      }
-      pluginsListView.CheckItems(modifiedItems);
-    }
-
-    #endregion
-
-    #region helper methods
-    private IEnumerable<ListViewItem> FindItemsForPlugin(IPluginDescription plugin) {
-      return (from item in pluginsListView.Items.OfType<ListViewItem>()
-              let otherPlugin = item.Tag as IPluginDescription
-              where otherPlugin != null && otherPlugin.Name == plugin.Name && otherPlugin.Version == plugin.Version
-              select item);
-    }
-
-    private ListViewItem FindItemForProduct(DeploymentService.ProductDescription product) {
-      return (from item in pluginsListView.Items.OfType<ListViewItem>()
-              let otherProduct = item.Tag as DeploymentService.ProductDescription
-              where otherProduct != null && otherProduct.Name == product.Name && otherProduct.Version == product.Version
-              select item).SingleOrDefault();
-    }
-
-    private bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
-      // newer: build version is higher, or if build version is the same revision is higher
-      if (plugin1.Version.Build < plugin2.Version.Build) return false;
-      else if (plugin1.Version.Build > plugin2.Version.Build) return true;
-      else return plugin1.Version.Revision > plugin2.Version.Revision;
-    }
-    #endregion
-
-  }
-}
Index: unk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.resx	(revision 3626)
+++ 	(revision )
@@ -1,132 +1,0 @@
-<?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>
-  <metadata name="pluginsImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>365, 17</value>
-  </metadata>
-  <metadata name="productLargeImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>29, 18</value>
-  </metadata>
-  <metadata name="productImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>191, 17</value>
-  </metadata>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>508, 17</value>
-  </metadata>
-</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/UploadPluginsView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/UploadPluginsView.Designer.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/UploadPluginsView.Designer.cs	(revision 3627)
@@ -0,0 +1,161 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class UploadPluginsView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.uploadButton = new System.Windows.Forms.Button();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.listView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
+      this.pluginNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.localVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.serverVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // uploadButton
+      // 
+      this.uploadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.uploadButton.Enabled = false;
+      this.uploadButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.PublishToWebHS;
+      this.uploadButton.Location = new System.Drawing.Point(78, 482);
+      this.uploadButton.Name = "uploadButton";
+      this.uploadButton.Size = new System.Drawing.Size(114, 26);
+      this.uploadButton.TabIndex = 7;
+      this.uploadButton.Text = "Upload Selected";
+      this.uploadButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.uploadButton, "Upload selected plugins to the server");
+      this.uploadButton.UseVisualStyleBackColor = true;
+      this.uploadButton.Click += new System.EventHandler(this.uploadButton_Click);
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
+      this.refreshButton.Location = new System.Drawing.Point(0, 482);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(72, 26);
+      this.refreshButton.TabIndex = 6;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.refreshButton, "Update list of plugins from the server");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // listView
+      // 
+      this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.listView.CheckBoxes = true;
+      this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.pluginNameHeader,
+            this.localVersionHeader,
+            this.serverVersionHeader,
+            this.descriptionHeader});
+      this.listView.Location = new System.Drawing.Point(0, 0);
+      this.listView.Name = "listView";
+      this.listView.Size = new System.Drawing.Size(539, 476);
+      this.listView.SmallImageList = this.pluginImageList;
+      this.listView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.listView.SuppressItemCheckedEvents = false;
+      this.listView.TabIndex = 8;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.View = System.Windows.Forms.View.Details;
+      this.listView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listView_ItemChecked);
+      // 
+      // pluginNameHeader
+      // 
+      this.pluginNameHeader.Text = "Name";
+      this.pluginNameHeader.Width = 40;
+      // 
+      // localVersionHeader
+      // 
+      this.localVersionHeader.Text = "Local Version";
+      this.localVersionHeader.Width = 76;
+      // 
+      // serverVersionHeader
+      // 
+      this.serverVersionHeader.Text = "Server Version";
+      this.serverVersionHeader.Width = 81;
+      // 
+      // descriptionHeader
+      // 
+      this.descriptionHeader.Text = "Description";
+      this.descriptionHeader.Width = 335;
+      // 
+      // pluginImageList
+      // 
+      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // PluginEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.listView);
+      this.Controls.Add(this.uploadButton);
+      this.Controls.Add(this.refreshButton);
+      this.Name = "PluginEditor";
+      this.Size = new System.Drawing.Size(539, 508);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.Button uploadButton;
+    private MultiSelectListView listView;
+    private System.Windows.Forms.ColumnHeader pluginNameHeader;
+    private System.Windows.Forms.ColumnHeader localVersionHeader;
+    private System.Windows.Forms.ColumnHeader serverVersionHeader;
+    private System.Windows.Forms.ColumnHeader descriptionHeader;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ImageList pluginImageList;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/UploadPluginsView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/UploadPluginsView.cs	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/UploadPluginsView.cs	(revision 3627)
@@ -0,0 +1,305 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.ServiceModel;
+using ICSharpCode.SharpZipLib.Zip;
+using System.IO;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class UploadPluginsView : InstallationManagerControl {
+    private const string UploadMessage = "Uploading plugins...";
+    private const string RefreshMessage = "Downloading plugin information from deployment service...";
+
+    private Dictionary<IPluginDescription, IPluginDescription> localAndServerPlugins;
+    private BackgroundWorker pluginUploadWorker;
+    private BackgroundWorker refreshPluginsWorker;
+
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set { pluginManager = value; }
+    }
+
+    public UploadPluginsView() {
+      InitializeComponent();
+      pluginImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Resources.plugin_16);
+      localAndServerPlugins = new Dictionary<IPluginDescription, IPluginDescription>();
+
+      #region initialize backgroundworkers
+      pluginUploadWorker = new BackgroundWorker();
+      pluginUploadWorker.DoWork += new DoWorkEventHandler(pluginUploadWorker_DoWork);
+      pluginUploadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(pluginUploadWorker_RunWorkerCompleted);
+
+      refreshPluginsWorker = new BackgroundWorker();
+      refreshPluginsWorker.DoWork += new DoWorkEventHandler(refreshPluginsWorker_DoWork);
+      refreshPluginsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshPluginsWorker_RunWorkerCompleted);
+      #endregion
+    }
+
+    #region refresh plugins from server backgroundworker
+    void refreshPluginsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+                   "Please check your connection settings and user credentials.");
+      } else {
+        UpdatePluginListView((IEnumerable<IPluginDescription>)e.Result);
+      }
+      StatusView.HideProgressIndicator();
+      StatusView.RemoveMessage(RefreshMessage);
+      StatusView.UnlockUI();
+    }
+
+    void refreshPluginsWorker_DoWork(object sender, DoWorkEventArgs e) {
+      // refresh available plugins
+      var client = DeploymentService.UpdateClientFactory.CreateClient();
+      try {
+        e.Result = client.GetPlugins();
+        client.Close();
+      }
+      catch (TimeoutException) {
+        client.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        client.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        client.Abort();
+        throw;
+      }
+    }
+    #endregion
+
+    #region upload plugins to server backgroundworker
+    void pluginUploadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+                   "Please check your connection settings and user credentials.");
+      } else {
+        UpdatePluginListView((IEnumerable<IPluginDescription>)e.Result);
+      }
+      StatusView.RemoveMessage(UploadMessage);
+      StatusView.HideProgressIndicator();
+      StatusView.UnlockUI();
+    }
+
+    void pluginUploadWorker_DoWork(object sender, DoWorkEventArgs e) {
+      // upload plugins
+      var selectedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
+      DeploymentService.AdminClient adminClient = DeploymentService.AdminClientFactory.CreateClient();
+      try {
+        foreach (var plugin in IteratePlugins(selectedPlugins)) {
+          adminClient.DeployPlugin(MakePluginDescription(plugin), CreateZipPackage(plugin));
+        }
+        adminClient.Close();
+      }
+      catch (TimeoutException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        adminClient.Abort();
+        throw;
+      }
+      // refresh available plugins
+      var client = DeploymentService.UpdateClientFactory.CreateClient();
+      try {
+        e.Result = client.GetPlugins();
+        client.Close();
+      }
+      catch (TimeoutException) {
+        client.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        client.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        client.Abort();
+        throw;
+      }
+    }
+    #endregion
+
+
+    #region button events
+    private void uploadButton_Click(object sender, EventArgs e) {
+      var selectedPlugins = from item in listView.Items.Cast<ListViewItem>()
+                            where item.Checked
+                            where item.Tag is IPluginDescription
+                            select item.Tag as IPluginDescription;
+      if (selectedPlugins.Count() > 0) {
+        StatusView.LockUI();
+        StatusView.ShowProgressIndicator();
+        StatusView.ShowMessage(UploadMessage);
+        pluginUploadWorker.RunWorkerAsync(selectedPlugins.ToList());
+      }
+    }
+
+    private void refreshButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(RefreshMessage);
+      refreshPluginsWorker.RunWorkerAsync();
+    }
+
+    #endregion
+
+    #region item list events
+    private bool ignoreItemCheckedEvents = false;
+    private void listView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      if (ignoreItemCheckedEvents) return;
+      List<IPluginDescription> modifiedPlugins = new List<IPluginDescription>();
+      if (e.Item.Checked) {
+        foreach (ListViewItem item in listView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          // also check all dependencies
+          if (!modifiedPlugins.Contains(plugin))
+            modifiedPlugins.Add(plugin);
+          foreach (var dep in Util.GetAllDependencies(plugin)) {
+            if (!modifiedPlugins.Contains(dep))
+              modifiedPlugins.Add(dep);
+          }
+        }
+        listView.CheckItems(modifiedPlugins.Select(x => FindItemForPlugin(x)));
+      } else {
+        foreach (ListViewItem item in listView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          // also uncheck all dependent plugins
+          if (!modifiedPlugins.Contains(plugin))
+            modifiedPlugins.Add(plugin);
+          foreach (var dep in Util.GetAllDependents(plugin, localAndServerPlugins.Keys)) {
+            if (!modifiedPlugins.Contains(dep))
+              modifiedPlugins.Add(dep);
+          }
+        }
+        listView.UncheckItems(modifiedPlugins.Select(x => FindItemForPlugin(x)));
+      }
+      uploadButton.Enabled = (from i in listView.Items.OfType<ListViewItem>()
+                              where i.Checked
+                              select i).Any();
+    }
+    #endregion
+
+    #region helper methods
+    private void UpdatePluginListView(IEnumerable<IPluginDescription> remotePlugins) {
+      // refresh local plugins
+      localAndServerPlugins.Clear();
+      foreach (var plugin in pluginManager.Plugins) {
+        localAndServerPlugins.Add(plugin, null);
+      }
+      foreach (var plugin in remotePlugins) {
+        var matchingLocalPlugin = (from localPlugin in localAndServerPlugins.Keys
+                                   where localPlugin.Name == plugin.Name
+                                   where localPlugin.Version == localPlugin.Version
+                                   select localPlugin).SingleOrDefault();
+        if (matchingLocalPlugin != null) {
+          localAndServerPlugins[matchingLocalPlugin] = plugin;
+        }
+      }
+      // refresh the list view with plugins
+      listView.Items.Clear();
+      ignoreItemCheckedEvents = true;
+      foreach (var pair in localAndServerPlugins) {
+        var item = MakeListViewItem(pair.Key);
+        listView.Items.Add(item);
+      }
+      Util.ResizeColumns(listView.Columns.OfType<ColumnHeader>());
+      ignoreItemCheckedEvents = false;
+    }
+
+    private IEnumerable<IPluginDescription> IteratePlugins(IEnumerable<IPluginDescription> plugins) {
+      HashSet<IPluginDescription> yieldedItems = new HashSet<IPluginDescription>();
+      foreach (var plugin in plugins) {
+        foreach (var dependency in IteratePlugins(plugin.Dependencies)) {
+          if (!yieldedItems.Contains(dependency)) {
+            yieldedItems.Add(dependency);
+            yield return dependency;
+          }
+        }
+        if (!yieldedItems.Contains(plugin)) {
+          yieldedItems.Add(plugin);
+          yield return plugin;
+        }
+      }
+    }
+
+    private byte[] CreateZipPackage(IPluginDescription plugin) {
+      using (MemoryStream stream = new MemoryStream()) {
+        ZipFile zipFile = new ZipFile(stream);
+        zipFile.BeginUpdate();
+        foreach (var file in plugin.Files) {
+          zipFile.Add(file.Name);
+        }
+        zipFile.CommitUpdate();
+        stream.Seek(0, SeekOrigin.Begin);
+        return stream.GetBuffer();
+      }
+    }
+
+    private ListViewItem MakeListViewItem(IPluginDescription plugin) {
+      ListViewItem item;
+      if (localAndServerPlugins[plugin] != null) {
+        item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
+          localAndServerPlugins[plugin].Version.ToString(), localAndServerPlugins[plugin].Description });
+        if (plugin.Version <= localAndServerPlugins[plugin].Version)
+          item.ForeColor = Color.Gray;
+      } else {
+        item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
+          string.Empty, plugin.Description });
+      }
+      item.Tag = plugin;
+      item.ImageIndex = 0;
+      item.Checked = false;
+      return item;
+    }
+
+    private ListViewItem FindItemForPlugin(IPluginDescription dep) {
+      return (from i in listView.Items.Cast<ListViewItem>()
+              where i.Tag == dep
+              select i).Single();
+    }
+
+    private DeploymentService.PluginDescription MakePluginDescription(IPluginDescription plugin) {
+      var dependencies = from dep in plugin.Dependencies
+                         select MakePluginDescription(dep);
+      return new DeploymentService.PluginDescription(plugin.Name, plugin.Version, dependencies, plugin.ContactName, plugin.ContactEmail, plugin.LicenseText);
+    }
+    #endregion
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/UploadPluginsView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/UploadPluginsView.resx	(revision 3627)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/UploadPluginsView.resx	(revision 3627)
@@ -0,0 +1,126 @@
+<?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>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="pluginImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/Util.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/Util.cs	(revision 3626)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/Util.cs	(revision 3627)
@@ -46,4 +46,31 @@
         ResizeColumn(columnHeader);
     }
+
+    internal static IEnumerable<IPluginDescription> GetAllDependents(IPluginDescription plugin, IEnumerable<IPluginDescription> availablePlugins) {
+      return from p in availablePlugins
+             let matchingEntries = from dep in GetAllDependencies(p)
+                                   where dep.Name == plugin.Name
+                                   where dep.Version == plugin.Version
+                                   select dep
+             where matchingEntries.Any()
+             select p as IPluginDescription;
+    }
+
+    internal static IEnumerable<IPluginDescription> GetAllDependencies(IPluginDescription plugin) {
+      HashSet<IPluginDescription> yieldedPlugins = new HashSet<IPluginDescription>();
+      foreach (var dep in plugin.Dependencies) {
+        foreach (var recDep in GetAllDependencies(dep)) {
+          if (!yieldedPlugins.Contains(recDep)) {
+            yieldedPlugins.Add(recDep);
+            yield return recDep;
+          }
+        }
+        if (!yieldedPlugins.Contains(dep)) {
+          yieldedPlugins.Add(dep);
+          yield return dep;
+        }
+      }
+    }
+
   }
 }
