diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Debug.config b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Debug.config new file mode 100644 index 00000000..18e7f2ee --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Debug.config @@ -0,0 +1,20 @@ + + + +
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Release.config b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Release.config new file mode 100644 index 00000000..60bc4b39 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.Release.config @@ -0,0 +1,20 @@ + + + +
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config new file mode 100644 index 00000000..60bc4b39 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/App.config @@ -0,0 +1,20 @@ + + + +
+ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.Designer.cs new file mode 100644 index 00000000..1eba1298 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.Designer.cs @@ -0,0 +1,243 @@ +namespace WebsitePanel.Installer +{ + partial class ApplicationForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ApplicationForm)); + this.statusBar = new System.Windows.Forms.StatusStrip(); + this.statusBarLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.scopeTree = new System.Windows.Forms.TreeView(); + this.smallImages = new System.Windows.Forms.ImageList(this.components); + this.pnlRight = new System.Windows.Forms.Panel(); + this.pnlResultView = new System.Windows.Forms.Panel(); + this.pnlDescription = new System.Windows.Forms.Panel(); + this.lblResultViewPath = new System.Windows.Forms.Label(); + this.lblResultViewTitle = new System.Windows.Forms.Label(); + this.pictureBox = new System.Windows.Forms.PictureBox(); + this.backgroundWorker = new System.ComponentModel.BackgroundWorker(); + this.lineBox2 = new WebsitePanel.Installer.LineBox(); + this.topLogoControl = new WebsitePanel.Installer.TopLogoControl(); + this.statusBar.SuspendLayout(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.pnlRight.SuspendLayout(); + this.pnlDescription.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); + this.SuspendLayout(); + // + // statusBar + // + this.statusBar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Visible; + this.statusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statusBarLabel}); + this.statusBar.Location = new System.Drawing.Point(0, 431); + this.statusBar.Name = "statusBar"; + this.statusBar.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.statusBar.Size = new System.Drawing.Size(632, 22); + this.statusBar.TabIndex = 1; + // + // statusBarLabel + // + this.statusBarLabel.Name = "statusBarLabel"; + this.statusBarLabel.Size = new System.Drawing.Size(39, 17); + this.statusBarLabel.Text = "Ready"; + // + // splitContainer + // + this.splitContainer.BackColor = System.Drawing.SystemColors.Control; + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.Location = new System.Drawing.Point(0, 63); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.scopeTree); + this.splitContainer.Panel1.Padding = new System.Windows.Forms.Padding(0, 1, 0, 0); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.pnlRight); + this.splitContainer.Panel2.Padding = new System.Windows.Forms.Padding(0, 1, 0, 0); + this.splitContainer.Size = new System.Drawing.Size(632, 368); + this.splitContainer.SplitterDistance = 250; + this.splitContainer.SplitterWidth = 2; + this.splitContainer.TabIndex = 2; + // + // scopeTree + // + this.scopeTree.Dock = System.Windows.Forms.DockStyle.Fill; + this.scopeTree.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.scopeTree.HideSelection = false; + this.scopeTree.ImageIndex = 0; + this.scopeTree.ImageList = this.smallImages; + this.scopeTree.ItemHeight = 19; + this.scopeTree.Location = new System.Drawing.Point(0, 1); + this.scopeTree.Name = "scopeTree"; + this.scopeTree.SelectedImageIndex = 0; + this.scopeTree.ShowLines = false; + this.scopeTree.Size = new System.Drawing.Size(250, 367); + this.scopeTree.TabIndex = 0; + this.scopeTree.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.OnScopeTreeBeforeExpand); + this.scopeTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.OnScopeTreeAfterSelect); + // + // smallImages + // + this.smallImages.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.smallImages.ImageSize = new System.Drawing.Size(16, 16); + this.smallImages.TransparentColor = System.Drawing.Color.Transparent; + // + // pnlRight + // + this.pnlRight.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlRight.Controls.Add(this.pnlResultView); + this.pnlRight.Controls.Add(this.pnlDescription); + this.pnlRight.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlRight.Location = new System.Drawing.Point(0, 1); + this.pnlRight.Name = "pnlRight"; + this.pnlRight.Size = new System.Drawing.Size(380, 367); + this.pnlRight.TabIndex = 0; + // + // pnlResultView + // + this.pnlResultView.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlResultView.Location = new System.Drawing.Point(0, 63); + this.pnlResultView.Name = "pnlResultView"; + this.pnlResultView.Size = new System.Drawing.Size(376, 300); + this.pnlResultView.TabIndex = 14; + // + // pnlDescription + // + this.pnlDescription.Controls.Add(this.lineBox2); + this.pnlDescription.Controls.Add(this.lblResultViewPath); + this.pnlDescription.Controls.Add(this.lblResultViewTitle); + this.pnlDescription.Controls.Add(this.pictureBox); + this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Top; + this.pnlDescription.Location = new System.Drawing.Point(0, 0); + this.pnlDescription.Name = "pnlDescription"; + this.pnlDescription.Size = new System.Drawing.Size(376, 63); + this.pnlDescription.TabIndex = 13; + // + // lblResultViewPath + // + this.lblResultViewPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblResultViewPath.AutoEllipsis = true; + this.lblResultViewPath.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblResultViewPath.Location = new System.Drawing.Point(47, 28); + this.lblResultViewPath.Name = "lblResultViewPath"; + this.lblResultViewPath.Size = new System.Drawing.Size(251, 21); + this.lblResultViewPath.TabIndex = 15; + this.lblResultViewPath.Text = "Path"; + // + // lblResultViewTitle + // + this.lblResultViewTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblResultViewTitle.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblResultViewTitle.Location = new System.Drawing.Point(47, 8); + this.lblResultViewTitle.Name = "lblResultViewTitle"; + this.lblResultViewTitle.Size = new System.Drawing.Size(318, 20); + this.lblResultViewTitle.TabIndex = 14; + this.lblResultViewTitle.Text = "Title"; + // + // pictureBox + // + this.pictureBox.Location = new System.Drawing.Point(9, 8); + this.pictureBox.Name = "pictureBox"; + this.pictureBox.Size = new System.Drawing.Size(32, 32); + this.pictureBox.TabIndex = 13; + this.pictureBox.TabStop = false; + // + // lineBox2 + // + this.lineBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lineBox2.Location = new System.Drawing.Point(6, 51); + this.lineBox2.Name = "lineBox2"; + this.lineBox2.Size = new System.Drawing.Size(366, 2); + this.lineBox2.TabIndex = 16; + this.lineBox2.TabStop = false; + this.lineBox2.Text = "lineBox2"; + // + // topLogoControl + // + this.topLogoControl.BackColor = System.Drawing.Color.White; + this.topLogoControl.Dock = System.Windows.Forms.DockStyle.Top; + this.topLogoControl.Location = new System.Drawing.Point(0, 0); + this.topLogoControl.Name = "topLogoControl"; + this.topLogoControl.Size = new System.Drawing.Size(632, 63); + this.topLogoControl.TabIndex = 3; + // + // ApplicationForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(632, 453); + this.Controls.Add(this.splitContainer); + this.Controls.Add(this.statusBar); + this.Controls.Add(this.topLogoControl); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MinimumSize = new System.Drawing.Size(640, 480); + this.Name = "ApplicationForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "WebsitePanel Installer"; + this.Shown += new System.EventHandler(this.OnApplicationFormShown); + this.statusBar.ResumeLayout(false); + this.statusBar.PerformLayout(); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + this.splitContainer.ResumeLayout(false); + this.pnlRight.ResumeLayout(false); + this.pnlDescription.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.StatusStrip statusBar; + private System.Windows.Forms.SplitContainer splitContainer; + private System.Windows.Forms.Panel pnlRight; + private TopLogoControl topLogoControl; + private System.Windows.Forms.TreeView scopeTree; + private System.Windows.Forms.Panel pnlDescription; + private LineBox lineBox2; + private System.Windows.Forms.Label lblResultViewPath; + private System.Windows.Forms.Label lblResultViewTitle; + private System.Windows.Forms.PictureBox pictureBox; + private System.Windows.Forms.ToolStripStatusLabel statusBarLabel; + private System.Windows.Forms.ImageList smallImages; + private System.Windows.Forms.Panel pnlResultView; + private System.ComponentModel.BackgroundWorker backgroundWorker; + } +} \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.cs new file mode 100644 index 00000000..75c23392 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.cs @@ -0,0 +1,650 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.IO; +using System.Diagnostics; +using System.Net; +using System.Configuration; +using System.Threading; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Microsoft.Win32; + +using WebsitePanel.Installer.Common; +using WebsitePanel.Installer.Controls; +using WebsitePanel.Installer.Services; +using WebsitePanel.Installer.Configuration; +using System.Xml; +using System.Runtime.Remoting.Lifetime; +using WebsitePanel.Installer.Core; + +namespace WebsitePanel.Installer +{ + /// + /// Main application form + /// + internal partial class ApplicationForm : Form + { + private ProgressManager progressManager; + private ScopeNode activeScopeNode; + private static ApplicationForm instance; + delegate void VoidCallback(); + + #region Constructor + + /// + /// Initializes a new instance of the ApplicationForm class. + /// + internal ApplicationForm() + { + InitializeComponent(); + if (DesignMode) + { + return; + } + } + #endregion + + #region Scope tree + + /// + /// Adds predefined nodes + /// + private void AddDefaultNodes() + { + scopeTree.Nodes.Clear(); + ScopeNode componentsNode = AddScopeNode(null, "Components", Properties.Resources.Folder32, Properties.Resources.Folder16, new ComponentsControl(), NodeType.Components, null); + AddScopeNode(null, "Application Settings", Properties.Resources.Tool32, Properties.Resources.Tool16, new SettingsControl(), NodeType.Settings, null); + componentsNode.Expand(); + ExpandScopeNode(componentsNode); + scopeTree.SelectedNode = componentsNode; + + } + + /// + /// Adds scope node to the scope tree + /// + internal ScopeNode AddScopeNode(ScopeNode parent, string text, Icon largeIcon, Icon smallIcon, ResultViewControl resultView, NodeType nodeType, object tag) + { + string smallIconName = smallIcon.GetHashCode().ToString(); + if (!this.smallImages.Images.ContainsKey(smallIconName)) + { + this.smallImages.Images.Add(smallIconName, smallIcon); + } + ScopeNode node = new ScopeNode(); + node.Text = text; + node.ResultView = resultView; + node.SmallIcon = smallIcon; + node.LargeIcon = largeIcon; + node.ImageKey = smallIconName; + node.SelectedImageKey = smallIconName; + node.NodeType = nodeType; + node.Populated = false; + node.Tag = tag; + if (parent == null) + { + scopeTree.Nodes.Add(node); + } + else + { + parent.Nodes.Add(node); + } + //add fake node to show + + node.Nodes.Add(" "); + return node; + } + + + /// + /// Adds component node to the scope tree + /// + internal ScopeNode AddComponentNode(ScopeNode parent, string text, object tag) + { + return AddScopeNode(parent, text, Properties.Resources.Service32, Properties.Resources.Service16, new ComponentControl(), NodeType.Component, tag); + } + + /// + /// Actions on select node in the scope tree + /// + private void OnScopeTreeAfterSelect(object sender, TreeViewEventArgs e) + { + ScopeNode node = e.Node as ScopeNode; + //node.ContextMenuStrip = scopeItemContextMenu; + ExpandScopeNode(node); + PopulateResultView(node); + activeScopeNode = node; + } + + /// + /// Expands scope node in the scope tree + /// + private void ExpandScopeNode(ScopeNode node) + { + if (node != null) + { + if (!node.Populated) + { + node.Nodes.Clear(); + StartProgress("Loading..."); + string text = node.Text; + node.Text += " expanding..."; + scopeTree.Update(); + scopeTree.BeginUpdate(); + switch (node.NodeType) + { + /*case NodeType.Servers: + LoadServers(node); + break; + case NodeType.Server: + LoadServerComponents(node); + break;*/ + case NodeType.Components: + LoadInstalledComponents(node); + break; + } + node.Text = text; + node.Populated = true; + node.Expand(); + scopeTree.EndUpdate(); + FinishProgress(); + } + } + } + + /// + /// Action on expanding scope tree node + /// + /// + /// + private void OnScopeTreeBeforeExpand(object sender, TreeViewCancelEventArgs e) + { + ScopeNode node = e.Node as ScopeNode; + ExpandScopeNode(node); + } + #endregion + + #region Result view + + /// + /// Displays result view control + /// + /// + private void PopulateResultView(ScopeNode parentNode) + { + this.SuspendLayout(); + pnlResultView.Controls.Clear(); + if (parentNode.LargeIcon != null) + { + pictureBox.Image = parentNode.LargeIcon.ToBitmap(); + } + else + { + pictureBox.Image = Properties.Resources.Folder32.ToBitmap(); + } + lblResultViewTitle.Text = parentNode.Text; + lblResultViewPath.Text = parentNode.FullPath; + ResultViewControl control = parentNode.ResultView; + if (control != null) + { + pnlResultView.Controls.Add(control); + control.Dock = DockStyle.Fill; + try + { + AppContext context = new AppContext(); + context.AppForm = this; + context.ScopeNode = parentNode; + control.ShowControl(context); + } + catch (Exception ex) + { + Log.WriteError("Console error", ex); + ShowError(ex); + } + } + this.ResumeLayout(false); + this.PerformLayout(); + } + + #endregion + + #region Console + + /// + /// Application form instance + /// + internal static ApplicationForm Instance + { + get { return instance; } + } + + /// + /// Current version + /// + public string Version + { + get + { + return this.GetType().Assembly.GetName().Version.ToString(); + } + } + + /// + /// Reloads application + /// + internal void ReloadApplication() + { + //thread safe call + if (this.InvokeRequired) + { + VoidCallback callback = new VoidCallback(ReloadApplication); + this.Invoke(callback); + } + else + { + AppConfigManager.LoadConfiguration(); + Update(); + //LoadConfiguration(); + ScopeNode componentsNode = scopeTree.Nodes[0] as ScopeNode; + componentsNode.Nodes.Clear(); + componentsNode.Populated = false; + OnScopeTreeAfterSelect(scopeTree, new TreeViewEventArgs(componentsNode)); + } + } + + /// + /// Initializes application + /// + internal void InitializeApplication() + { + CheckForIllegalCrossThreadCalls = false; + LifetimeServices.LeaseTime = TimeSpan.Zero; + + this.splitContainer.Panel2MinSize = 380; + this.splitContainer.Panel1MinSize = 150; + this.progressManager = new ProgressManager(this, this.statusBarLabel); + instance = this; + + AddDefaultNodes(); + + } + + /// + /// Disables application content + /// + internal void DisableContent() + { + scopeTree.Enabled = false; + pnlResultView.Enabled = false; + } + + /// + /// Enables application content + /// + internal void EnableContent() + { + scopeTree.Enabled = true; + pnlResultView.Enabled = true; + } + + /// + /// Shows error message + /// + /// Message + internal void ShowError(string message) + { + MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + /// + /// Shows default web error message + /// + internal void ShowServerError() + { + ShowError("An error occurred while connecting to the remote server. Please check your internet connection."); + } + + /// + /// Shows default error message + /// + internal void ShowError() + { + ShowError("An unexpected error has occurred. We apologize for this inconvenience.\n" + + "Please contact Technical Support at support@websitepanel.net.\n\n" + + "Make sure you include a copy of the Installer.log file from the\n" + + "WebsitePanel Installer home directory."); + } + + /// + /// Shows security error message + /// + internal void ShowSecurityError() + { + ShowError(Global.Messages.NotEnoughPermissionsError); + } + + internal void ShowError(Exception ex) + { + if (Utils.IsSecurityException(ex)) + ShowSecurityError(); + else + ShowError(); + } + + + /// + /// Shows info message + /// + /// + internal void ShowInfo(string message) + { + MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + /// + /// Shows warning message + /// + /// + internal void ShowWarning(string message) + { + MessageBox.Show(this, message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + + /// + /// Loads installed components from configuration file + /// + private void LoadInstalledComponents(ScopeNode node) + { + Log.WriteStart("Loading installed components"); + node.Nodes.Clear(); + + foreach (ComponentConfigElement componentConfig in AppConfigManager.AppConfiguration.Components) + { + string instance = string.Empty; + if (componentConfig.Settings["Instance"] != null && + !string.IsNullOrEmpty(componentConfig.Settings["Instance"].Value)) + { + instance = "(" + componentConfig.Settings["Instance"].Value + ")"; + } + string title = string.Format("{0} {1} {2} {3}", + componentConfig.Settings["ApplicationName"].Value, + componentConfig.Settings["ComponentName"].Value, + componentConfig.Settings["Release"].Value, + instance); + + AddComponentNode(node, title, componentConfig); + } + node.Populated = true; + Log.WriteEnd(string.Format("{0} installed component(s) loaded", AppConfigManager.AppConfiguration.Components.Count)); + } + + /// + /// Returns installer web service + /// + internal InstallerService WebService + { + get + { + return ServiceProviderProxy.GetInstallerWebService(); + } + } + + /// + /// Checks for the application update + /// + /// File name + /// true if update is available for download; otherwise false + internal bool CheckForUpdate(out string fileName) + { + bool ret = false; + fileName = string.Empty; + Log.WriteStart("Checking for a new version"); + // + var webService = ServiceProviderProxy.GetInstallerWebService(); + DataSet ds = webService.GetLatestComponentUpdate("cfg core"); + // + Log.WriteEnd("Checked for a new version"); + if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) + { + DataRow row = ds.Tables[0].Rows[0]; + Version currentVersion = GetType().Assembly.GetName().Version; + Version newVersion = null; + try + { + newVersion = new Version(row["Version"].ToString()); + } + catch (FormatException e) + { + Log.WriteError("Version error", e); + return false; + } + if (newVersion > currentVersion) + { + ret = true; + fileName = row["UpgradeFilePath"].ToString(); + Log.WriteInfo(string.Format("Version {0} is available for download", newVersion)); + } + } + return ret; + } + + /// + /// Runs application updater + /// + /// File name + /// true if updater started successfully + internal bool StartUpdateProcess(string fileName) + { + Log.WriteStart("Starting updater"); + string tmpFile = Path.ChangeExtension(Path.GetTempFileName(), ".exe"); + using (Stream writeStream = File.Create(tmpFile)) + { + using (Stream readStream = typeof(Program).Assembly.GetManifestResourceStream("WebsitePanel.Installer.Updater.exe")) + { + byte[] buffer = new byte[(int)readStream.Length]; + readStream.Read(buffer, 0, buffer.Length); + writeStream.Write(buffer, 0, buffer.Length); + } + } + string targetFile = GetType().Module.FullyQualifiedName; + // + var webService = ServiceProviderProxy.GetInstallerWebService(); + string url = webService.Url; + // + string proxyServer = string.Empty; + string user = string.Empty; + string password = string.Empty; + + // check if we need to add a proxy to access Internet + bool useProxy = AppConfigManager.AppConfiguration.GetBooleanSetting(ConfigKeys.Web_Proxy_UseProxy); + if (useProxy) + { + proxyServer = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_Address].Value; + user = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_UserName].Value; + password = AppConfigManager.AppConfiguration.Settings[ConfigKeys.Web_Proxy_Password].Value; + } + + ProcessStartInfo info = new ProcessStartInfo(); + info.FileName = tmpFile; + + //prepare command line args + StringBuilder sb = new StringBuilder(); + sb.AppendFormat("\\url:\"{0}\" ", url); + sb.AppendFormat("\\target:\"{0}\" ", targetFile); + sb.AppendFormat("\\file:\"{0}\" ", fileName); + sb.AppendFormat("\\proxy:\"{0}\" ", proxyServer); + sb.AppendFormat("\\user:\"{0}\" ", user); + sb.AppendFormat("\\password:\"{0}\" ", password); + info.Arguments = sb.ToString(); + Process process = Process.Start(info); + if (process.Handle != IntPtr.Zero) + { + User32.SetForegroundWindow(process.Handle); + } + Log.WriteEnd("Updater started"); + return (process.Handle != IntPtr.Zero); + } + #endregion + + #region Progress indication + + /// + /// Starts progress indication + /// + /// Title + internal void StartProgress(string title) + { + StartProgress(title, false); + } + + /// + /// Starts progress indication + /// + /// Title + /// Disable content + internal void StartProgress(string title, bool disableContent) + { + if (disableContent) + { + DisableContent(); + } + progressManager.StartProgress(title); + } + + /// + /// Starts async progress indication + /// + /// Title + /// Disable content + internal void StartAsyncProgress(string title, bool disableContent) + { + if (disableContent) + { + DisableContent(); + } + topLogoControl.ShowProgress(); + progressManager.StartProgress(title); + } + + /// + /// Finishes progress indication + /// + internal void FinishProgress() + { + topLogoControl.HideProgress(); + progressManager.FinishProgress(); + EnableContent(); + } + + #endregion + + private void OnApplicationFormShown(object sender, EventArgs e) + { + StartUnattendedSetup(); + } + + private void StartUnattendedSetup() + { + XmlDocument doc = Global.SetupXmlDocument; + if (doc != null) + { + XmlNode root = doc.SelectSingleNode("setup"); + if (root == null) + { + Log.WriteError("Incorrect setup xml file"); + Close(); + } + Log.WriteStart("Starting unattended setup"); + ProceedUnattendedSetup(); + } + } + + public void ProceedUnattendedSetup() + { + XmlDocument doc = Global.SetupXmlDocument; + XmlNode root = doc.SelectSingleNode("setup"); + if (root.ChildNodes.Count == 0) + { + Log.WriteEnd("Unuttended setup finished"); + Close(); + return; + } + XmlNode node = root.ChildNodes[0]; + switch (node.Name.ToLower()) + { + case "install": + ParseInstallNode(node); + break; + } + } + + private void ParseInstallNode(XmlNode installNode) + { + XmlNodeList components = installNode.SelectNodes("component"); + if (components.Count == 0) + { + //remove parent install node + installNode.ParentNode.RemoveChild(installNode); + ProceedUnattendedSetup(); + } + else + { + //remove current node and start installation + XmlElement componentNode = (XmlElement)components[0]; + string componentCode = componentNode.GetAttribute("code"); + string componentVersion = componentNode.GetAttribute("version"); + string xml = componentNode.InnerXml; + installNode.RemoveChild(componentNode); + + if (!string.IsNullOrEmpty(componentCode)) + { + ScopeNode componentsNode = scopeTree.Nodes[0] as ScopeNode; + scopeTree.SelectedNode = componentsNode; + ComponentsControl ctrl = componentsNode.ResultView as ComponentsControl; + ctrl.InstallComponent(componentCode, componentVersion, xml); + } + } + } + + public override object InitializeLifetimeService() + { + ILease lease = (ILease)base.InitializeLifetimeService(); + + //Set lease properties + lease.InitialLeaseTime = TimeSpan.Zero; + return lease; + } + + } +} + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.resx new file mode 100644 index 00000000..37d70fbb --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/ApplicationForm.resx @@ -0,0 +1,1571 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 115, 17 + + + 229, 17 + + + + + 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 + nI5yAJmLdgCZjHUAnI97AJ2QcwCekHQAn5J4AKCTdwCgk3kAopV6AKSXewCjl3wApJd+AKWZfgCpmn4A + x5hEAMKVSADInVUAxZ9eAMifWgDKoVgAyKFcAMKeYgDDoW4AxaVxAKGWgwCkl4MAppqBAKmbgACpnYIA + qZ2EAKidigCsoYYAraKJAK2kiQCuo40ArqSNALCihwCwpYoAsKWNALSpjwC8qokAq6GRAK+kkgCvpZUA + saaQALarkQC1rJMAtKqWALWslAC1q5sAt66YALWsnwC4rpkAuK+fAL2wkwC6sZYAvLCXALmwmwC9tJoA + u7GcAL21nQCzr6MAtbGmAL61oQC7s6UAv7ihALazrgC+uq0Au7m0AL+8tADEqoUAwa6KAM2xhwDOtogA + y7GPAMu3jQDQt44Ay7SXAMS5mwDAuJ4AxbqfAMm4mgDSvZYAwLejAMC3pADCuqEAxbmhAMW8owDBuKYA + wrykAMW+pgDKuqEAwLeqAMO6qADEu6oAxb2pAMC6rgDGvqwAyL6rAMi/rgDBu7AAwbywAMvApQDHwaoA + x8CvAMjBqQDIwa0AzcevANPBoADYyq0AycKxAM3DsADKxLIAzcaxAMnCtgDLxbQAzMa1AM3IsQDOyLcA + w8C6AMXDvgDGxL8AzMa7AMnFvgDOybgAysi/AM/JvADSx7UA0cy1ANHKugDRzLsA1c24ANDKvQDSzL0A + 1M69ANrPuwDX0boA1tG9ANjTvADh1b0AyMbBAMnIwwDNysEAz83CAMvJxQDNy8UAzszHAM3LyADPzckA + 0czBANTOwQDQzcQA1dDCANbSxADY0sIA2NTDANzXwQDY0sUA2tXFANzXxwDd2MEA3tnEANrVyADc18sA + 3djJANzZzADb2NIA3NnSAN/d0ADb2dQA3trUAN7c1QDh28cA4dzGAOLeyADg288A4d3OAODd0gDh3tUA + 4d/aAObhzADp480A4+DSAOTg0gDi4NUA5OHWAOvm0QDp5NUA7urWAO/s1wDk4tgA5uTaAOfl3ADp5toA + 7OfbAOjm3QDv69sA6ujeAO3q3gDv7N8A8e3aAPPv3gDz8N8A9PDeAOrp4QDs6uIA7uziAOzq5ADt7OUA + 7+7oAPHt4ADw7uYA8O7pAPTx4QDx8OoA9fPpAPLx7QD08u4A9PTvAPn37QD6+O8A9PPwAPX18QD39vQA + +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 + //8AAP4//////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgA + AAAAAAAEAAAAAAAAAAAAAAABAAAAAQAAAAAAAJyPdwCiln4Au6V9AMWeWQDGomMAx6JpAMeocADMsH0A + pZmBAKabhQCqnYIAqJ2FAKmeiACtoYYAq6CKAKygigCroY4ArqOMAK6kjQC0o4IAsKaNAK6kkQCwppEA + saiQALSrkwCzqpQAtKqVALaulwCzqZkAt62YALmvmwC5sZkAurCdALy1ngC7saEAvLOgAL21oAC7s6UA + vbSmAL+4pgC+vLcAz7OHAMGxjQDOto4AyribAMC2oQDAt6UAwLmiAMK5pQDDvKQAxbynAMi7pgDCuqkA + xb2pAMK7rwDGvq4AyL+rAMe/sADVwJwAzsGhAMvCrwDMxq4AxsCyAMfBtADJwrEAysSzAMzEswDKxLUA + zMa1AM3IsADJxbkAy8e9AM7IuADOyb0A0ce2AN3PsQDazLQA0cq6ANbNuQDRyr0A0828ANTOvgDV0LkA + zcrBAM3KxQDPzMYA0s7BANTOwADUz8UA0s/KANPQwwDV0MIA19HEANjSwgDe18IA2NPHANrVxQDc2MEA + 2tbKANzWyADb2MsA3dnKAN3ZzgDe2dAA393RAODbygDj38kA4NvSAOHd0QDh3tQA5N/WAOXgyQDl4NEA + 4uDUAOTh1gDn5NcA6OPSAOrm0QDr5tcA7enWAOTi2ADm5NoA5+XcAOrn2gDo5t0A7urZAOzp3gDw7NoA + 6ujgAOzq4gDs6+QA7uzmAO/u6ADx7+cA8O7pAPHw6gD08ukA8vHtAPTz7wD19O8A9fXxAPf29AD59/AA + +Pf0APn48QD5+PYA+vr4APz7+gD8/PoA/v7+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRXV0cpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUVFtm + c4SGZigAAAAAAAAAAAAAAAAAAAAAAAAAVFRUW2h8ipOWlpNmMAAAAAAAAAAAAAAAAAAAAABUVFRbbYSK + lpaWlpaWk2YwAAAAAAAAAAAAAAAAVEdHVF5thpOWlpaWlpaWlpaTZi4AAAAAAAAAAFpHQDhHZHyKlpaW + lpaWlpaWlpaWlpBkIgAAAAAAAABAL0VohJaWlpaWlpaWlpaWlpaWlpOWimQiAAAAAAAAVziIlpaWlpaW + lpaWlpaWlpaTk5CQjo6KZBwAAAAAAAA6ZpaWlpaWlpaWlpaWlpOQk5OQjo6OioRbHAAAAAAAADptlpaW + lpaWlpOTk46TkJOOjoqOioqKhFIcAAAAAAAAOm2WlpaWk5OTk5OQk46Oio6KioqGiIR8VxwAAAAAAAA6 + bZaWkJOTk5CQkI6OipOKioqEhISEhHpSFwAAAAAAADptlpCWkJOQk46OjoqOioqGhH+Ef3yBc1ISAAAA + AAAAOGiWk46TkI6OjoqOioqKhH96fHp6enpoSRIAAAAAAAA4aJaOk5CQjo6KjoqKhnx6enp6enp6emZJ + EgAAAAAAADhmlo6Qjo6OipOKin96enp6enptc25zZkUSAAAAAAAAOmiTk46OjoqThoRzc3Nzc25oc2hm + W1QwOAwAAAAAAAA4ZpaOjo6OioRzc3NzbWhmW0UoHhwSFQ4uDAAAAAAAADpok5COiop8c2ZmUkAiHAoL + DBQDKwQ8PjAMAAAAAAAAOGaWjohzUkUiHAoLDBIcMAUHCAQ7BUxfMAkAAAAAAAA4UmQ4EgwLChIcMD5S + YnBwKixMLVI0OUUXEgAAAAAAAEUSHBwwMElTYnB2doB2dmZLPkU4MDAhDAEAAAAAAAAAZG1zf3+AgIB2 + f3NfW0tFMC4XDAkNFi4AAAAAAAAAAABtk5GRhn9oZEs+MCIXCgoNHjoAAAAAAAAAAAAAAAAAAGSEhHNS + OBwODA0XJwAAAAAAAAAAAAAAAAAAAAAAAAAAADgSDBciAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////8H///wB///AAf/+AAH + /4AAB/gAAAfwAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH + 4AAAB+AAAAfgAAAP4AAAP+AAB//gAf//8H///////////////////ygAAAAYAAAAMAAAAAEACAAAAAAA + QAIAAAAAAAAAAAAAAAEAAAABAAAAAAAAtqF5ALumfgDBo2wAyaZrAK+ljQCwpo0At6iJAK+lkwCwppIA + tqySALKplgC0qpYAtayVALiulwC2rZsAuK+dALqwmQC6sJ0AvLKfAL+3ngC6sqEAvbWhAL62pQC/uqsA + ybGFANG5jgDPuZYAwbmmAMW8pgDKvKIAwrqpAMO9qwDEvKkAw7utAMO+rQDFvq4Ax8CqAMnArgDLxKwA + 0sSpAMfBsADIwrEAzcewAMjBtQDNx7YAysW6AMrHvQDOyLkAzcm8ANDItQDQyrkA0Mq+ANPNvgDW0boA + 3NO6AM/MwwDRzcAA1c/DANDNxQDW0MEA1dHEANjTxQDa1MQA39rFANHQygDY08gA2tXJAN7ZyQDc2MwA + 39vRAN/c0QDh3MYA4dzOAOHd0QDh3tQA5uHPAOjkzwDi4NUA5OHXAOrl0wDq5tUA4+DYAOTh2ADm5NoA + 5+PcAOfk3ADo5t4A6ejfAPDt3wDq6OEA7OniAOzr5ADt7OUA7+7oAPDu5QDw7ukA9PHmAPTy6ADy8ewA + 9PLuAPb18QD39/QA+Pf0APj49gD6+vkA/Pz6AP7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzsvAAAAAAAAAAAAAAAAAAAAAABBOz5HW2RJGAAA + AAAAAAAAAAAAAAA4Oz5PXmdra2tKIwAAAAAAAAAAADsxMUNWZGtra2tra2tKKgAAAAAAAC8qL0VbZ2tr + a2tra2tra2tJIwAAAAAAI0pga2tra2tra2tra2tnZ2ZFIwAAAAA7Smtra2tra2tra2dnZ2ZmZmQ+IwAA + AAA0V2tra2trZ2tmZ2dnZmRkZGA+HAAAAAA0VmtrZ2tmZ2ZmZmZkZFtkW1s+FwAAAAA0VmtnZ2dnZmZm + ZGRgW1tbW1Y0FwAAAAA0Umtna2ZmZmRkZFtbW1ZWVk8zFgAAAAA0SmtmZmZmZGRgWFZWT1ZPT04tFgAA + AAA0VmdnZmRkZFtWT09PTkVFPi0cFgAAAAAxUmtmZmRbVk9FRTQqHBENBw0REAAAAAA7SmtkW0c+JRYN + BgcBAgMZBDccEAAAAAA0Oz4jDQUFDRQnNkQaGhsoHjMOFgAAAAA+FBwlJzdETVBQTEQzJyMRDgUIAAAA + AABKXmRhWVBJPjMjEA0FCxYqAAAAAAAAAABKXlc+KhEODQ4jAAAAAAAAAAAAAAAAAAAAKhYfAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////AP///wD//8cA//wDAP/gAwD+AAMA8AADAOAAAwDAAAMAwAADAMAAAwDAAAMAwAADAMAAAwDAAAMA + wAADAMAAAwDAAAMAwAAHAMAAPwDAD/8A4///AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAA + AAAAAAAAAAAAAQAAAAEAAAAAAAC+ro0AvrKXAL20ngC8s6EAvrSgAL+3pwDBsI0Ay7OJAM24kgDMu5cA + zr6fAMG3oQDCu6MAw7qkAMK5qQDFva0Ayb+sAMa/sQDHwK4Ay8WuAMvDtwDKxbQAyMW6AM/JvQDRy7oA + 0cq9ANPOvwDUz7wA19G/ANjTvwDRy8AA087BANTPwwDSzcQA1tHFANjTxQDf2cYA1NHKANbTzQDa1coA + 2dXNAN3YywDc2c0A29nRAN7a0gDi3coA4d3SAOHd1QDj4dcA5eLXAOXi2ADm5NsA5uXcAOnm3QDq6N8A + 6efgAOrp4QDs6uMA7erlAO7s5gDx8OsA8vHsAPTz7gD29fEA+Pf0APn49gD6+vgA/Pz7AP7+/gAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAAAAAAAAAAAA + ACksNT4yFwAAAAAAACYmLDlARERENyMAAAAiIiw8Q0RERERERDUjAAAAMEREREREREREQ0EwIwAALDlE + RERERENBQD4+JSIAADA5RERDQUBAPjk5OSQiAAAwOURDQEA+PDk4NzUiGgAAMDhDQEA+OTUyMCUjExoA + ADA4Qz43JSIWDQIBBwMYAAAsKSQTBQUNFAoICgsMAAAANRoaHiUuJR0RAwUFEgAAADk3MhoTDw8XAAAA + AAAAAAAAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP/7AAD/gQAA+AEAAMABAADAAQAA + gAEAAIABAACAAQAAgAEAAIABAACAAwAAgAMAAIB/AADf/wAA//8AAIlQTkcNChoKAAAADUlIRFIAAAEA + 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 + qCoM+LCbUQ/keqiYUzXq89e6BUBlkH9XzA/MBMCMPh2UwnAVE04L2wlCKLuX806pysgv31f98fntimYC + YEafJpIFAR8OlAuG3aIDXR5ljJ/+rSoMAPUc/00xPzATADP69NNu1IWd2g905aRUZfTXPS8THDdNMwEw + o88alRkT+fvdCAYdVUUBO/m7JzQTADP6LFNVdJBeVzH8yVN9kO6nGQZ18VV53jTNBMCMZpRTmTGvqmFR + RTtlbl38PaeZAJjRjIrEj+LT1hvI1zraCYOn5e4b46c0EwAzmlE1qmo70NE0KL/vzK6imQCY0Yx2Rjp0 + ID9P48jEp7slTD+jGc1o70m3UAiopiLMaEYzmtGMZjSjGc1oRjOa0YxmNKMZzWhGM5rRjGY0oxnNaEYz + mtGMZjSjGc1oRjOa0e7o/weShWoRQ/D8BAAAAABJRU5ErkJggigAAAAwAAAAYAAAAAEAIAAAAAAAgCUA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAACAAAABAAAAAgAAAAMAAAADAAAAAoAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAIAAAACAAAABgAAAAwAAAAQAAAAFgAAAB4GBQYoCgkKKgEBASAAAAAaAAAAEAAAAAYAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAIAAAAEAAAACAAAAA4AAAAUAAAAGgMDAyYtLCs6aGZiXJaTjI2tqaG5q6edwYeDeo8qKShAAAAA + JgAAABQAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AgAAAAQAAAAGAAAADAAAABAAAAAWAAAAIB8eHTBYVlNOioeBequon63BvrTX0M3A89nUxv/c18f/3NjJ + /87JuP2bloi7JSQjRAAAACYAAAAQAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AgAAAAYAAAAKAAAADgAAABQAAAAcEhISKklIRUR/fHZqo6CYnby4r83Nyb3r1tLE/dvWx//d2cn/4t7P + /+nm2//w7ub/4+DS/9zXx//DvKX9e3dtjQAAADIAAAAeAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA + BAAAAAgAAAAMAAAAEAAAABYHBwciPDo5OnNxbF6cmZGNt7Sqv8nFuuXUz8L52NPE/9rVxP/e2cn/5eLV + /+7s4//29fD//Pz6////////////6+je/9vWx//Iwaj/mZSEvQQEBjgAAAAgAAAACAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAA + BgAAAAoAAAAOAAAAFAEBARwrKikwZ2VhUpOQiXyxrqWxxsK329HMwPXV0MH/1tDA/9jSwf/e2cr/6OXa + //Lx6v/6+ff//v7+////////////////////////////6+je/9vWx//Hv6b/nZeHvwoKDCwAAAAWAAAA + BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAA + CAAAAAwAAAAQAAAAGBoaGShaWFVGiYaAbquooKHBvrTPzsq+79PNv/3SzLv/0su6/9bQv//g28//7eri + //f18v/9/fz/////////////////////////////////////////////////6+je/9vWx//FvKP/o52L + tRQVGRQAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAA + CgAAAA4AAAAUDQwMIEpIRTqAfXhipKGakb26scPMyLzp0cy++8/JuP/NxbP/zse1/9fRwv/l4df/8vDr + //v6+f//////////////////////////////////////////////////////////////////////6+je + /9rWx//DuqH/pqCNrz5BUQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAA + DAAAABADAwMaODY1LnVyblSempSDubats8nGut/Pyr35zce3/8jArv/Gvqv/zMW0/9vWyv/r6eL/9/b0 + //7+/v////////////////////////////////////////////////////////////////////////// + ////////////6+je/9rWxv/AuJ7/pp+Mr11geQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + BAAAABAICAgeWlhVPpWSjHK0samlx8O5087KvfPMxrb/xb2q/8C3o//Cuab/z8m6/+Pf1v/z8e3//Pz7 + //////////////////////////////////////////////////////////////////////////////// + /////v/+/v7//v7+//7+/f/9/v3/6ebc/9rVxv+/tpz/pJ2LrVxhfQQAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAACDk3NiSppp6NzMi948zGt/3Du6j/ubCb/7iumf/Duqn/2NLH/+zp5P/5+Pb////+ + ///////////////////////////////////////////////////////////////////////+/v7//v7+ + //7+/f/+/f3//f39//39/P/8/Pz//Pz7//z8+//7/Pv/5+Ta/9rVxf+9tJr/o5yJrV9kggQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAASEVFCL+7so3Pybv7saaQ/7Sqlv/Kw7X/49/X//Tz8P/9/f3///// + ///////////////////////////////////////////////////////////////+//7+/v/+/v7//v79 + //39/f/9/fz//fz8//z8+//8+/v/+/v6//v7+f/6+vn/+vr4//r5+P/6+fj/5uPX/9nUxf+7spf/opuI + rWFpiAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLexQNLNwO+toYv/083C//v7+v////////// + ///////////////////////////////////////////////////////+/v7//v7+//7+/f/+/v3//f38 + //39/P/9/Pz//Pz7//z8+//7+/r/+/v6//v7+f/7+vn/+vr4//n59//5+Pb/+Pj2//j39f/49/X/5OHV + /9nUxP+5sJX/oZqHq2VtjgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAycW8i8W9rP+9tKP//v7+ + //////////////////////////////////////////7//v7+//7+/v/+/v7//v79//39/f/9/f3//f38 + //38+//8/Pv//Pz7//v7+v/7+/r/+/r5//r6+P/6+vj/+fn3//n59//5+Pb/+Pf1//f29P/39vP/9/Xz + //b18v/29fL/4t7S/9jTxP+3rZP/oZiFq2dxkwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4cncEy8e+ + rb+2o//TzcL////////////////////////////+/v7//v7+//7+/f/9/f3//f39//39/P/9/fz//fz7 + //z8+//8/Pv//Pv6//v7+v/7+/n/+/r5//r6+P/6+fj/+vn3//n49v/5+Pb/+Pj1//j39P/39vP/9vXy + //X08f/19PD/9PTw//Tz7//08+//4NzQ/9jSw/+2q5H/n5eFqWh0nQIAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACBe38Ey8e+r7+2o//UzsP////////+/v/+/v7//v7+//7+/f/+/f3//f38//39/P/9/fz//Pz8 + //z8+//8+/v/+/v6//v7+f/7+vn/+vr4//r6+P/6+ff/+fn3//n49v/4+Pb/+Pj1//j39P/39vT/9/bz + //b28v/09PD/9PPv//Pz7v/z8u7/8vLt//Lx7f/y8e3/39rN/9fSwv+0qY//npaDp2d1qQIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACDfYEEzMi/r7+2o//UzsP///////39/f/9/f3//f38//39/P/9/fz//Pz7 + //z8+//8+/r/+/v6//v7+f/7+vn/+vr4//r6+P/6+ff/+fn3//n49v/5+Pb/+Pf1//j39P/39/T/9/fz + //b28//29fL/9fXx//Pz7v/y8ez/8vHs//Hw7P/x8Ov/8e/q//Dv6v/w7+r/3djL/9fRwv+yp43/npWC + pWR5vAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFfoIEzci/r7+2o//TzcL///////39/P/8/Pv//Pz7 + //z8+//8+/r//Pv6//v7+f/7+vn/+vr5//r6+P/6+fj/+fn3//n49v/5+Pb/+Pj1//j39f/39/T/9/b0 + //f28//29fL/9vXy//X08f/19PD/8/Lt//Hv6v/w7+r/8O/p/+/u6f/v7uj/7+3n/+7t5//u7ef/29bI + /9bRwf+wpYr/nZSBowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGgIQEzci/r7+2ov/TzcH//v/+ + //z8+//8/Pv//Pz6//v7+v/7+/n/+/r5//v6+P/6+vj/+vn3//n59//5+Pb/+fj2//j39f/49/X/9/f0 + //f28//39vP/9vXy//b18f/19PH/9fTw//Tz7//y8Oz/7+7o/+/u5//u7ef/7u3m/+7s5v/t7OX/7ezk + /+3r5P/s6+X/2dTG/9bQwP+uo4j/nJOAoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJgoYEzcnA + r7+2ov/TzMH//v79//z7+v/7+/r/+/r5//v6+f/7+vj/+vn4//n59//5+ff/+fj2//j49f/4+PX/9/f0 + //f39P/39vP/9vby//b18v/29fH/9fTw//T07//08+//8/Lu//Dv6v/u7Ob/7ezl/+3r5f/s6+T/7Ovj + /+zq4//r6uL/6+nh/+vp4f/q6eH/19HD/9XPwP+soYb/m5J+nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACLhIYEzsnAr7+1ov/SzMD//f79//v7+f/7+vn/+vr4//r6+P/6+ff/+fn3//n49v/4+Pb/+Pj1 + //j39P/39/T/9/bz//b28v/29fL/9fXx//X08P/18/D/9PPv//Py7v/z8u3/8O7o/+zq5P/s6uP/6+ri + /+vp4v/q6eH/6ujh/+ro4P/p6N//6eff/+nn3//o597/1c/A/9TPv/+rn4P/mpB9nQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACMhogEzsrAr7+2ov/SzL///f38//v6+f/6+vj/+vn4//r59//5+fb/+fj2 + //j49f/49/X/9/f0//f28//39vP/9vby//b18f/19PH/9fTw//Tz7//08+//8/Lu//Lx7P/u7OX/6unh + /+ro4P/q6OD/6ejf/+nn3//p597/6Ofd/+jm3f/o5t3/5+bc/+fl2//n5dz/0829/9TOvv+pnYL/mZB8 + nQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPh4oEz8rBr7+2ov/Sy7///f37//r6+P/6+ff/+fn3 + //n49v/4+Pb/+Pf1//j39P/39/T/9/bz//b28v/29fL/9fXx//X08P/09PD/9PPv//Py7v/z8u3/8O/q + /+vq4v/p59//6efe/+jm3f/o5t3/5+bd/+fl3P/n5dv/5+Xb/+bk2//m5Nr/5ePZ/+Xj2f/l49n/0cu6 + /9POvf+nm3//mI97mwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRiYwEz8vBr761ov/Ry77//Pz7 + //r59//5+ff/+fj2//n49v/49/X/+Pf0//f39P/39vP/9vXy//b18f/19fH/9fTw//Tz7//08+7/8/Lu + //Lx7P/u7eb/6eff/+fl3P/n5dz/5+Xb/+bk2//m5Nr/5uTa/+Xj2f/l49n/5eLY/+Ti2P/k4df/4+HW + /+Ph1v/j4Nb/zsm4/9PNvf+lmX3/mI56mQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRi48Ez8vC + r761ov/Ry77//Pz7//n59//5+Pb/+fj2//j49f/49/T/9/fz//f28//29fL/9vXx//X08f/19PD/9PPv + //Tz7v/z8u7/8fDq/+vq4v/n5dv/5uTa/+bk2v/l49n/5ePZ/+Ti2P/k4tf/5OLX/+Th1//j4db/4+HV + /+Lg1f/i4NT/4t/U/+Hf0//h39P/zca1/9LMvP+kl3v/l4x6mQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACTjZEE0MzCr761of/Ryr7//Pz6//n59v/5+Pb/+Pj1//j39P/39/T/9/bz//b28v/29fL/9fTx + //X08P/08+//9PPv//Py7f/u7Ob/5+Xc/+Xj2P/k4tj/5OLX/+Th1//j4db/4+HW/+Lg1f/i4NX/4uDU + /+Lf1P/h39P/4d7S/+He0v/h3tL/4d7S/+De0v/g3dH/ysSy/9HMu/+ilXn/lox4lwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACVj5ME0MzDr761of/Ryr3/+/z6//n49v/5+PX/+Pj1//j39P/39vP/9vby + //b18v/19fH/9fTw//T07//08+7/7+/p/+jn3v/k4tf/4+HW/+Pg1v/i4NX/4uDV/+Lf1P/h39T/4d/T + /+He0v/h3tL/4d7S/+He0v/g3tL/393Q/9zZzP/X08T/z8q6/8a/rf++tqH/tqyU/9HKuv+gk3f/lYt3 + lQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXj5QE0czDr761of/Ryr3/+/v6//n49v/4+PX/+Pf1 + //f39P/39vP/9vXy//b18f/19PH/9fTw//Hw6//q6OD/5OHX/+Lg1P/i39T/4d/T/+Hf0//h3tP/4d7S + /+He0v/h3tP/4d7S/9/d0P/c2cz/1dHD/8zGtf/Buab/t66Y/7Cljf+qn4b/qZ2C/6qeg/+pm4D/qZp+ + /8/It/+fkXX/lIp3lQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZkZYE0c3Dr761of/Qyr3/+/v6 + //n49v/4+PX/+Pf0//f38//39vP/9vXy//b18f/y8ez/6+nh/+Ph1//h3tP/4d7S/+De0v/h3tL/4d7S + /+He0v/g3dH/3NnM/9XRw//KxLP/vLSg/6+ljv+nm4L/opV7/6KVe/+mmoH/qp+E/7Gnjf+8qon/vbCT + /7+5of/BuqL/sKKH/8/It/+dj3P/lIl1kwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbk5cE0c3E + r760of/Qyb3/+/v6//n49v/4+PX/9/f0//f29P/29vP/8/Lt/+vp4f/j4db/4N7S/+De0v/h3tL/4N3R + /93azf/W0sP/y8W0/720of+uo43/pJd+/52QdP+cjnL/oJN4/6qdgv+uooj/tKyT/8Guiv/FpXH/xbqf + /8u3jf/GkDT/yKFc/9fRuf/d2cL/vLCX/8/It/+bjXH/k4h1kQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACdlZkE0s3Er760oP/Qybz/+/v6//n49v/4+PX/+Pf0//Ty7v/r6uL/5OLX/+Dd0f/d2s3/19PE + /8zGtf++taH/rqSN/6OXff+cj3P/m41w/5+Sdv+mmn//raSK/7WtlP+8tZ3/xLmb/8idVf/Fn17/y8Cl + /8qhWP/EjSv/zraI/9C3jv/In1r/wp5i/+njzf/x7dn/xbmh/8/It/+Wh2r/k4h1jwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACfl5sE087Fr720oP/Qybz//f38//r59//z8+7/5+Xc/9rWyf/Nx7b/v7ai + /7Cljf+jlnv/nI5y/5qMb/+dkXT/pZp+/62jif+1rZT/vLWd/8K8pP/Hwar/zcev/9HMtf/W0rz/0r2W + /8eYRP/ClUj/2Mqt/82xh//DoW7/08Gg/+HVv//LtJf/ybia/+Hbx//Vzrj/x72o/8W9qf+Kelv/lox8 + cgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChmZ0E087Fr720oP/JwbL/4t7V/8fAr/+xp5D/opV7 + /5uNcP+Zi27/nZBz/6SZfv+tpIn/tq6V/722nv/DvaX/yMKr/83HsP/SzbX/19K7/9zXwf/h3Mb/5uLM + /+vm0f/v7Nf/4dW8/8uxj//EqoX/5+DM/9rPu//KuqH/1c24/9XNvP/Ivqv/wbej/7uxnf/Bt6T/0cu6 + /5uNcf+Jel/loJmRMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjm58E087Fr8C3pP+YiWz/n5F2 + /6OXfP+toor/tayV/7uznP+/uKH/xL6m/8nDrP/NyLH/0s22/9jTvP/d2MH/4t3H/+fizf/r59L/7+vW + //Hu2f/z79v/8u/b//Ds2v/t6Nf/5eDR/9LHtf/Nw7D/zca0/8e+rf/BuKf/v7Wj/8C3pv/Gvq3/y8Oz + /83Gtv/Iwa//nZB0/4NzVfmWjHx2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjm58E0czD + r9bRwv/Mx7X/0s69/9jUw//a1sX/29fF/9vXxP/d2MT/39rE/+LeyP/n483/6+fS/+/r1v/y7tr/9PDc + //Tw3v/z797/7+vb/+nk1f/h3M3/2dLD/9DIuP/Iv67/w7qp/8S7qv/Gvq3/ysOy/83Gtv/MxbT/xr6s + /7uxnf+toYr/n5J4/5SFav+Jel71h3he2ZaNfHCvra4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAACjm58E0MzCr+Dc0P/r6N7/6ufb/+3q3v/v7N//8O3g//Lv4P/z8N//9PHf//Xx3//18uH/9PDi + //Ht4P/s59v/5ODT/9vVyP/Ryrv/ysKy/8a+rf/Gvq7/ysOy/83Gt//Nxrb/ycGx/7+2o/+wpY//oJN5 + /5GCZ/+IeFv7hXVa7YV1XNWIemOzjoFti5OId2KbkoZAqKOfHMvP2gIAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACjm58E0MvCr+Xi1v/5+PH/+vjv//r48P/7+fD/+vjv//n37f/18+n/7+zh + /+bh1v/b1cj/0su8/8zEtf/KwrL/y8Oz/83Gtv/Ox7f/zMW1/8W8qv+4rpn/qJyE/5mKb/+NfWH9h3Za + 84RzWeGFdl3DiXtmn46Cb3SWi3xMopqRLrGurBbR1d4GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkm6AEzce9r+Xi1v/5+PP//Pv4//r59f/18+//7uvl + /+Xg2P/c18v/1c/B/9HKu//PyLj/zsi3/8nCsP+/tqL/sKWP/6GTev+UhWn/jHxg+Yd3W+mHd17Ri3xl + r4+CboeWinleoJeKOq+poyDIx8sM+v3/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbmug9fSxf/q597/7uzl + /+rn3//j39X/29fK/9LMvP/Gvqz/uK6Z/6mchP+bjXL/koNn/Yx7X/GKel/bjX5lwZCCbJuXindwoJWG + SqykmyrAvLsU4ubuBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAurOr + Hrqxorm+taL9vbSg/7Cljv+hlHr/mIht/5CAZPeNfGHljn5lzZKEba2XinWFoJSEWquilja7tbAc19fb + CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAALSspBalmYhslohxq4+AZrWWiHKZn5OAbqmfkUa4sKgmz8vMEPDx+AQAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9Pb+BPL1/gYAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8A + AP///////wAA//////APAAD/////AAcAAP////gAAwAA////gAABAAD///wAAAEAAP//wAAAAQAA//4A + AAABAAD/4AAAAAMAAP8AAAAABwAA+AAAAAAHAADwAAAAAAcAAPAAAAAABwAA8AAAAAAHAADwAAAAAAcA + APAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAPAADgAAAAAA8AAOAAAAAADwAA4AAA + AAAPAADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAA8A + AOAAAAAADwAA4AAAAAAPAADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAB8AAOAAAAAAHwAA4AAA + AAA/AADgAAAAB/8AAOAAAAD//wAA8AAAP///AADwAA////8AAPgB/////wAA/n//////AAD///////8A + AP///////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAgAAAAGAAAA + BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAADgcHBxpDQj80bWtm + UlVTTkIHBwceAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAoAAAEULy4tKm1rZkyYlY18tbGn + r8nFuNvRzcDzxL+x54B8cYEAAAAmAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAADh4eHSBgX1tAkI2GbK+roZ/Dv7LP0c2/ + 793Yy/3m4tb/7+3k//Hv5//e2cn/uLGd4z48OE4AAAAWAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABAAAAAoQEBAYVFJQNIeFf1yppZyRvrmuwcvGuOfV0cL739vO + /+nm3P/z8ev/+vr3//7+/f//////+vn3/97ay/++t6D1YV5WWAAAABAAAAACAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAIAAAAGBgYHEkNCQSh/fXhMo6CYfri0qLPFwLPdzsm699bRw//h3ND/7Ori + //b18f/9/Pv////////////////////////////6+ff/3tnK/722n/OFgHRAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAACAAAABAAAAAwxMTAednRwQJ2ak261sKajwLuu08fBsvHOyLj/19HE/+Tf1v/w7uj/+vn3 + //7+/v////////////////////////////////////////////r59//d2cr/u7Oc8ZyWiDQAAAAAAAAA + AAAAAAAAAAAAAAAAAgcHBxCAfnlIsKyjkby3qsXBu6vpxb2s/czFtf/Y08f/6OXd//X08f/9/fz///// + ///////////////////////////////////////+/v7//v7+//7+/f/9/f3/+Pf0/9zXyP+5sZnxm5WH + NAAAAAAAAAAAAAAAAAAAAAAAAAAAsK2lVMG7rOXAt6X/zMW2/93Yz//u7Of/+vr4//////////////// + ///////////////////////+/v7//v7+//7+/v/9/f3//f38//z8+//7+/r/+/v5//v6+f/19O//29bG + /7eulvGalIY0AAAAAAAAAAAAAAAAAAAAALu3sxLIwrTFwrqp//Lw7f/+/v7///////////////////// + /////////////v7+//7+/v/+/v3//f39//39/P/8/Pv//Pv6//v7+f/7+vn/+vn4//n49v/49/X/+Pf1 + //Lx7P/Z1MT/tKyU75qThTIAAAAAAAAAAAAAAAAAAAAAxcG7MMO7q+3e2dD//////////////////v7+ + //7+/v/+/v3//f39//39/P/8/Pz//Pz7//z8+//7+/r/+/r5//r6+P/6+ff/+fn2//j49f/39vT/9vXy + //X18f/19PH/7+3n/9jSwv+yqZHvmZKEMgAAAAAAAAAAAAAAAAAAAADGwrs2w7yr8eHd1f///////v7+ + //7+/f/9/f3//fz8//z8+//8/Pr/+/v6//v7+f/6+vj/+vn4//n59//5+Pb/+Pj1//f39P/39vP/9vXy + //Tz7//z8u7/8vHt//Lx7f/s6uP/1tDA/7Cmj++YkYMwAAAAAAAAAAAAAAAAAAAAAMbDvDbDvKvx4dzU + /////v/9/Pz//Pz7//z8+//7+/r/+/v5//v6+f/6+fj/+vn3//n49v/4+PX/+Pf0//f28//29vL/9vXx + //X08P/y8ez/8fDq//Dv6f/w7un/7+7o/+nn3//Uz77/rqSM7ZiRgi4AAAAAAAAAAAAAAAAAAAAAyMS9 + NsO8q/Hg29P//v79//v7+v/7+/n/+/r5//r6+P/6+ff/+fn2//n49v/4+PX/9/f0//f28//29fL/9fXx + //X08P/z8u7/8O/p/+7t5//u7Ob/7ezl/+3r5P/s6+T/5+Tb/9PNvP+soontl4+BLgAAAAAAAAAAAAAA + AAAAAADJxL42w7yr8eDb0v/9/fz/+/r5//r6+P/6+ff/+fn3//n49v/4+PX/9/f0//f28//29fL/9fTx + //T08P/08+//8vHs/+7t5v/s6uP/7Ori/+vp4f/q6eH/6ujg/+no4P/j4db/0cu6/6qfhuuWj4AsAAAA + AAAAAAAAAAAAAAAAAMrGvzbEvKvx39rR//z8+//6+vj/+fn3//n49v/4+PX/9/f0//f28//29fL/9fXx + //X08P/08+//8/Lu//Hv6v/s6uP/6ujg/+nn3//p597/6Obd/+jm3f/n5dz/5+Xc/+De0v/Pybj/qJ2E + 65aOfyoAAAAAAAAAAAAAAAAAAAAAy8fANsS8q/He2tD//Pv6//n59//5+Pb/+Pf1//j39P/39vP/9vXy + //X18f/09PD/9PPv//Py7f/u7eb/6eff/+fm3P/n5dz/5uXb/+bk2v/l49n/5ePY/+Ti2P/k4tf/3drO + /83Htf+lmoHrlY1+KgAAAAAAAAAAAAAAAAAAAADMyMA2xLyr8d7Z0P/7+/n/+fj2//j39f/39/T/9/bz + //b18v/19fH/9fTw//Tz7//x8Or/6+nh/+bk2v/l49n/5ePZ/+Ti2P/k4df/4+HW/+Lg1f/i4NX/4uDU + /+Lf1f/b2Mv/zMWz/6SYf+mVjX4qAAAAAAAAAAAAAAAAAAAAAMzIwTbEvKvx3tnP//v7+f/4+PX/+Pf0 + //f28//29fL/9fXx//X08P/z8u3/7evk/+bk2v/j4db/4+HW/+Lg1f/i4NX/4uDU/+Lg1P/h39P/393R + /9zZzP/W0sP/z8m4/8S8qP/Gvqv/opZ96ZSMfSgAAAAAAAAAAAAAAAAAAAAAzcnCNsS8q/Hd2c//+/r4 + //j39f/39/T/9/bz//b18v/08+//7u3n/+bk2//i4NX/4t/U/+Lg1P/i39P/4N3R/9vXyv/TzsD/ysSz + /7+4pf+3rpn/sqiQ/7Gmjf+xp43/raGG/8C2of+glHvnlIt8KAAAAAAAAAAAAAAAAAAAAADOysM2xLyr + 8d3Zz//7+vj/+Pf1//f39P/29fH/8O7p/+jm3f/i4NT/393R/9vYy//Uz8D/yMKx/7yzoP+xp5H/qp+G + /6qcgf+rn4P/tKOC/7ulff/BsY3/xJ1a/87Bof/Nxq7/w7mk/56ReOeUi3wmAAAAAAAAAAAAAAAAAAAA + AM/LxDbEvKvx3tnP//z8+//49/T/7+7o/+Lf1f/V0MH/ycKx/721oP+xp5D/qZ6E/6ebgf+pnoT/sKaN + /7mxmP/CuqH/xqJj/8eocP/MsH3/x59Z/9XAnP/Homn/3c+x/97Xwv/FvKf/l4pv45aNgCIAAAAAAAAA + AAAAAAAAAAAA0czFNsO7qvHRyr3/2tXK/8K7qf+yqJH/qZ2E/6abgP+pnoP/sKeM/7mxmP/DvKT/zMav + /9XQuf/c2MH/49/J/+bgyf/Ps4f/zraO/9rMtP/KuJv/1s25/8i7pv/Iv6v/y8Kv/7Gmjv+MfmS5paGe + DAAAAAAAAAAAAAAAAAAAAADQy8Q2yMGx8a6jjP+0q5P/urKb/8C5ov/Gv6j/zciw/9bRuv/d2cL/5ODK + /+rm0f/u6tb/7+vY/+3p1//o49L/4NvK/9HHtv/LwrD/zMSz/8e/rv/Du6n/wLel/7qwnf+rn4j/jX5j + 3ZOIdkIAAAAAAAAAAAAAAAAAAAAAAAAAAMvFvTbb18rx4+HU/+fk1//q59r/7OnZ/+7r2f/w7Nn/8e3b + /+/r2//r5tf/5eDR/9zWyP/Uzr//zse3/8nCsf/Du6n/vbSg/7Splf+pnYb9oJN78ZmMdN2Thm69j4Fq + mYx+aHCVi3ssAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMO7NuHd0vH5+PH/+vny//n38P/08un/7One + /+Ld0P/X0cP/0cq6/8rCsv/Cuqf/ua+b/7ClkP+mmoP5nI5255OFbMuOgGerinxlg4h6ZFqKfWk2koh6 + HKKdmgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAua8m1tHE4+7r4//u7OX/49/V + /9TOwP/Gvav/t62Y/6ygiv2jl3/vm4112ZSGbbuPgGiVjn9oapCDbkaUiHgonpSKEMbGzAIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALexswK8tKZoua+d + 3aygifOhk3rlmoxzyZaHbqWUhW5+k4VvVpeKdjSglogYubSyCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AKmgnQKfk4MgmIp1OJ+Tgiavp54O2trfAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAP////////8H///4A///gAH//AAA/8AAAP4AAAPgAAADwAAAA+AAAAPAAAADwAAA + A8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAfAAAAPwAAA + f8AAD//AA///4H//////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAwrKikeLiwr + HgAAAAwAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAABh0dHBZhX1o0kI2FYLCsoZfEwbXHvLirx3FtY2AAAAAUAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDg4ODlVUUSiIhX5QqKWahb+7r7nRzcDj4N3R + +ezp4f/08uz/4d3P/62nlMcXFhUuAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgQIR0dF + HIF+eECinpRyuLOnq8jDttfX0sb15OHX//Du5//5+PT//v79///////+/v3/49/S/7ewm9E+PDgiAAAA + AgAAAAAAAAAAAAAAAAAAAAQ5OTkUe3l0Mp2ZkGKxrKCZv7qsy8zHue3a1cn95+Tc//Py7f/7+/n////+ + ///////////////////////+/v3/4t7R/7mynMuFgXcOAAAAAAAAAAAAAAAAWVhWFqail3S4saO9wrus + 5c7Iuvvc2M3/6+ji//f28//+/f3////////////////////////////+/v7//v79//39/P/7+/r/4NzP + /7evmcmMh30OAAAAAAAAAAAAAAAAwbuvcsW9rvvf29H/8O7q//v6+f///////////////////////v7+ + //7+/v/9/f3//f38//z8+//7+/r/+vr5//n59//49/T/3tnL/7SslcmLhnwOAAAAAAAAAADDwsEKxL2u + weHd1f////////////7+/v/+/v7//v79//39/f/9/fz//Pz7//v7+v/7+vn/+vr4//n59//4+PX/9/bz + //b18f/08+//29bI/7KpksmLhnwMAAAAAAAAAADFwb4OxL2uy+fk3v///////v39//39/P/8/Pv//Pz6 + //v7+v/6+vn/+vn3//n49v/49/X/9/f0//b28v/08+//8/Lt//Lx7P/w7+n/2dPE/7Cmj8eKhXsMAAAA + AAAAAADGxMAOxL6uy+fj3P/+/v3//Pz6//v7+v/7+vn/+vr4//n59//4+PX/9/f0//f28//29fL/9fTw + //Lx7P/v7uj/7+7n/+7t5v/s6uP/1tDB/62jjMWKhHoMAAAAAAAAAADIxcIOxb6uy+bi2//8/Pv/+/r4 + //r59//5+Pb/+Pj1//f39P/39vP/9vXx//X08P/08u7/8O7p/+zr5P/s6uP/6+ni/+rp4f/o5t7/0829 + /6qgicOJgnkKAAAAAAAAAADKyMQOxb6uy+Xh2f/7+/r/+fn3//j49v/49/T/9/bz//b18v/19PD/9PPv + //Lx7P/t7OX/6ujg/+nn3v/o5t3/5+Xc/+bk2//k4tj/0Mq5/6idhsOJgnkKAAAAAAAAAADMycYOxb6u + y+Tg2P/7+vn/+fj2//j39P/39vP/9vXx//X08P/08+7/8O/p/+no3//m5Nv/5ePa/+Xj2f/k4tj/5OHX + /+Ph1v/h39T/zce2/6abg8GJgnkKAAAAAAAAAADOysgOxb6uy+Tg2P/6+vj/+Pf1//f28//29fL/9fTw + //Lx7P/r6uL/5ePZ/+Ph1//j4db/4+HW/+Lg1P/g3dH/3NnM/9bSxP/Nx7b/xLyo/6SYgb+JgnoIAAAA + AAAAAADPzMkOxb6vy+Pg2P/6+vf/+Pf0//f28//08+//7ezl/+bk2v/i4NX/4N3R/9vXyv/Tzr//ycOy + /8C5pv+6sJr/tqyT/7eoif+2rJL/u7CZ/6KWfr+JgnoIAAAAAAAAAADRzswOxr6vy+Tg2P/7+/n/9vXy + /+zr5P/f3NH/08/A/8jCsP++tqL/tauV/7Cmjv+wp47/tqF5/7umfv/Bo2z/ybGF/8mma//c07r/xbym + /52Reb2MhX4IAAAAAAAAAADU0c8Oxb2ty9XPw//Y08f/w7up/7Wslf+vpY3/sKaN/7atk/+/t57/y8Ss + /9bQuf/f2sX/0rmO/9C5j//PuZb/0sSp/8q8ov/QyLT/uK6X/5GEa5kAAAAAAAAAAAAAAADPy8cOy8W2 + y761of/Cu6b/x8Cq/83HsP/X0rv/4dzG/+jkz//r59T/6uXT/+bhz//f2cj/0ci3/8nArv/Du6n/vLKf + /7Wrl/2soYvxlYhvv4+DcCwAAAAAAAAAAAAAAADAubMO3trPy/Du5P/08uj/9PHm//Dt3//q5db/4t3O + /9rUxP/PyLj/xbyq/7qwnf+wpZD3qJyG5Z+TfMuXinKnk4ZugY+CbFiMf2k0kIV2EgAAAAAAAAAAAAAA + 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 + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/AppContext.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/AppContext.cs new file mode 100644 index 00000000..89fbbc7d --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/AppContext.cs @@ -0,0 +1,57 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.Text; + +namespace WebsitePanel.Installer.Common +{ + internal class AppContext + { + private ApplicationForm appForm; + private ScopeNode scopeNode; + + public ApplicationForm AppForm + { + get { return appForm; } + set { appForm = value; } + } + + public ScopeNode ScopeNode + { + get { return scopeNode; } + set { scopeNode = value; } + } + + public string CurrentPath + { + get { return FileUtils.GetCurrentDirectory(); } + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ProgressManager.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ProgressManager.cs new file mode 100644 index 00000000..c03f3e98 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ProgressManager.cs @@ -0,0 +1,66 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Windows.Forms; +using System.Collections.Generic; +using System.Text; + +namespace WebsitePanel.Installer.Common +{ + internal class ProgressManager + { + private Form form; + private ToolStripStatusLabel label; + private Cursor cursor; + + public ProgressManager(Form form, ToolStripStatusLabel label) + { + this.form = form; + this.label = label; + } + + public void StartProgress(string title) + { + cursor = form.Cursor; + form.Cursor = Cursors.WaitCursor; + label.Text = title; + if (label.Owner != null) + label.Owner.Refresh(); + } + + public void FinishProgress() + { + form.Cursor = cursor; + label.Text = "Ready"; + if ( label.Owner != null ) + label.Owner.Refresh(); + } + } + +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ScopeNode.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ScopeNode.cs new file mode 100644 index 00000000..c0a1f98a --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/ScopeNode.cs @@ -0,0 +1,98 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Drawing; +using System.Windows.Forms; +using System.Collections.Generic; +using System.Text; +using WebsitePanel.Installer.Controls; + +namespace WebsitePanel.Installer.Common +{ + internal enum NodeType + { + Servers, + Server, + Components, + Component, + Module, + Settings, + Service + }; + + internal class ScopeNode : TreeNode + { + private bool populated; + private Icon largeIcon; + private Icon smallIcon; + private ResultViewControl resultView; + private NodeType nodeType; + private object dataObject; + + public ScopeNode() + { + } + + public bool Populated + { + get { return populated; } + set { populated = value; } + } + + public Icon LargeIcon + { + get { return largeIcon; } + set { largeIcon = value; } + } + + public Icon SmallIcon + { + get { return smallIcon; } + set { smallIcon = value; } + } + + public ResultViewControl ResultView + { + get { return resultView; } + set { resultView = value; } + } + + public NodeType NodeType + { + get { return nodeType; } + set { nodeType = value; } + } + + public object DataObject + { + get { return dataObject; } + set { dataObject = value; } + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/User32.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/User32.cs new file mode 100644 index 00000000..ffef6e32 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/User32.cs @@ -0,0 +1,54 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Runtime.InteropServices; + +namespace WebsitePanel.Installer.Common +{ + internal sealed class User32 + { + /// + /// Win32 API Constants for ShowWindowAsync() + /// + internal const int SW_HIDE = 0; + internal const int SW_SHOWNORMAL = 1; + internal const int SW_SHOWMINIMIZED = 2; + internal const int SW_SHOWMAXIMIZED = 3; + internal const int SW_SHOWNOACTIVATE = 4; + internal const int SW_RESTORE = 9; + internal const int SW_SHOWDEFAULT = 10; + + [DllImport("user32.dll")] + internal static extern bool SetForegroundWindow(IntPtr hWnd); + [DllImport("user32.dll")] + internal static extern bool IsIconic(IntPtr hWnd); + [DllImport("user32.dll")] + internal static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/Utils.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/Utils.cs new file mode 100644 index 00000000..d94f9863 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Common/Utils.cs @@ -0,0 +1,65 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.IO; +using System.Windows.Forms; +using System.Configuration; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Diagnostics; +using System.DirectoryServices; +using System.DirectoryServices.ActiveDirectory; + +using System.Security.Principal; +using System.Security; +using System.Security.Permissions; +using System.Runtime.InteropServices; +using System.Threading; +using WebsitePanel.Installer.Core; + +namespace WebsitePanel.Installer.Common +{ + public static class UiUtils + { + public static void ShowRunningInstance() + { + Process currentProcess = Process.GetCurrentProcess(); + foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName)) + { + if (process.Id != currentProcess.Id) + { + //set focus + User32.SetForegroundWindow(process.MainWindowHandle); + break; + } + } + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.Designer.cs new file mode 100644 index 00000000..323cce2f --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.Designer.cs @@ -0,0 +1,213 @@ +namespace WebsitePanel.Installer.Controls +{ + partial class ComponentControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ComponentControl)); + this.grpInfo = new System.Windows.Forms.GroupBox(); + this.txtVersion = new System.Windows.Forms.TextBox(); + this.lblVersion = new System.Windows.Forms.Label(); + this.txtComponent = new System.Windows.Forms.TextBox(); + this.lblComponent = new System.Windows.Forms.Label(); + this.txtApplication = new System.Windows.Forms.TextBox(); + this.lblApplication = new System.Windows.Forms.Label(); + this.grpDescription = new System.Windows.Forms.GroupBox(); + this.lblDescription = new System.Windows.Forms.Label(); + this.btnCheckUpdate = new System.Windows.Forms.Button(); + this.btnSettings = new System.Windows.Forms.Button(); + this.btnRemove = new System.Windows.Forms.Button(); + this.grpInfo.SuspendLayout(); + this.grpDescription.SuspendLayout(); + this.SuspendLayout(); + // + // grpInfo + // + this.grpInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.grpInfo.Controls.Add(this.txtVersion); + this.grpInfo.Controls.Add(this.lblVersion); + this.grpInfo.Controls.Add(this.txtComponent); + this.grpInfo.Controls.Add(this.lblComponent); + this.grpInfo.Controls.Add(this.txtApplication); + this.grpInfo.Controls.Add(this.lblApplication); + this.grpInfo.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.grpInfo.Location = new System.Drawing.Point(14, 43); + this.grpInfo.Name = "grpInfo"; + this.grpInfo.Size = new System.Drawing.Size(379, 122); + this.grpInfo.TabIndex = 3; + this.grpInfo.TabStop = false; + this.grpInfo.Text = "Summary"; + // + // txtVersion + // + this.txtVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtVersion.Location = new System.Drawing.Point(122, 82); + this.txtVersion.Name = "txtVersion"; + this.txtVersion.ReadOnly = true; + this.txtVersion.Size = new System.Drawing.Size(234, 21); + this.txtVersion.TabIndex = 5; + // + // lblVersion + // + this.lblVersion.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblVersion.Location = new System.Drawing.Point(16, 82); + this.lblVersion.Name = "lblVersion"; + this.lblVersion.Size = new System.Drawing.Size(100, 21); + this.lblVersion.TabIndex = 4; + this.lblVersion.Text = "Version"; + // + // txtComponent + // + this.txtComponent.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtComponent.Location = new System.Drawing.Point(122, 55); + this.txtComponent.Name = "txtComponent"; + this.txtComponent.ReadOnly = true; + this.txtComponent.Size = new System.Drawing.Size(234, 21); + this.txtComponent.TabIndex = 3; + // + // lblComponent + // + this.lblComponent.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblComponent.Location = new System.Drawing.Point(16, 55); + this.lblComponent.Name = "lblComponent"; + this.lblComponent.Size = new System.Drawing.Size(100, 21); + this.lblComponent.TabIndex = 2; + this.lblComponent.Text = "Component"; + // + // txtApplication + // + this.txtApplication.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtApplication.Location = new System.Drawing.Point(122, 28); + this.txtApplication.Name = "txtApplication"; + this.txtApplication.ReadOnly = true; + this.txtApplication.Size = new System.Drawing.Size(234, 21); + this.txtApplication.TabIndex = 1; + // + // lblApplication + // + this.lblApplication.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblApplication.Location = new System.Drawing.Point(16, 28); + this.lblApplication.Name = "lblApplication"; + this.lblApplication.Size = new System.Drawing.Size(100, 21); + this.lblApplication.TabIndex = 0; + this.lblApplication.Text = "Application"; + // + // grpDescription + // + this.grpDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.grpDescription.Controls.Add(this.lblDescription); + this.grpDescription.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.grpDescription.Location = new System.Drawing.Point(14, 171); + this.grpDescription.Name = "grpDescription"; + this.grpDescription.Size = new System.Drawing.Size(379, 117); + this.grpDescription.TabIndex = 4; + this.grpDescription.TabStop = false; + this.grpDescription.Text = "Description"; + // + // lblDescription + // + this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblDescription.Location = new System.Drawing.Point(3, 17); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(373, 97); + this.lblDescription.TabIndex = 0; + // + // btnCheckUpdate + // + this.btnCheckUpdate.Image = ((System.Drawing.Image)(resources.GetObject("btnCheckUpdate.Image"))); + this.btnCheckUpdate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnCheckUpdate.Location = new System.Drawing.Point(14, 9); + this.btnCheckUpdate.Name = "btnCheckUpdate"; + this.btnCheckUpdate.Size = new System.Drawing.Size(128, 28); + this.btnCheckUpdate.TabIndex = 0; + this.btnCheckUpdate.Text = " &Check For Updates"; + this.btnCheckUpdate.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; + this.btnCheckUpdate.UseVisualStyleBackColor = true; + this.btnCheckUpdate.Click += new System.EventHandler(this.OnCheckUpdateClick); + // + // btnSettings + // + this.btnSettings.Image = ((System.Drawing.Image)(resources.GetObject("btnSettings.Image"))); + this.btnSettings.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnSettings.Location = new System.Drawing.Point(262, 9); + this.btnSettings.Name = "btnSettings"; + this.btnSettings.Size = new System.Drawing.Size(108, 28); + this.btnSettings.TabIndex = 2; + this.btnSettings.Text = "&Settings"; + this.btnSettings.UseVisualStyleBackColor = true; + this.btnSettings.Click += new System.EventHandler(this.OnSettingsClick); + // + // btnRemove + // + this.btnRemove.Image = ((System.Drawing.Image)(resources.GetObject("btnRemove.Image"))); + this.btnRemove.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnRemove.Location = new System.Drawing.Point(148, 9); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.Size = new System.Drawing.Size(108, 28); + this.btnRemove.TabIndex = 1; + this.btnRemove.Text = "&Uninstall"; + this.btnRemove.Click += new System.EventHandler(this.OnRemoveClick); + // + // ComponentControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.grpDescription); + this.Controls.Add(this.grpInfo); + this.Controls.Add(this.btnCheckUpdate); + this.Controls.Add(this.btnSettings); + this.Controls.Add(this.btnRemove); + this.Name = "ComponentControl"; + this.Size = new System.Drawing.Size(406, 327); + this.grpInfo.ResumeLayout(false); + this.grpInfo.PerformLayout(); + this.grpDescription.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button btnRemove; + private System.Windows.Forms.Button btnSettings; + private System.Windows.Forms.Button btnCheckUpdate; + private System.Windows.Forms.GroupBox grpInfo; + private System.Windows.Forms.TextBox txtVersion; + private System.Windows.Forms.Label lblVersion; + private System.Windows.Forms.TextBox txtComponent; + private System.Windows.Forms.Label lblComponent; + private System.Windows.Forms.TextBox txtApplication; + private System.Windows.Forms.Label lblApplication; + private System.Windows.Forms.GroupBox grpDescription; + private System.Windows.Forms.Label lblDescription; + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.cs new file mode 100644 index 00000000..2420e91a --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.cs @@ -0,0 +1,393 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Threading; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +using WebsitePanel.Installer.Common; +using WebsitePanel.Installer.Services; +using WebsitePanel.Installer.Core; +using WebsitePanel.Installer.Configuration; + +namespace WebsitePanel.Installer.Controls +{ + /// + /// Component control + /// + internal partial class ComponentControl : ResultViewControl + { + delegate void ReloadApplicationCallback(); + + /// + /// Initializes a new instance of the ComponentControl class. + /// + public ComponentControl() + { + InitializeComponent(); + } + + /// + /// Shows control + /// + /// + public override void ShowControl(AppContext context) + { + base.ShowControl(context); + if (!IsInitialized) + { + ComponentConfigElement element = context.ScopeNode.Tag as ComponentConfigElement; + if (element != null) + { + txtApplication.Text = element.GetStringSetting("ApplicationName"); + txtComponent.Text = element.GetStringSetting("ComponentName"); + txtVersion.Text = element.GetStringSetting("Release"); + lblDescription.Text = element.GetStringSetting("ComponentDescription"); + + string installer = element.GetStringSetting("Installer"); + string path = element.GetStringSetting("InstallerPath"); + string type = element.GetStringSetting("InstallerType"); + if ( string.IsNullOrEmpty(installer) || + string.IsNullOrEmpty(path) || + string.IsNullOrEmpty(type)) + { + btnRemove.Enabled = false; + btnSettings.Enabled = false; + } + } + IsInitialized = true; + } + } + + /// + /// Action on Remove button click + /// + /// + /// + private void OnRemoveClick(object sender, EventArgs e) + { + UninstallComponent(); + } + + /// + /// Action on Settings button click + /// + /// + /// + private void OnSettingsClick(object sender, EventArgs e) + { + SetupComponent(); + } + + /// + /// Action on Check For Update button click + /// + /// + /// + private void OnCheckUpdateClick(object sender, EventArgs e) + { + //start check in the separate thread + AppContext.AppForm.StartAsyncProgress("Connecting...", true); + ThreadStart threadDelegate = new ThreadStart(CheckForUpdate); + Thread newThread = new Thread(threadDelegate); + newThread.Start(); + } + + /// + /// Checks for component update + /// + private void CheckForUpdate() + { + Log.WriteStart("Checking for component update"); + ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement; + + string componentName = element.GetStringSetting("ComponentName"); + string componentCode = element.GetStringSetting("ComponentCode"); + string release = element.GetStringSetting("Release"); + + // call web service + DataSet ds; + try + { + Log.WriteInfo(string.Format("Checking {0} {1}", componentName, release)); + // + var webService = ServiceProviderProxy.GetInstallerWebService(); + ds = webService.GetComponentUpdate(componentCode, release); + // + Log.WriteEnd("Component update checked"); + AppContext.AppForm.FinishProgress(); + } + catch (Exception ex) + { + Log.WriteError("Service error", ex); + AppContext.AppForm.FinishProgress(); + AppContext.AppForm.ShowServerError(); + return; + } + + string appName = AppContext.AppForm.Text; + if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) + { + DataRow row = ds.Tables[0].Rows[0]; + string newVersion = row["Version"].ToString(); + Log.WriteInfo(string.Format("Version {0} is available for download", newVersion)); + + string message = string.Format("{0} {1} is available now.\nWould you like to install new version?", componentName, newVersion); + if (MessageBox.Show(AppContext.AppForm, message, appName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) + { + string fileToDownload = row["UpgradeFilePath"].ToString(); + string installerPath = row["InstallerPath"].ToString(); + string installerType = row["InstallerType"].ToString(); + UpdateComponent(fileToDownload, installerPath, installerType, newVersion); + } + } + else + { + string message = string.Format("Current version of {0} is up to date.", componentName); + Log.WriteInfo(message); + AppContext.AppForm.ShowInfo(message); + } + } + + delegate void UpdateComponentCallback(string fileName, string path, string type, string version); + + /// + /// Runs component update + /// + /// + /// + /// + private void UpdateComponent(string fileName, string path, string type, string version) + { + // InvokeRequired required compares the thread ID of the + // calling thread to the thread ID of the creating thread. + // If these threads are different, it returns true. + if (this.InvokeRequired) + { + UpdateComponentCallback callBack = new UpdateComponentCallback(UpdateComponent); + Invoke(callBack, new object[] { fileName, path, type, version }); + } + else + { + Log.WriteStart("Updating component"); + + ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement; + string componentId = element.ID; + string componentName = element.GetStringSetting("ComponentName"); + + try + { + Log.WriteInfo(string.Format("Updating {0}", componentName)); + //download installer + Loader form = new Loader(this.AppContext, fileName); + DialogResult result = form.ShowDialog(this); + if (result == DialogResult.OK) + { + //run installer + string tmpFolder = FileUtils.GetTempDirectory(); + string installerPath = Path.Combine(tmpFolder, path); + Update(); + string method = "Update"; + Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path)); + Hashtable args = new Hashtable(); + args["ComponentId"] = componentId; + args["ShellVersion"] = AppContext.AppForm.Version; + args["BaseDirectory"] = FileUtils.GetCurrentDirectory(); + args["UpdateVersion"] = version; + args["Installer"] = Path.GetFileName(fileName); + args["InstallerType"] = type; + args["InstallerPath"] = path; + args["InstallerFolder"] = tmpFolder; + args["IISVersion"] = Global.IISVersion; + args["ParentForm"] = FindForm(); + + result = (DialogResult)AssemblyLoader.Execute(installerPath, type, method, new object[] { args }); + Log.WriteInfo(string.Format("Installer returned {0}", result)); + Log.WriteEnd("Installer finished"); + Update(); + if (result == DialogResult.OK) + { + ReloadApplication(); + } + FileUtils.DeleteTempDirectory(); + } + Log.WriteEnd("Update completed"); + } + catch (Exception ex) + { + Log.WriteError("Installer error", ex); + AppContext.AppForm.ShowError(ex); + } + } + } + + /// + /// Uninstalls component + /// + private void UninstallComponent() + { + Log.WriteStart("Uninstalling component"); + + ComponentConfigElement element = AppContext.ScopeNode.Tag as ComponentConfigElement; + string installer = element.GetStringSetting(Global.Parameters.Installer); + string path = element.GetStringSetting(Global.Parameters.InstallerPath); + string type = element.GetStringSetting(Global.Parameters.InstallerType); + string componentId = element.ID; + string componentCode = element.GetStringSetting(Global.Parameters.ComponentCode); + string componentName = element.GetStringSetting(Global.Parameters.ComponentName); + string release = element.GetStringSetting(Global.Parameters.Release); + + try + { + Log.WriteInfo(string.Format("Uninstalling {0}", componentName)); + //download installer + Loader form = new Loader(this.AppContext, installer, componentCode, release); + DialogResult result = form.ShowDialog(this); + if (result == DialogResult.OK) + { + //run installer + string tmpFolder = FileUtils.GetTempDirectory(); + path = Path.Combine(tmpFolder, path); + Update(); + string method = "Uninstall"; + // + Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path)); + // + var args = new Hashtable + { + { Global.Parameters.ComponentId, componentId }, + { Global.Parameters.ComponentCode, componentCode }, + { Global.Parameters.ShellVersion, AppContext.AppForm.Version }, + { Global.Parameters.BaseDirectory, FileUtils.GetCurrentDirectory() }, + { Global.Parameters.IISVersion, Global.IISVersion }, + { Global.Parameters.ParentForm, FindForm() }, + }; + // + result = (DialogResult)AssemblyLoader.Execute(path, type, method, new object[] { args }); + // + Log.WriteInfo(string.Format("Installer returned {0}", result)); + Log.WriteEnd("Installer finished"); + Update(); + ReloadApplication(); + FileUtils.DeleteTempDirectory(); + + } + Log.WriteEnd("Uninstall completed"); + } + catch (Exception ex) + { + Log.WriteError("Installer error", ex); + AppContext.AppForm.ShowError(ex); + } + } + + /// + /// Setup component + /// + private void SetupComponent() + { + Log.WriteStart("Starting component setup"); + + var element = AppContext.ScopeNode.Tag as ComponentConfigElement; + + string installer = element.GetStringSetting("Installer"); + string path = element.GetStringSetting("InstallerPath"); + string type = element.GetStringSetting("InstallerType"); + string componentId = element.ID; + string componentCode = element.GetStringSetting("ComponentCode"); + string componentName = element.GetStringSetting("ComponentName"); + string release = element.GetStringSetting("Release"); + + try + { + Log.WriteInfo(string.Format("Setup {0} {1}", componentName, release)); + //download installer + Loader form = new Loader(this.AppContext, installer, componentCode, release); + DialogResult result = form.ShowDialog(this); + if (result == DialogResult.OK) + { + string tmpFolder = Path.Combine(AppContext.CurrentPath, "Tmp"); + path = Path.Combine(tmpFolder, path); + Update(); + string method = "Setup"; + Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", type, method, path)); + Hashtable args = new Hashtable(); + args["ComponentId"] = componentId; + args["ShellVersion"] = AppContext.AppForm.Version; + args["BaseDirectory"] = FileUtils.GetCurrentDirectory(); + args["IISVersion"] = Global.IISVersion; + args["ParentForm"] = FindForm(); + args[Global.Parameters.ShellMode] = Global.VisualInstallerShell; + // + result = (DialogResult)AssemblyLoader.Execute(path, type, method, new object[] { args }); + // + Log.WriteInfo(string.Format("Installer returned {0}", result)); + Log.WriteEnd("Installer finished"); + + if (result == DialogResult.OK) + { + ReloadApplication(); + } + FileUtils.DeleteTempDirectory(); + } + Log.WriteEnd("Component setup completed"); + } + catch (Exception ex) + { + Log.WriteError("Installer error", ex); + this.AppContext.AppForm.ShowError(ex); + } + } + + /// + /// Thread safe application reload + /// + private void ReloadApplication() + { + // InvokeRequired required compares the thread ID of the + // calling thread to the thread ID of the creating thread. + // If these threads are different, it returns true. + if (this.InvokeRequired) + { + ReloadApplicationCallback callback = new ReloadApplicationCallback(ReloadApplication); + Invoke(callback, null); + } + else + { + AppContext.AppForm.ReloadApplication(); + } + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.resx new file mode 100644 index 00000000..9e393425 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentControl.resx @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA05JREFUOE+Vk2tI + k2EYhtMF/Qqi0haVaaP80jbnnIecNQ+bh5k5yxpump+Zh2EnSbODqalBcxrNkppJTd1Sl3kIKrTylMM0 + MyxL1LKWqQyMEjpQpnefKwLzVy88f16e++J+3vd+LBb8cxi8TP5KxhrhklXLfWm0hXafP34dGB963/zh + /Wjr9M+pJ1T754nBQsyRLd9wkFbbOW7pE6dRBCqKv0fps5H2IB/7dfUIPdsCmaoHwqR7RtczZDXV60jV + wjmAnZmdFgHJN25xSuNBNmQi7Xot8l5qIL7cjnDNE8SUvYD4VBsiztZN27kUKikAiyrLv5DNkmvniSsS + eL5g49FEIyan+nHXMIR9dc9AthgRWzWA3Wc6kFJ9HduOX5he5XT6KAVYZgasdk73ts9JmnHslCJ2WIY3 + 3wz4OmPEgNEE5esxRLWPgtQPQlrQDaUpGrkmARwj8set7JMFZoCdKEttqWZhbeU28Hvk0EwWYNQ0CaW2 + A2SPCTsajYjQ9iMs24CMES+kjPHgmnMEa7l5p8yADWT2CHtXOVhRWngm6BB0qBInLjZB2vcJIQYTAmuG + IS56hpDjBuRN+CF6iI1Nl/zgKChrMgNsYlN/uElugyVvAjv/OTzL+sG/MQx+zVvwda8gLOqD6HQ3BPKH + COhdB+dGa1ir3OHgUzViBtAlKWNMUgVuZD2YUj2YkTqwZKVwjqkAL6UJ/uldECS1w0PagPXFMrDO7QVn + jxoMbskfB2xVEeFWj00CPThherj37YR4MA7y1ydBVpfAV94Cr6g28KJbwU9sxtaEeniSNVjDVGT9duCQ + EUS43QaxpQLrykVY3CwGrzsBW3oTETJwAJE31fBNNkCY2ozwC72I1vfDJ6Htk5X9EZEZQP3nYlt28VXC + ow6EpBAWaiZod9zB6AiHy9N4cJ/GgPtyO/XA5Yi4RiXycCdsXQuyKR39b5AoGpPB0TUQHrWwleVihU4I + u8Yw2Dz0hU1HAFy6EsFPq4T3/nY4h1ZpKbHrnCTOZpuCODFcrhQ7eNVi6TERrDWBoN/ngaPNhb/yPoJy + W6ftvdUFf8SL/l3C2VFos/Gkb0wPXr31aCndP/4dsUfxhfAqfczgnFdYE6nBs7bnLdI80n9e/AKxCsOV + gSO8kwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYZJREFUOE+lU8tK + AlEYdhf0FNUbtKo3aNcL1APUIwTtctHOCtQSallkG3cSBUUXEBkhKTWNbmIkrmbOnJkzOpev/wyOzGiQ + 5Bk+Bob5bv/PicUmPYm9NCZBTJIf6x9/Ym1j1/8n/JZcX6ColP6FgQBCxwM9ngfXdWE7DjbLTawX32BZ + FoQpYBgGOOfQdd2v7if4VYDIh402Fi4qSFRaEMKCaZokQGSug+lsVCDs/vClYvZUweplDZYQMIUkk7vO + wRgJaNqoQIdbYKILx3GxfFLCTOoOtY5K7jK6OYjOGIM2LOBRj5WjWyzuXGE7V8DUVh7Jmxdyp+gDdx26 + TyaoajSBHFwmX8AcEafj51hKXoNx0ydn9s+QSUtkcSCRykKNCJC9FHhuNKC8fmM+nsPxfdXvbtDgOJfd + qXc/uqZqUYFgbc16C5+NJp7KVSjv7X73/toCMnWX7pEEnkt7p8HZto1urwerSzuXkzcl2fB3HrgH5IjA + RHdBXkZawAiGv491acNCYxHopx/g8N5q3Wv/UAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAmpJREFUOE99kl1P + 01AYx4eJmhj9Bt557f0u/QTe7UN4ZbiRK++8MyaGEEwUEgnIS8db5F26dQy2udVuK7jRlm5gC6wr29qN + zZa15E9bZYEAO8k/5zwn5/97nnOe0wPAd3VkeClg2+c+y5Ft2z7TNHx22/L13OvxPXxw3/fo8RPZ//zZ + z47HBbgK04I/uJYgIukCqKwMipURSu9jKc5hlmIRJDOYDqUxF2akFSpOXPo8swdgCgE6VwBfaoE7bmFb + biJdrGFhM4eR7wl8mQ7j63wEVHIbCWbHsfzzdQCxvBIoljTwioHfR0YHQNJ7mKOyWI6mkWR5lCo6eEn9 + cBOQK/sPlIYk6zZ2yxbyyn+V28g7KlYtqKcWGoYN4bAauAFwN5zSiYOKiYTYwq5iQqxY4NS2p+O6jZPG + Gep/LQhy5XZA/k+NCO1o6P3MORJA7xteZrcqWbOgG+eo1I27AYygEExBxyqr4dUAB5KteVmVhoWTpmM+ + bUNrmtiT1Nsr+JWXiPmUCqnaxv6JgfezMpJiE9WGidrpGZqmjaNqq9PCa11wgyx/SCynVcQFp4qsjpdv + WbwbP/DuXXcer22dQy5rdwNciHjcAMUU8bqfxoteGiMLGeR4ESW1CsuyIUrl7oA8JyCyGUNoi8HaBgtq + I4rxySBi8QQ0XQe7K3YHjI59A0mSyGYzYBgGyRSNjWjUizmOw+JqqDtgYnLKA8RjW0ilUlhfX8fo2Bg+ + DQ5ieHgYM/OL3QGLPzb9ZDhCcPxenOd5DA0Noa/vDT72DxBTwZlr5htduPye7ryyRj5dWl4JEMR0YHxi + stP3q2fc9QWwyhndJ+hSfwAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.Designer.cs new file mode 100644 index 00000000..407a0c63 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.Designer.cs @@ -0,0 +1,156 @@ +namespace WebsitePanel.Installer.Controls +{ + partial class ComponentsControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ComponentsControl)); + this.grpDescription = new System.Windows.Forms.GroupBox(); + this.lblDescription = new System.Windows.Forms.Label(); + this.grdComponents = new System.Windows.Forms.DataGridView(); + this.colName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colVersion = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colLink = new System.Windows.Forms.DataGridViewLinkColumn(); + this.btnLoadComponents = new System.Windows.Forms.Button(); + this.grpDescription.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.grdComponents)).BeginInit(); + this.SuspendLayout(); + // + // grpDescription + // + this.grpDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.grpDescription.Controls.Add(this.lblDescription); + this.grpDescription.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.grpDescription.Location = new System.Drawing.Point(14, 198); + this.grpDescription.Name = "grpDescription"; + this.grpDescription.Size = new System.Drawing.Size(379, 117); + this.grpDescription.TabIndex = 2; + this.grpDescription.TabStop = false; + this.grpDescription.Text = "Description"; + // + // lblDescription + // + this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblDescription.Location = new System.Drawing.Point(3, 17); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(373, 97); + this.lblDescription.TabIndex = 0; + // + // grdComponents + // + this.grdComponents.AllowUserToAddRows = false; + this.grdComponents.AllowUserToDeleteRows = false; + this.grdComponents.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.grdComponents.BackgroundColor = System.Drawing.SystemColors.Window; + this.grdComponents.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.grdComponents.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.colName, + this.colVersion, + this.colLink}); + this.grdComponents.Location = new System.Drawing.Point(14, 43); + this.grdComponents.MultiSelect = false; + this.grdComponents.Name = "grdComponents"; + this.grdComponents.ReadOnly = true; + this.grdComponents.RowHeadersWidth = 21; + this.grdComponents.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.grdComponents.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.grdComponents.Size = new System.Drawing.Size(379, 149); + this.grdComponents.TabIndex = 1; + this.grdComponents.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.OnRowEnter); + this.grdComponents.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.OnInstallLinkClick); + // + // colName + // + this.colName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.colName.DataPropertyName = "Component"; + this.colName.HeaderText = "Component Name"; + this.colName.Name = "colName"; + this.colName.ReadOnly = true; + // + // colVersion + // + this.colVersion.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells; + this.colVersion.DataPropertyName = "Version"; + this.colVersion.HeaderText = "Version"; + this.colVersion.Name = "colVersion"; + this.colVersion.ReadOnly = true; + this.colVersion.Width = 67; + // + // colLink + // + this.colLink.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; + this.colLink.DataPropertyName = "Id"; + this.colLink.HeaderText = ""; + this.colLink.Name = "colLink"; + this.colLink.ReadOnly = true; + this.colLink.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.colLink.Text = "Install"; + this.colLink.TrackVisitedState = false; + this.colLink.UseColumnTextForLinkValue = true; + this.colLink.Width = 5; + // + // btnLoadComponents + // + this.btnLoadComponents.Image = ((System.Drawing.Image)(resources.GetObject("btnLoadComponents.Image"))); + this.btnLoadComponents.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnLoadComponents.Location = new System.Drawing.Point(14, 9); + this.btnLoadComponents.Name = "btnLoadComponents"; + this.btnLoadComponents.Size = new System.Drawing.Size(170, 28); + this.btnLoadComponents.TabIndex = 0; + this.btnLoadComponents.Text = " &View Available Components"; + this.btnLoadComponents.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; + this.btnLoadComponents.Click += new System.EventHandler(this.OnLoadComponentsClick); + // + // ComponentsControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.btnLoadComponents); + this.Controls.Add(this.grpDescription); + this.Controls.Add(this.grdComponents); + this.Name = "ComponentsControl"; + this.Size = new System.Drawing.Size(406, 327); + this.grpDescription.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.grdComponents)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grpDescription; + private System.Windows.Forms.Label lblDescription; + private System.Windows.Forms.DataGridView grdComponents; + private System.Windows.Forms.Button btnLoadComponents; + private System.Windows.Forms.DataGridViewTextBoxColumn colName; + private System.Windows.Forms.DataGridViewTextBoxColumn colVersion; + private System.Windows.Forms.DataGridViewLinkColumn colLink; + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.cs new file mode 100644 index 00000000..2cfb8907 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.cs @@ -0,0 +1,317 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.IO; +using System.Threading; +using System.Reflection; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +using WebsitePanel.Installer.Common; +using WebsitePanel.Installer.Services; +using WebsitePanel.Installer.Core; +using WebsitePanel.Installer.Configuration; + +namespace WebsitePanel.Installer.Controls +{ + /// + /// Components control + /// + internal partial class ComponentsControl : ResultViewControl + { + delegate void SetGridDataSourceCallback(object dataSource, string dataMember); + + private string componentCode = null; + private string componentVersion = null; + private string componentSettingsXml = null; + + public ComponentsControl() + { + InitializeComponent(); + grdComponents.AutoGenerateColumns = false; + } + + /// + /// Action on click Install link + /// + /// + /// + private void OnInstallLinkClick(object sender, DataGridViewCellEventArgs e) + { + if (e.ColumnIndex == grdComponents.Columns.IndexOf(colLink)) + { + DataRowView row = grdComponents.Rows[e.RowIndex].DataBoundItem as DataRowView; + if (row != null) + { + StartInstaller(row); + StartLoadingComponents(); + } + } + } + + private void StartInstaller(DataRowView row) + { + string applicationName = Utils.GetDbString(row[Global.Parameters.ApplicationName]); + string componentName = Utils.GetDbString(row[Global.Parameters.ComponentName]); + string componentCode = Utils.GetDbString(row[Global.Parameters.ComponentCode]); + string componentDescription = Utils.GetDbString(row[Global.Parameters.ComponentDescription]); + string component = Utils.GetDbString(row[Global.Parameters.Component]); + string version = Utils.GetDbString(row[Global.Parameters.Version]); + string fileName = row[Global.Parameters.FullFilePath].ToString(); + string installerPath = Utils.GetDbString(row[Global.Parameters.InstallerPath]); + string installerType = Utils.GetDbString(row[Global.Parameters.InstallerType]); + + if (CheckForInstalledComponent(componentCode)) + { + AppContext.AppForm.ShowWarning(Global.Messages.ComponentIsAlreadyInstalled); + return; + } + try + { + // download installer + Loader form = new Loader(this.AppContext, fileName); + DialogResult result = form.ShowDialog(this); + + if (result == DialogResult.OK) + { + string tmpFolder = FileUtils.GetTempDirectory(); + string path = Path.Combine(tmpFolder, installerPath); + Update(); + string method = "Install"; + Log.WriteStart(string.Format("Running installer {0}.{1} from {2}", installerType, method, path)); + + //prepare installer args + Hashtable args = new Hashtable(); + + args[Global.Parameters.ComponentName] = componentName; + args[Global.Parameters.ApplicationName] = applicationName; + args[Global.Parameters.ComponentCode] = componentCode; + args[Global.Parameters.ComponentDescription] = componentDescription; + args[Global.Parameters.Version] = version; + args[Global.Parameters.InstallerFolder] = tmpFolder; + args[Global.Parameters.InstallerPath] = installerPath; + args[Global.Parameters.InstallerType] = installerType; + args[Global.Parameters.Installer] = Path.GetFileName(fileName); + args[Global.Parameters.ShellVersion] = AssemblyLoader.GetShellVersion(); + args[Global.Parameters.BaseDirectory] = FileUtils.GetCurrentDirectory(); + args[Global.Parameters.ShellMode] = Global.VisualInstallerShell; + args[Global.Parameters.IISVersion] = Global.IISVersion; + args[Global.Parameters.SetupXml] = this.componentSettingsXml; + args[Global.Parameters.ParentForm] = FindForm(); + + //run installer + DialogResult res = (DialogResult)AssemblyLoader.Execute(path, installerType, method, new object[] { args }); + Log.WriteInfo(string.Format("Installer returned {0}", res)); + Log.WriteEnd("Installer finished"); + Update(); + if (res == DialogResult.OK) + { + AppContext.AppForm.ReloadApplication(); + } + FileUtils.DeleteTempDirectory(); + } + } + catch (Exception ex) + { + Log.WriteError("Installer error", ex); + AppContext.AppForm.ShowError(ex); + } + finally + { + this.componentSettingsXml = null; + this.componentCode = null; + } + + } + + private bool CheckForInstalledComponent(string componentCode) + { + bool ret = false; + List installedComponents = new List(); + foreach (ComponentConfigElement componentConfig in AppConfigManager.AppConfiguration.Components) + { + string code = componentConfig.Settings["ComponentCode"].Value; + installedComponents.Add(code); + if (code == componentCode) + { + ret = true; + break; + } + } + if (componentCode == "standalone") + { + if (installedComponents.Contains("server") || + installedComponents.Contains("enterprise server") || + installedComponents.Contains("portal")) + ret = true; + } + return ret; + } + + /// + /// Displays component description when entering grid row + /// + /// + /// + private void OnRowEnter(object sender, DataGridViewCellEventArgs e) + { + DataRowView row = grdComponents.Rows[e.RowIndex].DataBoundItem as DataRowView; + if (row != null) + { + lblDescription.Text = Utils.GetDbString(row["ComponentDescription"]); + } + } + + /// + /// Start new thread to load components + /// + /// + /// + private void OnLoadComponentsClick(object sender, EventArgs e) + { + StartLoadingComponents(); + } + + private void StartLoadingComponents() + { + //load list of available components in the separate thread + AppContext.AppForm.StartAsyncProgress("Connecting...", true); + ThreadStart threadDelegate = new ThreadStart(LoadComponents); + Thread newThread = new Thread(threadDelegate); + newThread.Start(); + } + + /// + /// Loads list of available components via web service + /// + private void LoadComponents() + { + try + { + Log.WriteStart("Loading list of available components"); + lblDescription.Text = string.Empty; + //load components via web service + var webService = ServiceProviderProxy.GetInstallerWebService(); + DataSet dsComponents = webService.GetAvailableComponents(); + //remove already installed components + foreach (DataRow row in dsComponents.Tables[0].Rows) + { + string componentCode = Utils.GetDbString(row["ComponentCode"]); + if (CheckForInstalledComponent(componentCode)) + { + row.Delete(); + } + } + dsComponents.AcceptChanges(); + Log.WriteEnd("Available components loaded"); + SetGridDataSource(dsComponents, dsComponents.Tables[0].TableName); + AppContext.AppForm.FinishProgress(); + } + catch (Exception ex) + { + Log.WriteError("Web service error", ex); + AppContext.AppForm.FinishProgress(); + AppContext.AppForm.ShowServerError(); + } + } + + /// + /// Thread safe grid binding. + /// + /// Data source + /// Data member + private void SetGridDataSource(object dataSource, string dataMember) + { + // InvokeRequired required compares the thread ID of the + // calling thread to the thread ID of the creating thread. + // If these threads are different, it returns true. + if (this.grdComponents.InvokeRequired) + { + SetGridDataSourceCallback callBack = new SetGridDataSourceCallback(SetGridDataSource); + this.grdComponents.Invoke(callBack, new object[] { dataSource, dataMember }); + } + else + { + this.grdComponents.DataSource = dataSource; + this.grdComponents.DataMember = dataMember; + } + } + + /// + /// Installs component during unattended setup + /// + /// + internal void InstallComponent(string componentCode, string componentVersion, string settingsXml) + { + //load list of available components in the separate thread + this.componentCode = componentCode; + this.componentVersion = componentVersion; + this.componentSettingsXml = settingsXml; + AppContext.AppForm.StartAsyncProgress("Connecting...", true); + ThreadStart threadDelegate = new ThreadStart(Install); + Thread newThread = new Thread(threadDelegate); + newThread.Start(); + } + + /// + /// Loads list of available components via web service and install specified component + /// during unattended setup + /// + private void Install() + { + LoadComponents(); + foreach (DataGridViewRow gridRow in grdComponents.Rows) + { + DataRowView row = gridRow.DataBoundItem as DataRowView; + if (row != null) + { + string code = Utils.GetDbString(row["ComponentCode"]); + string version = Utils.GetDbString(row["Version"]); + if (code == componentCode) + { + //check component version if specified + if (!string.IsNullOrEmpty(componentVersion)) + { + if (version != componentVersion) + continue; + } + StartInstaller(row); + AppContext.AppForm.ProceedUnattendedSetup(); + break; + } + } + } + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.resx new file mode 100644 index 00000000..207ce9e2 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ComponentsControl.resx @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAj9JREFUOE+lk11I + U2EYx9vCiBS6GKyP+UWY0yYlZkYRM0Oi3IUEUlAG3QRFN1ERFTnNhWs2q7WtqTQLwhhBSp8YRQxcEslg + 82KHzWidrbXNWTowc2du/953NFN4u4gOPJwPzu/3/s/7PEcEYNl/HVSQreTMaKHD9x5ddiOaHh1FXa8K + ylv7cHlQAzfPTQvxkSN6u4W8/odZgBORfsng2Es0Pm+G2q+FNmDEFU6PVq4TJz6cQ+2dBrj8HpTf3MYW + cKHxKQpf9d+AauAQpK0bsFazEcfspzKiNu56RlKsU7AFF560odlxEtsNe9A1ZMJYwAtfmEd+uzyTKlvr + NCVswQHrYSh79mPA+QLJ+bRCmE/nRmPf4Q56l0gkLUVsQU1PHc4/VlO4kpRISKZFNudTFGkrUKAtA12Z + wqsvytiCLaadGP3kRmTiWw7d5VA4lh/8Gs35Ep5YGYrEVpB7MR+MrPF+5NkCsiJ+115yXp4Q0ruCoajo + ZyIlnp1LiX6QmplN5aqHdWxBlbUWmy07UHa7eqq4syIu65Cje+QB5oSUhCYikvru4XsoN/2ljVutSugC + 5kzLSvSVcPIe+jkgCQpoChfvQ8PDJqxvKWUn2GSuWRBQidxQDednD5nAcfQ6+jNTSVt5/P5ptoDERum1 + qiU9p1AWpLBMLcfdtza2oLBDgWeu15CRwVkMZQeIwtpXRsSmk7uZ/4LlTR/IRuEd58QlWztU5oPIOytF + 3hkp6g2NMA31YTKeXBWaFMRMweKH/3L9C8malnY23w2wAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.Designer.cs new file mode 100644 index 00000000..db6fe2aa --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.Designer.cs @@ -0,0 +1,36 @@ +namespace WebsitePanel.Installer +{ + partial class LineBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.cs new file mode 100644 index 00000000..d9b581b4 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/LineBox.cs @@ -0,0 +1,95 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace WebsitePanel.Installer +{ + /// + /// 3D line box. + /// + internal partial class LineBox : Control + { + /// + /// Initializes a new instance of the LineBox class. + /// + public LineBox() : base() + { + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.FixedHeight, true); + SetStyle(ControlStyles.DoubleBuffer, true); + SetStyle(ControlStyles.ResizeRedraw, true); + SetStyle(ControlStyles.StandardClick, false); + SetStyle(ControlStyles.Selectable, false); + this.TabStop = false; + } + + /// + /// Raises the Paint event. + /// + /// A PaintEventArgs that contains the event data. + protected override void OnPaint(PaintEventArgs e) + { + Graphics graphics = e.Graphics; + Rectangle rectangle = this.ClientRectangle; + Pen lightPen = new Pen(ControlPaint.Light(this.BackColor, 1)); + Pen darkPen = new Pen(ControlPaint.Dark(this.BackColor, 0)); + graphics.DrawLine(darkPen, rectangle.X, rectangle.Y, rectangle.X+rectangle.Width, rectangle.Y); + graphics.DrawLine(lightPen, rectangle.X, rectangle.Y+1, rectangle.X+rectangle.Width, rectangle.Y+1); + base.OnPaint(e); + } + + /// + /// Gets the default size of the control. + /// + protected override Size DefaultSize + { + get + { + return new Size(10, 2); + } + } + + + /// + /// Performs the work of setting the specified bounds of this control. + /// + /// The new Left property value of the control. + /// The new Right property value of the control. + /// The new Width property value of the control. + /// The new Height property value of the control. + /// A bitwise combination of the BoundsSpecified values. + [EditorBrowsable(EditorBrowsableState.Advanced)] + protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) + { + base.SetBoundsCore(x, y, width, 2, specified); + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.Designer.cs new file mode 100644 index 00000000..a0f17fa9 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.Designer.cs @@ -0,0 +1,112 @@ +namespace WebsitePanel.Installer.Controls +{ + partial class Loader + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.grpFiles = new System.Windows.Forms.GroupBox(); + this.lblValue = new System.Windows.Forms.Label(); + this.progressBar = new System.Windows.Forms.ProgressBar(); + this.lblProcess = new System.Windows.Forms.Label(); + this.btnCancel = new System.Windows.Forms.Button(); + this.grpFiles.SuspendLayout(); + this.SuspendLayout(); + // + // grpFiles + // + this.grpFiles.Controls.Add(this.lblValue); + this.grpFiles.Controls.Add(this.progressBar); + this.grpFiles.Controls.Add(this.lblProcess); + this.grpFiles.Location = new System.Drawing.Point(12, 9); + this.grpFiles.Name = "grpFiles"; + this.grpFiles.Size = new System.Drawing.Size(448, 88); + this.grpFiles.TabIndex = 4; + this.grpFiles.TabStop = false; + // + // lblValue + // + this.lblValue.Location = new System.Drawing.Point(294, 24); + this.lblValue.Name = "lblValue"; + this.lblValue.Size = new System.Drawing.Size(138, 16); + this.lblValue.TabIndex = 2; + this.lblValue.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // progressBar + // + this.progressBar.Location = new System.Drawing.Point(16, 40); + this.progressBar.Name = "progressBar"; + this.progressBar.Size = new System.Drawing.Size(416, 23); + this.progressBar.Step = 1; + this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous; + this.progressBar.TabIndex = 1; + // + // lblProcess + // + this.lblProcess.Location = new System.Drawing.Point(16, 24); + this.lblProcess.Name = "lblProcess"; + this.lblProcess.Size = new System.Drawing.Size(272, 16); + this.lblProcess.TabIndex = 0; + // + // btnCancel + // + this.btnCancel.Location = new System.Drawing.Point(385, 112); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 23); + this.btnCancel.TabIndex = 5; + this.btnCancel.Text = "&Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // Loader + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(473, 148); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.grpFiles); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "Loader"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "WebsitePanel Installer"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OnLoaderFormClosing); + this.grpFiles.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grpFiles; + private System.Windows.Forms.ProgressBar progressBar; + private System.Windows.Forms.Label lblProcess; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Label lblValue; + } +} \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.cs new file mode 100644 index 00000000..81eeab02 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.cs @@ -0,0 +1,156 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.IO; +using System.Threading; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Ionic.Zip; + +using WebsitePanel.Installer.Services; +using WebsitePanel.Installer.Common; + +namespace WebsitePanel.Installer.Controls +{ + public delegate void OperationProgressDelegate(int percentage); + + /// + /// Loader form. + /// + internal partial class Loader : Form + { + private AppContext appContext; + private Core.Loader appLoader; + + public Loader() + { + InitializeComponent(); + DialogResult = DialogResult.Cancel; + } + + public Loader(AppContext context, string remoteFile) + : this() + { + this.appContext = context; + // + appLoader = new Core.Loader(remoteFile); + // + Start(); + } + + public Loader(AppContext context, string localFile, string componentCode, string version) + : this() + { + this.appContext = context; + // + appLoader = new Core.Loader(localFile, componentCode, version); + // + Start(); + } + + private void Start() + { + // + appLoader.OperationFailed += new EventHandler>(appLoader_OperationFailed); + appLoader.ProgressChanged += new EventHandler>(appLoader_ProgressChanged); + appLoader.StatusChanged += new EventHandler>(appLoader_StatusChanged); + appLoader.OperationCompleted += new EventHandler(appLoader_OperationCompleted); + // + appLoader.LoadAppDistributive(); + } + + void appLoader_OperationCompleted(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + + void appLoader_StatusChanged(object sender, Core.LoaderEventArgs e) + { + lblProcess.Text = e.StatusMessage; + lblValue.Text = e.EventData; + // Adjust Cancel button availability for an operation being performed + if (btnCancel.Enabled != e.Cancellable) + { + btnCancel.Enabled = e.Cancellable; + } + // This check allows to avoid extra form redrawing operations + if (ControlBox != e.Cancellable) + { + ControlBox = e.Cancellable; + } + } + + void appLoader_ProgressChanged(object sender, Core.LoaderEventArgs e) + { + progressBar.Value = e.EventData; + // Adjust Cancel button availability for an operation being performed + if (btnCancel.Enabled != e.Cancellable) + { + btnCancel.Enabled = e.Cancellable; + } + // This check allows to avoid extra form redrawing operations + if (ControlBox != e.Cancellable) + { + ControlBox = e.Cancellable; + } + } + + void appLoader_OperationFailed(object sender, Core.LoaderEventArgs e) + { + appContext.AppForm.ShowError(e.EventData); + // + DialogResult = DialogResult.Abort; + Close(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + Log.WriteInfo("Execution was canceled by user"); + Close(); + } + + private void OnLoaderFormClosing(object sender, FormClosingEventArgs e) + { + if (this.DialogResult == DialogResult.Cancel) + { + appLoader.AbortOperation(); + } + // Remove event handlers + appLoader.OperationFailed -= new EventHandler>(appLoader_OperationFailed); + appLoader.ProgressChanged -= new EventHandler>(appLoader_ProgressChanged); + appLoader.StatusChanged -= new EventHandler>(appLoader_StatusChanged); + appLoader.OperationCompleted -= new EventHandler(appLoader_OperationCompleted); + } + } +} \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.resx new file mode 100644 index 00000000..ff31a6db --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/Loader.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.cs new file mode 100644 index 00000000..99bd9de9 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.cs @@ -0,0 +1,248 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Threading; + +namespace WebsitePanel.Installer.Controls +{ + /// + /// Animated Icon. + /// + [ToolboxItem(true)] + public class ProgressIcon : System.Windows.Forms.UserControl + { + private Thread thread = null; + private int currentFrame = 0; + private int delayInterval = 50; + private int pause = 0; + private int loopCount = 0; + private int currentLoop = 0; + private int firstFrame = 0; + private int lastFrame = 13; + private ImageList images; + private IContainer components; + + /// Initializes a new instance of the AnimatedIcon class. + /// + public ProgressIcon() + { + CheckForIllegalCrossThreadCalls = false; + InitializeComponent(); + + this.SetStyle(ControlStyles.UserPaint, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.DoubleBuffer, true); + this.SetStyle(ControlStyles.ResizeRedraw, true); + } + + #region Dispose + /// Clean up any resources being used. + /// to release both managed + /// and unmanaged resources; to release + /// only unmanaged resources. + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if( components != null ) + components.Dispose(); + + if( thread != null ) + thread.Abort(); + } + base.Dispose( disposing ); + } + #endregion + + #region Component Designer generated code + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProgressIcon)); + this.images = new System.Windows.Forms.ImageList(this.components); + this.SuspendLayout(); + // + // images + // + this.images.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("images.ImageStream"))); + this.images.TransparentColor = System.Drawing.Color.Transparent; + this.images.Images.SetKeyName(0, "ProgressImage00.bmp"); + this.images.Images.SetKeyName(1, "ProgressImage01.bmp"); + this.images.Images.SetKeyName(2, "ProgressImage02.bmp"); + this.images.Images.SetKeyName(3, "ProgressImage03.bmp"); + this.images.Images.SetKeyName(4, "ProgressImage04.bmp"); + this.images.Images.SetKeyName(5, "ProgressImage05.bmp"); + this.images.Images.SetKeyName(6, "ProgressImage06.bmp"); + this.images.Images.SetKeyName(7, "ProgressImage07.bmp"); + this.images.Images.SetKeyName(8, "ProgressImage08.bmp"); + this.images.Images.SetKeyName(9, "ProgressImage09.bmp"); + this.images.Images.SetKeyName(10, "ProgressImage10.bmp"); + this.images.Images.SetKeyName(11, "ProgressImage11.bmp"); + this.images.Images.SetKeyName(12, "ProgressImage12.bmp"); + // + // ProgressIcon + // + this.Name = "ProgressIcon"; + this.Size = new System.Drawing.Size(30, 30); + this.ResumeLayout(false); + + } + #endregion + + /// Starts animation from the beginning. + /// + public void StartAnimation() + { + StopAnimation(); + CheckRange(); // Check the first and the last frames + + thread = new Thread( new ThreadStart( threadFunc ) ); + thread.IsBackground = true; + thread.Start(); + } + + /// Stops animation not changing current frame number. + /// + public void StopAnimation() + { + if( thread != null ) + { + thread.Abort(); + thread = null; + } + currentLoop = 0; + } + + /// Displays the specified frame. + /// An index of the image stored in the . + public void ShowFrame2(int frame) + { + StopAnimation(); + + if( frame >= 0 && frame < images.Images.Count ) + currentFrame = frame; + else + currentFrame = 0; + + Refresh(); + } + + /// Occurs when the control is redrawn. + /// A that contains + /// the event data. + /// The OnPaint method draws current image from + /// the if exists. + protected override void OnPaint(PaintEventArgs e) + { + // Draw a crossed rectangle if there is no frame to display + + if( images == null || + currentFrame < 0 || + currentFrame >= images.Images.Count ) + { + if( this.Size.Width == 0 || this.Size.Height == 0 ) + return; + + Pen pen = new Pen( SystemColors.ControlText ); + e.Graphics.DrawRectangle( pen, 0, 0, this.Size.Width-1, this.Size.Height-1 ); + e.Graphics.DrawLine( pen, 0, 0, this.Size.Width, this.Size.Height ); + e.Graphics.DrawLine( pen, 0, this.Size.Height-1, this.Size.Width-1, 0 ); + pen.Dispose(); + } + else + { + // Draw the current frame + + e.Graphics.DrawImage( images.Images[currentFrame], 0, 0, this.Size.Width, this.Size.Height ); + } + } + + /// The method to be invoked when the thread begins executing. + /// + private void threadFunc() + { + bool wasPause = false; + currentFrame = firstFrame; + + while( thread != null && thread.IsAlive ) + { + Refresh(); // Redraw the current frame + wasPause = false; + + if( images != null ) + { + currentFrame++; + if( currentFrame > lastFrame || + currentFrame >= images.Images.Count ) + { + if( pause > 0 ) // Sleep after every loop + { + Thread.Sleep( pause ); + wasPause = true; + } + + currentFrame = firstFrame; + if( loopCount != 0 ) // 0 is infinitive loop + { + currentLoop++; + } + } + + if( loopCount != 0 && currentLoop >= loopCount ) + { + StopAnimation(); // The loop is completed + } + } + if( !wasPause ) // That prevents summation (pause + delayInterval) + Thread.Sleep( delayInterval ); + } + } + + /// Check if the last frame is no less than the first one. + /// Otherwise, swap them. + private void CheckRange() + { + if( lastFrame < firstFrame ) + { + int tmp = firstFrame; + firstFrame = lastFrame; + lastFrame = tmp; + } + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.resx new file mode 100644 index 00000000..bd3b1f7d --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ProgressIcon.resx @@ -0,0 +1,855 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc + qQAAAk1TRnQBSQFMAgEBDQEAAQ4BAAEEAQABHgEAAR4BAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAF4 + AwABeAMAAQEBAAEgBgAB4RIAIP8D/gH/A/4B/wP5Af8D8QH/A+kB/wPiAf8D7AH/A/EB/wPiAf8D4gH/ + A+wB/wP5Af8D/gH/A/4h//8AaQAY/wP+Af8D/gH/AfUB9AH1Af8D4gH/A9kB/wPZAf8D2QH/A9YB/wPp + Af8D7AH/A9YB/wPZAf8D2QH/A9kB/wPiAf8D8QH/A/4B/wP+Gf//AGkAFP8D/gH/AfUB9AH1Af8B9QH0 + AfUB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/ + AfUB9AH1Af8B9QH0AfUB/wP+Ff//AGkAEP8D/gH/A/EB/wPZAf8D3AH/A/kB/wPiAf8D2QH/A9kB/wPZ + Af8D2QH/A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9wB/wH1AfQB9QH/A+IB/wPZAf8D7AH/A/4R//8A + aQAM/wP+Af8D7AH/A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D1gH/A+kB/wPsAf8D1gH/ + A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/4N//8AaQAI/wP+Af8D8QH/A9kB/wPZ + Af8D2QH/A9kB/wPZAf8B9QH0AfUB/wPiAf8D1gH/A9wB/wPiAf8D8QH/AfUB9AH1Af8D4gH/A9wB/wPZ + Af8D3AH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Cf//AGkABP8D/gH/A/kB/wPZAf8D2QH/ + A9kB/wPZAf8D2QH/A9kB/wPiAf8D+QH/A/EB/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wPxAf8B9QH0 + AfUB/wPpAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B9QH0AfUB/wP+Bf//AGkABP8D/gH/A/kB/wPp + Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/gH/A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZ + Af8D2QH/A+IB/wP5Af8D/gX//wBpAAP+Af8D8QH/A+IB/wH1AfQB9QH/AfUB9AH1Af8D4gH/A9kB/wPZ + Af8D8QH/A/4p/wP+Af8D8QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wPiAf8D8QH/A/4B//8A + aQAD/gH/A+IB/wPWAf8D2QH/A+IB/wH1AfQB9QH/A/EB/wPsAf8D/jH/A/4B/wPsAf8D8QH/A/kB/wPp + Af8D2QH/A9YB/wPiAf8D/gH//wBpAAP5Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/jn/A/4B/wPx + Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wP5Af//AGkAA/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+ + Of8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB//8AaQAD6QH/A9kB/wPZAf8D2QH/A9kB/wPZ + Af8D+UH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB//8AaQAD4gH/A9kB/wPZAf8D2QH/A9kB/wPi + Af8D/kH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB//8AaQAB9QH0AfUB/wPxAf8D8QH/A/EB/wPx + Af8B9QH0AfUB/wP+Qf8D/gH/AfUB9AH1Af8D8QH/A/EB/wPxAf8D8QH/AfUB9AH1Af//AGkAA+kB/wPi + Af8D4gH/A+IB/wPiAf8D7AH/A/5B/wP+Af8D7AH/A+IB/wPiAf8D4gH/A+IB/wPpAf//AGkAA+IB/wPW + Af8D2QH/A9kB/wPWAf8D3AH/A/5B/wP+Af8D4gH/A9YB/wPZAf8D2QH/A9YB/wPiAf//AGkAA+kB/wPZ + Af8D2QH/A9kB/wPZAf8D2QH/A/lB/wP5Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wPiAf//AGkAA/EB/wPZ + Af8D2QH/A9kB/wPZAf8D1gH/A+wB/wP+Of8D/gH/A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+wB//8A + aQAD+QH/A9wB/wPZAf8D2QH/A9kB/wHoAeQB6AH/AfUB9AH1Af8B+QH8Afk5/wP+Af8D+QH/A+kB/wPZ + Af8D2QH/A9kB/wPZAf8D+QH//wBpAAP+Af8D4gH/A9YB/wHhAd4B4QH/AfgB8gH3Af8B6gH4AesB/wF8 + Ad4BgQH/AYUB2gGKAf8D/jH/A/4B/wPpAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wPiAf8D1gH/A+IB/wP+ + Af//AGkAA/4B/wH1AfQB9QH/AfAB6wHvAf8B8AH5AfEB/wG8AfsBwQH/AYkB+gGRAf8BagHoAXQB/wE1 + AcUBPgH/AZsB4gGgAf8D/in/A/4B/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/kB/wPxAf8B9QH0AfUB/wP+ + Af//AGkABP8D/gH/AeAB+AHiAf8BkgH7AZkB/wGDAfkBjAH/AYMB+QGMAf8BiQH6AZEB/wFqAegBdAH/ + ATUBxQE+Af8BjwHdAZQB/wP+Af8D/hn/A/4B/wP+Af8D7AH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/ + A/EB/wP+Bf//AGkABP8D/gH/AeoB+AHrAf8BkgH7AZkB/wGDAfkBjAH/AYkB+gGRAf8BiQH6AZEB/wGJ + AfoBkQH/AWoB6AF0Af8BoQHqAaYB/wGqAdIBqwH/AYIBvQGDAf8B2wHsAdsB/wH5AfwB+QH/A/4B/wP+ + Af8D/gH/A/kB/wPsAf8D7AH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wP5Af8D/gX//wBpAAj/ + A/4B/wHYAfoB2wH/AYkB+gGRAf8BiQH6AZEB/wGJAfoBkQH/AYMB+QGMAf8BmgH5AaEB/wHmAfsB6AH/ + AUIBogFEAf8BDwGGAREB/wEhAYwBIwH/ATQBlQE2Af8BkgHJAZMB/wH4AfIB+AH/A9wB/wPZAf8D2QH/ + A9kB/wP5Af8D4gH/A9kB/wPZAf8D2QH/A9kB/wPxAf8D/gn//wBpAAz/A/4B/wHRAfoB1AH/AYkB+gGR + Af8BgwH5AYwB/wGDAfkBjAH/AdgB+gHbAf8BmQHLAZkB/wEyAaMBNAH/ATsBqQE9Af8BMgGjATQB/wEc + AZABHgH/AXwBwgF9Af8B9AHwAfQB/wPWAf8D2QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8D2QH/A9kB/wPZ + Af8D7AH/A/4N//8AaQAQ/wP+Af8B2AH6AdsB/wGSAfsBmQH/AaoB/AGxAf8B0gHqAdIB/wFDAasBRQH/ + ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/ATIBowE0Af8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D8QH/A+kB/wPZAf8D8QH/A/4R//8AaQAU/wP+Af8B6gH4AesB/wHqAfgB6wH/AXwBwgF9 + Af8BKQGgASwB/wE7AakBPQH/ATsBqQE9Af8BOwGpAT0B/wEuAaIBMgH/AYkByAGKAf8B9AHwAfQB/wPZ + Af8D2QH/A9kB/wPZAf8D1gH/A+IB/wP5Af8D+QH/A/4V//8AaQAY/wP+Af8D/gH/Ac4B6wHQAf8BhAHI + AYYB/wFLAbABTQH/ATgBqAE6Af8BLgGiATIB/wEnAaABKQH/AYQByAGGAf8B8QHsAfEB/wPWAf8D1gH/ + A9kB/wPcAf8D4gH/AfUB9AH1Af8D/gH/A/4Z//8AaQAg/wP+Af8D/gH/AeoB+AHrAf8BuQHgAboB/wGS + AdABkwH/AW0BwAFvAf8BpAHYAaUB/wH0AfAB9AH/A+IB/wPpAf8D8QH/A/kB/wP+Af8D/iH//wBpACD/ + A/4B/wP+Af8B2wHsAdsB/wGgAdEBoQH/AXIBvAF0Af8BSQGlAUwB/wGZAcsBmQH/AaoB0gGrAf8BQgGi + AUQB/wFqAbQBawH/AZkBywGZAf8B2wHsAdsB/wP+Af8D/kH/A/4B/wP+Af8B3AHwAd0B/wGgAdEBoQH/ + AXIBvAF0Af8BSQGlAUwB/wGZAcsBmQH/AaoB0gGrAf8BQgGiAUQB/wFqAbQBawH/AZkBywGZAf8B2wHs + AdsB/wP+Af8D/kH/A/4B/wP+Af8B4AH4AeIB/wG0AewBuAH/AZAB5gGWAf8BbAHbAXQB/wGkAesBqQH/ + AfQB8AH0Af8D4gH/A+IB/wPsAf8D+QH/A/4B/wP+Qf8D/gH/A/4B/wP5Af8D8QH/A+kB/wPiAf8D7AH/ + A/EB/wPiAf8D4gH/A+wB/wP5Af8D/gH/A/45/wP+Af8D/gH/Ab8B4AHAAf8BYQGxAWIB/wEqAZoBLQH/ + ARwBkAEeAf8BFwGMARkB/wEQAYgBEQH/AYUBwgGGAf8BkgHJAZMB/wEKAYMBDAH/ARMBiAEVAf8BEwGI + ARUB/wEiAZIBJAH/AVkBrAFbAf8BswHbAbQB/wP+Af8D/jH/A/4B/wP+Af8BvwHgAcAB/wFhAbEBYgH/ + ASoBmgEtAf8BHAGQAR4B/wEXAYwBGQH/ARABiAERAf8BhQHCAYYB/wGSAckBkwH/AQoBgwEMAf8BEwGI + ARUB/wETAYgBFQH/ASIBkgEkAf8BWQGsAVsB/wGzAdsBtAH/A/4B/wP+Mf8D/gH/A/4B/wHNAfMB0AH/ + AYMB4QGJAf8BWgHdAWMB/wFLAdkBVAH/AUkB0gFSAf8BQgHQAUsB/wGVAeoBmwH/AfEB7AHxAf8D1gH/ + A9kB/wPZAf8D2QH/A+IB/wPxAf8D/gH/A/4x/wP+Af8D/gH/AfUB9AH1Af8D4gH/A9kB/wPZAf8D2QH/ + A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/A9kB/wPiAf8D8QH/A/4B/wP+Lf8D/gH/AckB4gHJAf8BuQHg + AboB/wGSAckBkwH/ARMBiAEVAf8BIgGSASQB/wEiAZIBJAH/ASIBkgEkAf8BFwGMARkB/wGJAcIBigH/ + AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEKAYMBDAH/AWoBtAFrAf8ByQHi + AckB/wHBAeIBwgH/A/4p/wP+Af8ByQHiAckB/wG/AeABwAH/AZIByQGTAf8BEwGIARUB/wEiAZIBJAH/ + ASIBkgEkAf8BIgGSASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHLAZkB/wETAYgBFQH/ASIBkgEkAf8BIgGS + ASQB/wEaAYwBHAH/AQoBgwEMAf8BagG0AWsB/wHWAfQB2AH/AdAB8wHTAf8D/in/A/4B/wHJAeIByQH/ + AbgB3QG5Af8BrQHyAbIB/wFLAdkBVAH/AVUB2wFeAf8BVQHbAV4B/wFVAdsBXgH/AUkB0gFSAf8BmAHq + AZ0B/wHxAewB8QH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wP+Kf8D/gH/ + AfUB9AH1Af8B9QH0AfUB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/ + A9kB/wPWAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wP+Jf8D/gH/AasB2AGsAf8BLgGcATEB/wE5AaEBOwH/ + AdcB6gHYAf8BTwGqAVEB/wEiAZIBJAH/AScBlgEpAf8BIgGSASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHL + AZkB/wETAYgBFQH/ASIBkgEkAf8BIgGSASQB/wEaAYwBHAH/ASwBlQEuAf8B0AHnAdAB/wFJAaUBTAH/ + ARoBjAEcAf8BmQHLAZkB/wP+If8D/gH/AasB2AGsAf8BLgGcATEB/wE5AaEBOwH/AdcB6gHYAf8BTwGq + AVEB/wEiAZIBJAH/AScBlgEpAf8BIgGSASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHLAZkB/wETAYgBFQH/ + ASIBkgEkAf8BIgGSASQB/wEaAYwBHAH/ASwBlQEuAf8B0gHqAdIB/wFsAdsBdAH/AUIBywFKAf8BrAHq + AbAB/wP+If8D/gH/AasB2AGsAf8BLgGcATEB/wE5AaEBOwH/AdwB8AHdAf8BfAHnAYMB/wFVAdsBXgH/ + AVoB3QFjAf8BVQHbAV4B/wFJAdIBUgH/AZUB6gGbAf8B8QHsAfEB/wPZAf8D2QH/A9kB/wPZAf8D3AH/ + AfUB9AH1Af8D4gH/A9kB/wPsAf8D/iH/A/4B/wPxAf8D2QH/A9wB/wP5Af8D4gH/A9kB/wPZAf8D2QH/ + A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/A9kB/wPcAf8B9QH0AfUB/wPiAf8D2QH/A+wB/wP+Hf8D/gH/ + AZoB0gGbAf8BIwGZASYB/wEmAZgBKQH/AR8BkgEhAf8BkgHJAZMB/wG5AeABugH/ASIBkgEkAf8BJgGY + ASkB/wEmAZgBKQH/ARwBkAEeAf8BiQHIAYoB/wGaAdIBmwH/ARwBkAEeAf8BJgGYASkB/wEiAZIBJAH/ + ARMBiAEVAf8BlgHJAZgB/wGqAdIBqwH/ARMBiAEVAf8BGgGMARwB/wETAYgBFQH/AYcBwgGIAf8D/hn/ + A/4B/wGaAdIBmwH/ASMBmQEmAf8BJgGYASkB/wEfAZIBIQH/AZIByQGTAf8BuAHdAbkB/wEiAZIBJAH/ + ASIBkgEkAf8BJgGYASkB/wEcAZABHgH/AYkByAGKAf8BmgHSAZsB/wEcAZABHgH/ASYBmAEpAf8BIgGS + ASQB/wETAYgBFQH/AZABxQGRAf8BvAHxAcAB/wFCAdABSwH/AUIBywFKAf8BPAHLAUUB/wGbAeIBoAH/ + A/4Z/wP+Af8BmgHSAZsB/wEjAZkBJgH/ASYBmAEpAf8BHwGSASEB/wGJAcIBigH/Ac4B+gHRAf8BVQHb + AV4B/wFaAd0BYwH/AVoB4AFjAf8BWgHgAWMB/wGlAfIBqgH/AfEB7AHxAf8D1gH/A9kB/wPZAf8D2QH/ + A+wB/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/4Z/wP+Af8D7AH/A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/ + A9kB/wPZAf8D1gH/A+kB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D6QH/ + A/4V/wP+Af8BqwHYAawB/wEmAZgBKQH/ASoBmgEtAf8BKgGaAS0B/wEqAZoBLQH/ATEBnQEzAf8B0gHq + AdIB/wFpAbsBawH/ASMBmQEmAf8BSAGtAUsB/wFiAboBYwH/AbkB4AG6Af8BwQHiAcIB/wFtAcABbwH/ + AVIBsgFUAf8BMgGjATQB/wFTAakBVQH/AdsB7AHbAf8BPwGdAUEB/wEaAYwBHAH/ASIBkgEkAf8BGgGM + ARwB/wESAYQBFAH/AZIByQGTAf8D/hH/A/4B/wGrAdgBrAH/ASYBmAEpAf8BKgGaAS0B/wEuAZwBMQH/ + ASoBmgEtAf8BMQGdATMB/wHSAeoB0gH/AWkBuwFrAf8BIwGZASYB/wFIAa0BSwH/AWIBugFjAf8BuQHg + AboB/wHBAeIBwgH/AW0BwAFvAf8BUgGyAVQB/wEyAaMBNAH/AU8BqgFRAf8B3AHwAd0B/wFlAdoBbQH/ + AUIB0AFLAf8BSQHSAVIB/wFCAdABSwH/ATwBywFFAf8BqQHpAa0B/wP+Ef8D/gH/AasB2AGsAf8BJgGY + ASkB/wEqAZoBLQH/ASoBmgEtAf8BKgGaAS0B/wExAZ0BMwH/AdIB6gHSAf8BlAHwAZoB/wFnAewBcQH/ + AYIB8QGKAf8BmgH5AaEB/wHRAfoB1AH/AfQB8AH0Af8D4gH/A9wB/wPZAf8D3AH/A/kB/wPcAf8D2QH/ + A9kB/wPZAf8D2QH/A+wB/wP+Ef8D/gH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D4gH/ + A9YB/wPcAf8D4gH/A/EB/wH1AfQB9QH/A+IB/wPcAf8D2QH/A9wB/wP5Af8D3AH/A9kB/wPZAf8D2QH/ + A9kB/wPsAf8D/g3/A/4B/wHcAfAB3QH/ATIBowE0Af8BJgGYASkB/wEuAZwBMQH/AS4BnAExAf8BLgGc + ATEB/wEfAZIBIQH/AWEBsQFiAf8B0gHqAdIB/wGrAdgBrAH/AegB9QHoAf8D/gH/A/4B/wP+Af8D/gH/ + AfAB+QHxAf8BswHbAbQB/wHLAegBywH/AZIB0AGTAf8BHwGSASEB/wEfAZIBIQH/ASIBkgEkAf8BIQGM + ASMB/wEaAYwBHAH/ARoBjAEcAf8ByQHiAckB/wP+Cf8D/gH/AdwB8AHdAf8BMgGjATQB/wEmAZgBKQH/ + AS4BnAExAf8BLgGcATEB/wEuAZwBMQH/AR8BkgEhAf8BYQGxAWIB/wHSAeoB0gH/AasB2AGsAf8B6gH4 + AesB/wP+Af8D/gH/A/4B/wP+Af8B8AH5AfEB/wGzAdsBtAH/AcsB6AHLAf8BxQH6AckB/wFaAeABYwH/ + AUkB0gFSAf8BSQHSAVIB/wFJAdIBUgH/AUIBywFKAf8BQgHLAUoB/wHWAfQB2AH/A/4J/wP+Af8B3AHw + Ad0B/wEyAaMBNAH/ASYBmAEpAf8BLgGcATEB/wEuAZwBMQH/AS4BnAExAf8BHwGSASEB/wFhAbEBYgH/ + AeAB+AHiAf8BxQH6AckB/wHwAfkB8QH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/AfUB9AH1Af8D6QH/ + A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wP5Af8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/AfUB9AH1Af8D6QH/ + A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wHgAfEB4QH/AZIByQGTAf8BMgGj + ATQB/wEjAZkBJgH/AS4BnAExAf8BJgGYASkB/wEmAZgBKQH/AZIByQGTAf8D/gH/A/4Z/wP+Af8D/gH/ + AasB2AGsAf8BRQGwAUcB/wEqAZoBLQH/AR8BigEhAf8BFwGMARkB/wEaAYwBHAH/AWoBtAFrAf8B3AHw + Ad0B/wP+Cf8D/gH/AeAB8QHhAf8BkgHJAZMB/wEyAaMBNAH/ASMBmQEmAf8BKgGaAS0B/wEmAZgBKQH/ + ASYBmAEpAf8BkgHJAZMB/wP+Af8D/hn/A/4B/wP+Af8B0QH6AdQB/wGaAfkBoQH/AWsB5QF0Af8BSAHS + AVEB/wFCAdABSwH/AUIBywFKAf8BgQHgAYYB/wHgAfgB4gH/A/4J/wP+Af8B4AHxAeEB/wGSAckBkwH/ + ATIBowE0Af8BIwGZASYB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wGSAckBkwH/A/4B/wP+Gf8D/gH/ + A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPiAf8D+QH/A/4J/wP+Af8B8AH5AfEB/wHxAewB8QH/ + AdwB2gHcAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Af8D/hn/A/4B/wP+Af8D7AH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D4gH/A/kB/wP+Bf8D/gH/AbkB4AG6Af8BUgGyAVQB/wHBAeIBwgH/AdIB6gHSAf8BcgG8 + AXQB/wEjAZkBJgH/ARwBkAEeAf8BqgHSAasB/wP+Kf8D/gH/AcEB4gHCAf8BRQGwAUcB/wEiAZIBJAH/ + AVMBqQFVAf8BwQHiAcIB/wHJAeIByQH/AVMBqQFVAf8BqgHSAasB/wP+Af8D/gH/AbkB4AG6Af8BUgGy + AVQB/wHBAeIBwgH/AdIB6gHSAf8BcgG8AXQB/wEjAZkBJgH/ARwBkAEeAf8BqgHSAasB/wP+Kf8D/gH/ + Ad0B+wHgAf8BmgH5AaEB/wFaAeABYwH/AWwB2wF0Af8BxQH6AckB/wH4AfIB+AH/A+IB/wPxAf8D/gH/ + A/4B/wG5AeABugH/AVIBsgFUAf8BwQHiAcIB/wHSAeoB0gH/AXIBvAF0Af8BIwGZASYB/wEcAZABHgH/ + AaoB0gGrAf8D/in/A/4B/wPxAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPxAf8D/gH/ + A/4B/wHRAfoB1AH/AYIB8QGKAf8BzgH6AdEB/wH4AfIB+AH/AegB5AHoAf8D2QH/A9kB/wPxAf8D/in/ + A/4B/wPxAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPxAf8D/gH/A/4B/wFyAbwBdAH/ + ASMBmQEmAf8BKgGaAS0B/wFwAbkBcgH/AdIB6gHSAf8BswHbAbQB/wGZAcsBmQH/A/4x/wP+Af8BswHb + AbQB/wGzAdsBtAH/AdsB7AHbAf8BeQG8AXsB/wEiAZIBJAH/AQoBgwEMAf8BUwGpAVUB/wP+Af8D/gH/ + AXIBvAF0Af8BIwGZASYB/wEqAZoBLQH/AXABuQFyAf8B0gHqAdIB/wGzAdsBtAH/AZkBywGZAf8D/jH/ + A/4B/wHRAfoB1AH/Ac4B+gHRAf8B8AH5AfEB/wHxAewB8QH/A9kB/wPWAf8D4gH/A/4B/wP+Af8BcgG8 + AXQB/wEjAZkBJgH/ASoBmgEtAf8BcAG5AXIB/wHSAeoB0gH/AbMB2wG0Af8BmQHLAZkB/wP+Mf8D/gH/ + A+wB/wPxAf8D+QH/A+kB/wPZAf8D1gH/A+IB/wP+Af8D/gH/AZ4B8wGkAf8BagHoAXQB/wFqAegBdAH/ + AZQB8AGaAf8B4AH4AeIB/wH0AfAB9AH/A+wB/wP+Mf8D/gH/A+wB/wPxAf8D+QH/A+kB/wPZAf8D1gH/ + A+IB/wP+Af8B4AHxAeEB/wE/AakBQQH/ATIBowE0Af8BMgGjATQB/wEqAZoBLQH/ASYBmAEpAf8BmQHL + AZkB/wP+Of8D/gH/AcEB4gHCAf8BPwGpAUEB/wETAYgBFQH/AR8BigEhAf8BGgGMARwB/wEiAZIBJAH/ + AdIB6gHSAf8B4AHxAeEB/wE/AakBQQH/ATIBowE0Af8BMgGjATQB/wEqAZoBLQH/ASYBmAEpAf8BmQHL + AZkB/wP+Of8D/gH/AfQB8AH0Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wP5Af8B4AHxAeEB/wE/AakBQQH/ + ATIBowE0Af8BMgGjATQB/wEqAZoBLQH/ASYBmAEpAf8BmQHLAZkB/wP+Of8D/gH/A/EB/wPcAf8D2QH/ + A9kB/wPZAf8D2QH/A/kB/wHqAfgB6wH/AXoB8gGBAf8BdQHxAX4B/wFxAesBegH/AWoB6AF0Af8BWgHd + AWMB/wGkAesBqQH/A/45/wP+Af8D8QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D+QH/AasB2AGsAf8BLgGi + ATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGjATQB/wETAYgBFQH/AZIByQGTAf8D/jn/A/4B/wGzAdsBtAH/ + ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AasB2AGsAf8BLgGi + ATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGjATQB/wETAYgBFQH/AZIByQGTAf8D/jn/A/4B/wPsAf8D2QH/ + A9kB/wPZAf8D2QH/A9kB/wPsAf8BqwHYAawB/wEuAaIBMgH/ATYBpAE5Af8BNgGkATkB/wEyAaMBNAH/ + ARMBiAEVAf8BkgHJAZMB/wP+Of8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wHKAfkBzQH/ + AXUB8QF+Af8BegHyAYEB/wF6AfIBgQH/AXEB6wF6Af8BQAHPAUoB/wGkAeYBqAH/A/45/wP+Af8D7AH/ + A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/AYQByAGGAf8BKQGgASwB/wE2AaQBOQH/ATYBpAE5Af8BKgGa + AS0B/wEhAYwBIwH/AdsB7AHbQf8B6AH1AegB/wFLAbABTQH/ASYBmAEpAf8BIgGSASQB/wEiAZIBJAH/ + ARMBiAEVAf8BagG0AWsB/wGEAcgBhgH/ASkBoAEsAf8BNgGkATkB/wE2AaQBOQH/ASoBmgEtAf8BIQGM + ASMB/wHbAewB20H/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wGEAcgBhgH/ASkBoAEsAf8BNgGk + ATkB/wE2AaQBOQH/ASoBmgEtAf8BIQGMASMB/wHbAewB20H/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/ + A+IB/wGqAfwBsQH/AXUB8QF+Af8BegHyAYEB/wF6AfIBgQH/AWgB5QFxAf8BQgHLAUoB/wHgAfEB4UH/ + A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wFpAbsBawH/AS4BogEyAf8BNgGkATkB/wE2AaQBOQH/ + ASIBkgEkAf8BPgGbAUAB/wH5AfwB+UH/A/4B/wFtAcABbwH/ASMBmQEmAf8BHwGKASEB/wEfAZIBIQH/ + ARcBjAEZAf8BSQGlAUwB/wFpAbsBawH/AS4BogEyAf8BNgGkATkB/wE2AaQBOQH/ASIBkgEkAf8BPgGb + AUAB/wH5AfwB+UH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wFpAbsBawH/AS4BogEyAf8BNgGk + ATkB/wE2AaQBOQH/ASIBkgEkAf8BPgGbAUAB/wH5AfwB+UH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/ + A+IB/wGaAfkBoQH/AXoB8gGBAf8BegHyAYEB/wF6AfIBgQH/AVoB4AFjAf8BWwHQAWIB/wH5AfwB+UH/ + A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wHLAegBywH/AbkB4AG6Af8BuQHgAboB/wG5AeABugH/ + AbMB2wG0Af8BwQHiAcIB/wP+Qf8D/gH/AdIB6gHSAf8BuAHdAbkB/wGzAdsBtAH/AbMB2wG0Af8BswHb + AbQB/wG/AeABwAH/AcsB6AHLAf8BuQHgAboB/wG5AeABugH/AbkB4AG6Af8BswHbAbQB/wHBAeIBwgH/ + A/5B/wP+Af8B9QH0AfUB/wPxAf8D8QH/A/EB/wPxAf8B9QH0AfUB/wHLAegBywH/AbkB4AG6Af8BuQHg + AboB/wG5AeABugH/AbMB2wG0Af8BwQHiAcIB/wP+Qf8D/gH/AfUB9AH1Af8D8QH/A/EB/wPxAf8D8QH/ + AfUB9AH1Af8B3QH7AeAB/wHRAfoB1AH/AdQB/AHYAf8B1AH8AdgB/wHFAfIByAH/Ac0B8wHQAf8D/kH/ + A/4B/wH1AfQB9QH/A/EB/wPxAf8D8QH/A/EB/wH1AfQB9QH/AZIB0AGTAf8BfAHCAX0B/wF8AcIBfQH/ + AXwBwgF9Af8BaQG7AWsB/wGJAcIBigH/A/5B/wP+Af8BzgH6AdEB/wGeAfMBpAH/AYwB5gGSAf8BjAHm + AZIB/wGMAeYBkgH/AZwB7AGhAf8BkgHQAZMB/wF8AcIBfQH/AXwBwgF9Af8BfAHCAX0B/wFpAbsBawH/ + AYkBwgGKAf8D/kH/A/4B/wPsAf8D4gH/A+IB/wPiAf8D4gH/A+kB/wGSAdABkwH/AXwBwgF9Af8BfAHC + AX0B/wF8AcIBfQH/AWkBuwFrAf8BiQHCAYoB/wP+Qf8D/gH/A+wB/wPiAf8D4gH/A+IB/wPiAf8D6QH/ + AZIByQGTAf8BdQHAAXYB/wF4AcABeQH/AXwBwgF9Af8BagG0AWsB/wGIAb8BiQH/A/5B/wP+Af8D7AH/ + A+IB/wPiAf8D4gH/A+IB/wPpAf8BaQG7AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ + ATQBlQE2Af8B+QH8AflB/wP+Af8BngHzAaQB/wFfAeIBaQH/AUkB0gFSAf8BSwHZAVQB/wFCAdABSwH/ + AWwB2wF0Af8BaQG7AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ATQBlQE2Af8B8AH5 + AfFB/wP+Af8D4gH/A9YB/wPZAf8D2QH/A9YB/wPiAf8BaQG7AWsB/wEpAaABLAH/ATIBowE0Af8BMgGj + ATQB/wEcAZABHgH/ATQBlQE2Af8B8AH5AfFB/wP+Af8D4gH/A9YB/wPZAf8D2QH/A9YB/wPiAf8BaQG7 + AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ATQBlQE2Af8B8AH5AfFB/wP+Af8D4gH/ + A9YB/wPZAf8D2QH/A9YB/wPiAf8BiQHIAYoB/wEyAaMBNAH/ATsBqQE9Af8BOwGpAT0B/wEyAaMBNAH/ + AR8BigEhAf8B1wHqAdhB/wHvAfwB8AH/AYIB8QGKAf8BXwHiAWkB/wFVAdsBXgH/AVUB2wFeAf8BSQHS + AVIB/wGMAeYBkgH/AYkByAGKAf8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/ + AdcB6gHYQf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/AYkByAGKAf8BMgGjATQB/wE7AakBPQH/ + ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/AdcB6gHYQf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/ + AYkByAGKAf8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/AdcB6gHYQf8D+QH/ + A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOwGp + AT0B/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wHFAfoByQH/AWcB7AFxAf8BWgHdAWMB/wFaAd0BYwH/ + AVUB2wFeAf8BSwHZAVQB/wGwAewBtAH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOQGh + ATsB/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wPsAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wPsAf8BswHb + AbQB/wEyAaMBNAH/ATsBqQE9Af8BOwGpAT0B/wE5AaEBOwH/AQoBgwEMAf8BiQHCAYoB/wP+Of8D/gH/ + A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wGzAdsBtAH/ATIBowE0Af8BOwGpAT0B/wE7AakBPQH/ + ATkBoQE7Af8BCgGDAQwB/wGJAcIBigH/A/45/wP+Af8D7AH/A9YB/wPZAf8D2QH/A9kB/wPZAf8D7AH/ + AegB9QHoAf8BSwGwAU0B/wE7AakBPQH/ATIBowE0Af8BMgGjATQB/wFnAbYBaQH/AckB4gHJAf8B+QH8 + Afk5/wP+Af8B6gH4AesB/wGeAfMBpAH/AVoB3QFjAf8BVQHbAV4B/wFVAdsBXgH/AVoB3QFjAf8B4AH4 + AeIB/wHoAfUB6AH/AUsBsAFNAf8BOwGpAT0B/wEyAaMBNAH/ATIBowE0Af8BZwG2AWkB/wHJAeIByQH/ + AfkB/AH5Of8D/gH/A/kB/wPpAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wHoAfUB6AH/AUsBsAFNAf8BOwGp + AT0B/wEyAaMBNAH/ATIBowE0Af8BZwG2AWkB/wHJAeIByQH/AfkB/AH5Of8D/gH/A/kB/wPpAf8D2QH/ + A9kB/wPZAf8D2QH/A/kB/wHoAfUB6AH/AUsBsAFNAf8BOwGpAT0B/wEyAaMBNAH/ATIBowE0Af8BZwG2 + AWkB/wHJAeIByQH/AfkB/AH5Of8D/gH/A/kB/wPpAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wP+Af8BfAHC + AX0B/wEpAaABLAH/AVsBsQFdAf8BuQHgAboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/ + A+kB/wPiAf8B+AHyAfgB/wHRAfoB1AH/AXwB5wGDAf8BSwHZAVQB/wGDAeEBiQH/A/4B/wP+Af8BfAHC + AX0B/wEpAaABLAH/AVsBsQFdAf8BuQHgAboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/ + A+kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPWAf8D4gH/A/4B/wP+Af8BfAHCAX0B/wEpAaABLAH/ + AVsBsQFdAf8BuQHgAboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/A+kB/wPiAf8B9QH0 + AfUB/wH1AfQB9QH/A+IB/wPWAf8D4gH/A/4B/wP+Af8BfAHCAX0B/wEpAaABLAH/AVsBsQFdAf8BuQHg + AboB/wHgAfEB4QH/AWEBsQFiAf8BdAG1AXUB/wP+Mf8D/gH/A+kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/ + A+IB/wPWAf8D4gH/A/4B/wP+Af8BzgHrAdAB/wGfAdUBoQH/AdwB8AHdAf8BmgHSAZsB/wFDAasBRQH/ + ASYBmAEpAf8BEgGEARQB/wGQAcUBkQH/A/4p/wP+Af8D8QH/A9kB/wPZAf8D2QH/Ae0B6AHtAf8B9QH0 + AfUB/wG0AfMBuAH/AdAB8wHTAf8D/gH/A/4B/wHLAegBywH/AZ8B1QGhAf8B3AHwAd0B/wGaAdIBmwH/ + AUMBqwFFAf8BJgGYASkB/wESAYQBFAH/AZABxQGRAf8D/in/A/4B/wPxAf8D2QH/A9kB/wPZAf8D6QH/ + A/kB/wPxAf8B9QH0AfUB/wP+Af8D/gH/AcsB6AHLAf8BnwHVAaEB/wHcAfAB3QH/AZoB0gGbAf8BQwGr + AUUB/wEmAZgBKQH/ARIBhAEUAf8BkAHFAZEB/wP+Kf8D/gH/A/EB/wPZAf8D2QH/A9kB/wPpAf8D+QH/ + A/EB/wH1AfQB9QH/A/4B/wP+Af8BywHoAcsB/wGfAdUBoQH/AdwB8AHdAf8BmgHSAZsB/wFDAasBRQH/ + ASYBmAEpAf8BEgGEARQB/wGQAcUBkQH/A/4p/wP+Af8D8QH/A9kB/wPZAf8D2QH/A+kB/wP5Af8D8QH/ + AfUB9AH1Af8D/gX/A/4B/wHSAeoB0gH/AVIBsgFUAf8BMgGjATQB/wE7AakBPQH/AT8BqQFBAf8BLgGc + ATEB/wESAYQBFAH/AYIBvQGDAf8D/gH/A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/ + A9wB/wH0AfAB9AH/A/4J/wP+Af8B0gHqAdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/ + AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D8QH/A/4J/wP+Af8B0gHqAdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/ + AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D8QH/A/4J/wP+Af8B0gHqAdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/ + AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D8QH/A/4J/wP+Af8B4AHxAeEB/wFLAbABTQH/ATgBqAE6Af8BPwGpAUEB/wE7AakBPQH/ + AT8BqQFBAf8BIwGZASYB/wGJAcIBigH/AaoB0gGrAf8BggG9AYMB/wHbAewB2wH/AfkB/AH5Af8D/gH/ + A/4B/wP+Af8D+QH/A+wB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wP+Cf8D/gH/ + AeAB8QHhAf8BSwGwAU0B/wE4AagBOgH/AT8BqQFBAf8BOwGpAT0B/wE/AakBQQH/ASMBmQEmAf8BiQHC + AYoB/wGqAdIBqwH/AYIBvQGDAf8B2wHsAdsB/wH5AfwB+QH/A/4B/wP+Af8D/gH/A/kB/wPsAf8D7AH/ + A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wP5Af8D/gn/A/4B/wHgAfEB4QH/AUsBsAFNAf8BOAGo + AToB/wE/AakBQQH/ATsBqQE9Af8BPwGpAUEB/wEjAZkBJgH/AYkBwgGKAf8BqgHSAasB/wGCAb0BgwH/ + AdsB7AHbAf8B+QH8AfkB/wP+Af8D/gH/A/4B/wP5Af8D7AH/A+wB/wPxAf8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D+QH/A/4J/wP+Af8B4AHxAeEB/wFLAbABTQH/ATsBqQE9Af8BPwGpAUEB/wE7AakBPQH/ + AT8BqQFBAf8BIwGZASYB/wGJAcIBigH/AaoB0gGrAf8BggG9AYMB/wHbAewB2wH/AfkB/AH5Af8D/gH/ + A/4B/wP+Af8D+QH/A+wB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/kB/wP+Df8D/gH/ + AbkB4AG6Af8BOwGpAT0B/wE7AakBPQH/AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/AeAB8QHhAf8BQgGi + AUQB/wEQAYgBEQH/ASEBjAEjAf8BNAGVATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/A9kB/wPZAf8D2QH/ + A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/A/EB/wP+Ef8D/gH/AbkB4AG6Af8BOwGpAT0B/wE7AakBPQH/ + AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/AeAB8QHhAf8BQgGiAUQB/wEPAYYBEQH/ASEBjAEjAf8BNAGV + ATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/A9kB/wPZAf8D2QH/A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/ + A/EB/wP+Ef8D/gH/AbkB4AG6Af8BOwGpAT0B/wE7AakBPQH/AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/ + AeAB8QHhAf8BQgGiAUQB/wEPAYYBEQH/ASEBjAEjAf8BNAGVATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/ + A9kB/wPZAf8D2QH/A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/A/EB/wP+Ef8D/gH/AbkB4AG6Af8BOwGp + AT0B/wE7AakBPQH/AT8BqQFBAf8BNgGkATkB/wFfAboBYQH/AeAB8QHhAf8BQgGiAUQB/wEPAYYBEQH/ + ASEBjAEjAf8BNAGVATYB/wGSAckBkwH/AfgB8gH4Af8D3AH/A9kB/wPZAf8D2QH/A/kB/wPiAf8D2QH/ + A9kB/wPZAf8D2QH/A/EB/wP+Ff8D/gH/AbMB2wG0Af8BOwGpAT0B/wE4AagBOgH/ATYBpAE5Af8BuQHg + AboB/wGaAdIBmwH/ATIBowE0Af8BOwGpAT0B/wEyAaMBNAH/ARwBkAEeAf8BfAHCAX0B/wH0AfAB9AH/ + A9YB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wPZAf8D2QH/A9kB/wPsAf8D/hn/A/4B/wGzAdsBtAH/ + ATsBqQE9Af8BOAGoAToB/wE2AaQBOQH/AbkB4AG6Af8BmgHSAZsB/wEyAaMBNAH/ATsBqQE9Af8BMgGj + ATQB/wEcAZABHgH/AXwBwgF9Af8B9AHwAfQB/wPWAf8D2QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8D2QH/ + A9kB/wPZAf8D7AH/A/4Z/wP+Af8BswHbAbQB/wE7AakBPQH/ATgBqAE6Af8BNgGkATkB/wG5AeABugH/ + AZoB0gGbAf8BMgGjATQB/wE7AakBPQH/ATIBowE0Af8BHAGQAR4B/wF8AcIBfQH/AfQB8AH0Af8D1gH/ + A9kB/wPZAf8D2QH/A+IB/wH1AfQB9QH/A9kB/wPZAf8D2QH/A+wB/wP+Gf8D/gH/AbMB2wG0Af8BOwGp + AT0B/wE4AagBOgH/ATYBpAE5Af8BuQHgAboB/wGaAdIBmwH/ATIBowE0Af8BOwGpAT0B/wEyAaMBNAH/ + ARwBkAEeAf8BfAHCAX0B/wH0AfAB9AH/A9YB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wPZAf8D2QH/ + A9kB/wPsAf8D/h3/A/4B/wHBAeIBwgH/AUsBsAFNAf8BbQHAAW8B/wHSAeoB0gH/AUMBqwFFAf8BOwGp + AT0B/wE7AakBPQH/ATsBqQE9Af8BLgGiATIB/wGJAcgBigH/AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iH/A/4B/wHBAeIBwgH/AUsBsAFNAf8BbQHAAW8B/wHSAeoB0gH/ + AUMBqwFFAf8BOwGpAT0B/wE7AakBPQH/ATsBqQE9Af8BLgGiATIB/wGJAcgBigH/AfQB8AH0Af8D2QH/ + A9kB/wPZAf8D2QH/A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iH/A/4B/wHBAeIBwgH/AUsBsAFNAf8BbQHA + AW8B/wHSAeoB0gH/AUMBqwFFAf8BOwGpAT0B/wE7AakBPQH/ATsBqQE9Af8BLgGiATIB/wGJAcgBigH/ + AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iH/A/4B/wHBAeIBwgH/ + AUsBsAFNAf8BbQHAAW8B/wHSAeoB0gH/AUMBqwFFAf8BOwGpAT0B/wE7AakBPQH/ATsBqQE9Af8BMgGj + ATQB/wGJAcgBigH/AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPxAf8D6QH/A9kB/wPxAf8D/iX/ + A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/ + AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/in/ + A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/ + AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/in/ + A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/ + AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/in/ + A/4B/wHgAfEB4QH/AdwB8AHdAf8BfAHCAX0B/wEpAaABLAH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/ + AS4BogEyAf8BiQHIAYoB/wH0AfAB9AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D4gH/A/kB/wP5Af8D/i3/ + A/4B/wP+Af8BzgHrAdAB/wGEAcgBhgH/AUsBsAFNAf8BOAGoAToB/wEuAaIBMgH/AScBoAEpAf8BhAHI + AYYB/wHxAewB8QH/A9YB/wPWAf8D2QH/A9wB/wPiAf8B9AHwAfQB/wP+Af8D/jH/A/4B/wP+Af8BzgHr + AdAB/wGEAcgBhgH/AUsBsAFNAf8BOAGoAToB/wEuAaIBMgH/AScBoAEpAf8BhAHIAYYB/wH0AfAB9AH/ + A9YB/wPWAf8D2QH/A9wB/wPiAf8B9QH0AfUB/wP+Af8D/jH/A/4B/wP+Af8BzgHrAdAB/wGEAcgBhgH/ + AUsBsAFNAf8BOAGoAToB/wEuAaIBMgH/AScBoAEpAf8BhAHIAYYB/wHxAewB8QH/A9YB/wPWAf8D2QH/ + A9wB/wPiAf8B9QH0AfUB/wP+Af8D/jH/A/4B/wP+Af8BzgHrAdAB/wGEAcgBhgH/AUsBsAFNAf8BOAGo + AToB/wEuAaIBMgH/AScBoAEpAf8BhAHIAYYB/wHxAewB8QH/A9YB/wPWAf8D2QH/A9wB/wPiAf8B9QH0 + AfUB/wP+Af8D/jn/A/4B/wP+Af8B8AH5AfEB/wG5AeABugH/AZIB0AGTAf8BbQHAAW8B/wGkAdgBpQH/ + AfQB8AH0Af8D4gH/A+kB/wPxAf8D+QH/A/4B/wP+Qf8D/gH/A/4B/wHqAfgB6wH/AbkB4AG6Af8BkgHQ + AZMB/wFtAcABbwH/AaQB2AGlAf8B9AHwAfQB/wPiAf8D6QH/A/EB/wP5Af8D/gH/A/5B/wP+Af8D/gH/ + AeoB+AHrAf8BuQHgAboB/wGSAdABkwH/AW0BwAFvAf8BpAHYAaUB/wH0AfAB9AH/A+IB/wPpAf8D8QH/ + A/kB/wP+Af8D/kH/A/4B/wP+Af8B6gH4AesB/wG5AeABugH/AZIB0AGTAf8BbQHAAW8B/wGkAdgBpQH/ + AfQB8AH0Af8D4gH/A+kB/wPxAf8D+QH/A/4B/wP+Qf8D/gH/A/4B/wHgAfgB4gH/AbQB7AG4Af8BkAHm + AZYB/wFsAdsBdAH/AbEB8QG1Af8BoAHRAaEB/wFCAaIBRAH/AWoBtAFrAf8BmQHLAZkB/wHbAewB2wH/ + A/4B/wP+Qf8D/gH/A/4B/wHbAewB2wH/AaAB0QGhAf8BcgG8AXQB/wFJAaUBTAH/AZkBywGZAf8BqgHS + AasB/wFCAaIBRAH/AWoBtAFrAf8BmQHLAZkB/wHbAewB2wH/A/4B/wP+Qf8D/gH/A/4B/wHcAfAB3QH/ + AaAB0QGhAf8BcgG8AXQB/wFJAaUBTAH/AZkBywGZAf8BqgHSAasB/wFCAaIBRAH/AWoBtAFrAf8BmQHL + AZkB/wHbAewB2wH/A/4B/wP+Qf8D/gH/A/4B/wHcAfAB3QH/AaAB0QGhAf8BcgG8AXQB/wFJAaUBTAH/ + AZkBywGZAf8BqgHSAasB/wFCAaIBRAH/AWoBtAFrAf8BmQHLAZkB/wHbAewB2wH/A/4B/wP+Of8D/gH/ + A/4B/wHNAfMB0AH/AYMB4QGJAf8BWgHdAWMB/wFLAdkBVAH/AUkB0gFSAf8BQgHQAUsB/wGhAeoBpgH/ + AZIByQGTAf8BCgGDAQwB/wETAYgBFQH/ARMBiAEVAf8BIgGSASQB/wFZAawBWwH/AbMB2wG0Af8D/gH/ + A/4x/wP+Af8D/gH/Ab8B4AHAAf8BYQGxAWIB/wEqAZoBLQH/ARoBjAEcAf8BFwGMARkB/wEQAYgBEQH/ + AYUBwgGGAf8BkgHJAZMB/wEKAYMBDAH/ARMBiAEVAf8BEwGIARUB/wEiAZIBJAH/AVkBrAFbAf8BswHb + AbQB/wP+Af8D/jH/A/4B/wP+Af8BvwHgAcAB/wFhAbEBYgH/ASoBmgEtAf8BGgGMARwB/wEXAYwBGQH/ + ARABiAERAf8BhQHCAYYB/wGSAckBkwH/AQoBgwEMAf8BEwGIARUB/wETAYgBFQH/ASIBkgEkAf8BWQGs + AVsB/wGzAdsBtAH/A/4B/wP+Mf8D/gH/A/4B/wHBAeIBwgH/AWEBsQFiAf8BKgGaAS0B/wEcAZABHgH/ + ARcBjAEZAf8BEAGIAREB/wGFAcIBhgH/AZYByQGYAf8BCgGDAQwB/wETAYgBFQH/ARMBiAEVAf8BIgGS + ASQB/wFZAawBWwH/AbMB2wG0Af8D/gH/A/4t/wP+Af8B9QH0AfUB/wH4AfIB+AH/AakB6QGtAf8BSwHZ + AVQB/wFVAdsBXgH/AVUB2wFeAf8BVQHbAV4B/wFJAdIBUgH/AaQB6wGpAf8BlgHJAZgB/wETAYgBFQH/ + ASIBkgEkAf8BHwGSASEB/wEaAYwBHAH/AQoBgwEMAf8BagG0AWsB/wHJAeIByQH/AcEB4gHCAf8D/in/ + A/4B/wHJAeIByQH/AbkB4AG6Af8BkgHJAZMB/wETAYgBFQH/ASIBkgEkAf8BIgGSASQB/wEiAZIBJAH/ + ARcBjAEZAf8BiQHCAYoB/wGZAcsBmQH/ARMBiAEVAf8BIgGSASQB/wEfAZIBIQH/ARoBjAEcAf8BCgGD + AQwB/wFqAbQBawH/AckB4gHJAf8BwQHiAcIB/wP+Kf8D/gH/AckB4gHJAf8BvwHgAcAB/wGSAckBkwH/ + ARMBiAEVAf8BIgGSASQB/wEiAZIBJAH/ASIBkgEkAf8BFwGMARkB/wGJAcIBigH/AZkBywGZAf8BEwGI + ARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEKAYMBDAH/AWoBtAFrAf8ByQHiAckB/wHBAeIBwgH/ + A/4p/wP+Af8ByQHiAckB/wG5AeABugH/AZIByQGTAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BIgGS + ASQB/wEXAYwBGQH/AYkBwgGKAf8BmQHLAZkB/wETAYgBFQH/ASIBkgEkAf8BHwGSASEB/wEaAYwBHAH/ + AQoBgwEMAf8BagG0AWsB/wHJAeIByQH/AcEB4gHCAf8D/iX/A/4B/wPxAf8D2QH/A9wB/wHvAfwB8AH/ + AXUB5QF9Af8BVQHbAV4B/wFaAd0BYwH/AVUB2wFeAf8BSQHSAVIB/wGkAesBqQH/AZIByQGTAf8BEwGI + ARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEsAZUBLgH/AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/ + AZkBywGZAf8D/iH/A/4B/wGrAdgBrAH/AS4BnAExAf8BOQGhATsB/wHXAeoB2AH/AU8BqgFRAf8BIgGS + ASQB/wEnAZYBKQH/AScBlgEpAf8BFwGMARkB/wGJAcIBigH/AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ + ASIBkgEkAf8BGgGMARwB/wEsAZUBLgH/AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/AZkBywGZAf8D/iH/ + A/4B/wGrAdgBrAH/AS4BnAExAf8BOQGhATsB/wHXAeoB2AH/AU8BqgFRAf8BIgGSASQB/wEnAZYBKQH/ + ASIBkgEkAf8BFwGMARkB/wGJAcIBigH/AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGM + ARwB/wEsAZUBLgH/AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/AZkBywGZAf8D/iH/A/4B/wGrAdgBrAH/ + AS4BnAExAf8BOQGhATsB/wHXAeoB2AH/AU8BqgFRAf8BIgGSASQB/wEnAZYBKQH/AScBlgEpAf8BFwGM + ARkB/wGJAcIBigH/AZkBywGZAf8BEwGIARUB/wEiAZIBJAH/ASIBkgEkAf8BGgGMARwB/wEsAZUBLgH/ + AdAB5wHQAf8BSQGlAUwB/wEaAYwBHAH/AZkBywGZAf8D/h3/A/4B/wPsAf8D2QH/A9kB/wPZAf8B8QHs + AfEB/wHFAfIByAH/AVUB2wFeAf8BWgHdAWMB/wFaAeABYwH/AVoB4AFjAf8BsQH7AbYB/wGZAcsBmQH/ + ARwBkAEeAf8BJwGWASkB/wEiAZIBJAH/ARMBiAEVAf8BlgHJAZgB/wGqAdIBqwH/ARMBiAEVAf8BGgGM + ARwB/wETAYgBFQH/AYcBwgGIAf8D/hn/A/4B/wGaAdIBmwH/ASMBmQEmAf8BJgGYASkB/wEfAZIBIQH/ + AZIByQGTAf8BuAHdAbkB/wEiAZIBJAH/AScBlgEpAf8BJgGYASkB/wEcAZABHgH/AYkByAGKAf8BmgHS + AZsB/wEcAZABHgH/AScBlgEpAf8BIgGSASQB/wETAYgBFQH/AZYByQGYAf8BqgHSAasB/wETAYgBFQH/ + ARoBjAEcAf8BEgGEARQB/wGHAcIBiAH/A/4Z/wP+Af8BmgHSAZsB/wEjAZkBJgH/ASYBmAEpAf8BHwGS + ASEB/wGSAckBkwH/AbgB3QG5Af8BIgGSASQB/wEnAZYBKQH/ASYBmAEpAf8BHAGQAR4B/wGJAcgBigH/ + AZoB0gGbAf8BHAGQAR4B/wEnAZYBKQH/ASIBkgEkAf8BEwGIARUB/wGWAckBmAH/AaoB0gGrAf8BEwGI + ARUB/wEaAYwBHAH/ARIBhAEUAf8BhwHCAYgB/wP+Gf8D/gH/AZoB0gGbAf8BIwGZASYB/wEmAZgBKQH/ + AR8BkgEhAf8BkgHJAZMB/wG4Ad0BuQH/ASIBkgEkAf8BJwGWASkB/wEmAZgBKQH/ARwBkAEeAf8BiQHI + AYoB/wGaAdIBmwH/ARwBkAEeAf8BJwGWASkB/wEiAZIBJAH/ARMBiAEVAf8BlgHJAZgB/wGqAdIBqwH/ + ARMBiAEVAf8BGgGMARwB/wETAYgBFQH/AYcBwgGIAf8D/hX/A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/ + AdwB2gHcAf8B9QH0AfUB/wGKAewBkQH/AWcB7AFxAf8BggHxAYoB/wGaAfkBoQH/AdgB+gHbAf8BwQHi + AcIB/wFtAcABbwH/AVIBsgFUAf8BMgGjATQB/wFTAakBVQH/AdsB7AHbAf8BPwGdAUEB/wEaAYwBHAH/ + ASIBkgEkAf8BGgGMARwB/wESAYQBFAH/AZYByQGYAf8D/hH/A/4B/wGrAdgBrAH/ASYBmAEpAf8BKgGa + AS0B/wEqAZoBLQH/ASoBmgEtAf8BMQGdATMB/wHSAeoB0gH/AWkBuwFrAf8BIwGZASYB/wFIAa0BSwH/ + AWIBugFjAf8BuQHgAboB/wHBAeIBwgH/AW0BwAFvAf8BUgGyAVQB/wEyAaMBNAH/AVMBqQFVAf8B2wHs + AdsB/wE/AZ0BQQH/ARoBjAEcAf8BIgGSASQB/wEaAYwBHAH/ARIBhAEUAf8BlgHJAZgB/wP+Ef8D/gH/ + AasB2AGsAf8BJgGYASkB/wEqAZoBLQH/ASoBmgEtAf8BKgGaAS0B/wExAZ0BMwH/AdIB6gHSAf8BaQG7 + AWsB/wEjAZkBJgH/AUoBrAFNAf8BYgG6AWMB/wG5AeABugH/AcEB4gHCAf8BbQHAAW8B/wFSAbIBVAH/ + ATIBowE0Af8BUwGpAVUB/wHbAewB2wH/AT8BnQFBAf8BGgGMARwB/wEiAZIBJAH/ARoBjAEcAf8BEgGE + ARQB/wGWAckBmAH/A/4R/wP+Af8BqwHYAawB/wEmAZgBKQH/ASoBmgEtAf8BKgGaAS0B/wEqAZoBLQH/ + ATEBnQEzAf8B0gHqAdIB/wFpAbsBawH/ASMBmQEmAf8BSAGtAUsB/wFiAboBYwH/AbkB4AG6Af8BwQHi + AcIB/wFtAcABbwH/AVIBsgFUAf8BMgGjATQB/wFTAakBVQH/AdsB7AHbAf8BPwGdAUEB/wEaAYwBHAH/ + ASIBkgEkAf8BGgGMARwB/wETAYgBFQH/AZYByQGYAf8D/g3/A/4B/wP5Af8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D4gH/AeAB+AHiAf8BxQH6AckB/wHwAfkB8QH/A/4B/wP+Af8D/gH/A/4B/wHwAfkB8QH/ + AbMB2wG0Af8BywHoAcsB/wGSAdABkwH/AR8BkgEhAf8BHwGSASEB/wEfAZIBIQH/ASEBjAEjAf8BGgGM + ARwB/wEaAYwBHAH/AckB4gHJAf8D/gn/A/4B/wHbAewB2wH/ATIBowE0Af8BJgGYASkB/wEuAZwBMQH/ + AS4BnAExAf8BLgGcATEB/wEfAZIBIQH/AWEBsQFiAf8B0gHqAdIB/wGrAdgBrAH/AegB9QHoAf8D/gH/ + A/4B/wP+Af8D/gH/AfAB+QHxAf8BswHbAbQB/wHLAegBywH/AZIB0AGTAf8BHwGSASEB/wEfAZIBIQH/ + AR8BkgEhAf8BHwGSASEB/wEaAYwBHAH/ARoBjAEcAf8ByQHiAckB/wP+Cf8D/gH/AdwB8AHdAf8BMgGj + ATQB/wEmAZgBKQH/AS4BnAExAf8BLgGcATEB/wEuAZwBMQH/AR8BkgEhAf8BYQGxAWIB/wHSAeoB0gH/ + AasB2AGsAf8B6AH1AegB/wP+Af8D/gH/A/4B/wP+Af8B8AH5AfEB/wGzAdsBtAH/AcsB6AHLAf8BkgHQ + AZMB/wEfAZIBIQH/AR8BkgEhAf8BIgGSASQB/wEiAZIBJAH/ARoBjAEcAf8BGgGMARwB/wHJAeIByQH/ + A/4J/wP+Af8B3AHwAd0B/wEyAaMBNAH/ASYBmAEpAf8BLgGcATEB/wEuAZwBMQH/AS4BnAExAf8BHwGS + ASEB/wFhAbEBYgH/AdIB6gHSAf8BqwHYAawB/wHqAfgB6wH/A/4B/wP+Af8D/gH/A/4B/wHqAfgB6wH/ + AbMB2wG0Af8BywHoAcsB/wGSAdABkwH/AR8BkgEhAf8BHwGSASEB/wEiAZIBJAH/ASEBjAEjAf8BGgGM + ARwB/wEaAYwBHAH/AckB4gHJAf8D/gn/A/4B/wP5Af8D6QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/ + A/4B/wP+Gf8D/gH/A/4B/wGrAdgBrAH/AUUBsAFHAf8BKgGaAS0B/wEfAZIBIQH/ARcBjAEZAf8BGgGM + ARwB/wFqAbQBawH/AdsB7AHbAf8D/gn/A/4B/wHgAfEB4QH/AYkByAGKAf8BMgGjATQB/wEjAZkBJgH/ + AS4BnAExAf8BKgGaAS0B/wEnAZYBKQH/AZIByQGTAf8D/gH/A/4Z/wP+Af8D/gH/AasB2AGsAf8BRQGw + AUcB/wEqAZoBLQH/AR8BkgEhAf8BFwGMARkB/wEaAYwBHAH/AWoBtAFrAf8B2wHsAdsB/wP+Cf8D/gH/ + AeAB8QHhAf8BkgHJAZMB/wEyAaMBNAH/ASMBmQEmAf8BLgGcATEB/wEqAZoBLQH/AScBlgEpAf8BkgHJ + AZMB/wP+Af8D/hn/A/4B/wP+Af8BqwHYAawB/wFFAbABRwH/ASoBmgEtAf8BHwGKASEB/wEXAYwBGQH/ + ARoBjAEcAf8BagG0AWsB/wHcAfAB3QH/A/4J/wP+Af8B4AHxAeEB/wGSAckBkwH/ATIBowE0Af8BIwGZ + ASYB/wEuAZwBMQH/ASoBmgEtAf8BJwGWASkB/wGSAckBkwH/A/4B/wP+Gf8D/gH/A/4B/wGrAdgBrAH/ + AUUBsAFHAf8BKgGaAS0B/wEfAYoBIQH/ARcBjAEZAf8BGgGMARwB/wFqAbQBawH/AdwB8AHdAf8D/gX/ + A/4B/wPxAf8D4gH/AfUB9AH1Af8B9QH0AfUB/wPiAf8D2QH/A9kB/wPxAf8D/in/A/4B/wHBAeIBwgH/ + AUUBsAFHAf8BIgGSASQB/wFTAakBVQH/AcEB4gHCAf8ByQHiAckB/wFTAakBVQH/AaoB0gGrAf8D/gH/ + A/4B/wHRAfoB1AH/AYkB8wGQAf8B1AH8AdgB/wHSAeoB0gH/AXIBvAF0Af8BIgGSASQB/wEcAZABHgH/ + AaoB0gGrAf8D/in/A/4B/wHBAeIBwgH/AUUBsAFHAf8BIgGSASQB/wFTAakBVQH/AcEB4gHCAf8ByQHi + AckB/wFTAakBVQH/AaoB0gGrAf8D/gH/A/4B/wG5AeABugH/AVYBsQFZAf8BwQHiAcIB/wHSAeoB0gH/ + AXIBvAF0Af8BIwGZASYB/wEcAZABHgH/AaoB0gGrAf8D/in/A/4B/wHBAeIBwgH/AUUBsAFHAf8BIgGS + ASQB/wFTAakBVQH/AcEB4gHCAf8ByQHiAckB/wFTAakBVQH/AaoB0gGrAf8D/gH/A/4B/wG5AeABugH/ + AVIBsgFUAf8BwQHiAcIB/wHSAeoB0gH/AXIBvAF0Af8BIwGZASYB/wEcAZABHgH/AaoB0gGrAf8D/in/ + A/4B/wHBAeIBwgH/AUUBsAFHAf8BIgGSASQB/wFTAakBVQH/AcEB4gHCAf8ByQHiAckB/wFTAakBVQH/ + AaoB0gGrAf8D/gH/A/4B/wPiAf8D1gH/A9kB/wPiAf8B9QH0AfUB/wPxAf8D7AH/A/4x/wP+Af8BswHb + AbQB/wGzAdsBtAH/AdsB7AHbAf8BeQG8AXsB/wEiAZIBJAH/AQoBgwEMAf8BUwGpAVUB/wP+Af8D/gH/ + AZ4B8wGkAf8BagHoAXQB/wFqAegBdAH/AZ4B8wGkAf8B4AH4AeIB/wGzAdsBtAH/AZkBywGZAf8D/jH/ + A/4B/wGzAdsBtAH/AbMB2wG0Af8B2wHsAdsB/wF5AbwBewH/ASIBkgEkAf8BCgGDAQwB/wFTAakBVQH/ + A/4B/wP+Af8BcgG8AXQB/wEjAZkBJgH/ASoBmgEtAf8BcAG5AXIB/wHSAeoB0gH/AbMB2wG0Af8BmQHL + AZkB/wP+Mf8D/gH/AbMB2wG0Af8BswHbAbQB/wHbAewB2wH/AXkBvAF7Af8BIgGSASQB/wEKAYMBDAH/ + AVMBqQFVAf8D/gH/A/4B/wFyAbwBdAH/ASMBmQEmAf8BKgGaAS0B/wFwAbkBcgH/AdIB6gHSAf8BswHb + AbQB/wGZAcsBmQH/A/4x/wP+Af8BswHbAbQB/wGzAdsBtAH/AdsB7AHbAf8BeQG8AXsB/wEiAZIBJAH/ + AQoBgwEMAf8BUwGpAVUB/wP+Af8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/45/wP+Af8BwQHi + AcIB/wFCAaIBRAH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wHqAfgB6wH/ + AXoB8gGBAf8BdQHxAX4B/wFxAesBegH/AWoB6AF0Af8BWgHgAWMB/wGsAeoBsAH/A/45/wP+Af8BwQHi + AcIB/wFCAaIBRAH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wHgAfEB4QH/ + AT8BqQFBAf8BMgGjATQB/wEyAaMBNAH/ASoBmgEtAf8BJgGYASkB/wGZAcsBmQH/A/45/wP+Af8BwQHi + AcIB/wE/AakBQQH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wHgAfEB4QH/ + AT8BqQFBAf8BMgGjATQB/wEyAaMBNAH/ASoBmgEtAf8BJgGYASkB/wGZAcsBmQH/A/45/wP+Af8BwQHi + AcIB/wE/AakBQQH/ARMBiAEVAf8BHwGKASEB/wEaAYwBHAH/ASIBkgEkAf8B0gHqAdIB/wPxAf8D2QH/ + A9kB/wPZAf8D2QH/A9kB/wPsAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/ + ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AcgB9AHMAf8BdQHxAX4B/wF6AfIBgQH/AXoB8gGBAf8BcQHr + AXoB/wFAAc8BSgH/AaQB5gGoAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/ + ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AasB2AGsAf8BLgGiATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGj + ATQB/wESAYQBFAH/AZIByQGTAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/ + ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/AasB2AGsAf8BLgGiATIB/wE2AaQBOQH/ATYBpAE5Af8BMgGj + ATQB/wETAYgBFQH/AZIByQGTAf8D/jn/A/4B/wGzAdsBtAH/ATIBowE0Af8BIgGSASQB/wEiAZIBJAH/ + ASIBkgEkAf8BEwGIARUB/wGSAckBkwH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/lB/wHoAfUB6AH/ + AUsBsAFNAf8BJgGYASkB/wEfAZIBIQH/AR8BkgEhAf8BEwGIARUB/wFqAbQBawH/AaoB/AGxAf8BdQHx + AX4B/wF6AfIBgQH/AXoB8gGBAf8BaAHlAXEB/wFCAcsBSgH/AeAB8QHhQf8B6AH1AegB/wFLAbABTQH/ + ASYBmAEpAf8BHwGSASEB/wEfAZIBIQH/ARMBiAEVAf8BagG0AWsB/wGEAcgBhgH/ASkBoAEsAf8BNgGk + ATkB/wE2AaQBOQH/ASoBmgEtAf8BIgGSASQB/wHbAewB20H/AegB9QHoAf8BSwGwAU0B/wEmAZgBKQH/ + ASIBkgEkAf8BIgGSASQB/wETAYgBFQH/AWoBtAFrAf8BhAHIAYYB/wEpAaABLAH/ATYBpAE5Af8BNgGk + ATkB/wEqAZoBLQH/ASEBjAEjAf8B2wHsAdtB/wHoAfUB6AH/AUsBsAFNAf8BJgGYASkB/wEiAZIBJAH/ + ASIBkgEkAf8BEwGIARUB/wFqAbQBawH/A+IB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/5B/wP+Af8BbQHA + AW8B/wEmAZgBKQH/AR8BigEhAf8BHwGSASEB/wEXAYwBGQH/AUkBpQFMAf8BmgH5AaEB/wF4AfIBgQH/ + AXoB8gGBAf8BegHyAYEB/wFaAeABYwH/AVkBzwFhAf8B+QH8AflB/wP+Af8BbQHAAW8B/wEmAZgBKQH/ + AR8BigEhAf8BHwGSASEB/wEXAYwBGQH/AUkBpQFMAf8BaQG7AWsB/wEuAaIBMgH/ATYBpAE5Af8BNgGk + ATkB/wEiAZIBJAH/AT8BnQFBAf8B+QH8AflB/wP+Af8BbQHAAW8B/wEmAZgBKQH/AR8BigEhAf8BIgGS + ASQB/wEXAYwBGQH/AUkBpQFMAf8BaQG7AWsB/wEuAaIBMgH/ATYBpAE5Af8BNgGkATkB/wEiAZIBJAH/ + AT4BmwFAAf8B+QH8AflB/wP+Af8BbQHAAW8B/wEjAZkBJgH/AR8BigEhAf8BHwGSASEB/wEXAYwBGQH/ + AUkBpQFMAf8B9QH0AfUB/wPxAf8D8QH/A/EB/wPxAf8B9QH0AfUB/wP+Qf8D/gH/AdIB6gHSAf8BuAHd + AbkB/wGzAdsBtAH/AbMB2wG0Af8BswHbAbQB/wHBAeIBwgH/Ad0B+wHgAf8B0QH6AdQB/wHRAfoB1AH/ + AdQB/AHYAf8ByAH0AcwB/wHIAfQBzAH/A/5B/wP+Af8B0gHqAdIB/wG5AeABugH/AbMB2wG0Af8BswHb + AbQB/wGzAdsBtAH/AcEB4gHCAf8ByQHiAckB/wG5AeABugH/AbkB4AG6Af8BuQHgAboB/wGzAdsBtAH/ + AcEB4gHCAf8D/kH/A/4B/wHSAeoB0gH/AbkB4AG6Af8BswHbAbQB/wGzAdsBtAH/AbMB2wG0Af8BvwHg + AcAB/wHJAeIByQH/AbkB4AG6Af8BuQHgAboB/wG5AeABugH/AbMB2wG0Af8BwQHiAcIB/wP+Qf8D/gH/ + AdIB6gHSAf8BuAHdAbkB/wGzAdsBtAH/AbMB2wG0Af8BswHbAbQB/wHBAeIBwgH/A+kB/wPiAf8D4gH/ + A+IB/wPiAf8D7AH/A/5B/wP+Af8BpAHYAaUB/wFwAbkBcgH/AWoBtAFrAf8BagG0AWsB/wFqAbQBawH/ + AX8BvAGBAf8B7QHoAe0B/wHoAeQB6AH/AegB5AHoAf8B6AHkAegB/wHoAeQB6AH/AfEB7AHxAf8D/kH/ + A/4B/wGkAdgBpQH/AXABuQFyAf8BagG0AWsB/wFqAbQBawH/AWoBtAFrAf8BfwG8AYEB/wGSAdABkwH/ + AXwBwgF9Af8BfAHCAX0B/wF8AcIBfQH/AWkBuwFrAf8BiQHCAYoB/wP+Qf8D/gH/AaQB2AGlAf8BcAG5 + AXIB/wFqAbQBawH/AWoBtAFrAf8BagG0AWsB/wF/AcEBgQH/AZIB0AGTAf8BfAHCAX0B/wF8AcIBfQH/ + AXwBwgF9Af8BaQG7AWsB/wGJAcIBigH/A/5B/wP+Af8BpAHYAaUB/wFwAbkBcgH/AWoBtAFrAf8BagG0 + AWsB/wFqAbQBawH/AX8BvAGBAf8D4gH/A9YB/wPZAf8D2QH/A9YB/wPcAf8D/kH/A/4B/wFiAboBYwH/ + AR8BkgEhAf8BGgGMARwB/wEcAZABHgH/ARMBiAEVAf8BSQGlAUwB/wPiAf8D1gH/A9kB/wPZAf8D1gH/ + A9wB/wP+Qf8B+QH8AfkB/wFiAboBYwH/AR8BkgEhAf8BGgGMARwB/wEcAZABHgH/ARMBiAEVAf8BSQGl + AUwB/wFpAbsBawH/ASkBoAEsAf8BMgGjATQB/wEyAaMBNAH/ARwBkAEeAf8BNAGVATYB/wH5AfwB+UH/ + AfkB/AH5Af8BYgG6AWMB/wEfAZIBIQH/ARoBjAEcAf8BHAGQAR4B/wETAYgBFQH/AUkBpQFMAf8BaQG7 + AWsB/wEpAaABLAH/ATIBowE0Af8BMgGjATQB/wEcAZABHgH/ATQBlQE2Af8B+QH8AflB/wH7Af4B/AH/ + AWIBugFjAf8BHwGSASEB/wEaAYwBHAH/ARwBkAEeAf8BEwGIARUB/wFJAaUBTAH/A+kB/wPZAf8D2QH/ + A9kB/wPZAf8D2QH/A/lB/wHgAfEB4QH/AUMBqwFFAf8BKgGaAS0B/wEiAZIBJAH/ASIBkgEkAf8BGgGM + ARwB/wFwAbkBcgH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/lB/wHgAfEB4QH/AUMBqwFFAf8BKgGa + AS0B/wEiAZIBJAH/ASIBkgEkAf8BFwGMARkB/wFwAbkBcgH/AYkByAGKAf8BMgGjATQB/wE7AakBPQH/ + ATsBqQE9Af8BMgGjATQB/wEfAYoBIQH/AdcB6gHYQf8B5wH1AegB/wFDAasBRQH/ASoBmgEtAf8BIgGS + ASQB/wEiAZIBJAH/ARcBjAEZAf8BcAG5AXIB/wGJAcgBigH/ATIBowE0Af8BOwGpAT0B/wE7AakBPQH/ + ATIBowE0Af8BHwGKASEB/wHXAeoB2EH/AeAB8QHhAf8BQwGrAUUB/wEqAZoBLQH/ASIBkgEkAf8BIgGS + ASQB/wEXAYwBGQH/AXABuQFyAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D7AH/A/45/wP+Af8BqwHY + AawB/wEjAZkBJgH/AScBlgEpAf8BJwGWASkB/wEnAZYBKQH/ARoBjAEcAf8BmQHLAZkB/wPxAf8D2QH/ + A9kB/wPZAf8D2QH/A9YB/wPsAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/ + AScBlgEpAf8BGgGMARwB/wGZAcsBmQH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOwGp + AT0B/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/ + AScBlgEpAf8BGgGMARwB/wGZAcsBmQH/AbMB2wG0Af8BMgGjATQB/wE7AakBPQH/ATsBqQE9Af8BOwGp + AT0B/wEKAYMBDAH/AYkBwgGKAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/ + AScBlgEpAf8BGgGMARwB/wGZAcsBmQH/A/4B/wPcAf8D2QH/A9kB/wPZAf8D4gH/AfUB9AH1Af8D/jn/ + AfkB/AH5Af8B2wHsAdsB/wF/AcEBgQH/AScBlgEpAf8BHwGSASEB/wEiAZIBJAH/ASoBmgEtAf8B2wHs + AdsB/wP5Af8D3AH/A9kB/wPZAf8D2QH/A+IB/wH1AfQB9QH/A/45/wH5AfwB+QH/AdsB7AHbAf8BfwHB + AYEB/wEnAZYBKQH/AR8BkgEhAf8BIgGSASQB/wEqAZoBLQH/AdsB7AHbAf8B5wH1AegB/wFKAawBTQH/ + ATsBqQE9Af8BMgGjATQB/wEyAaMBNAH/AWEBsQFiAf8ByQHiAckB/wP+Of8B+QH8AfkB/wHbAewB2wH/ + AX8BwQGBAf8BJwGWASkB/wEfAZIBIQH/ASIBkgEkAf8BKgGaAS0B/wHbAewB2wH/AeAB8QHhAf8BSwGw + AU0B/wE7AakBPQH/ATIBowE0Af8BMgGjATQB/wFnAbYBaQH/AckB4gHJAf8B+QH8Afk5/wH5AfwB+QH/ + AdsB7AHbAf8BfwHBAYEB/wEnAZYBKQH/AR8BkgEhAf8BIgGSASQB/wEqAZoBLQH/AdsB7AHbAf8D/gH/ + A+IB/wPWAf8D4gH/A/EB/wP5Af8D4gH/A+kB/wP+Mf8D/gH/AYkByAGKAf8BWwGxAV0B/wHSAeoB0gH/ + AckB4gHJAf8BWwGxAV0B/wETAYgBFQH/AWEBsQFiAf8D/gH/A/4B/wPiAf8D1gH/A+IB/wPxAf8D+QH/ + A+IB/wPpAf8D/jH/A/4B/wGJAcgBigH/AVsBsQFdAf8B0gHqAdIB/wHJAeIByQH/AVsBsQFdAf8BEwGI + ARUB/wFhAbEBYgH/A/4B/wP+Af8BfAHCAX0B/wEpAaABLAH/AVsBsQFdAf8BuQHgAboB/wHqAfgB6wH/ + AYMB4QGJAf8BhQHaAYoB/wP+Mf8D/gH/AYkByAGKAf8BWwGxAV0B/wHSAeoB0gH/AckB4gHJAf8BWwGx + AV0B/wETAYgBFQH/AWEBsQFiAf8D/gH/A/4B/wF8AcIBfQH/ASkBoAEsAf8BWwGxAV0B/wG5AeABugH/ + AeAB8QHhAf8BYQGxAWIB/wF0AbUBdQH/A/4x/wP+Af8BiQHIAYoB/wFbAbEBXQH/AdIB6gHSAf8ByQHi + AckB/wFbAbEBXQH/ARMBiAEVAf8BYQGxAWIB/wP+Af8D/gH/AfUB9AH1Af8D7AH/A/kB/wPsAf8D3AH/ + A9kB/wPZAf8D7AH/A/4p/wP+Af8BoAHRAaEB/wEjAZkBJgH/ASIBkgEkAf8BKgGaAS0B/wF8AcIBfQH/ + AdIB6gHSAf8BoAHRAaEB/wHBAeIBwgH/A/4B/wP+Af8B9QH0AfUB/wPsAf8D+QH/A+wB/wPcAf8D2QH/ + A9kB/wPsAf8D/in/A/4B/wGgAdEBoQH/ASIBkgEkAf8BIgGSASQB/wEqAZoBLQH/AXwBwgF9Af8B0gHq + AdIB/wGgAdEBoQH/AcEB4gHCAf8D/gH/A/4B/wHLAegBywH/AZoB0gGbAf8B4AH4AeIB/wHFAfoByQH/ + AZIB+wGZAf8BagHoAXQB/wE1AcUBPgH/AZsB4gGgAf8D/in/A/4B/wGgAdEBoQH/ASMBmQEmAf8BIgGS + ASQB/wEqAZoBLQH/AXwBwgF9Af8B0gHqAdIB/wGgAdEBoQH/AcEB4gHCAf8D/gH/A/4B/wHOAesB0AH/ + AZoB0gGbAf8B3AHwAd0B/wGaAdIBmwH/AUUBsAFHAf8BJgGYASkB/wESAYQBFAH/AZABxQGRAf8D/in/ + A/4B/wGgAdEBoQH/ASMBmQEmAf8BIgGSASQB/wEqAZoBLQH/AXwBwgF9Af8B0gHqAdIB/wGgAdEBoQH/ + AcEB4gHCAf8D/gX/A/4B/wH1AfQB9QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wP+Af8D/hn/ + A/4B/wP+Af8BmQHLAZkB/wEcAZABHgH/ASoBmgEtAf8BLgGcATEB/wEqAZoBLQH/AR8BkgEhAf8BLgGc + ATEB/wG4Ad0BuQH/A/4J/wP+Af8B9QH0AfUB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D/gH/ + A/4Z/wP+Af8D/gH/AZkBywGZAf8BHAGQAR4B/wEqAZoBLQH/AS4BnAExAf8BKgGaAS0B/wEfAZIBIQH/ + AS4BnAExAf8BuAHdAbkB/wP+Cf8D/gH/AeoB+AHrAf8BkgH7AZkB/wGDAfkBjAH/AYMB+QGMAf8BiQH6 + AZEB/wFqAegBdAH/ATUBxQE+Af8BjwHdAZQB/wP+Af8D/hn/A/4B/wP+Af8BmQHLAZkB/wEcAZABHgH/ + ASoBmgEtAf8BLgGcATEB/wEqAZoBLQH/AR8BkgEhAf8BLgGcATEB/wG4Ad0BuQH/A/4J/wP+Af8B0gHq + AdIB/wFSAbIBVAH/ATIBowE0Af8BOwGpAT0B/wE/AakBQQH/AS4BnAExAf8BEgGEARQB/wF/AbwBgQH/ + A/4B/wP+Gf8D/gH/A/4B/wGZAcsBmQH/ARwBkAEeAf8BKgGaAS0B/wEuAZwBMQH/ASoBmgEtAf8BHwGS + ASEB/wEuAZwBMQH/AbgB3QG5Af8D/gn/A/4B/wP5Af8D3AH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D6QH/ + A/EB/wPsAf8D+QH/A/4B/wP+Af8D/gH/AfkB/AH5Af8B4AHvAeAB/wGJAcIBigH/AZYByQGYAf8BqgHS + AasB/wEjAZkBJgH/AS4BnAExAf8BLgGcATEB/wEqAZoBLQH/ASYBmAEpAf8BMQGdATMB/wHSAeoB0gH/ + A/4J/wP+Af8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D1gH/A+kB/wPxAf8D7AH/A/kB/wP+Af8D/gH/ + A/4B/wH5AfwB+QH/AeAB7wHgAf8BiQHCAYoB/wGWAckBmAH/AaoB0gGrAf8BIwGZASYB/wEuAZwBMQH/ + AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AS4BnAExAf8B0gHqAdIB/wP+Cf8D/gH/AeoB+AHrAf8BkgH7 + AZkB/wGDAfkBjAH/AYkB+gGRAf8BiQH6AZEB/wGJAfoBkQH/AWoB6AF0Af8BmAHlAZwB/wH1AfQB9QH/ + A+wB/wP5Af8D/gH/A/4B/wP+Af8B+QH8AfkB/wHgAfEB4QH/AYkBwgGKAf8BlgHJAZgB/wGqAdIBqwH/ + ASMBmQEmAf8BLgGcATEB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wEuAZwBMQH/AdIB6gHSAf8D/gn/ + A/4B/wHgAfEB4QH/AUsBsAFNAf8BOAGoAToB/wE/AakBQQH/ATsBqQE9Af8BPwGpAUEB/wEjAZkBJgH/ + AYkBwgGKAf8BqgHSAasB/wGCAb0BgwH/AdsB7AHbAf8B+QH8AfkB/wP+Af8D/gH/A/4B/wHgAfEB4QH/ + AZ4B8wGkAf8BqQHpAa0B/wGqAdIBqwH/ASIBkgEkAf8BLgGcATEB/wEuAZwBMQH/ASoBmgEtAf8BJgGY + ASkB/wEuAZwBMQH/AdIB6gHSAf8D/g3/A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wP5Af8D3AH/ + A9YB/wPZAf8D3AH/AfgB8gH4Af8BqgHSAasB/wE0AZUBNgH/ASEBjAEjAf8BEwGIARUB/wEqAZoBLQH/ + AdIB6gHSAf8BcgG8AXQB/wEmAZgBKQH/AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AasB2AGsAf8D/hH/ + A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wP5Af8D3AH/A9YB/wPZAf8D3AH/AfgB8gH4Af8BqgHS + AasB/wE0AZUBNgH/ASEBjAEjAf8BEwGIARUB/wEqAZoBLQH/AdIB6gHSAf8BcgG8AXQB/wEmAZgBKQH/ + AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AasB2AGsAf8D/hH/A/4B/wHYAfoB2wH/AYkB+gGRAf8BiQH6 + AZEB/wGJAfoBkQH/AYMB+QGMAf8BmgH5AaEB/wHwAfkB8QH/AeEB3gHhAf8D1gH/AdwB2gHcAf8D3AH/ + AfgB8gH4Af8BqgHSAasB/wE0AZUBNgH/ASEBjAEjAf8BEwGIARUB/wEqAZoBLQH/AdIB6gHSAf8BcgG8 + AXQB/wEmAZgBKQH/AS4BnAExAf8BKgGaAS0B/wEmAZgBKQH/AasB2AGsAf8D/hH/A/4B/wG5AeABugH/ + ATsBqQE9Af8BOwGpAT0B/wE/AakBQQH/ATYBpAE5Af8BXwG6AWEB/wHgAfEB4QH/AUIBogFEAf8BEAGI + AREB/wEfAYoBIQH/ATQBlQE2Af8BmQHLAZkB/wG5AewBvAH/AUwBzQFUAf8BTAHNAVQB/wFMAc0BVAH/ + AWIB4gFsAf8B4AH4AeIB/wFyAbwBdAH/ASYBmAEpAf8BLgGcATEB/wEqAZoBLQH/ASYBmAEpAf8BqwHY + AawB/wP+Ff8D/gH/A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/ + AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/AdIB6gHSAf8BMgGj + ATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/ + A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGa + AS0B/wFyAbwBdAH/AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/ + AdEB+gHUAf8BiQH6AZEB/wGDAfkBjAH/AYMB+QGMAf8B0QH6AdQB/wHxAewB8QH/A9kB/wPZAf8D2QH/ + A9YB/wHxAewB8QH/AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/ + AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/AbMB2wG0Af8BOwGp + AT0B/wE4AagBOgH/ATYBpAE5Af8BuQHgAboB/wGaAdIBmwH/ATIBowE0Af8BOwGpAT0B/wEyAaMBNAH/ + ARwBkAEeAf8BhQHCAYYB/wG0AfMBuAH/AVQB4AFdAf8BagHoAXQB/wFxAesBegH/AWoB6AF0Af8BngHz + AaQB/wHSAeoB0gH/ATIBowE0Af8BJgGYASkB/wEqAZoBLQH/AaAB0QGhAf8D/h3/A/4B/wPxAf8D3AH/ + A+IB/wH1AfQB9QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B8QHsAfEB/wGaAdIBmwH/ASkBoAEsAf8BNgGk + ATkB/wE2AaQBOQH/ATIBowE0Af8BKgGaAS0B/wG5AeABugH/AYkByAGKAf8BNgGkATkB/wGzAdsBtAH/ + A/4h/wP+Af8D8QH/A9wB/wPiAf8B9QH0AfUB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfEB7AHxAf8BmgHS + AZsB/wEpAaABLAH/ATYBpAE5Af8BNgGkATkB/wEyAaMBNAH/ASoBmgEtAf8BuQHgAboB/wGJAcgBigH/ + ATYBpAE5Af8BswHbAbQB/wP+If8D/gH/AdgB+gHbAf8BkgH7AZkB/wGkAfoBqwH/AfUB9AH1Af8B3AHa + AdwB/wPZAf8D2QH/A9kB/wPZAf8B8QHsAfEB/wGaAdIBmwH/ASkBoAEsAf8BNgGkATkB/wE2AaQBOQH/ + ATIBowE0Af8BKgGaAS0B/wG5AeABugH/AYkByAGKAf8BNgGkATkB/wGzAdsBtAH/A/4h/wP+Af8BwQHi + AcIB/wFLAbABTQH/AW0BwAFvAf8B0gHqAdIB/wFDAasBRQH/ATsBqQE9Af8BOwGpAT0B/wE7AakBPQH/ + AS4BogEyAf8BkgHJAZMB/wHFAfoByQH/AXUB8QF+Af8BegHyAYEB/wF6AfIBgQH/AXEB6wF6Af8BagHo + AXQB/wHRAfoB1AH/AYUBwgGGAf8BNgGkATkB/wGzAdsBtAH/A/4l/wP+Af8D+QH/A/kB/wPiAf8D1gH/ + A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/ATYBpAE5Af8BMgGj + ATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8D+QH/A/kB/wPiAf8D1gH/ + A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/ATYBpAE5Af8BMgGj + ATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8B6gH4AesB/wHqAfgB6wH/ + AegB5AHoAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/ + ATYBpAE5Af8BMgGjATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8B4AHx + AeEB/wHcAfAB3QH/AXwBwgF9Af8BKQGgASwB/wE7AakBPQH/ATsBqQE9Af8BOwGpAT0B/wEuAaIBMgH/ + AZIByQGTAf8BxQH6AckB/wF1AfEBfgH/AXoB8gGBAf8BegHyAYEB/wFxAesBegH/AWoB6AF0Af8BggHx + AYoB/wHgAfEB4QH/AdwB8AHdAf8D/i3/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/ + AfEB7AHxAf8BmgHSAZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/AXwBwgF9Af8BxwHl + AcgB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/AfEB7AHxAf8BmgHS + AZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/AXwBwgF9Af8BxwHlAcgB/wP+Af8D/jH/ + A/4B/wP+Af8B9QH0AfUB/wHoAeQB6AH/A9wB/wPZAf8D1gH/A9YB/wHxAewB8QH/AZoB0gGbAf8BIwGZ + ASYB/wEpAaABLAH/ATIBowE0Af8BQwGrAUUB/wF8AcIBfQH/AccB5QHIAf8D/gH/A/4x/wP+Af8D/gH/ + Ac4B6wHQAf8BhAHIAYYB/wFLAbABTQH/ATgBqAE6Af8BLgGiATIB/wEnAaABKQH/AYkByAGKAf8BxQH6 + AckB/wF1AfEBfgH/AXUB8QF+Af8BdQHxAX4B/wGCAfEBigH/AaUB8gGqAf8B2AH6AdsB/wP+Af8D/jn/ + A/4B/wP+Af8D/gH/A/EB/wPpAf8D4gH/AfgB8gH4Af8BswHbAbQB/wFpAbsBawH/AY4BzQGQAf8BuQHg + AboB/wHoAfUB6AH/A/4B/wP+Qf8D/gH/A/4B/wP+Af8D8QH/A+kB/wPiAf8B+AHyAfgB/wGzAdsBtAH/ + AWkBuwFrAf8BjgHNAZAB/wG5AeABugH/AegB9QHoAf8D/gH/A/5B/wP+Af8D/gH/A/4B/wH1AfQB9QH/ + A+wB/wPiAf8B+AHyAfgB/wGzAdsBtAH/AWkBuwFrAf8BjgHNAZAB/wG5AeABugH/AegB9QHoAf8D/gH/ + A/5B/wP+Af8D/gH/AeoB+AHrAf8BuQHgAboB/wGSAdABkwH/AW0BwAFvAf8BqgHSAasB/wHRAfoB1AH/ + AZ4B8wGkAf8BtAHzAbgB/wHRAfoB1AH/AfAB+QHxAf8D/gH/A/5J/wP+Af8D9gH/A+wB/wPjAf8D9QH/ + A/cB/wPiAf8D6wH/A/YB/wP+Sf8D/gH/A/4B/wP5Af8D8QH/A+kB/wPiAf8D7AH/A/EB/wPiAf8D4gH/ + A+wB/wP5Af8D/gH/A/5B/wP+Af8D/gH/A/kB/wPxAf8D6QH/A+IB/wPsAf8D8QH/A+IB/wPiAf8D7AH/ + A/kB/wP+Af8D/kH/A/4B/wP+Af8D+QH/A/EB/wPpAf8D4gH/A+wB/wPxAf8D4gH/A+IB/wPsAf8D+QH/ + A/4B/wP+Qf8D+wH/A+cB/wPbAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/A9oB/wPbAf8D5gH/ + A/k5/wP+Af8D/gH/AfUB9AH1Af8D4gH/A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/ + A9kB/wPiAf8D8QH/A/4B/wP+Mf8D/gH/A/4B/wH1AfQB9QH/A+IB/wPZAf8D2QH/A9kB/wPWAf8D6QH/ + A+wB/wPWAf8D2QH/A9kB/wPZAf8D4gH/A/EB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPiAf8D2QH/ + A9kB/wPZAf8D1gH/A+kB/wPsAf8D1gH/A9kB/wPZAf8D2QH/A+IB/wPxAf8D/gH/A/4x/wP9Af8D+wH/ + A/MB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A/AB/wP0Af8D2gH/A9oB/wPaAf8D2gH/A9oB/wPsAf8D/QH/ + A/wt/wP+Af8B9QH0AfUB/wH1AfQB9QH/A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wPsAf8D2QH/ + A9kB/wPZAf8D2QH/A9YB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A/4p/wP+Af8B9QH0AfUB/wH1AfQB9QH/ + A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9YB/wPiAf8B9QH0 + AfUB/wH1AfQB9QH/A/4p/wP+Af8B9QH0AfUB/wH1AfQB9QH/A+wB/wPWAf8D2QH/A9kB/wPZAf8D2QH/ + A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9YB/wHoAeQB6AH/AdAB8wHTAf8BzQHzAdAB/wP+Kf8D9wH/ + A9sB/wPeAf8D/gH/A+IB/wPaAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/A9oB/wPaAf8D3QH/ + A/0B/wPlAf8D2gH/A/Ul/wP+Af8D8QH/A9kB/wPcAf8D+QH/A+IB/wPZAf8D2QH/A9kB/wPZAf8D6QH/ + A+wB/wPZAf8D2QH/A9kB/wPZAf8D3AH/AfUB9AH1Af8D4gH/A9kB/wPsAf8D/iH/A/4B/wPxAf8D2QH/ + A9wB/wP5Af8D4gH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D7AH/A9kB/wPZAf8D2QH/A9kB/wPcAf8B9QH0 + AfUB/wPiAf8D2QH/A+wB/wP+If8D/gH/A/EB/wPZAf8D3AH/A/kB/wPiAf8D2QH/A9kB/wPZAf8D2QH/ + A+kB/wPsAf8D2QH/A9kB/wPZAf8D2QH/A9wB/wHzAfcB8wH/AWwB2wF0Af8BQgHLAUoB/wGsAeoBsAH/ + A/4h/wPzAf8D2gH/A9oB/wPaAf8D8gH/A/sB/wPaAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/ + A9oB/wPaAf8D9QH/A/kB/wPaAf8D2gH/A9oB/wPwHf8D/gH/A+wB/wPZAf8D2QH/A9kB/wPsAf8D8QH/ + A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/ + A+kB/wP+Gf8D/gH/A+wB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/ + A9YB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A+kB/wP+Gf8D/gH/A+wB/wPZAf8D2QH/ + A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9YB/wPpAf8D7AH/A9YB/wPZAf8D2QH/A9kB/wHxAewB8QH/ + AbQB7AG4Af8BQgHLAUoB/wFCAcsBSgH/ATwBywFFAf8BmwHiAaAB/wP+Gf8D9wH/A9oB/wPaAf8D2gH/ + A9oB/wPcAf8D/QH/A+kB/wPaAf8D3QH/A+UB/wP6Af8D+wH/A+UB/wPeAf8D2gH/A+EB/wP+Af8D4AH/ + A9oB/wPaAf8D2gH/A9oB/wP0Ff8D/gH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D4gH/ + A9YB/wPcAf8D4gH/A/EB/wH1AfQB9QH/A+IB/wPcAf8D2QH/A9wB/wP5Af8D3AH/A9kB/wPZAf8D2QH/ + A9kB/wPsAf8D/hH/A/4B/wPxAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wH1AfQB9QH/A+IB/wPWAf8D3AH/ + A+IB/wPxAf8B9QH0AfUB/wPiAf8D3AH/A9kB/wPcAf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D7AH/ + A/4R/wP+Af8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B9QH0AfUB/wPiAf8D1gH/A9wB/wPiAf8D8QH/ + AfUB9AH1Af8D4gH/A9wB/wPZAf8B4QHeAeEB/wHqAfgB6wH/AVoB3QFjAf8BQgHQAUsB/wFJAdIBUgH/ + AUIB0AFLAf8BPAHLAUUB/wGpAekBrQH/A/4R/wP+Af8D3AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D6AH/ + A/0B/wP5Gf8D+QH/A/wB/wPwAf8D2gH/A9oB/wPaAf8D2gH/A9oB/wPbAf8D/Q3/A/4B/wP5Af8D2QH/ + A9kB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/ + AfUB9AH1Af8D6QH/A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wP5Af8D2QH/ + A9kB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/ + AfUB9AH1Af8D6QH/A9YB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfUB9AH1Af8D/gn/A/4B/wP5Af8D2QH/ + A9kB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A/kB/wPxAf8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8D8QH/ + AfgB8gH4Af8BvAH7AcEB/wFaAeABYwH/AUkB0gFSAf8BSQHSAVIB/wFJAdIBUgH/AUIBywFKAf8BQgHL + AUoB/wHWAfQB2AH/A/4N/wP+Af8D8AH/A9sB/wPaAf8D2gH/A9oB/wPaAf8D9Cn/A/YB/wPbAf8D2gH/ + A9oB/wPaAf8D2gH/A+oB/wP+Df8D/gH/A/kB/wPpAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/gH/ + A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wP5Af8D/gn/A/4B/wP5Af8D6QH/ + A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/4B/wP+Gf8D/gH/A/4B/wPsAf8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wPiAf8D+QH/A/4J/wP+Af8D+QH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Af8D/hn/ + A/4B/wP+Af8B0QH6AdQB/wGaAfkBoQH/AWsB5QF0Af8BSAHSAVEB/wFCAdABSwH/AUIB0AFLAf8BiAHi + AY8B/wHgAfgB4gH/A/4J/wP6Af8D4QH/A/oB/wP9Af8D6QH/A9oB/wPaAf8D+TH/A/sB/wPbAf8D2gH/ + A+QB/wP8Af8D/AH/A+UB/wP5Bf8D/gH/A/EB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPZAf8D2QH/ + A/EB/wP+Kf8D/gH/A/EB/wPZAf8D2QH/A+IB/wH1AfQB9QH/AfUB9AH1Af8D4gH/A/EB/wP+Af8D/gH/ + A/EB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPZAf8D2QH/A/EB/wP+Kf8D/gH/A/EB/wPZAf8D2QH/ + A+IB/wH1AfQB9QH/AfUB9AH1Af8D4gH/A/EB/wP+Af8D/gH/A/EB/wPiAf8B9QH0AfUB/wH1AfQB9QH/ + A+IB/wPZAf8D2QH/A/EB/wP+Kf8D/gH/Ad0B+wHgAf8BmgH5AaEB/wFaAeABYwH/AXQB3AF7Af8BzQHz + AdAB/wHJAeIByQH/AVQBpwFVAf8BqgHSAasB/wP+Bf8D6AH/A9oB/wPaAf8D6AH/A/0B/wP5Af8D9zn/ + A/cB/wP2Af8D/gH/A+4B/wPbAf8D2gH/A+UF/wP+Af8D4gH/A9YB/wPZAf8D4gH/AfUB9AH1Af8D8QH/ + A+wB/wP+Mf8D/gH/A+wB/wPxAf8D+QH/A+kB/wPZAf8D1gH/A+IB/wP+Af8D/gH/A+IB/wPWAf8D2QH/ + A+IB/wH1AfQB9QH/A/EB/wPsAf8D/jH/A/4B/wPsAf8D8QH/A/kB/wPpAf8D2QH/A9YB/wPiAf8D/gH/ + A/4B/wPiAf8D1gH/A9kB/wPiAf8B9QH0AfUB/wPxAf8D7AH/A/4x/wP+Af8B0QH6AdQB/wHUAfwB2AH/ + AdsB7AHbAf8BcgG8AXQB/wEfAYoBIQH/AQoBgwEMAf8BUwGpAVUB/wP+Af8D/gH/A9wB/wPaAf8D2gH/ + A9oB/wPaAf8D9kH/A/oB/wPdAf8D2gH/A9oB/wPaAf8D2wH/A/0B/wP5Af8D3AH/A9kB/wPZAf8D2QH/ + A9kB/wPsAf8D/jn/A/4B/wPxAf8D3AH/A9kB/wPZAf8D2QH/A9kB/wP5Af8D+QH/A9wB/wPZAf8D2QH/ + A9kB/wPZAf8D7AH/A/45/wP+Af8D8QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D+QH/A/kB/wPcAf8D2QH/ + A9kB/wPZAf8D2QH/A+wB/wP+Of8D/gH/AbkB4AG6Af8BQAGnAUIB/wETAYgBFQH/AR8BigEhAf8BGgGM + ARwB/wEiAZIBJAH/AdIB6gHSAf8D+AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D9kH/A/kB/wPaAf8D2gH/ + A9oB/wPaAf8D2gH/A/UB/wPxAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPsAf8D/jn/A/4B/wPsAf8D2QH/ + A9kB/wPZAf8D2QH/A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/45/wP+Af8D7AH/ + A9kB/wPZAf8D2QH/A9kB/wPZAf8D7AH/A/EB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+wB/wP+Of8D/gH/ + AbMB2wG0Af8BMgGjATQB/wEiAZIBJAH/ASIBkgEkAf8BIgGSASQB/wETAYgBFQH/AZIByQGTAf8D7QH/ + A9oB/wPaAf8D2gH/A9oB/wPcSf8D3QH/A9oB/wPaAf8D2gH/A9oB/wPrAf8D6QH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D+UH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wPpAf8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wP5Qf8D+QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D4gH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/ + A/lB/wHoAfUB6AH/AUsBsAFNAf8BJgGYASkB/wEiAZIBJAH/ASIBkgEkAf8BEwGIARUB/wFqAbQBawH/ + A+YB/wPaAf8D2gH/A9oB/wPaAf8D4kn/A+YB/wPaAf8D2gH/A9oB/wPaAf8D4wH/A+IB/wPZAf8D2QH/ + A9kB/wPZAf8D4gH/A/5B/wP+Af8D4gH/A9kB/wPZAf8D2QH/A9kB/wPiAf8D4gH/A9kB/wPZAf8D2QH/ + A9kB/wPiAf8D/kH/A/4B/wPiAf8D2QH/A9kB/wPZAf8D2QH/A+IB/wPiAf8D2QH/A9kB/wPZAf8D2QH/ + A+IB/wP+Qf8D/gH/AW0BwAFvAf8BJgGYASkB/wEfAYoBIQH/AR8BkgEhAf8BFwGMARkB/wFJAaUBTAH/ + A/sB/wP5Af8D+QH/A/kB/wP5Af8D/Un/A/0B/wP5Af8D+QH/A/kB/wP5Af8D+wH/AfUB9AH1Af8D8QH/ + A/EB/wPxAf8D8QH/AfUB9AH1Af8D/kH/A/4B/wH1AfQB9QH/A/EB/wPxAf8D8QH/A/EB/wH1AfQB9QH/ + AfUB9AH1Af8D8QH/A/EB/wPxAf8D8QH/AfUB9AH1Af8D/kH/A/4B/wH1AfQB9QH/A/EB/wPxAf8D8QH/ + AfQB8QHzAf8B9QH0AfUB/wH1AfQB9QH/A/EB/wPxAf8D8QH/A/EB/wH1AfQB9QH/A/5B/wP+Af8B0gHq + AdIB/wG4Ad0BuQH/AbMB2wG0Af8BswHbAbQB/wGzAdsBtAH/AcEB4gHCAf8D8AH/A+kB/wPqAf8D6gH/ + A+kB/wP0Sf8D9gH/A+kB/wPqAf8D6gH/A+kB/wPvAf8D6QH/A+IB/wPiAf8D4gH/A+IB/wPsAf8D/kH/ + A/4B/wPsAf8D4gH/A+IB/wPiAf8D4gH/A+kB/wPpAf8D4gH/A+IB/wPiAf8D4gH/A+wB/wP+Qf8D/gH/ + AcUB+gHJAf8BlAHwAZoB/wGDAeEBiQH/AYMB4QGJAf8BgQHgAYYB/wGSAeYBmAH/A+kB/wPiAf8D4gH/ + A+IB/wPiAf8D7AH/A/5B/wP+Af8BpAHYAaUB/wFwAbkBcgH/AWoBtAFrAf8BagG0AWsB/wFqAbQBawH/ + AX8BvAGBAf8D5gH/A9oB/wPaAf8D2gH/A9oB/wPhSf8D5QH/A9oB/wPaAf8D2gH/A9oB/wPjAf8D4gH/ + A9YB/wPZAf8D2QH/A9YB/wPcAf8D/kH/A/4B/wPiAf8D1gH/A9kB/wPZAf8D1gH/A+IB/wPiAf8D1gH/ + A9kB/wPZAf8D1gH/A9wB/wP+Qf8D/gH/AZoB+QGhAf8BXwHiAWkB/wFJAdIBUgH/AUsB2QFUAf8BQgHQ + AUsB/wFsAdsBdAH/A+IB/wPWAf8D2QH/A9kB/wPWAf8D3AH/A/5B/wP+Af8BYgG6AWMB/wEfAZIBIQH/ + ARoBjAEcAf8BHAGQAR4B/wETAYgBFQH/AUkBpQFMAf8D7gH/A9oB/wPaAf8D2gH/A9oB/wPbAf8D/kX/ + A90B/wPaAf8D2gH/A9oB/wPaAf8D6wH/A+kB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A/lB/wP5Af8D3AH/ + A9kB/wPZAf8D2QH/A9kB/wPiAf8D6QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D+UH/Ae8B/AHwAf8BggHx + AYoB/wFiAeIBbAH/AVUB2wFeAf8BVQHbAV4B/wFJAdIBUgH/AYwB5gGSAf8D6QH/A9kB/wPZAf8D2QH/ + A9kB/wPZAf8D+UH/AeAB8QHhAf8BQwGrAUUB/wEqAZoBLQH/ASIBkgEkAf8BIgGSASQB/wEaAYwBHAH/ + AXABuQFyAf8D+AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D9kH/A/kB/wPaAf8D2gH/A9oB/wPaAf8D2gH/ + A/YB/wPxAf8D2QH/A9kB/wPZAf8D2QH/A9YB/wPsAf8D/jn/A/4B/wPsAf8D1gH/A9kB/wPZAf8D2QH/ + A9kB/wPsAf8D8QH/A9kB/wPZAf8D2QH/A9kB/wPWAf8D7AH/A/45/wP+Af8BxQH6AckB/wFnAewBcQH/ + AVoB3QFjAf8BWgHdAWMB/wFVAdsBXgH/AUsB2QFUAf8BsAHsAbQB/wPxAf8D2QH/A9kB/wPZAf8D2QH/ + A9YB/wPsAf8D/jn/A/4B/wGrAdgBrAH/ASMBmQEmAf8BJwGWASkB/wEnAZYBKQH/AScBlgEpAf8BGgGM + ARwB/wGZAcsBmQH/A/4B/wPdAf8D2gH/A9oB/wPaAf8D5gH/A/1B/wP+Af8D7AH/A9sB/wPaAf8D2gH/ + A9wB/wP+Af8D+QH/A9wB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wP+Of8D/gH/A/kB/wPpAf8D2QH/ + A9kB/wPZAf8D2QH/A/kB/wP5Af8D3AH/A9kB/wPZAf8D2QH/A+IB/wH1AfQB9QH/A/45/wH5AfwB+QH/ + AeAB+AHiAf8BpQHyAaoB/wFaAd0BYwH/AVUB2wFeAf8BVQHbAV4B/wFaAd0BYwH/AeAB+AHiAf8D+QH/ + A9wB/wPZAf8D2QH/A9kB/wPiAf8B9QH0AfUB/wP+Of8B+QH8AfkB/wHbAewB2wH/AX8BwQGBAf8BJwGW + ASkB/wEfAZIBIQH/ASIBkgEkAf8BKgGaAS0B/wHbAewB2wX/A+oB/wPaAf8D4AH/A/kB/wP+Af8D6gH/ + A/A5/wPzAf8D5AH/A/0B/wP8Af8D5QH/A9oB/wPnBf8D/gH/A+IB/wPWAf8D4gH/A/EB/wP5Af8D4gH/ + A+kB/wP+Mf8D/gH/A+kB/wPiAf8B9QH0AfUB/wH1AfQB9QH/A+IB/wPWAf8D4gH/A/4B/wP+Af8D4gH/ + A9YB/wPiAf8D8QH/A/kB/wPiAf8D6QH/A/4x/wP+Af8BiQHIAYoB/wFZAawBWwH/AckB4gHJAf8B2AH6 + AdsB/wGDAesBiwH/AUsB2QFUAf8BgwHhAYkB/wP+Af8D/gH/A+IB/wPWAf8D4gH/A/EB/wP5Af8D4gH/ + A+kB/wP+Mf8D/gH/AYkByAGKAf8BWwGxAV0B/wHSAeoB0gH/AckB4gHJAf8BWwGxAV0B/wETAYgBFQH/ + AWEBsQFiAf8D/gX/A/wB/wPyAf8D/gH/A/MB/wPcAf8D2gH/A9oB/wP3Mf8D+QH/A9oB/wPaAf8D2gH/ + A+4B/wP+Af8D9gH/A/sF/wP+Af8B9QH0AfUB/wPsAf8D+QH/A+wB/wPcAf8D2QH/A9kB/wPsAf8D/in/ + A/4B/wPxAf8D2QH/A9kB/wPZAf8D6QH/A/kB/wPxAf8B9QH0AfUB/wP+Af8D/gH/AfUB9AH1Af8D7AH/ + A/kB/wPsAf8D3AH/A9kB/wPZAf8D7AH/A/4p/wP+Af8BoAHRAaEB/wEjAZkBJgH/ASIBkgEkAf8BKgGa + AS0B/wF5AbwBewH/AdcB6gHYAf8BvAHxAcAB/wHQAfMB0wH/A/4B/wP+Af8B9QH0AfUB/wPsAf8D+QH/ + A+wB/wPcAf8D2QH/A9kB/wPsAf8D/in/A/4B/wGgAdEBoQH/ASMBmQEmAf8BIgGSASQB/wEqAZoBLQH/ + AXwBwgF9Af8B0gHqAdIB/wGgAdEBoQH/AcEB4gHCAf8D/gn/A/wB/wPeAf8D2gH/A9oB/wPaAf8D2gH/ + A9oB/wPyKf8D9gH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2wH/A/oN/wP+Af8B9QH0AfUB/wPcAf8D2QH/ + A9kB/wPZAf8D2QH/A9kB/wPpAf8D/gH/A/4Z/wP+Af8D/gH/A+wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/ + A9kB/wPxAf8D/gn/A/4B/wH1AfQB9QH/A9wB/wPZAf8D2QH/A9kB/wPZAf8D2QH/A+kB/wP+Af8D/hn/ + A/4B/wP+Af8BmQHLAZkB/wEcAZABHgH/ASoBmgEtAf8BLgGcATEB/wEqAZoBLQH/AR8BkgEhAf8BLgGc + ATEB/wG4Ad0BuQH/A/4J/wP+Af8B9QH0AfUB/wPcAf8D2QH/A9kB/wPZAf8D2QH/A9kB/wPpAf8D/gH/ + A/4Z/wP+Af8D/gH/AZkBywGZAf8BHAGQAR4B/wEqAZoBLQH/AS4BnAExAf8BKgGaAS0B/wEfAZIBIQH/ + AS4BnAExAf8BuAHdAbkB/wP+Df8D/gH/A90B/wPaAf8D2gH/A9oB/wPaAf8D2gH/A/IB/wP6Af8D9Rn/ + A/YB/wP2Af8D+AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D3AH/A/0N/wP+Af8D+QH/A9wB/wPZAf8D2QH/ + A9kB/wPZAf8D1gH/A+kB/wPxAf8D7AH/A/kB/wP+Af8D/gH/A/4B/wH7Af4B/AH/AeAB8QHhAf8BmwHi + AaAB/wGhAeoBpgH/AfQB8AH0Af8D2QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8D+QH/A/4J/wP+Af8D+QH/ + A9wB/wPZAf8D2QH/A9kB/wPZAf8D1gH/A+kB/wPxAf8D7AH/A/kB/wP+Af8D/gH/A/4B/wH5AfwB+QH/ + AeAB7wHgAf8BiQHCAYoB/wGWAckBmAH/AaoB0gGrAf8BIwGZASYB/wEuAZwBMQH/AS4BnAExAf8BKgGa + AS0B/wEmAZgBKQH/ATEBnQEzAf8B0gHqAdIB/wP+Cf8D/gH/A/kB/wPcAf8D2QH/A9kB/wPZAf8D2QH/ + A9YB/wPpAf8D8QH/A+wB/wP5Af8D/gH/A/4B/wP+Af8B+QH8AfkB/wHgAe8B4AH/AYkBwgGKAf8BlgHJ + AZgB/wGqAdIBqwH/ASMBmQEmAf8BLgGcATEB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wExAZ0BMwH/ + AdIB6gHSAf8D/hH/A/kB/wPaAf8D2gH/A9oB/wPaAf8D4gH/A/4B/wPgAf8D2gH/A9sB/wPhAf8D+AH/ + A/oB/wPhAf8D3AH/A9oB/wPcAf8D/QH/A+kB/wPaAf8D2gH/A9oB/wPaAf8D9xX/A/4B/wPxAf8D2QH/ + A9kB/wPZAf8D2QH/A+IB/wP5Af8D3AH/A9YB/wPZAf8D3AH/AfgB8gH4Af8BtAHsAbgB/wFTAc0BWwH/ + AUgBzQFRAf8BQgHQAUsB/wFaAeABYwH/AeAB+AHiAf8B6AHkAegB/wPZAf8D2QH/A9kB/wPZAf8D8QH/ + A/4R/wP+Af8D8QH/A9kB/wPZAf8D2QH/A9kB/wPiAf8D+QH/A9wB/wPWAf8D2QH/A9wB/wH4AfIB+AH/ + AaoB0gGrAf8BNAGVATYB/wEhAYwBIwH/ARMBiAEVAf8BKgGaAS0B/wHSAeoB0gH/AXIBvAF0Af8BJgGY + ASkB/wEuAZwBMQH/ASoBmgEtAf8BJgGYASkB/wGrAdgBrAH/A/4R/wP+Af8D8QH/A9kB/wPZAf8D2QH/ + A9kB/wPiAf8D+QH/A9wB/wPWAf8D2QH/A9wB/wH4AfIB+AH/AaoB0gGrAf8BNAGVATYB/wEhAYwBIwH/ + ARMBiAEVAf8BKgGaAS0B/wHSAeoB0gH/AXIBvAF0Af8BJgGYASkB/wEuAZwBMQH/ASoBmgEtAf8BJgGY + ASkB/wGrAdgBrAH/A/4Z/wP3Af8D2gH/A9oB/wPaAf8D+gH/A/MB/wPaAf8D2gH/A9oB/wPaAf8D8AH/ + A/QB/wPaAf8D2gH/A9oB/wPaAf8D6gH/A/0B/wPbAf8D2gH/A9oB/wP0Hf8D/gH/A/EB/wPZAf8D2QH/ + A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/Aa0B8gGyAf8BVAHgAV0B/wFqAegBdAH/ + AXEB6wF6Af8BagHoAXQB/wGYAfMBnwH/AfUB9AH1Af8B3AHaAdwB/wPZAf8D2QH/A+wB/wP+Gf8D/gH/ + A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/A9YB/wHxAewB8QH/AZIByQGTAf8BFwGR + ARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ + ASoBmgEtAf8BoAHRAaEB/wP+Gf8D/gH/A/EB/wPZAf8D2QH/A9kB/wPxAf8D7AH/A9kB/wPZAf8D2QH/ + A9YB/wHxAewB8QH/AZIByQGTAf8BFwGRARoB/wEuAZwBMQH/ATIBowE0Af8BKgGaAS0B/wFyAbwBdAH/ + AdIB6gHSAf8BMgGjATQB/wEmAZgBKQH/ASoBmgEtAf8BoAHRAaEB/wP+If8D+gH/A9wB/wPmAf8D/QH/ + A9wB/wPaAf8D2gH/A9oB/wPaAf8D8AH/A/QB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A/sB/wPvAf8D2wH/ + A/gl/wP+Af8D8QH/A9wB/wPiAf8B9QH0AfUB/wPZAf8D2QH/A9kB/wPZAf8D2QH/AfEB7AHxAf8BwQH9 + AcUB/wF1AfEBfgH/AXoB8gGBAf8BeAHyAYEB/wFxAesBegH/AWoB6AF0Af8BygH5Ac0B/wHtAegB7QH/ + A9kB/wPxAf8D/iH/A/4B/wPxAf8D3AH/A+IB/wH1AfQB9QH/A9kB/wPZAf8D2QH/A9kB/wPZAf8B8QHs + AfEB/wGaAdIBmwH/ASkBoAEsAf8BNgGkATkB/wE2AaQBOQH/ATIBowE0Af8BKgGaAS0B/wG5AeABugH/ + AYkByAGKAf8BNgGkATkB/wGzAdsBtAH/A/4h/wP+Af8D8QH/A9wB/wPiAf8B9QH0AfUB/wPZAf8D2QH/ + A9kB/wPZAf8D2QH/AfEB7AHxAf8BmgHSAZsB/wEpAaABLAH/ATYBpAE5Af8BNgGkATkB/wEyAaMBNAH/ + ASoBmgEtAf8BuQHgAboB/wGJAcgBigH/ATYBpAE5Af8BswHbAbQB/wP+Kf8D/gH/A/4B/wPrAf8D2gH/ + A9oB/wPaAf8D2gH/A9oB/wPwAf8D9AH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D4wH/A/4B/wP+Lf8D/gH/ + A/kB/wP5Af8D4gH/A9YB/wPZAf8D2QH/A9kB/wPZAf8B8QHsAfEB/wHBAf0BxQH/AXUB8QF+Af8BegHy + AYEB/wF6AfIBgQH/AXEB6wF6Af8BagHoAXQB/wGJAfMBkAH/AfAB+QHxAf8D+QH/A/4p/wP+Af8D+QH/ + A/kB/wPiAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/ + ATYBpAE5Af8BMgGjATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/4p/wP+Af8D+QH/ + A/kB/wPiAf8D1gH/A9kB/wPZAf8D2QH/A9kB/wHxAewB8QH/AZoB0gGbAf8BKQGgASwB/wE2AaQBOQH/ + ATYBpAE5Af8BMgGjATQB/wEjAZkBJgH/AVYBsQFZAf8B4AHxAeEB/wHgAfEB4QH/A/41/wP8Af8D6wH/ + A90B/wPaAf8D2gH/A9oB/wPwAf8D9AH/A9oB/wPaAf8D2gH/A90B/wPqAf8D+zn/A/4B/wP+Af8B9QH0 + AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/AfEB7AHxAf8BvAH7AcEB/wF1AfEBfgH/AXUB8QF+Af8BdQHx + AX4B/wGCAfEBigH/AaUB8gGqAf8B2AH6AdsB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/ + A9kB/wPWAf8D1gH/AfEB7AHxAf8BmgHSAZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/ + AXwBwgF9Af8BxwHlAcgB/wP+Af8D/jH/A/4B/wP+Af8B9QH0AfUB/wPpAf8D3AH/A9kB/wPWAf8D1gH/ + AfEB7AHxAf8BmgHSAZsB/wEjAZkBJgH/ASkBoAEsAf8BMgGjATQB/wFDAasBRQH/AXwBwgF9Af8BxwHl + AcgB/wP+Af8D/kH/A/4B/wP5Af8D7wH/A+YB/wP1Af8D+AH/A+UB/wPvAf8D+QH/A/5J/wP+Af8D/gH/ + A/4B/wPxAf8D6QH/A+IB/wHxAewB8QH/Ac4B+gHRAf8BmgH5AaEB/wG0AfsBugH/AdEB+gHUAf8B8AH5 + AfEB/wP+Af8D/kH/A/4B/wP+Af8D/gH/A/EB/wPpAf8D4gH/AfgB8gH4Af8BswHbAbQB/wFpAbsBawH/ + AY4BzQGQAf8BuQHgAboB/wHoAfUB6AH/A/4B/wP+Qf8D/gH/A/4B/wP+Af8D8QH/A+kB/wPiAf8B+AHy + AfgB/wGzAdsBtAH/AWkBuwFrAf8BjgHNAZAB/wG5AeABugH/AegB9QHoAf8D/gH/A/4h/wFCAU0BPgcA + AT4DAAEoAwABeAMAAXgDAAEBAQABAQUAAYABBxYAA///AP8A/wD/AP8A/wD/AIgACw== + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ResultViewControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ResultViewControl.cs new file mode 100644 index 00000000..47bec400 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ResultViewControl.cs @@ -0,0 +1,57 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Windows.Forms; +using WebsitePanel.Installer.Common; + +namespace WebsitePanel.Installer.Controls +{ + internal class ResultViewControl : UserControl + { + private AppContext appContext; + private bool isInitialized; + + public AppContext AppContext + { + get { return appContext; } + set { appContext = value; } + } + + protected bool IsInitialized + { + get { return isInitialized; } + set { isInitialized = value; } + } + + public virtual void ShowControl(AppContext context) + { + this.AppContext = context; + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.Designer.cs new file mode 100644 index 00000000..6fdaf6a2 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.Designer.cs @@ -0,0 +1,180 @@ +namespace WebsitePanel.Installer.Controls +{ + partial class ServerControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerControl)); + this.grpConnectionSettings = new System.Windows.Forms.GroupBox(); + this.txtPassword = new System.Windows.Forms.TextBox(); + this.lblPassword = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.lblPort = new System.Windows.Forms.Label(); + this.txtServer = new System.Windows.Forms.TextBox(); + this.lblServer = new System.Windows.Forms.Label(); + this.btnUpdate = new System.Windows.Forms.Button(); + this.btnTest = new System.Windows.Forms.Button(); + this.btnRemove = new System.Windows.Forms.Button(); + this.grpConnectionSettings.SuspendLayout(); + this.SuspendLayout(); + // + // grpConnectionSettings + // + this.grpConnectionSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.grpConnectionSettings.Controls.Add(this.txtPassword); + this.grpConnectionSettings.Controls.Add(this.lblPassword); + this.grpConnectionSettings.Controls.Add(this.txtPort); + this.grpConnectionSettings.Controls.Add(this.lblPort); + this.grpConnectionSettings.Controls.Add(this.txtServer); + this.grpConnectionSettings.Controls.Add(this.lblServer); + this.grpConnectionSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.grpConnectionSettings.Location = new System.Drawing.Point(14, 43); + this.grpConnectionSettings.Name = "grpConnectionSettings"; + this.grpConnectionSettings.Size = new System.Drawing.Size(379, 122); + this.grpConnectionSettings.TabIndex = 0; + this.grpConnectionSettings.TabStop = false; + this.grpConnectionSettings.Text = "Connection settings"; + // + // txtPassword + // + this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPassword.Location = new System.Drawing.Point(122, 82); + this.txtPassword.Name = "txtPassword"; + this.txtPassword.PasswordChar = '*'; + this.txtPassword.Size = new System.Drawing.Size(234, 21); + this.txtPassword.TabIndex = 5; + // + // lblPassword + // + this.lblPassword.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblPassword.Location = new System.Drawing.Point(16, 82); + this.lblPassword.Name = "lblPassword"; + this.lblPassword.Size = new System.Drawing.Size(100, 21); + this.lblPassword.TabIndex = 4; + this.lblPassword.Text = "Password"; + // + // txtPort + // + this.txtPort.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPort.Location = new System.Drawing.Point(122, 55); + this.txtPort.Name = "txtPort"; + this.txtPort.Size = new System.Drawing.Size(234, 21); + this.txtPort.TabIndex = 3; + // + // lblPort + // + this.lblPort.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblPort.Location = new System.Drawing.Point(16, 55); + this.lblPort.Name = "lblPort"; + this.lblPort.Size = new System.Drawing.Size(100, 21); + this.lblPort.TabIndex = 2; + this.lblPort.Text = "Port"; + // + // txtServer + // + this.txtServer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtServer.Location = new System.Drawing.Point(122, 28); + this.txtServer.Name = "txtServer"; + this.txtServer.Size = new System.Drawing.Size(234, 21); + this.txtServer.TabIndex = 1; + // + // lblServer + // + this.lblServer.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblServer.Location = new System.Drawing.Point(16, 28); + this.lblServer.Name = "lblServer"; + this.lblServer.Size = new System.Drawing.Size(100, 21); + this.lblServer.TabIndex = 0; + this.lblServer.Text = "Server"; + // + // btnUpdate + // + this.btnUpdate.Image = ((System.Drawing.Image)(resources.GetObject("btnUpdate.Image"))); + this.btnUpdate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnUpdate.Location = new System.Drawing.Point(148, 171); + this.btnUpdate.Name = "btnUpdate"; + this.btnUpdate.Size = new System.Drawing.Size(128, 28); + this.btnUpdate.TabIndex = 9; + this.btnUpdate.Text = "Update"; + this.btnUpdate.UseVisualStyleBackColor = true; + // + // btnTest + // + this.btnTest.Image = ((System.Drawing.Image)(resources.GetObject("btnTest.Image"))); + this.btnTest.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnTest.Location = new System.Drawing.Point(14, 171); + this.btnTest.Name = "btnTest"; + this.btnTest.Size = new System.Drawing.Size(128, 28); + this.btnTest.TabIndex = 8; + this.btnTest.Text = "Test connection"; + this.btnTest.UseVisualStyleBackColor = true; + // + // btnRemove + // + this.btnRemove.Image = ((System.Drawing.Image)(resources.GetObject("btnRemove.Image"))); + this.btnRemove.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnRemove.Location = new System.Drawing.Point(14, 9); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.Size = new System.Drawing.Size(128, 28); + this.btnRemove.TabIndex = 10; + this.btnRemove.Text = "Remove server"; + this.btnRemove.UseVisualStyleBackColor = true; + // + // ServerControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.btnRemove); + this.Controls.Add(this.btnUpdate); + this.Controls.Add(this.btnTest); + this.Controls.Add(this.grpConnectionSettings); + this.Name = "ServerControl"; + this.Size = new System.Drawing.Size(406, 327); + this.grpConnectionSettings.ResumeLayout(false); + this.grpConnectionSettings.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grpConnectionSettings; + private System.Windows.Forms.TextBox txtPassword; + private System.Windows.Forms.Label lblPassword; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label lblPort; + private System.Windows.Forms.TextBox txtServer; + private System.Windows.Forms.Label lblServer; + private System.Windows.Forms.Button btnUpdate; + private System.Windows.Forms.Button btnTest; + private System.Windows.Forms.Button btnRemove; + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.cs new file mode 100644 index 00000000..242c4b72 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.cs @@ -0,0 +1,46 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +namespace WebsitePanel.Installer.Controls +{ + internal partial class ServerControl : ResultViewControl + { + public ServerControl() + { + InitializeComponent(); + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.resx new file mode 100644 index 00000000..89b7bc69 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServerControl.resx @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAj9JREFUOE+lk82L + UlEYxmtRGBTlv5CIFti+VQtDF65NUAIh2rRoQHBjs1RQBwYcFGli/Nh4NRyvCaNgk9JVm4RmIMfE8VvE + r2Bma4r5dM4lxeJOmy48XDjnPL/347znKoAr//VRwGXSaDQ3/rXPB18e+AksRt/PMZvNMJlM0Gg0JgzD + 9EKh0Ger1Rra2Hj5XK/XP/obuAL8mC0W5W9lDIdDTKdTcg5wOByIx+Not9vodNqIRMJQqVTP1iErwPnF + BfL5PM7OzsjhDubzOUwmE7xeLzKZDEqlrzg8fA+1Wv1GEDAYDJDLcTg5OSH/HGq1GpxOJ9LpNAF8AEf2 + Eol3MBqNHkEAqRmVSgXZbBaxWAxhhuHNhUKBGBNIJg9AegKDwSAMODr6hDqJOh6P+TKKxSJSqRTCYQbB + YJCYQ/D7/dDpdMIAlmVRPj1FvV7n0282m+h2u+j1eqhWq/D5fHC73dBqtcKA3d3XfFRqol1vtVr0KnkY + zWjPt4etrS0olUq3YA9sNhsPoGZqoFGXmdC1QCAAu90OhUIRJJN7k0j0xyBtbr7iATQyFTVR0VJoJrQH + dC7kcvkBMT8kkhPdWc2BxWKZlstl9Pt93rRMncLoFbNsDNvb25DJZBFivP8b8mAFEIvFMp3uyVOO4wKl + UqlBAbSB1Dwajcg1JuHxeCCVSt8S8z2iu0TXBB9SMBi47nK5FPE4++L4+AtLShly3Efsx/YhkUgYYry1 + bOSlL3G909Fo9PbOzs5js9lsEYlE0vW9X7L1rrIM3ozpAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAqNJREFUOE+dk2tI + k2EUgN/SrOxqF7uYCZkVRRcryR9GEqGlRPdBBBoUlSQJkf0pIixKqX6ERUwyKJCViRAUWKbWWubu63NT + 29q0TSelZrMbmvX0bYb19dMDL+85h/d5zvnzCjHCAP6SA3L1+Vcf/oF2Wr46aAi85HHPI8rfl6H2F1Pk + LeBEay7ZThWZrlSOWPfLxD+C3h8faf3qxvLJyNOuKso7yrjx7ioX3Gc4/uYoex3bUElbqX1fzZ2OUtbV + LVcKvN/eYftkprbrCRX+u6i917joPstJZx7ZTSp2vE7H2mMKQjAIGVUblQJ74DV13dUyrKFEhos8BeQ7 + j5Elwxm2VOo/6IbgX1BoKyChOkYp0PbUUdGp4ab3BufenuaAYx/bpTSSTMu45y0bhi+ZLiKMgsW6eUpB + ZWc5xW1XONp0kL3SztDU2IZZ5DYeCk0Nxm2plLB6QaRLsEQXqxQ88Fcg9dq47CwkybCUyBfhxGhn4Ovz + huAWfzMzn01iQrNg4ltZUP/fBoauhqExPyFfykPUCCp95aHWwPcBUrXrCHcIprWEEdUWxgp9vHKDPHsO + 7o+uIYkcD9sf0D/YH8qvS1cRZkG0M4I4dxQJHdFssKxVCna3ZDK/dg46n3ZYEkwCfQESXs5liiuMeM9M + VvsWkvJhBbsbM5SCtKYURukEs7XTeNZeMyypdN0n3CaI80wl0RvPps5kdvWmc7g5SylY6VjAOIMgwiKY + bBjDLU8J5nYTKfo1TPAIFvlms75zFXu6t5DzJYtT7hNKQWL9IqKejyNaN57pryKYLG8zvW4sU02jiZOi + SGxayGZXCtmtKvL9uRRZzysFVru1xNBoUBv/HIPdoNY79GqjfAd7JrtRbbab1Ra7RR18K0nSdY1GkzzC + j6zEfgNB/y51tqL5CQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA+NJREFUOE89jmlM + GwQYhj9iKbBgskgky7jdkjknCmwglMIqoDCQa61QObQMSLElhEMJ0LkSaDkHowdyDNlCgQETVgcydBgR + 4tzCOCz3gJbSFTXgohhRM/C1McYfz8/neV+rnA+Laf8AV13dXvA5+Ht/4+DpvonBsNpkMq1Nh2yZ5kN2 + tj8xbWx2rK2Zu4xnGGBYM+n+5CQZDBvEYDCI3st83yq3SDqzs7uP5c1f8fX0Jrq+0KG6YwwfKLQQV2r2 + RLKrW7kVTTMltc3D9a0dTQUS6bmkC0JKzRQRSeVVz6rbusw7vwFL5j9xffxn5HdvIbXtMc43bSJctQF2 + 3SpOV83j5YpZxBQ2IiUtvYebLCBechpR32dDx0cnHv71YG0Pma16CFrWUXLzMUr6zRB1m5DYbkToxwb4 + NBhwSr2FCFE5IqNjykKjYiksKo5oRjfH0Y6v4N0mA5QjP6Ltm23k9pgQ36xHqHIdgYp1nLFwqkEPz0Yj + zosl8AtgpZ/2Z9OZgCCi5eVFgVB5H+q72xBrjHjpo0U4F8/D+eIiXEqX4SJ/BLeaNThf1sOn2YCSahV4 + Cfw3uPxk4vFTiMYmvisv7ZxBtEIPxzwdXEsW4CFdgodsBe4Vq3C3yC51ejx3xYSgri10aoeeSstkx6Xl + FXSpTE50o3+w61yNDs/nL8Bd8p9cbpErH8G9dg1H6zfg3baJvN45aPrHcW9waE/Z2MjJys6mlBTLA+mV + T+YDyybhU7mKE5UGuFVuwLnKAKcaPY7UGxHUuow76jYsiTKhS03CLJeL2aysP2olksJYLpcoNiG5JSk9 + az69QPp7mrQJSTVaxCi/BadlBa+26HFNrsBaUQFWVSpMR0ZiSiDAVPoFzMbHQyQURlBAcCj5ss4y/FjB + HhFRb4Xw+fyiTKFwKiOnAPkXy3EvS4iFoiLsmM14qFDgtkaDu5bA2uHDqIuO1lLg629SQoqApLJK6rzR + 6zk4ONTTPzDwQ2lFNSR5+ZjMyMADX1+MRkejc2ICA3I55ohgsnDNz2+OSuVV1N7RRZ29N52Gvxzdnf5e + h7mFRfTd0kKlVGEsLAwjTk7oVqtxSyzGoiWyVViIHUtAHRb2OSUmJRP37USK5yU41jUoDYN3RvCp9jba + Nd1QXNegLy4OX1nuDoeH/7u86e+PJzwejI6OqJPJ4okVyCYWm02vBbAogBXoIRJnN1bVXF6yxH6R19bv + Fl8qNQ6EhGwv29nBZGWFJ5aI0dUVypwceUhUFFHQWc7/eHl704kXT5Kn5ytML2+fIw4ODm7WNjbOR48d + 836HzZZLOZyevODgFh8vLy7D3t6eiGz/AfbnLf28f482AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.Designer.cs new file mode 100644 index 00000000..e3b60262 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.Designer.cs @@ -0,0 +1,166 @@ +namespace WebsitePanel.Installer.Controls +{ + partial class ServersControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServersControl)); + this.grpConnectionSettings = new System.Windows.Forms.GroupBox(); + this.txtPassword = new System.Windows.Forms.TextBox(); + this.lblPassword = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.lblPort = new System.Windows.Forms.Label(); + this.txtServer = new System.Windows.Forms.TextBox(); + this.lblServer = new System.Windows.Forms.Label(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnTest = new System.Windows.Forms.Button(); + this.grpConnectionSettings.SuspendLayout(); + this.SuspendLayout(); + // + // grpConnectionSettings + // + this.grpConnectionSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.grpConnectionSettings.Controls.Add(this.txtPassword); + this.grpConnectionSettings.Controls.Add(this.lblPassword); + this.grpConnectionSettings.Controls.Add(this.txtPort); + this.grpConnectionSettings.Controls.Add(this.lblPort); + this.grpConnectionSettings.Controls.Add(this.txtServer); + this.grpConnectionSettings.Controls.Add(this.lblServer); + this.grpConnectionSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.grpConnectionSettings.Location = new System.Drawing.Point(14, 3); + this.grpConnectionSettings.Name = "grpConnectionSettings"; + this.grpConnectionSettings.Size = new System.Drawing.Size(379, 122); + this.grpConnectionSettings.TabIndex = 0; + this.grpConnectionSettings.TabStop = false; + this.grpConnectionSettings.Text = "Connection settings"; + // + // txtPassword + // + this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPassword.Location = new System.Drawing.Point(122, 82); + this.txtPassword.Name = "txtPassword"; + this.txtPassword.PasswordChar = '*'; + this.txtPassword.Size = new System.Drawing.Size(234, 21); + this.txtPassword.TabIndex = 5; + // + // lblPassword + // + this.lblPassword.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblPassword.Location = new System.Drawing.Point(16, 82); + this.lblPassword.Name = "lblPassword"; + this.lblPassword.Size = new System.Drawing.Size(100, 21); + this.lblPassword.TabIndex = 4; + this.lblPassword.Text = "Password"; + // + // txtPort + // + this.txtPort.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPort.Location = new System.Drawing.Point(122, 55); + this.txtPort.Name = "txtPort"; + this.txtPort.Size = new System.Drawing.Size(234, 21); + this.txtPort.TabIndex = 3; + // + // lblPort + // + this.lblPort.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblPort.Location = new System.Drawing.Point(16, 55); + this.lblPort.Name = "lblPort"; + this.lblPort.Size = new System.Drawing.Size(100, 21); + this.lblPort.TabIndex = 2; + this.lblPort.Text = "Port"; + // + // txtServer + // + this.txtServer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtServer.Location = new System.Drawing.Point(122, 28); + this.txtServer.Name = "txtServer"; + this.txtServer.Size = new System.Drawing.Size(234, 21); + this.txtServer.TabIndex = 1; + // + // lblServer + // + this.lblServer.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblServer.Location = new System.Drawing.Point(16, 28); + this.lblServer.Name = "lblServer"; + this.lblServer.Size = new System.Drawing.Size(100, 21); + this.lblServer.TabIndex = 0; + this.lblServer.Text = "Server"; + // + // btnAdd + // + this.btnAdd.Image = ((System.Drawing.Image)(resources.GetObject("btnAdd.Image"))); + this.btnAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnAdd.Location = new System.Drawing.Point(148, 131); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.Size = new System.Drawing.Size(128, 28); + this.btnAdd.TabIndex = 9; + this.btnAdd.Text = "Add server"; + this.btnAdd.UseVisualStyleBackColor = true; + // + // btnTest + // + this.btnTest.Image = ((System.Drawing.Image)(resources.GetObject("btnTest.Image"))); + this.btnTest.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnTest.Location = new System.Drawing.Point(14, 131); + this.btnTest.Name = "btnTest"; + this.btnTest.Size = new System.Drawing.Size(128, 28); + this.btnTest.TabIndex = 8; + this.btnTest.Text = "Test connection"; + this.btnTest.UseVisualStyleBackColor = true; + // + // ServersControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.btnAdd); + this.Controls.Add(this.btnTest); + this.Controls.Add(this.grpConnectionSettings); + this.Name = "ServersControl"; + this.Size = new System.Drawing.Size(406, 327); + this.grpConnectionSettings.ResumeLayout(false); + this.grpConnectionSettings.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grpConnectionSettings; + private System.Windows.Forms.TextBox txtPassword; + private System.Windows.Forms.Label lblPassword; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label lblPort; + private System.Windows.Forms.TextBox txtServer; + private System.Windows.Forms.Label lblServer; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Button btnTest; + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.cs new file mode 100644 index 00000000..6aa328ec --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.cs @@ -0,0 +1,46 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +namespace WebsitePanel.Installer.Controls +{ + internal partial class ServersControl : ResultViewControl + { + public ServersControl() + { + InitializeComponent(); + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.resx new file mode 100644 index 00000000..4166a35a --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServersControl.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + j6zEfgNB/y51tqL5CQAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.Designer.cs new file mode 100644 index 00000000..b98a918b --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.Designer.cs @@ -0,0 +1,250 @@ +namespace WebsitePanel.Installer.Controls +{ + partial class ServiceControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServiceControl)); + this.grpConnectionSettings = new System.Windows.Forms.GroupBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnTest = new System.Windows.Forms.Button(); + this.lblStatus = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.button2 = new System.Windows.Forms.Button(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.grpConnectionSettings.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // grpConnectionSettings + // + this.grpConnectionSettings.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.grpConnectionSettings.Controls.Add(this.pictureBox1); + this.grpConnectionSettings.Controls.Add(this.btnAdd); + this.grpConnectionSettings.Controls.Add(this.btnTest); + this.grpConnectionSettings.Controls.Add(this.lblStatus); + this.grpConnectionSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.grpConnectionSettings.Location = new System.Drawing.Point(14, 3); + this.grpConnectionSettings.Name = "grpConnectionSettings"; + this.grpConnectionSettings.Size = new System.Drawing.Size(379, 66); + this.grpConnectionSettings.TabIndex = 0; + this.grpConnectionSettings.TabStop = false; + this.grpConnectionSettings.Text = "Status"; + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(13, 20); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(32, 32); + this.pictureBox1.TabIndex = 12; + this.pictureBox1.TabStop = false; + // + // btnAdd + // + this.btnAdd.Enabled = false; + this.btnAdd.Image = ((System.Drawing.Image)(resources.GetObject("btnAdd.Image"))); + this.btnAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnAdd.Location = new System.Drawing.Point(258, 20); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.Size = new System.Drawing.Size(83, 28); + this.btnAdd.TabIndex = 11; + this.btnAdd.Text = "Stop"; + this.btnAdd.UseVisualStyleBackColor = true; + // + // btnTest + // + this.btnTest.Enabled = false; + this.btnTest.Image = ((System.Drawing.Image)(resources.GetObject("btnTest.Image"))); + this.btnTest.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnTest.Location = new System.Drawing.Point(169, 20); + this.btnTest.Name = "btnTest"; + this.btnTest.Size = new System.Drawing.Size(83, 28); + this.btnTest.TabIndex = 10; + this.btnTest.Text = "Start"; + this.btnTest.UseVisualStyleBackColor = true; + // + // lblStatus + // + this.lblStatus.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblStatus.Location = new System.Drawing.Point(51, 26); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Size = new System.Drawing.Size(112, 21); + this.lblStatus.TabIndex = 0; + this.lblStatus.Text = "Not installed"; + // + // label1 + // + this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.label1.Location = new System.Drawing.Point(16, 82); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(100, 21); + this.label1.TabIndex = 4; + this.label1.Text = "Password"; + // + // label2 + // + this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.label2.Location = new System.Drawing.Point(16, 55); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(100, 21); + this.label2.TabIndex = 2; + this.label2.Text = "Port"; + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.Location = new System.Drawing.Point(122, 28); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(234, 21); + this.textBox1.TabIndex = 1; + // + // label3 + // + this.label3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.label3.Location = new System.Drawing.Point(16, 28); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(100, 21); + this.label3.TabIndex = 0; + this.label3.Text = "Server"; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox2.Location = new System.Drawing.Point(122, 55); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(234, 21); + this.textBox2.TabIndex = 3; + // + // button2 + // + this.button2.Image = ((System.Drawing.Image)(resources.GetObject("button2.Image"))); + this.button2.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.button2.Location = new System.Drawing.Point(14, 240); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(128, 28); + this.button2.TabIndex = 11; + this.button2.Text = "Update settings"; + this.button2.UseVisualStyleBackColor = true; + // + // textBox3 + // + this.textBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox3.Location = new System.Drawing.Point(122, 82); + this.textBox3.Name = "textBox3"; + this.textBox3.PasswordChar = '*'; + this.textBox3.Size = new System.Drawing.Size(234, 21); + this.textBox3.TabIndex = 5; + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.textBox4); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.textBox3); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.textBox2); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.textBox1); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.groupBox1.Location = new System.Drawing.Point(14, 81); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(379, 150); + this.groupBox1.TabIndex = 10; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Connection settings"; + // + // textBox4 + // + this.textBox4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox4.Location = new System.Drawing.Point(122, 109); + this.textBox4.Name = "textBox4"; + this.textBox4.PasswordChar = '*'; + this.textBox4.Size = new System.Drawing.Size(234, 21); + this.textBox4.TabIndex = 7; + // + // label4 + // + this.label4.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.label4.Location = new System.Drawing.Point(16, 109); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(100, 21); + this.label4.TabIndex = 6; + this.label4.Text = "Confirm password"; + // + // ServiceControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.button2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.grpConnectionSettings); + this.Name = "ServiceControl"; + this.Size = new System.Drawing.Size(406, 327); + this.grpConnectionSettings.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grpConnectionSettings; + private System.Windows.Forms.Label lblStatus; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Button btnTest; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Label label4; + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.cs new file mode 100644 index 00000000..7380d425 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.cs @@ -0,0 +1,46 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +namespace WebsitePanel.Installer.Controls +{ + internal partial class ServiceControl : ResultViewControl + { + public ServiceControl() + { + InitializeComponent(); + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.resx new file mode 100644 index 00000000..2c91c02e --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/ServiceControl.resx @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + AABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA5FJREFUOE81U21M + m1UUvg3LmJMlilvUaJzsDzr/7AeJmdkWcW5LlwmYQCmLIZotISbEqSzMQaY4iGYxTaYuQmGwQUtbPtrS + 0Q9aoKUv/aKlLf2iLYVVsTgXOhyxMWQzeTx9wZs8uSf3nue555x7jqCqqorl1+7CQravqCiPXSWvHzz6 + 6msHy4v37z/89MnT3F+Psr4Ha2uW7MZG+u9cjm1ubrKtrS0mEAgYywvk8SHh6pUrpy0z9rAzmYY5nsZY + eAm6SAoWsmejiSeq4WHZZ42NL9XX1zOxWMzq6uq2Bc4Khaz5ctOl2XAc2sgyBubCGPCEeNx1h9DrCqKX + dl3sPgzTtvSFTz5+s6amhhdhQiJ/dP58pcntxVAwgcG5CGQ7AipfFIPeCPrprJ/ObjuD0C6mcWdQERWe + ObOvoqKCsXdPnHjmZmdXXBNO8c55sjGcxMqDh1hd+wORRBLT8wtQ5O9I8I4nDN1CApebmq6La2sZq/zg + XKXK6oDSv8iTDeEEcrkcqHBYTqXg83pht07DZLNvR+aNQhlKQdLVff/UyfeeYxcuXpSM+iIYJHU5Ofz6 + cJ3IjxCLxWCz2aBWq6FQKjGu1UA2xaHTFUK3N4Zbo/dwTig8zr5sbh4dptfllKfaH8Pq7xkE/H7o9Xoo + FArIZDJoNBo4OA4W1xx6yW8gkIDUMAVRdXUd+6q1VcUXi9Dn8MPudMJoMPBkuVzOk/ORpJJJuCMxyOix + EfoN6bgZoppqEWtpabmudPkhdQRxTc+hX2fACIX8P3lmZgbxeBwb2XVMBKPQxFagX87gR7nq37paURm7 + KZEcl2oNaDM50WacxQ2jHQOqIT5nB2dHaimJx1RQbzwJDTXWxNIqzCTw7fc3Ap82NOxmkxYzuyXt4drG + bWifcOIHqxc/T7mgtNhg83jhjS5iciHKd+XkSgb2zDpUVg5t33zd0NHRwRgViVlMpiN3NbrH35mdkNh8 + +IXS6ck3D9VFGYhDR82TJ3OZLPSBCHr7+u719HSz9vZ2xopogOgrmdloODZkmMh2cfPodEfQN7/I//cY + zYGJQrb+9icsFIlCqdK3tlzdW1paygoKCvhB3EXYS0tw7J2jb136/AuNdEj9j8LuwYhnAWO+ELScGz91 + 316rFYmuHTpU8mx+eAl7CDSO28YBwiuEFwnFB14oPvJ2WZn49Kn3G0+WlzccfqP07J7CwhK6e37H7+Ud + u+A/uGZ/VDhOBqoAAAAASUVORK5CYII= + + + + + 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 + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.Designer.cs new file mode 100644 index 00000000..63ce6b5e --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.Designer.cs @@ -0,0 +1,229 @@ +namespace WebsitePanel.Installer.Controls +{ + partial class SettingsControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SettingsControl)); + this.grpWebUpdate = new System.Windows.Forms.GroupBox(); + this.btnCheck = new System.Windows.Forms.Button(); + this.chkAutoUpdate = new System.Windows.Forms.CheckBox(); + this.btnUpdate = new System.Windows.Forms.Button(); + this.grpProxy = new System.Windows.Forms.GroupBox(); + this.txtPassword = new System.Windows.Forms.TextBox(); + this.lblPassword = new System.Windows.Forms.Label(); + this.txtUserName = new System.Windows.Forms.TextBox(); + this.lblUsername = new System.Windows.Forms.Label(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.lblAddress = new System.Windows.Forms.Label(); + this.chkUseHTTPProxy = new System.Windows.Forms.CheckBox(); + this.btnViewLog = new System.Windows.Forms.Button(); + this.grpWebUpdate.SuspendLayout(); + this.grpProxy.SuspendLayout(); + this.SuspendLayout(); + // + // grpWebUpdate + // + this.grpWebUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.grpWebUpdate.Controls.Add(this.btnCheck); + this.grpWebUpdate.Controls.Add(this.chkAutoUpdate); + this.grpWebUpdate.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.grpWebUpdate.Location = new System.Drawing.Point(14, 3); + this.grpWebUpdate.Name = "grpWebUpdate"; + this.grpWebUpdate.Size = new System.Drawing.Size(379, 83); + this.grpWebUpdate.TabIndex = 0; + this.grpWebUpdate.TabStop = false; + this.grpWebUpdate.Text = "Web update"; + // + // btnCheck + // + this.btnCheck.Image = ((System.Drawing.Image)(resources.GetObject("btnCheck.Image"))); + this.btnCheck.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnCheck.Location = new System.Drawing.Point(19, 44); + this.btnCheck.Name = "btnCheck"; + this.btnCheck.Size = new System.Drawing.Size(128, 28); + this.btnCheck.TabIndex = 1; + this.btnCheck.Text = "&Check For Updates"; + this.btnCheck.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; + this.btnCheck.UseVisualStyleBackColor = true; + this.btnCheck.Click += new System.EventHandler(this.OnCheckClick); + // + // chkAutoUpdate + // + this.chkAutoUpdate.Checked = true; + this.chkAutoUpdate.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkAutoUpdate.Location = new System.Drawing.Point(19, 20); + this.chkAutoUpdate.Name = "chkAutoUpdate"; + this.chkAutoUpdate.Size = new System.Drawing.Size(184, 18); + this.chkAutoUpdate.TabIndex = 0; + this.chkAutoUpdate.Text = "Automatically check for updates"; + this.chkAutoUpdate.UseVisualStyleBackColor = true; + // + // btnUpdate + // + this.btnUpdate.Image = ((System.Drawing.Image)(resources.GetObject("btnUpdate.Image"))); + this.btnUpdate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnUpdate.Location = new System.Drawing.Point(14, 236); + this.btnUpdate.Name = "btnUpdate"; + this.btnUpdate.Size = new System.Drawing.Size(128, 28); + this.btnUpdate.TabIndex = 2; + this.btnUpdate.Text = "&Save Settings"; + this.btnUpdate.Click += new System.EventHandler(this.OnUpdateClick); + // + // grpProxy + // + this.grpProxy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.grpProxy.Controls.Add(this.txtPassword); + this.grpProxy.Controls.Add(this.lblPassword); + this.grpProxy.Controls.Add(this.txtUserName); + this.grpProxy.Controls.Add(this.lblUsername); + this.grpProxy.Controls.Add(this.txtAddress); + this.grpProxy.Controls.Add(this.lblAddress); + this.grpProxy.Controls.Add(this.chkUseHTTPProxy); + this.grpProxy.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.grpProxy.Location = new System.Drawing.Point(14, 91); + this.grpProxy.Name = "grpProxy"; + this.grpProxy.Size = new System.Drawing.Size(379, 139); + this.grpProxy.TabIndex = 1; + this.grpProxy.TabStop = false; + this.grpProxy.Text = "Proxy"; + // + // txtPassword + // + this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPassword.Enabled = false; + this.txtPassword.Location = new System.Drawing.Point(125, 101); + this.txtPassword.Name = "txtPassword"; + this.txtPassword.PasswordChar = '*'; + this.txtPassword.Size = new System.Drawing.Size(234, 21); + this.txtPassword.TabIndex = 6; + // + // lblPassword + // + this.lblPassword.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblPassword.Location = new System.Drawing.Point(19, 101); + this.lblPassword.Name = "lblPassword"; + this.lblPassword.Size = new System.Drawing.Size(100, 21); + this.lblPassword.TabIndex = 5; + this.lblPassword.Text = "Password"; + // + // txtUserName + // + this.txtUserName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtUserName.Enabled = false; + this.txtUserName.Location = new System.Drawing.Point(125, 74); + this.txtUserName.Name = "txtUserName"; + this.txtUserName.Size = new System.Drawing.Size(234, 21); + this.txtUserName.TabIndex = 4; + // + // lblUsername + // + this.lblUsername.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblUsername.Location = new System.Drawing.Point(19, 74); + this.lblUsername.Name = "lblUsername"; + this.lblUsername.Size = new System.Drawing.Size(100, 21); + this.lblUsername.TabIndex = 3; + this.lblUsername.Text = "User name"; + // + // txtAddress + // + this.txtAddress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtAddress.Enabled = false; + this.txtAddress.Location = new System.Drawing.Point(125, 47); + this.txtAddress.Name = "txtAddress"; + this.txtAddress.Size = new System.Drawing.Size(234, 21); + this.txtAddress.TabIndex = 2; + // + // lblAddress + // + this.lblAddress.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblAddress.Location = new System.Drawing.Point(19, 47); + this.lblAddress.Name = "lblAddress"; + this.lblAddress.Size = new System.Drawing.Size(100, 21); + this.lblAddress.TabIndex = 1; + this.lblAddress.Text = "Address"; + // + // chkUseHTTPProxy + // + this.chkUseHTTPProxy.Location = new System.Drawing.Point(19, 22); + this.chkUseHTTPProxy.Name = "chkUseHTTPProxy"; + this.chkUseHTTPProxy.Size = new System.Drawing.Size(184, 18); + this.chkUseHTTPProxy.TabIndex = 0; + this.chkUseHTTPProxy.Text = "Use HTTP Proxy"; + this.chkUseHTTPProxy.UseVisualStyleBackColor = true; + this.chkUseHTTPProxy.CheckedChanged += new System.EventHandler(this.OnUseHTTPProxyCheckedChanged); + // + // btnViewLog + // + this.btnViewLog.Image = ((System.Drawing.Image)(resources.GetObject("btnViewLog.Image"))); + this.btnViewLog.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnViewLog.Location = new System.Drawing.Point(148, 236); + this.btnViewLog.Name = "btnViewLog"; + this.btnViewLog.Size = new System.Drawing.Size(128, 28); + this.btnViewLog.TabIndex = 3; + this.btnViewLog.Text = "&View System Log"; + this.btnViewLog.Click += new System.EventHandler(this.OnViewLogClick); + // + // SettingsControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.btnViewLog); + this.Controls.Add(this.grpProxy); + this.Controls.Add(this.btnUpdate); + this.Controls.Add(this.grpWebUpdate); + this.Name = "SettingsControl"; + this.Size = new System.Drawing.Size(406, 327); + this.grpWebUpdate.ResumeLayout(false); + this.grpProxy.ResumeLayout(false); + this.grpProxy.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grpWebUpdate; + private System.Windows.Forms.Button btnUpdate; + private System.Windows.Forms.CheckBox chkAutoUpdate; + private System.Windows.Forms.Button btnCheck; + private System.Windows.Forms.GroupBox grpProxy; + private System.Windows.Forms.TextBox txtPassword; + private System.Windows.Forms.Label lblPassword; + private System.Windows.Forms.TextBox txtUserName; + private System.Windows.Forms.Label lblUsername; + private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Label lblAddress; + private System.Windows.Forms.CheckBox chkUseHTTPProxy; + private System.Windows.Forms.Button btnViewLog; + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.cs new file mode 100644 index 00000000..436b810f --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.cs @@ -0,0 +1,182 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Threading; +using System.Diagnostics; +using System.IO; +using System.Configuration; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +using WebsitePanel.Installer.Common; +using WebsitePanel.Installer.Core; +using WebsitePanel.Installer.Configuration; + +namespace WebsitePanel.Installer.Controls +{ + /// + /// Settings control + /// + internal partial class SettingsControl : ResultViewControl + { + /// + /// Initializes a new instance of the SettingsControl class. + /// + public SettingsControl() + { + InitializeComponent(); + } + + /// + /// Shows control + /// + /// + public override void ShowControl(AppContext context) + { + base.ShowControl(context); + if (!IsInitialized) + { + AppContext = context; + LoadSettings(); + IsInitialized = true; + } + } + + /// + /// Loads application settings + /// + private void LoadSettings() + { + InstallerSection appConfig = AppConfigManager.AppConfiguration; + chkAutoUpdate.Checked = appConfig.GetBooleanSetting(ConfigKeys.Web_AutoCheck); + chkUseHTTPProxy.Checked = appConfig.GetBooleanSetting(ConfigKeys.Web_Proxy_UseProxy); + txtAddress.Text = appConfig.GetStringSetting(ConfigKeys.Web_Proxy_Address); + txtUserName.Text = appConfig.GetStringSetting(ConfigKeys.Web_Proxy_UserName); + txtPassword.Text = appConfig.GetStringSetting(ConfigKeys.Web_Proxy_Password); + } + + private void OnUseHTTPProxyCheckedChanged(object sender, EventArgs e) + { + txtAddress.Enabled = chkUseHTTPProxy.Checked; + txtUserName.Enabled = chkUseHTTPProxy.Checked; + txtPassword.Enabled = chkUseHTTPProxy.Checked; + } + + /// + /// Save application configuration + /// + /// + /// + private void OnUpdateClick(object sender, EventArgs e) + { + KeyValueConfigurationCollection settings = AppConfigManager.AppConfiguration.Settings; + settings[ConfigKeys.Web_AutoCheck].Value = chkAutoUpdate.Checked.ToString(); + settings[ConfigKeys.Web_Proxy_UseProxy].Value = chkUseHTTPProxy.Checked.ToString(); + settings[ConfigKeys.Web_Proxy_Address].Value = txtAddress.Text; + settings[ConfigKeys.Web_Proxy_UserName].Value = txtUserName.Text; + settings[ConfigKeys.Web_Proxy_Password].Value = txtPassword.Text; + // + AppConfigManager.SaveConfiguration(true); + } + + /// + /// Checks for updates + /// + /// + /// + private void OnCheckClick(object sender, EventArgs e) + { + //start check in the separated thread + AppContext.AppForm.StartAsyncProgress("Connecting...", true); + ThreadStart threadDelegate = new ThreadStart(StartCheck); + Thread newThread = new Thread(threadDelegate); + newThread.Start(); + } + + /// + /// Starts check + /// + private void StartCheck() + { + bool startUpdate = CheckForUpdate(); + if (startUpdate) + { + AppContext.AppForm.Close(); + } + } + + /// + /// Checks for update + /// + /// + private bool CheckForUpdate() + { + string fileName; + bool updateAvailable = false; + try + { + updateAvailable = AppContext.AppForm.CheckForUpdate(out fileName); + AppContext.AppForm.FinishProgress(); + } + catch (Exception ex) + { + Log.WriteError("Service error", ex); + AppContext.AppForm.FinishProgress(); + AppContext.AppForm.ShowServerError(); + return false; + } + + string appName = AppContext.AppForm.Text; + if (updateAvailable) + { + string message = string.Format("This version of {0} is out of date.\nWould you like to download the latest version?", appName); + if (MessageBox.Show(AppContext.AppForm, message, appName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) + { + return AppContext.AppForm.StartUpdateProcess(fileName); + } + } + else + { + string message = string.Format("This version of {0} is up to date.", appName); + Log.WriteInfo(message); + AppContext.AppForm.ShowInfo(message); + } + return false; + } + + private void OnViewLogClick(object sender, EventArgs e) + { + Log.ShowLogFile(); + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.resx new file mode 100644 index 00000000..bca2e66c --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/SettingsControl.resx @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA05JREFUOE+Vk2tI + k2EYhtMF/Qqi0haVaaP80jbnnIecNQ+bh5k5yxpump+Zh2EnSbODqalBcxrNkppJTd1Sl3kIKrTylMM0 + MyxL1LKWqQyMEjpQpnefKwLzVy88f16e++J+3vd+LBb8cxi8TP5KxhrhklXLfWm0hXafP34dGB963/zh + /Wjr9M+pJ1T754nBQsyRLd9wkFbbOW7pE6dRBCqKv0fps5H2IB/7dfUIPdsCmaoHwqR7RtczZDXV60jV + wjmAnZmdFgHJN25xSuNBNmQi7Xot8l5qIL7cjnDNE8SUvYD4VBsiztZN27kUKikAiyrLv5DNkmvniSsS + eL5g49FEIyan+nHXMIR9dc9AthgRWzWA3Wc6kFJ9HduOX5he5XT6KAVYZgasdk73ts9JmnHslCJ2WIY3 + 3wz4OmPEgNEE5esxRLWPgtQPQlrQDaUpGrkmARwj8set7JMFZoCdKEttqWZhbeU28Hvk0EwWYNQ0CaW2 + A2SPCTsajYjQ9iMs24CMES+kjPHgmnMEa7l5p8yADWT2CHtXOVhRWngm6BB0qBInLjZB2vcJIQYTAmuG + IS56hpDjBuRN+CF6iI1Nl/zgKChrMgNsYlN/uElugyVvAjv/OTzL+sG/MQx+zVvwda8gLOqD6HQ3BPKH + COhdB+dGa1ir3OHgUzViBtAlKWNMUgVuZD2YUj2YkTqwZKVwjqkAL6UJ/uldECS1w0PagPXFMrDO7QVn + jxoMbskfB2xVEeFWj00CPThherj37YR4MA7y1ydBVpfAV94Cr6g28KJbwU9sxtaEeniSNVjDVGT9duCQ + EUS43QaxpQLrykVY3CwGrzsBW3oTETJwAJE31fBNNkCY2ozwC72I1vfDJ6Htk5X9EZEZQP3nYlt28VXC + ow6EpBAWaiZod9zB6AiHy9N4cJ/GgPtyO/XA5Yi4RiXycCdsXQuyKR39b5AoGpPB0TUQHrWwleVihU4I + u8Yw2Dz0hU1HAFy6EsFPq4T3/nY4h1ZpKbHrnCTOZpuCODFcrhQ7eNVi6TERrDWBoN/ngaPNhb/yPoJy + W6ftvdUFf8SL/l3C2VFos/Gkb0wPXr31aCndP/4dsUfxhfAqfczgnFdYE6nBs7bnLdI80n9e/AKxCsOV + gSO8kwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAg1JREFUOE+tk+9L + U1EYx/fXFPQierHeDXphtZmFUBLcjNYLLcyiH26lkIbZFMfd1cwNXS0N07iL5na31tyVkshl5Cimc7AN + 8dZWLdLSpTbb+nbvCVYnrAg88Hlznuf5POccnqNSbcR64F+GV8hiaHAeNx0Z2KxpcBYJraYkGuqjBKNh + Goa6qSKHK+0o9vZ6sxgVAXPHPP62/I8i2FrmgplNYMv2kp+CYdfiPwWruTwE8QU273ZCV2qiBTy/gNHg + +idYWytA4dPnL7gXmMSmXTzU6hpa4LjxDvd9OTSZUsUbFArf8DVfwIePqwTp7SKGPE+J4NTZcVpgs6bg + dq/A0DSLaDyN8NQcxsMJPAzNYHgkTOB9EzByPwTHa8doQScnwelcgtkmgamdRNnRx9AcDGDbXjcp+BVN + pQB9lUgL2ttmcXtwAb32N+iySrBwSbS2x3CpJYJz5ycIJ888wbETY9BXi2D0flpwuTmOvv4MurolsB0J + qEur1kXpzBzx4wAj0ILGizH02NNgLUlS+CqVQV5+QIXsSo7A9gVJbD/jwb4KFy2ovxDF1WtzuNI2Q5KU + wopDAoKhGF6/XyIM+KZJTCnWlTtpgUEeU7Mljsbml38U9HsiJKYt51Gy585vAnnGjQ3PcbouRJLuep/B + 1D0CziHKBAns9QCJ7dAOQLPzFi2Qp0el07aQzf9hIz6y6juAficIctTi+AAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAiFJREFUOE+lk/9P + EmEcx+tPdLVaqx9arbH1Rbf8ha10Za3N1dJNB6sEhkFcXid+IcRSQjlJhJqAfJETIowvhzlLZjV4znfP + c4xDg7a2bnvfPXf7vF/vz/N8dicBnPiviwGa4ld3urhApWr3lzHuK8CyuI1nbz5jjPPAxLkguBZgdQjf + l7zevqZHM7MPjhW5FP1SQ0pWkGQqK1gJxzAyFYaYKuInLVrLyrDwc4okpW+q3bPb35KNc1k8tTnBBQuQ + 9oC4DCR2AU+0BGFyWtIAnZITNH2jSGCxC/hIjemvQHkf2DkAkhRmsgl1DfB8qai2vVlpiK0ZIF5SYH0x + geX0HuQfwC8C7CuAN16CwWBMagAzPaxNmVAjwUaJIFYgiFJFtusQnK9hn/Ehla+ARYakAgwmGwmHw90a + 4Ml8jiY3TO+zNYhbNQQyNbyaFcHzAvS378I8zoHjXmLYYEFkff3GsSmMurYQo8mBTB1+qSHeHUQ+l4fu + ei9EiaBn1E+3UseVhwvU2xq9OoUhZwprOdIyT3qQ/5THJV033iUOaEcEV4d8EDOHuPhgvh0wOBGn6UQt + ZFpdXoR+4DHM0yH6rqhiyQxwfsDdDrhvj2iFTUPreaglO8QKzvbPVtq20G/9cATQMPwplnymb6Z66tZU + VxtAPxbcdYa+dTQyUKfkY1PoNQZO94z4q9eGfdA98uLy4Fv1sC7cc+PcHVfH5I4/09HW/nX9G9TaBKNr + RrciAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.Designer.cs new file mode 100644 index 00000000..e43adea9 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.Designer.cs @@ -0,0 +1,115 @@ +namespace WebsitePanel.Installer +{ + partial class TopLogoControl + { + private System.Windows.Forms.Panel pnlLogo; + private System.Windows.Forms.PictureBox imgLogo; + private System.Windows.Forms.Label lblVersion; + private LineBox line; + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TopLogoControl)); + this.pnlLogo = new System.Windows.Forms.Panel(); + this.progressIcon = new WebsitePanel.Installer.Controls.ProgressIcon(); + this.lblVersion = new System.Windows.Forms.Label(); + this.imgLogo = new System.Windows.Forms.PictureBox(); + this.line = new WebsitePanel.Installer.LineBox(); + this.pnlLogo.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.imgLogo)).BeginInit(); + this.SuspendLayout(); + // + // pnlLogo + // + this.pnlLogo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlLogo.BackColor = System.Drawing.Color.White; + this.pnlLogo.Controls.Add(this.progressIcon); + this.pnlLogo.Controls.Add(this.lblVersion); + this.pnlLogo.Controls.Add(this.imgLogo); + this.pnlLogo.Location = new System.Drawing.Point(0, 0); + this.pnlLogo.Name = "pnlLogo"; + this.pnlLogo.Size = new System.Drawing.Size(496, 63); + this.pnlLogo.TabIndex = 2; + // + // progressIcon + // + this.progressIcon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.progressIcon.Location = new System.Drawing.Point(452, 15); + this.progressIcon.Name = "progressIcon"; + this.progressIcon.Size = new System.Drawing.Size(30, 30); + this.progressIcon.TabIndex = 4; + this.progressIcon.Visible = false; + // + // lblVersion + // + this.lblVersion.Font = new System.Drawing.Font("Verdana", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.lblVersion.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lblVersion.Location = new System.Drawing.Point(317, 31); + this.lblVersion.Name = "lblVersion"; + this.lblVersion.Size = new System.Drawing.Size(42, 13); + this.lblVersion.TabIndex = 2; + this.lblVersion.Text = "v1.0"; + // + // imgLogo + // + this.imgLogo.Image = ((System.Drawing.Image)(resources.GetObject("imgLogo.Image"))); + this.imgLogo.Location = new System.Drawing.Point(13, 7); + this.imgLogo.Name = "imgLogo"; + this.imgLogo.Size = new System.Drawing.Size(303, 48); + this.imgLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.imgLogo.TabIndex = 0; + this.imgLogo.TabStop = false; + // + // line + // + this.line.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.line.Location = new System.Drawing.Point(0, 61); + this.line.Name = "line"; + this.line.Size = new System.Drawing.Size(496, 2); + this.line.TabIndex = 3; + this.line.TabStop = false; + // + // TopLogoControl + // + this.BackColor = System.Drawing.Color.White; + this.Controls.Add(this.line); + this.Controls.Add(this.pnlLogo); + this.Name = "TopLogoControl"; + this.Size = new System.Drawing.Size(496, 64); + this.pnlLogo.ResumeLayout(false); + this.pnlLogo.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.imgLogo)).EndInit(); + this.ResumeLayout(false); + + } + #endregion + + private WebsitePanel.Installer.Controls.ProgressIcon progressIcon; + + + } +} + diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.cs new file mode 100644 index 00000000..d1f65db9 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.cs @@ -0,0 +1,62 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System.Windows.Forms; +using System.Reflection; + +namespace WebsitePanel.Installer +{ + /// + /// Top logo + /// + internal partial class TopLogoControl : UserControl + { + /// + /// Initializes a new instance of the TopLogoControl class. + /// + public TopLogoControl() + { + // This call is required by the Windows Form Designer. + InitializeComponent(); + lblVersion.Text = "v" + this.GetType().Assembly.GetName().Version.ToString(3); + } + + internal void ShowProgress() + { + progressIcon.Visible = true; + progressIcon.StartAnimation(); + } + + internal void HideProgress() + { + progressIcon.Visible = false; + progressIcon.StopAnimation(); + } + } +} + diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.resx new file mode 100644 index 00000000..d8f29bf1 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Controls/TopLogoControl.resx @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + R0lGODlhLwEwAIcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8P + DxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMj + IyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3 + Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktL + S0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9f + X2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNz + c3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeH + h4iIiImJiYuLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5yc + nJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7Cw + sLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TE + xMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY + 2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs + 7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///wAA + ACH/C05FVFNDQVBFMi4wAwEBAAAh+QQJAAD/ACwAAAAALwEwAAAI/wD/CRxIsKDBgwgTKlzIsKHDhxAj + SpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0BT+htKtKjR + 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 + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Program.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Program.cs new file mode 100644 index 00000000..4843375d --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Program.cs @@ -0,0 +1,255 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Diagnostics; +using System.Collections.Generic; +using System.Windows.Forms; + +using System.Security; +using System.Security.Permissions; + +using WebsitePanel.Installer.Common; +using WebsitePanel.Installer.Services; +using System.Xml; +using System.Runtime.Remoting.Lifetime; +using System.Security.Principal; +using WebsitePanel.Installer.Core; +using WebsitePanel.Installer.Configuration; +using System.Reflection; + +namespace WebsitePanel.Installer +{ + /// + /// Entry point class + /// + static class Program + { + public const string SetupFromXmlFileParam = "setupxml"; + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // + Utils.FixConfigurationSectionDefinition(); + + //check security permissions + if (!Utils.CheckSecurity()) + { + ShowSecurityError(); + return; + } + + //check administrator permissions + if (!Utils.IsAdministrator()) + { + ShowSecurityError(); + return; + } + + //check for running instance + if ( !Utils.IsNewInstance()) + { + UiUtils.ShowRunningInstance(); + return; + } + + Log.WriteApplicationStart(); + //AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException); + Application.ApplicationExit += new EventHandler(OnApplicationExit); + Application.ThreadException += new ThreadExceptionEventHandler(OnThreadException); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + //check OS version + Log.WriteInfo("{0} detected", Global.OSVersion); + + //check IIS version + if (Global.IISVersion.Major == 0) + Log.WriteError("IIS not found."); + else + Log.WriteInfo("IIS {0} detected", Global.IISVersion); + + ApplicationForm mainForm = new ApplicationForm(); + + if (!CheckCommandLineArgument("/nocheck")) + { + //Check for new versions + if (CheckForUpdate(mainForm)) + { + return; + } + } + // Load setup parameters from an XML file + LoadSetupXmlFile(); + //start application + mainForm.InitializeApplication(); + Application.Run(mainForm); + // + Utils.SaveMutex(); + } + + private static void LoadSetupXmlFile() + { + string file = GetCommandLineArgumentValue(SetupFromXmlFileParam); + if (!string.IsNullOrEmpty(file)) + { + if (FileUtils.FileExists(file)) + { + try + { + XmlDocument doc = new XmlDocument(); + doc.Load(file); + Global.SetupXmlDocument = doc; + } + catch (Exception ex) + { + Log.WriteError("I/O error", ex); + } + } + } + } + + /// + /// Application thread exception handler + /// + static void OnThreadException(object sender, ThreadExceptionEventArgs e) + { + Log.WriteError("Fatal error occured.", e.Exception); + string message = "A fatal error has occurred. We apologize for this inconvenience.\n" + + "Please contact Technical Support at support@websitepanel.net.\n\n" + + "Make sure you include a copy of the Installer.log file from the\n" + + "WebsitePanel Installer home directory."; + MessageBox.Show(message, "WebsitePanel Installer", MessageBoxButtons.OK, MessageBoxIcon.Error); + Application.Exit(); + } + + /// + /// Application exception handler + /// + static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) + { + Log.WriteError("Fatal error occured.", (Exception)e.ExceptionObject); + string message = "A fatal error has occurred. We apologize for this inconvenience.\n" + + "Please contact Technical Support at support@websitepanel.net.\n\n" + + "Make sure you include a copy of the Installer.log file from the\n" + + "WebsitePanel Installer home directory."; + MessageBox.Show(message, "WebsitePanel Installer", MessageBoxButtons.OK, MessageBoxIcon.Error); + Process.GetCurrentProcess().Kill(); + } + + private static void ShowSecurityError() + { + string message = "You do not have the appropriate permissions to perform this operation. Make sure you are running the application from the local disk and you have local system administrator privileges."; + MessageBox.Show(message, "WebsitePanel Installer", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + /// + /// Writes to log on application exit + /// + private static void OnApplicationExit(object sender, EventArgs e) + { + Log.WriteApplicationEnd(); + } + + /// + /// Check whether application is up-to-date + /// + private static bool CheckForUpdate(ApplicationForm mainForm) + { + if (!AppConfigManager.AppConfiguration.GetBooleanSetting(ConfigKeys.Web_AutoCheck)) + return false; + + string appName = mainForm.Text; + string fileName; + bool updateAvailable; + try + { + updateAvailable = mainForm.CheckForUpdate(out fileName); + } + catch (Exception ex) + { + Log.WriteError("Update error", ex); + mainForm.ShowServerError(); + return false; + } + + if (updateAvailable) + { + string message = string.Format("An updated version of {0} is available now.\nWould you like to download and install the latest version?", appName); + if (MessageBox.Show(message, appName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) + { + return mainForm.StartUpdateProcess(fileName); + } + } + return false; + } + + /// + /// Check for existing command line argument + /// + private static bool CheckCommandLineArgument(string argName) + { + string[] args = Environment.GetCommandLineArgs(); + for (int i = 1; i < args.Length; i++) + { + string arg = args[i]; + if (string.Equals(arg, argName, StringComparison.InvariantCultureIgnoreCase)) + { + return true; + } + } + return false; + } + + /// + /// Check for existing command line argument + /// + private static string GetCommandLineArgumentValue(string argName) + { + string key = "/"+argName.ToLower()+":"; + string[] args = Environment.GetCommandLineArgs(); + for (int i = 1; i < args.Length; i++) + { + string arg = args[i].ToLower(); + if (arg.StartsWith(key)) + { + return arg.Substring(key.Length); + } + } + return null; + } + + } +} \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/AssemblyInfo.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..30bd80b6 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/AssemblyInfo.cs @@ -0,0 +1,49 @@ +// Copyright (c) 2011, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WebsitePanel Installer")] +[assembly: AssemblyDescription("WebsitePanel Installer")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("WebsitePanel Installer")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("45D4837C-45BA-426A-B41C-BCD17AD97FCD")] \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.Designer.cs b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.Designer.cs new file mode 100644 index 00000000..d051c368 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.Designer.cs @@ -0,0 +1,147 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Installer.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebsitePanel.Installer.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Icon Computer16 { + get { + object obj = ResourceManager.GetObject("Computer16", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon Computer32 { + get { + object obj = ResourceManager.GetObject("Computer32", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon Folder16 { + get { + object obj = ResourceManager.GetObject("Folder16", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon Folder32 { + get { + object obj = ResourceManager.GetObject("Folder32", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon Network16 { + get { + object obj = ResourceManager.GetObject("Network16", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon Network32 { + get { + object obj = ResourceManager.GetObject("Network32", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon Service16 { + get { + object obj = ResourceManager.GetObject("Service16", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon Service32 { + get { + object obj = ResourceManager.GetObject("Service32", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon Tool16 { + get { + object obj = ResourceManager.GetObject("Tool16", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon Tool32 { + get { + object obj = ResourceManager.GetObject("Tool32", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon World16 { + get { + object obj = ResourceManager.GetObject("World16", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + internal static System.Drawing.Icon World32 { + get { + object obj = ResourceManager.GetObject("World32", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + } +} diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.resx b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.resx new file mode 100644 index 00000000..1e11f25c --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Properties/Resources.resx @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Computer16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Computer32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Folder16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Folder32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Network16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Network32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Service16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Service32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Tool16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Tool32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\World16.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\World32.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer16.ico new file mode 100644 index 00000000..c897d0b1 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer16.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer32.ico new file mode 100644 index 00000000..3a748010 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Computer32.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder16.ico new file mode 100644 index 00000000..9a3997fe Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder16.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder32.ico new file mode 100644 index 00000000..74b3cfed Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Folder32.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network16.ico new file mode 100644 index 00000000..cc3e55e4 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network16.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network32.ico new file mode 100644 index 00000000..079bf865 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Network32.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service16.ico new file mode 100644 index 00000000..24450b83 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service16.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service32.ico new file mode 100644 index 00000000..93487a27 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Service32.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool16.ico new file mode 100644 index 00000000..fabc1ac5 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool16.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool32.ico new file mode 100644 index 00000000..b1b76737 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/Tool32.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/WebSitePanel.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/WebSitePanel.ico new file mode 100644 index 00000000..10fcb36c Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/WebSitePanel.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World16.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World16.ico new file mode 100644 index 00000000..3809be96 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World16.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World32.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World32.ico new file mode 100644 index 00000000..7e774ed4 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Resources/World32.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Updater.exe b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Updater.exe new file mode 100644 index 00000000..7e9327c6 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/Updater.exe differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/WebsitePanel.Installer.csproj b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/WebsitePanel.Installer.csproj new file mode 100644 index 00000000..2e547b11 --- /dev/null +++ b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/WebsitePanel.Installer.csproj @@ -0,0 +1,297 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {A358C6E2-F57D-4AB9-B13D-FD3048134143} + WinExe + Properties + WebsitePanel.Installer + WebsitePanel.Installer + websitepanel.ico + + + 3.5 + + + v4.0 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + AllRules.ruleset + false + + + none + true + bin\Release\ + TRACE + prompt + 4 + AllRules.ruleset + + + Always + + + + False + ..\..\Lib\Ionic.Zip.Reduced.dll + + + + + + + + + + + + + + + + VersionInfo.cs + + + Form + + + ApplicationForm.cs + + + + + Code + + + UserControl + + + Form + + + Loader.cs + + + + + UserControl + + + ComponentsControl.cs + + + UserControl + + + ComponentControl.cs + + + UserControl + + + UserControl + + + SettingsControl.cs + + + UserControl + + + ServiceControl.cs + + + UserControl + + + ServerControl.cs + + + Component + + + LineBox.cs + + + UserControl + + + ServersControl.cs + + + UserControl + + + TopLogoControl.cs + + + + + Designer + ApplicationForm.cs + + + ComponentsControl.cs + Designer + + + ComponentControl.cs + Designer + + + Designer + Loader.cs + + + SettingsControl.cs + Designer + + + ServiceControl.cs + Designer + + + ServerControl.cs + Designer + + + Designer + ServersControl.cs + + + Designer + TopLogoControl.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Designer + ProgressIcon.cs + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + {0E4A3F5B-0BB1-4F63-863D-7B0182B378CF} + WebsitePanel.Installer.Core + + + + + + + + + COPY "$(ProjectDir)App.$(ConfigurationName).config" "$(ProjectDir)App.config" /Y + + + \ No newline at end of file diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/application.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/application.ico new file mode 100644 index 00000000..09b98f81 Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/application.ico differ diff --git a/WebsitePanel.Installer/Sources/WebsitePanel.Installer/websitepanel.ico b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/websitepanel.ico new file mode 100644 index 00000000..10fcb36c Binary files /dev/null and b/WebsitePanel.Installer/Sources/WebsitePanel.Installer/websitepanel.ico differ