<# .SYNOPSIS .Removes bloat from a fresh Windows build .DESCRIPTION .Removes AppX Packages .Disables Cortana .Removes McAfee .Removes HP Bloat .Removes Dell Bloat .Removes Lenovo Bloat .Windows 10 and Windows 11 Compatible .Removes any unwanted installed applications .Removes unwanted services and tasks .Removes Edge Surf Game .INPUTS .OUTPUTS C:\ProgramData\Debloat\Debloat.log .NOTES Version: 4.2.5 Author: Andrew Taylor Twitter: @AndrewTaylor_2 WWW: andrewstaylor.com Creation Date: 08/03/2022 Purpose/Change: Initial script development Change: 12/08/2022 - Added additional HP applications Change 23/09/2022 - Added Clipchamp (new in W11 22H2) Change 28/10/2022 - Fixed issue with Dell apps Change 23/11/2022 - Added Teams Machine wide to exceptions Change 27/11/2022 - Added Dell apps Change 07/12/2022 - Whitelisted Dell Audio and Firmware Change 19/12/2022 - Added Windows 11 start menu support Change 20/12/2022 - Removed Gaming Menu from Settings Change 18/01/2023 - Fixed Scheduled task error and cleared up $null posistioning Change 22/01/2023 - Re-enabled Telemetry for Endpoint Analytics Change 30/01/2023 - Added Microsoft Family to removal list Change 31/01/2023 - Fixed Dell loop Change 08/02/2023 - Fixed HP apps (thanks to http://gerryhampsoncm.blogspot.com/2023/02/remove-pre-installed-hp-software-during.html?m=1) Change 08/02/2023 - Removed reg keys for Teams Chat Change 14/02/2023 - Added HP Sure Apps Change 07/03/2023 - Enabled Location tracking (with commenting to disable) Change 08/03/2023 - Teams chat fix Change 10/03/2023 - Dell array fix Change 19/04/2023 - Added loop through all users for HKCU keys for post-OOBE deployments Change 29/04/2023 - Removes News Feed Change 26/05/2023 - Added Set-ACL Change 26/05/2023 - Added multi-language support for Set-ACL commands Change 30/05/2023 - Logic to check if gamepresencewriter exists before running Set-ACL to stop errors on re-run Change 25/07/2023 - Added Lenovo apps (Thanks to Simon Lilly and Philip Jorgensen) Change 31/07/2023 - Added LenovoAssist Change 21/09/2023 - Remove Windows backup for Win10 Change 28/09/2023 - Enabled Diagnostic Tracking for Endpoint Analytics Change 02/10/2023 - Lenovo Fix Change 06/10/2023 - Teams chat fix Change 09/10/2023 - Dell Command Update change Change 11/10/2023 - Grab all uninstall strings and use native uninstaller instead of uninstall-package Change 14/10/2023 - Updated HP Audio package name Change 31/10/2023 - Added PowerAutomateDesktop and update Microsoft.Todos Change 01/11/2023 - Added fix for Windows backup removing Shell Components Change 06/11/2023 - Removes Windows CoPilot Change 07/11/2023 - HKU fix Change 13/11/2023 - Added CoPilot removal to .Default Users Change 14/11/2023 - Added logic to stop errors on HP machines without HP docs installed Change 14/11/2023 - Added logic to stop errors on Lenovo machines without some installers Change 15/11/2023 - Code Signed for additional security Change 02/12/2023 - Added extra logic before app uninstall to check if a user has logged in Change 04/01/2024 - Added Dropbox and DevHome to AppX removal Change 05/01/2024 - Added MSTSC to whitelist Change 25/01/2024 - Added logic for LenovoNow/LenovoWelcome Change 25/01/2024 - Updated Dell app list (thanks Hrvoje in comments) Change 29/01/2024 - Changed /I to /X in Dell command Change 30/01/2024 - Fix Lenovo Vantage version Change 31/01/2024 - McAfee fix and Dell changes Change 01/02/2024 - Dell fix Change 01/02/2024 - Added logic around appxremoval to stop failures in logging Change 05/02/2024 - Added whitelist parameters Change 16/02/2024 - Added wildcard to dropbox Change 23/02/2024 - Added Lenovo SmartMeetings Change 06/03/2024 - Added Lenovo View and Vantage Change 08/03/2024 - Added Lenovo Smart Noise Cancellation N/A #> ############################################################################################################ # Initial Setup # # # ############################################################################################################ param ( [string[]]$customwhitelist ) $customwhitelist ='*Adobe Acrobat*,*Automate*,*Chrome*,*ConnectWise*,*Duo*,*LogMeIn*,*Microsoft .NET *,*Microsoft Visual*,*Microsoft Windows Desktop Runtime*,*MySQL Connector*,*ScreenConnect*,*Teams*,*Zoom*,Adobe Refresh Manager,BCR Plug-in,Cisco Jabber,Citrix Authentication Manager,Citrix Web Helper,Citrix Workspace 2311,Citrix Workspace Inside,Citrix Workspace(DV),Citrix Workspace(USB),CYRISMA Sensor version 2.5,Halcyon AR,HP Performance Advisor,HP Performance Advisor,*Microsoft Intune*,MTOP Client,Online Plug-in,Self-service Plug-in,Stamps.com' ##Elevate if needed If (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]'Administrator')) { Write-Host "You didn't run this script as an Administrator. This script will self elevate to run as an Administrator and continue." Start-Sleep 1 Write-Host " 3" Start-Sleep 1 Write-Host " 2" Start-Sleep 1 Write-Host " 1" Start-Sleep 1 Start-Process powershell.exe -ArgumentList ("-NoProfile -ExecutionPolicy Bypass -File `"{0}`" -WhitelistApps {1}" -f $PSCommandPath, ($WhitelistApps -join ',')) -Verb RunAs Exit } #no errors throughout $ErrorActionPreference = 'silentlycontinue' #Create Folder $DebloatFolder = "C:\ProgramData\Debloat" If (Test-Path $DebloatFolder) { Write-Output "$DebloatFolder exists. Skipping." } Else { Write-Output "The folder '$DebloatFolder' doesn't exist. This folder will be used for storing logs created after the script runs. Creating now." Start-Sleep 1 New-Item -Path "$DebloatFolder" -ItemType Directory Write-Output "The folder $DebloatFolder was successfully created." } Start-Transcript -Path "C:\ProgramData\Debloat\Debloat.log" $locale = Get-WinSystemLocale | Select-Object -expandproperty Name ##Switch on locale to set variables ## Switch on locale to set variables switch ($locale) { "en-US" { $everyone = "Everyone" $builtin = "Builtin" } default { $everyone = "Everyone" $builtin = "Builtin" } } ############################################################################################################ # Remove AppX Packages # # # ############################################################################################################ #Removes AppxPackages $WhitelistedApps = 'Microsoft.WindowsNotepad|Microsoft.CompanyPortal|Microsoft.ScreenSketch|Microsoft.Paint3D|Microsoft.WindowsCalculator|Microsoft.WindowsStore|Microsoft.Windows.Photos|CanonicalGroupLimited.UbuntuonWindows|` |Microsoft.MicrosoftStickyNotes|Microsoft.MSPaint|Microsoft.WindowsCamera|.NET|Framework|` Microsoft.HEIFImageExtension|Microsoft.ScreenSketch|Microsoft.StorePurchaseApp|Microsoft.VP9VideoExtensions|Microsoft.WebMediaExtensions|Microsoft.WebpImageExtension|Microsoft.DesktopAppInstaller|WindSynthBerry|MIDIBerry|Slack' ##If $customwhitelist is set, split on the comma and add to whitelist if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," $WhitelistedApps += "|" $WhitelistedApps += $customWhitelistApps -join "|" } #NonRemovable Apps that where getting attempted and the system would reject the uninstall, speeds up debloat and prevents 'initalizing' overlay when removing apps $NonRemovable = '1527c705-839a-4832-9118-54d4Bd6a0c89|c5e2524a-ea46-4f67-841f-6a9465d9d515|E2A4F912-2574-4A75-9BB0-0D023378592B|F46D4000-FD22-4DB4-AC8E-4E1DDDE828FE|InputApp|Microsoft.AAD.BrokerPlugin|Microsoft.AccountsControl|` Microsoft.BioEnrollment|Microsoft.CredDialogHost|Microsoft.ECApp|Microsoft.LockApp|Microsoft.MicrosoftEdgeDevToolsClient|Microsoft.MicrosoftEdge|Microsoft.PPIProjection|Microsoft.Win32WebViewHost|Microsoft.Windows.Apprep.ChxApp|` Microsoft.Windows.AssignedAccessLockApp|Microsoft.Windows.CapturePicker|Microsoft.Windows.CloudExperienceHost|Microsoft.Windows.ContentDeliveryManager|Microsoft.Windows.Cortana|Microsoft.Windows.NarratorQuickStart|` Microsoft.Windows.ParentalControls|Microsoft.Windows.PeopleExperienceHost|Microsoft.Windows.PinningConfirmationDialog|Microsoft.Windows.SecHealthUI|Microsoft.Windows.SecureAssessmentBrowser|Microsoft.Windows.ShellExperienceHost|` Microsoft.Windows.XGpuEjectDialog|Microsoft.XboxGameCallableUI|Windows.CBSPreview|windows.immersivecontrolpanel|Windows.PrintDialog|Microsoft.XboxGameCallableUI|Microsoft.VCLibs.140.00|Microsoft.Services.Store.Engagement|Microsoft.UI.Xaml.2.0|*Nvidia*' Get-AppxPackage -AllUsers | Where-Object {$_.Name -NotMatch $WhitelistedApps -and $_.Name -NotMatch $NonRemovable} | Remove-AppxPackage Get-AppxPackage -allusers | Where-Object {$_.Name -NotMatch $WhitelistedApps -and $_.Name -NotMatch $NonRemovable} | Remove-AppxPackage Get-AppxProvisionedPackage -Online | Where-Object {$_.PackageName -NotMatch $WhitelistedApps -and $_.PackageName -NotMatch $NonRemovable} | Remove-AppxProvisionedPackage -Online ##Remove bloat $Bloatware = @( #Unnecessary Windows 10/11 AppX Apps "Microsoft.549981C3F5F10" "Microsoft.BingNews" "Microsoft.GetHelp" "Microsoft.Getstarted" "Microsoft.Messaging" "Microsoft.Microsoft3DViewer" "Microsoft.MicrosoftOfficeHub" "Microsoft.MicrosoftSolitaireCollection" "Microsoft.NetworkSpeedTest" "Microsoft.MixedReality.Portal" "Microsoft.News" "Microsoft.Office.Lens" "Microsoft.Office.OneNote" "Microsoft.Office.Sway" "Microsoft.OneConnect" "Microsoft.People" "Microsoft.Print3D" "Microsoft.RemoteDesktop" "Microsoft.SkypeApp" "Microsoft.StorePurchaseApp" "Microsoft.Office.Todo.List" "Microsoft.Whiteboard" "Microsoft.WindowsAlarms" #"Microsoft.WindowsCamera" "microsoft.windowscommunicationsapps" "Microsoft.WindowsFeedbackHub" "Microsoft.WindowsMaps" "Microsoft.WindowsSoundRecorder" "Microsoft.Xbox.TCUI" "Microsoft.XboxApp" "Microsoft.XboxGameOverlay" "Microsoft.XboxIdentityProvider" "Microsoft.XboxSpeechToTextOverlay" "Microsoft.ZuneMusic" "Microsoft.ZuneVideo" "MicrosoftTeams" "Microsoft.YourPhone" "Microsoft.XboxGamingOverlay_5.721.10202.0_neutral_~_8wekyb3d8bbwe" "Microsoft.GamingApp" "Microsoft.Todos" "Microsoft.PowerAutomateDesktop" "SpotifyAB.SpotifyMusic" "Microsoft.MicrosoftJournal" "Disney.37853FC22B2CE" "*EclipseManager*" "*ActiproSoftwareLLC*" "*AdobeSystemsIncorporated.AdobePhotoshopExpress*" "*Duolingo-LearnLanguagesforFree*" "*PandoraMediaInc*" "*CandyCrush*" "*BubbleWitch3Saga*" "*Wunderlist*" "*Flipboard*" "*Twitter*" "*Facebook*" "*Spotify*" "*Minecraft*" "*Royal Revolt*" "*Sway*" "*Speed Test*" "*Dolby*" "*Office*" "*Disney*" "clipchamp.clipchamp" "*gaming*" "MicrosoftCorporationII.MicrosoftFamily" "C27EB4BA.DropboxOEM*" "*DevHome*" #Optional: Typically not removed but you can if you need to for some reason #"*Microsoft.Advertising.Xaml_10.1712.5.0_x64__8wekyb3d8bbwe*" #"*Microsoft.Advertising.Xaml_10.1712.5.0_x86__8wekyb3d8bbwe*" #"*Microsoft.BingWeather*" #"*Microsoft.MSPaint*" #"*Microsoft.MicrosoftStickyNotes*" #"*Microsoft.Windows.Photos*" #"*Microsoft.WindowsCalculator*" #"*Microsoft.WindowsStore*" ) ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," $Bloatware = $Bloatware | Where-Object { $customWhitelistApps -notcontains $_ } } foreach ($Bloat in $Bloatware) { if (Get-AppxPackage -Name $Bloat -ErrorAction SilentlyContinue) { Get-AppxPackage -allusers -Name $Bloat | Remove-AppxPackage -AllUsers Write-Host "Removed $Bloat." } else { Write-Host "$Bloat not found." } if (Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like $Bloat -ErrorAction SilentlyContinue) { Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like $Bloat | Remove-AppxProvisionedPackage -Online Write-Host "Removed provisioned package for $Bloat." } else { Write-Host "Provisioned package for $Bloat not found." } } ############################################################################################################ # Remove Registry Keys # # # ############################################################################################################ ##We need to grab all SIDs to remove at user level $UserSIDs = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" | Select-Object -ExpandProperty PSChildName #These are the registry keys that it will delete. $Keys = @( #Remove Background Tasks "HKCR:\Extensions\ContractId\Windows.BackgroundTasks\PackageId\46928bounde.EclipseManager_2.2.4.51_neutral__a5h4egax66k6y" "HKCR:\Extensions\ContractId\Windows.BackgroundTasks\PackageId\ActiproSoftwareLLC.562882FEEB491_2.6.18.18_neutral__24pqs290vpjk0" "HKCR:\Extensions\ContractId\Windows.BackgroundTasks\PackageId\Microsoft.MicrosoftOfficeHub_17.7909.7600.0_x64__8wekyb3d8bbwe" "HKCR:\Extensions\ContractId\Windows.BackgroundTasks\PackageId\Microsoft.PPIProjection_10.0.15063.0_neutral_neutral_cw5n1h2txyewy" "HKCR:\Extensions\ContractId\Windows.BackgroundTasks\PackageId\Microsoft.XboxGameCallableUI_1000.15063.0.0_neutral_neutral_cw5n1h2txyewy" "HKCR:\Extensions\ContractId\Windows.BackgroundTasks\PackageId\Microsoft.XboxGameCallableUI_1000.16299.15.0_neutral_neutral_cw5n1h2txyewy" #Windows File "HKCR:\Extensions\ContractId\Windows.File\PackageId\ActiproSoftwareLLC.562882FEEB491_2.6.18.18_neutral__24pqs290vpjk0" #Registry keys to delete if they aren't uninstalled by RemoveAppXPackage/RemoveAppXProvisionedPackage "HKCR:\Extensions\ContractId\Windows.Launch\PackageId\46928bounde.EclipseManager_2.2.4.51_neutral__a5h4egax66k6y" "HKCR:\Extensions\ContractId\Windows.Launch\PackageId\ActiproSoftwareLLC.562882FEEB491_2.6.18.18_neutral__24pqs290vpjk0" "HKCR:\Extensions\ContractId\Windows.Launch\PackageId\Microsoft.PPIProjection_10.0.15063.0_neutral_neutral_cw5n1h2txyewy" "HKCR:\Extensions\ContractId\Windows.Launch\PackageId\Microsoft.XboxGameCallableUI_1000.15063.0.0_neutral_neutral_cw5n1h2txyewy" "HKCR:\Extensions\ContractId\Windows.Launch\PackageId\Microsoft.XboxGameCallableUI_1000.16299.15.0_neutral_neutral_cw5n1h2txyewy" #Scheduled Tasks to delete "HKCR:\Extensions\ContractId\Windows.PreInstalledConfigTask\PackageId\Microsoft.MicrosoftOfficeHub_17.7909.7600.0_x64__8wekyb3d8bbwe" #Windows Protocol Keys "HKCR:\Extensions\ContractId\Windows.Protocol\PackageId\ActiproSoftwareLLC.562882FEEB491_2.6.18.18_neutral__24pqs290vpjk0" "HKCR:\Extensions\ContractId\Windows.Protocol\PackageId\Microsoft.PPIProjection_10.0.15063.0_neutral_neutral_cw5n1h2txyewy" "HKCR:\Extensions\ContractId\Windows.Protocol\PackageId\Microsoft.XboxGameCallableUI_1000.15063.0.0_neutral_neutral_cw5n1h2txyewy" "HKCR:\Extensions\ContractId\Windows.Protocol\PackageId\Microsoft.XboxGameCallableUI_1000.16299.15.0_neutral_neutral_cw5n1h2txyewy" #Windows Share Target "HKCR:\Extensions\ContractId\Windows.ShareTarget\PackageId\ActiproSoftwareLLC.562882FEEB491_2.6.18.18_neutral__24pqs290vpjk0" ) #This writes the output of each key it is removing and also removes the keys listed above. ForEach ($Key in $Keys) { Write-Host "Removing $Key from registry" Remove-Item $Key -Recurse } #Disables Windows Feedback Experience Write-Host "Disabling Windows Feedback Experience program" $Advertising = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AdvertisingInfo" If (!(Test-Path $Advertising)) { New-Item $Advertising } If (Test-Path $Advertising) { Set-ItemProperty $Advertising Enabled -Value 0 } #Stops Cortana from being used as part of your Windows Search Function Write-Host "Stopping Cortana from being used as part of your Windows Search Function" $Search = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search" If (!(Test-Path $Search)) { New-Item $Search } If (Test-Path $Search) { Set-ItemProperty $Search AllowCortana -Value 0 } #Disables Web Search in Start Menu Write-Host "Disabling Bing Search in Start Menu" $WebSearch = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search" If (!(Test-Path $WebSearch)) { New-Item $WebSearch } Set-ItemProperty $WebSearch DisableWebSearch -Value 1 ##Loop through all user SIDs in the registry and disable Bing Search foreach ($sid in $UserSIDs) { $WebSearch = "Registry::HKU\$sid\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" If (!(Test-Path $WebSearch)) { New-Item $WebSearch } Set-ItemProperty $WebSearch BingSearchEnabled -Value 0 } Set-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" BingSearchEnabled -Value 0 #Stops the Windows Feedback Experience from sending anonymous data Write-Host "Stopping the Windows Feedback Experience program" $Period = "HKCU:\Software\Microsoft\Siuf\Rules" If (!(Test-Path $Period)) { New-Item $Period } Set-ItemProperty $Period PeriodInNanoSeconds -Value 0 ##Loop and do the same foreach ($sid in $UserSIDs) { $Period = "Registry::HKU\$sid\Software\Microsoft\Siuf\Rules" If (!(Test-Path $Period)) { New-Item $Period } Set-ItemProperty $Period PeriodInNanoSeconds -Value 0 } #Prevents bloatware applications from returning and removes Start Menu suggestions Write-Host "Adding Registry key to prevent bloatware apps from returning" $registryPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" $registryOEM = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" If (!(Test-Path $registryPath)) { New-Item $registryPath } Set-ItemProperty $registryPath DisableWindowsConsumerFeatures -Value 1 If (!(Test-Path $registryOEM)) { New-Item $registryOEM } Set-ItemProperty $registryOEM ContentDeliveryAllowed -Value 0 Set-ItemProperty $registryOEM OemPreInstalledAppsEnabled -Value 0 Set-ItemProperty $registryOEM PreInstalledAppsEnabled -Value 0 Set-ItemProperty $registryOEM PreInstalledAppsEverEnabled -Value 0 Set-ItemProperty $registryOEM SilentInstalledAppsEnabled -Value 0 Set-ItemProperty $registryOEM SystemPaneSuggestionsEnabled -Value 0 ##Loop through users and do the same foreach ($sid in $UserSIDs) { $registryOEM = "Registry::HKU\$sid\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" If (!(Test-Path $registryOEM)) { New-Item $registryOEM } Set-ItemProperty $registryOEM ContentDeliveryAllowed -Value 0 Set-ItemProperty $registryOEM OemPreInstalledAppsEnabled -Value 0 Set-ItemProperty $registryOEM PreInstalledAppsEnabled -Value 0 Set-ItemProperty $registryOEM PreInstalledAppsEverEnabled -Value 0 Set-ItemProperty $registryOEM SilentInstalledAppsEnabled -Value 0 Set-ItemProperty $registryOEM SystemPaneSuggestionsEnabled -Value 0 } #Preping mixed Reality Portal for removal Write-Host "Setting Mixed Reality Portal value to 0 so that you can uninstall it in Settings" $Holo = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Holographic" If (Test-Path $Holo) { Set-ItemProperty $Holo FirstRunSucceeded -Value 0 } ##Loop through users and do the same foreach ($sid in $UserSIDs) { $Holo = "Registry::HKU\$sid\Software\Microsoft\Windows\CurrentVersion\Holographic" If (Test-Path $Holo) { Set-ItemProperty $Holo FirstRunSucceeded -Value 0 } } #Disables Wi-fi Sense Write-Host "Disabling Wi-Fi Sense" $WifiSense1 = "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting" $WifiSense2 = "HKLM:\SOFTWARE\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots" $WifiSense3 = "HKLM:\SOFTWARE\Microsoft\WcmSvc\wifinetworkmanager\config" If (!(Test-Path $WifiSense1)) { New-Item $WifiSense1 } Set-ItemProperty $WifiSense1 Value -Value 0 If (!(Test-Path $WifiSense2)) { New-Item $WifiSense2 } Set-ItemProperty $WifiSense2 Value -Value 0 Set-ItemProperty $WifiSense3 AutoConnectAllowedOEM -Value 0 #Disables live tiles Write-Host "Disabling live tiles" $Live = "HKCU:\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\PushNotifications" If (!(Test-Path $Live)) { New-Item $Live } Set-ItemProperty $Live NoTileApplicationNotification -Value 1 ##Loop through users and do the same foreach ($sid in $UserSIDs) { $Live = "Registry::HKU\$sid\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\PushNotifications" If (!(Test-Path $Live)) { New-Item $Live } Set-ItemProperty $Live NoTileApplicationNotification -Value 1 } #Turns off Data Collection via the AllowTelemtry key by changing it to 0 # This is needed for Intune reporting to work, uncomment if using via other method #Write-Host "Turning off Data Collection" #$DataCollection1 = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection" #$DataCollection2 = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection" #$DataCollection3 = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Policies\DataCollection" #If (Test-Path $DataCollection1) { # Set-ItemProperty $DataCollection1 AllowTelemetry -Value 0 #} #If (Test-Path $DataCollection2) { # Set-ItemProperty $DataCollection2 AllowTelemetry -Value 0 #} #If (Test-Path $DataCollection3) { # Set-ItemProperty $DataCollection3 AllowTelemetry -Value 0 #} ###Enable location tracking for "find my device", uncomment if you don't need it #Disabling Location Tracking #Write-Host "Disabling Location Tracking" #$SensorState = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}" #$LocationConfig = "HKLM:\SYSTEM\CurrentControlSet\Services\lfsvc\Service\Configuration" #If (!(Test-Path $SensorState)) { # New-Item $SensorState #} #Set-ItemProperty $SensorState SensorPermissionState -Value 0 #If (!(Test-Path $LocationConfig)) { # New-Item $LocationConfig #} #Set-ItemProperty $LocationConfig Status -Value 0 #Disables People icon on Taskbar Write-Host "Disabling People icon on Taskbar" $People = 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\People' If (Test-Path $People) { Set-ItemProperty $People -Name PeopleBand -Value 0 } ##Loop through users and do the same foreach ($sid in $UserSIDs) { $People = "Registry::HKU\$sid\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\People" If (Test-Path $People) { Set-ItemProperty $People -Name PeopleBand -Value 0 } } Write-Host "Disabling Cortana" $Cortana1 = "HKCU:\SOFTWARE\Microsoft\Personalization\Settings" $Cortana2 = "HKCU:\SOFTWARE\Microsoft\InputPersonalization" $Cortana3 = "HKCU:\SOFTWARE\Microsoft\InputPersonalization\TrainedDataStore" If (!(Test-Path $Cortana1)) { New-Item $Cortana1 } Set-ItemProperty $Cortana1 AcceptedPrivacyPolicy -Value 0 If (!(Test-Path $Cortana2)) { New-Item $Cortana2 } Set-ItemProperty $Cortana2 RestrictImplicitTextCollection -Value 1 Set-ItemProperty $Cortana2 RestrictImplicitInkCollection -Value 1 If (!(Test-Path $Cortana3)) { New-Item $Cortana3 } Set-ItemProperty $Cortana3 HarvestContacts -Value 0 ##Loop through users and do the same foreach ($sid in $UserSIDs) { $Cortana1 = "Registry::HKU\$sid\SOFTWARE\Microsoft\Personalization\Settings" $Cortana2 = "Registry::HKU\$sid\SOFTWARE\Microsoft\InputPersonalization" $Cortana3 = "Registry::HKU\$sid\SOFTWARE\Microsoft\InputPersonalization\TrainedDataStore" If (!(Test-Path $Cortana1)) { New-Item $Cortana1 } Set-ItemProperty $Cortana1 AcceptedPrivacyPolicy -Value 0 If (!(Test-Path $Cortana2)) { New-Item $Cortana2 } Set-ItemProperty $Cortana2 RestrictImplicitTextCollection -Value 1 Set-ItemProperty $Cortana2 RestrictImplicitInkCollection -Value 1 If (!(Test-Path $Cortana3)) { New-Item $Cortana3 } Set-ItemProperty $Cortana3 HarvestContacts -Value 0 } #Removes 3D Objects from the 'My Computer' submenu in explorer Write-Host "Removing 3D Objects from explorer 'My Computer' submenu" $Objects32 = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}" $Objects64 = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}" If (Test-Path $Objects32) { Remove-Item $Objects32 -Recurse } If (Test-Path $Objects64) { Remove-Item $Objects64 -Recurse } ##Removes the Microsoft Feeds from displaying $registryPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Feeds" $Name = "EnableFeeds" $value = "0" if (!(Test-Path $registryPath)) { New-Item -Path $registryPath -Force | Out-Null New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType DWORD -Force | Out-Null } else { New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType DWORD -Force | Out-Null } ##Kill Cortana again Get-AppxPackage - allusers Microsoft.549981C3F5F10 | Remove AppxPackage ############################################################################################################ # Remove Scheduled Tasks # # # ############################################################################################################ #Disables scheduled tasks that are considered unnecessary Write-Host "Disabling scheduled tasks" $task1 = Get-ScheduledTask -TaskName XblGameSaveTaskLogon -ErrorAction SilentlyContinue if ($null -ne $task1) { Get-ScheduledTask XblGameSaveTaskLogon | Disable-ScheduledTask -ErrorAction SilentlyContinue } $task2 = Get-ScheduledTask -TaskName XblGameSaveTask -ErrorAction SilentlyContinue if ($null -ne $task2) { Get-ScheduledTask XblGameSaveTask | Disable-ScheduledTask -ErrorAction SilentlyContinue } $task3 = Get-ScheduledTask -TaskName Consolidator -ErrorAction SilentlyContinue if ($null -ne $task3) { Get-ScheduledTask Consolidator | Disable-ScheduledTask -ErrorAction SilentlyContinue } $task4 = Get-ScheduledTask -TaskName UsbCeip -ErrorAction SilentlyContinue if ($null -ne $task4) { Get-ScheduledTask UsbCeip | Disable-ScheduledTask -ErrorAction SilentlyContinue } $task5 = Get-ScheduledTask -TaskName DmClient -ErrorAction SilentlyContinue if ($null -ne $task5) { Get-ScheduledTask DmClient | Disable-ScheduledTask -ErrorAction SilentlyContinue } $task6 = Get-ScheduledTask -TaskName DmClientOnScenarioDownload -ErrorAction SilentlyContinue if ($null -ne $task6) { Get-ScheduledTask DmClientOnScenarioDownload | Disable-ScheduledTask -ErrorAction SilentlyContinue } ############################################################################################################ # Disable Services # # # ############################################################################################################ ##Write-Host "Stopping and disabling Diagnostics Tracking Service" #Disabling the Diagnostics Tracking Service ##Stop-Service "DiagTrack" ##Set-Service "DiagTrack" -StartupType Disabled ############################################################################################################ # Windows 11 Specific # # # ############################################################################################################ #Windows 11 Customisations write-host "Removing Windows 11 Customisations" #Remove XBox Game Bar $packages = @( "Microsoft.XboxGamingOverlay", "Microsoft.XboxGameCallableUI", "Microsoft.549981C3F5F10", "*getstarted*", "Microsoft.Windows.ParentalControls" ) ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," $packages = $packages | Where-Object { $customWhitelistApps -notcontains $_ } } foreach ($package in $packages) { $appPackage = Get-AppxPackage -allusers $package -ErrorAction SilentlyContinue if ($appPackage) { Remove-AppxPackage -Package $appPackage.PackageFullName -AllUsers Write-Host "Removed $package" } } #Remove Teams Chat $MSTeams = "MicrosoftTeams" $WinPackage = Get-AppxPackage -allusers | Where-Object {$_.Name -eq $MSTeams} $ProvisionedPackage = Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -eq $WinPackage } if ($null -ne $WinPackage) { Remove-AppxPackage -Package $WinPackage.PackageFullName -AllUsers } if ($null -ne $ProvisionedPackage) { Remove-AppxProvisionedPackage -online -Packagename $ProvisionedPackage.Packagename -AllUsers } ##Tweak reg permissions invoke-webrequest -uri "https://github.com/andrew-s-taylor/public/raw/main/De-Bloat/SetACL.exe" -outfile "C:\Windows\Temp\SetACL.exe" C:\Windows\Temp\SetACL.exe -on "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" -ot reg -actn setowner -ownr "n:$everyone" C:\Windows\Temp\SetACL.exe -on "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" -ot reg -actn ace -ace "n:$everyone;p:full" ##Stop it coming back $registryPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" If (!(Test-Path $registryPath)) { New-Item $registryPath } Set-ItemProperty $registryPath ConfigureChatAutoInstall -Value 0 ##Unpin it $registryPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Chat" If (!(Test-Path $registryPath)) { New-Item $registryPath } Set-ItemProperty $registryPath "ChatIcon" -Value 2 write-host "Removed Teams Chat" ############################################################################################################ # Windows Backup App # # # ############################################################################################################ $version = Get-CimInstance Win32_OperatingSystem | Select-Object -ExpandProperty Caption if ($version -like "*Windows 10*") { write-host "Removing Windows Backup" $filepath = "C:\Windows\SystemApps\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\WindowsBackup\Assets" if (Test-Path $filepath) { Remove-WindowsPackage -Online -PackageName "Microsoft-Windows-UserExperience-Desktop-Package~31bf3856ad364e35~amd64~~10.0.19041.3393" ##Add back snipping tool functionality write-host "Adding Windows Shell Components" DISM /Online /Add-Capability /CapabilityName:Windows.Client.ShellComponents~~~~0.0.1.0 write-host "Components Added" } write-host "Removed" } ############################################################################################################ # Windows CoPilot # # # ############################################################################################################ $version = Get-CimInstance Win32_OperatingSystem | Select-Object -ExpandProperty Caption if ($version -like "*Windows 11*") { write-host "Removing Windows Copilot" # Define the registry key and value $registryPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsCopilot" $propertyName = "TurnOffWindowsCopilot" $propertyValue = 1 # Check if the registry key exists if (!(Test-Path $registryPath)) { # If the registry key doesn't exist, create it New-Item -Path $registryPath -Force | Out-Null } # Get the property value $currentValue = Get-ItemProperty -Path $registryPath -Name $propertyName -ErrorAction SilentlyContinue # Check if the property exists and if its value is different from the desired value if ($null -eq $currentValue -or $currentValue.$propertyName -ne $propertyValue) { # If the property doesn't exist or its value is different, set the property value Set-ItemProperty -Path $registryPath -Name $propertyName -Value $propertyValue } ##Grab the default user as well $registryPath = "HKEY_USERS\.DEFAULT\Software\Policies\Microsoft\Windows\WindowsCopilot" $propertyName = "TurnOffWindowsCopilot" $propertyValue = 1 # Check if the registry key exists if (!(Test-Path $registryPath)) { # If the registry key doesn't exist, create it New-Item -Path $registryPath -Force | Out-Null } # Get the property value $currentValue = Get-ItemProperty -Path $registryPath -Name $propertyName -ErrorAction SilentlyContinue # Check if the property exists and if its value is different from the desired value if ($null -eq $currentValue -or $currentValue.$propertyName -ne $propertyValue) { # If the property doesn't exist or its value is different, set the property value Set-ItemProperty -Path $registryPath -Name $propertyName -Value $propertyValue } ##Load the default hive from c:\users\Default\NTUSER.dat reg load HKU\temphive "c:\users\default\ntuser.dat" $registryPath = "registry::hku\temphive\Software\Policies\Microsoft\Windows\WindowsCopilot" $propertyName = "TurnOffWindowsCopilot" $propertyValue = 1 # Check if the registry key exists if (!(Test-Path $registryPath)) { # If the registry key doesn't exist, create it [Microsoft.Win32.RegistryKey]$HKUCoPilot = [Microsoft.Win32.Registry]::Users.CreateSubKey("temphive\Software\Policies\Microsoft\Windows\WindowsCopilot", [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree) $HKUCoPilot.SetValue("TurnOffWindowsCopilot", 0x1, [Microsoft.Win32.RegistryValueKind]::DWord) } $HKUCoPilot.Flush() $HKUCoPilot.Close() [gc]::Collect() [gc]::WaitForPendingFinalizers() reg unload HKU\temphive write-host "Removed" foreach ($sid in $UserSIDs) { $registryPath = "Registry::HKU\$sid\SOFTWARE\Policies\Microsoft\Windows\WindowsCopilot" $propertyName = "TurnOffWindowsCopilot" $propertyValue = 1 # Check if the registry key exists if (!(Test-Path $registryPath)) { # If the registry key doesn't exist, create it New-Item -Path $registryPath -Force | Out-Null } # Get the property value $currentValue = Get-ItemProperty -Path $registryPath -Name $propertyName -ErrorAction SilentlyContinue # Check if the property exists and if its value is different from the desired value if ($null -eq $currentValue -or $currentValue.$propertyName -ne $propertyValue) { # If the property doesn't exist or its value is different, set the property value Set-ItemProperty -Path $registryPath -Name $propertyName -Value $propertyValue } } } ############################################################################################################ # Clear Start Menu # # # ############################################################################################################ write-host "Clearing Start Menu" #Delete layout file if it already exists ##Check windows version $version = Get-CimInstance Win32_OperatingSystem | Select-Object -ExpandProperty Caption if ($version -like "*Windows 10*") { write-host "Windows 10 Detected" write-host "Removing Current Layout" If(Test-Path C:\Windows\StartLayout.xml) { Remove-Item C:\Windows\StartLayout.xml } write-host "Creating Default Layout" #Creates the blank layout file Write-Output "" >> C:\Windows\StartLayout.xml Write-Output " " >> C:\Windows\StartLayout.xml Write-Output " " >> C:\Windows\StartLayout.xml Write-Output " " >> C:\Windows\StartLayout.xml Write-Output " " >> C:\Windows\StartLayout.xml Write-Output " " >> C:\Windows\StartLayout.xml Write-Output " " >> C:\Windows\StartLayout.xml Write-Output "" >> C:\Windows\StartLayout.xml } if ($version -like "*Windows 11*") { write-host "Windows 11 Detected" write-host "Removing Current Layout" If(Test-Path "C:\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml") { Remove-Item "C:\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" } $blankjson = @' { "pinnedList": [ { "desktopAppId": "MSEdge" }, { "packagedAppId": "Microsoft.WindowsStore_8wekyb3d8bbwe!App" }, { "packagedAppId": "desktopAppId":"Microsoft.Windows.Explorer" } ] } '@ $blankjson | Out-File "C:\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" -Encoding utf8 -Force } ############################################################################################################ # Remove Xbox Gaming # # # ############################################################################################################ New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\xbgm" -Name "Start" -PropertyType DWORD -Value 4 -Force Set-Service -Name XblAuthManager -StartupType Disabled Set-Service -Name XblGameSave -StartupType Disabled Set-Service -Name XboxGipSvc -StartupType Disabled Set-Service -Name XboxNetApiSvc -StartupType Disabled $task = Get-ScheduledTask -TaskName "Microsoft\XblGameSave\XblGameSaveTask" -ErrorAction SilentlyContinue if ($null -ne $task) { Set-ScheduledTask -TaskPath $task.TaskPath -Enabled $false } ##Check if GamePresenceWriter.exe exists if (Test-Path "$env:WinDir\System32\GameBarPresenceWriter.exe") { write-host "GamePresenceWriter.exe exists" C:\Windows\Temp\SetACL.exe -on "$env:WinDir\System32\GameBarPresenceWriter.exe" -ot file -actn setowner -ownr "n:$everyone" C:\Windows\Temp\SetACL.exe -on "$env:WinDir\System32\GameBarPresenceWriter.exe" -ot file -actn ace -ace "n:$everyone;p:full" #Take-Ownership -Path "$env:WinDir\System32\GameBarPresenceWriter.exe" $NewAcl = Get-Acl -Path "$env:WinDir\System32\GameBarPresenceWriter.exe" # Set properties $identity = "$builtin\Administrators" $fileSystemRights = "FullControl" $type = "Allow" # Create new rule $fileSystemAccessRuleArgumentList = $identity, $fileSystemRights, $type $fileSystemAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $fileSystemAccessRuleArgumentList # Apply new rule $NewAcl.SetAccessRule($fileSystemAccessRule) Set-Acl -Path "$env:WinDir\System32\GameBarPresenceWriter.exe" -AclObject $NewAcl Stop-Process -Name "GameBarPresenceWriter.exe" -Force Remove-Item "$env:WinDir\System32\GameBarPresenceWriter.exe" -Force -Confirm:$false } else { write-host "GamePresenceWriter.exe does not exist" } New-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\GameDVR" -Name "AllowgameDVR" -PropertyType DWORD -Value 0 -Force New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" -Name "SettingsPageVisibility" -PropertyType String -Value "hide:gaming-gamebar;gaming-gamedvr;gaming-broadcasting;gaming-gamemode;gaming-xboxnetworking" -Force Remove-Item C:\Windows\Temp\SetACL.exe -recurse ############################################################################################################ # Disable Edge Surf Game # # # ############################################################################################################ $surf = "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge" If (!(Test-Path $surf)) { New-Item $surf } New-ItemProperty -Path $surf -Name 'AllowSurfGame' -Value 0 -PropertyType DWord ############################################################################################################ # Grab all Uninstall Strings # # # ############################################################################################################ write-host "Checking 32-bit System Registry" ##Search for 32-bit versions and list them $allstring = @() $path1 = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" #Loop Through the apps if name has Adobe and NOT reader $32apps = Get-ChildItem -Path $path1 | Get-ItemProperty | Select-Object -Property DisplayName, UninstallString foreach ($32app in $32apps) { #Get uninstall string $string1 = $32app.uninstallstring #Check if it's an MSI install if ($string1 -match "^msiexec*") { #MSI install, replace the I with an X and make it quiet $string2 = $string1 + " /quiet /norestart" $string2 = $string2 -replace "/I", "/X " #Create custom object with name and string $allstring += New-Object -TypeName PSObject -Property @{ Name = $32app.DisplayName String = $string2 } } else { #Exe installer, run straight path $string2 = $string1 $allstring += New-Object -TypeName PSObject -Property @{ Name = $32app.DisplayName String = $string2 } } } write-host "32-bit check complete" write-host "Checking 64-bit System registry" ##Search for 64-bit versions and list them $path2 = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" #Loop Through the apps if name has Adobe and NOT reader $64apps = Get-ChildItem -Path $path2 | Get-ItemProperty | Select-Object -Property DisplayName, UninstallString foreach ($64app in $64apps) { #Get uninstall string $string1 = $64app.uninstallstring #Check if it's an MSI install if ($string1 -match "^msiexec*") { #MSI install, replace the I with an X and make it quiet $string2 = $string1 + " /quiet /norestart" $string2 = $string2 -replace "/I", "/X " #Uninstall with string2 params $allstring += New-Object -TypeName PSObject -Property @{ Name = $64app.DisplayName String = $string2 } } else { #Exe installer, run straight path $string2 = $string1 $allstring += New-Object -TypeName PSObject -Property @{ Name = $64app.DisplayName String = $string2 } } } write-host "64-bit checks complete" ##USER write-host "Checking 32-bit User Registry" ##Search for 32-bit versions and list them $path1 = "HKCU:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" ##Check if path exists if (Test-Path $path1) { #Loop Through the apps if name has Adobe and NOT reader $32apps = Get-ChildItem -Path $path1 | Get-ItemProperty | Select-Object -Property DisplayName, UninstallString foreach ($32app in $32apps) { #Get uninstall string $string1 = $32app.uninstallstring #Check if it's an MSI install if ($string1 -match "^msiexec*") { #MSI install, replace the I with an X and make it quiet $string2 = $string1 + " /quiet /norestart" $string2 = $string2 -replace "/I", "/X " #Create custom object with name and string $allstring += New-Object -TypeName PSObject -Property @{ Name = $32app.DisplayName String = $string2 } } else { #Exe installer, run straight path $string2 = $string1 $allstring += New-Object -TypeName PSObject -Property @{ Name = $32app.DisplayName String = $string2 } } } } write-host "32-bit check complete" write-host "Checking 64-bit Use registry" ##Search for 64-bit versions and list them $path2 = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" #Loop Through the apps if name has Adobe and NOT reader $64apps = Get-ChildItem -Path $path2 | Get-ItemProperty | Select-Object -Property DisplayName, UninstallString foreach ($64app in $64apps) { #Get uninstall string $string1 = $64app.uninstallstring #Check if it's an MSI install if ($string1 -match "^msiexec*") { #MSI install, replace the I with an X and make it quiet $string2 = $string1 + " /quiet /norestart" $string2 = $string2 -replace "/I", "/X " #Uninstall with string2 params $allstring += New-Object -TypeName PSObject -Property @{ Name = $64app.DisplayName String = $string2 } } else { #Exe installer, run straight path $string2 = $string1 $allstring += New-Object -TypeName PSObject -Property @{ Name = $64app.DisplayName String = $string2 } } } ############################################################################################################ # Remove Manufacturer Bloat # # # ############################################################################################################ ##Check Manufacturer write-host "Detecting Manufacturer" $details = Get-CimInstance -ClassName Win32_ComputerSystem $manufacturer = $details.Manufacturer if ($manufacturer -like "*HP*") { Write-Host "HP detected" #Remove HP bloat ##HP Specific $UninstallPrograms = @( "HP Client Security Manager" "HP Notifications" "HP Security Update Service" "HP System Default Settings" "*HP Wolf*" "HP Wolf Security" "HP Wolf Security Application Support for Sure Sense" "HP Wolf Security Application Support for Windows" "AD2F1837.HPPCHardwareDiagnosticsWindows" "AD2F1837.HPPowerManager" "AD2F1837.HPPrivacySettings" "AD2F1837.HPQuickDrop" "AD2F1837.HPSupportAssistant" "AD2F1837.HPSystemInformation" "AD2F1837.myHP" "RealtekSemiconductorCorp.HPAudioControl", "HP Sure Recover", "HP Sure Run Module" "RealtekSemiconductorCorp.HPAudioControl_2.39.280.0_x64__dt26b99r8h8gj" ) ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," $UninstallPrograms = $UninstallPrograms | Where-Object { $customWhitelistApps -notcontains $_ } } $WhitelistedApps = @( ) ##Add custom whitelist apps ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," foreach ($customwhitelistapp in $customwhitelistapps) { $WhitelistedApps += $customwhitelistapp } } $HPidentifier = "AD2F1837" $InstalledPackages = Get-AppxPackage -AllUsers | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $ProvisionedPackages = Get-AppxProvisionedPackage -Online | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $InstalledPrograms = $allstring | Where-Object {$UninstallPrograms -contains $_.Name} # Remove provisioned packages first ForEach ($ProvPackage in $ProvisionedPackages) { Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..." Try { $Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]" } Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"} } # Remove appx packages ForEach ($AppxPackage in $InstalledPackages) { Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..." Try { $Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]" } Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"} } # Remove installed programs $InstalledPrograms | ForEach-Object { Write-Host -Object "Attempting to uninstall: [$($_.Name)]..." $uninstallcommand = $_.String Try { if ($uninstallcommand -match "^msiexec*") { #Remove msiexec as we need to split for the uninstall $uninstallcommand = $uninstallcommand -replace "msiexec.exe", "" #Uninstall with string2 params Start-Process 'msiexec.exe' -ArgumentList $uninstallcommand -NoNewWindow -Wait } else { #Exe installer, run straight path $string2 = $uninstallcommand start-process $string2 } #$A = Start-Process -FilePath $uninstallcommand -Wait -passthru -NoNewWindow;$a.ExitCode #$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop Write-Host -Object "Successfully uninstalled: [$($_.Name)]" } Catch {Write-Warning -Message "Failed to uninstall: [$($_.Name)]"} } ##Belt and braces, remove via CIM too foreach ($program in $UninstallPrograms) { Get-CimInstance -Classname Win32_Product | Where-Object Name -Match $program | Invoke-CimMethod -MethodName UnInstall } #Remove HP Documentation if it exists if (test-path -Path "C:\Program Files\HP\Documentation\Doc_uninstall.cmd") { $A = Start-Process -FilePath "C:\Program Files\HP\Documentation\Doc_uninstall.cmd" -Wait -passthru -NoNewWindow } ##Remove HP Connect Optimizer if setup.exe exists if (test-path -Path 'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe') { invoke-webrequest -uri "https://raw.githubusercontent.com/andrew-s-taylor/public/main/De-Bloat/HPConnOpt.iss" -outfile "C:\Windows\Temp\HPConnOpt.iss" &'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe' @('-s', '-f1C:\Windows\Temp\HPConnOpt.iss') } Write-Host "Removed HP bloat" } if ($manufacturer -like "*HP*") { Write-Host "HP detected" #Remove HP bloat ##HP Specific $UninstallPrograms = @( "HP Client Security Manager" "HP Notifications" "HP Security Update Service" "HP System Default Settings" "*HP Wolf*" "HP Wolf Security" "HP Wolf Security Application Support for Sure Sense" "HP Wolf Security Application Support for Windows" "AD2F1837.HPPCHardwareDiagnosticsWindows" "AD2F1837.HPPowerManager" "AD2F1837.HPPrivacySettings" "AD2F1837.HPQuickDrop" "AD2F1837.HPSupportAssistant" "AD2F1837.HPSystemInformation" "AD2F1837.myHP" "RealtekSemiconductorCorp.HPAudioControl", "HP Sure Recover", "HP Sure Run Module" "RealtekSemiconductorCorp.HPAudioControl_2.39.280.0_x64__dt26b99r8h8gj" ) ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," $UninstallPrograms = $UninstallPrograms | Where-Object { $customWhitelistApps -notcontains $_ } } $WhitelistedApps = @( ) ##Add custom whitelist apps ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," foreach ($customwhitelistapp in $customwhitelistapps) { $WhitelistedApps += $customwhitelistapp } } $HPidentifier = "AD2F1837" $InstalledPackages = Get-AppxPackage -AllUsers | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $ProvisionedPackages = Get-AppxProvisionedPackage -Online | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $InstalledPrograms = $allstring | Where-Object {$UninstallPrograms -contains $_.Name} # Remove provisioned packages first ForEach ($ProvPackage in $ProvisionedPackages) { Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..." Try { $Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]" } Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"} } # Remove appx packages ForEach ($AppxPackage in $InstalledPackages) { Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..." Try { $Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]" } Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"} } # Remove installed programs $InstalledPrograms | ForEach-Object { Write-Host -Object "Attempting to uninstall: [$($_.Name)]..." $uninstallcommand = $_.String Try { if ($uninstallcommand -match "^msiexec*") { #Remove msiexec as we need to split for the uninstall $uninstallcommand = $uninstallcommand -replace "msiexec.exe", "" #Uninstall with string2 params Start-Process 'msiexec.exe' -ArgumentList $uninstallcommand -NoNewWindow -Wait } else { #Exe installer, run straight path $string2 = $uninstallcommand start-process $string2 } #$A = Start-Process -FilePath $uninstallcommand -Wait -passthru -NoNewWindow;$a.ExitCode #$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop Write-Host -Object "Successfully uninstalled: [$($_.Name)]" } Catch {Write-Warning -Message "Failed to uninstall: [$($_.Name)]"} } ##Belt and braces, remove via CIM too foreach ($program in $UninstallPrograms) { Get-CimInstance -Classname Win32_Product | Where-Object Name -Match $program | Invoke-CimMethod -MethodName UnInstall } #Remove HP Documentation if it exists if (test-path -Path "C:\Program Files\HP\Documentation\Doc_uninstall.cmd") { $A = Start-Process -FilePath "C:\Program Files\HP\Documentation\Doc_uninstall.cmd" -Wait -passthru -NoNewWindow } ##Remove HP Connect Optimizer if setup.exe exists if (test-path -Path 'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe') { invoke-webrequest -uri "https://raw.githubusercontent.com/andrew-s-taylor/public/main/De-Bloat/HPConnOpt.iss" -outfile "C:\Windows\Temp\HPConnOpt.iss" &'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe' @('-s', '-f1C:\Windows\Temp\HPConnOpt.iss') } Write-Host "Removed HP bloat" } if ($manufacturer -like "*HP*") { Write-Host "HP detected" #Remove HP bloat ##HP Specific $UninstallPrograms = @( "HP Client Security Manager" "HP Notifications" "HP Security Update Service" "HP System Default Settings" "*HP Wolf*" "HP Wolf Security" "HP Wolf Security Application Support for Sure Sense" "HP Wolf Security Application Support for Windows" "AD2F1837.HPPCHardwareDiagnosticsWindows" "AD2F1837.HPPowerManager" "AD2F1837.HPPrivacySettings" "AD2F1837.HPQuickDrop" "AD2F1837.HPSupportAssistant" "AD2F1837.HPSystemInformation" "AD2F1837.myHP" "RealtekSemiconductorCorp.HPAudioControl", "HP Sure Recover", "HP Sure Run Module" "RealtekSemiconductorCorp.HPAudioControl_2.39.280.0_x64__dt26b99r8h8gj" ) ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," $UninstallPrograms = $UninstallPrograms | Where-Object { $customWhitelistApps -notcontains $_ } } $WhitelistedApps = @( ) ##Add custom whitelist apps ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," foreach ($customwhitelistapp in $customwhitelistapps) { $WhitelistedApps += $customwhitelistapp } } $HPidentifier = "AD2F1837" $InstalledPackages = Get-AppxPackage -AllUsers | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $ProvisionedPackages = Get-AppxProvisionedPackage -Online | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $InstalledPrograms = $allstring | Where-Object {$UninstallPrograms -contains $_.Name} # Remove provisioned packages first ForEach ($ProvPackage in $ProvisionedPackages) { Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..." Try { $Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]" } Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"} } # Remove appx packages ForEach ($AppxPackage in $InstalledPackages) { Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..." Try { $Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]" } Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"} } # Remove installed programs $InstalledPrograms | ForEach-Object { Write-Host -Object "Attempting to uninstall: [$($_.Name)]..." $uninstallcommand = $_.String Try { if ($uninstallcommand -match "^msiexec*") { #Remove msiexec as we need to split for the uninstall $uninstallcommand = $uninstallcommand -replace "msiexec.exe", "" #Uninstall with string2 params Start-Process 'msiexec.exe' -ArgumentList $uninstallcommand -NoNewWindow -Wait } else { #Exe installer, run straight path $string2 = $uninstallcommand start-process $string2 } #$A = Start-Process -FilePath $uninstallcommand -Wait -passthru -NoNewWindow;$a.ExitCode #$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop Write-Host -Object "Successfully uninstalled: [$($_.Name)]" } Catch {Write-Warning -Message "Failed to uninstall: [$($_.Name)]"} } ##Belt and braces, remove via CIM too foreach ($program in $UninstallPrograms) { Get-CimInstance -Classname Win32_Product | Where-Object Name -Match $program | Invoke-CimMethod -MethodName UnInstall } #Remove HP Documentation if it exists if (test-path -Path "C:\Program Files\HP\Documentation\Doc_uninstall.cmd") { $A = Start-Process -FilePath "C:\Program Files\HP\Documentation\Doc_uninstall.cmd" -Wait -passthru -NoNewWindow } ##Remove HP Connect Optimizer if setup.exe exists if (test-path -Path 'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe') { invoke-webrequest -uri "https://raw.githubusercontent.com/andrew-s-taylor/public/main/De-Bloat/HPConnOpt.iss" -outfile "C:\Windows\Temp\HPConnOpt.iss" &'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe' @('-s', '-f1C:\Windows\Temp\HPConnOpt.iss') } Write-Host "Removed HP bloat" } if ($manufacturer -like "*HP*") { Write-Host "HP detected" #Remove HP bloat ##HP Specific $UninstallPrograms = @( "HP Client Security Manager" "HP Notifications" "HP Security Update Service" "HP System Default Settings" "*HP Wolf*" "HP Wolf Security" "HP Wolf Security Application Support for Sure Sense" "HP Wolf Security Application Support for Windows" "AD2F1837.HPPCHardwareDiagnosticsWindows" "AD2F1837.HPPowerManager" "AD2F1837.HPPrivacySettings" "AD2F1837.HPQuickDrop" "AD2F1837.HPSupportAssistant" "AD2F1837.HPSystemInformation" "AD2F1837.myHP" "RealtekSemiconductorCorp.HPAudioControl", "HP Sure Recover", "HP Sure Run Module" "RealtekSemiconductorCorp.HPAudioControl_2.39.280.0_x64__dt26b99r8h8gj" ) ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," $UninstallPrograms = $UninstallPrograms | Where-Object { $customWhitelistApps -notcontains $_ } } $WhitelistedApps = @( ) ##Add custom whitelist apps ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," foreach ($customwhitelistapp in $customwhitelistapps) { $WhitelistedApps += $customwhitelistapp } } $HPidentifier = "AD2F1837" $InstalledPackages = Get-AppxPackage -AllUsers | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $ProvisionedPackages = Get-AppxProvisionedPackage -Online | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $InstalledPrograms = $allstring | Where-Object {$UninstallPrograms -contains $_.Name} # Remove provisioned packages first ForEach ($ProvPackage in $ProvisionedPackages) { Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..." Try { $Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]" } Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"} } # Remove appx packages ForEach ($AppxPackage in $InstalledPackages) { Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..." Try { $Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]" } Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"} } # Remove installed programs $InstalledPrograms | ForEach-Object { Write-Host -Object "Attempting to uninstall: [$($_.Name)]..." $uninstallcommand = $_.String Try { if ($uninstallcommand -match "^msiexec*") { #Remove msiexec as we need to split for the uninstall $uninstallcommand = $uninstallcommand -replace "msiexec.exe", "" #Uninstall with string2 params Start-Process 'msiexec.exe' -ArgumentList $uninstallcommand -NoNewWindow -Wait } else { #Exe installer, run straight path $string2 = $uninstallcommand start-process $string2 } #$A = Start-Process -FilePath $uninstallcommand -Wait -passthru -NoNewWindow;$a.ExitCode #$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop Write-Host -Object "Successfully uninstalled: [$($_.Name)]" } Catch {Write-Warning -Message "Failed to uninstall: [$($_.Name)]"} } ##Belt and braces, remove via CIM too foreach ($program in $UninstallPrograms) { Get-CimInstance -Classname Win32_Product | Where-Object Name -Match $program | Invoke-CimMethod -MethodName UnInstall } #Remove HP Documentation if it exists if (test-path -Path "C:\Program Files\HP\Documentation\Doc_uninstall.cmd") { $A = Start-Process -FilePath "C:\Program Files\HP\Documentation\Doc_uninstall.cmd" -Wait -passthru -NoNewWindow } ##Remove HP Connect Optimizer if setup.exe exists if (test-path -Path 'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe') { invoke-webrequest -uri "https://raw.githubusercontent.com/andrew-s-taylor/public/main/De-Bloat/HPConnOpt.iss" -outfile "C:\Windows\Temp\HPConnOpt.iss" &'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe' @('-s', '-f1C:\Windows\Temp\HPConnOpt.iss') } Write-Host "Removed HP bloat" } if ($manufacturer -like "*HP*") { Write-Host "HP detected" #Remove HP bloat ##HP Specific $UninstallPrograms = @( "HP Client Security Manager" "HP Notifications" "HP Security Update Service" "HP System Default Settings" "*HP Wolf*" "HP Wolf Security" "HP Wolf Security Application Support for Sure Sense" "HP Wolf Security Application Support for Windows" "AD2F1837.HPPCHardwareDiagnosticsWindows" "AD2F1837.HPPowerManager" "AD2F1837.HPPrivacySettings" "AD2F1837.HPQuickDrop" "AD2F1837.HPSupportAssistant" "AD2F1837.HPSystemInformation" "AD2F1837.myHP" "RealtekSemiconductorCorp.HPAudioControl", "HP Sure Recover", "HP Sure Run Module" "RealtekSemiconductorCorp.HPAudioControl_2.39.280.0_x64__dt26b99r8h8gj" ) ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," $UninstallPrograms = $UninstallPrograms | Where-Object { $customWhitelistApps -notcontains $_ } } $WhitelistedApps = @( ) ##Add custom whitelist apps ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," foreach ($customwhitelistapp in $customwhitelistapps) { $WhitelistedApps += $customwhitelistapp } } $HPidentifier = "AD2F1837" $InstalledPackages = Get-AppxPackage -AllUsers | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $ProvisionedPackages = Get-AppxProvisionedPackage -Online | Where-Object {(($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier"))-and ($_.Name -NotMatch $WhitelistedApps)} $InstalledPrograms = $allstring | Where-Object {$UninstallPrograms -contains $_.Name} # Remove provisioned packages first ForEach ($ProvPackage in $ProvisionedPackages) { Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..." Try { $Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]" } Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"} } # Remove appx packages ForEach ($AppxPackage in $InstalledPackages) { Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..." Try { $Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]" } Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"} } # Remove installed programs $InstalledPrograms | ForEach-Object { Write-Host -Object "Attempting to uninstall: [$($_.Name)]..." $uninstallcommand = $_.String Try { if ($uninstallcommand -match "^msiexec*") { #Remove msiexec as we need to split for the uninstall $uninstallcommand = $uninstallcommand -replace "msiexec.exe", "" #Uninstall with string2 params Start-Process 'msiexec.exe' -ArgumentList $uninstallcommand -NoNewWindow -Wait } else { #Exe installer, run straight path $string2 = $uninstallcommand start-process $string2 } #$A = Start-Process -FilePath $uninstallcommand -Wait -passthru -NoNewWindow;$a.ExitCode #$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop Write-Host -Object "Successfully uninstalled: [$($_.Name)]" } Catch {Write-Warning -Message "Failed to uninstall: [$($_.Name)]"} } ##Belt and braces, remove via CIM too foreach ($program in $UninstallPrograms) { Get-CimInstance -Classname Win32_Product | Where-Object Name -Match $program | Invoke-CimMethod -MethodName UnInstall } #Remove HP Documentation if it exists if (test-path -Path "C:\Program Files\HP\Documentation\Doc_uninstall.cmd") { $A = Start-Process -FilePath "C:\Program Files\HP\Documentation\Doc_uninstall.cmd" -Wait -passthru -NoNewWindow } ##Remove HP Connect Optimizer if setup.exe exists if (test-path -Path 'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe') { invoke-webrequest -uri "https://raw.githubusercontent.com/andrew-s-taylor/public/main/De-Bloat/HPConnOpt.iss" -outfile "C:\Windows\Temp\HPConnOpt.iss" &'C:\Program Files (x86)\InstallShield Installation Information\{6468C4A5-E47E-405F-B675-A70A70983EA6}\setup.exe' @('-s', '-f1C:\Windows\Temp\HPConnOpt.iss') } Write-Host "Removed HP bloat" } if ($manufacturer -like "*Dell*") { Write-Host "Dell detected" #Remove Dell bloat ##Dell $UninstallPrograms = @( "Dell Optimizer" "Dell Power Manager" "DellOptimizerUI" "Dell SupportAssist OS Recovery" "Dell SupportAssist" "Dell Optimizer Service" "Dell Optimizer Core" "DellInc.PartnerPromo" "DellInc.DellOptimizer" "DellInc.DellCommandUpdate" "DellInc.DellPowerManager" "DellInc.DellDigitalDelivery" "DellInc.DellSupportAssistforPCs" "DellInc.PartnerPromo" "Dell Command | Update" "Dell Command | Update for Windows Universal" "Dell Command | Update for Windows 10" "Dell Command | Power Manager" "Dell Digital Delivery Service" "Dell Digital Delivery" "Dell Peripheral Manager" "Dell Power Manager Service" "Dell SupportAssist Remediation" "SupportAssist Recovery Assistant" "Dell SupportAssist OS Recovery Plugin for Dell Update" "Dell SupportAssistAgent" "Dell Update - SupportAssist Update Plugin" "Dell Core Services" "Dell Pair" "Dell Display Manager 2.0" "Dell Display Manager 2.1" "Dell Display Manager 2.2" "Dell SupportAssist Remediation" "Dell Update - SupportAssist Update Plugin" "DellInc.PartnerPromo" ) $WhitelistedApps = @( "WavesAudio.MaxxAudioProforDell2019" "Dell - Extension*" "Dell, Inc. - Firmware*" ) ##Add custom whitelist apps ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," foreach ($customwhitelistapp in $customwhitelistapps) { $WhitelistedApps += $customwhitelistapp } } $InstalledPackages = Get-AppxPackage -AllUsers | Where-Object {(($_.Name -in $UninstallPrograms) -or ($_.Name -like "*Dell*")) -and ($_.Name -NotMatch $WhitelistedApps)} $ProvisionedPackages = Get-AppxProvisionedPackage -Online | Where-Object {(($_.Name -in $UninstallPrograms) -or ($_.Name -like "*Dell*")) -and ($_.Name -NotMatch $WhitelistedApps)} $InstalledPrograms = $allstring | Where-Object {(($_.Name -in $UninstallPrograms) -or ($_.Name -like "*Dell*")) -and ($_.Name -NotMatch $WhitelistedApps)} # Remove provisioned packages first ForEach ($ProvPackage in $ProvisionedPackages) { Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..." Try { $Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]" } Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"} } # Remove appx packages ForEach ($AppxPackage in $InstalledPackages) { Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..." Try { $Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]" } Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"} } # Remove any bundled packages ForEach ($AppxPackage in $InstalledPackages) { Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..." Try { $null = Get-AppxPackage -AllUsers -PackageTypeFilter Main, Bundle, Resource -Name $AppxPackage.Name | Remove-AppxPackage -AllUsers Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]" } Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"} } # Remove installed programs $InstalledPrograms | ForEach-Object { Write-Host -Object "Attempting to uninstall: [$($_.Name)]..." $uninstallcommand = $_.String Try { if ($uninstallcommand -match "^msiexec*") { #Remove msiexec as we need to split for the uninstall $uninstallcommand = $uninstallcommand -replace "msiexec.exe", "" $uninstallcommand = $uninstallcommand + " /quiet /norestart" $uninstallcommand = $uninstallcommand -replace "/I", "/X " #Uninstall with string2 params Start-Process 'msiexec.exe' -ArgumentList $uninstallcommand -NoNewWindow -Wait } else { #Exe installer, run straight path $string2 = $uninstallcommand start-process $string2 } #$A = Start-Process -FilePath $uninstallcommand -Wait -passthru -NoNewWindow;$a.ExitCode #$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop Write-Host -Object "Successfully uninstalled: [$($_.Name)]" } Catch {Write-Warning -Message "Failed to uninstall: [$($_.Name)]"} } ##Belt and braces, remove via CIM too foreach ($program in $UninstallPrograms) { Get-CimInstance -Classname Win32_Product | Where-Object Name -Match $program | Invoke-CimMethod -MethodName UnInstall } ##Manual Removals ##Dell Optimizer $dellSA = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -like "Dell*Optimizer*Core" } | Select-Object -Property UninstallString ForEach ($sa in $dellSA) { if ($sa.UninstallString) { cmd.exe /c $sa.UninstallString /quiet /norestart } } ##Dell Dell SupportAssist OS Recovery Plugin for Dell Update $dellSA = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -match "SupportAssist" } | Select-Object -Property UninstallString ForEach ($sa in $dellSA) { if ($sa.UninstallString) { cmd.exe /c $sa.UninstallString /quiet /norestart } } ##Dell Dell SupportAssist Remediation $uninstallcommand = "/X {C4543FDB-3BC0-4585-B1C5-258FB7C2EA71} /qn" Start-Process 'msiexec.exe' -ArgumentList $uninstallcommand -NoNewWindow -Wait } if ($manufacturer -like "Lenovo") { Write-Host "Lenovo detected" #Remove HP bloat ##Lenovo Specific # Function to uninstall applications with .exe uninstall strings function UninstallApp { param ( [string]$appName ) # Get a list of installed applications from Programs and Features $installedApps = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { $_.DisplayName -like "*$appName*" } # Loop through the list of installed applications and uninstall them foreach ($app in $installedApps) { $uninstallString = $app.UninstallString $displayName = $app.DisplayName Write-Host "Uninstalling: $displayName" Start-Process $uninstallString -ArgumentList "/VERYSILENT" -Wait Write-Host "Uninstalled: $displayName" -ForegroundColor Green } } ##Stop Running Processes $processnames = @( "SmartAppearanceSVC.exe" "UDClientService.exe" "ModuleCoreService.exe" "ProtectedModuleHost.exe" "*lenovo*" "FaceBeautify.exe" "McCSPServiceHost.exe" "mcapexe.exe" "MfeAVSvc.exe" "mcshield.exe" "Ammbkproc.exe" "AIMeetingManager.exe" "DADUpdater.exe" "CommercialVantage.exe" ) foreach ($process in $processnames) { write-host "Stopping Process $process" Get-Process -Name $process | Stop-Process -Force write-host "Process $process Stopped" } $UninstallPrograms = @( "E046963F.AIMeetingManager" "E0469640.SmartAppearance" "MirametrixInc.GlancebyMirametrix" "E046963F.LenovoCompanion" "E0469640.LenovoUtility" "E0469640.LenovoSmartCommunication" "E046963F.LenovoSettingsforEnterprise" "E046963F.cameraSettings" "4505Fortemedia.FMAPOControl2_2.1.37.0_x64__4pejv7q2gmsnr" "ElevocTechnologyCo.Ltd.SmartMicrophoneSettings_1.1.49.0_x64__ttaqwwhyt5s6t" ) ##If custom whitelist specified, remove from array if ($customwhitelist) { $customWhitelistApps = $customwhitelist -split "," $UninstallPrograms = $UninstallPrograms | Where-Object { $customWhitelistApps -notcontains $_ } } $InstalledPackages = Get-AppxPackage -AllUsers | Where-Object {(($_.Name -in $UninstallPrograms))} $ProvisionedPackages = Get-AppxProvisionedPackage -Online | Where-Object {(($_.Name -in $UninstallPrograms))} $InstalledPrograms = $allstring | Where-Object {(($_.Name -in $UninstallPrograms))} # Remove provisioned packages first ForEach ($ProvPackage in $ProvisionedPackages) { Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..." Try { $Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]" } Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"} } # Remove appx packages ForEach ($AppxPackage in $InstalledPackages) { Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..." Try { $Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]" } Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"} } # Remove any bundled packages ForEach ($AppxPackage in $InstalledPackages) { Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..." Try { $null = Get-AppxPackage -AllUsers -PackageTypeFilter Main, Bundle, Resource -Name $AppxPackage.Name | Remove-AppxPackage -AllUsers Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]" } Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"} } # Remove installed programs $InstalledPrograms | ForEach-Object { Write-Host -Object "Attempting to uninstall: [$($_.Name)]..." $uninstallcommand = $_.String Try { if ($uninstallcommand -match "^msiexec*") { #Remove msiexec as we need to split for the uninstall $uninstallcommand = $uninstallcommand -replace "msiexec.exe", "" #Uninstall with string2 params Start-Process 'msiexec.exe' -ArgumentList $uninstallcommand -NoNewWindow -Wait } else { #Exe installer, run straight path $string2 = $uninstallcommand start-process $string2 } #$A = Start-Process -FilePath $uninstallcommand -Wait -passthru -NoNewWindow;$a.ExitCode #$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop Write-Host -Object "Successfully uninstalled: [$($_.Name)]" } Catch {Write-Warning -Message "Failed to uninstall: [$($_.Name)]"} } ##Belt and braces, remove via CIM too foreach ($program in $UninstallPrograms) { Get-CimInstance -Classname Win32_Product | Where-Object Name -Match $program | Invoke-CimMethod -MethodName UnInstall } # Get Lenovo Vantage service uninstall string to uninstall service $lvs = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object DisplayName -eq "Lenovo Vantage Service" if (!([string]::IsNullOrEmpty($lvs.QuietUninstallString))) { $uninstall = "cmd /c " + $lvs.QuietUninstallString Write-Host $uninstall Invoke-Expression $uninstall } # Uninstall Lenovo Smart UninstallApp -appName "Lenovo Smart" # Uninstall Ai Meeting Manager Service UninstallApp -appName "Ai Meeting Manager" # Uninstall ImController service ##Check if exists $path = "c:\windows\system32\ImController.InfInstaller.exe" if (Test-Path $path) { Write-Host "ImController.InfInstaller.exe exists" $uninstall = "cmd /c " + $path + " -uninstall" Write-Host $uninstall Invoke-Expression $uninstall } else { Write-Host "ImController.InfInstaller.exe does not exist" } ##Invoke-Expression -Command 'cmd.exe /c "c:\windows\system32\ImController.InfInstaller.exe" -uninstall' # Remove vantage associated registry keys Remove-Item 'HKLM:\SOFTWARE\Policies\Lenovo\E046963F.LenovoCompanion_k1h2ywk1493x8' -Recurse -ErrorAction SilentlyContinue Remove-Item 'HKLM:\SOFTWARE\Policies\Lenovo\ImController' -Recurse -ErrorAction SilentlyContinue Remove-Item 'HKLM:\SOFTWARE\Policies\Lenovo\Lenovo Vantage' -Recurse -ErrorAction SilentlyContinue #Remove-Item 'HKLM:\SOFTWARE\Policies\Lenovo\Commercial Vantage' -Recurse -ErrorAction SilentlyContinue # Uninstall AI Meeting Manager Service $path = 'C:\Program Files\Lenovo\Ai Meeting Manager Service\unins000.exe' $params = "/SILENT" if (test-path -Path $path) { Start-Process -FilePath $path -ArgumentList $params -Wait } # Uninstall Lenovo Vantage $pathname = (Get-ChildItem -Path "C:\Program Files (x86)\Lenovo\VantageService").name $path = "C:\Program Files (x86)\Lenovo\VantageService\$pathname\Uninstall.exe" $params = '/SILENT' if (test-path -Path $path) { Start-Process -FilePath $path -ArgumentList $params -Wait } ##Uninstall Smart Appearance $path = 'C:\Program Files\Lenovo\Lenovo Smart Appearance Components\unins000.exe' $params = '/SILENT' if (test-path -Path $path) { Start-Process -FilePath $path -ArgumentList $params -Wait } $lenovowelcome = "c:\program files (x86)\lenovo\lenovowelcome\x86" if (Test-Path $lenovowelcome) { # Remove Lenovo Now Set-Location "c:\program files (x86)\lenovo\lenovowelcome\x86" # Update $PSScriptRoot with the new working directory $PSScriptRoot = (Get-Item -Path ".\").FullName invoke-expression -command .\uninstall.ps1 Write-Host "All applications and associated Lenovo components have been uninstalled." -ForegroundColor Green } $lenovonow = "c:\program files (x86)\lenovo\LenovoNow\x86" if (Test-Path $lenovonow) { # Remove Lenovo Now Set-Location "c:\program files (x86)\lenovo\LenovoNow\x86" # Update $PSScriptRoot with the new working directory $PSScriptRoot = (Get-Item -Path ".\").FullName invoke-expression -command .\uninstall.ps1 Write-Host "All applications and associated Lenovo components have been uninstalled." -ForegroundColor Green } } ############################################################################################################ # Remove Any other installed crap # # # ############################################################################################################ #McAfee write-host "Detecting McAfee" $mcafeeinstalled = "false" $InstalledSoftware = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall" foreach($obj in $InstalledSoftware){ $name = $obj.GetValue('DisplayName') if ($name -like "*McAfee*") { $mcafeeinstalled = "true" } } $InstalledSoftware32 = Get-ChildItem "HKLM:\Software\WOW6432NODE\Microsoft\Windows\CurrentVersion\Uninstall" foreach($obj32 in $InstalledSoftware32){ $name32 = $obj32.GetValue('DisplayName') if ($name32 -like "*McAfee*") { $mcafeeinstalled = "true" } } if ($mcafeeinstalled -eq "true") { Write-Host "McAfee detected" #Remove McAfee bloat ##McAfee ### Download McAfee Consumer Product Removal Tool ### write-host "Downloading McAfee Removal Tool" # Download Source $URL = 'https://github.com/andrew-s-taylor/public/raw/main/De-Bloat/mcafeeclean.zip' # Set Save Directory $destination = 'C:\ProgramData\Debloat\mcafee.zip' #Download the file Invoke-WebRequest -Uri $URL -OutFile $destination -Method Get Expand-Archive $destination -DestinationPath "C:\ProgramData\Debloat" -Force write-host "Removing McAfee" # Automate Removal and kill services start-process "C:\ProgramData\Debloat\Mccleanup.exe" -ArgumentList "-p StopServices,MFSY,PEF,MXD,CSP,Sustainability,MOCP,MFP,APPSTATS,Auth,EMproxy,FWdiver,HW,MAS,MAT,MBK,MCPR,McProxy,McSvcHost,VUL,MHN,MNA,MOBK,MPFP,MPFPCU,MPS,SHRED,MPSCU,MQC,MQCCU,MSAD,MSHR,MSK,MSKCU,MWL,NMC,RedirSvc,VS,REMEDIATION,MSC,YAP,TRUEKEY,LAM,PCB,Symlink,SafeConnect,MGS,WMIRemover,RESIDUE -v -s" write-host "McAfee Removal Tool has been run" $InstalledPrograms = $allstring | Where-Object {($_.Name -like "*McAfee*")} $InstalledPrograms | ForEach-Object { Write-Host -Object "Attempting to uninstall: [$($_.Name)]..." $uninstallcommand = $_.String Try { if ($uninstallcommand -match "^msiexec*") { #Remove msiexec as we need to split for the uninstall $uninstallcommand = $uninstallcommand -replace "msiexec.exe", "" $uninstallcommand = $uninstallcommand + " /quiet /norestart" $uninstallcommand = $uninstallcommand -replace "/I", "/X " #Uninstall with string2 params Start-Process 'msiexec.exe' -ArgumentList $uninstallcommand -NoNewWindow -Wait } else { #Exe installer, run straight path $string2 = $uninstallcommand start-process $string2 } #$A = Start-Process -FilePath $uninstallcommand -Wait -passthru -NoNewWindow;$a.ExitCode #$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop Write-Host -Object "Successfully uninstalled: [$($_.Name)]" } Catch {Write-Warning -Message "Failed to uninstall: [$($_.Name)]"} } ##Remove Safeconnect $safeconnects = Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -match "McAfee Safe Connect" } | Select-Object -Property UninstallString ForEach ($sc in $safeconnects) { if ($sc.UninstallString) { cmd.exe /c $sc.UninstallString /quiet /norestart } } } ##Look for anything else ###Make sure Intune hasn't installed anything so we don't remove installed apps # #$intunepath = "HKLM:\SOFTWARE\Microsoft\IntuneManagementExtension\Win32Apps" #$intunecomplete = @(Get-ChildItem $intunepath).count #$userpath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" #$userprofiles = Get-ChildItem $userpath | ForEach-Object { Get-ItemProperty $_.PSPath } # #$nonAdminLoggedOn = $false #foreach ($user in $userprofiles) { # if ($user.PSChildName -ne '.DEFAULT' -and $user.PSChildName -ne 'S-1-5-18' -and $user.PSChildName -ne 'S-1-5-19' -and $user.PSChildName -ne 'S-1-5-20' -and $user.PSChildName -notmatch 'S-1-5-21-\d+-\d+-\d+-500') { # $nonAdminLoggedOn = $true # break # } #} # #if ($intunecomplete -eq 0 -and $nonAdminLoggedOn) { # # ###Apps to ignore - NOTE: Chrome has an unusual uninstall so sort on it's own #$whitelistapps = @( # "Microsoft Update Health Tools" # "Microsoft Intune Management Extension" # "Microsoft Edge" # "Microsoft Edge Update" # "Microsoft Edge WebView2 Runtime" # "Google Chrome" # "Microsoft Teams" # "Teams Machine-Wide Installer" # "Microsoft OneDrive" # "@C:\WINDOWS\System32\mstsc.exe,-4000" #) # #$InstalledSoftware = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall" #foreach($obj in $InstalledSoftware){ # $name = $obj.GetValue('DisplayName') # if ($null -eq $name) { # $name = $obj.GetValue('DisplayName_Localized') # } # if (($whitelistapps -notcontains $name) -and ($null -ne $obj.GetValue('UninstallString'))) { # $uninstallcommand = $obj.GetValue('UninstallString') # write-host "Uninstalling $name" # if ($uninstallcommand -like "*msiexec*") { # $splitcommand = $uninstallcommand.Split("{") # $msicode = $splitcommand[1] # $uninstallapp = "msiexec.exe /X {$msicode /qn" # start-process "cmd.exe" -ArgumentList "/c $uninstallapp" # } # else { # $splitcommand = $uninstallcommand.Split("{") # # $uninstallapp = "$uninstallcommand /S" # start-process "cmd.exe" -ArgumentList "/c $uninstallapp" # } # } # # } # # #$InstalledSoftware32 = Get-ChildItem "HKLM:\Software\WOW6432NODE\Microsoft\Windows\CurrentVersion\Uninstall" #foreach($obj32 in $InstalledSoftware32){ # $name32 = $obj32.GetValue('DisplayName') # if (($whitelistapps -notcontains $name32) -and ($null -ne $obj32.GetValue('UninstallString'))) { # $uninstallcommand32 = $obj.GetValue('UninstallString') # write-host "Uninstalling $name" # if ($uninstallcommand32 -like "*msiexec*") { # $splitcommand = $uninstallcommand32.Split("{") # $msicode = $splitcommand[1] # $uninstallapp = "msiexec.exe /X {$msicode /qn" # start-process "cmd.exe" -ArgumentList "/c $uninstallapp" # } # else { # $splitcommand = $uninstallcommand32.Split("{") # # $uninstallapp = "$uninstallcommand /S" # start-process "cmd.exe" -ArgumentList "/c $uninstallapp" # } # } #} # ###Remove Chrome #$chrome32path = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome" # #if ($null -ne $chrome32path) { # #$versions = (Get-ItemProperty -path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome').version #ForEach ($version in $versions) { #write-host "Found Chrome version $version" #$directory = ${env:ProgramFiles(x86)} #write-host "Removing Chrome" #Start-Process "$directory\Google\Chrome\Application\$version\Installer\setup.exe" -argumentlist "--uninstall --multi-install --chrome --system-level --force-uninstall" #} # #} # #$chromepath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome" # #if ($null -ne $chromepath) { # #$versions = (Get-ItemProperty -path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome').version #ForEach ($version in $versions) { #write-host "Found Chrome version $version" #$directory = ${env:ProgramFiles} #write-host "Removing Chrome" #Start-Process "$directory\Google\Chrome\Application\$version\Installer\setup.exe" -argumentlist "--uninstall --multi-install --chrome --system-level --force-uninstall" #} # # #} # ###Remove home versions of Office #$AllLanguages = $locale # #$ClickToRunPath = "C:\Program Files\Common Files\Microsoft Shared\ClickToRun\OfficeClickToRun.exe" #foreach($Language in $AllLanguages){ #Start-Process $ClickToRunPath -ArgumentList "scenario=install scenariosubtype=ARP sourcetype=None productstoremove=O365HomePremRetail.16_$($Language)_x-none culture=$($Language) DisplayLevel=False" -Wait #Start-Sleep -Seconds 5 #} # #$ClickToRunPath = "C:\Program Files\Common Files\Microsoft Shared\ClickToRun\OfficeClickToRun.exe" #foreach($Language in $AllLanguages){ #Start-Process $ClickToRunPath -ArgumentList "scenario=install scenariosubtype=ARP sourcetype=None productstoremove=OneNoteFreeRetail.16_$($Language)_x-none culture=$($Language) DisplayLevel=False" -Wait #Start-Sleep -Seconds 5 #} # #} write-host "Completed" Stop-Transcript # SIG # Begin signature block # MIIoGQYJKoZIhvcNAQcCoIIoCjCCKAYCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB5dfQr7Vw3M6bi # U635O25V/ri5OGyg1MBH12pC9jpiYqCCIRwwggWNMIIEdaADAgECAhAOmxiO+dAt # 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV # BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa # Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy # dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD # ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E # MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy # unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF # xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 # 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB # MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR # WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 # nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB # YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S # UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x # q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB # NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP # TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC # AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp # Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 # aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB # LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc # Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov # Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy # oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW # juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF # mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z # twGpn1eqXijiuZQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqG # SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx # GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy # dXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMx # CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy # RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg # Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXH # JQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMf # UBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w # 1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRk # tFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYb # qMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUm # cJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP6 # 5x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzK # QtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo # 80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjB # Jgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXche # MBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB # /wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU # 7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoG # CCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29j # c3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDig # NqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v # dEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZI # hvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd # 4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiC # qBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl # /Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeC # RK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYT # gAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/ # a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37 # xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmL # NriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0 # YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJ # RyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIG # sDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw # HhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEX # MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0 # ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjAN # BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zr # PYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHM # gQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8Irg # nQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyC # EUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0 # p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQa # khCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0 # XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960I # HnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2 # FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBH # X8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q2 # 7IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD # VR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1k # TN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD # AzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj # ZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t # L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0 # cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmww # HAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIB # ADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6j # fCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmI # moqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtf # JqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrx # oj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3 # LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx # 4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9 # Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+I # Cw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug # 0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5 # Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIGwjCCBKqgAwIBAgIQ # BUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEX # MBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0 # ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAw # MDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp # Z2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X # 5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uU # UI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa # 2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgt # XkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60 # pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17 # cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BY # QfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9 # c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw # 9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2c # kpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhR # B8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYD # VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgG # BmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxq # II+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEw # T6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH # NFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGD # MIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYB # BQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 # ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQEL # BQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF # 7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrC # QDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFc # jGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8 # wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbF # KNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP # 4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VP # NTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvr # moI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2 # obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJ # uEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIHWzCCBUOg # AwIBAgIQCLGfzbPa87AxVVgIAS8A6TANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQG # EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 # IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0Ex # MB4XDTIzMTExNTAwMDAwMFoXDTI2MTExNzIzNTk1OVowYzELMAkGA1UEBhMCR0Ix # FDASBgNVBAcTC1doaXRsZXkgQmF5MR4wHAYDVQQKExVBTkRSRVdTVEFZTE9SLkNP # TSBMVEQxHjAcBgNVBAMTFUFORFJFV1NUQVlMT1IuQ09NIExURDCCAiIwDQYJKoZI # hvcNAQEBBQADggIPADCCAgoCggIBAMOkYkLpzNH4Y1gUXF799uF0CrwW/Lme676+ # C9aZOJYzpq3/DIa81oWv9b4b0WwLpJVu0fOkAmxI6ocu4uf613jDMW0GfV4dRodu # tryfuDuit4rndvJA6DIs0YG5xNlKTkY8AIvBP3IwEzUD1f57J5GiAprHGeoc4Utt # zEuGA3ySqlsGEg0gCehWJznUkh3yM8XbksC0LuBmnY/dZJ/8ktCwCd38gfZEO9UD # DSkie4VTY3T7VFbTiaH0bw+AvfcQVy2CSwkwfnkfYagSFkKar+MYwu7gqVXxrh3V # /Gjval6PdM0A7EcTqmzrCRtvkWIR6bpz+3AIH6Fr6yTuG3XiLIL6sK/iF/9d4U2P # iH1vJ/xfdhGj0rQ3/NBRsUBC3l1w41L5q9UX1Oh1lT1OuJ6hV/uank6JY3jpm+Of # Z7YCTF2Hkz5y6h9T7sY0LTi68Vmtxa/EgEtG6JVNVsqP7WwEkQRxu/30qtjyoX8n # zSuF7TmsRgmZ1SB+ISclejuqTNdhcycDhi3/IISgVJNRS/F6Z+VQGf3fh6ObdQLV # woT0JnJjbD8PzJ12OoKgViTQhndaZbkfpiVifJ1uzWJrTW5wErH+qvutHVt4/sEZ # AVS4PNfOcJXR0s0/L5JHkjtM4aGl62fAHjHj9JsClusj47cT6jROIqQI4ejz1slO # oclOetCNAgMBAAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiI # ZfROQjAdBgNVHQ4EFgQU0HdOFfPxa9Yeb5O5J9UEiJkrK98wPgYDVR0gBDcwNTAz # BgZngQwBBAEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20v # Q1BTMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0f # BIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU # cnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGg # T4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29k # ZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwgZQGCCsGAQUFBwEBBIGH # MIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYB # BQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0 # ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQC # MAAwDQYJKoZIhvcNAQELBQADggIBAEkRh2PwMiyravr66Zww6Pjl24KzDcGYMSxU # KOEU4bykcOKgvS6V2zeZIs0D/oqct3hBKTGESSQWSA/Jkr1EMC04qJHO/Twr/sBD # CDBMtJ9XAtO75J+oqDccM+g8Po+jjhqYJzKvbisVUvdsPqFll55vSzRvHGAA6hjy # DyakGLROcNaSFZGdgOK2AMhQ8EULrE8Riri3D1ROuqGmUWKqcO9aqPHBf5wUwia8 # g980sTXquO5g4TWkZqSvwt1BHMmu69MR6loRAK17HvFcSicK6Pm0zid1KS2z4ntG # B4Cfcg88aFLog3ciP2tfMi2xTnqN1K+YmU894Pl1lCp1xFvT6prm10Bs6BViKXfD # fVFxXTB0mHoDNqGi/B8+rxf2z7u5foXPCzBYT+Q3cxtopvZtk29MpTY88GHDVJsF # MBjX7zM6aCNKsTKC2jb92F+jlkc8clCQQnl3U4jqwbj4ur1JBP5QxQprWhwde0+M # ifDVp0vHZsVZ0pnYMCKSG5bUr3wOU7EP321DwvvEsTjCy/XDgvy8ipU6w3GjcQQF # mgp/BX/0JCHX+04QJ0JkR9TTFZR1B+zh3CcK1ZEtTtvuZfjQ3viXwlwtNLy43vbe # 1J5WNTs0HjJXsfdbhY5kE5RhyfaxFBr21KYx+b+evYyolIS0wR6New6FqLgcc4Ge # 94yaYVTqMYIGUzCCBk8CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGln # aUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBT # aWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAIsZ/Ns9rzsDFVWAgBLwDp # MA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJ # KoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQB # gjcCARUwLwYJKoZIhvcNAQkEMSIEIPeISQgPy5ZDhBHEs8HsNjTHZl5nhhvGu1Wu # Gv4/98dqMA0GCSqGSIb3DQEBAQUABIICAEPUd2h8cNnQleuQrO+RHyNcTclDe0sz # V4gdKrPF5o0P0TNm/mCv2kpo9hNSe7EZZx17kzo5A4VmhcAjKjQQ2jATGWLyE5zd # kSpOricuvbSEQbiZ/n04QOAzgL345ykI/0tfjQZW49rLNnP+faI33+xHllI2eH8g # FNeaCv9+uwImqkxMl6vlmEsFVq8F1mbmIGKW753DS04Anb3iigcLzqr5cRwdeZSK # smsLZEHOZqW2Zmi+EmlA8Isvb/7ICOPsTzKllpxOcj4nl2mbQcmI+9amSXAEa8gr # ARDgdgF72iQrfERfCwZCn/bTUJlsJ7ivmfYfid8+O3gxBdL2tGZyCm8nis5mhJCZ # 2kqb12VKBOqk+cQa/Cf7VZuUJZ8IYsoR67+pu25F9Xoin08T6h7efRTy98TI7neV # 6I+NVJidHQ4kRNV1ZQ7TKOyyPZQKNdGQQpIc8VO5oQx5yV8ucKVBkp+xnWoSONvj # 7HfuDkRsMI4es5vSmyzIi7QktN1KDSp1PclgC7P+V5GPqkPUqUHZDubZpP7EoOmb # YQSU2BLjYpgxg/J4s3GxxqERtELR3YyjAgtprgtRt/F0Shz7r2AlgV0zahUlXfEN # N8NRACZ5FhO/uwyfB99h5BXFRakmuLHXCm0jWeVR8Ub/USzoM/FWsy6rcsGc12YS # z6sioTF3zQncoYIDIDCCAxwGCSqGSIb3DQEJBjGCAw0wggMJAgEBMHcwYzELMAkG # A1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdp # Q2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQ # BUSv85SdCDmmv9s/X+VhFjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzEL # BgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI0MDMwODE2Mjg1MFowLwYJKoZI # hvcNAQkEMSIEIMQy6tIKnpCc39XPomt77XeCEtzlBraoBr3sZLk38WH1MA0GCSqG # SIb3DQEBAQUABIICAIvycXH8PDD97sX+45tMz8M/MRnWk95i2AnTw2xn2HU5XQ8n # dRI3e4FN2MJJ4oayul5LOaIkJF19MoMehCeDt4OQXHwQoJeH8fWv0zb9b4D+qHqv # eHBOnADj8MpGX9z9bkff+g2hapwWHd/aTcfUgM251iWKEvZ7P5lx9ppQAdltfHx8 # fjGsvgQawKpiiodRo3DCyJxdDAcrzpmVeoDOYEOKBU4BRjiw2MYJ/Fa5pVNKcq/E # NLOytPYYRNJMpCDjVSa9LJJEuz1MsGcJb7RdMc948ZhvHTVw8bPFsJnswIqEh9WI # iBi19JlhltwXPclvmAQ1MK4vGqwrhgUuRh5QbMQ0cTvDqlvsKoRFuRpzPJoGADhc # 8kifTMa7lL7r2WJv05fsq6j7i32Qe581FawhNKBIa/9n3HdMIeEW3WlWnnqV99Ct # dT1EbUqt1WnQRxxszjp1OcSi5iCv8f3Qm6qvfXPagRXj7hcDqZ5cBMlNoACMihSI # t6KK0gUUc46Tjlpg1eUlkFpOZ9fw+r72aM7Hp8QBiEOpf2OlrHe8T23utQ4SoaWy # zkbRXekLJ7jBM3thXzwqr/+3ljPJlnHkXRe6FvwZYHbGxa39weML5TVJ+QGrB1DB # asnq6xuSKEokChwaGGqjscrgW2bREUfZh8VuOdYBO1EbJGFhBRUwlN3gm1FV # SIG # End signature block