Compare commits

..
2 Commits
Author SHA1 Message Date
Belim b8a8fa58bb Merge branch 'main' of https://github.com/builtbybel/Flyby11 2024-10-30 21:33:51 +01:00
Belim 9ff59e15a4 Init-0.14 2024-10-30 21:33:40 +01:00
20 changed files with 1151 additions and 814 deletions

No files matched your search

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

+71
View File
@@ -0,0 +1,71 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Privacy
{
internal class ActivityHistory : FeatureBase
{
public ActivityHistory(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Privacy";
private const string valueName = "ActivityHistoryEnabled";
private const int desiredValue = 0;
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override string ID()
{
return "Disable activity history";
}
public override string Info()
{
return "Disable activity history (prevents Windows from tracking and storing your activity)";
}
public override bool CheckFeature()
{
return (
Utils.IntEquals(keyName, valueName, desiredValue)
);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
public override bool UndoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
+3 -3
View File
@@ -87,7 +87,7 @@ namespace FlybyScript
{ {
return new Label return new Label
{ {
Text = feature.CheckFeature() ? "Feature Enabled" : "Feature Disabled", Text = feature.CheckFeature() ? "Accepted" : "Declined",
AutoSize = true, AutoSize = true,
Font = new Font("Segoe UI", 10, FontStyle.Italic), Font = new Font("Segoe UI", 10, FontStyle.Italic),
ForeColor = Color.Gray, ForeColor = Color.Gray,
@@ -124,7 +124,7 @@ namespace FlybyScript
if (success) if (success)
{ {
logger.Log($"{feature.ID()} enabled", Color.Green); logger.Log($"{feature.ID()} enabled", Color.Green);
statusLabel.Text = "Feature Enabled"; // Update status label statusLabel.Text = "Accepted"; // Update status label
} }
} }
else else
@@ -133,7 +133,7 @@ namespace FlybyScript
if (success) if (success)
{ {
logger.Log($"{feature.ID()} disabled", Color.Red); logger.Log($"{feature.ID()} disabled", Color.Red);
statusLabel.Text = "Feature Disabled"; statusLabel.Text = "Declined";
} }
} }
} }
@@ -0,0 +1,69 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Privacy
{
internal class LocationTracking : FeatureBase
{
public LocationTracking(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\LocationAndSensors";
private const string valueName = "LocationEnabled";
private const int desiredValue = 0;
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override string ID()
{
return "Disable location tracking";
}
public override string Info()
{
return "Disable location tracking (prevents Windows from accessing your location)";
}
public override bool CheckFeature()
{
return Utils.IntEquals(keyName, valueName,desiredValue);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 0, RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
public override bool UndoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 1, RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
+11 -1
View File
@@ -56,12 +56,13 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Experience\ActivityHistory.cs" />
<Compile Include="Experience\FeaturePanel.cs"> <Compile Include="Experience\FeaturePanel.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
<Compile Include="Experience\FileExplorerAds.cs" /> <Compile Include="Experience\FileExplorerAds.cs" />
<Compile Include="Experience\FindMyDevice.cs" />
<Compile Include="Experience\FinishSetupAds.cs" /> <Compile Include="Experience\FinishSetupAds.cs" />
<Compile Include="Experience\LocationTracking.cs" />
<Compile Include="Experience\LockScreenAds.cs" /> <Compile Include="Experience\LockScreenAds.cs" />
<Compile Include="Experience\PersonalizedAds.cs" /> <Compile Include="Experience\PersonalizedAds.cs" />
<Compile Include="Experience\PrivacyExperience.cs" /> <Compile Include="Experience\PrivacyExperience.cs" />
@@ -81,6 +82,12 @@
<Compile Include="MainForm.Designer.cs"> <Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon> <DependentUpon>MainForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="PluginsForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="PluginsForm.Designer.cs">
<DependentUpon>PluginsForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" /> <Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Patcher\PSPatcher.cs" /> <Compile Include="Patcher\PSPatcher.cs" />
@@ -104,6 +111,9 @@
<DependentUpon>MainForm.cs</DependentUpon> <DependentUpon>MainForm.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="PluginsForm.resx">
<DependentUpon>PluginsForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx"> <EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput> <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+34 -37
View File
@@ -29,7 +29,6 @@
private void InitializeComponent() private void InitializeComponent()
{ {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.treeSettings = new System.Windows.Forms.TreeView();
this.rtbDescription = new System.Windows.Forms.RichTextBox(); this.rtbDescription = new System.Windows.Forms.RichTextBox();
this.btnTogglePatch = new System.Windows.Forms.Button(); this.btnTogglePatch = new System.Windows.Forms.Button();
this.linkGitHub = new System.Windows.Forms.LinkLabel(); this.linkGitHub = new System.Windows.Forms.LinkLabel();
@@ -38,6 +37,7 @@
this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.linkLabel1 = new System.Windows.Forms.LinkLabel();
this.linkLabel2 = new System.Windows.Forms.LinkLabel(); this.linkLabel2 = new System.Windows.Forms.LinkLabel();
this.panelMain = new System.Windows.Forms.Panel(); this.panelMain = new System.Windows.Forms.Panel();
this.treeSettings = new System.Windows.Forms.TreeView();
this.checkInstallationMedia = new System.Windows.Forms.CheckBox(); this.checkInstallationMedia = new System.Windows.Forms.CheckBox();
this.linkChangeExperience = new System.Windows.Forms.LinkLabel(); this.linkChangeExperience = new System.Windows.Forms.LinkLabel();
this.panelForm = new System.Windows.Forms.Panel(); this.panelForm = new System.Windows.Forms.Panel();
@@ -45,31 +45,6 @@
this.panelForm.SuspendLayout(); this.panelForm.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// treeSettings
//
this.treeSettings.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.treeSettings.BackColor = System.Drawing.Color.White;
this.treeSettings.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.treeSettings.CheckBoxes = true;
this.treeSettings.Font = new System.Drawing.Font("Segoe UI Variable Text Light", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.treeSettings.ForeColor = System.Drawing.Color.Black;
this.treeSettings.FullRowSelect = true;
this.treeSettings.Indent = 20;
this.treeSettings.ItemHeight = 25;
this.treeSettings.Location = new System.Drawing.Point(36, 168);
this.treeSettings.Name = "treeSettings";
this.treeSettings.ShowLines = false;
this.treeSettings.ShowNodeToolTips = true;
this.treeSettings.ShowPlusMinus = false;
this.treeSettings.ShowRootLines = false;
this.treeSettings.Size = new System.Drawing.Size(865, 172);
this.treeSettings.TabIndex = 200;
this.treeSettings.TabStop = false;
this.treeSettings.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeSettings_AfterCheck);
this.treeSettings.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeSettings_NodeMouseClick);
//
// rtbDescription // rtbDescription
// //
this.rtbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) this.rtbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
@@ -95,7 +70,7 @@
this.btnTogglePatch.FlatAppearance.BorderSize = 2; this.btnTogglePatch.FlatAppearance.BorderSize = 2;
this.btnTogglePatch.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.btnTogglePatch.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnTogglePatch.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnTogglePatch.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnTogglePatch.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F); this.btnTogglePatch.Font = new System.Drawing.Font("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnTogglePatch.Location = new System.Drawing.Point(629, 484); this.btnTogglePatch.Location = new System.Drawing.Point(629, 484);
this.btnTogglePatch.Name = "btnTogglePatch"; this.btnTogglePatch.Name = "btnTogglePatch";
this.btnTogglePatch.Size = new System.Drawing.Size(222, 40); this.btnTogglePatch.Size = new System.Drawing.Size(222, 40);
@@ -133,7 +108,7 @@
this.btnMountRun.FlatAppearance.BorderSize = 2; this.btnMountRun.FlatAppearance.BorderSize = 2;
this.btnMountRun.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.btnMountRun.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnMountRun.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnMountRun.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnMountRun.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F); this.btnMountRun.Font = new System.Drawing.Font("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnMountRun.Location = new System.Drawing.Point(403, 484); this.btnMountRun.Location = new System.Drawing.Point(403, 484);
this.btnMountRun.Name = "btnMountRun"; this.btnMountRun.Name = "btnMountRun";
this.btnMountRun.Size = new System.Drawing.Size(220, 40); this.btnMountRun.Size = new System.Drawing.Size(220, 40);
@@ -149,7 +124,7 @@
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.lblHeader.AutoEllipsis = true; this.lblHeader.AutoEllipsis = true;
this.lblHeader.Font = new System.Drawing.Font("Segoe UI Variable Small Light", 21.25F); this.lblHeader.Font = new System.Drawing.Font("Segoe UI Variable Small Light", 21.25F);
this.lblHeader.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.lblHeader.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(35)))), ((int)(((byte)(115)))), ((int)(((byte)(193)))));
this.lblHeader.Location = new System.Drawing.Point(30, 38); this.lblHeader.Location = new System.Drawing.Point(30, 38);
this.lblHeader.Name = "lblHeader"; this.lblHeader.Name = "lblHeader";
this.lblHeader.Size = new System.Drawing.Size(780, 82); this.lblHeader.Size = new System.Drawing.Size(780, 82);
@@ -184,20 +159,20 @@
this.linkLabel2.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(186)))), ((int)(((byte)(0))))); this.linkLabel2.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(186)))), ((int)(((byte)(0)))));
this.linkLabel2.Location = new System.Drawing.Point(233, 558); this.linkLabel2.Location = new System.Drawing.Point(233, 558);
this.linkLabel2.Name = "linkLabel2"; this.linkLabel2.Name = "linkLabel2";
this.linkLabel2.Size = new System.Drawing.Size(44, 16); this.linkLabel2.Size = new System.Drawing.Size(51, 16);
this.linkLabel2.TabIndex = 208; this.linkLabel2.TabIndex = 208;
this.linkLabel2.TabStop = true; this.linkLabel2.TabStop = true;
this.linkLabel2.Text = "0.13.81"; this.linkLabel2.Text = "0.14.107";
// //
// panelMain // panelMain
// //
this.panelMain.Controls.Add(this.treeSettings);
this.panelMain.Controls.Add(this.checkInstallationMedia); this.panelMain.Controls.Add(this.checkInstallationMedia);
this.panelMain.Controls.Add(this.linkLabel2); this.panelMain.Controls.Add(this.linkLabel2);
this.panelMain.Controls.Add(this.linkChangeExperience); this.panelMain.Controls.Add(this.linkChangeExperience);
this.panelMain.Controls.Add(this.lblHeader); this.panelMain.Controls.Add(this.lblHeader);
this.panelMain.Controls.Add(this.linkLabel1); this.panelMain.Controls.Add(this.linkLabel1);
this.panelMain.Controls.Add(this.rtbDescription); this.panelMain.Controls.Add(this.rtbDescription);
this.panelMain.Controls.Add(this.treeSettings);
this.panelMain.Controls.Add(this.btnMountRun); this.panelMain.Controls.Add(this.btnMountRun);
this.panelMain.Controls.Add(this.btnTogglePatch); this.panelMain.Controls.Add(this.btnTogglePatch);
this.panelMain.Controls.Add(this.linkGitHub); this.panelMain.Controls.Add(this.linkGitHub);
@@ -207,14 +182,36 @@
this.panelMain.Size = new System.Drawing.Size(943, 592); this.panelMain.Size = new System.Drawing.Size(943, 592);
this.panelMain.TabIndex = 209; this.panelMain.TabIndex = 209;
// //
// treeSettings
//
this.treeSettings.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.treeSettings.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.treeSettings.CheckBoxes = true;
this.treeSettings.Font = new System.Drawing.Font("Segoe UI Variable Text Light", 11.25F);
this.treeSettings.FullRowSelect = true;
this.treeSettings.HotTracking = true;
this.treeSettings.Location = new System.Drawing.Point(36, 168);
this.treeSettings.Name = "treeSettings";
this.treeSettings.ShowLines = false;
this.treeSettings.ShowNodeToolTips = true;
this.treeSettings.ShowPlusMinus = false;
this.treeSettings.Size = new System.Drawing.Size(865, 172);
this.treeSettings.TabIndex = 210;
this.treeSettings.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeSettings_AfterCheck);
this.treeSettings.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeSettings_NodeMouseClick);
//
// checkInstallationMedia // checkInstallationMedia
// //
this.checkInstallationMedia.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.checkInstallationMedia.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.checkInstallationMedia.AutoSize = true; this.checkInstallationMedia.AutoSize = true;
this.checkInstallationMedia.Cursor = System.Windows.Forms.Cursors.Hand;
this.checkInstallationMedia.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.checkInstallationMedia.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.checkInstallationMedia.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.checkInstallationMedia.Location = new System.Drawing.Point(34, 528); this.checkInstallationMedia.Location = new System.Drawing.Point(34, 527);
this.checkInstallationMedia.Name = "checkInstallationMedia"; this.checkInstallationMedia.Name = "checkInstallationMedia";
this.checkInstallationMedia.Size = new System.Drawing.Size(245, 17); this.checkInstallationMedia.Size = new System.Drawing.Size(249, 18);
this.checkInstallationMedia.TabIndex = 209; this.checkInstallationMedia.TabIndex = 209;
this.checkInstallationMedia.Text = "I want to create Windows 11 installation media"; this.checkInstallationMedia.Text = "I want to create Windows 11 installation media";
this.checkInstallationMedia.UseVisualStyleBackColor = true; this.checkInstallationMedia.UseVisualStyleBackColor = true;
@@ -255,7 +252,8 @@
this.Controls.Add(this.panelForm); this.Controls.Add(this.panelForm);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "MainForm"; this.Name = "MainForm";
this.Text = "Flyby11"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Flyby11 Upgrading Assistant";
this.Load += new System.EventHandler(this.MainForm_Load); this.Load += new System.EventHandler(this.MainForm_Load);
this.panelMain.ResumeLayout(false); this.panelMain.ResumeLayout(false);
this.panelMain.PerformLayout(); this.panelMain.PerformLayout();
@@ -265,8 +263,6 @@
} }
#endregion #endregion
private System.Windows.Forms.TreeView treeSettings;
public System.Windows.Forms.RichTextBox rtbDescription; public System.Windows.Forms.RichTextBox rtbDescription;
private System.Windows.Forms.Button btnTogglePatch; private System.Windows.Forms.Button btnTogglePatch;
private System.Windows.Forms.LinkLabel linkGitHub; private System.Windows.Forms.LinkLabel linkGitHub;
@@ -278,6 +274,7 @@
private System.Windows.Forms.LinkLabel linkChangeExperience; private System.Windows.Forms.LinkLabel linkChangeExperience;
private System.Windows.Forms.Panel panelForm; private System.Windows.Forms.Panel panelForm;
private System.Windows.Forms.CheckBox checkInstallationMedia; private System.Windows.Forms.CheckBox checkInstallationMedia;
private System.Windows.Forms.TreeView treeSettings;
} }
} }
+89 -48
View File
@@ -25,6 +25,8 @@ namespace FlybyScript
// Set the default view to the main panel // Set the default view to the main panel
SwitchView.DefaultView = panelMain; SwitchView.DefaultView = panelMain;
// Subscribe to the AfterSelect event for importing plugins
treeSettings.AfterSelect += TreeSettings_AfterSelect;
} }
private async void MainForm_Load(object sender, EventArgs e) private async void MainForm_Load(object sender, EventArgs e)
@@ -34,21 +36,57 @@ namespace FlybyScript
treeSettings.Nodes.Add(nativePatcherNode); treeSettings.Nodes.Add(nativePatcherNode);
// Add Method 1 as a child of NativePatcher // Add Method 1 as a child of NativePatcher
TreeNode method1Node = new TreeNode("(Method 1) Inplace Upgrade via Server Setup"); TreeNode method1Node = new TreeNode("(Method 1) Inplace Upgrade via Server Setup")
method1Node.Tag = "Method1"; {
Tag = "Method1",
BackColor = Color.LightBlue
};
nativePatcherNode.Nodes.Add(method1Node); nativePatcherNode.Nodes.Add(method1Node);
// Add ScriptPatcher parent node // Load plugins
await ScriptPatcher.LoadPlugins("upgraider", treeSettings.Nodes, logger); await ScriptPatcher.LoadPlugins("upgraider", treeSettings.Nodes, logger);
// Add PSPatcher parent node (for Dependencies) // Load PowerShell plugins
PSPatcher = new PSPatcher(); PSPatcher = new PSPatcher();
PSPatcher.LoadPowerShellPlugins(treeSettings); PSPatcher.LoadPowerShellPlugins(treeSettings);
// Add the Import node at the end
TreeNode importNode = new TreeNode("Import [...]")
{
NodeFont = new Font(treeSettings.Font, FontStyle.Italic),
Checked = false,
ForeColor = Color.Black
};
treeSettings.Nodes.Add(importNode);
// Expand all nodes // Expand all nodes
ExpandAllNodes(treeSettings.Nodes); ExpandAllNodes(treeSettings.Nodes);
} }
private void TreeSettings_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node.Text == "Import [...]")
{
OpenPluginsForm();
}
}
private void OpenPluginsForm()
{
var pluginsForm = new PluginsForm(this);
pluginsForm.ShowDialog();
}
// Refresh the tree view
public void RefreshTreeView()
{
treeSettings.Nodes.Clear();
// Reload
MainForm_Load(this, EventArgs.Empty);
}
// Expand all nodes
private void ExpandAllNodes(TreeNodeCollection nodes) private void ExpandAllNodes(TreeNodeCollection nodes)
{ {
foreach (TreeNode node in nodes) foreach (TreeNode node in nodes)
@@ -58,49 +96,12 @@ namespace FlybyScript
} }
} }
private void treeSettings_AfterCheck(object sender, TreeViewEventArgs e)
{
// Check if the node's checked status has changed
if (e.Node.Checked)
{
// Add the node and set its status to true (enabled)
pendingChanges[e.Node] = true;
e.Node.BackColor = Color.LightGreen; // Mark the node as active
// Check the type of node (either JSONPluginLoader/Patch or PowerShell script)
if (e.Node.Tag is ScriptPatcher jsonPlugin)
{
logger.Log($"Patch activated: {jsonPlugin.PlugID}", Color.Black);
}
else if (e.Node.Tag is string psScriptPath)
{
logger.Log($"PowerShell script activated: {Path.GetFileName(psScriptPath)}", Color.Black);
}
}
else
{
// Add the node and set its status to false (disabled)
pendingChanges[e.Node] = false;
e.Node.BackColor = Color.LightGray; // Mark the node as inactive
// Check the type of node again (either JSONPluginLoader or PowerShell script)
if (e.Node.Tag is ScriptPatcher jsonPlugin)
{
logger.Log($"Patch deactivated: {jsonPlugin.PlugID}", Color.Crimson);
}
else if (e.Node.Tag is string psScriptPath)
{
logger.Log($"PowerShell script deactivated: {Path.GetFileName(psScriptPath)}", Color.Crimson);
}
}
}
private async void btnTogglePatch_Click(object sender, EventArgs e) private async void btnTogglePatch_Click(object sender, EventArgs e)
{ {
btnTogglePatch.Enabled = false; btnTogglePatch.Enabled = false;
foreach (var entry in pendingChanges) foreach (var entry in pendingChanges)
{ {
var node = entry.Key; // So, The TreeNode var node = entry.Key; // The TreeNode
bool shouldApply = entry.Value; // Whether this patch should be applied (true) or undone (false) bool shouldApply = entry.Value; // Whether this patch should be applied (true) or undone (false)
// Check if the entry is Method2 and if the patch is enabled // Check if the entry is Method2 and if the patch is enabled
@@ -161,6 +162,49 @@ namespace FlybyScript
btnTogglePatch.Enabled = true; btnTogglePatch.Enabled = true;
} }
private void treeSettings_AfterCheck(object sender, TreeViewEventArgs e)
{
// Check if the node's checked status has changed
if (e.Node.Checked)
{
// Add the node and set its status to true (enabled)
pendingChanges[e.Node] = true;
e.Node.BackColor = Color.LightGreen; // Mark the node as active
// Check the type of node (either JSONPluginLoader/Patch or PowerShell script)
if (e.Node.Tag is ScriptPatcher jsonPlugin)
{
logger.Log($"Patch activated: {jsonPlugin.PlugID}", Color.Black);
}
else if (e.Node.Tag is string psScriptPath)
{
logger.Log($"PowerShell script activated: {Path.GetFileName(psScriptPath)}", Color.Black);
}
}
else
{
// Add the node and set its status to false (disabled)
pendingChanges[e.Node] = false;
e.Node.BackColor = Color.LightGray; // Mark the node as inactive
// Check the type of node again (either JSONPluginLoader or PowerShell script)
if (e.Node.Tag is ScriptPatcher jsonPlugin)
{
logger.Log($"Patch deactivated: {jsonPlugin.PlugID}", Color.Crimson);
}
else if (e.Node.Tag is string psScriptPath)
{
logger.Log($"PowerShell script deactivated: {Path.GetFileName(psScriptPath)}", Color.Crimson);
}
}
// Synchronize parent-child node states, so when a child node is checked or unchecked, its parent node automatically reflects this change
if (e.Node.Parent != null)
{
e.Node.Parent.Checked = e.Node.Checked;
}
}
private void treeSettings_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) private void treeSettings_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{ {
TreeNode node = treeSettings.GetNodeAt(e.Location); TreeNode node = treeSettings.GetNodeAt(e.Location);
@@ -186,15 +230,14 @@ namespace FlybyScript
string pluginInfo = $"ID: {plugin.PlugID}\nHow-to:\n{plugin.PlugInfo}"; string pluginInfo = $"ID: {plugin.PlugID}\nHow-to:\n{plugin.PlugInfo}";
rtbDescription.Text = pluginInfo; rtbDescription.Text = pluginInfo;
} }
else if (node.Tag is string psScriptPath) // Handle PowerShell script description else if (node.Tag is string psScriptPath) // Handle PowerShell script description
{ {
rtbDescription.Clear(); rtbDescription.Clear();
string scriptInfo = $"PowerShell Script: {Path.GetFileName(psScriptPath)}\nPath: {psScriptPath}"; string scriptInfo = $"PowerShell Script: {Path.GetFileName(psScriptPath)}\nPath: {psScriptPath}";
rtbDescription.Text = scriptInfo; rtbDescription.Text = scriptInfo;
} }
else else // Clear description if no node is hovered
{ {
// Clear description if no node is hovered
rtbDescription.Clear(); rtbDescription.Clear();
} }
} }
@@ -213,7 +256,7 @@ namespace FlybyScript
private void linkChangeExperience_Paint(object sender, PaintEventArgs e) private void linkChangeExperience_Paint(object sender, PaintEventArgs e)
{ {
// Linkoption gains focus so trigger a vivid focus rectangle // Linkoption gains focus, so trigger a vivid focus rectangle
ControlPaint.DrawFocusRectangle(e.Graphics, linkChangeExperience.ClientRectangle); ControlPaint.DrawFocusRectangle(e.Graphics, linkChangeExperience.ClientRectangle);
} }
@@ -229,7 +272,5 @@ namespace FlybyScript
MediaView installMediaView = new MediaView(); MediaView installMediaView = new MediaView();
SwitchView.SetView(installMediaView, panelForm); SwitchView.SetView(installMediaView, panelForm);
} }
} }
} }
+24 -609
View File
@@ -120,615 +120,30 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
AAABAAEAXl4AAAEAIACgjgAAFgAAACgAAABeAAAAvAAAAAEAIAAAAAAAEIoAABMLAAATCwAAAAAAAAAA AAABAAEAAAAAAAEAIABeBQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAEAAAABAAgGAAAAXHKoZgAAAAFv
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ck5UAc+id5oAAAUYSURBVHja7dwxSsNQAMfhgJObbp7AE/QOgmKrYCk4ODg4CgXBWhGxi4jg4Kg36KCD
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA DQrSRVwERw/h6A1q3uYamtr3wveH35gML823NVlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZma13kZvtNw6
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA zTtKp2Y/b5R9zuEaZ5dW4d2cOQDhh1E0UTpt9kd3ZZ9zuMbZJVcDAAIAAP4PgM5grAjbPnupDIBwL2ca
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Z3MH4Pr5RxF2cPtZGQDhXs40zgAgAAAAAAIAAAAgAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAQAAABAAAAAAAUAAEAAE
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAFAABAABAABQAAQAAQAAUAAEAAEAAFAABAABAABQAAQAAQAAUAAEAAEAAFAABAABAABQAAQAAQAAABA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAQAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIAAAAgAAAAAAKAACAACAACgAAgAAgAAoAAIAAIAAKAACAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA CAACgAAgAAgAAoAAIAAIAAKAACAACAACgAAgAAgAAoAAIAAIAAAAgAAAAAAIAAAAgAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJwpAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAEAAAAQAAAAAAHAQwCAACAACAACgAAgAAgAAoAAIAAIAAKAACAACAACgOoAwN7VuyJs5+K1MgDCvZxp
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA nM0dAMXftAAomQAgAABghls/Gq0UP45jpVOr/7RW9jmHa5xdWoV3MzMzMzMzMzMzMzMzMzMzMzMzMzMz
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA MzMzM/u7rV6+2jwZjZVU3bLPOVzj3NIqvJszB8Dfgf0dWL4H4LABIADkk8P7L0XY7uVbZQCEeznTOPNR
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA UPkoqI+CAkAAAAAABAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAIAAAAAACAAAAIAAIAAKAACAACAACgAAgAAgAAoAAIAAI
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAKAACAACAACgAAgAAgAAoAAIAAIAAKAACAACAACgAAgAAgAAoAAAAAACAAAAIAAAAAACAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAABAAAAEAAAAAABAAAAEAAEAAEAAFAABAABAABQAAQAAQAAUAAEAAEAAFAABAABAABQAAQAAQAAUAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA EAAEAAFAABAABAABQAAQAAQAAQAAABAAAAAAAQAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAzBQAAACAAAAAAAgAAACAAeAgAEAAE
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAFAABAABAABQAAQAAQAAUAAEAAEAAFAAFAdABg8fCvC9m8+KgMg3MuZxtncAVD8TQuAkgkAAgAAACAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AGAWa7eHC63zxyWlU7s7XCz9nItrnF1iz7l4NzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM6v1fgFi3pGw
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA zf9AVwAAAABJRU5ErkJggg==
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAr5J1AP+PGAD/7csA//W3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+h0AKGWcQAAAAAA58qHAP/y6QD2+mIA+v6gAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9WOAP/sagDLuXgB+uCRA//y
rwP+u34D8PSDAPD/tgD45ZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//usAP/z
qAD46ooC//+XAPnulwD/+5wA/+6cALA3UwDy0KsA+NmnAP/osQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA/7+qAP/qtgD92JUE8t2CAOnKhBn23oyO+N+NvPbekH3lto0J5aiPAPTXkwH+7H8AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/+mOAP//sQD98ZkD9deCAOvMgSv55pLV/uyW//3kkf/97JX//euVi/j5
mgD7uXwC//+fAP6ehwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADx150Ar8UPAKCdYgD/344E8dyHAOzPgTX65JDk/uiT//zh
jvn84Iz5/OOM/v/qkPP+5Y8p/+qSAP/soAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD17NwA2aqOAJBWAAD/95ED8t6KAOzQ
g0X65I/u/ueT//zhjfv94o3//eGM//zfiPv95Yv//u6Rcf/zjgD+86IC/f+5AP//sgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2y5kA6OfcANzB
jQD/7YYD9uiRAO3SglP65I/2/uWT//zhjvv84oz//OGL/v3hiv/834f8/eSJ//7ojMS4y8cB////APP/
aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD32IAA67BjAOHEgQH//8sD//SSAO7SgmD65I/8/uSS//zijvv84o3//eGL/vzgif794If+/OCG/vze
g//954r3/e+TNv3+nwD+5I0C/tKBAP/QfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD85GcA8NJjAOSvSgH//7EB//yUAPHWg2795pD//uWT//3ij/z94o3//eKL/vzh
iv/94If//N+F/vzghP/63oH7/uaG//3liIb+5oYA/cZzBP7//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+o0A+/ODAOzWfwL//6AB//+mAPHXhHv96JL//uWS/v3i
jvz9447//OGL/v3hif/84Ij+/OCG/vzghP7834L/+96A+/zdf//96IfM//OfC/8A/wD+95YBAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAA/wBtAPL3ZADW/9sA1NaSB/m3U8/3lTr/4ok0+9iKMPzZfiT734wr+uWaMfrppTn87K4///G8
Tf/71Wr//umF//70lv/+85v//uuW/f32q///9rT//+yf+/7mkv/+5Y/+/+SN/v7ki/7944r//uKI//7i
hv/94YP//eCB//zfgP/9333//d57//zdeP/73Hf//Nx0//vbcv/82nH++9pu/vvZbP762Gv7/d1t//3i
cK3/71IA/8lpA/rldAD+r3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/6FYAP+hVQD6t2AB7NhzAPPafhj3slHp9po9/+9+Lf7khTL/2Icu/9p7
I//fiCn+45Iu/uWaM/3ooTf87rNE+/nOYPv/4H38/+mO/f/tlf7+8J/8/vSy/f7xqf//6Zb+/uSN/v/k
jP/+44n+/eOI//3ihf/+4YP//eCB//3gf//8337//d97//3eef/83Xf/+9x1//zbcv/72nD//Npu//vZ
bP/62Gr++tdo/fvaaP/+5W7n/NxsKPzVdgD93m4C//8uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/VfQD/1n4A+sxsAfnMYgD40W0y+bNP/PWd
QP/xiTL+7nQo/+GCMP7Xgiv+2ngh/t6DJv7ijSr+5ZUv/+ecM//vtUT/+tJh///he//+6In+/+qM///w
nv/+9K/+/+2f//7mj/7/44r+/uKI//7ihv/94oP//eGC//7ggP/9337//N97//3eef/93Xf//Nx1//vc
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
HP/efSD/4YUk/+OKJv/spTP/+stQ//7fbP/+5Xj//uh////wm//+7Jb//+SC//7ge//94Hn//t53//3e
dP/83XL//dxv//3cbf/822v/+9lo//vZZf/82GP/+9dg//rWXv/71Vv++9RY//rUVv761FX++9RU//7e
V/f73Vk//9xaAPjbWAPh21UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP+1TQD2ymUC6OSIAPLTcSH9w1vi+LZO//ixSf33q0P+9aE6//SVM//xiC3/730o/+1z
JP/raCD/6GQg/9t3KP/UcR//2XAb/959IP/hhCL/5Ism/++sNf/80VP//+Fu//7ldf/+6oT///Cb//7p
iv//4nv//t92//3edf/+3XL//d1v//zcbf/922r//Npo//vZZv/82GP/+9hh//zXXv/71lv/+tRZ//vU
Vv7601T++tNS/vvUUvr92VH//NlTiPrSRgD93j8E+daBAP//JwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/ykUA9sdjA+7IeADzxmc+/Mdc8vm4T//4tEv9965E/vam
Pf71mzb/848v//GDKv/veSb/7HEj/+tlH//nYx//2XQn/9RvHv/ZcBv/3n0g/+GDIv/kjCX/8rI4//3V
V///4m3//uVz///si//+7pT//+Z///7fdf/93nL//d1w//3cbf/822v//dto//zaZf/72WP/+9hh//zX
Xv/71lz/+9ZZ//rUVv/701T/+tNS/vrST//60k77+9RN//7eUc3001ES7LVDAPrUUAH//1wAAAAAAAAA
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
X//82Vz//NhZ//zXVv/71lT/+9VR//zUTv/700z/+9FJ//rRRv/60ET/+s5B//nNP/76zj7/+s48+/3T
O//80zyp/881AP3gPgP33nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5bx0AOOt
gQDjuWwD16xVAOi/aSvzwl7z971X/va6VP33uVD/9rZL/vazR//1r0L/9ak8//SjN//znDL/8pUu//GN
Kv/whSX/7nwj/+1zIP/rax3/6GQb/+VYGP/fWhz/0mcf/9BhFv/ZbRj/3Xcb/+GCHv/ysC///9dL//7h
XP/+53L//+p7///gZv/92Vz//Nla//zXVv/81lT/+9VR//vUT//800z/+9NJ//rRR//70EP/+s9B//nO
P/75zTz++sw6/vrNOf37zTf//dY55PjUPyLz3S8A+dM+AvzGWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAz75VAKmMJACwTxIA//+3Av//hADpvGSa8MZi/+2+V/vzu1P/9bhQ/va2Tf71tEj/9q9D//Wr
Pf/1pjn/8580//KZL//xkyv/8Ysn/++CJP/teiH/7HEe/+ppHP/nYRr/5VUX/99YG//QZB7/0F8V/9ls
GP/cdhr/4oUe//a6Mv//203//uFd//7pdP//53D//ttc//3XV//911T//NZS//vVTv/81Ev//NNJ//vS
R//60ET/+89B//rPPv/5zTz/+s05//nLN/76zDb++sw0+/3SNP/60DZk+84tAPzTLAT/9gAA/vwpAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA8M1RALyhWwC+lVAB//+0Af//rQDhs2R289F4//DMbP3qw17+7L9X//C6
UP70t0z/9rRJ//WxRP/1rT//9Kg6//SjNv/ynDL/8ZYt//GQKf/wiSX/74Ei/+14IP/qcB3/6Gca/+Zf
Gf/kVBb/3Vca/89iG//QXhP/2WwX/9xzGf/lix//+cI1///cTP/+4mD//uhy///iY//92FX//NZR//zV
Tv/71Uz//NNI//zSRv/70UT/+tBB//vPPv/6zjv/+c05//rLN/76yzX/+csz//rLMfr7zC///dMysPLr
ewL//2EB+sYuAP/+VwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyJ5lANWiQADDlU4B////Af//2QDfsGF89t2K///s
mf7734f99NFz/+3FYf7qv1b/7bpO/vG1Sf/1sUX/9a5B//OpPf/zpDj/858z//KaL//xlCv/8I4n/++H
JP/ufyL/7Hce/+puG//oZBj/5V0X/+JRFf/cVRn/zl4b/89cEv/Yahb/23IX/+iTIP/7yTf//91O//7k
Zf//52v//t1X//3WTv/81Uz/+9RJ//zTRv/80kT/+9FB//rPPv/7zjv/+s05//nMNv/6yjT/+coy/vrK
MP/5yS/9+8ws//7RLe/3yjEq+8IqAP7UJAL//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmohoAK2GUwC8hjgCJgAAAP//
/wDis2WI+OCO///xof3+65r9/+uX//7ljv752X3/8Mpn/uq/V//quU3/7rNG//OuQv/0qz//86c6//Oi
Nf/ynDH/8Zct//CRKf/viyb/74Uj/+5+IP/rdRz/6mwa/+diGP/kWhf/4k8U/9pUGf/MXBn/z1sR/9hq
Ff/bcxf/65sh//3ROv//3lH//uVm//7jX//92E7//NVI//zURv/70kP//NFB//vQPv/6zzv/+844//rM
Nv/5yzT/+soy//nJL/75yC3++sos//rHKfv8yyj//tMtbv/dLQD/vBAD/rAAAP+1AAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5xrAMOn
cgDGm10DYwAAAP///wDluGmW++ST///xovv+65v9/uuZ//7rl/7/6pX//+mQ/v3hhP/20nD/7cNb/+i4
Tf/rskT/8Kw///OoO//yozj/8aA0//GZL//xlCv/8I8o/++KJf/uhCH/7Xwe/+tzG//pahn/5mAX/+NY
Ff/gTRP/2FIY/8tZF//PWhH/12kU/9x0Fv/vpiT//9U8//7fVf/+5WL//t5S//3UR//800P/+9JB//zR
Pv/80Dv/+844//vNNv/6zDT/+csx//rJL//5yC3/+ccq/vrIKf/5xyb8/Mwk//3OJsLDp0YC/88AAN//
bAD/RA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA3a5pAMOhXADRoFoDrDIAAA0AAATpvG2j/eiX///xovz+65v+/+yZ///smP7+65b//uqT/v7q
kf//6o///+aI//vbef/yy2P/6btP/+iyQ//sqjz/8aQ5//KgNf/xnDH/8Jct//CSKv/vjSf/7ogi/+6C
H//sexz/6nIa/+hoGP/kXxX/4VYU/95LEf/WUBj/yVcW/85ZD//XZxP/3XYV//OwJv//2ED//uBY///j
Wf/+2Uj//NJA//vRPv/80Dv/+885//rONv/7zDT/+ssx//nKLv/6ySz/+ccq//jGKP75xyb++sgk/vnF
If/9zCH3+9IrNP3cNwD8yR0C/70CAP+7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA5rBbAP7ObQDUrVoDwWkpAHwmAAzov3Cy/uyb///xo/r+7Jv+/+2b//7s
mf7/7Jb//uuV/v/rkv//6pD//umO//7pjP//6In//uKA//jVbf/uwlb/57JF/+epO//tojb/8J0z//CZ
MP/vlCz/748o/++LJP/uhiH/7YAe/+t5G//qcRn/52cW/+RdFP/gVRP/3UkR/9ROF//IVBT/zlgO/9Zl
Ev/fexb/97oo///aRP/+4Fb//99N//3UPv/80Tv//NA4//vONv/6zTP/+8ww//rLLv/5ySz/+sgq//nG
KP/4xSX/+cUj/vrGIf/4xB/8/csf//vLIoX6xSEA+cscA/HeAAD/8wMAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9aAAP/XfgDuumgEw3YtAKlSFxTow3PB/u+e///x
pPr+7Jz+/+6c//7tmv7+7Jf//+yW/v/rlP//65H//uqP///pjf/+6Yr//uiI///ohv//5oH//d52//TM
YP/quEr/5ak7/+mgM//umjH/75Yu/+6RKv/ujSf/7okj/+2EIP/sfx3/63gb/+lwGP/nZhX/41wT/99S
Ev/bRhD/0k0W/8dSEv/OVw3/1mMR/+ODF//6xCz//9tG//7gT//+20L//dE5//vPNf/8zjP/+8ww//vL
Lf/6yiv/+ckp//rHJ//5xST/+MQi/vjEIP76xSD++cQf/PvFHv/8yyHM9M44CwAAAAD61CgBAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+fD0A3aZgAO29bwDdqmAE0Y0/ALht
KB/qxXbN//Gh///xpPr+7Z3//+6d/v7tm///7Zn+/+yW/v/slP//65L//+uQ///qjf/+6ov//umI///p
hv/+6IP//ueB///nf//+43n/+tdq//DCUv/mrT7/5J8z/+mWL//tki3/7Y8p/+2LJv/thiL/7IIf/+x9
HP/qdxn/6W4W/+ZlFP/jWhP/3lAR/9lFEP/QSxX/xk8R/81WDf/WYhD/5o0Y//3LMP//20j//t5G//7V
OP/8zjL/+84w//vLLf/7yiv/+skp//nIJv/6xiT/+cUi//jDIP/5wx//+cQg/vnDH/74xB79/csg+vjF
JEX2vyYA+b8hA+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxYlKAP//
xgDltGgE3qFUAMF3MijryHnZ//Oj///xpfr+7p7//++e/v7um/7/7pr+/u6Y///tlf//7JP//+yQ///r
jv//64z//+qK///ph//+6YX//+iC//7nf//+5n3//uZ7///leP/932//9s5b/+u3Rf/joTT/5ZQt/+qP
Kv/tiij/64gl/+uEIf/rgB//6nsc/+l1GP/obhb/5mQT/+JZEv/dThD/10QP/85KFP/ETQ//zVUM/9Zj
EP/smRv//9I0///bQ//+2jv//dAx//vMLf/7yyv/+8oo//vJJv/6xyP/+sUh//nEIP/5wh//+MIg/vjD
IP74wx/++MIe+vrEHv/8yyOM/cQMAP29BQP452cA/rsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACKZjcAQxcAAAAAAADuxnYE5KRQAMWFPjXty3zi//Sm//7xpPr+76D///Ce/v7unP7/75r//u6Y///t
lv//7ZT//+yR///sj///643//+uL///qiP//6Yb//+mE//7ogP/+533//+d7//7mef/+5Xb//+V0///j
cP/82WP/8sRP/+apOf/hlS3/5osp/+qHJ//qhST/6oIh/+p9Hv/qeRv/6XMX/+dsFf/lZBP/4VgQ/9xN
D//WQg7/zEcU/8NLDv/NVAv/12YQ//CmHv//1DX//to8//7WMv/8zCr/+sso//vJJf/6yCL/+sYh//nF
IP/5xB//+MIg//fCH//4wh/++cMf//fBHvz5xR7//soh1vC5JhDzrS0A+r0oAfzZAwAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zHkD3bNgAMqLQkLuzn/s//Wn//7xpfr+8KH///Cg/v7v
nv//75v+/+6Z/v/ul///7Zb//+2T///skP//647//+uM///rif//6of//+mE///pgv//6H///ud8//7n
ev/+5nf//+V0//7kcv/+42///+Ns//7gZv/50Vf/7LdB/+GbL//hiif/5oQm/+mCI//pfyD/6Hod/+h2
Gv/ochf/52wU/+VjEv/gWBD/2ksO/9NADv/JRRL/wUkM/8xSCv/abBH/9LIh///WM//+2DT//tAq//vJ
Jf/6ySL/+scg//rGH//5xR//+cMg//jCIP/3wR//+MEg/vjCH//3wR7+98Ae/PnEHv/5ySZI98UjAPnW
EwL/2AAA/84AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3MCUAAAAAADx14cD98tyAM+SSU/w0oT0//aq///y
pfr+8KL///Gh/v7wnv7/8J3+/++a///vmP//7pb//+2U///ukv//7I7//+yM///riv//64j//+qE///p
gv//6YD//+h9///nev//53j//+Z1//7lc///5G///uNs//7jav/+4mf//+Fk//3bW//0xkn/5qg1/9+N
J//igST/538j/+h8H//neB3/53Qa/+dvF//mahT/42IS/99XD//YSg3/0j4N/8ZDEv/ASAz/zFIL/952
E//5vCP//9Uv//7VKv/8yyL/+scg//rGIP/6xSD/+cQg//jDH//4wiD/98Ef//fAH//4wR/++MEf//a/
Hvv8xx7/+8kinP/WGQD/qAwC8fcAANn/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD//7oB8ct0ANid
UV3z2Ir7//es//7xpvv+8aP///Ki/v7wn///8Z3//vCc/v/wmf//75f//+6V///uk///7ZD//+2N///s
i///7In//+uG///rg///6oD//+l9///oe///53n//+d2///mc///5XD//uVt///kav/+42f//uJk//7g
Yf//4F7//99a//vUT//vuT3/4Zcr/96CI//jeyH/5nkg/+V2Hf/lcRn/5W0X/+RoFP/iYBH/3lYP/9hJ
Df/PPQ7/w0IS/79IC//MUw3/4YAW//zEJP//0yr//dEj//vHH//6xiD/+sUg//nEH//4wx//98Eg//fA
H//2vx/+98Af/vfAH//2vx79+L8d//nCH+XyyS8W//9oAOCvHAG4iQAAu40AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqpYAMHm
iADeu3MC77lpAN2nWk333o/7//mu//7ypvv+8qX///Gi/v7yof//8Z/+//Cc///wmv//75n//++W///v
lP//7pH//+2P///tjP//7Ir//+yH///rhf//6oL//+p////pe///6Xn//+d3///mdP//5nD//+Vt///k
a///5Gj//uNk//7iYf//4V7//uBa//7fV///31X//ttP//fJQ//opzH/3Icj/954H//jdh7/5HMc/+Nv
Gv/jaxf/42YU/+FgEv/dVhD/1kkN/8w9Dv/AQRL/vUYM/8tUD//mjxr//con///SJ//9zCD/+sYf//nF
IP/5wyD/+MIf//fBH//3wB//9r8f//e/H/72vx/+974e/vW8Hf38xR//+MQjX/nGJQD2xB0D7rECAO+0
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADpxW4A//+9A///zgD54pOz/ves//7yqPn/8qX///Kk/v7yov7+8p/+//Ge//7x
nP7/8Jn///CW///wlP//75L//+6Q///ujf//7Yr//+yI///shf//64P//+qA///qff//6Xn//+h3///o
df//53L//+Zv///la///5Gj//+Nl///jYv//4l///uBb///fWP/+31T//t5Q//7dTv//3Ev//NVF//G7
N//hlCf/23oe/99yHf/icRv/4W0Z/+FpFv/hZRT/4F8S/9tWEf/USQ//yj4P/7xAEv+6RQz/zFoR/+ud
Hv/+zCf//s8l//vHIP/5xB//+MMg//jCH//3wB7/9r8e//a+Hv/2vR7/9r4f/va9Hv/1vR37+b8d//zD
IKr/sQAA/7sAA/nIMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/vewAP/9swP//bAA//mxqf72q//+8qX1/vGk/f/z
ov7/86H///Ke//7ynP7+8Zr+//CY//7wlf7/75P+/++R///vj///7oz//+2I///thf//7IT//+uB///q
fv//6nv//+l4///odv//6HL//+dv///mbf//5Wn//+Vl///kYv//417//+Jc///gWf/+4FX//t9S//7e
Tv/+3Ur//ttI///bRf//2kH/+cs5/+moLP/bgiD/2nAb/99uGv/gaxj/4GcW/99jFf/eXxT/2lcT/9JJ
EP/HPRH/uT8S/7lFDf/QYhX/8Kkh//7NJv/9zCL/+cQg//jDH//4wR//98Af//e/H//2vR7/9bwf/va+
H//1vR7+9bwd/fa8Hf/9xR/m8b4kKO7HMAD3xCMC+nEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+VAP75hwD++K0C/fi1AP76
tkP++7T0/vSm//71pf/+8qD7/vCd/P7xnP3/8pv///GY//7xlv7+8JT+/++S/v7vj/7/743+/u6L///t
h/7/7IT//+yC///sf///63z//+p5///qdv//6XP//+dw///nbf//5mn//+Vn///kY///5GD//+Nc///i
Wf//4Vb//+BS///fT//+3kv//91H//7cRf/+2kH//tk+///ZO//+1Tj/87wv/+GSI//Xchv/22kZ/99p
GP/eZhf/3WIX/9xfFv/YVxX/z0oT/8Q9E/+3PhL/uUYP/9NsGf/0tCT//s0l//vIIP/4wh//+MIf//fA
H//2vh//9r0e//W8Hv/1vB/+9rwe/vW7Hf70uxz6+L4c//nAImb7uxcA+8MPA7YA/wD+3gAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD//wAA4oT/AP71bwH/9KMA/fSoQ//7raP/+6rh/vWj//74ov/+8pv//u+X/P7wlvv/8JX9//CT/v7w
kP//8I7//u+L/v7uiP7+7oX+/+2C//7tgP7/7H3//+t6///qd///6nT//+lw///obv//52r//+dm///l
ZP//5GD//+Rd///jWf//4lb//+FS///gTv//30v//91I//7dRf/+3EH//9o+//7ZOv/+1zj//9Y1///X
Mv/8zS7/66om/9p+Hf/WaBj/22YY/9xmGP/bYxj/2l8Y/9dYF//OSxX/wj4V/7Q9Ev+5RhH/2nkc//i9
JP/9zCP/+cQf//fBH//3vx7/9r4f//W8H//1ux7/9bse//W7Hv71ux3/87kc+/e8Hf/9wyC0vZArBAD/
/wDo2EUA+J4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP74/wD/+IYA//arAvzxnQD/9bIA/uyfG//6qVP/+qal//Wf6f77
oP/+85f//vCT//7xkPr/7oz6/u6K/f/vif//74b//+6D//7tgP7/7H7+/+x7///reP7/6nT//+py///p
bv//6Gr//+dn///mZf//5WH//+Rd///kWf//4lb//+JS///gT///30z//99I///eRf//3EH//9s+//7a
O//+2Tf//9g0//7WMf/+1S7//9Us///UKv/3vyX/4pMe/9RtGf/WYxn/2mUZ/9ljGf/YXxr/1loZ/85N
F//APhb/sTwT/7pJE//fhh//+sMl//zIIv/3wB//9r8f//a+H//1vB//9Lse//S6Hv/0uh7+9bod//O4
Hf71uRz++Lwd9vS/Jyv0wyYA/7kTAemVAADjkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/fAAD99asD//mKA/7r
ngD/96oA///PAP//phf++aBf/vWaq/78m+H+9ZL///KN//7xif/+7IT8/uyB/P7tgP3/7X7+/u17/v/s
eP7+63b+/uty/v/qb/7/6Wz+/+ho///oZf7/5mL//+Ve///lWv//5Ff//+NT///iT///4Ez//+BI///f
RP//3UH//9w+///bO///2jj//9k0//7YMf//1i7//tUs//7TKf/+0ib//9Mj//3NIv/vrCD/2Hwc/9Bj
Gv/WYxv/2GMb/9dgG//VWxv/zU4Z/78/F/+vPBP/vE0W/+aUIf/7xyT/+sMg//a+H//1vR7/9bwe//S6
Hv/0uR//9Lke//S4Hf70uB3/8bYc/Pu+Hf/7wCN4/8MmAOe4FQP/8gwA//8BAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA//PqAP/81AD+9KYB//mWA///fwH//80A/v+jAP3rhAD+85cj/vOSYP79lKb/9Yzr/vSH//7z
hP/+7H3//+t5/P/rePv+6nX9/+ty/v/qcP//6mz//+lp/v7oZv7+6GL+/+de///lW/7/5Vf//+RT///j
UP//4k3//+FJ///fQ///30H//94+///cOv//2zf//9k0///YMP//2C7//tYr//7VKP//0yb//tIj//7P
If//zyD//9Eh//jBIf/jlR//0Gsc/9BgHP/WYxz/12Ec/9RcHP/NTxr/vj8Y/646E//AVBf/7KMj//zH
Iv/3vh7/9bwf//W7H//0uh//87ge//O4Hf7zuB3+87cd//G2HPz2uBz/9rkdyvDOfgLJUAAB27YgAJZh
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//nwA//+nAP//fAD/+18A//eWAf7tmwP+9Y0D/v+mAP3u
kQDtkWAB/uyKH//6jGH+9IS1/vSA7P72fv/+7HX//+xy//7pbfr/52v7/+ho/v/pZf//6GL//+de/v7m
W/7+5lf+/+VU///kUP7/4kz//+JJ///hRf//30H//989///eO///3Df//9s0///ZMf//2C3//9cr///V
J//+1ST//tMi//7RIf//0CH//s8g//3NIP/+ziD//c0h//CxIP/XfR7/zGAd/9JhHf/WYh3/01wc/8xP
Gv+9Pxj/qzkT/8VeGf/ysCP/+sQg//W7Hv/0uh//9Lke//O3Hv/ztx7/8rce//K2Hf7ytRz+8LMb//u8
HvX3vCY9/70tAPGwHQPaqwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/4QA//dnAP/q
egD/1JAA//iiAP72lgL+8pEE//+4Af7ofQD//5QA//+eAP/6hiL98Xxt/vN5s//3dun+7G3//+1q///p
ZP7/5WD7/uZd/P/mWv3+5Vf+/+VT///kUP/+40z+/uJJ/v/hRf7+4UH//98+/v/eOv//3Tf//9w0///b
Mf//2S7//9gq///XJ///1ST//9Qi///SIP/+0SD//9Ah//7PIf/+ziH//Mwg//zLIP/+ziH/+cMg/+SZ
H//Oax7/zF0e/9NhHv/TXR3/zFAb/7o+GP+qORP/zGsb//e6Iv/4wB//9Lke//O4Hf/zth7/8rYe//K2
Hf7ytRz+8rQc/vGzG/r2thz/87UgiPu2EAD6rg4E2MVaAPuHAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD+7HgA/8qOAAAAAAAAAAAA+du0AP3ufQD++YIB/uiHAv/rbAH//4oA/f1+APq5
YAD+63Ir//Bwaf71bbb+7GT1/+9i///qW//+5FX//+RR+v7jTvr+4kv9/+JH///iRP/+4EH//uA9/v7f
Ov7/3jb//90z/v/cMP//2y3//9kq///YJ///1yP//9Uh///UIf//0yH//tEh///RIP/+0CH//s4h//3N
IP/8yyD/+8kh//vKIP/9zCD/8rQf/9d/H//JXx7/zl0e/9NeHf/MURv/uT0Y/6o4E//VfB7/+cEi//W5
Hv/zth7/8rYd//K1Hv/ytR3+8rQd/vGzHP/wshz78bIa//q6Hs3utSwR4KVXAPS2KAH/zAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+rAD//6gA/lv/AP7X
ggD/sTYA//F/Af3phQT+v2sD/ulpAP7pbQD+uU4E/vBmJf/0Y3H+61rA/+9X7v7rUf/+5Ur//+RH/v7g
Q/r+3j/8/988/v/fOv//3Tb//t0y/v/cL/7/2y3//top/v/ZJv7/1yL//9Yh/v/VIv/+1CL//9Mh//7R
If//0CD//tAh//7OIP/9zSH//Msg//zLIP/7yCD/+sYf//zJIP/5xCD/5Zwf/8tqH//JWR7/0Fwe/81T
HP+3PBj/rTsU/9+NH//6wSH/8rUe//K1Hv/xtB3/8bMe//GzHf/xshv+8LAc/vGwG/z2tBz/77MiRfK1
HgD3nBYD/wAAAP8xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD/14EA/8lbAP/mhAD/oX0A//+NAP/waAL+7mYD//8wAP7nbgD//2gA/+FaAP/y
Vi3+6E91/u5MuP/rRvP+5UH//uU9///eOP/+3DX8/twx/P/bLv7/2yv+/top///YJv//1yP+/9Yh/v/V
Iv7+1SH//9Qi/v7TIf/+0SH//9Eg//7QIP/+ziD//c0h//zLIP/8yiD/+8kg//rHH//5xSD/+cUf//vI
H//yth//2IMe/8ZcH//LWB7/zVUd/7Y8F/+vQBX/550h//i+H//xsh3/8bMe//CyHv/xsR3+8LEc/vCw
G//urhv687Ab//i3IZT/xw0A/6sAAv+nAAD/sQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6HwA/qGZAP/GPAD/+gAA/v8AAP7Z
YAD++VMB/+JeA//qRAL//FcA/uxNAP/pOAX+5kIx/u1Bcv7pPML/5Tb4/uYz//7dLv//2ir//tkn+v/X
JPv+1yH+/tYh///VIv/+1CL+/tQi/v7TIv7+0iH//9Eh/v7QIP/+zyH//s4h//3MIf/8yyD//Mof//vJ
H//6xyD/+sYg//nEH//4wR//+cUf//nDHv/noB7/zGse/8VVHv/LVR7/tTsX/7VKF//vrCH/9bke//Cv
Hf/wsR7/8LAd/++vHP7wrhv/7q0b/fOuGv/1sh3f57EwEuKiMwD0zRsA//8AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//UAD//3QA//8xAP/SWAD+/0QA/+xWAv7nTQT+/3oA/t89AP/xRgD4yzIE//E2Lv/l
MH7+4izG/uUp8f/cJP/+2SL//9ch/f/TIPv+1CD8/9Qg/v/SIP/+0iD+/9Ah/v7PIf7+ziD+/c4g/v3N
IP/8zCD+/Mog//zJH//7ySD/+scf//nGH//5xB//+MIe//fAHv/2vx//+MMe//K3H//Yhx7/xFsf/8dR
Hv+0Ohj/vlkZ//S1IP/xsh3/768e/++vHf/vrh3/760c/u6sG//sqRr99bAc//a0I1T4uyoA96wYAvur
BwD/qQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//MgD+0VgA//8NAP7YVwD//1EA/upPAP7m
OQL/9EkD6jMAAP/tNQD+5iwA7/8oAf7iJjv/4CN//+Ujwf7aIfz+2iH//9ch//7RH//+0R/7/9Af/P7P
IP7+zyD+/c4g//3MH//8zCD+/Mog/vvJH//7ySD++8gg/vrGH//6xR//+cQf//jCHv/4wR7/978e//W8
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
GP/qmxn16qYlKvG7MgDpmhcB6nQAAOhxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA/7oHAP//PAD/ziMB/M0ZBP3FBgL82SUA/8wkAP/E
IgD/4CgR+rweVfi2HZ39uB7Z9K0c//KrG//upxv/56Ia/eihGvzooRv9558b/uedG//mnBv/5Zka/+SY
Gv7lmBn+5ZgZ/uWZGf/klhj87ZsZ/+qcHnjumxsA4YgUBLuGAACzmwMAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+xAAD/jQgAAAAAAP//
AAD/n/8A69EhAOS2DwL/vRsC////APq9HwDsmRIA9LofG/m2HVL/th6e9asb5fSoHP/woxv/5pwa/+ac
Gvvkmhr645ga/OSXGv7jlRn/4pQa/+OVGf7jlBj/45UY++WVGP/olxrE0emwAv9MAAHpmSgA/zUAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD//wAA9dMAAP9FAADGqgAA/7INAP/HGQH6txsD8bgPA/PCLAD0rxwA/5Y1APnF
HRX+tR5X86cbqPSkHOHyoRv/5pca/+aXGf/hkxn735EZ++CQGf3hkRn/4ZEY/+COGP3ikBf/7Zga8uWX
IDncjiEA5JkaA9S0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyKoAAP+sAgD/qwAA/6QEAP+/
JwD5uyMB9agUA/+gAAH0oCcA/7smAPCNGAD/xSQY8KYcWvOjHKDznhvf6JQZ/+mTGf/gjRj/3IoY/d6M
GPvfjBf83YoW+eKMF//kkh1/6IYMAPGbBwSoWG8A/8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD//wUA/qcAAPygAAD/YwAA+b4SAf2uEwLvpxMD//9mAPOmGwDfVAIA6qkcHfWk
HVT0nRuj55Ea6OqPGf/iiRj/3YgX/9yIF/ffiBb/6Y8axM6MKgv/4/8A7JEuANGJAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+rQAA/6UAAP/QAAD/rwEA//8eAPC8
HQHxjBUE6HcBA/yrJwDxjhkA/3kmAPm2IxTynBxb544ZqOuOGeDliRf/5ogX/+uOG5UAAJoA/7UAAdN+
LAD1pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD/1wAA/KwAAAAAAACsuQQA4gAAAPLFOAD8rB0B1Z4OA/GEAgHuxzAA85kiANpmCADuox4f548ZXeSK
GmTVhiQN14UaANiDHQHOdBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8ogAASAAAAKiuAADs7gAA95IRAfSf
FQPgewoD5ME2AOOFEgDdexIAs99TANxqGQHbYxkA4jANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAC6rAAA7dQAAP5tAAD/sgMA/903AO6ZHALkgxEE4owQBOKNIgHifRoA4oAVAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/cAAA/7AAAAAAAAD/hw0A//9wAAAAAAD/ajMAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA///////////////8///////////////8///////////////8///////////////8////////
///////8///////////////8///////////////8///////////////8/////////h/////8////////
/f/////8////////+gv////8////////9Av////8////////6AX////8////////0AX////8////////
oAP////8///////+QAL////8///////8gAL////8///////5AAF////8///////2AAF////8///////s
AAF////8////x//QAAC////8/////B+gAAC////8////g+BAAAC////8///+gB+AAABf///8////AAAA
AABf///8////AAAAAABf///8///9AAAAAAAv///8///9AAAAAAAv///8///9AAAAAAAf///8///9AAAA
AAAX///8///9AAAAAAAX///8///9AAAAAAAH///8///6AAAAAAAL///8///6AAAAAAAL///8///6AAAA
AAAF///8///6AAAAAAAF///8///6AAAAAAAF///8///6AAAAAAAD///8///4AAAAAAAC///8///0AAAA
AAAC///8///0AAAAAAABf//8///0AAAAAAABf//8///IAAAAAAAAf//8//+QAAAAAAAAv//8//9gAAAA
AAAAv//8//7AAAAAAAAAf//8//0AAAAAAAAAX//8//oAAAAAAAAAX//8//QAAAAAAAAAL//8/+gAAAAA
AAAAL//8/9AAAAAAAAAAL//8/6AAAAAAAAAAF//8/0AAAAAAAAAAF//8/oAAAAAAAAAAF//8/QAAAAAA
AAAAC//8+gAAAAAAAAAAC//8+gAAAAAAAAAAC//8+gAAAAAAAAAABf/8+gAAAAAAAAAABf/8/QAAAAAA
AAAAA//8/sAAAAAAAAAAAv/8/zgAAAAAAAAAAv/8/8cAAAAAAAAAAP/8//jAAAAAAAAAAX/8//8cAAAA
AAAAAX/8///jgAAAAAAAAL/8///8YAAAAAAAAL/8////ngAAAAAAAL/8////8YAAAAAAAH/8/////nAA
AAAAAF/8/////84AAAAAAF/8//////jAAAAAAC/8//////84AAAAAC/8///////HAAAAAC/8///////8
4AAAABf8////////HAAAABf8////////84AAAB/8/////////nAAAAv8/////////44AAAv8////////
//nAAAP8//////////44AAX8///////////HAAX8///////////44AP8////////////HAX8////////
////44X8/////////////Hv8/////////////4f8///////////////8///////////////8////////
///////8///////////////8///////////////8///////////////8///////////////8
</value> </value>
</data> </data>
</root> </root>
+1 -1
View File
@@ -171,7 +171,7 @@ namespace FlybyScript
{ {
existingCategory = new TreeNode(category) existingCategory = new TreeNode(category)
{ {
BackColor = System.Drawing.Color.LightBlue, // BackColor = System.Drawing.Color.LightBlue,
ForeColor = System.Drawing.Color.Black ForeColor = System.Drawing.Color.Black
}; };
pluginCategory.Add(existingCategory); pluginCategory.Add(existingCategory);
+217
View File
@@ -0,0 +1,217 @@
namespace FlybyScript
{
partial class PluginsForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.checkedListBoxPlugins = new System.Windows.Forms.CheckedListBox();
this.textDescription = new System.Windows.Forms.TextBox();
this.btnDownload = new System.Windows.Forms.Button();
this.progressBar = new System.Windows.Forms.ProgressBar();
this.lblHeader = new System.Windows.Forms.Label();
this.btnUninstall = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.btnImport = new System.Windows.Forms.Button();
this.panelBottom = new System.Windows.Forms.Panel();
this.linkPluginsDirectory = new System.Windows.Forms.LinkLabel();
this.panelBottom.SuspendLayout();
this.SuspendLayout();
//
// checkedListBoxPlugins
//
this.checkedListBoxPlugins.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.checkedListBoxPlugins.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240)))));
this.checkedListBoxPlugins.Font = new System.Drawing.Font("Segoe UI Variable Text Light", 10.25F);
this.checkedListBoxPlugins.ForeColor = System.Drawing.Color.Black;
this.checkedListBoxPlugins.FormattingEnabled = true;
this.checkedListBoxPlugins.Location = new System.Drawing.Point(-1, 50);
this.checkedListBoxPlugins.Name = "checkedListBoxPlugins";
this.checkedListBoxPlugins.Size = new System.Drawing.Size(275, 340);
this.checkedListBoxPlugins.TabIndex = 0;
this.checkedListBoxPlugins.ThreeDCheckBoxes = true;
this.checkedListBoxPlugins.SelectedIndexChanged += new System.EventHandler(this.checkedListBoxPlugins_SelectedIndexChanged);
//
// textDescription
//
this.textDescription.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.textDescription.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(252)))), ((int)(((byte)(252)))));
this.textDescription.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.textDescription.Font = new System.Drawing.Font("Segoe UI Variable Small Light", 9.75F);
this.textDescription.Location = new System.Drawing.Point(281, 50);
this.textDescription.Multiline = true;
this.textDescription.Name = "textDescription";
this.textDescription.Size = new System.Drawing.Size(348, 309);
this.textDescription.TabIndex = 1;
//
// btnDownload
//
this.btnDownload.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnDownload.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(221)))), ((int)(((byte)(221)))), ((int)(((byte)(221)))));
this.btnDownload.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
this.btnDownload.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnDownload.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnDownload.ForeColor = System.Drawing.Color.Black;
this.btnDownload.Location = new System.Drawing.Point(536, 9);
this.btnDownload.Name = "btnDownload";
this.btnDownload.Size = new System.Drawing.Size(93, 24);
this.btnDownload.TabIndex = 2;
this.btnDownload.Text = "Install";
this.btnDownload.UseVisualStyleBackColor = false;
this.btnDownload.Click += new System.EventHandler(this.btnDownload_Click);
//
// progressBar
//
this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.progressBar.Location = new System.Drawing.Point(281, 360);
this.progressBar.Name = "progressBar";
this.progressBar.Size = new System.Drawing.Size(348, 23);
this.progressBar.TabIndex = 3;
//
// lblHeader
//
this.lblHeader.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.lblHeader.AutoEllipsis = true;
this.lblHeader.Font = new System.Drawing.Font("Segoe UI Variable Small", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblHeader.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.lblHeader.Location = new System.Drawing.Point(277, 15);
this.lblHeader.Name = "lblHeader";
this.lblHeader.Size = new System.Drawing.Size(356, 30);
this.lblHeader.TabIndex = 206;
this.lblHeader.Text = "Welcome to Plugins Manager";
//
// btnUninstall
//
this.btnUninstall.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnUninstall.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(221)))), ((int)(((byte)(221)))), ((int)(((byte)(221)))));
this.btnUninstall.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
this.btnUninstall.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnUninstall.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnUninstall.Location = new System.Drawing.Point(437, 9);
this.btnUninstall.Name = "btnUninstall";
this.btnUninstall.Size = new System.Drawing.Size(93, 24);
this.btnUninstall.TabIndex = 207;
this.btnUninstall.Text = "Uninstall";
this.btnUninstall.UseVisualStyleBackColor = false;
this.btnUninstall.Click += new System.EventHandler(this.btnUninstall_Click);
//
// label1
//
this.label1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(65)))), ((int)(((byte)(65)))), ((int)(((byte)(65)))));
this.label1.Font = new System.Drawing.Font("Segoe UI Variable Text", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.ForeColor = System.Drawing.Color.White;
this.label1.Location = new System.Drawing.Point(-1, 18);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(100, 33);
this.label1.TabIndex = 208;
this.label1.Text = "Available";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// btnImport
//
this.btnImport.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnImport.Font = new System.Drawing.Font("Segoe UI Variable Text", 9F);
this.btnImport.Location = new System.Drawing.Point(96, 18);
this.btnImport.Name = "btnImport";
this.btnImport.Size = new System.Drawing.Size(100, 33);
this.btnImport.TabIndex = 209;
this.btnImport.Text = "Import";
this.btnImport.UseVisualStyleBackColor = true;
this.btnImport.Click += new System.EventHandler(this.btnImport_Click);
//
// panelBottom
//
this.panelBottom.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(238)))), ((int)(((byte)(238)))), ((int)(((byte)(238)))));
this.panelBottom.Controls.Add(this.linkPluginsDirectory);
this.panelBottom.Controls.Add(this.btnUninstall);
this.panelBottom.Controls.Add(this.btnDownload);
this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panelBottom.Location = new System.Drawing.Point(0, 401);
this.panelBottom.Name = "panelBottom";
this.panelBottom.Size = new System.Drawing.Size(646, 45);
this.panelBottom.TabIndex = 210;
//
// linkPluginsDirectory
//
this.linkPluginsDirectory.ActiveLinkColor = System.Drawing.Color.RoyalBlue;
this.linkPluginsDirectory.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.linkPluginsDirectory.AutoEllipsis = true;
this.linkPluginsDirectory.AutoSize = true;
this.linkPluginsDirectory.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.75F);
this.linkPluginsDirectory.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkPluginsDirectory.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.linkPluginsDirectory.Location = new System.Drawing.Point(12, 17);
this.linkPluginsDirectory.Name = "linkPluginsDirectory";
this.linkPluginsDirectory.Size = new System.Drawing.Size(97, 16);
this.linkPluginsDirectory.TabIndex = 208;
this.linkPluginsDirectory.TabStop = true;
this.linkPluginsDirectory.Text = "Plugins directory";
this.linkPluginsDirectory.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkPluginsDirectory_LinkClicked);
//
// PluginsForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248)))));
this.ClientSize = new System.Drawing.Size(646, 446);
this.Controls.Add(this.panelBottom);
this.Controls.Add(this.btnImport);
this.Controls.Add(this.label1);
this.Controls.Add(this.lblHeader);
this.Controls.Add(this.progressBar);
this.Controls.Add(this.textDescription);
this.Controls.Add(this.checkedListBoxPlugins);
this.Name = "PluginsForm";
this.ShowIcon = false;
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Plugins-Manager";
this.panelBottom.ResumeLayout(false);
this.panelBottom.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.CheckedListBox checkedListBoxPlugins;
private System.Windows.Forms.TextBox textDescription;
private System.Windows.Forms.Button btnDownload;
private System.Windows.Forms.ProgressBar progressBar;
private System.Windows.Forms.Label lblHeader;
private System.Windows.Forms.Button btnUninstall;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button btnImport;
private System.Windows.Forms.Panel panelBottom;
private System.Windows.Forms.LinkLabel linkPluginsDirectory;
}
}
+220
View File
@@ -0,0 +1,220 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace FlybyScript
{
public partial class PluginsForm : Form
{
private const string PluginJsonUrl = "https://raw.githubusercontent.com/builtbybel/Flyby11/main/plugins/plugins_manifest.json";
private const string PluginBaseUrl = "https://github.com/builtbybel/Flyby11/raw/main/plugins/";
// Dictionary to store plugin filenames and descriptions
private Dictionary<string, string> pluginDescriptions;
private readonly string pluginsDirectory = Path.Combine(Application.StartupPath, "upgraider");
private MainForm _mainForm;
public PluginsForm(MainForm mainForm)
{
InitializeComponent();
_mainForm = mainForm;
LoadPlugins();
}
private async void LoadPlugins()
{
try
{
var json = await DownloadJsonAsync(PluginJsonUrl);
pluginDescriptions = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
foreach (var pluginFileName in pluginDescriptions.Keys)
{
// Add each plugin to the CheckedListBox
bool isInstalled = File.Exists(Path.Combine(pluginsDirectory, pluginFileName));
int index = checkedListBoxPlugins.Items.Add(pluginFileName);
// Check the item if the plugin is installed
checkedListBoxPlugins.SetItemChecked(index, isInstalled);
}
}
catch (Exception ex)
{
MessageBox.Show($"Error loading plugins: {ex.Message}");
}
}
private async Task<string> DownloadJsonAsync(string url)
{
using (HttpClient client = new HttpClient())
{
return await client.GetStringAsync(url);
}
}
private void checkedListBoxPlugins_SelectedIndexChanged(object sender, EventArgs e)
{
var selectedPlugin = checkedListBoxPlugins.SelectedItem?.ToString();
if (selectedPlugin != null && pluginDescriptions.ContainsKey(selectedPlugin))
{
textDescription.Text = pluginDescriptions[selectedPlugin];
}
}
private async void btnDownload_Click(object sender, EventArgs e)
{
var selectedPlugins = new List<string>();
foreach (var plugin in checkedListBoxPlugins.CheckedItems)
{
selectedPlugins.Add(plugin.ToString());
}
if (selectedPlugins.Count > 0)
{
await DownloadPluginsAsync(selectedPlugins);
}
else
{
MessageBox.Show("Please select at least one plugin to download.");
}
}
private async Task DownloadPluginsAsync(List<string> plugins)
{
progressBar.Value = 0;
progressBar.Maximum = plugins.Count;
using (HttpClient client = new HttpClient())
{
foreach (var pluginFileName in plugins)
{
try
{
var pluginUrl = $"{PluginBaseUrl}{pluginFileName}";
var downloadPath = Path.Combine(pluginsDirectory, pluginFileName);
var data = await client.GetByteArrayAsync(pluginUrl);
await WriteAllBytesAsync(downloadPath, data);
progressBar.Value += 1;
}
catch (Exception ex)
{
MessageBox.Show($"Failed to download {pluginFileName}: {ex.Message}");
}
}
}
MessageBox.Show("All selected plugins have been downloaded.");
}
private async Task WriteAllBytesAsync(string path, byte[] data)
{
using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, useAsync: true))
{
await fs.WriteAsync(data, 0, data.Length);
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
_mainForm.RefreshTreeView();
}
private void btnUninstall_Click(object sender, EventArgs e)
{
var pluginsToRemove = new List<string>();
foreach (var plugin in checkedListBoxPlugins.CheckedItems)
{
pluginsToRemove.Add(plugin.ToString());
}
foreach (var pluginFileName in pluginsToRemove)
{
try
{
var filePath = Path.Combine("upgraider", pluginFileName);
if (File.Exists(filePath))
{
File.Delete(filePath);
checkedListBoxPlugins.Items.Remove(pluginFileName);
}
}
catch (Exception ex)
{
MessageBox.Show($"Failed to uninstall {pluginFileName}: {ex.Message}");
}
}
MessageBox.Show("Selected plugins have been uninstalled.");
checkedListBoxPlugins.Items.Clear();
LoadPlugins(); // Refresh the list of plugins
}
private void btnImport_Click(object sender, EventArgs e)
{
using (var folderBrowserDialog = new FolderBrowserDialog())
{
// Open the folder browser dialog to select the source directory
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
string sourceDirectory = folderBrowserDialog.SelectedPath;
string[] files = Directory.GetFiles(sourceDirectory, "*.*", SearchOption.TopDirectoryOnly)
.Where(file => file.EndsWith(".json") || file.EndsWith(".ps1")).ToArray();
List<string> importedPlugins = new List<string>(); // List to store imported plugin names
foreach (var file in files)
{
try
{
string fileName = Path.GetFileName(file);
string destinationPath = Path.Combine(pluginsDirectory, fileName);
File.Copy(file, destinationPath, true); // Overwrite if file exists
importedPlugins.Add(fileName); // Add to the imported plugins list
}
catch (Exception ex)
{
MessageBox.Show($"Failed to import {file}: {ex.Message}");
}
}
// Show message box with the names of the imported plugins
if (importedPlugins.Count > 0)
{
string message = "Imported Plugins:\n" + string.Join("\n", importedPlugins);
MessageBox.Show(message, "Import Completed", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("No plugins were imported.", "Import Completed", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
private void linkPluginsDirectory_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
try
{
Process.Start("explorer.exe", pluginsDirectory);
}
catch (Exception ex)
{
MessageBox.Show($"Failed to open plugins directory: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
+120
View File
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+2 -2
View File
@@ -28,5 +28,5 @@ using System.Runtime.InteropServices;
// Buildnummer // Buildnummer
// Revision // Revision
// //
[assembly: AssemblyVersion("0.13.81")] [assembly: AssemblyVersion("0.14.107")]
[assembly: AssemblyFileVersion("0.13.81")] [assembly: AssemblyFileVersion("0.14.107")]
+28 -21
View File
@@ -73,7 +73,7 @@ namespace FlybyScript
/// </summary> /// </summary>
/// <param name="diskNumber">Diskpart Device ID</param> /// <param name="diskNumber">Diskpart Device ID</param>
/// <returns></returns> /// <returns></returns>
public async Task FormatDriveAsync(string diskNumber) public async Task FormatDriveAsync(string diskNumber, string partitionScheme)
{ {
await Task.Run(() => await Task.Run(() =>
{ {
@@ -98,12 +98,20 @@ namespace FlybyScript
UpdateStatusLabel(); // Updates to 1/5 - Format and Boot USB Drive UpdateStatusLabel(); // Updates to 1/5 - Format and Boot USB Drive
// Send commands to DiskPart // Send commands to DiskPart
writer.WriteLine($"select disk {diskNumber}"); // Select the disk based on user input writer.WriteLine($"select disk {diskNumber}"); // Select the disk
UpdateProgress(10); // Update progress UpdateProgress(10); // Update progress
writer.WriteLine("clean"); // Clean the disk writer.WriteLine("clean"); // Clean the disk
writer.WriteLine("convert mbr"); // Convert to MBR // Check partition scheme selection
if (partitionScheme == "GPT")
{
writer.WriteLine("convert gpt"); // Convert to GPT
}
else if (partitionScheme == "MBR")
{
writer.WriteLine("convert mbr"); // Convert to MBR
}
UpdateProgress(20); UpdateProgress(20);
writer.WriteLine("create partition primary"); // Create a new partition writer.WriteLine("create partition primary"); // Create a new partition
@@ -113,14 +121,13 @@ namespace FlybyScript
UpdateProgress(60); UpdateProgress(60);
writer.WriteLine("format fs=fat32 quick label=\"FlybyWin11\""); // Quick format to FAT32 writer.WriteLine("format fs=fat32 quick label=\"FlybyWin11\""); // Quick format to FAT32
// writer.WriteLine("assign letter=W"); // Assign drive letter
writer.WriteLine("exit"); // Exit DiskPart writer.WriteLine("exit"); // Exit DiskPart
UpdateProgress(100); // Final progress UpdateProgress(100); // Final progress
} }
} }
string output = process.StandardOutput.ReadToEnd(); // Get the output from DiskPart string output = process.StandardOutput.ReadToEnd(); // Get the output from DiskPart
process.WaitForExit(); // Wait for the process to exit process.WaitForExit();
_logger.Log($"Formatting completed: {output}", Color.Black); _logger.Log($"Formatting completed: {output}", Color.Black);
} }
} }
@@ -131,6 +138,7 @@ namespace FlybyScript
}); });
} }
/// <summary> /// <summary>
/// Copies the contents of the specified ISO file to the USB drive using Robocopy. /// Copies the contents of the specified ISO file to the USB drive using Robocopy.
/// </summary> /// </summary>
@@ -287,20 +295,18 @@ namespace FlybyScript
} }
/// <summary> /// <summary>
/// Downloads the Microsoft Media Creation Tool from https://go.microsoft.com/fwlink/?linkid=2156295 /// Downloads a specified tool (Media Creation Tool or Installation Assistant) from a provided URL.
/// </summary> /// </summary>
/// <param name="downloadUrl">The URL of the Media Creation Tool.</param> /// <param name="downloadUrl">The URL of the tool to download.</param>
/// <param name="fileName">The name of the file to save.</param>
/// <returns>A task representing the asynchronous operation.</returns> /// <returns>A task representing the asynchronous operation.</returns>
public async Task DownloadMediaCreationTool() public async Task DownloadMediaTool(string downloadUrl, string fileName)
{ {
string downloadUrl = "https://go.microsoft.com/fwlink/?linkid=2156295";
using (SaveFileDialog saveFileDialog = new SaveFileDialog()) using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{ {
saveFileDialog.Filter = "Executable Files (*.exe)|*.exe"; saveFileDialog.Filter = "Executable Files (*.exe)|*.exe";
saveFileDialog.Title = "Save Media Creation Tool"; saveFileDialog.Title = $"Save {fileName}";
saveFileDialog.FileName = "MediaCreationTool.exe"; saveFileDialog.FileName = fileName;
if (saveFileDialog.ShowDialog() == DialogResult.OK) if (saveFileDialog.ShowDialog() == DialogResult.OK)
{ {
@@ -308,8 +314,8 @@ namespace FlybyScript
try try
{ {
_logger.Log("Preparing to download Media Creation Tool...", Color.Black); _logger.Log($"Preparing to download {fileName}...", Color.Black);
_logger.Log("Download may take some time, please wait...", Color.Orange); _logger.Log("Download may take some time, please wait...", Color.RoyalBlue);
var response = await httpClient.GetAsync(downloadUrl); var response = await httpClient.GetAsync(downloadUrl);
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
@@ -319,28 +325,29 @@ namespace FlybyScript
await response.Content.CopyToAsync(fileStream); await response.Content.CopyToAsync(fileStream);
} }
_logger.Log("Download completed successfully!", Color.Green); _logger.Log($"{fileName} download completed successfully!", Color.Green);
// Start the downloaded Media Creation Tool // Start the downloaded tool
_logger.Log("Starting Media Creation Tool...", Color.Black); _logger.Log($"Starting {fileName}...", Color.Black);
Process.Start(new ProcessStartInfo Process.Start(new ProcessStartInfo
{ {
FileName = destinationPath, FileName = destinationPath,
UseShellExecute = true // run .exe files UseShellExecute = true // To run .exe files
}); });
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.Log($"An error occurred while downloading: {ex.Message}", Color.Red); _logger.Log($"An error occurred while downloading {fileName}: {ex.Message}", Color.Red);
} }
} }
else else
{ {
_logger.Log("Download canceled by user.", Color.Red); _logger.Log($"{fileName} download canceled by user.", Color.Red);
} }
} }
} }
/// <summary> /// <summary>
/// Calculates progress based on Robocopy output /// Calculates progress based on Robocopy output
/// </summary> /// </summary>
+2 -2
View File
@@ -117,7 +117,7 @@
this.btnRevert.FlatAppearance.BorderSize = 2; this.btnRevert.FlatAppearance.BorderSize = 2;
this.btnRevert.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.btnRevert.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnRevert.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnRevert.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnRevert.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F); this.btnRevert.Font = new System.Drawing.Font("Arial", 9.75F);
this.btnRevert.Location = new System.Drawing.Point(473, 565); this.btnRevert.Location = new System.Drawing.Point(473, 565);
this.btnRevert.Name = "btnRevert"; this.btnRevert.Name = "btnRevert";
this.btnRevert.Size = new System.Drawing.Size(220, 40); this.btnRevert.Size = new System.Drawing.Size(220, 40);
@@ -136,7 +136,7 @@
this.btnApply.FlatAppearance.BorderSize = 2; this.btnApply.FlatAppearance.BorderSize = 2;
this.btnApply.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.btnApply.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnApply.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnApply.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnApply.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F); this.btnApply.Font = new System.Drawing.Font("Arial", 9.75F);
this.btnApply.Location = new System.Drawing.Point(699, 565); this.btnApply.Location = new System.Drawing.Point(699, 565);
this.btnApply.Name = "btnApply"; this.btnApply.Name = "btnApply";
this.btnApply.Size = new System.Drawing.Size(222, 40); this.btnApply.Size = new System.Drawing.Size(222, 40);
+2 -1
View File
@@ -35,8 +35,9 @@ namespace Views
// Initialize the list of features // Initialize the list of features
features = new List<FeatureBase> features = new List<FeatureBase>
{ {
new FindMyDevice(logger),
new PrivacyExperience(logger), new PrivacyExperience(logger),
new ActivityHistory(logger),
new LocationTracking(logger),
new Telemetry(logger), new Telemetry(logger),
new FileExplorerAds(logger), new FileExplorerAds(logger),
new FinishSetupAds(logger), new FinishSetupAds(logger),
+183 -75
View File
@@ -28,13 +28,14 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
this.components = new System.ComponentModel.Container();
this.btnBack = new System.Windows.Forms.Button(); this.btnBack = new System.Windows.Forms.Button();
this.rtbLog = new System.Windows.Forms.RichTextBox(); this.rtbLog = new System.Windows.Forms.RichTextBox();
this.comboBoxDrives = new System.Windows.Forms.ComboBox(); this.comboBoxDrives = new System.Windows.Forms.ComboBox();
this.btnStart = new System.Windows.Forms.Button(); this.btnStart = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label(); this.lblDriveInfo = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label(); this.lblDeviceIDInfo = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label(); this.lblStatusInfo = new System.Windows.Forms.Label();
this.btnSelect = new System.Windows.Forms.Button(); this.btnSelect = new System.Windows.Forms.Button();
this.label6 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label();
this.btnMCT = new System.Windows.Forms.Button(); this.btnMCT = new System.Windows.Forms.Button();
@@ -45,7 +46,13 @@
this.comboBoxDriveLetters = new System.Windows.Forms.ComboBox(); this.comboBoxDriveLetters = new System.Windows.Forms.ComboBox();
this.linkShowDiskList = new System.Windows.Forms.LinkLabel(); this.linkShowDiskList = new System.Windows.Forms.LinkLabel();
this.label3 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label(); this.lblDriveLetterInfo = new System.Windows.Forms.Label();
this.lblPartitionSchemeInfo = new System.Windows.Forms.Label();
this.comboBoxPartitionScheme = new System.Windows.Forms.ComboBox();
this.btnInstallAssistant = new System.Windows.Forms.Button();
this.tt = new System.Windows.Forms.ToolTip(this.components);
this.label1 = new System.Windows.Forms.Label();
this.linkPCHealthCheckApp = new System.Windows.Forms.LinkLabel();
this.SuspendLayout(); this.SuspendLayout();
// //
// btnBack // btnBack
@@ -71,6 +78,7 @@
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.rtbLog.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(230)))), ((int)(((byte)(230))))); this.rtbLog.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(230)))), ((int)(((byte)(230)))));
this.rtbLog.BorderStyle = System.Windows.Forms.BorderStyle.None; this.rtbLog.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.rtbLog.Enabled = false;
this.rtbLog.Font = new System.Drawing.Font("Segoe UI Variable Small Light", 9.75F); this.rtbLog.Font = new System.Drawing.Font("Segoe UI Variable Small Light", 9.75F);
this.rtbLog.Location = new System.Drawing.Point(59, 362); this.rtbLog.Location = new System.Drawing.Point(59, 362);
this.rtbLog.Name = "rtbLog"; this.rtbLog.Name = "rtbLog";
@@ -80,9 +88,10 @@
// //
// comboBoxDrives // comboBoxDrives
// //
this.comboBoxDrives.Enabled = false;
this.comboBoxDrives.Font = new System.Drawing.Font("Segoe UI Variable Small", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.comboBoxDrives.Font = new System.Drawing.Font("Segoe UI Variable Small", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.comboBoxDrives.FormattingEnabled = true; this.comboBoxDrives.FormattingEnabled = true;
this.comboBoxDrives.Location = new System.Drawing.Point(59, 98); this.comboBoxDrives.Location = new System.Drawing.Point(59, 258);
this.comboBoxDrives.Name = "comboBoxDrives"; this.comboBoxDrives.Name = "comboBoxDrives";
this.comboBoxDrives.Size = new System.Drawing.Size(121, 25); this.comboBoxDrives.Size = new System.Drawing.Size(121, 25);
this.comboBoxDrives.TabIndex = 235; this.comboBoxDrives.TabIndex = 235;
@@ -92,11 +101,12 @@
this.btnStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnStart.BackColor = System.Drawing.Color.White; this.btnStart.BackColor = System.Drawing.Color.White;
this.btnStart.Cursor = System.Windows.Forms.Cursors.Hand; this.btnStart.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnStart.Enabled = false;
this.btnStart.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.btnStart.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnStart.FlatAppearance.BorderSize = 2; this.btnStart.FlatAppearance.BorderSize = 2;
this.btnStart.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.btnStart.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnStart.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnStart.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnStart.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F); this.btnStart.Font = new System.Drawing.Font("Arial", 9.75F);
this.btnStart.Location = new System.Drawing.Point(671, 562); this.btnStart.Location = new System.Drawing.Point(671, 562);
this.btnStart.Name = "btnStart"; this.btnStart.Name = "btnStart";
this.btnStart.Size = new System.Drawing.Size(205, 40); this.btnStart.Size = new System.Drawing.Size(205, 40);
@@ -107,57 +117,60 @@
this.btnStart.UseVisualStyleBackColor = false; this.btnStart.UseVisualStyleBackColor = false;
this.btnStart.Click += new System.EventHandler(this.btnStart_Click); this.btnStart.Click += new System.EventHandler(this.btnStart_Click);
// //
// label1 // lblDriveInfo
// //
this.label1.AutoEllipsis = true; this.lblDriveInfo.AutoEllipsis = true;
this.label1.Font = new System.Drawing.Font("Segoe UI Variable Small", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblDriveInfo.Enabled = false;
this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.lblDriveInfo.Font = new System.Drawing.Font("Segoe UI Variable Small", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(55, 34); this.lblDriveInfo.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.label1.Name = "label1"; this.lblDriveInfo.Location = new System.Drawing.Point(55, 194);
this.label1.Size = new System.Drawing.Size(182, 32); this.lblDriveInfo.Name = "lblDriveInfo";
this.label1.TabIndex = 237; this.lblDriveInfo.Size = new System.Drawing.Size(182, 32);
this.label1.Tag = ""; this.lblDriveInfo.TabIndex = 237;
this.label1.Text = "Drive Properties"; this.lblDriveInfo.Tag = "";
this.lblDriveInfo.Text = "Drive Properties";
// //
// label2 // lblDeviceIDInfo
// //
this.label2.AutoEllipsis = true; this.lblDeviceIDInfo.AutoEllipsis = true;
this.label2.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblDeviceIDInfo.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label2.Location = new System.Drawing.Point(57, 80); this.lblDeviceIDInfo.Location = new System.Drawing.Point(57, 240);
this.label2.Name = "label2"; this.lblDeviceIDInfo.Name = "lblDeviceIDInfo";
this.label2.Size = new System.Drawing.Size(79, 15); this.lblDeviceIDInfo.Size = new System.Drawing.Size(79, 15);
this.label2.TabIndex = 238; this.lblDeviceIDInfo.TabIndex = 238;
this.label2.Tag = ""; this.lblDeviceIDInfo.Tag = "";
this.label2.Text = "Device ID"; this.lblDeviceIDInfo.Text = "Device ID";
// //
// label5 // lblStatusInfo
// //
this.label5.AutoEllipsis = true; this.lblStatusInfo.AutoEllipsis = true;
this.label5.Font = new System.Drawing.Font("Segoe UI Variable Small", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblStatusInfo.Enabled = false;
this.label5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.lblStatusInfo.Font = new System.Drawing.Font("Segoe UI Variable Small", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label5.Location = new System.Drawing.Point(55, 328); this.lblStatusInfo.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.label5.Name = "label5"; this.lblStatusInfo.Location = new System.Drawing.Point(55, 328);
this.label5.Size = new System.Drawing.Size(114, 31); this.lblStatusInfo.Name = "lblStatusInfo";
this.label5.TabIndex = 241; this.lblStatusInfo.Size = new System.Drawing.Size(114, 31);
this.label5.Tag = ""; this.lblStatusInfo.TabIndex = 241;
this.label5.Text = "Status"; this.lblStatusInfo.Tag = "";
this.lblStatusInfo.Text = "Status";
// //
// btnSelect // btnSelect
// //
this.btnSelect.AutoEllipsis = true;
this.btnSelect.BackColor = System.Drawing.Color.White; this.btnSelect.BackColor = System.Drawing.Color.White;
this.btnSelect.Cursor = System.Windows.Forms.Cursors.Hand; this.btnSelect.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnSelect.FlatAppearance.BorderColor = System.Drawing.Color.Gray; this.btnSelect.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
this.btnSelect.FlatAppearance.BorderSize = 2; this.btnSelect.FlatAppearance.BorderSize = 2;
this.btnSelect.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.btnSelect.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnSelect.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnSelect.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnSelect.Font = new System.Drawing.Font("Segoe UI Variable Small", 9F); this.btnSelect.Font = new System.Drawing.Font("Arial", 8.75F);
this.btnSelect.Location = new System.Drawing.Point(59, 241); this.btnSelect.Location = new System.Drawing.Point(60, 114);
this.btnSelect.Name = "btnSelect"; this.btnSelect.Name = "btnSelect";
this.btnSelect.Size = new System.Drawing.Size(132, 28); this.btnSelect.Size = new System.Drawing.Size(132, 36);
this.btnSelect.TabIndex = 242; this.btnSelect.TabIndex = 242;
this.btnSelect.TabStop = false; this.btnSelect.TabStop = false;
this.btnSelect.Text = "Select"; this.btnSelect.Text = "Select";
this.tt.SetToolTip(this.btnSelect, "This built-in method prepares a USB drive for a clean install, enabling a fresh r" +
"einstallation of your system.");
this.btnSelect.UseCompatibleTextRendering = true; this.btnSelect.UseCompatibleTextRendering = true;
this.btnSelect.UseVisualStyleBackColor = false; this.btnSelect.UseVisualStyleBackColor = false;
this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click); this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click);
@@ -166,7 +179,7 @@
// //
this.label6.AutoSize = true; this.label6.AutoSize = true;
this.label6.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label6.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label6.Location = new System.Drawing.Point(57, 223); this.label6.Location = new System.Drawing.Point(58, 96);
this.label6.Name = "label6"; this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(76, 15); this.label6.Size = new System.Drawing.Size(76, 15);
this.label6.TabIndex = 243; this.label6.TabIndex = 243;
@@ -175,20 +188,23 @@
// //
// btnMCT // btnMCT
// //
this.btnMCT.AutoEllipsis = true; this.btnMCT.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.btnMCT.BackColor = System.Drawing.Color.White;
this.btnMCT.Cursor = System.Windows.Forms.Cursors.Hand; this.btnMCT.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnMCT.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(241)))), ((int)(((byte)(65)))), ((int)(((byte)(17))))); this.btnMCT.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.btnMCT.FlatAppearance.BorderSize = 2; this.btnMCT.FlatAppearance.BorderSize = 2;
this.btnMCT.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.btnMCT.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(160)))));
this.btnMCT.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnMCT.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnMCT.Font = new System.Drawing.Font("Segoe UI Variable Small", 9F); this.btnMCT.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnMCT.Location = new System.Drawing.Point(235, 241); this.btnMCT.ForeColor = System.Drawing.Color.White;
this.btnMCT.Location = new System.Drawing.Point(463, 114);
this.btnMCT.Name = "btnMCT"; this.btnMCT.Name = "btnMCT";
this.btnMCT.Size = new System.Drawing.Size(205, 28); this.btnMCT.Size = new System.Drawing.Size(214, 36);
this.btnMCT.TabIndex = 244; this.btnMCT.TabIndex = 244;
this.btnMCT.TabStop = false; this.btnMCT.TabStop = false;
this.btnMCT.Text = "Media Creation Tool (Microsoft)"; this.btnMCT.Text = "Media Creation Tool (Microsoft)";
this.tt.SetToolTip(this.btnMCT, "If you want to perform a reinstall or clean install of Windows 11 on a new or use" +
"d PC, use this option to download the media creation tool to make a bootable USB" +
" or DVD.");
this.btnMCT.UseCompatibleTextRendering = true; this.btnMCT.UseCompatibleTextRendering = true;
this.btnMCT.UseVisualStyleBackColor = false; this.btnMCT.UseVisualStyleBackColor = false;
this.btnMCT.Click += new System.EventHandler(this.btnMCT_Click); this.btnMCT.Click += new System.EventHandler(this.btnMCT_Click);
@@ -197,7 +213,7 @@
// //
this.label7.AutoSize = true; this.label7.AutoSize = true;
this.label7.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label7.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label7.Location = new System.Drawing.Point(232, 223); this.label7.Location = new System.Drawing.Point(233, 96);
this.label7.Name = "label7"; this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(85, 15); this.label7.Size = new System.Drawing.Size(85, 15);
this.label7.TabIndex = 245; this.label7.TabIndex = 245;
@@ -208,6 +224,7 @@
// //
this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.progressBar.Enabled = false;
this.progressBar.Location = new System.Drawing.Point(60, 516); this.progressBar.Location = new System.Drawing.Point(60, 516);
this.progressBar.Name = "progressBar"; this.progressBar.Name = "progressBar";
this.progressBar.Size = new System.Drawing.Size(834, 23); this.progressBar.Size = new System.Drawing.Size(834, 23);
@@ -232,10 +249,10 @@
this.checkCreateUnattend.AutoEllipsis = true; this.checkCreateUnattend.AutoEllipsis = true;
this.checkCreateUnattend.FlatAppearance.BorderColor = System.Drawing.Color.Gray; this.checkCreateUnattend.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
this.checkCreateUnattend.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.checkCreateUnattend.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.checkCreateUnattend.Font = new System.Drawing.Font("Segoe UI Variable Small", 8F); this.checkCreateUnattend.Font = new System.Drawing.Font("Arial", 8.75F);
this.checkCreateUnattend.Location = new System.Drawing.Point(72, 275); this.checkCreateUnattend.Location = new System.Drawing.Point(73, 156);
this.checkCreateUnattend.Name = "checkCreateUnattend"; this.checkCreateUnattend.Name = "checkCreateUnattend";
this.checkCreateUnattend.Size = new System.Drawing.Size(194, 25); this.checkCreateUnattend.Size = new System.Drawing.Size(214, 25);
this.checkCreateUnattend.TabIndex = 250; this.checkCreateUnattend.TabIndex = 250;
this.checkCreateUnattend.Text = "Skip Hardware limits and go local"; this.checkCreateUnattend.Text = "Skip Hardware limits and go local";
this.checkCreateUnattend.UseVisualStyleBackColor = true; this.checkCreateUnattend.UseVisualStyleBackColor = true;
@@ -245,17 +262,19 @@
// comboBoxDriveLetters // comboBoxDriveLetters
// //
this.comboBoxDriveLetters.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboBoxDriveLetters.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxDriveLetters.Enabled = false;
this.comboBoxDriveLetters.Font = new System.Drawing.Font("Segoe UI Variable Small", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.comboBoxDriveLetters.Font = new System.Drawing.Font("Segoe UI Variable Small", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.comboBoxDriveLetters.FormattingEnabled = true; this.comboBoxDriveLetters.FormattingEnabled = true;
this.comboBoxDriveLetters.Location = new System.Drawing.Point(210, 98); this.comboBoxDriveLetters.Location = new System.Drawing.Point(210, 258);
this.comboBoxDriveLetters.Name = "comboBoxDriveLetters"; this.comboBoxDriveLetters.Name = "comboBoxDriveLetters";
this.comboBoxDriveLetters.Size = new System.Drawing.Size(121, 25); this.comboBoxDriveLetters.Size = new System.Drawing.Size(121, 25);
this.comboBoxDriveLetters.TabIndex = 251; this.comboBoxDriveLetters.TabIndex = 251;
// //
// linkShowDiskList // linkShowDiskList
// //
this.linkShowDiskList.Enabled = false;
this.linkShowDiskList.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.linkShowDiskList.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.linkShowDiskList.Location = new System.Drawing.Point(60, 126); this.linkShowDiskList.Location = new System.Drawing.Point(60, 286);
this.linkShowDiskList.Name = "linkShowDiskList"; this.linkShowDiskList.Name = "linkShowDiskList";
this.linkShowDiskList.Size = new System.Drawing.Size(177, 16); this.linkShowDiskList.Size = new System.Drawing.Size(177, 16);
this.linkShowDiskList.TabIndex = 252; this.linkShowDiskList.TabIndex = 252;
@@ -268,31 +287,114 @@
this.label3.AutoEllipsis = true; this.label3.AutoEllipsis = true;
this.label3.Font = new System.Drawing.Font("Segoe UI Variable Small", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label3.Font = new System.Drawing.Font("Segoe UI Variable Small", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192))))); this.label3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.label3.Location = new System.Drawing.Point(55, 177); this.label3.Location = new System.Drawing.Point(55, 25);
this.label3.Name = "label3"; this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(182, 32); this.label3.Size = new System.Drawing.Size(232, 32);
this.label3.TabIndex = 253; this.label3.TabIndex = 253;
this.label3.Tag = ""; this.label3.Tag = "";
this.label3.Text = "Create Media"; this.label3.Text = "Create Installation Media";
// //
// label4 // lblDriveLetterInfo
// //
this.label4.AutoEllipsis = true; this.lblDriveLetterInfo.AutoEllipsis = true;
this.label4.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblDriveLetterInfo.Enabled = false;
this.label4.Location = new System.Drawing.Point(207, 80); this.lblDriveLetterInfo.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label4.Name = "label4"; this.lblDriveLetterInfo.Location = new System.Drawing.Point(207, 240);
this.label4.Size = new System.Drawing.Size(79, 15); this.lblDriveLetterInfo.Name = "lblDriveLetterInfo";
this.label4.TabIndex = 254; this.lblDriveLetterInfo.Size = new System.Drawing.Size(79, 15);
this.label4.Tag = ""; this.lblDriveLetterInfo.TabIndex = 254;
this.label4.Text = "Device Letter"; this.lblDriveLetterInfo.Tag = "";
this.lblDriveLetterInfo.Text = "Device Letter";
// //
// InstallationMediaView // lblPartitionSchemeInfo
//
this.lblPartitionSchemeInfo.AutoEllipsis = true;
this.lblPartitionSchemeInfo.Enabled = false;
this.lblPartitionSchemeInfo.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblPartitionSchemeInfo.Location = new System.Drawing.Point(361, 240);
this.lblPartitionSchemeInfo.Name = "lblPartitionSchemeInfo";
this.lblPartitionSchemeInfo.Size = new System.Drawing.Size(109, 15);
this.lblPartitionSchemeInfo.TabIndex = 255;
this.lblPartitionSchemeInfo.Tag = "";
this.lblPartitionSchemeInfo.Text = "Partition scheme";
//
// comboBoxPartitionScheme
//
this.comboBoxPartitionScheme.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxPartitionScheme.Enabled = false;
this.comboBoxPartitionScheme.Font = new System.Drawing.Font("Segoe UI Variable Small", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.comboBoxPartitionScheme.FormattingEnabled = true;
this.comboBoxPartitionScheme.Location = new System.Drawing.Point(364, 258);
this.comboBoxPartitionScheme.Name = "comboBoxPartitionScheme";
this.comboBoxPartitionScheme.Size = new System.Drawing.Size(126, 25);
this.comboBoxPartitionScheme.TabIndex = 256;
//
// btnInstallAssistant
//
this.btnInstallAssistant.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.btnInstallAssistant.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnInstallAssistant.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.btnInstallAssistant.FlatAppearance.BorderSize = 2;
this.btnInstallAssistant.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(160)))));
this.btnInstallAssistant.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnInstallAssistant.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnInstallAssistant.ForeColor = System.Drawing.Color.White;
this.btnInstallAssistant.Location = new System.Drawing.Point(236, 114);
this.btnInstallAssistant.Name = "btnInstallAssistant";
this.btnInstallAssistant.Size = new System.Drawing.Size(214, 36);
this.btnInstallAssistant.TabIndex = 257;
this.btnInstallAssistant.TabStop = false;
this.btnInstallAssistant.Text = "Installation Assistant (Microsoft)";
this.tt.SetToolTip(this.btnInstallAssistant, "This is the best option for installing Windows 11 on the device you’re currently " +
"using.");
this.btnInstallAssistant.UseCompatibleTextRendering = true;
this.btnInstallAssistant.UseVisualStyleBackColor = false;
this.btnInstallAssistant.Click += new System.EventHandler(this.btnInstallAssistant_Click);
//
// label1
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label1.AutoEllipsis = true;
this.label1.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(60, 57);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(846, 15);
this.label1.TabIndex = 258;
this.label1.Tag = "";
this.label1.Text = "There are 3 options below for installing or creating Windows 11 media. Check out " +
"each one to determine the best option for you.";
//
// linkPCHealthCheckApp
//
this.linkPCHealthCheckApp.ActiveLinkColor = System.Drawing.Color.RoyalBlue;
this.linkPCHealthCheckApp.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.linkPCHealthCheckApp.AutoEllipsis = true;
this.linkPCHealthCheckApp.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.linkPCHealthCheckApp.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkPCHealthCheckApp.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.linkPCHealthCheckApp.Location = new System.Drawing.Point(44, 605);
this.linkPCHealthCheckApp.Name = "linkPCHealthCheckApp";
this.linkPCHealthCheckApp.Size = new System.Drawing.Size(566, 16);
this.linkPCHealthCheckApp.TabIndex = 260;
this.linkPCHealthCheckApp.TabStop = true;
this.linkPCHealthCheckApp.Text = "Before installing, please refer to the WhyNotWin11 app to confirm your device mee" +
"ts the minimum system requirements";
this.linkPCHealthCheckApp.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkPCHealthCheckApp_LinkClicked);
//
// MediaView
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true; this.AutoScroll = true;
this.BackColor = System.Drawing.Color.White; this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.label4); this.Controls.Add(this.linkPCHealthCheckApp);
this.Controls.Add(this.label1);
this.Controls.Add(this.btnInstallAssistant);
this.Controls.Add(this.comboBoxPartitionScheme);
this.Controls.Add(this.lblPartitionSchemeInfo);
this.Controls.Add(this.lblDriveLetterInfo);
this.Controls.Add(this.label3); this.Controls.Add(this.label3);
this.Controls.Add(this.linkShowDiskList); this.Controls.Add(this.linkShowDiskList);
this.Controls.Add(this.comboBoxDriveLetters); this.Controls.Add(this.comboBoxDriveLetters);
@@ -303,14 +405,14 @@
this.Controls.Add(this.btnMCT); this.Controls.Add(this.btnMCT);
this.Controls.Add(this.label6); this.Controls.Add(this.label6);
this.Controls.Add(this.btnSelect); this.Controls.Add(this.btnSelect);
this.Controls.Add(this.label5); this.Controls.Add(this.lblStatusInfo);
this.Controls.Add(this.label2); this.Controls.Add(this.lblDeviceIDInfo);
this.Controls.Add(this.label1); this.Controls.Add(this.lblDriveInfo);
this.Controls.Add(this.btnStart); this.Controls.Add(this.btnStart);
this.Controls.Add(this.comboBoxDrives); this.Controls.Add(this.comboBoxDrives);
this.Controls.Add(this.rtbLog); this.Controls.Add(this.rtbLog);
this.Controls.Add(this.btnBack); this.Controls.Add(this.btnBack);
this.Name = "InstallationMediaView"; this.Name = "MediaView";
this.Size = new System.Drawing.Size(959, 631); this.Size = new System.Drawing.Size(959, 631);
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@@ -323,9 +425,9 @@
private System.Windows.Forms.RichTextBox rtbLog; private System.Windows.Forms.RichTextBox rtbLog;
private System.Windows.Forms.ComboBox comboBoxDrives; private System.Windows.Forms.ComboBox comboBoxDrives;
private System.Windows.Forms.Button btnStart; private System.Windows.Forms.Button btnStart;
private System.Windows.Forms.Label label1; private System.Windows.Forms.Label lblDriveInfo;
private System.Windows.Forms.Label label2; private System.Windows.Forms.Label lblDeviceIDInfo;
private System.Windows.Forms.Label label5; private System.Windows.Forms.Label lblStatusInfo;
private System.Windows.Forms.Button btnSelect; private System.Windows.Forms.Button btnSelect;
private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label6;
private System.Windows.Forms.Button btnMCT; private System.Windows.Forms.Button btnMCT;
@@ -336,6 +438,12 @@
private System.Windows.Forms.ComboBox comboBoxDriveLetters; private System.Windows.Forms.ComboBox comboBoxDriveLetters;
private System.Windows.Forms.LinkLabel linkShowDiskList; private System.Windows.Forms.LinkLabel linkShowDiskList;
private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4; private System.Windows.Forms.Label lblDriveLetterInfo;
private System.Windows.Forms.Label lblPartitionSchemeInfo;
private System.Windows.Forms.ComboBox comboBoxPartitionScheme;
private System.Windows.Forms.Button btnInstallAssistant;
private System.Windows.Forms.ToolTip tt;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.LinkLabel linkPCHealthCheckApp;
} }
} }
+69 -14
View File
@@ -66,10 +66,15 @@ namespace Views
} }
else else
{ {
//MessageBox.Show("No removable drives found.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); // MessageBox.Show("No removable drives found.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
comboBoxDriveLetters.Enabled = comboBoxDriveLetters.Enabled = comboBoxDrives.Enabled = false;
comboBoxDrives.Enabled = false;
} }
// Initialize partition schemes
comboBoxPartitionScheme.Items.Clear();
comboBoxPartitionScheme.Items.Add("GPT");
comboBoxPartitionScheme.Items.Add("MBR");
comboBoxPartitionScheme.SelectedIndex = 0; // default to gpt
} }
private async Task ShowDiskList() private async Task ShowDiskList()
@@ -139,10 +144,10 @@ namespace Views
btnStart.Enabled = false; // Disable the Start button btnStart.Enabled = false; // Disable the Start button
// Validate Disk Number // Validate Disk Number
if (string.IsNullOrEmpty(comboBoxDrives.Text) || !int.TryParse(comboBoxDrives.Text, out _)) if (string.IsNullOrEmpty(comboBoxDrives.Text) || !int.TryParse(comboBoxDrives.Text, out int diskNumber))
{ {
logger.Log("Please enter a valid Disk Number.", Color.Red); logger.Log("Please enter a valid Disk Number.", Color.Red);
btnStart.Enabled = true; // Re-enable the button btnStart.Enabled = true;
return; return;
} }
@@ -154,21 +159,33 @@ namespace Views
return; return;
} }
string diskNumber = comboBoxDrives.Text.Trim(); // Get the disk number from the ComboBox // Get the selected drive letter and partition scheme
string driveLetter = comboBoxDriveLetters.SelectedItem.ToString().Trim(); // Get the selected drive letter string driveLetter = comboBoxDriveLetters.SelectedItem.ToString().Trim();
string partitionScheme = comboBoxPartitionScheme.SelectedItem.ToString().Trim(); // Get the selected partition scheme
logger.Log($"Starting to format Disk {diskNumber} and copy to Drive {driveLetter}...", Color.Black);
try try
{ {
// Format the drive using the disk number // Check if the selected drive is a USB stick
await usbManagement.FormatDriveAsync(diskNumber); // Pass the disk number DriveInfo selectedDrive = DriveInfo.GetDrives()
.FirstOrDefault(d => d.Name.StartsWith(driveLetter));
if (selectedDrive == null || selectedDrive.DriveType != DriveType.Removable)
{
logger.Log("Selected drive is not a compatible USB stick. Only USB sticks are supported.", Color.Red);
btnStart.Enabled = true;
return;
}
logger.Log($"Starting to format Disk {diskNumber} ({driveLetter}) as {partitionScheme}...", Color.Black);
// Format the drive with the selected partition scheme
await usbManagement.FormatDriveAsync(diskNumber.ToString(), partitionScheme); // Pass the disk number and selected partition scheme
logger.Log($"Disk {diskNumber} formatted successfully.", Color.Black); logger.Log($"Disk {diskNumber} formatted successfully.", Color.Black);
logger.Log($"Disk {diskNumber} is now bootable.", Color.Black); logger.Log($"Disk {diskNumber} is now bootable.", Color.Black);
// Copy ISO and create unattend.xml if checked // Copy ISO and create unattend.xml if checked
bool createUnattend = checkCreateUnattend.Checked; bool createUnattend = checkCreateUnattend.Checked;
await usbManagement.CopyISOWithUnattendAsync(driveLetter, selectedIsoPath, createUnattend); // Use the drive letter for copying await usbManagement.CopyISOWithUnattendAsync(driveLetter, selectedIsoPath, createUnattend);
logger.Log("Process completed!", Color.Green); logger.Log("Process completed!", Color.Green);
} }
@@ -194,15 +211,38 @@ namespace Views
selectedIsoPath = openFileDialog.FileName; selectedIsoPath = openFileDialog.FileName;
logger.Log($"Selected ISO file: {selectedIsoPath}", Color.Black); logger.Log($"Selected ISO file: {selectedIsoPath}", Color.Black);
checkCreateUnattend.Visible = true; // Show the checkbox to create unattend.xml ToggleIsoControls(true);
} }
else else
{ {
logger.Log("ISO file selection was cancelled.", Color.Red); logger.Log("ISO file selection was cancelled.", Color.Red);
ToggleIsoControls(false); // Disable ISO-related controls if selection is canceled
} }
// MCT and Install Assistant buttons are always enabled
btnMCT.Enabled = true;
btnInstallAssistant.Enabled = true;
} }
} }
// Helper method to toggle ISO-related controls
private void ToggleIsoControls(bool isEnabled)
{
checkCreateUnattend.Visible = isEnabled;
comboBoxDrives.Enabled = isEnabled;
comboBoxDriveLetters.Enabled = isEnabled;
comboBoxPartitionScheme.Enabled = isEnabled;
lblDeviceIDInfo.Enabled = isEnabled;
lblDriveInfo.Enabled = isEnabled;
rtbLog.Enabled = isEnabled;
lblDriveLetterInfo.Enabled = isEnabled;
lblPartitionSchemeInfo.Enabled = isEnabled;
lblStatusInfo.Enabled = isEnabled;
linkShowDiskList.Enabled = isEnabled;
btnStart.Enabled = isEnabled;
}
private void checkCreateUnattend_CheckedChanged(object sender, EventArgs e) private void checkCreateUnattend_CheckedChanged(object sender, EventArgs e)
{ {
if (checkCreateUnattend.Checked) if (checkCreateUnattend.Checked)
@@ -235,12 +275,27 @@ namespace Views
private async void btnMCT_Click(object sender, EventArgs e) private async void btnMCT_Click(object sender, EventArgs e)
{ {
await usbManagement.DownloadMediaCreationTool(); string mediaCreationToolUrl = "https://go.microsoft.com/fwlink/?linkid=2156295";
await usbManagement.DownloadMediaTool(mediaCreationToolUrl, "MediaCreationTool.exe");
}
private async void btnInstallAssistant_Click(object sender, EventArgs e)
{
string installAssistantUrl = "https://go.microsoft.com/fwlink/?linkid=2171764";
await usbManagement.DownloadMediaTool(installAssistantUrl, "Windows11InstallationAssistant.exe");
}
private async void linkPCHealthCheckApp_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
string installAssistantUrl = "https://github.com/rcmaehl/WhyNotWin11/releases/download/2.6.1.1/WhyNotWin11.exe";
await usbManagement.DownloadMediaTool(installAssistantUrl, "WhyNotWin11.exe");
} }
private void btnBack_Click(object sender, EventArgs e) private void btnBack_Click(object sender, EventArgs e)
{ {
SwitchView.GoBack(this.Parent as Panel); SwitchView.GoBack(this.Parent as Panel);
} }
} }
} }
+6
View File
@@ -117,4 +117,10 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="tt.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="tt.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root> </root>