#------------------------------------------------------------------------
# Source File Information (DO NOT MODIFY)
# Source ID: f5f77db1-ba0b-4c5a-80b7-afa0e33b688d
# Source File: Remote Software Center.psproj
#------------------------------------------------------------------------
#region Project Recovery Data (DO NOT MODIFY)
<#RecoveryData:
/gEAAB+LCAAAAAAABACFkU9PwyAYh+9L9h0I966tc7YHxkGXmh38k3XxaqB9cSiFBuiWfXvRtssW
Nd54wu99fnmBbKAye7DHFfOMTicIkWdr3qHy3xDwBayTRtOrWULiEYa7QipYr6hYiCyreRpxlvDo
ulqwKE94FjHBEpjP+U2e1yQewsPo0LI9tkCD+BxHuVF1qEPxeZsbYEB020lVL3GCaemZ9V07a53r
u/5KonLHLITj1naA0QYEWNAVFJ2ufFhuidd6bz4guleGM/XauhTT/uyCPf3H/ouv3JlD9MCkLoxt
gk9gOlIQigthD/2ap2fp6cnKN6mZ+go8sgboBhrjAZVG+ENYCd2B9mCDsg1jJP6Rn05IfPHfn1/a
p1b+AQAA#>
#endregion
<#
    .NOTES
    --------------------------------------------------------------------------------
     Code generated by:  SAPIEN Technologies, Inc., PowerShell Studio 2016 v5.3.131
     Generated on:       2017-01-18 13:57
     Generated by:       Timmy
    --------------------------------------------------------------------------------
    .DESCRIPTION
        Script generated by PowerShell Studio 2016
#>


#region Source: Startup.pss
#region File Recovery Data (DO NOT MODIFY)
<#RecoveryData:
2gMAAB+LCAAAAAAABAC9k0tLAzEQgO+C/yH0vGR33a5rIbsglV4EFVfUazadLcE8yiRpyb+3rVJF
QaGHMJd5MPMxL/YIwm4A4w33nOwUJ61pJxe0nHTnZ4Swe5QrabhaSAV3XEPXe44+rOnaOZb/ih5y
rp0DPSgJ7mB/eWKnnbCo5JCR50/WlBZ7ycg8KB8QWgPBI1cZeQi7GuIW4pN9A9MOTcNrUV+Ws2oK
xdWM5ceqPyl9dB50CgZ9kWZpt44uLGqXhLjfVBoQ8q00q1NYRTXWYzOW5bIueMX/Z71qlaSnuUVI
MzyJILzF2ANupICTbuPvMR7Nj0dj+fdf7t4BtbYVHtoDAAA=#>
#endregion
#----------------------------------------------
#region Import Assemblies
#----------------------------------------------
[void][Reflection.Assembly]::Load('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[void][Reflection.Assembly]::Load('System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[void][Reflection.Assembly]::Load('System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
[void][Reflection.Assembly]::Load('System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
#endregion Import Assemblies

#Define a Param block to use custom parameters in the project
#Param ($CustomParameter)

function Main { 
<#
    .SYNOPSIS
        The Main function starts the project application.
    
    .PARAMETER Commandline
        $Commandline contains the complete argument string passed to the script packager executable.
    
    .NOTES
        Use this function to initialize your script and to call GUI forms.
		
    .NOTES
        To get the console output in the Packager (Forms Engine) use: 
		$ConsoleOutput (Type: System.Collections.ArrayList)
#>
	Param ([String]$Commandline)
		
	#--------------------------------------------------------------------------
	#TODO: Add initialization script here (Load modules and check requirements)
	
	
	#--------------------------------------------------------------------------
	
	if((Show-MainForm_psf) -eq 'OK')
	{
		
	}
	
	$script:ExitCode = 0 #Set the exit code for the Packager
}







#endregion Source: Startup.pss

#region Source: Globals.ps1
	#--------------------------------------------
	# Declare Global Variables and Functions here
	#--------------------------------------------
	
	
	#Sample function that provides the location of the script
	function Get-ScriptDirectory
	{
	<#
		.SYNOPSIS
			Get-ScriptDirectory returns the proper location of the script.
	
		.OUTPUTS
			System.String
		
		.NOTES
			Returns the correct path within a packaged executable.
	#>
		[OutputType([string])]
		param ()
		if ($null -ne $hostinvocation)
		{
			Split-Path $hostinvocation.MyCommand.path
		}
		else
		{
			Split-Path $script:MyInvocation.MyCommand.Path
		}
	}
	
	#Sample variable that provides the location of the script
	[string]$ScriptDirectory = Get-ScriptDirectory
	
	function Write-Status
	{
		[cmdletbinding()]
		param
		(
			[Parameter(Mandatory)]
			[ValidateNotNull()]
			[String]$Message
			
		)
		$statusbar1.Text = $Message
	}
	
	function Invoke-OSDInstall
	{
		Param
		(
			[String][Parameter(Mandatory = $True, Position = 1)]
			$Computername,
			[String][Parameter(Mandatory = $True, Position = 2)]
			$OSDName
			
		)
		Begin
		{
			
			$CIMClass = (Get-CimClass -Namespace root\ccm\clientsdk -ComputerName $Computername -ClassName CCM_ProgramsManager)
			$OSD = (Get-CimInstance -ClassName CCM_Program -Namespace "root\ccm\clientSDK" -ComputerName $Computername | Where-Object { $_.Name -like "$OSDName" })
			
			$Args = @{
				PackageID = $OSD.PackageID
				ProgramID = $OSD.ProgramID
			}
		}
		
		Process
		{
			
			Invoke-CimMethod -CimClass $CIMClass -ComputerName $Computername -MethodName "ExecuteProgram" –Arguments $Args
			
		}
		End { }
	}
	
	Function Invoke-AppInstall
	{
		
		Param
		(
			[String][Parameter(Mandatory = $True, Position = 1)]
			$Computername,
			[String][Parameter(Mandatory = $True, Position = 2)]
			$AppName,
			[ValidateSet("Install", "Uninstall")]
			[String][Parameter(Mandatory = $True, Position = 3)]
			$Method
		)
		
		Begin
		{
			$Application = (Get-CimInstance -ClassName CCM_Application -Namespace "root\ccm\clientSDK" -ComputerName $Computername | Where-Object { $_.Name -like $AppName })
			
			$Args = @{
				EnforcePreference = [UINT32] 0
				Id = "$($Application.id)"
				IsMachineTarget = $Application.IsMachineTarget
				IsRebootIfNeeded = $False
				Priority = 'High'
				Revision = "$($Application.Revision)"
			}
			
		}
		
		Process
		{
			
			Invoke-CimMethod -Namespace "root\ccm\clientSDK" -ClassName CCM_Application -ComputerName $Computername -MethodName $Method -Arguments $Args
			
		}
		
		End { }
		
	}
	
	function Invoke-SupInstall
	{
		Param
		(
			[String][Parameter(Mandatory = $True, Position = 1)]
			$Computername,
			[String][Parameter(Mandatory = $True, Position = 2)]
			$SupName
			
		)
		Begin
		{
			$AppEvalState0 = "0"
			$AppEvalState1 = "1"
			$ApplicationClass = [WmiClass]"root\ccm\clientSDK:CCM_SoftwareUpdatesManager"
		}
		
		Process
		{
			If ($SupName -Like "All" -or $SupName -like "all")
			{
				Foreach ($Computer in $Computername)
				{
					$Application = (Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_SoftwareUpdate -ComputerName $Computer | Where-Object { $_.EvaluationState -like "*$($AppEvalState0)*" -or $_.EvaluationState -like "*$($AppEvalState1)*" })
					Invoke-WmiMethod -Class CCM_SoftwareUpdatesManager -Name InstallUpdates -ArgumentList ( ,$Application) -Namespace root\ccm\clientsdk -ComputerName $Computer
					
				}
				
			}
			Else
			{
				Foreach ($Computer in $Computername)
				{
					$Application = (Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_SoftwareUpdate -ComputerName $Computer | Where-Object { $_.EvaluationState -like "*$($AppEvalState)*" -and $_.Name -like "*$($SupName)*" })
					Invoke-WmiMethod -Class CCM_SoftwareUpdatesManager -Name InstallUpdates -ArgumentList ( ,$Application) -Namespace root\ccm\clientsdk -ComputerName $Computer
					
				}
				
			}
		}
		End { }
	}
#endregion Source: Globals.ps1

#region Source: MainForm.psf
function Show-MainForm_psf
{
#region File Recovery Data (DO NOT MODIFY)
<#RecoveryData:
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
dPjP8lr/Bzk7bJalNwAA#>
#endregion
	#----------------------------------------------
	#region Import the Assemblies
	#----------------------------------------------
	[void][reflection.assembly]::Load('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
	[void][reflection.assembly]::Load('System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
	[void][reflection.assembly]::Load('System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
	#endregion Import Assemblies

	#----------------------------------------------
	#region Generated Form Objects
	#----------------------------------------------
	[System.Windows.Forms.Application]::EnableVisualStyles()
	$formMain = New-Object 'System.Windows.Forms.Form'
	$buttonInstallSUP = New-Object 'System.Windows.Forms.Button'
	$comboboxSUP = New-Object 'System.Windows.Forms.ComboBox'
	$labelSoftwareUpdates = New-Object 'System.Windows.Forms.Label'
	$buttonInstallApp = New-Object 'System.Windows.Forms.Button'
	$comboboxAPP = New-Object 'System.Windows.Forms.ComboBox'
	$labelApplications = New-Object 'System.Windows.Forms.Label'
	$labelOSDTaskSequence = New-Object 'System.Windows.Forms.Label'
	$comboboxOSD = New-Object 'System.Windows.Forms.ComboBox'
	$statusbar1 = New-Object 'System.Windows.Forms.StatusBar'
	$picturebox1 = New-Object 'System.Windows.Forms.PictureBox'
	$buttonInstallOSD = New-Object 'System.Windows.Forms.Button'
	$textboxComputername = New-Object 'System.Windows.Forms.TextBox'
	$buttonConnect = New-Object 'System.Windows.Forms.Button'
	$buttonExit = New-Object 'System.Windows.Forms.Button'
	$timerJobTracker = New-Object 'System.Windows.Forms.Timer'
	$imagelistButtonBusyAnimation = New-Object 'System.Windows.Forms.ImageList'
	$InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'
	#endregion Generated Form Objects

	#----------------------------------------------
	# User Generated Script
	#----------------------------------------------
	
	#region Control Helper Functions
	function Load-ComboBox 
	{
	<#
		.SYNOPSIS
			This functions helps you load items into a ComboBox.
	
		.DESCRIPTION
			Use this function to dynamically load items into the ComboBox control.
	
		.PARAMETER  ComboBox
			The ComboBox control you want to add items to.
	
		.PARAMETER  Items
			The object or objects you wish to load into the ComboBox's Items collection.
	
		.PARAMETER  DisplayMember
			Indicates the property to display for the items in this control.
		
		.PARAMETER  Append
			Adds the item(s) to the ComboBox without clearing the Items collection.
		
		.EXAMPLE
			Load-ComboBox $combobox1 "Red", "White", "Blue"
		
		.EXAMPLE
			Load-ComboBox $combobox1 "Red" -Append
			Load-ComboBox $combobox1 "White" -Append
			Load-ComboBox $combobox1 "Blue" -Append
		
		.EXAMPLE
			Load-ComboBox $combobox1 (Get-Process) "ProcessName"
	#>
		Param (
			[ValidateNotNull()]
			[Parameter(Mandatory=$true)]
			[System.Windows.Forms.ComboBox]$ComboBox,
			[ValidateNotNull()]
			[Parameter(Mandatory=$true)]
			$Items,
		    [Parameter(Mandatory=$false)]
			[string]$DisplayMember,
			[switch]$Append
		)
		
		if(-not $Append)
		{
			$ComboBox.Items.Clear()	
		}
		
		if($Items -is [Object[]])
		{
			$ComboBox.Items.AddRange($Items)
		}
		elseif ($Items -is [System.Collections.IEnumerable])
		{
			$ComboBox.BeginUpdate()
			foreach($obj in $Items)
			{
				$ComboBox.Items.Add($obj)	
			}
			$ComboBox.EndUpdate()
		}
		else
		{
			$ComboBox.Items.Add($Items)	
		}
	
		$ComboBox.DisplayMember = $DisplayMember	
	}
	
	function Load-ListBox 
	{
	<#
		.SYNOPSIS
			This functions helps you load items into a ListBox or CheckedListBox.
	
		.DESCRIPTION
			Use this function to dynamically load items into the ListBox control.
	
		.PARAMETER  ListBox
			The ListBox control you want to add items to.
	
		.PARAMETER  Items
			The object or objects you wish to load into the ListBox's Items collection.
	
		.PARAMETER  DisplayMember
			Indicates the property to display for the items in this control.
		
		.PARAMETER  Append
			Adds the item(s) to the ListBox without clearing the Items collection.
		
		.EXAMPLE
			Load-ListBox $ListBox1 "Red", "White", "Blue"
		
		.EXAMPLE
			Load-ListBox $listBox1 "Red" -Append
			Load-ListBox $listBox1 "White" -Append
			Load-ListBox $listBox1 "Blue" -Append
		
		.EXAMPLE
			Load-ListBox $listBox1 (Get-Process) "ProcessName"
	#>
		Param (
			[ValidateNotNull()]
			[Parameter(Mandatory=$true)]
			[System.Windows.Forms.ListBox]$ListBox,
			[ValidateNotNull()]
			[Parameter(Mandatory=$true)]
			$Items,
		    [Parameter(Mandatory=$false)]
			[string]$DisplayMember,
			[switch]$Append
		)
		
		if(-not $Append)
		{
			$listBox.Items.Clear()	
		}
		
		if($Items -is [System.Windows.Forms.ListBox+ObjectCollection])
		{
			$listBox.Items.AddRange($Items)
		}
		elseif ($Items -is [Array])
		{
			$listBox.BeginUpdate()
			foreach($obj in $Items)
			{
				$listBox.Items.Add($obj)
			}
			$listBox.EndUpdate()
		}
		else
		{
			$listBox.Items.Add($Items)	
		}
	
		$listBox.DisplayMember = $DisplayMember	
	}
	
	function Load-DataGridView
	{
		<#
		.SYNOPSIS
			This functions helps you load items into a DataGridView.
	
		.DESCRIPTION
			Use this function to dynamically load items into the DataGridView control.
	
		.PARAMETER  DataGridView
			The DataGridView control you want to add items to.
	
		.PARAMETER  Item
			The object or objects you wish to load into the DataGridView's items collection.
		
		.PARAMETER  DataMember
			Sets the name of the list or table in the data source for which the DataGridView is displaying data.
	
		.PARAMETER AutoSizeColumns
		    Resizes DataGridView control's columns after loading the items.
		#>
		Param (
				[ValidateNotNull()]
				[Parameter(Mandatory = $true)]
				[System.Windows.Forms.DataGridView]$DataGridView,
				[ValidateNotNull()]
				[Parameter(Mandatory = $true)]
				$Item,
				[Parameter(Mandatory = $false)]
				[string]$DataMember,
				[System.Windows.Forms.DataGridViewAutoSizeColumnMode]$AutoSizeColumns = 'None'
		)
		$DataGridView.SuspendLayout()
		$DataGridView.DataMember = $DataMember
		
		if ($Item -is [System.Data.DataSet] -and $Item.Tables.Count -gt 0)
		{
			$DataGridView.DataSource = $Item.Tables[0]
		}
		elseif ($Item -is [System.ComponentModel.IListSource]`
				-or $Item -is [System.ComponentModel.IBindingList] -or $Item -is [System.ComponentModel.IBindingListView])
		{
			$DataGridView.DataSource = $Item
		}
		else
		{
			$array = New-Object System.Collections.ArrayList
			
			if ($Item -is [System.Collections.IList])
			{
				$array.AddRange($Item)
			}
			else
			{
				$array.Add($Item)
			}
			$DataGridView.DataSource = $array
		}
		
		if ($AutoSizeColumns -ne 'None')
		{
			$DataGridView.AutoResizeColumns($AutoSizeColumns)
		}
		
		$DataGridView.ResumeLayout()
	}
	
	function ConvertTo-DataTable
	{
		<#
			.SYNOPSIS
				Converts objects into a DataTable.
		
			.DESCRIPTION
				Converts objects into a DataTable, which are used for DataBinding.
		
			.PARAMETER  InputObject
				The input to convert into a DataTable.
		
			.PARAMETER  Table
				The DataTable you wish to load the input into.
		
			.PARAMETER RetainColumns
				This switch tells the function to keep the DataTable's existing columns.
			
			.PARAMETER FilterWMIProperties
				This switch removes WMI properties that start with an underline.
		
			.EXAMPLE
				$DataTable = ConvertTo-DataTable -InputObject (Get-Process)
		#>
		[OutputType([System.Data.DataTable])]
		param (
				[ValidateNotNull()]
				$InputObject,
				[ValidateNotNull()]
				[System.Data.DataTable]$Table,
				[switch]$RetainColumns,
				[switch]$FilterWMIProperties)
		
		if ($null -eq $Table)
		{
			$Table = New-Object System.Data.DataTable
		}
		
		if ($InputObject -is [System.Data.DataTable])
		{
			$Table = $InputObject
		}
		elseif ($InputObject -is [System.Data.DataSet] -and $InputObject.Tables.Count -gt 0)
		{
			$Table = $InputObject.Tables[0]
		}
		else
		{
			if (-not $RetainColumns -or $Table.Columns.Count -eq 0)
			{
				#Clear out the Table Contents
				$Table.Clear()
				
				if ($null -eq $InputObject) { return } #Empty Data
				
				$object = $null
				#find the first non null value
				foreach ($item in $InputObject)
				{
					if ($null -ne $item)
					{
						$object = $item
						break
					}
				}
				
				if ($null -eq $object) { return } #All null then empty
				
				#Get all the properties in order to create the columns
				foreach ($prop in $object.PSObject.Get_Properties())
				{
					if (-not $FilterWMIProperties -or -not $prop.Name.StartsWith('__')) #filter out WMI properties
					{
						#Get the type from the Definition string
						$type = $null
						
						if ($null -ne $prop.Value)
						{
							try { $type = $prop.Value.GetType() }
							catch { }
						}
						
						if ($null -ne $type) # -and [System.Type]::GetTypeCode($type) -ne 'Object')
						{
							[void]$table.Columns.Add($prop.Name, $type)
						}
						else #Type info not found
						{
							[void]$table.Columns.Add($prop.Name)
						}
					}
				}
				
				if ($object -is [System.Data.DataRow])
				{
					foreach ($item in $InputObject)
					{
						$Table.Rows.Add($item)
					}
					return @( ,$Table)
				}
			}
			else
			{
				$Table.Rows.Clear()
			}
			
			foreach ($item in $InputObject)
			{
				$row = $table.NewRow()
				
				if ($item)
				{
					foreach ($prop in $item.PSObject.Get_Properties())
					{
						if ($table.Columns.Contains($prop.Name))
						{
							$row.Item($prop.Name) = $prop.Value
						}
					}
				}
				[void]$table.Rows.Add($row)
			}
		}
		
		return @( ,$Table)
	}
	#endregion
	
	#region Search Function
	function SearchGrid()
	{
		$RowIndex = 0
		$ColumnIndex = 0
		$seachString = $textboxComputername.Text
		
		if($seachString -eq "")
		{
			return
		}
		
		if($datagridviewResults.SelectedCells.Count -ne 0)
		{
			$startCell = $datagridviewResults.SelectedCells[0];
			$RowIndex = $startCell.RowIndex
			$ColumnIndex = $startCell.ColumnIndex + 1
		}
		
		$columnCount = $datagridviewResults.ColumnCount
		$rowCount = $datagridviewResults.RowCount
		for(;$RowIndex -lt $rowCount; $RowIndex++)
		{
			$Row = $datagridviewResults.Rows[$RowIndex]
			
			for(;$ColumnIndex -lt $columnCount; $ColumnIndex++)
			{
				$cell = $Row.Cells[$ColumnIndex]
				
				if($null -ne $cell.Value -and $cell.Value.ToString().IndexOf($seachString, [StringComparison]::OrdinalIgnoreCase) -ne -1)
				{
					$datagridviewResults.CurrentCell = $cell
					return
				}
			}
			
			$ColumnIndex = 0
		}
		
		$datagridviewResults.CurrentCell = $null
		[void][System.Windows.Forms.MessageBox]::Show("The search has reached the end of the grid.","String not Found")
		
	}
	#endregion
	
	$formMain_Load={
		#TODO: Initialize Form Controls here
		
	}
	
	$buttonExit_Click={
		#TODO: Place custom script here
		$formMain.Close()
	}
	
	$buttonConnect_Click={
		#TODO: Place custom script here
		try
		{
			$Empty = ""
			Load-ComboBox $comboboxOSD $Empty
			$comboboxOSD.SelectedIndex = 0
			Load-ComboBox $comboboxAPP $Empty
			$comboboxAPP.SelectedIndex = 0
			Load-ComboBox $comboboxSUP $Empty
			$comboboxSUP.SelectedIndex = 0
			if (-not $textboxComputername.Text)
			{
				[System.Windows.Forms.MessageBox]::Show('No computer specified', 'Error')
				Throw 'No Computer specified'
			}
			else
			{
				$global:Computername = $textboxComputername.Text
			}
			
			Write-Status -Message "Connecting to $computername"
			$picturebox1.BackColor = "Gold"
			
			If (-not (Test-Connection -ComputerName $Computername -Count 1 -Quiet))
			{
				$picturebox1.BackColor = "Red"
				
				
				[System.Windows.Forms.MessageBox]::Show('No such computer or computer is offline', 'Error')
				Throw 'No such computer or computer is offline'
				
			}
			
			Else
			{
				Write-status -Message "Connected to $Computername"
				$picturebox1.BackColor = "Green"
				
				# OSD Task Sequence #
				$OSDTS = (Get-CimInstance -ClassName CCM_Program -Namespace "root\ccm\clientSDK" -ComputerName $Computername | Where-Object { $_.TaskSequence -like "True" })
				$OSD = $OSDTS.Name
				
						
				# Application #
				$Application = (Get-CimInstance -ClassName CCM_Application -Namespace "root\ccm\clientSDK" -ComputerName $Computername | Where-Object { $_.InstallState -like "NotInstalled" })
				$AppName = $Application.Name
				
				# Software Updates #
				$SUPEvalState0 = "0"
				$SUPEvalState1 = "1"
				$SUPClass = [WmiClass]"root\ccm\clientSDK:CCM_SoftwareUpdatesManager"
				$SUPs = (Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_SoftwareUpdate -ComputerName $Computername | Where-Object { $_.EvaluationState -like "*$($SUPEvalState0)*" -or $_.EvaluationState -like "*$($SUPEvalState1)*" })
				$SUPName = $SUPs.Name
				
				if ($OSD)
				{
					Load-ComboBox $comboboxOSD $OSD -Append
					$comboboxOSD.SelectedIndex = 1
				}
				if ($APPName)
				{
					Load-ComboBox $comboboxAPP $AppName -Append
					$comboboxAPP.SelectedIndex = 1
				}
				if ($SUPName)
				{
					Load-ComboBox $comboboxSUP $SUPName -Append
					$comboboxSUP.SelectedIndex = 1
				}
				
				
			} #Else
		} #IF
		Catch
		{
			Write-Status -Message $_.Exception.Message
		}
	
	
	}
	
	
	
	$formMain_FormClosed=[System.Windows.Forms.FormClosedEventHandler]{
	#Event Argument: $_ = [System.Windows.Forms.FormClosedEventArgs]
		#Stop any pending jobs
		Stop-JobTracker
	}
	
	$timerJobTracker_Tick={
		Update-JobTracker
	}
	
	#region Job Tracker
	$JobTrackerList = New-Object System.Collections.ArrayList
	function Add-JobTracker
	{
		<#
			.SYNOPSIS
				Add a new job to the JobTracker and starts the timer.
		
			.DESCRIPTION
				Add a new job to the JobTracker and starts the timer.
		
			.PARAMETER  Name
				The name to assign to the Job
		
			.PARAMETER  JobScript
				The script block that the Job will be performing. 
				Important: Do not access form controls from this script block.
		
			.PARAMETER ArgumentList
				The arguments to pass to the job
		
			.PARAMETER  CompleteScript
				The script block that will be called when the job is complete.
				The job is passed as an argument. The Job argument is null when the job fails.
		
			.PARAMETER  UpdateScript
				The script block that will be called each time the timer ticks. 
				The job is passed as an argument. Use this to get the Job's progress.
		
			.EXAMPLE
				Add-JobTracker -Name 'JobName' `
				-JobScript {	
					Param($Argument1)#Pass any arguments using the ArgumentList parameter
					#Important: Do not access form controls from this script block.
					Get-WmiObject Win32_Process -Namespace "root\CIMV2"
				}`
				-CompletedScript {
					Param($Job)		
					$results = Receive-Job -Job $Job		
				}`
				-UpdateScript {
					Param($Job)
					#$results = Receive-Job -Job $Job -Keep
				}
		
			.LINK
				
		#>
		
		Param(
		[ValidateNotNull()]
		[Parameter(Mandatory=$true)]
		[string]$Name, 
		[ValidateNotNull()]
		[Parameter(Mandatory=$true)]
		[ScriptBlock]$JobScript,
		$ArgumentList = $null,
		[ScriptBlock]$CompletedScript,
		[ScriptBlock]$UpdateScript)
		
		#Start the Job
		$job = Start-Job -Name $Name -ScriptBlock $JobScript -ArgumentList $ArgumentList
		
		if($null -ne $job)
		{
			#Create a Custom Object to keep track of the Job & Script Blocks
			$members = @{	'Job' = $Job;
							'CompleteScript' = $CompletedScript;
							'UpdateScript' = $UpdateScript}
			
			$psObject = New-Object System.Management.Automation.PSObject -Property $members
			
			[void]$JobTrackerList.Add($psObject)	
			
			#Start the Timer
			if(-not $timerJobTracker.Enabled)
			{
				$timerJobTracker.Start()
			}
		}
		elseif($null -ne $CompletedScript)
		{
			#Failed
			Invoke-Command -ScriptBlock $CompletedScript -ArgumentList $null
		}
	
	}
	
	function Update-JobTracker
	{
		<#
			.SYNOPSIS
				Checks the status of each job on the list.
		#>
		
		#Poll the jobs for status updates
		$timerJobTracker.Stop() #Freeze the Timer
		
		for($index =0; $index -lt $JobTrackerList.Count; $index++)
		{
			$psObject = $JobTrackerList[$index]
			
			if($null -ne $psObject) 
			{
				if($null -ne $psObject.Job)
				{
					if($psObject.Job.State -ne "Running")
					{				
						#Call the Complete Script Block
						if($null -ne $psObject.CompleteScript)
						{
							#$results = Receive-Job -Job $psObject.Job
							Invoke-Command -ScriptBlock $psObject.CompleteScript -ArgumentList $psObject.Job
						}
						
						$JobTrackerList.RemoveAt($index)
						Remove-Job -Job $psObject.Job
						$index-- #Step back so we don't skip a job
					}
					elseif($null -ne $psObject.UpdateScript)
					{
						#Call the Update Script Block
						Invoke-Command -ScriptBlock $psObject.UpdateScript -ArgumentList $psObject.Job
					}
				}
			}
			else
			{
				$JobTrackerList.RemoveAt($index)
				$index-- #Step back so we don't skip a job
			}
		}
		
		if($JobTrackerList.Count -gt 0)
		{
			$timerJobTracker.Start()#Resume the timer	
		}	
	}
	
	function Stop-JobTracker
	{
		<#
			.SYNOPSIS
				Stops and removes all Jobs from the list.
		#>
		#Stop the timer
		$timerJobTracker.Stop()
		
		#Remove all the jobs
		while($JobTrackerList.Count -gt 0)
		{
			$job = $JobTrackerList[0].Job
			$JobTrackerList.RemoveAt(0)
			Stop-Job $job
			Remove-Job $job
		}
	}
	#endregion
	
	
	$textboxComputername_KeyDown=[System.Windows.Forms.KeyEventHandler]{
	#Event Argument: $_ = [System.Windows.Forms.KeyEventArgs]
		if($_.KeyCode -eq 'Enter' -and $buttonConnect.Enabled)
		{
			#SearchGrid	
			try
			{
				$Empty = ""
				Load-ComboBox $comboboxOSD $Empty
				$comboboxOSD.SelectedIndex = 0
				Load-ComboBox $comboboxAPP $Empty
				$comboboxAPP.SelectedIndex = 0
				Load-ComboBox $comboboxSUP $Empty
				$comboboxSUP.SelectedIndex = 0
				if (-not $textboxComputername.Text)
				{
					[System.Windows.Forms.MessageBox]::Show('No computer specified', 'Error')
					Throw 'No Computer specified'
				}
				else
				{
					$global:Computername = $textboxComputername.Text
				}
				
				Write-Status -Message "Connecting to $computername"
				$picturebox1.BackColor = "Gold"
				
				If (-not (Test-Connection -ComputerName $Computername -Count 1 -Quiet))
				{
					$picturebox1.BackColor = "Red"
					
					
					[System.Windows.Forms.MessageBox]::Show('No such Computer or computer is offline', 'Error')
					Throw 'No such Computer or computer is offline'
					
				}
				
				Else
				{
					Write-status -Message "Connected to $Computername"
					$picturebox1.BackColor = "Green"
					
					# OSD Task Sequence #
					$OSDTS = (Get-CimInstance -ClassName CCM_Program -Namespace "root\ccm\clientSDK" -ComputerName $Computername | Where-Object { $_.TaskSequence -like "True" })
					$OSD = $OSDTS.Name
					
					
					# Application #
					$Application = (Get-CimInstance -ClassName CCM_Application -Namespace "root\ccm\clientSDK" -ComputerName $Computername | Where-Object { $_.InstallState -like "NotInstalled" })
					$AppName = $Application.Name
					
					# Software Updates #
					$SUPEvalState0 = "0"
					$SUPEvalState1 = "1"
					$SUPClass = [WmiClass]"root\ccm\clientSDK:CCM_SoftwareUpdatesManager"
					$SUPs = (Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_SoftwareUpdate -ComputerName $Computername | Where-Object { $_.EvaluationState -like "*$($SUPEvalState0)*" -or $_.EvaluationState -like "*$($SUPEvalState1)*" })
					$SUPName = $SUPs.Name
					
					if ($OSD)
					{
						Load-ComboBox $comboboxOSD $OSD -Append
						$comboboxOSD.SelectedIndex = 1
					}
					if ($APPName)
					{
						Load-ComboBox $comboboxAPP $AppName -Append
						$comboboxAPP.SelectedIndex = 1
					}
					if ($SUPName)
					{
						Load-ComboBox $comboboxSUP $SUPName -Append
						$comboboxSUP.SelectedIndex = 1
					}
					
					
				} #Else
			} #IF
			Catch
			{
				Write-Status -Message $_.Exception.Message
			}
			
			$_.SuppressKeyPress = $true
		}
	}
	
	$textboxComputername_TextChanged={
		#TODO: Place custom script here
		
	}
	
	$statusbar1_PanelClick=[System.Windows.Forms.StatusBarPanelClickEventHandler]{
	#Event Argument: $_ = [System.Windows.Forms.StatusBarPanelClickEventArgs]
		#TODO: Place custom script here
		
	}
	
	$toolstripstatuslabel1_Click={
		#TODO: Place custom script here
		
	}
	
	
	$comboboxOSD_SelectedIndexChanged={
		#TODO: Place custom script here
		
	}
	
	$labelOSDTaskSequence_Click={
		#TODO: Place custom script here
		
	}
	
	$comboboxAPP_SelectedIndexChanged={
		#TODO: Place custom script here
		
	}
	
	$buttonInstallOSD_Click={
		#TODO: Place custom script here
		Invoke-OSDInstall -Computername $Computername -OSDName $comboboxOSD.SelectedItem
	}
	
	$buttonInstallApp_Click={
		#TODO: Place custom script here
		Invoke-AppInstall -Computername $Computername -Method Install -AppName $comboboxAPP.SelectedItem 
	}
	
	$buttonInstallSUP_Click={
		#TODO: Place custom script here
		Invoke-SupInstall -Computername $Computername -SupName $comboboxSUP.SelectedItem
	}
	
	$buttonCancelProcess_Click={
		$script:CancelLoop = $true
	}
	
	$buttonStartProcess_Click={
		#Init CancelLoop
		$script:CancelLoop = $false
		$buttonCancelProcess.Enabled = $true
		#Disable the button so we don't trigger it again
		$this.Enabled = $false
		#Reset the Progress Bar
		$progressbar1.Value = 0
		
		for($i = 0; $i -lt $progressbar1.Maximum; $i++)
		{
			#----------------------------------------
			#Place custom script here
			sleep -Milliseconds 200
			
			#----------------------------------------
			#process the pending message
			[System.Windows.Forms.Application]::DoEvents()
			
			if($script:CancelLoop -eq $true)
			{
				#Clear the progress bar
				$progressbar1.Value = 0
				#Exit the loop
				break;
			}
			#Step the progress bar
			$progressbar1.PerformStep() 
		}
		
		#Enable the button so we can click it again
		$this.Enabled = $true
		$buttonCancelProcess.Enabled = $false
	}
	
	$buttonRunProcess_Click={
		$buttonRunProcess.Enabled = $false
		#TODO: Set the process path there	
		Add-ProcessTracker -FilePath "$env:windir/System32/notepad.exe" `
		-CompletedScript {
			$buttonRunProcess.Enabled = $true	
			$buttonRunProcess.ImageIndex = -1
		}`
		-UpdateScript {
			#Animate the Button
			if($null -ne $buttonRunProcess.ImageList)
			{
				if($buttonRunProcess.ImageIndex -lt $buttonRunProcess.ImageList.Images.Count - 1)
				{
					$buttonRunProcess.ImageIndex += 1
				}
				else
				{
					$buttonRunProcess.ImageIndex = 0		
				}
			}
		}
	}
	
	$processTracker_FormClosed=[System.Windows.Forms.FormClosedEventHandler]{
	#Event Argument: $_ = [System.Windows.Forms.FormClosedEventArgs]
		#Stop any pending processes
		#Stop-ProcessTracker
	}
	
	$timerProcessTracker_Tick={
		Update-ProcessTracker
	}
	
	#region Process Tracker
	$ProcessTrackerList = New-Object System.Collections.ArrayList
	function Add-ProcessTracker
	{
		<#
			.SYNOPSIS
				Add a new process to the ProcessTracker and starts the timer.
		
			.DESCRIPTION
				Add a new process to the ProcessTracker and starts the timer.
		
			.PARAMETER  FilePath
				The path to executable.
		
			.PARAMETER ArgumentList
				The arguments to pass to the process.
		
			.PARAMETER  CompleteScript
				The script block that will be called when the process is complete.
				The process is passed as an argument. The process argument is null when the job fails.
		
			.PARAMETER  UpdateScript
				The script block that will be called each time the timer ticks.
				The process is passed as an argument.
		
			.EXAMPLE
				 Add-ProcessTracker -FilePath "$env:windir/System32/notepad.exe" `
				-CompletedScript {
					Param([System.Diagnostics.Process]$Process)
					$button.Enable = $true
				}`
				-UpdateScript {
					Param([System.Diagnostics.Process]$Process)
					Function-Animate $button
				}
		
			.LINK
				
		#>
		
		Param(
		[ValidateNotNull()]
		[Parameter(Mandatory=$true)]
		[string]$FilePath,
		$ArgumentList = $null,
		[ScriptBlock]$CompletedScript,
		[ScriptBlock]$UpdateScript)
		
		#Start the Job
		if($ArgumentList)
		{
			$process = Start-Process -FilePath $FilePath -ArgumentList $ArgumentList -PassThru
		}
		else
		{
			$process = Start-Process -FilePath $FilePath -PassThru
		}
		
		if($null -ne $process)
		{
			#Create a Custom Object to keep track of the Job & Script Blocks
			$members = @{	"Process" = $process;
							"CompleteScript" = $CompletedScript;
							"UpdateScript" = $UpdateScript}
			
			$psObject = New-Object System.Management.Automation.PSObject -Property $members
			
			[void]$ProcessTrackerList.Add($psObject)	
			
			#Start the Timer
			if(-not $timerProcessTracker.Enabled)
			{
				$timerProcessTracker.Start()
			}
		}
		elseif($null -ne $CompletedScript)
		{
			#Failed
			Invoke-Command -ScriptBlock $CompletedScript -ArgumentList $null
		}
	
	}
	
	function Update-ProcessTracker
	{
		<#
			.SYNOPSIS
				Checks the status of each job on the list.
		#>
		
		#Poll the jobs for status updates
		$timerProcessTracker.Stop() #Freeze the Timer
		
		for($index =0; $index -lt $ProcessTrackerList.Count; $index++)
		{
			$psObject = $ProcessTrackerList[$index]
			
			if($null -ne $psObject) 
			{
				if($null -ne $psObject.Process)
				{
					if($psObject.Process.HasExited)
					{				
						#Call the Complete Script Block
						if($null -ne $psObject.CompleteScript)
						{
							#$results = Receive-Job -Job $psObject.Job
							Invoke-Command -ScriptBlock $psObject.CompleteScript -ArgumentList $psObject.Process
						}
						
						$ProcessTrackerList.RemoveAt($index)
						$index-- #Step back so we don't skip a job
					}
					elseif($null -ne $psObject.UpdateScript)
					{
						#Call the Update Script Block
						Invoke-Command -ScriptBlock $psObject.UpdateScript -ArgumentList $psObject.Process
					}
				}
			}
			else
			{
				$ProcessTrackerList.RemoveAt($index)
				$index-- #Step back so we don't skip a job
			}
		}
		
		if($ProcessTrackerList.Count -gt 0)
		{
			$timerProcessTracker.Start()#Resume the timer	
		}	
	}
	
	function Stop-ProcessTracker
	{
		<#
			.SYNOPSIS
				Stops and removes all processes from the list.
		#>
		#Stop the timer
		$timerProcessTracker.Stop()
		
		#Remove all the processes
		while($ProcessTrackerList.Count -gt 0)
		{
			$process = $ProcessTrackerList[0].Process
			$ProcessTrackerList.RemoveAt(0)
			if(-not $psObject.Process.HasExited)
			{
				Stop-Process -InputObject $process
			}
		}
	}
	#endregion
		# --End User Generated Script--
	#----------------------------------------------
	#region Generated Events
	#----------------------------------------------
	
	$Form_StateCorrection_Load=
	{
		#Correct the initial state of the form to prevent the .Net maximized form issue
		$formMain.WindowState = $InitialFormWindowState
	}
	
	$Form_StoreValues_Closing=
	{
		#Store the control values
		$script:MainForm_comboboxSUP = $comboboxSUP.Text
		$script:MainForm_comboboxSUP_SelectedItem = $comboboxSUP.SelectedItem
		$script:MainForm_comboboxAPP = $comboboxAPP.Text
		$script:MainForm_comboboxAPP_SelectedItem = $comboboxAPP.SelectedItem
		$script:MainForm_comboboxOSD = $comboboxOSD.Text
		$script:MainForm_comboboxOSD_SelectedItem = $comboboxOSD.SelectedItem
		$script:MainForm_textboxComputername = $textboxComputername.Text
	}

	
	$Form_Cleanup_FormClosed=
	{
		#Remove all event handlers from the controls
		try
		{
			$buttonInstallSUP.remove_Click($buttonInstallSUP_Click)
			$buttonInstallApp.remove_Click($buttonInstallApp_Click)
			$comboboxAPP.remove_SelectedIndexChanged($comboboxAPP_SelectedIndexChanged)
			$labelOSDTaskSequence.remove_Click($labelOSDTaskSequence_Click)
			$comboboxOSD.remove_SelectedIndexChanged($comboboxOSD_SelectedIndexChanged)
			$buttonInstallOSD.remove_Click($buttonInstallOSD_Click)
			$textboxComputername.remove_TextChanged($textboxComputername_TextChanged)
			$textboxComputername.remove_KeyDown($textboxComputername_KeyDown)
			$buttonConnect.remove_Click($buttonConnect_Click)
			$buttonExit.remove_Click($buttonExit_Click)
			$formMain.remove_FormClosed($formMain_FormClosed)
			$formMain.remove_Load($formMain_Load)
			$timerJobTracker.remove_Tick($timerJobTracker_Tick)
			$formMain.remove_Load($Form_StateCorrection_Load)
			$formMain.remove_Closing($Form_StoreValues_Closing)
			$formMain.remove_FormClosed($Form_Cleanup_FormClosed)
		}
		catch { Out-Null <# Prevent PSScriptAnalyzer warning #> }
	}
	#endregion Generated Events

	#----------------------------------------------
	#region Generated Form Code
	#----------------------------------------------
	$formMain.SuspendLayout()
	#
	# formMain
	#
	$formMain.Controls.Add($buttonInstallSUP)
	$formMain.Controls.Add($comboboxSUP)
	$formMain.Controls.Add($labelSoftwareUpdates)
	$formMain.Controls.Add($buttonInstallApp)
	$formMain.Controls.Add($comboboxAPP)
	$formMain.Controls.Add($labelApplications)
	$formMain.Controls.Add($labelOSDTaskSequence)
	$formMain.Controls.Add($comboboxOSD)
	$formMain.Controls.Add($statusbar1)
	$formMain.Controls.Add($picturebox1)
	$formMain.Controls.Add($buttonInstallOSD)
	$formMain.Controls.Add($textboxComputername)
	$formMain.Controls.Add($buttonConnect)
	$formMain.Controls.Add($buttonExit)
	$formMain.AutoScaleDimensions = '6, 13'
	$formMain.AutoScaleMode = 'Font'
	$formMain.ClientSize = '475, 371'
	$formMain.Name = 'formMain'
	$formMain.StartPosition = 'CenterScreen'
	$formMain.Text = 'Remote Software Center'
	$formMain.add_FormClosed($formMain_FormClosed)
	$formMain.add_Load($formMain_Load)
	#
	# buttonInstallSUP
	#
	$buttonInstallSUP.Anchor = 'Bottom, Left'
	$buttonInstallSUP.Location = '362, 229'
	$buttonInstallSUP.Name = 'buttonInstallSUP'
	$buttonInstallSUP.Size = '75, 23'
	$buttonInstallSUP.TabIndex = 16
	$buttonInstallSUP.Text = '&Install SUP'
	$buttonInstallSUP.TextImageRelation = 'ImageBeforeText'
	$buttonInstallSUP.UseVisualStyleBackColor = $True
	$buttonInstallSUP.add_Click($buttonInstallSUP_Click)
	#
	# comboboxSUP
	#
	$comboboxSUP.FormattingEnabled = $True
	$comboboxSUP.Location = '11, 229'
	$comboboxSUP.Name = 'comboboxSUP'
	$comboboxSUP.Size = '308, 21'
	$comboboxSUP.TabIndex = 15
	#
	# labelSoftwareUpdates
	#
	$labelSoftwareUpdates.AutoSize = $True
	$labelSoftwareUpdates.Font = 'Microsoft Sans Serif, 9pt, style=Bold'
	$labelSoftwareUpdates.Location = '11, 211'
	$labelSoftwareUpdates.Name = 'labelSoftwareUpdates'
	$labelSoftwareUpdates.Size = '120, 15'
	$labelSoftwareUpdates.TabIndex = 14
	$labelSoftwareUpdates.Text = 'Software Updates'
	#
	# buttonInstallApp
	#
	$buttonInstallApp.Anchor = 'Bottom, Left'
	$buttonInstallApp.Location = '362, 157'
	$buttonInstallApp.Name = 'buttonInstallApp'
	$buttonInstallApp.Size = '75, 23'
	$buttonInstallApp.TabIndex = 13
	$buttonInstallApp.Text = '&Install App'
	$buttonInstallApp.TextImageRelation = 'ImageBeforeText'
	$buttonInstallApp.UseVisualStyleBackColor = $True
	$buttonInstallApp.add_Click($buttonInstallApp_Click)
	#
	# comboboxAPP
	#
	$comboboxAPP.FormattingEnabled = $True
	$comboboxAPP.Location = '11, 157'
	$comboboxAPP.Name = 'comboboxAPP'
	$comboboxAPP.Size = '308, 21'
	$comboboxAPP.TabIndex = 12
	$comboboxAPP.add_SelectedIndexChanged($comboboxAPP_SelectedIndexChanged)
	#
	# labelApplications
	#
	$labelApplications.AutoSize = $True
	$labelApplications.Font = 'Microsoft Sans Serif, 9pt, style=Bold'
	$labelApplications.Location = '11, 139'
	$labelApplications.Name = 'labelApplications'
	$labelApplications.Size = '85, 15'
	$labelApplications.TabIndex = 11
	$labelApplications.Text = 'Applications'
	#
	# labelOSDTaskSequence
	#
	$labelOSDTaskSequence.AutoSize = $True
	$labelOSDTaskSequence.Font = 'Microsoft Sans Serif, 9pt, style=Bold'
	$labelOSDTaskSequence.Location = '14, 72'
	$labelOSDTaskSequence.Name = 'labelOSDTaskSequence'
	$labelOSDTaskSequence.Size = '138, 15'
	$labelOSDTaskSequence.TabIndex = 10
	$labelOSDTaskSequence.Text = 'OSD Task Sequence'
	$labelOSDTaskSequence.add_Click($labelOSDTaskSequence_Click)
	#
	# comboboxOSD
	#
	$comboboxOSD.FormattingEnabled = $True
	$comboboxOSD.Location = '11, 90'
	$comboboxOSD.Name = 'comboboxOSD'
	$comboboxOSD.Size = '308, 21'
	$comboboxOSD.TabIndex = 9
	$comboboxOSD.add_SelectedIndexChanged($comboboxOSD_SelectedIndexChanged)
	#
	# statusbar1
	#
	$statusbar1.Location = '0, 349'
	$statusbar1.Name = 'statusbar1'
	$statusbar1.Size = '475, 22'
	$statusbar1.TabIndex = 8
	#
	# picturebox1
	#
	$picturebox1.BackColor = 'Transparent'
	$picturebox1.Location = '0, 320'
	$picturebox1.Name = 'picturebox1'
	$picturebox1.Size = '25, 27'
	$picturebox1.TabIndex = 7
	$picturebox1.TabStop = $False
	#
	# buttonInstallOSD
	#
	$buttonInstallOSD.Anchor = 'Bottom, Left'
	$buttonInstallOSD.ImageList = $imagelistButtonBusyAnimation
	$buttonInstallOSD.Location = '362, 90'
	$buttonInstallOSD.Name = 'buttonInstallOSD'
	$buttonInstallOSD.Size = '75, 23'
	$buttonInstallOSD.TabIndex = 0
	$buttonInstallOSD.Text = '&Install OSD'
	$buttonInstallOSD.TextImageRelation = 'ImageBeforeText'
	$buttonInstallOSD.UseVisualStyleBackColor = $True
	$buttonInstallOSD.add_Click($buttonInstallOSD_Click)
	#
	# textboxComputername
	#
	$textboxComputername.Anchor = 'Top, Left, Right'
	$textboxComputername.Location = '13, 15'
	$textboxComputername.Name = 'textboxComputername'
	$textboxComputername.Size = '118, 20'
	$textboxComputername.TabIndex = 0
	$textboxComputername.add_TextChanged($textboxComputername_TextChanged)
	$textboxComputername.add_KeyDown($textboxComputername_KeyDown)
	#
	# buttonConnect
	#
	$buttonConnect.Anchor = 'Top, Right'
	$buttonConnect.Location = '150, 12'
	$buttonConnect.Name = 'buttonConnect'
	$buttonConnect.Size = '75, 23'
	$buttonConnect.TabIndex = 1
	$buttonConnect.Text = '&Connect'
	$buttonConnect.UseVisualStyleBackColor = $True
	$buttonConnect.add_Click($buttonConnect_Click)
	#
	# buttonExit
	#
	$buttonExit.Anchor = 'Bottom, Right'
	$buttonExit.Location = '362, 320'
	$buttonExit.Name = 'buttonExit'
	$buttonExit.Size = '75, 23'
	$buttonExit.TabIndex = 4
	$buttonExit.Text = 'E&xit'
	$buttonExit.UseVisualStyleBackColor = $True
	$buttonExit.add_Click($buttonExit_Click)
	#
	# timerJobTracker
	#
	$timerJobTracker.add_Tick($timerJobTracker_Tick)
	#
	# imagelistButtonBusyAnimation
	#
	$Formatter_binaryFomatter = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
	#region Binary Data
	$System_IO_MemoryStream = New-Object System.IO.MemoryStream (,[byte[]][System.Convert]::FromBase64String('
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAu
MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAA
ACZTeXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkD
AAAADwMAAAB2CgAAAk1TRnQBSQFMAgEBCAEAAbgBAAG4AQABEAEAARABAAT/ASEBAAj/AUIBTQE2
BwABNgMAASgDAAFAAwABMAMAAQEBAAEgBgABMP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/
AP8AugADwgH/AzUB/wM1Af8DwgH/MAADwgH/A1UB/wOCAf8DwgH/sAADNQH/AwAB/wMAAf8DNQH/
MAADggH/AzUB/wM1Af8DVQH/gAADwgH/AzUB/wM1Af8DwgH/IAADNQH/AwAB/wMAAf8DNQH/A8IB
/wNVAf8DggH/A8IB/xAAA8IB/wM1Af8DNQH/A8IB/wNVAf8DNQH/AzUB/wNVAf8EAAOSAf8DkgH/
A8IB/3AAAzUB/wMAAf8DAAH/AzUB/yAAA8IB/wM1Af8DNQH/A8IB/wOCAf8DNQH/AzUB/wOCAf8Q
AAM1Af8DAAH/AwAB/wM1Af8DwgH/A1UB/wOCAf8DwgH/A5IB/wOCAf8DggH/A5IB/3AAAzUB/wMA
Af8DAAH/AzUB/zAAA1UB/wM1Af8DNQH/A1UB/xAAAzUB/wMAAf8DAAH/AzUB/xAAA5IB/wOSAf8D
kgH/A8IB/3AAA8IB/wM1Af8DNQH/A8IB/zAAA8IB/wNVAf8DggH/A8IB/xAAA8IB/wM1Af8DNQH/
A8IB/xAAA8IB/wOSAf8DkgH/A8IB/zgAA8IB/wM1Af8DNQH/A8IB/zAAA8IB/wOCAf8DVQH/A8IB
/zAAA8IB/wPCAf8DkgH/A8IB/zQAA8IB/wPCAf80AAM1Af8DAAH/AwAB/wM1Af8wAANVAf8DNQH/
AzUB/wNVAf8wAAOSAf8DggH/A4IB/wOSAf8wAAPCAf8DwgH/A8IB/wPCAf8wAAM1Af8DAAH/AwAB
/wM1Af8wAAOCAf8DNQH/AzUB/wOCAf8wAAPCAf8DggH/A5IB/wOSAf8wAAPCAf8DwgH/A8IB/wPC
Af8wAAPCAf8DNQH/AzUB/wPCAf8wAAPCAf8DggH/A1UB/wPCAf8wAAPCAf8DkgH/A5IB/wPCAf80
AAPCAf8DwgH/EAADwgH/A8IB/xQAA8IB/wOCAf8DVQH/A8IB/zAAA8IB/wOSAf8DkgH/A8IB/zQA
A8IB/wPCAf9UAAPCAf8DwgH/A8IB/wPCAf8QAANVAf8DNQH/AzUB/wNVAf8wAAOSAf8DggH/A5IB
/wOSAf8wAAPCAf8DwgH/A8IB/wPCAf9QAAPCAf8DwgH/A8IB/wPCAf8DwgH/A8IB/wOSAf8DwgH/
A4IB/wM1Af8DNQH/A4IB/yQAA8IB/wPCAf8EAAPCAf8DggH/A5IB/wOSAf8wAAPCAf8DwgH/A8IB
/wPCAf9UAAPCAf8DwgH/BAADkgH/A4IB/wOCAf8DkgH/A8IB/wOCAf8DVQH/A8IB/yAAA8IB/wPC
Af8DwgH/A8IB/wPCAf8DkgH/A5IB/wPCAf80AAPCAf8DwgH/ZAADkgH/A5IB/wOSAf8DkgH/MAAD
wgH/A8IB/wPCAf8DwgH/sAADwgH/A5IB/wOSAf8DwgH/NAADwgH/A8IB/7QAA8IB/wPCAf8DkgH/
A8IB/zQAA8IB/wPCAf+0AAOSAf8DggH/A4IB/wOSAf8wAAPCAf8DwgH/A8IB/wPCAf+gAAPCAf8D
VQH/A4IB/wPCAf8DkgH/A5IB/wOSAf8DwgH/BAADwgH/A8IB/xQAA8IB/wPCAf8DkgH/A8IB/wPC
Af8DwgH/A8IB/wPCAf8kAAPCAf8DwgH/dAADggH/AzUB/wM1Af8DggH/A8IB/wOSAf8DkgH/A8IB
/wPCAf8DwgH/A8IB/wPCAf8QAAOSAf8DggH/A4IB/wOSAf8EAAPCAf8DwgH/JAADwgH/A8IB/wPC
Af8DwgH/cAADVQH/AzUB/wM1Af8DggH/EAADwgH/A8IB/wPCAf8DwgH/EAADkgH/A5IB/wOSAf8D
kgH/MAADwgH/A8IB/wPCAf8DwgH/cAADwgH/A1UB/wNVAf8DwgH/FAADwgH/A8IB/xQAA8IB/wOS
Af8DkgH/A8IB/zQAA8IB/wPCAf9sAAPCAf8DNQH/AzUB/wPCAf8wAAPCAf8DVQH/A4IB/wPCAf8w
AAPCAf8DwgH/A5IB/wPCAf80AAPCAf8DwgH/NAADNQH/AwAB/wMAAf8DNQH/MAADggH/AzUB/wM1
Af8DVQH/MAADkgH/A4IB/wOCAf8DkgH/MAADwgH/A8IB/wPCAf8DwgH/MAADNQH/AwAB/wMAAf8D
NQH/MAADVQH/AzUB/wM1Af8DggH/MAADkgH/A5IB/wOSAf8DkgH/MAADwgH/A8IB/wPCAf8DwgH/
MAADwgH/AzUB/wM1Af8DwgH/MAADwgH/A1UB/wNVAf8DwgH/MAADwgH/A5IB/wOSAf8DwgH/NAAD
wgH/A8IB/3wAA8IB/wM1Af8DNQH/A8IB/zAAA8IB/wNVAf8DggH/A8IB/zAAA8IB/wPCAf8DkgH/
A8IB/xAAA8IB/wM1Af8DNQH/A8IB/1AAAzUB/wMAAf8DAAH/AzUB/zAAA4IB/wM1Af8DNQH/A1UB
/zAAA5IB/wOCAf8DggH/A5IB/xAAAzUB/wMAAf8DAAH/AzUB/1AAAzUB/wMAAf8DAAH/AzUB/zAA
A1UB/wM1Af8DNQH/A4IB/wOSAf8DNQH/AzUB/wPCAf8gAAOSAf8DkgH/A5IB/wOSAf8DwgH/A1UB
/wOCAf8DwgH/AzUB/wMAAf8DAAH/AzUB/1AAA8IB/wM1Af8DNQH/A8IB/zAAA8IB/wOCAf8DVQH/
A8IB/wM1Af8DAAH/AwAB/wM1Af8gAAPCAf8DkgH/A5IB/wPCAf8DggH/AzUB/wM1Af8DVQH/A8IB
/wM1Af8DNQH/A8IB/6AAAzUB/wMAAf8DAAH/AzUB/zAAA1UB/wM1Af8DNQH/A4IB/7AAA8IB/wM1
Af8DNQH/A8IB/zAAA8IB/wOCAf8DVQH/A8IB/xgAAUIBTQE+BwABPgMAASgDAAFAAwABMAMAAQEB
AAEBBQABgAEBFgAD/4EABP8B/AE/AfwBPwT/AfwBPwH8AT8D/wHDAfwBAwHAASMD/wHDAfwBAwHA
AQMD/wHDAf8DwwP/AcMB/wPDAf8B8AH/AfAB/wHwAf8B+QH/AfAB/wHwAf8B8AH/AfAB/wHwAf8B
8AH/AfAB/wHwAf8B8AH/AfAB/wHwAf8B+QHnAcMB/wHDAf8B5wL/AsMB/wHDAf8BwwL/AcABAwH+
AUMB/wHDAv8B5AEDAfwBAwH/AecC/wH8AT8B/AE/BP8B/AE/Af4BfwT/AfwBPwH+AX8E/wH8AT8B
/AE/BP8BwAEnAcABPwHnA/8BwAEDAcIBfwHDA/8DwwH/AcMD/wHDAecBwwH/AecD/wEPAf8BDwH/
AQ8B/wGfAf8BDwH/AQ8B/wEPAf8BDwH/AQ8B/wEPAf8BDwH/AQ8B/wEPAf8BDwH/AQ8B/wGfA/8B
wwH/AcMB/wLDAv8BwwH/AcMB/wLDAv8BwwH/AcABPwHAAQMC/wHDAf8BwAE/AcABAwT/AfwBPwH8
AT8E/wH8AT8B/AE/Cw=='))
	#endregion
	$imagelistButtonBusyAnimation.ImageStream = $Formatter_binaryFomatter.Deserialize($System_IO_MemoryStream)
	$Formatter_binaryFomatter = $null
	$System_IO_MemoryStream = $null
	$imagelistButtonBusyAnimation.TransparentColor = 'Transparent'
	$formMain.ResumeLayout()
	#endregion Generated Form Code

	#----------------------------------------------

	#Save the initial state of the form
	$InitialFormWindowState = $formMain.WindowState
	#Init the OnLoad event to correct the initial state of the form
	$formMain.add_Load($Form_StateCorrection_Load)
	#Clean up the control events
	$formMain.add_FormClosed($Form_Cleanup_FormClosed)
	#Store the control values when form is closing
	$formMain.add_Closing($Form_StoreValues_Closing)
	#Show the Form
	return $formMain.ShowDialog()

}
#endregion Source: MainForm.psf

#Start the application
Main ($CommandLine)
