Compare commits

...
7 Commits
Author SHA1 Message Date
Belim 2f63bde9a3 Merge branch 'main' of https://github.com/builtbybel/Flyby11 2025-02-03 16:16:52 +01:00
Belim 6da412f0d8 Push 1.2 Legacy 2025-02-03 16:16:38 +01:00
Belim 545b2f487a Update README.md 2024-12-14 18:38:12 +01:00
Belim 9851f46157 Merge pull request #29 from NKJensen/patch-1
Update README.md (point to the Releases section - helpful advice for new github users)
2024-12-14 18:37:32 +01:00
Niels Kristian "Ænkå" Jensen e7dfdaedec Update README.md
Minor clarification to the README.md file
2024-11-20 10:27:15 +01:00
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
48 changed files with 1266 additions and 4354 deletions

No files matched your search

+22
View File
@@ -0,0 +1,22 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flyby11", "FlybyScript\Flyby11.csproj", "{503AF34B-7544-4C43-A099-2B948C3FF49A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{503AF34B-7544-4C43-A099-2B948C3FF49A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{503AF34B-7544-4C43-A099-2B948C3FF49A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{503AF34B-7544-4C43-A099-2B948C3FF49A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{503AF34B-7544-4C43-A099-2B948C3FF49A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
-25
View File
@@ -1,25 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35327.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlybyScript", "FlybyScript\FlybyScript.csproj", "{66DDC36A-9095-4053-941C-8829D44F5F20}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{66DDC36A-9095-4053-941C-8829D44F5F20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{66DDC36A-9095-4053-941C-8829D44F5F20}.Debug|Any CPU.Build.0 = Debug|Any CPU
{66DDC36A-9095-4053-941C-8829D44F5F20}.Release|Any CPU.ActiveCfg = Release|Any CPU
{66DDC36A-9095-4053-941C-8829D44F5F20}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {81315C08-1240-44F0-AAEF-36C5A1C885B8}
EndGlobalSection
EndGlobal
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>
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

+281
View File
@@ -0,0 +1,281 @@
namespace Flyby11
{
partial class CanIUpgradeView
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Komponenten-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.btnBack = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.linkPCHealthCheckApp = new System.Windows.Forms.LinkLabel();
this.statusLabel = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.btnWindowsUpdate = new System.Windows.Forms.Button();
this.linkHardwareSpecs = new System.Windows.Forms.LinkLabel();
this.label3 = new System.Windows.Forms.Label();
this.btnPatch = new System.Windows.Forms.Button();
this.label7 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// btnBack
//
this.btnBack.AutoSize = true;
this.btnBack.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control;
this.btnBack.FlatAppearance.BorderSize = 0;
this.btnBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnBack.Font = new System.Drawing.Font("Segoe MDL2 Assets", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnBack.ForeColor = System.Drawing.Color.DarkGray;
this.btnBack.Location = new System.Drawing.Point(0, 0);
this.btnBack.Name = "btnBack";
this.btnBack.Size = new System.Drawing.Size(34, 29);
this.btnBack.TabIndex = 232;
this.btnBack.Text = "...";
this.btnBack.UseVisualStyleBackColor = true;
this.btnBack.Click += new System.EventHandler(this.btnBack_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 Text Semibold", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.ForeColor = System.Drawing.Color.Black;
this.label1.Location = new System.Drawing.Point(12, 55);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(534, 17);
this.label1.TabIndex = 233;
this.label1.Text = "An existing Windows 10 device can be upgraded to Windows 11 if it meets the follo" +
"wing criteria:";
//
// label2
//
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label2.AutoEllipsis = true;
this.label2.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label2.Location = new System.Drawing.Point(33, 89);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(513, 36);
this.label2.TabIndex = 234;
this.label2.Text = "1. The device is running a currently supported version of Windows 10. If the devi" +
"ce isn\'t currently running a supported version of Windows 10, upgrade to a suppo" +
"rted version of Windows 10.";
//
// label4
//
this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label4.AutoEllipsis = true;
this.label4.Font = new System.Drawing.Font("Segoe UI Variable Text Semibold", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label4.ForeColor = System.Drawing.Color.Black;
this.label4.Location = new System.Drawing.Point(12, 161);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(534, 17);
this.label4.TabIndex = 236;
this.label4.Text = "To see if a Windows 10 device is eligible to upgrade to Windows 11, follow one of" +
" these options:";
//
// label5
//
this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label5.AutoEllipsis = true;
this.label5.AutoSize = true;
this.label5.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label5.Location = new System.Drawing.Point(33, 194);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(135, 16);
this.label5.TabIndex = 237;
this.label5.Text = "1. Download and run the";
//
// linkPCHealthCheckApp
//
this.linkPCHealthCheckApp.ActiveLinkColor = System.Drawing.Color.RoyalBlue;
this.linkPCHealthCheckApp.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | 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)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.linkPCHealthCheckApp.Location = new System.Drawing.Point(165, 194);
this.linkPCHealthCheckApp.Name = "linkPCHealthCheckApp";
this.linkPCHealthCheckApp.Size = new System.Drawing.Size(394, 16);
this.linkPCHealthCheckApp.TabIndex = 261;
this.linkPCHealthCheckApp.TabStop = true;
this.linkPCHealthCheckApp.Text = "WhyNotWin11 app to confirm your device meets the minimum system requirements";
this.linkPCHealthCheckApp.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkPCHealthCheckApp_LinkClicked);
//
// statusLabel
//
this.statusLabel.AutoEllipsis = true;
this.statusLabel.BackColor = System.Drawing.Color.Gainsboro;
this.statusLabel.Dock = System.Windows.Forms.DockStyle.Bottom;
this.statusLabel.Font = new System.Drawing.Font("Segoe UI Variable Text Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.statusLabel.Location = new System.Drawing.Point(0, 552);
this.statusLabel.Name = "statusLabel";
this.statusLabel.Size = new System.Drawing.Size(561, 33);
this.statusLabel.TabIndex = 262;
this.statusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label6
//
this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label6.AutoEllipsis = true;
this.label6.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label6.Location = new System.Drawing.Point(33, 220);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(523, 27);
this.label6.TabIndex = 263;
this.label6.Text = "2. Select the following Windows Update shortcut and then select the Check for upd" +
"ates button:";
//
// btnWindowsUpdate
//
this.btnWindowsUpdate.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.btnWindowsUpdate.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnWindowsUpdate.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.btnWindowsUpdate.FlatAppearance.BorderSize = 2;
this.btnWindowsUpdate.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(160)))));
this.btnWindowsUpdate.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnWindowsUpdate.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 12.5F, System.Drawing.FontStyle.Bold);
this.btnWindowsUpdate.ForeColor = System.Drawing.Color.White;
this.btnWindowsUpdate.Location = new System.Drawing.Point(47, 249);
this.btnWindowsUpdate.Name = "btnWindowsUpdate";
this.btnWindowsUpdate.Size = new System.Drawing.Size(161, 35);
this.btnWindowsUpdate.TabIndex = 264;
this.btnWindowsUpdate.TabStop = false;
this.btnWindowsUpdate.Text = "Windows Update";
this.btnWindowsUpdate.UseCompatibleTextRendering = true;
this.btnWindowsUpdate.UseVisualStyleBackColor = false;
this.btnWindowsUpdate.Click += new System.EventHandler(this.btnWindowsUpdate_Click);
//
// linkHardwareSpecs
//
this.linkHardwareSpecs.ActiveLinkColor = System.Drawing.Color.RoyalBlue;
this.linkHardwareSpecs.AutoEllipsis = true;
this.linkHardwareSpecs.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.linkHardwareSpecs.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkHardwareSpecs.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.linkHardwareSpecs.Location = new System.Drawing.Point(144, 134);
this.linkHardwareSpecs.Name = "linkHardwareSpecs";
this.linkHardwareSpecs.Size = new System.Drawing.Size(402, 16);
this.linkHardwareSpecs.TabIndex = 265;
this.linkHardwareSpecs.TabStop = true;
this.linkHardwareSpecs.Text = "the minimum hardware specifications to run Windows 11.";
this.linkHardwareSpecs.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkHardwareSpecs_LinkClicked);
//
// label3
//
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label3.AutoEllipsis = true;
this.label3.AutoSize = true;
this.label3.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label3.Location = new System.Drawing.Point(34, 134);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(111, 16);
this.label3.TabIndex = 266;
this.label3.Text = "2. The device meets";
//
// btnPatch
//
this.btnPatch.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.btnPatch.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnPatch.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(180)))));
this.btnPatch.FlatAppearance.BorderSize = 2;
this.btnPatch.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(103)))), ((int)(((byte)(160)))));
this.btnPatch.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnPatch.Font = new System.Drawing.Font("Segoe UI Variable Display Semib", 12.5F, System.Drawing.FontStyle.Bold);
this.btnPatch.ForeColor = System.Drawing.Color.White;
this.btnPatch.Location = new System.Drawing.Point(47, 344);
this.btnPatch.Name = "btnPatch";
this.btnPatch.Size = new System.Drawing.Size(161, 35);
this.btnPatch.TabIndex = 267;
this.btnPatch.TabStop = false;
this.btnPatch.Text = "Patch Installation";
this.btnPatch.UseCompatibleTextRendering = true;
this.btnPatch.UseVisualStyleBackColor = false;
this.btnPatch.Click += new System.EventHandler(this.btnPatch_Click);
//
// label7
//
this.label7.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label7.AutoEllipsis = true;
this.label7.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label7.Location = new System.Drawing.Point(33, 288);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(513, 40);
this.label7.TabIndex = 268;
this.label7.Text = "3. Your device does not meet the official requirements for Windows 11? You can ap" +
"ply a compatibility patch to enable the Inplace Upgrade via Windows Update.";
//
// CanIUpgradeView
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.AutoScroll = true;
this.Controls.Add(this.label7);
this.Controls.Add(this.btnPatch);
this.Controls.Add(this.label3);
this.Controls.Add(this.linkHardwareSpecs);
this.Controls.Add(this.btnWindowsUpdate);
this.Controls.Add(this.label6);
this.Controls.Add(this.statusLabel);
this.Controls.Add(this.linkPCHealthCheckApp);
this.Controls.Add(this.label5);
this.Controls.Add(this.label4);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.btnBack);
this.Name = "CanIUpgradeView";
this.Size = new System.Drawing.Size(561, 585);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnBack;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.LinkLabel linkPCHealthCheckApp;
private System.Windows.Forms.Label statusLabel;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Button btnWindowsUpdate;
private System.Windows.Forms.LinkLabel linkHardwareSpecs;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button btnPatch;
private System.Windows.Forms.Label label7;
}
}
+237
View File
@@ -0,0 +1,237 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Security.Principal;
using System.Windows.Forms;
using Views;
namespace Flyby11
{
public partial class CanIUpgradeView : UserControl
{
private IsoHandler isoHandler;
public CanIUpgradeView()
{
InitializeComponent();
isoHandler = new IsoHandler(UpdateStatusLabel);
SetStyle();
}
private void SetStyle()
{
// Segoe MDL2 Assets
btnBack.Text = "\uE72B";
}
// Update the status label
private void UpdateStatusLabel(string message)
{
statusLabel.Text = message;
statusLabel.Refresh(); // Ensure the label updates in real-time
}
private void btnBack_Click(object sender, EventArgs e)
{
SwitchView.GoBack(this.Parent as Panel);
}
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 isoHandler.DownloadMediaTool(installAssistantUrl, "WhyNotWin11.exe");
}
private void linkHardwareSpecs_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("https://www.microsoft.com/windows/windows-11-specifications?ocid=smc_marvel_ups_support_win11");
}
private void btnWindowsUpdate_Click(object sender, EventArgs e)
{
try
{
// Open Windows Update settings
Process.Start(new ProcessStartInfo
{
FileName = "ms-settings:windowsupdate",
UseShellExecute = true
});
// Trigger update check via PowerShell
Process.Start(new ProcessStartInfo
{
FileName = "powershell.exe",
Arguments = "-Command \"Start-WindowsUpdate -Confirm:$false\"",
UseShellExecute = false,
CreateNoWindow = true
});
UpdateStatusLabel("Checking for updates...");
}
catch (Exception ex)
{
UpdateStatusLabel($"Error starting Windows Update: {ex.Message}");
}
}
private void btnPatch_Click(object sender, EventArgs e)
{
// Check if the application is running with Administrator privileges
if (!IsRunningAsAdministrator())
{
// Request elevation (UAC prompt) and restart the application with admin rights
UpdateStatusLabel("This application needs to be run as Administrator. Restarting as Administrator...");
RunAsAdministrator();
return;
}
UpdateStatusLabel("Checking patch status...");
// Check if the patch has already been applied
if (IsPatchApplied())
{
UpdateStatusLabel("Patch is already applied. No further action needed.");
}
else
{
// If patch not applied, attempt to apply the patch
UpdateStatusLabel("Applying patch...");
if (ApplyPatch())
{
UpdateStatusLabel("Patch applied successfully! You are ready for the upgrade.");
}
else
{
// UpdateStatusLabel("Failed to apply the patch. Please try again.");
}
}
}
// Helper method to check if the application is running as Administrator
private bool IsRunningAsAdministrator()
{
var identity = System.Security.Principal.WindowsIdentity.GetCurrent();
var principal = new System.Security.Principal.WindowsPrincipal(identity);
return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);
}
// Helper method to restart the application with Administrator privileges
private void RunAsAdministrator()
{
ProcessStartInfo processStartInfo = new ProcessStartInfo
{
FileName = Application.ExecutablePath,
Verb = "runas" // This triggers the UAC prompt
};
Process.Start(processStartInfo);
Application.Exit(); // Exit the current application to prevent further execution
}
private bool IsPatchApplied()
{
try
{
using (Process process = new Process())
{
process.StartInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = "/c reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\HwReqChk\" /v HwReqChkVars",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
process.Start();
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();
if (!string.IsNullOrWhiteSpace(error))
{
UpdateStatusLabel($"Registry query failed: {error}");
return false;
}
if (output.Contains("HwReqChkVars"))
{
UpdateStatusLabel("Patch is already applied.");
return true;
}
UpdateStatusLabel("Patch is not applied.");
return false;
}
}
catch (Exception ex)
{
UpdateStatusLabel($"Error checking patch status: {ex.Message}");
return false;
}
}
private bool ApplyPatch()
{
try
{
string[] commands = new[]
{
"reg add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\HwReqChk\" /f",
"reg add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\HwReqChk\" /v HwReqChkVars /t REG_MULTI_SZ /d \"SQ_SecureBootCapable=TRUE\\0SQ_SecureBootEnabled=TRUE\\0SQ_TpmVersion=2\\0SQ_RamMB=8192\" /f",
"reg delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\CompatMarkers\" /f",
"reg delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Shared\" /f",
"reg delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\TargetVersionUpgradeExperienceIndicators\" /f",
"reg add \"HKLM\\SYSTEM\\Setup\\MoSetup\" /f /v AllowUpgradesWithUnsupportedTPMOrCPU /t REG_DWORD /d 1"
};
List<Process> processes = new List<Process>();
foreach (string command in commands)
{
Process process = new Process();
process.StartInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = $"/c {command}",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
process.Start();
processes.Add(process);
}
foreach (Process process in processes)
{
process.WaitForExit();
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
if (!string.IsNullOrWhiteSpace(error))
{
// UpdateStatusLabel($"Error applying patch: {error}");
return false;
}
if (!string.IsNullOrWhiteSpace(output))
{
UpdateStatusLabel($"{output}");
}
}
UpdateStatusLabel("Patch applied successfully!");
return true;
}
catch (Exception ex)
{
UpdateStatusLabel($"Error applying patch: {ex.Message}");
return false;
}
}
}
}
File renamed without changes.
-26
View File
@@ -1,26 +0,0 @@
namespace FlybyScript
{
public abstract class FeatureBase
{
protected readonly Logger logger;
public Logger Logger => logger;
protected FeatureBase(Logger logger)
{
this.logger = logger;
}
public abstract string ID();
public abstract string Info();
public abstract bool CheckFeature();
public abstract bool DoFeature();
public abstract bool UndoFeature();
public abstract string GetRegistryKey();
}
}
-15
View File
@@ -1,15 +0,0 @@
using System.Windows.Forms;
namespace FlybyScript
{
internal class FeatureNode : TreeNode
{
public FeatureBase Feature { get; private set; }
public FeatureNode(FeatureBase feature)
{
Feature = feature;
Text = Feature.ID();
}
}
}
-147
View File
@@ -1,147 +0,0 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace FlybyScript
{
internal class FeaturePanel : Panel
{
private FeatureBase feature;
private Logger logger;
private Label statusLabel;
public FeaturePanel(FeatureBase feature, Logger logger)
{
this.feature = feature;
this.logger = logger;
// Create a FlowLayoutPanel
FlowLayoutPanel flowLayout = new FlowLayoutPanel
{
Dock = DockStyle.Top,
AutoSize = true,
FlowDirection = FlowDirection.TopDown,
WrapContents = false,
AutoScroll = true
};
// Add Components
var descriptionLabel = CreateDescriptionLabel();
var checkBox = CreateCheckBox();
var linkLabel = CreateLinkLabel();
statusLabel = CreateStatusLabel(); // Init status label
// Event Handlers
linkLabel.Click += LinkLabel_Click;
checkBox.CheckedChanged += CheckBox_CheckedChanged;
// Add Controls to FlowLayoutPanel
flowLayout.Controls.Add(descriptionLabel);
flowLayout.Controls.Add(checkBox);
flowLayout.Controls.Add(linkLabel);
flowLayout.Controls.Add(statusLabel);
// Add FlowLayoutPanel to the main panel
Controls.Add(flowLayout);
}
private Label CreateDescriptionLabel()
{
return new Label
{
Text = feature.Info(),
AutoSize = true,
Font = new Font("Segoe UI", 10, FontStyle.Regular),
ForeColor = Color.Black,
Padding = new Padding(0, 0, 0, 5) // Padding for better spacing
};
}
private CheckBox CreateCheckBox()
{
return new CheckBox
{
Text = feature.ID(),
AutoSize = true,
Checked = feature.CheckFeature(),
Dock = DockStyle.Top,
Font = new Font("Segoe UI", 10, FontStyle.Bold),
ForeColor = Color.Black
};
}
private LinkLabel CreateLinkLabel()
{
return new LinkLabel
{
Text = "Show Details",
AutoSize = true,
LinkColor = Color.Blue,
Font = new Font("Segoe UI", 10, FontStyle.Italic),
Cursor = Cursors.Hand,
Padding = new Padding(0, 0, 10, 0) // Adding some padding
};
}
private Label CreateStatusLabel()
{
return new Label
{
Text = feature.CheckFeature() ? "Feature Enabled" : "Feature Disabled",
AutoSize = true,
Font = new Font("Segoe UI", 10, FontStyle.Italic),
ForeColor = Color.Gray,
TextAlign = ContentAlignment.MiddleRight,
Padding = new Padding(10, 0, 0, 0)
};
}
private void LinkLabel_Click(object sender, EventArgs e)
{
// Copy the registry key associated with the feature to the clipboard
string registryKey = feature.GetRegistryKey();
if (!string.IsNullOrEmpty(registryKey))
{
Clipboard.SetText(registryKey);
MessageBox.Show($"Registry key '{registryKey}", "Copied to clipboard", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("No registry key available for this feature.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void CheckBox_CheckedChanged(object sender, EventArgs e)
{
var checkBox = sender as CheckBox;
bool success = false;
if (checkBox != null)
{
if (checkBox.Checked)
{
success = feature.DoFeature(); // Enable feature
if (success)
{
logger.Log($"{feature.ID()} enabled", Color.Green);
statusLabel.Text = "Feature Enabled"; // Update status label
}
}
else
{
success = feature.UndoFeature(); // Disable feature
if (success)
{
logger.Log($"{feature.ID()} disabled", Color.Red);
statusLabel.Text = "Feature Disabled";
}
}
}
if (!success)
{
MessageBox.Show("Failed to update feature status", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
-68
View File
@@ -1,68 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Ads
{
internal class FileExplorerAds : FeatureBase
{
public FileExplorerAds(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced";
private const string valueName = "ShowSyncProviderNotifications";
private const int desiredValue = 0;
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override string ID()
{
return "Disable File Explorer Ads";
}
public override string Info()
{
return "This feature will disable ads in File Explorer.";
}
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;
}
}
}
-71
View File
@@ -1,71 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Privacy
{
internal class FindMyDevice : FeatureBase
{
public FindMyDevice(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location";
private const string valueName = "Value";
private const string desiredValue = @"Allow";
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override string ID()
{
return "Disable Find my device";
}
public override string Info()
{
return "This feature will disable find my device.";
}
public override bool CheckFeature()
{
return !(
Utils.StringEquals(keyName, valueName, desiredValue)
);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, "Deny", RegistryValueKind.String);
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, desiredValue, RegistryValueKind.String);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
-64
View File
@@ -1,64 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Ads
{
public class FinishSetupAds : FeatureBase
{
public FinishSetupAds(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\UserProfileEngagement";
private const string valueName = "ScoobeSystemSettingEnabled";
private const int desiredValue = 0;
public override string ID() => "Disable Finish Setup Ads";
public override string Info() => "This feature will disable the \"Lets finish setting up your device\" and other advertising.";
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override bool CheckFeature()
{
return Utils.IntEquals(keyName, valueName, 0);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.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, Microsoft.Win32.RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
-69
View File
@@ -1,69 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Ads
{
internal class LockScreenAds : FeatureBase
{
public LockScreenAds(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager";
private const string valueName = "RotatingLockScreenOverlayEnabled";
private const string valueName2 = "SubscribedContent-338387Enabled";
private const int desiredValue = 0;
public override string ID() => "Disable Lock Screen Tips and Ads";
public override string Info() => "This feature will disable tips and ads on the lock screen.";
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override bool CheckFeature()
{
return (Utils.IntEquals(keyName, valueName, desiredValue) &&
Utils.IntEquals(keyName, valueName2, desiredValue)
);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord);
Registry.SetValue(keyName, valueName2, 0, Microsoft.Win32.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, Microsoft.Win32.RegistryValueKind.DWord);
Registry.SetValue(keyName, valueName2, 1, Microsoft.Win32.RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
-64
View File
@@ -1,64 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Ads
{
public class PersonalizedAds : FeatureBase
{
public PersonalizedAds(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\AdvertisingInfo";
private const string valueName = "Enabled";
private const int desiredValue = 0;
public override string ID() => "Disable Personalized Ads";
public override string Info() => "This feature will disable personalized ads.";
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override bool CheckFeature()
{
return Utils.IntEquals(keyName, valueName, 0);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.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, Microsoft.Win32.RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
@@ -1,64 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Privacy
{
public class PrivacyExperience : FeatureBase
{
public PrivacyExperience(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\OOBE";
private const string valueName = "DisablePrivacyExperience";
private const int desiredValue = 0;
public override string ID() => "Disable Privacy Settings Experience at sign-in";
public override string Info() => "This feature will disable Privacy Settings Experience at sign-in.";
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override bool CheckFeature()
{
return !Utils.IntEquals(keyName, valueName, desiredValue);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 1, Microsoft.Win32.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, 0, Microsoft.Win32.RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
-74
View File
@@ -1,74 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Ads
{
internal class SettingsAds : FeatureBase
{
public SettingsAds(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager";
private const string valueName = "SubscribedContent-338393Enabled";
private const string valueName2 = "SubscribedContent-353694Enabled";
private const string valueName3 = "SubscribedContent-353696Enabled";
private const int desiredValue = 0;
public override string ID() => "Disable Settings Ads";
public override string Info() => "This feature will disable ads in settings.";
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} + {valueName2} + {valueName3} | Desired Value: {desiredValue}";
}
public override bool CheckFeature()
{
return (Utils.IntEquals(keyName, valueName, desiredValue) &&
Utils.IntEquals(keyName, valueName2, desiredValue) &&
Utils.IntEquals(keyName, valueName3, desiredValue)
);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.RegistryValueKind.DWord);
Registry.SetValue(keyName, valueName2, 0, Microsoft.Win32.RegistryValueKind.DWord);
Registry.SetValue(keyName, valueName3, 0, Microsoft.Win32.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, Microsoft.Win32.RegistryValueKind.DWord);
Registry.SetValue(keyName, valueName2, 1, Microsoft.Win32.RegistryValueKind.DWord);
Registry.SetValue(keyName, valueName3, 1, Microsoft.Win32.RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
-70
View File
@@ -1,70 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Ads
{
internal class StartmenuAds : FeatureBase
{
public StartmenuAds(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced";
private const string valueName = "Start_IrisRecommendations";
private const int desiredValue = 0;
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override string ID()
{
return "Disable Start menu Ads";
}
public override string Info()
{
return "This feature will disable ads in the start menu.";
}
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;
}
}
}
@@ -1,70 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Ads
{
internal class TailoredExperiences : FeatureBase
{
public TailoredExperiences(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Privacy";
private const string valueName = "TailoredExperiencesWithDiagnosticDataEnabled";
private const int desiredValue = 0;
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override string ID()
{
return "Disable Tailored experiences";
}
public override string Info()
{
return "Tailored Experiences allows Microsoft to get information from you to deliver personalized tips, ads, and recommendations. Many people would call this telemetry, or even spying.";
}
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;
}
}
}
-69
View File
@@ -1,69 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Privacy
{
public class Telemetry : FeatureBase
{
public Telemetry(Logger logger) : base(logger)
{
}
private const string dataCollection = @"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\DataCollection";
private const string diagTrack = @"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\DiagTrack";
public override string ID() => "Turn off Telemetry data collection";
public override string Info() => "This feature will turn off telemetry data collection and prevent the data from being sent to Microsoft.";
public override string GetRegistryKey()
{
return $"{dataCollection} | {diagTrack}";
}
public override bool CheckFeature()
{
return (
Utils.IntEquals(dataCollection, "AllowTelemetry", 0) &&
Utils.IntEquals(diagTrack, "Start", 2)
);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(dataCollection, "AllowTelemetry", 0, RegistryValueKind.DWord);
Registry.SetValue(diagTrack, "Start", 2, 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(dataCollection, "AllowTelemetry", 1, RegistryValueKind.DWord);
Registry.SetValue(diagTrack, "Start", 4, RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
@@ -1,65 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Ads
{
internal class TipsAndSuggestions : FeatureBase
{
public TipsAndSuggestions(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager";
private const string valueName = "SubscribedContent-338389Enabled";
private const int desiredValue = 0;
public override string ID() => "Disable General Tips and Ads";
public override string Info() => "This feature will disable general tips and ads.";
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override bool CheckFeature()
{
return (Utils.IntEquals(keyName, valueName, desiredValue)
);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.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, Microsoft.Win32.RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
@@ -1,64 +0,0 @@
using FlybyScript;
using Microsoft.Win32;
using System;
using System.Drawing;
namespace Settings.Ads
{
public class WelcomeExperienceAds : FeatureBase
{
public WelcomeExperienceAds(Logger logger) : base(logger)
{
}
private const string keyName = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager";
private const string valueName = "SubscribedContent-310093Enabled";
private const int desiredValue = 0;
public override string ID() => "Disable Welcome Experience Ads";
public override string Info() => "This feature will disable ads in the welcome experience.";
public override string GetRegistryKey()
{
return $"{keyName} | Value: {valueName} | Desired Value: {desiredValue}";
}
public override bool CheckFeature()
{
return Utils.IntEquals(keyName, valueName, 0);
}
public override bool DoFeature()
{
try
{
Registry.SetValue(keyName, valueName, 0, Microsoft.Win32.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, Microsoft.Win32.RegistryValueKind.DWord);
return true;
}
catch (Exception ex)
{
logger.Log("Code red in " + ex.Message, Color.Red);
}
return false;
}
}
}
+210
View File
@@ -0,0 +1,210 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Net;
using System.Windows.Forms;
namespace Flyby11
{
public class FAQHandler
{
private readonly Panel _faqPanel;
private readonly Action<string> _updateStatus;
public FAQHandler(Panel faqPanel, Action<string> updateStatus)
{
_faqPanel = faqPanel;
_updateStatus = updateStatus;
}
public void InitializeFAQ()
{
_faqPanel.AutoScroll = true;
_faqPanel.Controls.Clear();
var faqContentPanel = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
AutoScroll = true,
Padding = new Padding(10),
FlowDirection = FlowDirection.TopDown,
WrapContents = false
};
AddTitle(faqContentPanel);
AddISOFAQ(faqContentPanel);
AddOtherFAQs(faqContentPanel);
_faqPanel.Controls.Add(faqContentPanel);
}
private void AddTitle(FlowLayoutPanel parent)
{
AddLabel(parent, "Frequently Asked Questions (FAQ)", new Font("Arial", 10, FontStyle.Bold), DockStyle.Top, ContentAlignment.MiddleCenter, 10);
}
private void AddISOFAQ(FlowLayoutPanel parent)
{
// Q: Where can I get the latest Windows 11 ISO?
AddLabel(parent, "Q: Where can I get the latest Windows 11 ISO?", new Font("Arial", 10, FontStyle.Bold), ContentAlignment.TopLeft, 10);
AddLabel(parent, "A: You can download the latest ISO from the official Microsoft website or use the Fido Downloader.", new Font("Arial", 10), ContentAlignment.TopLeft, 10);
// Create a FlowLayoutPanel to place the links next to each other
var linkPanel = new FlowLayoutPanel
{
AutoSize = true,
FlowDirection = FlowDirection.LeftToRight,
WrapContents = true
};
// Microsoft link
AddFAQItem(linkPanel, "Microsoft Site", "https://www.microsoft.com/software-download/windows11");
// Fido Downloader link (with text and URL, using AddFAQItemWithScript)
AddFAQItemWithScript(linkPanel, "Download via Fido (Recommended)", "or", "https://raw.githubusercontent.com/pbatard/Fido/refs/heads/master/Fido.ps1");
// Add the FlowLayoutPanel to the parent (FAQ panel)
parent.Controls.Add(linkPanel);
}
private void AddFAQItem(FlowLayoutPanel parent, string linkText, string linkUrl)
{
// Create and add the link label with the provided text and URL
var linkLabel = new LinkLabel
{
Text = linkText,
Font = new Font("Arial", 10, FontStyle.Underline),
LinkColor = Color.Blue,
AutoSize = true,
Padding = new Padding(10),
TextAlign = ContentAlignment.TopLeft
};
linkLabel.LinkClicked += (sender, e) => System.Diagnostics.Process.Start(linkUrl);
parent.Controls.Add(linkLabel);
}
private void AddFAQItemWithScript(FlowLayoutPanel parent, string linkText, string description, string scriptUrl)
{
// Create and add the description label
AddLabel(parent, description, new Font("Arial",9), ContentAlignment.TopLeft, 10);
// Create and add the link label
var linkLabel = new LinkLabel
{
Text = linkText,
Font = new Font("Arial", 10, FontStyle.Underline),
LinkColor = Color.Blue,
AutoSize = true,
Padding = new Padding(10),
TextAlign = ContentAlignment.TopLeft
};
linkLabel.LinkClicked += async (sender, e) =>
{
string tempScriptPath = Path.Combine(Path.GetTempPath(), "Fido.ps1");
try
{
using (var client = new WebClient())
{
await client.DownloadFileTaskAsync(new Uri(scriptUrl), tempScriptPath);
_updateStatus("Fido downloaded successfully! Now running the script...");
System.Diagnostics.Process.Start(new ProcessStartInfo
{
FileName = "powershell.exe",
Arguments = $"-ExecutionPolicy Bypass -File \"{tempScriptPath}\"",
Verb = "runas",
CreateNoWindow = true,
UseShellExecute = true
});
}
}
catch (Exception ex)
{
_updateStatus("Error downloading or running the script: " + ex.Message);
}
};
parent.Controls.Add(linkLabel);
}
private void AddLabel(FlowLayoutPanel parent, string text, Font font, ContentAlignment alignment, int padding = 0)
{
var label = new Label
{
Text = text,
Font = font,
Padding = new Padding(padding),
TextAlign = alignment,
AutoSize = true
};
parent.Controls.Add(label);
}
private void AddLabel(FlowLayoutPanel parent, string text, Font font, DockStyle dock, ContentAlignment alignment, int padding = 0)
{
var label = new Label
{
Text = text,
Font = font,
Padding = new Padding(padding),
Dock = dock,
TextAlign = alignment,
AutoSize = true
};
parent.Controls.Add(label);
}
private void AddFAQItem(FlowLayoutPanel parent, string question, string answer, string linkText, string linkUrl)
{
AddLabel(parent, question, new Font("Arial", 10, FontStyle.Bold), ContentAlignment.TopLeft, 10);
AddLabel(parent, answer, new Font("Arial", 10), ContentAlignment.TopLeft, 10);
var linkLabel = new LinkLabel
{
Text = linkText,
Font = new Font("Arial", 10, FontStyle.Underline),
LinkColor = Color.Blue,
AutoSize = true,
Padding = new Padding(10),
TextAlign = ContentAlignment.TopLeft
};
linkLabel.LinkClicked += (sender, e) => System.Diagnostics.Process.Start(linkUrl);
parent.Controls.Add(linkLabel);
}
private void AddOtherFAQs(FlowLayoutPanel parent)
{
// Q: How can I support the developer?
AddFAQItem(parent, "Q: How can I support the developer?", "A: If you've successfully installed Windows 11 and saved some money, feel free to leave a little something as a thank-you here.", "Click here to donate and show your support.", "https://www.paypal.com/donate?hosted_button_id=MY7HX4QLYR4KG");
// Q: How does the setup process work once the ISO is mounted?
AddLabel(parent, "Q: How does the setup process work once the ISO is mounted?", new Font("Arial", 10, FontStyle.Bold), ContentAlignment.TopLeft, 10);
AddLabel(parent, "A: Once the ISO is mounted, the setup process runs in the background. The Windows installer starts, guiding you through the steps required to install Windows 11 on your machine.", new Font("Arial", 10), ContentAlignment.TopLeft, 10);
// Q: What if I encounter issues during installation?
AddLabel(parent, "Q: What if I encounter issues during installation?", new Font("Arial", 10, FontStyle.Bold), ContentAlignment.TopLeft, 10);
AddLabel(parent, "A: Please check the error messages and report it on GitHub.", new Font("Arial", 10), ContentAlignment.TopLeft, 10);
// Q: What is the setup path for Windows 11?
AddLabel(parent, "Q: What is the setup path for Windows 11?", new Font("Arial", 10, FontStyle.Bold), ContentAlignment.TopLeft, 10);
AddLabel(parent, "A: The setup path is typically found under the 'sources' folder on the mounted ISO drive.", new Font("Arial", 10), ContentAlignment.TopLeft, 10);
// Q: Is it legal to use this method?
AddLabel(parent, "Q: Is it legal to use this method?", new Font("Arial", 10, FontStyle.Bold), ContentAlignment.TopLeft, 10);
AddLabel(parent, "A: Yes, Microsoft has left a backdoor open. This method leverages a feature of the Windows 11 setup process that uses the Windows Server variant of the installation. Unlike the regular Windows 11 setup, this variant skips most hardware compatibility checks.", new Font("Arial", 10), ContentAlignment.TopLeft, 10);
// Q: What are my alternatives if my PC is not supported?
AddLabel(parent, "Q: What are my alternatives if my PC is not supported?", new Font("Arial", 10, FontStyle.Bold), ContentAlignment.TopLeft, 10);
AddLabel(parent, "A: According to Microsoft, you should throw your PC away. I would suggest installing Linux on it and moving away from Windows.", new Font("Arial", 10), ContentAlignment.TopLeft, 10);
// Q: Who is the developer?
AddFAQItem(parent, "Q: Who is the developer?", "A: The developer is Belim, also known as Builtbybel, who has contributed a lot of code to the Windows community.", "Click here to learn more about the developer's work.", "https://github.com/BuiltByBel");
}
}
}
@@ -1,18 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{66DDC36A-9095-4053-941C-8829D44F5F20}</ProjectGuid>
<ProjectGuid>{503AF34B-7544-4C43-A099-2B948C3FF49A}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>FlybyScript</RootNamespace>
<RootNamespace>Flyby11</RootNamespace>
<AssemblyName>Flyby11</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x64</PlatformTarget>
@@ -40,9 +39,6 @@
<ApplicationIcon>AppIcon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
@@ -56,25 +52,14 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Experience\FeaturePanel.cs">
<SubType>Component</SubType>
<Compile Include="CanIUpgradeView.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Experience\FileExplorerAds.cs" />
<Compile Include="Experience\FindMyDevice.cs" />
<Compile Include="Experience\FinishSetupAds.cs" />
<Compile Include="Experience\LockScreenAds.cs" />
<Compile Include="Experience\PersonalizedAds.cs" />
<Compile Include="Experience\PrivacyExperience.cs" />
<Compile Include="Experience\SettingsAds.cs" />
<Compile Include="Experience\StartmenuAds.cs" />
<Compile Include="Experience\TailoredExperiences.cs" />
<Compile Include="Experience\Telemetry.cs" />
<Compile Include="Experience\TipsAndSuggestions.cs" />
<Compile Include="Experience\WelcomeExperienceAds.cs" />
<Compile Include="Helper\Utils.cs" />
<Compile Include="Helper\Views.cs" />
<Compile Include="Patcher\ScriptPatcher.cs" />
<Compile Include="Helper\Logger.cs" />
<Compile Include="CanIUpgradeView.Designer.cs">
<DependentUpon>CanIUpgradeView.cs</DependentUpon>
</Compile>
<Compile Include="FAQHandler.cs" />
<Compile Include="IsoHandler.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
@@ -83,26 +68,12 @@
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Patcher\PSPatcher.cs" />
<Compile Include="Patcher\NativePatcher.cs" />
<Compile Include="Experience\FeatureBase.cs" />
<Compile Include="Experience\FeatureNode.cs" />
<Compile Include="USBManagement.cs" />
<Compile Include="Views\ExperienceView.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Views\ExperienceView.Designer.cs">
<DependentUpon>ExperienceView.cs</DependentUpon>
</Compile>
<Compile Include="Views\MediaView.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Views\MediaView.Designer.cs">
<DependentUpon>MediaView.cs</DependentUpon>
</Compile>
<Compile Include="SwitchView.cs" />
<EmbeddedResource Include="CanIUpgradeView.resx">
<DependentUpon>CanIUpgradeView.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
@@ -114,14 +85,7 @@
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<EmbeddedResource Include="Views\ExperienceView.resx">
<DependentUpon>ExperienceView.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Views\MediaView.resx">
<DependentUpon>MediaView.cs</DependentUpon>
</EmbeddedResource>
<None Include="app.manifest" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
-35
View File
@@ -1,35 +0,0 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace FlybyScript
{
public class Logger
{
private RichTextBox rtbDescription;
public Logger(RichTextBox rtbDescription)
{
this.rtbDescription = rtbDescription;
}
public void Log(string message, Color color)
{
if (rtbDescription.InvokeRequired)
{
rtbDescription.Invoke(new Action(() => LogMessage(message, color)));
}
else
{
LogMessage(message, color);
}
}
private void LogMessage(string message, Color color)
{
rtbDescription.SelectionColor = color;
rtbDescription.AppendText($"{DateTime.Now:HH:mm:ss} - {message}\n");
rtbDescription.ScrollToCaret();
}
}
}
-67
View File
@@ -1,67 +0,0 @@
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace FlybyScript
{
internal class Utils
{
// Check registry int equal
public static bool IntEquals(string keyName, string valueName, int expectedValue)
{
try
{
var value = Registry.GetValue(keyName, valueName, null);
return (value != null && (int)value == expectedValue);
}
catch (Exception ex)
{
MessageBox.Show(keyName, ex.Message, MessageBoxButtons.OK);
return false;
}
}
// Check registry strings equal
public static bool StringEquals(string keyName, string valueName, string expectedValue)
{
try
{
var value = Registry.GetValue(keyName, valueName, null);
return (value != null && (string)value == expectedValue);
}
catch (Exception ex)
{
MessageBox.Show(keyName, ex.Message, MessageBoxButtons.OK);
return false;
}
}
public static bool KeyExists(string keyPath)
{
return Registry.GetValue(keyPath, null, null) != null;
}
public static bool IsProcessRunning(string processName)
{
Process[] processes = Process.GetProcessesByName(processName);
return processes.Length > 0;
}
// Launch Urls in richText control
public static void LaunchUri(string url)
{
if (IsHttpURL(url)) Process.Start(url);
}
// Check Urls in in richText control
public static bool IsHttpURL(string url)
{
return
((!string.IsNullOrWhiteSpace(url)) &&
(url.ToLower().StartsWith("http")));
}
}
}
+254
View File
@@ -0,0 +1,254 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Flyby11
{
public class IsoHandler
{
private static readonly HttpClient httpClient = new HttpClient();
private readonly Action<string> _updateStatus;
public IsoHandler(Action<string> updateStatus)
{
_updateStatus = updateStatus;
}
public async Task HandleIso(string isoPath)
{
try
{
_updateStatus("Mounting the ISO... Hang tight!");
await ExecutePowerShellCommand($"Mount-DiskImage -ImagePath \"{isoPath}\"");
string driveLetter = await GetMountedDriveLetter();
if (string.IsNullOrEmpty(driveLetter))
{
_updateStatus("Failed to mount the ISO. Please try again.");
MessageBox.Show("Failed to mount the ISO.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
_updateStatus("ISO mounted successfully! Let's get this Windows 11 ready!");
string setupPath = Path.Combine(driveLetter, "sources", "setupprep.exe");
if (File.Exists(setupPath))
{
await RunSetupWithAdminRights(setupPath);
}
else
{
_updateStatus($"Setup file not found in {driveLetter}. Aborting.");
MessageBox.Show($"Setup file not found in {driveLetter}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
_updateStatus($"Oops! Something went wrong: {ex.Message}");
MessageBox.Show($"Error: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private async Task<string> GetMountedDriveLetter()
{
var drives = DriveInfo.GetDrives();
foreach (var drive in drives)
{
if (drive.DriveType == DriveType.CDRom && drive.IsReady)
{
return drive.Name.Substring(0, 2);
}
}
return null;
}
private async Task ExecutePowerShellCommand(string command)
{
using (var process = new Process())
{
process.StartInfo.FileName = "powershell.exe";
process.StartInfo.Arguments = $"-NoProfile -ExecutionPolicy Bypass -Command \"{command}\"";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
await process.WaitForExitAsync();
}
}
private async Task RunSetupWithAdminRights(string setupPath)
{
try
{
_updateStatus("Starting the setup process with elevated privileges...");
var startInfo = new ProcessStartInfo
{
FileName = "powershell.exe",
Arguments = $"-NoProfile -ExecutionPolicy Bypass -Command \"Start-Process '{setupPath}' -ArgumentList '/product server' -Verb runas\"",
Verb = "runas",
UseShellExecute = true,
CreateNoWindow = false
};
_updateStatus("Almost there! We're getting the setup ready...");
using (var process = Process.Start(startInfo))
{
if (process != null)
{
await process.WaitForExitAsync();
}
}
_updateStatus("You're ready to install Windows 11 on unsupported hardware! Ignore the 'Windows Server' prompt; you're all set!");
MessageBox.Show("Windows 11 installation can now proceed. Please follow the instructions in the setup window.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
_updateStatus($"Error: {ex.Message}");
MessageBox.Show($"Error: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Create unattend.xml file in the sources\$OEM$\$$\Panther directory
/// </summary>
/// <param name="usbDrive">The USB drive where the unattend.xml will be created.</param>
public void CreateUnattendXml(string usbDrive)
{
string unattendDir = Path.Combine(usbDrive, "sources", "$OEM$", "$$", "Panther");
Directory.CreateDirectory(unattendDir); // Create the directory if it doesn't exist
string unattendPath = Path.Combine(unattendDir, "unattend.xml");
// Check if the file already exists
if (!File.Exists(unattendPath))
{
// Create the unattend.xml content
string xmlContent = @"<unattend xmlns='urn:schemas-microsoft-com:unattend'>
<settings pass='disabled'>
<component xmlns:wcm='http://schemas.microsoft.com/WMIConfig/2002/State' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' name='Microsoft-Windows-Setup' processorArchitecture='amd64' language='neutral' publicKeyToken='31bf3856ad364e35' versionScope='nonSxS'>
<UserData>
<ProductKey>
<Key/>
</ProductKey>
</UserData>
<RunSynchronous>
<RunSynchronousCommand wcm:action='add'>
<Order>1</Order>
<Path>reg add HKLM\SYSTEM\Setup\LabConfig /v BypassTPMCheck /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action='add'>
<Order>2</Order>
<Path>reg add HKLM\SYSTEM\Setup\LabConfig /v BypassSecureBootCheck /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action='add'>
<Order>3</Order>
<Path>reg add HKLM\SYSTEM\Setup\LabConfig /v BypassRAMCheck /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
</settings>
<settings pass='specialize'>
<component xmlns:wcm='http://schemas.microsoft.com/WMIConfig/2002/State' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' name='Microsoft-Windows-Deployment' processorArchitecture='amd64' language='neutral' publicKeyToken='31bf3856ad364e35' versionScope='nonSxS'>
<RunSynchronous>
<RunSynchronousCommand wcm:action='add'>
<Order>1</Order>
<Path>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE /v BypassNRO /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
</settings>
</unattend>";
File.WriteAllText(unattendPath, xmlContent);
_updateStatus("Created unattend.xml in the sources\\$OEM$\\$$\\Panther directory.");
}
else
{
_updateStatus("unattend.xml already exists in the sources\\$OEM$\\$$\\Panther directory.");
// Display a message box to inform the user
MessageBox.Show("The patch has already been applied. The 'unattend.xml' file already exists in the specified directory.",
"Patch Already Applied",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
/// <summary>
/// Downloads a specified tool (Media Creation Tool or Installation Assistant) from a provided URL.
/// </summary>
/// <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>
public async Task DownloadMediaTool(string downloadUrl, string fileName)
{
using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{
saveFileDialog.Filter = "Executable Files (*.exe)|*.exe";
saveFileDialog.Title = $"Save {fileName}";
saveFileDialog.FileName = fileName;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string destinationPath = saveFileDialog.FileName;
try
{
_updateStatus($"Preparing to download {fileName}...");
_updateStatus("Download may take some time, please wait...");
var response = await httpClient.GetAsync(downloadUrl);
response.EnsureSuccessStatusCode();
using (var fileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None))
{
await response.Content.CopyToAsync(fileStream);
}
_updateStatus($"{fileName} download completed successfully!");
// Start the downloaded tool
_updateStatus($"Starting {fileName}...");
Process.Start(new ProcessStartInfo
{
FileName = destinationPath,
UseShellExecute = true // To run .exe files
});
}
catch (Exception ex)
{
_updateStatus($"An error occurred while downloading {fileName}: {ex.Message}");
}
}
else
{
_updateStatus($"{fileName} download canceled by user.");
}
}
}
}
public static class ProcessExtensions
{
public static async Task WaitForExitAsync(this Process process)
{
var tcs = new TaskCompletionSource<bool>();
process.EnableRaisingEvents = true;
process.Exited += (sender, args) => tcs.TrySetResult(true);
await tcs.Task;
}
}
}
+118 -214
View File
@@ -1,4 +1,4 @@
namespace FlybyScript
namespace Flyby11
{
partial class MainForm
{
@@ -28,256 +28,160 @@
/// </summary>
private void InitializeComponent()
{
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.btnTogglePatch = new System.Windows.Forms.Button();
this.linkGitHub = new System.Windows.Forms.LinkLabel();
this.btnMountRun = new System.Windows.Forms.Button();
this.lblHeader = new System.Windows.Forms.Label();
this.panelDragDrop = new System.Windows.Forms.Panel();
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
this.linkLabel2 = new System.Windows.Forms.LinkLabel();
this.linkCompPatch = new System.Windows.Forms.LinkLabel();
this.statusLabel = new System.Windows.Forms.Label();
this.panelFAQ = new System.Windows.Forms.Panel();
this.linkAppDev = new System.Windows.Forms.LinkLabel();
this.panelContainer = new System.Windows.Forms.Panel();
this.panelMain = new System.Windows.Forms.Panel();
this.checkInstallationMedia = new System.Windows.Forms.CheckBox();
this.linkChangeExperience = new System.Windows.Forms.LinkLabel();
this.panelForm = new System.Windows.Forms.Panel();
this.panelDragDrop.SuspendLayout();
this.panelContainer.SuspendLayout();
this.panelMain.SuspendLayout();
this.panelForm.SuspendLayout();
this.SuspendLayout();
//
// treeSettings
// panelDragDrop
//
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
//
this.rtbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.rtbDescription.BackColor = System.Drawing.Color.White;
this.rtbDescription.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.rtbDescription.Font = new System.Drawing.Font("Segoe UI Variable Small Light", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.rtbDescription.ForeColor = System.Drawing.Color.Black;
this.rtbDescription.Location = new System.Drawing.Point(34, 346);
this.rtbDescription.Name = "rtbDescription";
this.rtbDescription.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
this.rtbDescription.Size = new System.Drawing.Size(867, 123);
this.rtbDescription.TabIndex = 199;
this.rtbDescription.TabStop = false;
this.rtbDescription.Text = "";
//
// btnTogglePatch
//
this.btnTogglePatch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnTogglePatch.BackColor = System.Drawing.Color.White;
this.btnTogglePatch.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnTogglePatch.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnTogglePatch.FlatAppearance.BorderSize = 2;
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.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F);
this.btnTogglePatch.Location = new System.Drawing.Point(629, 484);
this.btnTogglePatch.Name = "btnTogglePatch";
this.btnTogglePatch.Size = new System.Drawing.Size(222, 40);
this.btnTogglePatch.TabIndex = 201;
this.btnTogglePatch.TabStop = false;
this.btnTogglePatch.Text = "Start";
this.btnTogglePatch.UseCompatibleTextRendering = true;
this.btnTogglePatch.UseVisualStyleBackColor = false;
this.btnTogglePatch.Click += new System.EventHandler(this.btnTogglePatch_Click);
//
// linkGitHub
//
this.linkGitHub.ActiveLinkColor = System.Drawing.Color.RoyalBlue;
this.linkGitHub.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.linkGitHub.AutoEllipsis = true;
this.linkGitHub.AutoSize = true;
this.linkGitHub.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.75F);
this.linkGitHub.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkGitHub.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(241)))), ((int)(((byte)(65)))), ((int)(((byte)(17)))));
this.linkGitHub.Location = new System.Drawing.Point(167, 558);
this.linkGitHub.Name = "linkGitHub";
this.linkGitHub.Size = new System.Drawing.Size(45, 16);
this.linkGitHub.TabIndex = 202;
this.linkGitHub.TabStop = true;
this.linkGitHub.Text = "GitHub";
this.linkGitHub.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkGitHub_LinkClicked);
//
// btnMountRun
//
this.btnMountRun.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnMountRun.AutoEllipsis = true;
this.btnMountRun.BackColor = System.Drawing.Color.White;
this.btnMountRun.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnMountRun.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
this.btnMountRun.FlatAppearance.BorderSize = 2;
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.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F);
this.btnMountRun.Location = new System.Drawing.Point(403, 484);
this.btnMountRun.Name = "btnMountRun";
this.btnMountRun.Size = new System.Drawing.Size(220, 40);
this.btnMountRun.TabIndex = 203;
this.btnMountRun.TabStop = false;
this.btnMountRun.Text = "Mount and Run ISO";
this.btnMountRun.UseVisualStyleBackColor = false;
this.btnMountRun.Click += new System.EventHandler(this.btnMountRun_Click);
//
// 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 Light", 21.25F);
this.lblHeader.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.lblHeader.Location = new System.Drawing.Point(30, 38);
this.lblHeader.Name = "lblHeader";
this.lblHeader.Size = new System.Drawing.Size(780, 82);
this.lblHeader.TabIndex = 205;
this.lblHeader.Text = "Use FlybyScript to bypass Windows 11 restrictions and install on unsupported devi" +
"ces";
this.panelDragDrop.AllowDrop = true;
this.panelDragDrop.Anchor = System.Windows.Forms.AnchorStyles.None;
this.panelDragDrop.Controls.Add(this.linkLabel1);
this.panelDragDrop.Controls.Add(this.linkCompPatch);
this.panelDragDrop.Controls.Add(this.statusLabel);
this.panelDragDrop.Location = new System.Drawing.Point(47, 184);
this.panelDragDrop.Name = "panelDragDrop";
this.panelDragDrop.Size = new System.Drawing.Size(436, 256);
this.panelDragDrop.TabIndex = 0;
this.panelDragDrop.DragDrop += new System.Windows.Forms.DragEventHandler(this.panelDragDrop_DragDrop);
this.panelDragDrop.DragEnter += new System.Windows.Forms.DragEventHandler(this.panelDragDrop_DragEnter);
this.panelDragDrop.Paint += new System.Windows.Forms.PaintEventHandler(this.panelDragDrop_Paint);
//
// linkLabel1
//
this.linkLabel1.ActiveLinkColor = System.Drawing.Color.RoyalBlue;
this.linkLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.linkLabel1.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
this.linkLabel1.AutoEllipsis = true;
this.linkLabel1.AutoSize = true;
this.linkLabel1.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.75F);
this.linkLabel1.BackColor = System.Drawing.Color.Transparent;
this.linkLabel1.Cursor = System.Windows.Forms.Cursors.Hand;
this.linkLabel1.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F);
this.linkLabel1.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkLabel1.LinkColor = System.Drawing.Color.Gray;
this.linkLabel1.Location = new System.Drawing.Point(31, 558);
this.linkLabel1.Location = new System.Drawing.Point(141, 230);
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.Size = new System.Drawing.Size(119, 16);
this.linkLabel1.TabIndex = 206;
this.linkLabel1.Size = new System.Drawing.Size(157, 15);
this.linkLabel1.TabIndex = 1;
this.linkLabel1.TabStop = true;
this.linkLabel1.Text = "A Belim app creation";
this.linkLabel1.Text = "Can I upgrade to Windows 11?";
this.linkLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
//
// linkLabel2
// linkCompPatch
//
this.linkLabel2.ActiveLinkColor = System.Drawing.Color.RoyalBlue;
this.linkLabel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.linkLabel2.AutoEllipsis = true;
this.linkLabel2.AutoSize = true;
this.linkLabel2.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.75F);
this.linkLabel2.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
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.Name = "linkLabel2";
this.linkLabel2.Size = new System.Drawing.Size(44, 16);
this.linkLabel2.TabIndex = 208;
this.linkLabel2.TabStop = true;
this.linkLabel2.Text = "0.13.81";
this.linkCompPatch.ActiveLinkColor = System.Drawing.Color.BlueViolet;
this.linkCompPatch.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
this.linkCompPatch.AutoSize = true;
this.linkCompPatch.BackColor = System.Drawing.Color.Transparent;
this.linkCompPatch.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.linkCompPatch.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkCompPatch.LinkColor = System.Drawing.Color.DimGray;
this.linkCompPatch.Location = new System.Drawing.Point(95, 208);
this.linkCompPatch.Name = "linkCompPatch";
this.linkCompPatch.Size = new System.Drawing.Size(244, 15);
this.linkCompPatch.TabIndex = 211;
this.linkCompPatch.TabStop = true;
this.linkCompPatch.Text = "Apply Compatibility Patch to ISO (Clean Install)";
this.linkCompPatch.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkCompPatch_LinkClicked);
//
// statusLabel
//
this.statusLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
this.statusLabel.AutoEllipsis = true;
this.statusLabel.BackColor = System.Drawing.Color.Transparent;
this.statusLabel.Font = new System.Drawing.Font("Segoe UI Variable Text Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.statusLabel.Location = new System.Drawing.Point(39, 44);
this.statusLabel.Name = "statusLabel";
this.statusLabel.Size = new System.Drawing.Size(352, 139);
this.statusLabel.TabIndex = 0;
this.statusLabel.Text = "Move ISO here";
this.statusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// panelFAQ
//
this.panelFAQ.AutoScroll = true;
this.panelFAQ.BackColor = System.Drawing.Color.Gainsboro;
this.panelFAQ.Dock = System.Windows.Forms.DockStyle.Right;
this.panelFAQ.Location = new System.Drawing.Point(561, 0);
this.panelFAQ.Name = "panelFAQ";
this.panelFAQ.Size = new System.Drawing.Size(359, 585);
this.panelFAQ.TabIndex = 207;
//
// linkAppDev
//
this.linkAppDev.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.linkAppDev.AutoSize = true;
this.linkAppDev.BackColor = System.Drawing.Color.Gainsboro;
this.linkAppDev.Font = new System.Drawing.Font("Segoe UI Variable Small", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.linkAppDev.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkAppDev.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(35)))), ((int)(((byte)(115)))), ((int)(((byte)(193)))));
this.linkAppDev.Location = new System.Drawing.Point(821, -1);
this.linkAppDev.Name = "linkAppDev";
this.linkAppDev.Size = new System.Drawing.Size(99, 15);
this.linkAppDev.TabIndex = 208;
this.linkAppDev.TabStop = true;
this.linkAppDev.Text = "We live on GitHub";
this.linkAppDev.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkAppDev_LinkClicked);
//
// panelContainer
//
this.panelContainer.Controls.Add(this.panelMain);
this.panelContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelContainer.Location = new System.Drawing.Point(0, 0);
this.panelContainer.Name = "panelContainer";
this.panelContainer.Size = new System.Drawing.Size(561, 585);
this.panelContainer.TabIndex = 209;
//
// panelMain
//
this.panelMain.Controls.Add(this.checkInstallationMedia);
this.panelMain.Controls.Add(this.linkLabel2);
this.panelMain.Controls.Add(this.linkChangeExperience);
this.panelMain.Controls.Add(this.lblHeader);
this.panelMain.Controls.Add(this.linkLabel1);
this.panelMain.Controls.Add(this.rtbDescription);
this.panelMain.Controls.Add(this.treeSettings);
this.panelMain.Controls.Add(this.btnMountRun);
this.panelMain.Controls.Add(this.btnTogglePatch);
this.panelMain.Controls.Add(this.linkGitHub);
this.panelMain.Controls.Add(this.panelDragDrop);
this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelMain.Location = new System.Drawing.Point(0, 0);
this.panelMain.Name = "panelMain";
this.panelMain.Size = new System.Drawing.Size(943, 592);
this.panelMain.TabIndex = 209;
//
// checkInstallationMedia
//
this.checkInstallationMedia.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.checkInstallationMedia.AutoSize = true;
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.Name = "checkInstallationMedia";
this.checkInstallationMedia.Size = new System.Drawing.Size(245, 17);
this.checkInstallationMedia.TabIndex = 209;
this.checkInstallationMedia.Text = "I want to create Windows 11 installation media";
this.checkInstallationMedia.UseVisualStyleBackColor = true;
this.checkInstallationMedia.CheckedChanged += new System.EventHandler(this.checkInstallationMedia_CheckedChanged);
//
// linkChangeExperience
//
this.linkChangeExperience.ActiveLinkColor = System.Drawing.Color.RoyalBlue;
this.linkChangeExperience.AutoEllipsis = true;
this.linkChangeExperience.AutoSize = true;
this.linkChangeExperience.Font = new System.Drawing.Font("Segoe UI Variable Small Semilig", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.linkChangeExperience.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
this.linkChangeExperience.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.linkChangeExperience.Location = new System.Drawing.Point(33, 139);
this.linkChangeExperience.Name = "linkChangeExperience";
this.linkChangeExperience.Size = new System.Drawing.Size(209, 16);
this.linkChangeExperience.TabIndex = 1;
this.linkChangeExperience.TabStop = true;
this.linkChangeExperience.Text = "Change how you experience Windows";
this.linkChangeExperience.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkChangeExperience_LinkClicked);
this.linkChangeExperience.Paint += new System.Windows.Forms.PaintEventHandler(this.linkChangeExperience_Paint);
//
// panelForm
//
this.panelForm.Controls.Add(this.panelMain);
this.panelForm.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelForm.Location = new System.Drawing.Point(0, 0);
this.panelForm.Name = "panelForm";
this.panelForm.Size = new System.Drawing.Size(943, 592);
this.panelForm.TabIndex = 210;
this.panelMain.Size = new System.Drawing.Size(561, 585);
this.panelMain.TabIndex = 1;
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.BackColor = System.Drawing.Color.White;
this.ClientSize = new System.Drawing.Size(943, 592);
this.Controls.Add(this.panelForm);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.AutoScroll = true;
this.BackColor = System.Drawing.Color.WhiteSmoke;
this.ClientSize = new System.Drawing.Size(920, 585);
this.Controls.Add(this.linkAppDev);
this.Controls.Add(this.panelContainer);
this.Controls.Add(this.panelFAQ);
this.Name = "MainForm";
this.Text = "Flyby11";
this.Load += new System.EventHandler(this.MainForm_Load);
this.ShowIcon = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Flyby11 Upgrading Assistant";
this.panelDragDrop.ResumeLayout(false);
this.panelDragDrop.PerformLayout();
this.panelContainer.ResumeLayout(false);
this.panelMain.ResumeLayout(false);
this.panelMain.PerformLayout();
this.panelForm.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TreeView treeSettings;
public System.Windows.Forms.RichTextBox rtbDescription;
private System.Windows.Forms.Button btnTogglePatch;
private System.Windows.Forms.LinkLabel linkGitHub;
private System.Windows.Forms.Button btnMountRun;
private System.Windows.Forms.Label lblHeader;
private System.Windows.Forms.LinkLabel linkLabel1;
private System.Windows.Forms.LinkLabel linkLabel2;
private System.Windows.Forms.Panel panelDragDrop;
private System.Windows.Forms.Label statusLabel;
private System.Windows.Forms.Panel panelFAQ;
private System.Windows.Forms.LinkLabel linkAppDev;
private System.Windows.Forms.LinkLabel linkCompPatch;
private System.Windows.Forms.Panel panelContainer;
private System.Windows.Forms.Panel panelMain;
private System.Windows.Forms.LinkLabel linkChangeExperience;
private System.Windows.Forms.Panel panelForm;
private System.Windows.Forms.CheckBox checkInstallationMedia;
private System.Windows.Forms.LinkLabel linkLabel1;
}
}
+105 -190
View File
@@ -1,235 +1,150 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using Views;
namespace FlybyScript
namespace Flyby11
{
public partial class MainForm : Form
{
private Dictionary<TreeNode, bool> pendingChanges = new Dictionary<TreeNode, bool>(); // Store pending changes
private PSPatcher PSPatcher;
private Logger logger;
private readonly IsoHandler _isoHandler;
private readonly FAQHandler _faqHandler;
public MainForm()
{
InitializeComponent();
_isoHandler = new IsoHandler(UpdateStatusLabel);
_faqHandler = new FAQHandler(panelFAQ, UpdateStatusLabel);
_faqHandler.InitializeFAQ();
// Initialize the logger
logger = new Logger(rtbDescription);
// Set the default view to the main panel
SwitchView.DefaultView = panelMain;
UpdateStatusLabel("Drag and drop the Windows 11 ISO to patch it and install on unsupported hardware (Inplace Upgrade).");
}
private async void MainForm_Load(object sender, EventArgs e)
private void panelDragDrop_Paint(object sender, PaintEventArgs e)
{
// Add NativePatcher parent node
TreeNode nativePatcherNode = new TreeNode("Native (Recommended)");
treeSettings.Nodes.Add(nativePatcherNode);
var borderColor = Color.DodgerBlue;
var borderThickness = 6;
// Add Method 1 as a child of NativePatcher
TreeNode method1Node = new TreeNode("(Method 1) Inplace Upgrade via Server Setup");
method1Node.Tag = "Method1";
nativePatcherNode.Nodes.Add(method1Node);
// Add ScriptPatcher parent node
await ScriptPatcher.LoadPlugins("upgraider", treeSettings.Nodes, logger);
// Add PSPatcher parent node (for Dependencies)
PSPatcher = new PSPatcher();
PSPatcher.LoadPowerShellPlugins(treeSettings);
// Expand all nodes
ExpandAllNodes(treeSettings.Nodes);
}
private void ExpandAllNodes(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
// Draw a dotted border
var dashPattern = new float[] { 4, 2 }; // Dots and gaps
using (var pen = new Pen(borderColor, borderThickness))
{
node.Expand();
ExpandAllNodes(node.Nodes);
pen.DashPattern = dashPattern;
pen.Alignment = System.Drawing.Drawing2D.PenAlignment.Center;
var rect = new Rectangle(
borderThickness / 2,
borderThickness / 2,
panelDragDrop.Width - borderThickness,
panelDragDrop.Height - borderThickness
);
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
e.Graphics.DrawRectangle(pen, rect);
}
using (var shadowBrush = new SolidBrush(Color.FromArgb(30, 0, 0, 0))) // Transparent shadow
{
var shadowRect = new Rectangle(6, 6, panelDragDrop.Width, panelDragDrop.Height);
e.Graphics.FillRectangle(shadowBrush, shadowRect);
}
}
private void treeSettings_AfterCheck(object sender, TreeViewEventArgs e)
private void panelDragDrop_DragEnter(object sender, DragEventArgs e)
{
// Check if the node's checked status has changed
if (e.Node.Checked)
// Check if the file is an ISO
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
// 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)
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files.Length == 1 && Path.GetExtension(files[0]).Equals(".iso", StringComparison.OrdinalIgnoreCase))
{
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)
{
btnTogglePatch.Enabled = false;
foreach (var entry in pendingChanges)
{
var node = entry.Key; // So, The TreeNode
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
if (node.Tag?.ToString() == "Method1" && shouldApply)
{
// Start Method2 (Setup Server variant)
logger.Log("(Method 1) Automating Windows 11 Inplace Upgrade...", Color.Blue);
NativePatcher automation = new NativePatcher(logger);
await automation.AutomateWindowsInstallation();
node.BackColor = Color.LightGreen;
logger.Log("Method 1 Started: Windows 11 Installation Automated", Color.Black);
}
else if (node.Tag is ScriptPatcher plugin)
{
if (shouldApply)
{
// Apply the patch
logger.Log($"Applying patch: {plugin.PlugID}", Color.Blue);
plugin.PlugDoFeature();
node.BackColor = Color.LightGreen;
logger.Log($"Activated patch: {plugin.PlugID}", Color.Black);
}
else
{
// Undo the patch
logger.Log($"Undoing patch: {plugin.PlugID}", Color.Blue);
plugin.PlugUndoFeature();
node.BackColor = Color.LightGray;
logger.Log($"Deactivated patch: {plugin.PlugID}", Color.Crimson);
}
}
// Handle PowerShell scripts
else if (node.Tag is string psScriptPath)
{
if (shouldApply)
{
// Log and execute the PowerShell script
logger.Log($"Executing PowerShell script: {Path.GetFileName(psScriptPath)}", Color.Blue);
var PSPatcher = new PSPatcher();
await PSPatcher.ExecutePlugin(psScriptPath, logger);
node.BackColor = Color.LightGreen;
logger.Log($"Executed PowerShell script: {Path.GetFileName(psScriptPath)}", Color.Black);
}
else
{
// Log for deactivation (not reversible for PS scripts)
logger.Log($"PowerShell script cannot be undone: {Path.GetFileName(psScriptPath)}", Color.Crimson);
node.BackColor = Color.LightGray;
}
}
}
// Clear pending changes after applying
pendingChanges.Clear();
btnTogglePatch.Enabled = true;
}
private void treeSettings_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
TreeNode node = treeSettings.GetNodeAt(e.Location);
if (node != null)
{
// Check if the node's Tag is the native "Method1"
if (node.Tag?.ToString() == "Method1")
{
rtbDescription.Text = "(Current release: Windows 11 2024 Update l Version 24H2)\nThis method leverages the Windows Server variant of the Windows setup, " +
"which skips most hardware compatibility checks. It allows Windows 11 to be installed on unsupported PCs, " +
"bypassing the usual system requirements. Importantly, while the setup runs in server mode, " +
"it installs the standard Windows 11 (not the server version).\n\nHow it works:\n1. " +
"The app automatically downloads the Windows 11 version 24H2 ISO using the 'Fido' dependency script.\n2. " +
"The ISO image is mounted automatically.\n3. Simply follow the on-screen instructions to complete the upgrade.\n\n" +
"**Technical Note:** The POPCNT requirement cannot be bypassed; it is essential for running Windows 11 (24H2), as the operating system requires this feature to be supported by the CPU. " +
"POPCNT has been included in CPUs since around 2010. However, the patch is expected to work for most users with compatible hardware." +
"Please do not blame me; I am working within the constraints of what is technically possible."
;
}
else if (node.Tag is ScriptPatcher plugin) // Handle JSON plugin description
{
string pluginInfo = $"ID: {plugin.PlugID}\nHow-to:\n{plugin.PlugInfo}";
rtbDescription.Text = pluginInfo;
}
else if (node.Tag is string psScriptPath) // Handle PowerShell script description
{
rtbDescription.Clear();
string scriptInfo = $"PowerShell Script: {Path.GetFileName(psScriptPath)}\nPath: {psScriptPath}";
rtbDescription.Text = scriptInfo;
e.Effect = DragDropEffects.Copy;
}
else
{
// Clear description if no node is hovered
rtbDescription.Clear();
e.Effect = DragDropEffects.None;
}
}
}
private void linkGitHub_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
private async void panelDragDrop_DragDrop(object sender, DragEventArgs e)
{
// Get the dropped file path
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files.Length == 1)
{
string isoPath = files[0]; // Full path to the ISO file
await _isoHandler.HandleIso(isoPath); // Mount the ISO and start the setup process
}
}
// Update the status label
private void UpdateStatusLabel(string message)
{
statusLabel.Text = message;
statusLabel.Refresh(); // Ensure the label updates in real-time
}
private void linkAppDev_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("https://github.com/builtbybel/Flyby11");
}
private async void btnMountRun_Click(object sender, EventArgs e)
private void linkCompPatch_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
NativePatcher patcher = new NativePatcher(logger);
await patcher.RunSetupFromMountedISO();
using (var folderDialog = new FolderBrowserDialog())
{
folderDialog.Description = "Select the USB drive containing your Windows 11 installation files. " +
"This feature adds a compatibility patch to bypass certain system requirements. " +
"Compatible with drives prepared by any tool, including Rufus. Ensure the drive is ready!";
if (folderDialog.ShowDialog() == DialogResult.OK)
{
string selectedPath = folderDialog.SelectedPath;
var driveInfo = new DriveInfo(Path.GetPathRoot(selectedPath));
if (driveInfo.DriveType == DriveType.Removable && driveInfo.IsReady)
{
if (MessageBox.Show("This will apply compatibility bypass settings on the selected USB drive. Continue?",
"Apply Bypass Patch", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
try
{
_isoHandler.CreateUnattendXml(selectedPath);
MessageBox.Show("Bypass patch applied successfully!", "Apply Bypass Patch", MessageBoxButtons.OK, MessageBoxIcon.Information);
UpdateStatusLabel("Bypass patch applied successfully!");
}
catch (Exception ex)
{
UpdateStatusLabel($"Failed to apply bypass patch: {ex.Message}");
}
}
else
{
UpdateStatusLabel("Bypass patch canceled by user.");
}
}
else
{
MessageBox.Show("The selected path is not a removable drive. Please select a USB drive.", "Invalid Selection", MessageBoxButtons.OK, MessageBoxIcon.Error);
UpdateStatusLabel("User attempted to select a non-removable drive.");
}
}
else
{
UpdateStatusLabel("No USB drive selected for patching.");
}
}
}
private void linkChangeExperience_Paint(object sender, PaintEventArgs e)
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
// Linkoption gains focus so trigger a vivid focus rectangle
ControlPaint.DrawFocusRectangle(e.Graphics, linkChangeExperience.ClientRectangle);
CanIUpgradeView canIUpgradeView = new CanIUpgradeView();
SwitchView.SetView(canIUpgradeView, panelContainer);
}
private void linkChangeExperience_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
ExperienceView experienceView = new ExperienceView();
SwitchView.SetView(experienceView, panelForm);
}
private void checkInstallationMedia_CheckedChanged(object sender, EventArgs e)
{
checkInstallationMedia.Checked = false;
MediaView installMediaView = new MediaView();
SwitchView.SetView(installMediaView, panelForm);
}
}
}
-614
View File
@@ -117,618 +117,4 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAXl4AAAEAIACgjgAAFgAAACgAAABeAAAAvAAAAAEAIAAAAAAAEIoAABMLAAATCwAAAAAAAAAA
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
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWlWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//Z0A+OSHAOzNdgIAAAAA///AAPDY
hIn96ZP//+WS/f3ij/3+447//eKL/vziiv/94Yf+/eCF//3fhP/934L//N6B/vzdfv773n39/+iD+v7l
hUT/5H8A/8t0BP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/s0IAFf//AP8i
AAB3+rIC/r5Zs/OjQv/dkzP745Eu/+mhOP/qrUP/8blM//fEVv/6y17t+tVu3PjYecT43YOi+N6FfPfZ
f1P0zHg17st7bvfikub+65v//+WT+/7kkf//5Y/+/uSN/v3jjP7+44n+/eKH//7hhf/94YP//OCB//3f
f//93n3//N57//vdeP/83Hb/+9t1//zbc//72nH++9pu/vrYbP3+5HP//eJzY//gdAD+33IE//dpAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
cv/723H//Npu//vZbP/62Wr++9ho/vrXZv7612X6/dxn//zfaWv62mUA/OZqA///QgD//18AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qlYA/6pWAPq8
XAL90WYA+MtmUfy2UP/1oUH985I3//B9K/7sbyb+4H8v/9aAKf/ZdR/+3oEk/+KLKf7lkiz+5pow/vC3
Q/781GH+/+N7//7ohv7+6ov+//Gj//7yqf7+6pX//+SK//7ihv/94oT//uKC//3hgf/+4H7//d97//zf
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
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/IQAA/i0AAPauUgTyymgA9MRiVvzE
Wv/4uU/8+LVL/vewRf72qT//9aA4//SWMv/yii3/8H8o/+53JP/sbiH/6mMe/+ZgH//Zcib/020c/9lv
G//efB//4YEh/+WPJv/0ujv//tlZ///jbP/+5nT//+6P///riv/+4Xb//t1w//3dbv/93Gv//Nto//3a
Z//82WT//Nlg//vYXv/811v/+9ZZ//rVV//71FT/+9NQ//rST//50Uz++tFL/vvTSvz92Ev/+dVORvvU
SAD94EED//8AAP//JgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6gzAPf/
/wD1t00F8bxVAPTGY3T7v1j/97hR+ve2TP73s0b+96xB//alOv/0nDT/8pEv//GGKv/vfSX/7XQh/+ts
IP/pYR3/5WAe/9dwJP/Tahv/2m8a/958H//hgCD/55Qn//fBP///3Fz//uNp//7oef/+7o///+d+//7f
b//93Gv//dtp//zbZv/82mP//Nlh//zYXv/711v//NZZ//vVVv/61FT/+9NS//rST//60Uz++dBJ/vrQ
SP/60Ef7/NZG//7dSpP/+UoA/+s/Av+7CwD/yjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP/AhQDr0GwA/rlYA/64QgD2xGGV+L1W//e5Uvr4uE3+97RI/vevQv/2qDz/9KA3//OX
Mf/yjiz/8IMo/+56I//scSH/62of/+hfHP/kXh3/1m4j/9JnGv/abxr/3nse/+CAH//pmSj/+sdC///f
Xf/+42f//up+///siP/+43P//txp//3bZ//82mT//dph//zZXv/72Fz//NdZ//zWVv/71VT/+tRR//vS
T//60kz/+dFJ//rQR/76z0X/+tBD/fzTQ//91UPg+tFHE/f/bAD+uzMA/0gAAP9nAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/1sA8r9uAP//JgG786EE/Mhisfm9V//2uVL7+LdO//e1
SP72sEP/9qs+//WkOP/0nDT/85Qu//GKKv/vgSb/7nci/+xvIP/pZx7/6F0a/+NcHf/VayL/0WYY/9pu
Gf/eeh3/4IAe/+ugK//8zkb//99d//7kaf/+7IL//+l+//7eav/922T//Npi//3ZXv/82Fz//NdZ//vW
Vv/81VP/+9RR//rTT//70kz/+tFJ//rQR//5z0T/+c5C/vrPQf/6zj/9/dc///zZRFb92UUA/NlAAv3m
RAD/60YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+716APLIWwGx2mgA47poEfzK
Y8r5v1j/9rlT+/e4UP/2tkr+9rJF//atQP/1pzr/9KA1//OZMP/ykCz/8Icn/+9/JP/tdSL/620e/+lm
HP/nWxn/4Vsc/9NpIP/RYxf/2m0Y/915G//ggB7/76kt//7USf//4F3//uVt//7rgv//5XL//ttj//3Z
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
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
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>
</data>
</root>
-343
View File
@@ -1,343 +0,0 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
/*
* NativePatcher class is responsible for automating the Windows 11 24H2 installation process.
* It uses the Fido.ps1 script https://github.com/pbatard/Fido to download the ISO, mounts the ISO, and runs Server setupprep.exe
*/
namespace FlybyScript
{
public class NativePatcher
{
private Logger _logger;
private string _fidoScriptPath;
public NativePatcher(Logger logger)
{
this._fidoScriptPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "upgraider", "Fido.ps1");
this._logger = logger;
}
public async Task AutomateWindowsInstallation()
{
// Step 1: Download Windows 24H2 ISO using Fido.ps1
await DownloadISO();
// Step 2: Allow user to select the ISO after download
MessageBox.Show("Please select the ISO file to mount.", "ISO Selection", MessageBoxButtons.OK, MessageBoxIcon.Information);
// Step 3: Mount the ISO and get the mounted drive letter
string mountedDriveLetter = await MountISO();
if (string.IsNullOrEmpty(mountedDriveLetter))
{
_logger.Log("Failed to mount ISO. Exiting.", Color.Crimson);
return;
}
// Step 2: Run the setup process with the mounted drive letter
await RunSetup(mountedDriveLetter);
}
// Step 1: Download Windows 24H2 ISO by running the Fido.ps1 script
private async Task DownloadISO()
{
try
{
_logger.Log("Starting the download of the Windows 24H2 ISO...", Color.Blue);
// Run Fido.ps1 to download the ISO (PowerShell script)
string downloadCommand = $"& \"{_fidoScriptPath}\"";
await ExecutePowerShellCommand(downloadCommand);
_logger.Log("Windows 24H2 ISO download completed.", System.Drawing.Color.Green);
MessageBox.Show("Please wait for the ISO file to download, and then select the ISO file.",
"Information",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
_logger.Log("Please wait for the ISO file to download, and then select the ISO file. " +
"If you cancel the process here and wait for the ISO download, you will need to restart the patching process, " +
"but you can skip the ISO download.", System.Drawing.Color.Black);
}
catch (Exception ex)
{
_logger.Log($"Error during ISO download: {ex.Message}", System.Drawing.Color.Crimson);
}
}
private async Task<string> MountISO()
{
try
{
string isoFilePath = SelectISOFile();
if (!string.IsNullOrEmpty(isoFilePath))
{
MessageBox.Show($"Selected ISO file: {isoFilePath}. Now mounting the ISO.", "ISO Selected", MessageBoxButtons.OK, MessageBoxIcon.Information);
_logger.Log($"Mounting ISO: {isoFilePath}...", System.Drawing.Color.Blue);
string mountCommand = $"Mount-DiskImage -ImagePath \"{isoFilePath}\"";
await ExecutePowerShellCommand(mountCommand); // Run asynchronously for mounting
// After mounting, try to get the drive letter
string mountedDriveLetter = await GetMountedDriveLetter();
if (string.IsNullOrEmpty(mountedDriveLetter))
{
_logger.Log("Failed to get mounted drive letter.", System.Drawing.Color.Crimson);
return null;
}
else
{
_logger.Log($"ISO mounted successfully. Drive letter: {mountedDriveLetter}", System.Drawing.Color.Green);
return mountedDriveLetter; // Return the mounted drive letter
}
}
else
{
_logger.Log("No ISO file selected.", System.Drawing.Color.Black);
return null;
}
}
catch (Exception ex)
{
_logger.Log($"Error mounting ISO: {ex.Message}", System.Drawing.Color.Crimson);
return null;
}
}
private async Task RunSetup(string mountedDriveLetter)
{
if (string.IsNullOrEmpty(mountedDriveLetter))
{
_logger.Log("No mounted drive found. Exiting.", System.Drawing.Color.Crimson);
return;
}
// Log the drive letter and build the sources folder path
string sourcesFolderPath = Path.Combine(mountedDriveLetter, "sources");
_logger.Log($"Mounted drive letter: {mountedDriveLetter}", System.Drawing.Color.Gray);
_logger.Log($"Checking Sources folder at: {sourcesFolderPath}", System.Drawing.Color.Gray);
// Check if Sources folder exists
if (!Directory.Exists(sourcesFolderPath))
{
_logger.Log($"Sources folder not found at {sourcesFolderPath}.", System.Drawing.Color.Crimson);
return;
}
await LaunchSetupFromSourcesFolder(sourcesFolderPath);
}
private async Task LaunchSetupFromSourcesFolder(string sourcesFolderPath)
{
var processInfo = new ProcessStartInfo
{
FileName = Path.Combine(sourcesFolderPath, "setupprep.exe"),
Arguments = "/product server",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
try
{
using (var process = Process.Start(processInfo))
{
// Capture output and wait for exit
string output = await process.StandardOutput.ReadToEndAsync();
string error = await process.StandardError.ReadToEndAsync();
await process.WaitForExitAsync();
// Log output and errors if any
if (!string.IsNullOrEmpty(output)) _logger.Log($"Output: {output}", System.Drawing.Color.Gray);
if (!string.IsNullOrEmpty(error)) _logger.Log($"Error: {error}", System.Drawing.Color.Crimson);
}
MessageBox.Show("Follow the Windows Server Setup window now. You can close this message box and the FlybyScript.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
_logger.Log($"Error running setupprep.exe: {ex.Message}", System.Drawing.Color.Crimson);
}
}
public async Task RunSetupFromMountedISO()
{
// Choose an ISO file
string isoFilePath = SelectISOFile();
if (isoFilePath == null) return;
try
{
_logger.Log($"Please wait...", System.Drawing.Color.Crimson);
// Mount the selected ISO
await ExecutePowerShellCommand($"Mount-DiskImage -ImagePath \"{isoFilePath}\"");
// Get the mounted drive letter
string mountedDriveLetter = await GetMountedDriveLetter();
if (string.IsNullOrEmpty(mountedDriveLetter))
{
_logger.Log("Failed to get mounted drive letter.", System.Drawing.Color.Crimson);
return;
}
_logger.Log($"Mounted drive letter: {mountedDriveLetter}", System.Drawing.Color.Gray);
// Define Sources folder path and check if it exists
string sourcesFolderPath = Path.Combine(mountedDriveLetter, "sources");
if (Directory.Exists(sourcesFolderPath))
{
await LaunchSetupFromSourcesFolder(sourcesFolderPath);
}
else
{
_logger.Log($"Sources folder not found at {sourcesFolderPath}.", System.Drawing.Color.Crimson);
}
}
catch (Exception ex)
{
_logger.Log($"Error mounting ISO or launching setup: {ex.Message}", System.Drawing.Color.Crimson);
}
}
private void ProcessStart(string command)
{
try
{
using (var process = new Process())
{
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = command;
process.StartInfo.UseShellExecute = true;
process.StartInfo.CreateNoWindow = false;
// Start the process
process.Start();
// Wait for the process to finish
process.WaitForExit();
}
}
catch (Exception ex)
{
_logger.Log($"Error executing CMD command: {ex.Message}", System.Drawing.Color.Crimson);
}
}
private async Task<string> ExecutePowerShellCommand(string command)
{
try
{
using (var process = new Process())
{
process.StartInfo.FileName = "powershell.exe";
process.StartInfo.Arguments = $"-NoProfile -ExecutionPolicy Bypass -Command \"{command}\"";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
// Output and error handlers
var outputBuilder = new StringBuilder();
var errorBuilder = new StringBuilder();
process.OutputDataReceived += (sender, args) =>
{
if (args.Data != null)
{
outputBuilder.AppendLine(args.Data); // Collect output data
_logger.Log(args.Data, System.Drawing.Color.LightPink);
}
};
process.ErrorDataReceived += (sender, args) =>
{
if (args.Data != null)
{
errorBuilder.AppendLine(args.Data); // Collect error data
_logger.Log(args.Data, System.Drawing.Color.Crimson);
}
};
// Start the process
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
// Wait for the process to exit
await Task.Run(() => process.WaitForExit());
// Combine the full output and error logs
string output = outputBuilder.ToString();
string error = errorBuilder.ToString();
if (!string.IsNullOrEmpty(error))
{
_logger.Log(error, System.Drawing.Color.Crimson);
}
// Return the entire output of ps command
return output;
}
}
catch (Exception ex)
{
_logger.Log($"PowerShell command execution failed: {ex.Message}", System.Drawing.Color.Crimson);
return string.Empty; // Return an empty string if an error occurs
}
}
// Get the mounted drive letter
private async Task<string> GetMountedDriveLetter()
{
try
{
// List all the drives to find the mounted drive letter
var drives = DriveInfo.GetDrives();
foreach (var drive in drives)
{
// Check if the drive is a CD/DVD and if it's mounted
if (drive.DriveType == DriveType.CDRom && drive.IsReady)
{
// Return the letter of the mounted drive
return drive.Name.Substring(0, 2);
}
}
return null; // Return null if no mounted drive is found
}
catch (Exception ex)
{
_logger.Log($"Error getting mounted drive letter: {ex.Message}", System.Drawing.Color.Crimson);
return null;
}
}
private string SelectISOFile()
{
using (var openFileDialog = new OpenFileDialog
{
Title = "Select Windows 11 ISO File",
Filter = "ISO Files (*.iso)|*.iso|All Files (*.*)|*.*",
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer)
})
{
return openFileDialog.ShowDialog() == DialogResult.OK ? openFileDialog.FileName : null;
}
}
}
}
-98
View File
@@ -1,98 +0,0 @@
using FlybyScript;
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
public class PSPatcher
{
public void LoadPowerShellPlugins(TreeView treeView)
{
var scriptDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "upgraider");
if (!Directory.Exists(scriptDirectory))
{
MessageBox.Show("upgraider directory does not exist.");
return;
}
// Create a Dependencies category in the TreeView
TreeNode dependencyCategory = new TreeNode("Dependencies");
treeView.Nodes.Add(dependencyCategory);
var scriptFiles = Directory.GetFiles(scriptDirectory, "*.ps1");
foreach (var file in scriptFiles)
{
var scriptName = Path.GetFileNameWithoutExtension(file);
// Create a TreeNode for each ps script
var scriptNode = new TreeNode
{
ToolTipText = file,
Text = $"{scriptName} [PS]",
Tag = file // Store the file path as the Tag
};
// Add the script node to the Dependecy category
dependencyCategory.Nodes.Add(scriptNode);
}
}
// Execute the selected PowerShell script
public async Task ExecutePlugin(string pluginPath, Logger logger)
{
try
{
using (var process = new Process())
{
process.StartInfo.FileName = "powershell.exe";
process.StartInfo.Arguments = $"-NoProfile -ExecutionPolicy Bypass -File \"{pluginPath}\"";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
var outputBuilder = new StringBuilder();
var errorBuilder = new StringBuilder();
// Handle output from PowerShell script
process.OutputDataReceived += (sender, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
{
outputBuilder.AppendLine(e.Data);
logger.Log($"PowerShell script output: {e.Data}", System.Drawing.Color.Black);
}
};
// Handle error from PowerShell script
process.ErrorDataReceived += (sender, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
{
errorBuilder.AppendLine(e.Data);
logger.Log($"PowerShell script error: {e.Data}", System.Drawing.Color.Crimson);
}
};
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
await Task.Run(() =>
{
process.WaitForExit();
});
logger.Log($"PowerShell script executed successfully: {pluginPath}", System.Drawing.Color.Green);
}
}
catch (Exception ex)
{
logger.Log($"Error executing PowerShell script: {pluginPath}. Exception: {ex.Message}", System.Drawing.Color.Crimson);
}
}
}
-238
View File
@@ -1,238 +0,0 @@
using Newtonsoft.Json;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
/*
* Imported from my xd-AntiSpy app https://github.com/builtbybel/xd-AntiSpy
*/
namespace FlybyScript
{
public class ScriptPatcher
{
public string PlugID { get; set; }
public string PlugInfo { get; set; }
public string[] PlugCheck { get; set; }
public string[] PlugDo { get; set; }
public string[] PlugUndo { get; set; }
public string PlugCategory { get; set; }
private Logger logger;
public ScriptPatcher(Logger logger)
{
this.logger = logger;
}
public bool PlugCheckFeature()
{
bool isFeatureActive = true;
foreach (var command in PlugCheck)
{
if (!ExecuteCommandAndCheckResult(command))
{
isFeatureActive = false;
break;
}
}
logger.Log($"Feature '{PlugID}' is {(isFeatureActive ? "active" : "inactive")}", System.Drawing.Color.Black);
return isFeatureActive;
}
// PlugCheck Helper to execute commands and check the result
private bool ExecuteCommandAndCheckResult(string command)
{
try
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = $"/c {command}",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
process.Start();
process.WaitForExit();
// Read the output of the command
string output = process.StandardOutput.ReadToEnd();
// Check if output contains "1" (indicating active) or "0" (indicating inactive)
bool isActive = output.Contains("1");
// logger.Log($"Plugin executed successfully: {command}. Result: {(isActive ? "active" : "inactive")}", System.Drawing.Color.Black);
return isActive;
}
catch (Exception ex)
{
logger.Log($"Error executing plugin: {command}. Exception: {ex.Message}", System.Drawing.Color.Crimson);
return false;
}
}
public async void PlugDoFeature()
{
await ExecuteFeatureCommands(PlugDo);
}
public async void PlugUndoFeature()
{
await ExecuteFeatureCommands(PlugUndo);
}
private async Task ExecuteFeatureCommands(string[] commands)
{
foreach (var command in commands)
{
await ExecuteCommand(command);
}
}
private async Task ExecuteCommand(string command)
{
try
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = IsPowerShellCommand(command) ? "powershell.exe" : "cmd.exe",
Arguments = IsPowerShellCommand(command) ? $"-Command \"{command}\"" : $"/c \"{command}\"",
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
// Event handler for handling output data
process.OutputDataReceived += (sender, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
{
logger.Log($"Output: {e.Data}", System.Drawing.Color.Green);
}
};
// Event handler for handling error data
process.ErrorDataReceived += (sender, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
{
logger.Log($"Error: {e.Data}", System.Drawing.Color.Crimson);
}
};
process.Start();
// Begin asynchronous reading of the output and error streams
process.BeginOutputReadLine();
process.BeginErrorReadLine();
// Wait for the process to exit
await process.WaitForExitAsync();
// Log command execution
logger.Log($"Plugin executed command: {command}", System.Drawing.Color.Green);
}
catch (Exception ex)
{
logger.Log($"Error executing plugin: {command}. Exception: {ex.Message}", System.Drawing.Color.Crimson);
}
}
// Determine if our command should be run with PowerShell
private bool IsPowerShellCommand(string command)
{
return command.StartsWith("powershell.exe") || command.Contains("Get-") || command.Contains("Set-");
}
// Get plugin information
public string GetPluginInformation()
{
return $"{PlugInfo.Replace("\\n", Environment.NewLine)}";
}
private static void AddToPluginCategory(TreeNodeCollection pluginCategory, TreeNode node, string category)
{
if (pluginCategory == null)
throw new ArgumentNullException(nameof(pluginCategory));
var existingCategory = pluginCategory.Cast<TreeNode>().FirstOrDefault(n => n.Text == category);
if (existingCategory == null)
{
existingCategory = new TreeNode(category)
{
BackColor = System.Drawing.Color.LightBlue,
ForeColor = System.Drawing.Color.Black
};
pluginCategory.Add(existingCategory);
}
existingCategory.Nodes.Add(node);
}
public static async Task LoadPlugins(string pluginDirectory, TreeNodeCollection pluginCategory, Logger logger)
{
if (Directory.Exists(pluginDirectory))
{
var pluginFiles = Directory.GetFiles(pluginDirectory, "*.json");
foreach (var file in pluginFiles)
{
// Exclude JSON files of our DLL Plugins as they are loaded separately
if (Path.GetFileName(file).IndexOf("Plugin", StringComparison.OrdinalIgnoreCase) >= 0)
continue;
try
{
var json = File.ReadAllText(file);
var plugin = JsonConvert.DeserializeObject<ScriptPatcher>(json);
if (plugin != null)
{
plugin.logger = logger; // Set logger for the plugin
// Execute all commands for the plugin to check its feature
bool isActive = plugin.PlugCheckFeature();
var pluginNode = new TreeNode(plugin.PlugID)
{
ToolTipText = plugin.PlugInfo,
Checked = isActive,
Tag = plugin // Store plugin object in Tag property
};
// Add to the appropriate category
AddToPluginCategory(pluginCategory, pluginNode, plugin.PlugCategory);
}
}
catch (Exception ex)
{
logger.Log($"Error loading plugin from file '{file}': {ex.Message}", System.Drawing.Color.Crimson);
}
}
}
}
}
}
// Extension method to make WaitForExit async in ExecuteCommand
public static class ProcessExtensions
{
public static async Task WaitForExitAsync(this Process process)
{
var tcs = new TaskCompletionSource<bool>();
process.EnableRaisingEvents = true;
process.Exited += (sender, args) => tcs.TrySetResult(true);
await tcs.Task;
}
}
+9 -3
View File
@@ -1,16 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FlybyScript
namespace Flyby11
{
internal static class Program
{
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
private static void Main()
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
}
+5 -4
View File
@@ -1,4 +1,5 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
@@ -7,7 +8,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyTitle("Flyby11")]
[assembly: AssemblyDescription("Bypassing Windows 11 hardware requirements")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Builtbybel")]
[assembly: AssemblyCompany("A Belim app creation")]
[assembly: AssemblyProduct("Flyby11")]
[assembly: AssemblyCopyright("Copyright © 2024 A Belim app creation")]
[assembly: AssemblyTrademark("Builtbybel")]
@@ -19,7 +20,7 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("66ddc36a-9095-4053-941c-8829d44f5f20")]
[assembly: Guid("503af34b-7544-4c43-a099-2b948c3ff49a")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
@@ -28,5 +29,5 @@ using System.Runtime.InteropServices;
// Buildnummer
// Revision
//
[assembly: AssemblyVersion("0.13.81")]
[assembly: AssemblyFileVersion("0.13.81")]
[assembly: AssemblyVersion("1.2.100.0")]
[assembly: AssemblyFileVersion("1.2.100.0")]
+2 -2
View File
@@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace FlybyScript.Properties {
namespace Flyby11.Properties {
using System;
@@ -39,7 +39,7 @@ namespace FlybyScript.Properties {
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FlybyScript.Properties.Resources", typeof(Resources).Assembly);
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Flyby11.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
+2 -2
View File
@@ -8,11 +8,11 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace FlybyScript.Properties {
namespace Flyby11.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.12.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
File renamed without changes.
-441
View File
@@ -1,441 +0,0 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FlybyScript
{
public class USBManagement
{
private readonly Logger _logger;
private ProgressBar _progressBar;
public Action<string> UpdateLabelStatus;
private int currentStep = 0;
private static readonly HttpClient httpClient = new HttpClient();
public USBManagement(Logger logger, Action<string> updateLabelStatus, ProgressBar progressBar)
{
_logger = logger;
_progressBar = progressBar;
UpdateLabelStatus = updateLabelStatus; // Set the delegate to update UI
}
private string[] steps = new[]
{
"Format and Boot USB Drive",
"Mount ISO",
"Copy ISO to USB",
"Split Install.wim",
"Finalize Installation Media (Install.wim)"
};
/// <summary>
/// Updates the LabelStatus with the current step
/// </summary>
public void UpdateStatusLabel()
{
currentStep++;
if (currentStep <= steps.Length)
{
string statusText = $"{currentStep}/{steps.Length} - {steps[currentStep - 1]}";
// Call the delegate to update the label in the user control
UpdateLabelStatus?.Invoke(statusText);
// Log to the logger as well
_logger.Log($"Step {currentStep}: {steps[currentStep - 1]} started.", Color.Blue);
}
}
/// <summary>
/// Updates the progress bar with the specified value
/// </summary>
private void UpdateProgress(int value)
{
if (_progressBar.InvokeRequired)
{
_progressBar.Invoke(new Action(() => _progressBar.Value = value));
}
else
{
_progressBar.Value = value;
}
}
/// <summary>
/// Formats the USB drive using DiskPart
/// </summary>
/// <param name="diskNumber">Diskpart Device ID</param>
/// <returns></returns>
public async Task FormatDriveAsync(string diskNumber)
{
await Task.Run(() =>
{
try
{
ProcessStartInfo processInfo = new ProcessStartInfo
{
FileName = "diskpart.exe",
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (Process process = Process.Start(processInfo))
{
using (StreamWriter writer = process.StandardInput)
{
if (writer.BaseStream.CanWrite)
{
// Step 1: Format and Boot USB Drive
UpdateStatusLabel(); // Updates to 1/5 - Format and Boot USB Drive
// Send commands to DiskPart
writer.WriteLine($"select disk {diskNumber}"); // Select the disk based on user input
UpdateProgress(10); // Update progress
writer.WriteLine("clean"); // Clean the disk
writer.WriteLine("convert mbr"); // Convert to MBR
UpdateProgress(20);
writer.WriteLine("create partition primary"); // Create a new partition
writer.WriteLine("select partition 1"); // Select the new partition
writer.WriteLine("active"); // Set the new partition active
UpdateProgress(60);
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
UpdateProgress(100); // Final progress
}
}
string output = process.StandardOutput.ReadToEnd(); // Get the output from DiskPart
process.WaitForExit(); // Wait for the process to exit
_logger.Log($"Formatting completed: {output}", Color.Black);
}
}
catch (Exception ex)
{
_logger.Log($"Error formatting drive: {ex.Message}", Color.Red);
}
});
}
/// <summary>
/// Copies the contents of the specified ISO file to the USB drive using Robocopy.
/// </summary>
/// <param name="usbDrive">The drive letter of the USB drive.</param>
/// <param name="isoPath">The path to the ISO file.</param>
public async Task CopyISOAsync(string usbDrive, string isoPath)
{
try
{
// Step 1: Mount the ISO using PowerShell
UpdateStatusLabel(); // Updates to "2/5 - Mount ISO"
string mountCommand = $"Mount-DiskImage -ImagePath \"{isoPath}\"";
ProcessStartInfo mountInfo = new ProcessStartInfo("powershell", mountCommand)
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (Process mountProcess = Process.Start(mountInfo))
{
string output = await mountProcess.StandardOutput.ReadToEndAsync();
await mountProcess.WaitForExitAsync(); // Wait for the process to complete
_logger.Log($"ISO mounted: {output}", Color.Black);
}
// Step 2: Get the drive letter of the mounted ISO
string isoDriveLetter = await GetMountedDriveLetterAsync(); // Get the drive letter of the mounted ISO
if (string.IsNullOrEmpty(isoDriveLetter))
{
_logger.Log("Failed to get the mounted ISO drive letter.", Color.Red);
return; // Exit if we cant find the drive letter
}
_logger.Log($"Mounted ISO drive letter: {isoDriveLetter}", Color.Black);
_logger.Log($"USB drive letter: {usbDrive}", Color.Black);
// Step 3: Prepare the Robocopy command to copy everything except install.wim
string robocopyCommand = $"robocopy {isoDriveLetter.TrimEnd('\\')} {usbDrive.TrimEnd('\\')} /MIR /XF \"install.wim\"";
// Step 4: Execute the Robocopy command
ProcessStartInfo robocopyInfo = new ProcessStartInfo("cmd.exe", $"/C {robocopyCommand}")
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
};
// Step 3: Copy ISO to USB
UpdateStatusLabel(); // Updates to "3/5 - Copy ISO to USB"
using (Process robocopyProcess = Process.Start(robocopyInfo))
{
robocopyProcess.OutputDataReceived += (s, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
{
_logger.Log(e.Data, Color.Black);
// Calculate and update progress based on Robocopy output
int progress = CalculateProgressFromRobocopy(e.Data);
UpdateProgress(progress);
}
};
robocopyProcess.BeginOutputReadLine();
// Wait for the process to finish
await robocopyProcess.WaitForExitAsync();
}
// Step 5: Get the path to the original WIM file (from the ISO)
string wimFilePath = Path.Combine(isoDriveLetter, "sources", "install.wim");
_logger.Log("Preparing install.wim... This may take a moment, please wait.", Color.Blue);
// Step 4: Split Install.wim
UpdateStatusLabel(); // Updates to "4/5 - Split Install.wim"
if (File.Exists(wimFilePath))
{
// Step 7: Define the path for the split files
string swmFilePath = Path.Combine(usbDrive, "sources", "install.swm"); // First split file
// Step 8: Dism command to split WIM
string splitDismCommand = $"/C Dism /Split-Image /ImageFile:\"{wimFilePath}\" /SWMFile:\"{swmFilePath}\" /FileSize:3000";
// Execute the command
ProcessStartInfo splitInfo = new ProcessStartInfo("cmd.exe", splitDismCommand)
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
// Step 5: Finalize Installation Media
UpdateStatusLabel(); // Updates to 5/5 - Finalize Installation Media
using (Process splitProcess = Process.Start(splitInfo))
{
splitProcess.OutputDataReceived += (s, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
{
_logger.Log(e.Data, Color.Black); // Log the output from Dism
}
};
splitProcess.BeginOutputReadLine();
// Wait for the process to finish
await splitProcess.WaitForExitAsync();
_logger.Log($"WIM file split completed with exit code: {splitProcess.ExitCode}", Color.Blue);
}
}
else
{
_logger.Log($"WIM file not found at {wimFilePath}.", Color.Red);
}
}
catch (Exception ex)
{
_logger.Log($"Error copying ISO: {ex.Message}", Color.Red);
}
MessageBox.Show("Your installation media is ready! You can now proceed with the installation.", "Installation Media", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>
/// Retrieves the drive letter of the currently mounted drive.
/// </summary>
/// <returns>The drive letter of the mounted CD/DVD drive, or null if not found.</returns>
private async Task<string> GetMountedDriveLetterAsync()
{
try
{
// List all the drives to find the mounted CD/DVD drive
var drives = DriveInfo.GetDrives();
foreach (var drive in drives)
{
// Check if the drive is a CD/DVD and if it's mounted
if (drive.DriveType == DriveType.CDRom && drive.IsReady)
{
// Return the letter of the mounted drive
return drive.Name; // Returns "D:\", "E:\", etc.
}
}
return null; // Return null if no mounted CD/DVD drive is found
}
catch (Exception ex)
{
_logger.Log($"Error getting mounted drive letter: {ex.Message}", Color.Crimson);
return null;
}
}
/// <summary>
/// Downloads the Microsoft Media Creation Tool from https://go.microsoft.com/fwlink/?linkid=2156295
/// </summary>
/// <param name="downloadUrl">The URL of the Media Creation Tool.</param>
/// <returns>A task representing the asynchronous operation.</returns>
public async Task DownloadMediaCreationTool()
{
string downloadUrl = "https://go.microsoft.com/fwlink/?linkid=2156295";
using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{
saveFileDialog.Filter = "Executable Files (*.exe)|*.exe";
saveFileDialog.Title = "Save Media Creation Tool";
saveFileDialog.FileName = "MediaCreationTool.exe";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string destinationPath = saveFileDialog.FileName;
try
{
_logger.Log("Preparing to download Media Creation Tool...", Color.Black);
_logger.Log("Download may take some time, please wait...", Color.Orange);
var response = await httpClient.GetAsync(downloadUrl);
response.EnsureSuccessStatusCode();
using (var fileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None))
{
await response.Content.CopyToAsync(fileStream);
}
_logger.Log("Download completed successfully!", Color.Green);
// Start the downloaded Media Creation Tool
_logger.Log("Starting Media Creation Tool...", Color.Black);
Process.Start(new ProcessStartInfo
{
FileName = destinationPath,
UseShellExecute = true // run .exe files
});
}
catch (Exception ex)
{
_logger.Log($"An error occurred while downloading: {ex.Message}", Color.Red);
}
}
else
{
_logger.Log("Download canceled by user.", Color.Red);
}
}
}
/// <summary>
/// Calculates progress based on Robocopy output
/// </summary>
private int CalculateProgressFromRobocopy(string robocopyOutput)
{
// Find the percentage completion in Robocopy output
var match = Regex.Match(robocopyOutput, @"(\d+)\%");
if (match.Success)
{
// Extract the percentage number from the match and convert it to an integer
if (int.TryParse(match.Groups[1].Value, out int progress))
{
return progress;
}
}
return 0; // Return 0 if no percentage was found
}
/// <summary>
/// Copy the ISO to the USB drive and optionally create an unattend.xml file
/// </summary>
/// <param name="usbDrive"></param>
/// <param name="isoPath"></param>
/// <param name="createUnattend"></param>
/// <returns></returns>
public async Task CopyISOWithUnattendAsync(string usbDrive, string isoPath, bool createUnattend)
{
await CopyISOAsync(usbDrive, isoPath);
if (createUnattend)
{
CreateUnattendXml(usbDrive); // Only create unattend.xml if checkbox is checked
}
}
/// <summary>
/// // Create unattend.xml file in the sources\$OEM$\$$\Panther directory
/// </summary>
/// <param name="usbDrive"></param>
public void CreateUnattendXml(string usbDrive)
{
string unattendDir = Path.Combine(usbDrive, "sources", "$OEM$", "$$", "Panther");
Directory.CreateDirectory(unattendDir); // Create the directory if it doesn't exist
string unattendPath = Path.Combine(unattendDir, "unattend.xml");
// Check if the file already exists
if (!File.Exists(unattendPath))
{
// Create the unattend.xml content
string xmlContent = @"<unattend xmlns='urn:schemas-microsoft-com:unattend'>
<settings pass='disabled'>
<component xmlns:wcm='http://schemas.microsoft.com/WMIConfig/2002/State' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' name='Microsoft-Windows-Setup' processorArchitecture='amd64' language='neutral' publicKeyToken='31bf3856ad364e35' versionScope='nonSxS'>
<UserData>
<ProductKey>
<Key/>
</ProductKey>
</UserData>
<RunSynchronous>
<RunSynchronousCommand wcm:action='add'>
<Order>1</Order>
<Path>reg add HKLM\SYSTEM\Setup\LabConfig /v BypassTPMCheck /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action='add'>
<Order>2</Order>
<Path>reg add HKLM\SYSTEM\Setup\LabConfig /v BypassSecureBootCheck /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action='add'>
<Order>3</Order>
<Path>reg add HKLM\SYSTEM\Setup\LabConfig /v BypassRAMCheck /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
</settings>
<settings pass='specialize'>
<component xmlns:wcm='http://schemas.microsoft.com/WMIConfig/2002/State' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' name='Microsoft-Windows-Deployment' processorArchitecture='amd64' language='neutral' publicKeyToken='31bf3856ad364e35' versionScope='nonSxS'>
<RunSynchronous>
<RunSynchronousCommand wcm:action='add'>
<Order>1</Order>
<Path>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE /v BypassNRO /t REG_DWORD /d 1 /f</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
</settings>
</unattend>";
File.WriteAllText(unattendPath, xmlContent);
_logger.Log("Created unattend.xml in the sources\\$OEM$\\$$\\Panther directory.", Color.Green);
}
else
{
_logger.Log("unattend.xml already exists in the sources\\$OEM$\\$$\\Panther directory.", Color.Blue);
}
}
}
}
-194
View File
@@ -1,194 +0,0 @@
namespace Views
{
partial class ExperienceView
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Komponenten-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.btnBack = new System.Windows.Forms.Button();
this.featurePanel = new System.Windows.Forms.FlowLayoutPanel();
this.rtbDescription = new System.Windows.Forms.RichTextBox();
this.lblHeader = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.btnRevert = new System.Windows.Forms.Button();
this.btnApply = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.featurePanel.SuspendLayout();
this.SuspendLayout();
//
// btnBack
//
this.btnBack.AutoSize = true;
this.btnBack.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control;
this.btnBack.FlatAppearance.BorderSize = 0;
this.btnBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnBack.Font = new System.Drawing.Font("Segoe MDL2 Assets", 14F, System.Drawing.FontStyle.Bold);
this.btnBack.ForeColor = System.Drawing.Color.DarkGray;
this.btnBack.Location = new System.Drawing.Point(3, 3);
this.btnBack.Name = "btnBack";
this.btnBack.Size = new System.Drawing.Size(34, 29);
this.btnBack.TabIndex = 231;
this.btnBack.Text = "...";
this.btnBack.UseVisualStyleBackColor = true;
this.btnBack.Click += new System.EventHandler(this.btnBack_Click);
//
// featurePanel
//
this.featurePanel.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.featurePanel.AutoScroll = true;
this.featurePanel.Controls.Add(this.rtbDescription);
this.featurePanel.Location = new System.Drawing.Point(69, 170);
this.featurePanel.Name = "featurePanel";
this.featurePanel.Size = new System.Drawing.Size(852, 365);
this.featurePanel.TabIndex = 232;
//
// rtbDescription
//
this.rtbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.rtbDescription.BackColor = System.Drawing.Color.Silver;
this.rtbDescription.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.rtbDescription.Location = new System.Drawing.Point(3, 3);
this.rtbDescription.Name = "rtbDescription";
this.rtbDescription.Size = new System.Drawing.Size(345, 55);
this.rtbDescription.TabIndex = 233;
this.rtbDescription.Text = "";
this.rtbDescription.Visible = false;
//
// 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 Light", 21.25F);
this.lblHeader.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.lblHeader.Location = new System.Drawing.Point(69, 22);
this.lblHeader.Name = "lblHeader";
this.lblHeader.Size = new System.Drawing.Size(771, 84);
this.lblHeader.TabIndex = 234;
this.lblHeader.Text = "Choose privacy settings for your device";
//
// 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 Light", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(73, 66);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(837, 66);
this.label1.TabIndex = 235;
this.label1.Text = "Good news!\r\nWith these privacy settings, you\'re in control of what’s shared and s" +
"hown within Microsoft.\r\n\r\nTo accept, choose \"Accept and Apply.\" If you prefer de" +
"fault settings, select \"Decline.\"";
//
// btnRevert
//
this.btnRevert.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnRevert.AutoEllipsis = true;
this.btnRevert.BackColor = System.Drawing.Color.White;
this.btnRevert.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnRevert.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
this.btnRevert.FlatAppearance.BorderSize = 2;
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.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F);
this.btnRevert.Location = new System.Drawing.Point(473, 565);
this.btnRevert.Name = "btnRevert";
this.btnRevert.Size = new System.Drawing.Size(220, 40);
this.btnRevert.TabIndex = 238;
this.btnRevert.TabStop = false;
this.btnRevert.Text = "Decline";
this.btnRevert.UseVisualStyleBackColor = false;
this.btnRevert.Click += new System.EventHandler(this.btnRevert_Click);
//
// btnApply
//
this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnApply.BackColor = System.Drawing.Color.White;
this.btnApply.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnApply.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnApply.FlatAppearance.BorderSize = 2;
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.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F);
this.btnApply.Location = new System.Drawing.Point(699, 565);
this.btnApply.Name = "btnApply";
this.btnApply.Size = new System.Drawing.Size(222, 40);
this.btnApply.TabIndex = 237;
this.btnApply.TabStop = false;
this.btnApply.Text = "Accept and apply";
this.btnApply.UseCompatibleTextRendering = true;
this.btnApply.UseVisualStyleBackColor = false;
this.btnApply.Click += new System.EventHandler(this.btnApply_Click);
//
// label2
//
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label2.AutoEllipsis = true;
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label2.Location = new System.Drawing.Point(84, 142);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(158, 16);
this.label2.TabIndex = 239;
this.label2.Text = "Last updated October 2024";
//
// ExperienceView
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.label2);
this.Controls.Add(this.btnRevert);
this.Controls.Add(this.btnApply);
this.Controls.Add(this.label1);
this.Controls.Add(this.lblHeader);
this.Controls.Add(this.featurePanel);
this.Controls.Add(this.btnBack);
this.Name = "ExperienceView";
this.Size = new System.Drawing.Size(959, 631);
this.featurePanel.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnBack;
private System.Windows.Forms.FlowLayoutPanel featurePanel;
private System.Windows.Forms.RichTextBox rtbDescription;
private System.Windows.Forms.Label lblHeader;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button btnRevert;
private System.Windows.Forms.Button btnApply;
private System.Windows.Forms.Label label2;
}
}
-118
View File
@@ -1,118 +0,0 @@
using FlybyScript;
using Settings.Ads;
using Settings.Privacy;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace Views
{
public partial class ExperienceView : UserControl
{
private Logger logger;
private List<FeatureBase> features;
public ExperienceView()
{
InitializeComponent();
SetStyle();
InitializeFeatures();
LoadFeatures();
}
private void SetStyle()
{
// Segoe MDL2 Assets assets
btnBack.Text = "\uE72B";
}
private void InitializeFeatures()
{
// Initialize logger
logger = new Logger(rtbDescription);
// Initialize the list of features
features = new List<FeatureBase>
{
new FindMyDevice(logger),
new PrivacyExperience(logger),
new Telemetry(logger),
new FileExplorerAds(logger),
new FinishSetupAds(logger),
new LockScreenAds(logger),
new PersonalizedAds(logger),
new SettingsAds(logger),
new StartmenuAds(logger),
new TailoredExperiences(logger),
new TipsAndSuggestions(logger),
new WelcomeExperienceAds(logger)
};
}
private void LoadFeatures()
{
// Ensure featurePanel is not null
if (featurePanel == null)
{
MessageBox.Show("FeaturePanel is not initialized. Please check the designer.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// Clear any existing controls in the featurePanel
featurePanel.Controls.Clear();
// Populate featurePanel with FeaturePanels
foreach (var feature in features)
{
var featurePanelInstance = new FeaturePanel(feature, logger)
{
Width = featurePanel.Width - 50, // Set the width to match the parent featurePanel
Height = 160,
BorderStyle = BorderStyle.None,
BackColor = Color.FromArgb(245, 245, 245),
Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, featurePanel.Width, 160, 20, 20)) // Rounded corners
};
featurePanel.Controls.Add(featurePanelInstance);
}
}
private void btnBack_Click(object sender, EventArgs e)
{
SwitchView.GoBack(this.Parent as Panel);
}
// Import rounded corners
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern IntPtr CreateRoundRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nWidthEllipse, int nHeightEllipse);
private void btnApply_Click(object sender, EventArgs e)
{
foreach (var feature in features)
{
if (!feature.CheckFeature()) // If feature is not enabled
{
feature.DoFeature(); // Apply feature
logger.Log($"{feature.ID()} enabled.", Color.Green);
}
}
LoadFeatures();
MessageBox.Show("All features have been applied.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnRevert_Click(object sender, EventArgs e)
{
foreach (var feature in features)
{
if (feature.CheckFeature())
{
feature.UndoFeature(); // Revert feature
logger.Log($"{feature.ID()} reverted.", Color.Red);
}
}
LoadFeatures();
MessageBox.Show("All features have been reverted.", "Revert Complete", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
-341
View File
@@ -1,341 +0,0 @@
namespace Views
{
partial class MediaView
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Komponenten-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.btnBack = new System.Windows.Forms.Button();
this.rtbLog = new System.Windows.Forms.RichTextBox();
this.comboBoxDrives = new System.Windows.Forms.ComboBox();
this.btnStart = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.btnSelect = new System.Windows.Forms.Button();
this.label6 = new System.Windows.Forms.Label();
this.btnMCT = new System.Windows.Forms.Button();
this.label7 = new System.Windows.Forms.Label();
this.progressBar = new System.Windows.Forms.ProgressBar();
this.lblStatus = new System.Windows.Forms.Label();
this.checkCreateUnattend = new System.Windows.Forms.CheckBox();
this.comboBoxDriveLetters = new System.Windows.Forms.ComboBox();
this.linkShowDiskList = new System.Windows.Forms.LinkLabel();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// btnBack
//
this.btnBack.AutoSize = true;
this.btnBack.FlatAppearance.BorderColor = System.Drawing.SystemColors.Control;
this.btnBack.FlatAppearance.BorderSize = 0;
this.btnBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnBack.Font = new System.Drawing.Font("Segoe MDL2 Assets", 14F, System.Drawing.FontStyle.Bold);
this.btnBack.ForeColor = System.Drawing.Color.DarkGray;
this.btnBack.Location = new System.Drawing.Point(3, 3);
this.btnBack.Name = "btnBack";
this.btnBack.Size = new System.Drawing.Size(34, 29);
this.btnBack.TabIndex = 231;
this.btnBack.Text = "...";
this.btnBack.UseVisualStyleBackColor = true;
this.btnBack.Click += new System.EventHandler(this.btnBack_Click);
//
// rtbLog
//
this.rtbLog.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.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.Font = new System.Drawing.Font("Segoe UI Variable Small Light", 9.75F);
this.rtbLog.Location = new System.Drawing.Point(59, 362);
this.rtbLog.Name = "rtbLog";
this.rtbLog.Size = new System.Drawing.Size(835, 148);
this.rtbLog.TabIndex = 234;
this.rtbLog.Text = "Ready";
//
// comboBoxDrives
//
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.Location = new System.Drawing.Point(59, 98);
this.comboBoxDrives.Name = "comboBoxDrives";
this.comboBoxDrives.Size = new System.Drawing.Size(121, 25);
this.comboBoxDrives.TabIndex = 235;
//
// btnStart
//
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.Cursor = System.Windows.Forms.Cursors.Hand;
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.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnStart.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnStart.Font = new System.Drawing.Font("Segoe UI Variable Small", 10F);
this.btnStart.Location = new System.Drawing.Point(671, 562);
this.btnStart.Name = "btnStart";
this.btnStart.Size = new System.Drawing.Size(205, 40);
this.btnStart.TabIndex = 236;
this.btnStart.TabStop = false;
this.btnStart.Text = "Start";
this.btnStart.UseCompatibleTextRendering = true;
this.btnStart.UseVisualStyleBackColor = false;
this.btnStart.Click += new System.EventHandler(this.btnStart_Click);
//
// label1
//
this.label1.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.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.label1.Location = new System.Drawing.Point(55, 34);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(182, 32);
this.label1.TabIndex = 237;
this.label1.Tag = "";
this.label1.Text = "Drive Properties";
//
// label2
//
this.label2.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.label2.Location = new System.Drawing.Point(57, 80);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(79, 15);
this.label2.TabIndex = 238;
this.label2.Tag = "";
this.label2.Text = "Device ID";
//
// label5
//
this.label5.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.label5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.label5.Location = new System.Drawing.Point(55, 328);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(114, 31);
this.label5.TabIndex = 241;
this.label5.Tag = "";
this.label5.Text = "Status";
//
// btnSelect
//
this.btnSelect.AutoEllipsis = true;
this.btnSelect.BackColor = System.Drawing.Color.White;
this.btnSelect.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnSelect.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
this.btnSelect.FlatAppearance.BorderSize = 2;
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.Font = new System.Drawing.Font("Segoe UI Variable Small", 9F);
this.btnSelect.Location = new System.Drawing.Point(59, 241);
this.btnSelect.Name = "btnSelect";
this.btnSelect.Size = new System.Drawing.Size(132, 28);
this.btnSelect.TabIndex = 242;
this.btnSelect.TabStop = false;
this.btnSelect.Text = "Select";
this.btnSelect.UseCompatibleTextRendering = true;
this.btnSelect.UseVisualStyleBackColor = false;
this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click);
//
// label6
//
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.Location = new System.Drawing.Point(57, 223);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(76, 15);
this.label6.TabIndex = 243;
this.label6.Tag = "";
this.label6.Text = "Select ISO file";
//
// btnMCT
//
this.btnMCT.AutoEllipsis = true;
this.btnMCT.BackColor = System.Drawing.Color.White;
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.BorderSize = 2;
this.btnMCT.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(192)))));
this.btnMCT.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnMCT.Font = new System.Drawing.Font("Segoe UI Variable Small", 9F);
this.btnMCT.Location = new System.Drawing.Point(235, 241);
this.btnMCT.Name = "btnMCT";
this.btnMCT.Size = new System.Drawing.Size(205, 28);
this.btnMCT.TabIndex = 244;
this.btnMCT.TabStop = false;
this.btnMCT.Text = "Media Creation Tool (Microsoft)";
this.btnMCT.UseCompatibleTextRendering = true;
this.btnMCT.UseVisualStyleBackColor = false;
this.btnMCT.Click += new System.EventHandler(this.btnMCT_Click);
//
// label7
//
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.Location = new System.Drawing.Point(232, 223);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(85, 15);
this.label7.TabIndex = 245;
this.label7.Tag = "";
this.label7.Text = "or prepare with";
//
// 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(60, 516);
this.progressBar.Name = "progressBar";
this.progressBar.Size = new System.Drawing.Size(834, 23);
this.progressBar.TabIndex = 246;
//
// lblStatus
//
this.lblStatus.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
this.lblStatus.AutoEllipsis = true;
this.lblStatus.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(230)))), ((int)(((byte)(230)))));
this.lblStatus.Font = new System.Drawing.Font("Segoe UI Variable Small Semibol", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblStatus.Location = new System.Drawing.Point(361, 519);
this.lblStatus.Name = "lblStatus";
this.lblStatus.Size = new System.Drawing.Size(226, 18);
this.lblStatus.TabIndex = 247;
this.lblStatus.Tag = "";
this.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// checkCreateUnattend
//
this.checkCreateUnattend.Appearance = System.Windows.Forms.Appearance.Button;
this.checkCreateUnattend.AutoEllipsis = true;
this.checkCreateUnattend.FlatAppearance.BorderColor = System.Drawing.Color.Gray;
this.checkCreateUnattend.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.checkCreateUnattend.Font = new System.Drawing.Font("Segoe UI Variable Small", 8F);
this.checkCreateUnattend.Location = new System.Drawing.Point(72, 275);
this.checkCreateUnattend.Name = "checkCreateUnattend";
this.checkCreateUnattend.Size = new System.Drawing.Size(194, 25);
this.checkCreateUnattend.TabIndex = 250;
this.checkCreateUnattend.Text = "Skip Hardware limits and go local";
this.checkCreateUnattend.UseVisualStyleBackColor = true;
this.checkCreateUnattend.Visible = false;
this.checkCreateUnattend.CheckedChanged += new System.EventHandler(this.checkCreateUnattend_CheckedChanged);
//
// comboBoxDriveLetters
//
this.comboBoxDriveLetters.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
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.Location = new System.Drawing.Point(210, 98);
this.comboBoxDriveLetters.Name = "comboBoxDriveLetters";
this.comboBoxDriveLetters.Size = new System.Drawing.Size(121, 25);
this.comboBoxDriveLetters.TabIndex = 251;
//
// linkShowDiskList
//
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.Name = "linkShowDiskList";
this.linkShowDiskList.Size = new System.Drawing.Size(177, 16);
this.linkShowDiskList.TabIndex = 252;
this.linkShowDiskList.TabStop = true;
this.linkShowDiskList.Text = "Help me identify the device id";
this.linkShowDiskList.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkShowDiskList_LinkClicked);
//
// label3
//
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.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.Name = "label3";
this.label3.Size = new System.Drawing.Size(182, 32);
this.label3.TabIndex = 253;
this.label3.Tag = "";
this.label3.Text = "Create Media";
//
// label4
//
this.label4.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.label4.Location = new System.Drawing.Point(207, 80);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(79, 15);
this.label4.TabIndex = 254;
this.label4.Tag = "";
this.label4.Text = "Device Letter";
//
// InstallationMediaView
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true;
this.BackColor = System.Drawing.Color.White;
this.Controls.Add(this.label4);
this.Controls.Add(this.label3);
this.Controls.Add(this.linkShowDiskList);
this.Controls.Add(this.comboBoxDriveLetters);
this.Controls.Add(this.checkCreateUnattend);
this.Controls.Add(this.lblStatus);
this.Controls.Add(this.progressBar);
this.Controls.Add(this.label7);
this.Controls.Add(this.btnMCT);
this.Controls.Add(this.label6);
this.Controls.Add(this.btnSelect);
this.Controls.Add(this.label5);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.btnStart);
this.Controls.Add(this.comboBoxDrives);
this.Controls.Add(this.rtbLog);
this.Controls.Add(this.btnBack);
this.Name = "InstallationMediaView";
this.Size = new System.Drawing.Size(959, 631);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnBack;
private System.Windows.Forms.RichTextBox rtbLog;
private System.Windows.Forms.ComboBox comboBoxDrives;
private System.Windows.Forms.Button btnStart;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Button btnSelect;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Button btnMCT;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.ProgressBar progressBar;
private System.Windows.Forms.Label lblStatus;
private System.Windows.Forms.CheckBox checkCreateUnattend;
private System.Windows.Forms.ComboBox comboBoxDriveLetters;
private System.Windows.Forms.LinkLabel linkShowDiskList;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
}
}
-246
View File
@@ -1,246 +0,0 @@
using FlybyScript;
using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Views
{
public partial class MediaView : UserControl
{
private USBManagement usbManagement;
private Logger logger;
private string selectedIsoPath;
public MediaView()
{
InitializeComponent();
SetStyle();
InitializeUSBDriveList();
logger = new Logger(rtbLog);
usbManagement = new USBManagement(logger, updateLabelStatus, progressBar);
}
private void SetStyle()
{
// Segoe MDL2 Assets
btnBack.Text = "\uE72B";
}
private void updateLabelStatus(string statusText)
{
if (lblStatus.InvokeRequired)
{
lblStatus.Invoke(new Action(() => lblStatus.Text = statusText));
}
else
{
lblStatus.Text = statusText;
}
}
private void InitializeUSBDriveList()
{
// Initialize disk numbers
comboBoxDrives.Items.Clear();
comboBoxDrives.Items.AddRange(new object[] { "Select (e.g., 1, 2, 3...)", "1", "2", "3" });
comboBoxDrives.SelectedIndex = 0;
// Initialize removable drives
comboBoxDriveLetters.Items.Clear();
var removableDrives = DriveInfo.GetDrives()
.Where(d => d.DriveType == DriveType.Removable)
.Select(d => d.Name)
.ToArray();
if (removableDrives.Any())
{
comboBoxDriveLetters.Items.AddRange(removableDrives);
comboBoxDriveLetters.SelectedIndex = 0;
}
else
{
//MessageBox.Show("No removable drives found.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
comboBoxDriveLetters.Enabled =
comboBoxDrives.Enabled = false;
}
}
private async Task ShowDiskList()
{
try
{
// Use chcp command to get the current code page of the user's system
ProcessStartInfo chcpInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = "/C chcp",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
string codePageOutput;
using (Process chcpProcess = Process.Start(chcpInfo))
{
codePageOutput = await chcpProcess.StandardOutput.ReadToEndAsync();
chcpProcess.WaitForExit();
}
// Extract the code page number from chcp output
int codePage = 850; // Default to 850 if detection fails
var match = System.Text.RegularExpressions.Regex.Match(codePageOutput, @"\d+");
if (match.Success)
{
codePage = int.Parse(match.Value); // Parse our detected code page
}
ProcessStartInfo processInfo = new ProcessStartInfo
{
FileName = "diskpart.exe",
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
StandardOutputEncoding = Encoding.GetEncoding(codePage)
};
// Start the process
using (Process process = Process.Start(processInfo))
{
using (StreamWriter writer = process.StandardInput)
{
if (writer.BaseStream.CanWrite)
{
writer.WriteLine("list disk");
}
}
string output = await process.StandardOutput.ReadToEndAsync();
process.WaitForExit();
MessageBox.Show(output, "Available Disks", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show($"An error occurred while listing disks: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// Event handler for starting the format and copy process
private async void btnStart_Click(object sender, EventArgs e)
{
btnStart.Enabled = false; // Disable the Start button
// Validate Disk Number
if (string.IsNullOrEmpty(comboBoxDrives.Text) || !int.TryParse(comboBoxDrives.Text, out _))
{
logger.Log("Please enter a valid Disk Number.", Color.Red);
btnStart.Enabled = true; // Re-enable the button
return;
}
// Validate Drive Letter
if (string.IsNullOrEmpty(comboBoxDriveLetters.SelectedItem?.ToString()))
{
logger.Log("Please select a valid Drive Letter.", Color.Red);
btnStart.Enabled = true;
return;
}
string diskNumber = comboBoxDrives.Text.Trim(); // Get the disk number from the ComboBox
string driveLetter = comboBoxDriveLetters.SelectedItem.ToString().Trim(); // Get the selected drive letter
logger.Log($"Starting to format Disk {diskNumber} and copy to Drive {driveLetter}...", Color.Black);
try
{
// Format the drive using the disk number
await usbManagement.FormatDriveAsync(diskNumber); // Pass the disk number
logger.Log($"Disk {diskNumber} formatted successfully.", Color.Black);
logger.Log($"Disk {diskNumber} is now bootable.", Color.Black);
// Copy ISO and create unattend.xml if checked
bool createUnattend = checkCreateUnattend.Checked;
await usbManagement.CopyISOWithUnattendAsync(driveLetter, selectedIsoPath, createUnattend); // Use the drive letter for copying
logger.Log("Process completed!", Color.Green);
}
catch (Exception ex)
{
logger.Log($"An error occurred during the process: {ex.Message}", Color.Red);
}
finally
{
btnStart.Enabled = true;
}
}
private void btnSelect_Click(object sender, EventArgs e)
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = "ISO Files (*.iso)|*.iso|All Files (*.*)|*.*";
openFileDialog.Title = "Select an ISO File";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
selectedIsoPath = openFileDialog.FileName;
logger.Log($"Selected ISO file: {selectedIsoPath}", Color.Black);
checkCreateUnattend.Visible = true; // Show the checkbox to create unattend.xml
}
else
{
logger.Log("ISO file selection was cancelled.", Color.Red);
}
}
}
private void checkCreateUnattend_CheckedChanged(object sender, EventArgs e)
{
if (checkCreateUnattend.Checked)
{
checkCreateUnattend.BackColor = Color.LightGreen;
MessageBox.Show(
"You have enabled the bypass for Windows 11 hardware requirements.\n\n" +
"This will: \n" +
"- Skip TPM 2.0 checks\n" +
"- Bypass the 4GB+ RAM requirement\n" +
"- Disable Secure Boot requirement\n" +
"- Allow creating a local account (no online setup required)\n\n" +
"During installation, Windows will offer the 'I don't have internet' option for offline account creation.",
"Bypass Enabled",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
}
else
{
checkCreateUnattend.BackColor = Color.White;
}
}
private async void linkShowDiskList_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
await ShowDiskList();
}
private async void btnMCT_Click(object sender, EventArgs e)
{
await usbManagement.DownloadMediaCreationTool();
}
private void btnBack_Click(object sender, EventArgs e)
{
SwitchView.GoBack(this.Parent as Panel);
}
}
}
-120
View File
@@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=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>
+1 -2
View File
@@ -16,7 +16,7 @@
Entfernen Sie dieses Element, wenn diese Virtualisierung aus Gründen der Abwärtskompatibilität
für die Anwendung erforderlich ist.
-->
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
@@ -51,7 +51,6 @@
auch die Einstellung "'EnableWindowsFormsHighDpiAutoResizing" in der Datei "app.config" auf TRUE festgelegt werden.
Hierdurch können für die Anwendung lange Pfade verwendet werden. Weitere Informationen finden Sie unter https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation.-->
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
-4
View File
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net481" />
</packages>
+4 -1
View File
@@ -1,6 +1,9 @@
# Flyby11 (FlybyScript) Windows 11 for All – No Specs, No Problem!
Flyby11 is a simple patcher that removes the annoying restrictions preventing you from installing Windows 11 (24H2) on unsupported hardware. Got an old PC? No TPM, Secure Boot, or your processor isn't supported? Flyby11 lets you install Windows 11 24H2 anyway.
No complicated steps. Just run the tool, and you'll be running Windows 11 on your outdated machine in no time. Think of it as sneaking through the back door without anyone noticing.
No complicated steps.
**Just run the tool (see ["Releases"](https://github.com/builtbybel/Flyby11/releases/tag/0.17.160) in the right side of the page, you may need to unpack a zip file), and you'll be running Windows 11 on your outdated machine in no time.**
Think of it as sneaking through the back door without anyone noticing.
# Technical Overview
Flyby11 leverages a feature of the Windows 11 setup process that uses the Windows Server variant of the installation. This variant, unlike the regular Windows 11 setup, skips most hardware compatibility checks, allowing it to run on unsupported systems. Here’s a more technical breakdown of the process: