Samples/BareMetalProvisioningUsingVMedia.ps1
param( [parameter(Mandatory=${true})][String]$Ucs, [parameter(Mandatory=${true})][String]$UcsOrg, [parameter(Mandatory=${true})][String]$UcsSpTemplate, [parameter(Mandatory=${true})][String]$UcsBladeDn, [parameter(Mandatory=${true})][string]$Hostname ) # Global Variables $ImageFileName = 'VMware-ESXi-6.7.0-9484548-Custom-Cisco-6.7.0.2.iso' $ImagePath = '/' $RemoteIpAddress = '10.105.219.102' $UserId = 'root' $Password = 'Tpi12345' $RemotePort = '80' $DeviceType = 'cdd' $Protocol = 'http' $BootPolicyName = 'TestBootPolicy' $vMediaPolicyName = 'TestvMediaPolicy' $Global:LogFile = ".\AutomateUCSLog.log" if ([System.IO.File]::Exists($Global:LogFile) -eq $false) { $null = New-Item -Path $Global:LogFile -ItemType File -Force } function Write-InfoLog { [CmdletBinding()] param ( [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [String] $Message ) "Info: $(Get-Date -Format g): $Message" | Out-File $Global:LogFile -Append Write-Host "Info: $Message" } function Write-ErrorLog { [CmdletBinding()] param ( [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [object] $Message ) "Error: $(Get-Date -Format g):" | Out-File $Global:LogFile -Append $Message | Out-File $LogFile -Append Write-Host "Error: $($Message)" -ForegroundColor Red } function Start-Countdown{ Param( [INT]$Seconds = (Read-Host "Enter seconds to countdown from") ) while ($seconds -ge 1){ Write-Progress -Activity "Sleep Timer Countdown" -SecondsRemaining $Seconds -Status "Time Remaining" Start-Sleep -Seconds 1 $Seconds -- } } function VerifyPowershellVersion { try { Write-InfoLog "Checking for proper PowerShell version" $PSVersion = $psversiontable.psversion $PSMinimum = $PSVersion.Major Write-InfoLog "You are running PowerShell version $PSVersion" if ($PSMinimum -ge "3") { Write-InfoLog "Your version of PowerShell is valid for this script." } else { Write-ErrorLog "This script requires PowerShell version 3 or above. Please update your system and try again." Write-InfoLog "Exiting..." exit } } catch { throw; } } function LoadUCSMModule { try { #Load the UCSM PowerTool Write-InfoLog "Checking Cisco Powertool UCSM Module" $Modules = Get-Module if ( -not ($Modules -like "Cisco.UCSManager")) { Write-InfoLog "Importing Module: Cisco Powertool UCSM Module" Import-Module Cisco.UCSManager $Modules = Get-Module if ( -not ($Modules -like "Cisco.UCSManager")) { Write-ErrorLog "Cisco Powertool UCSM Module did not load. Please use command : Install-Module -Name Cisco.UCSManager" Write-InfoLog "Exiting..." exit } else { $PTVersion = (Get-Module Cisco.UCSManager).Version Write-InfoLog "Cisco Powertool UCSM module version $PTVersion is now Loaded" } } else { $PTVersion = (Get-Module Cisco.UCSManager).Version Write-InfoLog "Cisco Powertool UCSM module version $PTVersion is already Loaded" } } catch { throw; } } function ConfigureMultipleUCS { try { $MultipleConnection = Set-UcsPowerToolConfiguration -SupportMultipleDefaultUcs $true -Force -ErrorAction stop } catch { throw; } } function CreateVMediaPolicy { param( [Parameter(mandatory = $true)] [string]$ImageFileName, [Parameter(mandatory = $true)] [string]$ImagePath, [Parameter(mandatory = $true)] [string]$RemoteIpAddress, [Parameter(mandatory = $true)] [string]$UserId, [Parameter(mandatory = $true)] [string]$Password, [Parameter(mandatory = $true)] [string]$RemotePort, [Parameter(mandatory = $true)] [string]$DeviceType, [Parameter(mandatory = $true)] [string]$Protocol, [Parameter(mandatory = $true)] [Cisco.Ucs.Common.BaseHandle[]] $Ucs, [Parameter(mandatory = $true)] [Cisco.Ucsm.UcsmManagedObject]$TargetOrg, [Parameter(mandatory = $true)] [string]$vMediaPolicyName ) try { Write-InfoLog "Creating VMedia Policy : $vMediaPolicyName" Start-UcsTransaction -Ucs $Ucs $VMediaPolicy = $TargetOrg | Add-UcsVmediaPolicy -ModifyPresent -Descr '' -Name $vMediaPolicyName -PolicyOwner 'local' -RetryOnMountFail 'yes' -Ucs $Ucs Write-InfoLog "ImageFileName: $ImageFileName ImagePath: $ImagePath RemoteIpAddress: $RemoteIpAddress UserId: $UserId Password: $Password RemotePort: $RemotePort DeviceType: $DeviceType Protocol: $Protocol" $VmediaMountEntry = $VMediaPolicy | Add-UcsVmediaMountEntry -ModifyPresent -AuthOption 'none' -Description '' -DeviceType $DeviceType -ImageFileName $ImageFileName -ImagePath $ImagePath -ImageNameVariable 'none' -MappingName 'cdd-http-VMedia' -MountProtocol $Protocol -Password $Password -RemapOnEject 'no' -RemoteIpAddress $RemoteIpAddress -RemotePort $RemotePort -UserId $UserId -Writable 'no' -Ucs $Ucs Complete-UcsTransaction -Ucs $Ucs Write-InfoLog "Successfully created VMedia Policy : $vMediaPolicyName" } catch { Write-ErrorLog "Failed to Create VMedia Policy : $vMediaPolicyName" Write-InfoLog "Disconnecting UCS" $Ucs = Disconnect-Ucs throw; } } function ModifyBootOrder { param( [Parameter(mandatory = $true)] [string]$BootPolicyName, [Parameter(mandatory = $true)] [Cisco.Ucs.Common.BaseHandle[]] $Ucs, [Parameter(mandatory = $true)] [Cisco.Ucsm.UcsmManagedObject]$TargetOrg ) try { Write-InfoLog "Modifying boot order" Start-UcsTransaction -Ucs $Ucs $mo = $TargetOrg | Add-UcsBootPolicy -ModifyPresent -Name $BootPolicyName -Ucs $Ucs #CIMC mounted vMedia : CD/DVD $mo_1 = $mo | Add-UcsLsbootVirtualMedia -ModifyPresent -Access "read-only-remote-cimc" -LunId "0" -Order 1 -Ucs $Ucs #Local Device : Local CD/DVD $mo_2 = $mo | Add-UcsLsbootVirtualMedia -ModifyPresent -Access "read-only-local" -LunId "0" -Order 2 -Ucs $Ucs Complete-UcsTransaction -Ucs $Ucs Write-InfoLog "Modifying boot order completed" } catch { Write-ErrorLog "Failed to modify boot order of boot policy : $BootPolicyName" Write-InfoLog "Disconnecting UCS" $Ucs = Disconnect-Ucs throw; } } function ModifyBootPolicyOfServiceProfile { param( [Parameter(mandatory = $true)] [string]$BootPolicyName, [Parameter(mandatory = $true)] [string]$SPName, [Parameter(mandatory = $true)] [Cisco.Ucs.Common.BaseHandle[]] $Ucs, [Parameter(mandatory = $true)] [Cisco.Ucsm.UcsmManagedObject]$TargetOrg, [Parameter(mandatory = $true)] [string]$vMediaPolicyName ) try { Write-InfoLog "Updating Service Profile template : $SPName with Boot Policy : $BootPolicyName and vMedia Policy: $vMediaPolicyName" $CheckBootPolicy = (Get-UcsBootPolicy -Name $BootPolicyName -Ucs $Ucs | measure).Count if ($CheckBootPolicy -eq 1) { $SP = $TargetOrg | Add-UcsServiceProfile -Name $SPName -ModifyPresent -BootPolicyName $BootPolicyName -VmediaPolicyName $vMediaPolicyName -Ucs $Ucs Write-InfoLog "Updating Service Profile template completed" } else { Write-ErrorLog "Boot policy : $BootPolicyName not found" } } catch { Write-ErrorLog "Failed to update Service Profile template" Write-InfoLog "Disconnecting UCS" $Ucs = Disconnect-Ucs throw; } } #####################**************************************##################### try { VerifyPowershellVersion LoadUCSMModule ConfigureMultipleUCS # Get UCS PS Connection Write-InfoLog "UCS: Checking for current UCS Connection for UCS Domain: '$($ucs)'" $UcsConn = Get-UcsPSSession | where { $_.Name -eq $Ucs } if ( ($UcsConn).Name -ne $Ucs ) { Write-InfoLog "UCS: UCS Connection: '$($ucs)' is not connected" Write-InfoLog "UCS: Enter UCS Credentials" $cred = Get-Credential $UcsConn = connect-ucs $Ucs -Credential $cred } # Get UCS org in connected UCS session Write-InfoLog "UCS: Checking for UCS Org: '$($UcsOrg)' on UCS Domain: '$($ucs)'" $TargetOrg = Get-UcsOrg -Name $UcsOrg if ( $TargetOrg -eq $null ) { Write-InfoLog "UCS: UCS Organization: '$($TargetOrg)' is not present" exit } # Get UCS Blade on connected UCS session, check availability of UCS Blade Write-InfoLog "UCS: Checking availability on UCS Blade: '$($UcsBladeDn)' on UCS Domain: '$($ucs)'" $TargetBlade = Get-UcsBlade -dn $UcsBladeDn if ( $TargetBlade -eq $null ) { Write-InfoLog "UCS: UCS Blade: '$($TargetBlade.Dn)' is not present" exit } elseif ( ($TargetBlade).Association -ne "none" -and ($TargetBlade).Availability -ne "available" ) { Write-InfoLog "UCS: UCS Blade: '$($TargetBlade.Dn)' is not available" exit } # Check to see if SP is already created on connected UCS Session Write-InfoLog "UCS: Checking to see if SP: '$($hostname)' exists on UCS Domain: '$($ucs)'" $SpToCreate = $TargetOrg | Get-UcsServiceProfile -Name $Hostname -LimitScope if ( $SpToCreate -ne $null ) { Write-InfoLog "UCS: UCS Service Profile: '$($Hostname)' is already created" exit } # Get UCS SP template on connected UCS session Write-InfoLog "UCS: Checking for UCS Service Profile: '$($UcsSpTemplate)' on UCS Domain: '$($ucs)'" $TargetSpTemplate = $TargetOrg | Get-UcsServiceProfile -Name $UcsSpTemplate -ucs $UcsConn -LimitScope if ( $TargetSpTemplate -eq $null ) { Write-InfoLog "UCS: UCS Service Profile Template: '$($TargetSpTemplate.Dn)' is not present" exit } elseif ( ($TargetSpTemplate).Type -notlike "*-template*" ) { Write-InfoLog "UCS: UCS Service Profile: '$($TargetSpTemplate.Dn)' is not a service profile template" exit } #Create vMedia Policy $VMediaPolicy = CreateVMediaPolicy -vMediaPolicyName $vMediaPolicyName -ImageFileName $ImageFileName -ImagePath $ImagePath -RemoteIpAddress $RemoteIpAddress -UserId $UserId -Password $Password -RemotePort $RemotePort -DeviceType $DeviceType -Protocol $Protocol -Ucs $UcsConn -TargetOrg $TargetOrg #Modify Boot order using boot policy $BootOrder = ModifyBootOrder -BootPolicyName $BootPolicyName -Ucs $UcsConn -TargetOrg $TargetOrg #Associate boot policy to ServiceProfile Template $AssociateBootPolicy = ModifyBootPolicyOfServiceProfile -BootPolicyName $BootPolicyName -vMediaPolicyName $vMediaPolicyName -SPName $TargetSpTemplate.name -Ucs $UcsConn -TargetOrg $TargetOrg # Create New UCS SP from Template Write-InfoLog "UCS: Creating new SP: '$($hostname)' from UCS SP Template: '$($TargetSpTemplate.Dn)' on UCS Domain: '$($ucs)'" $NewSp = Add-UcsServiceProfile -org $TargetOrg -Ucs $UcsConn -SrcTemplName ($TargetSpTemplate).Name -Name $Hostname $devnull = $NewSp | Set-UcsServerPower -ucs $UcsConn -State "down" -Force # Associate Service Profile to Blade Write-InfoLog "UCS: Associating new UCS SP: '$($NewSp.Name)' to UCS Blade: '$($TargetBlade.Dn)' on UCS Domain: '$($Ucs)'" $devnull = Associate-UcsServiceProfile -ucs $UcsConn -ServiceProfile $NewSp.name -Blade $TargetBlade -Force # Monitor UCS SP Associate for completion Write-InfoLog "UCS: Waiting for UCS SP: '$($NewSp.name)' to complete SP association process on UCS Domain: '$($Ucs)'" Write-InfoLog "Sleeping 3 minutes" Start-Countdown -seconds 180 $i = 0 do { if ( (Get-UcsServiceProfile -Dn $NewSp.Dn).AssocState -ieq "associated" ) { break } else { Write-InfoLog "Sleeping 30 seconds" Start-Countdown -seconds 30 $i++ Write-InfoLog "UCS: RETRY $($i): Checking for UCS SP: '$($NewSp.name)' to complete SP association process on UCS Domain: '$($Ucs)'" } } until ( (Get-UcsServiceProfile -Dn $NewSp.Dn).AssocState -ieq "associated" -or $i -eq 24 ) if ( $i -eq 24 ) { Write-InfoLog "UCS: Association process of UCS SP: '$($NewSp.name)' failed on UCS Domain: '$($Ucs)'" exit } Write-InfoLog "UCS: Association process of UCS SP: '$($NewSp.name)' completed on UCS Domain: '$($Ucs)'" # Set SP Power State to Up Write-Host "UCS: Setting Desired Power State to 'up' of Service Profile: '$($NewSp.name)' on UCS Domain: '$($Ucs)'" $PowerSpOn = $NewSp | Set-UcsServerPower -ucs $UcsConn -State "up" -Force # Reset Blade server if ( $TargetBlade -ne $null ) { Write-InfoLog "Resetting Blade Server : $UcsBladeDn" $ResetBlade = $TargetBlade | Reset-UcsServer -Force } } catch { Write-ErrorLog "Failed Automate UCS" Write-InfoLog "Disconnecting UCS" $Ucs = Disconnect-Ucs throw; } # SIG # Begin signature block # MIIhsQYJKoZIhvcNAQcCoIIhojCCIZ4CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD+VHbMK+IQy+NN # T0LuFNOEmc8ZfVkJ0Rxl5G97yAuYKqCCGsswggeNMIIFdaADAgECAhBAAYkJtMec # EjtNtgBsSCkGMA0GCSqGSIb3DQEBCwUAMEgxCzAJBgNVBAYTAlVTMRIwEAYDVQQK # EwlJZGVuVHJ1c3QxJTAjBgNVBAMTHFRydXN0SUQgRVYgQ29kZSBTaWduaW5nIENB # IDQwHhcNMjMwNjMwMDAyOTQ5WhcNMjYwNjI5MDAyODQ5WjCB7zELMAkGA1UEBhMC # VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExETAPBgNVBAcTCFNhbiBKb3NlMRAwDgYD # VQQFEwc0NjgyNDc4MRMwEQYLKwYBBAGCNzwCAQMTAlVTMRswGQYLKwYBBAGCNzwC # AQITCkNhbGlmb3JuaWExHTAbBgNVBA8TFFByaXZhdGUgT3JnYW5pemF0aW9uMRsw # GQYDVQQKExJDaXNjbyBTeXN0ZW1zIEluYy4xGzAZBgNVBAsTEkNpc2NvIFN5c3Rl # bXMgSW5jLjEbMBkGA1UEAxMSQ2lzY28gU3lzdGVtcyBJbmMuMIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAy5xBW8oNHs29o8ajhoPZo8Vbch/Hglt6ZIIV # ELZvBzPFPH+GQEwIIPkJ7QmfI0vWdXv79h14SAxdyNdO7nmNn64zc28hbtPLoHyr # EohZWg+f7O7sgpeFMPIXXsn5miH3WCLXbTyjQhkmYv7uLQ7jIjaumixXjytkpFjq # v2jIpO1SS7b6cUWOUn18HyAg4vtpmEaNS9dsU74y+KEqVxxZlajBBkpd4snDVEJm # T9uX4HisduRhVQPoBOfh5Zm7GS0vkqNNbK2QCKC8oyfvA2w6QHTB5GEllMjLUK8C # wPHsZCf3g3oC2CoWesP/Q+Ib4TMRtutaqp9gnTMBHh6hKO+ny/S7Tw+8Le54Lflx # hODh3u5zO3C4iCBkMFQeMDUWvPS31OU34Y1kL0mhrJ7Bvw8IfwooVLIB8BsVJleV # ptnkylQTzaFF5P7cbytn7AYEzCldbTb+o1AE15P60TVmk4YFTK87vK+7rPUMwDtc # mUbL1jQ1I3fa0Xc6g9FDECq9flxlERm72GytDpSt49n81M/D9C+wpN3hgGY+uPh2 # Qj2umO8EaSnvwmUhe2lpdkgZat/DErGsTKIUJ1updY/8OxjcIavhJx6W+t28uijA # tMKO2VvAQBh8HUT6APMMlk1+tTvVTLGIrKdbvBVXnV9QsMjM7r3zJPqtIS4Gjdix # mKHUlN8CAwEAAaOCAckwggHFMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgbA # MIGOBggrBgEFBQcBAQSBgTB/MDAGCCsGAQUFBzABhiRodHRwOi8vY29tbWVyY2lh # bC5vY3NwLmlkZW50cnVzdC5jb20wSwYIKwYBBQUHMAKGP2h0dHA6Ly92YWxpZGF0 # aW9uLmlkZW50cnVzdC5jb20vY2VydHMvdHJ1c3RpZGV2Y29kZXNpZ25pbmc0LnA3 # YzAfBgNVHSMEGDAWgBT+BaSGWZo/NAFajQheG9t1ebnhxjBvBgNVHSAEaDBmMAcG # BWeBDAEDMFsGC2CGSAGG+S8ABg4BMEwwSgYIKwYBBQUHAgEWPmh0dHBzOi8vc2Vj # dXJlLmlkZW50cnVzdC5jb20vY2VydGlmaWNhdGVzL3BvbGljeS90cy9pbmRleC5o # dG1sME4GA1UdHwRHMEUwQ6BBoD+GPWh0dHA6Ly92YWxpZGF0aW9uLmlkZW50cnVz # dC5jb20vY3JsL3RydXN0aWRldmNvZGVzaWduaW5nNC5jcmwwHQYDVR0OBBYEFKrf # vaFZgfyRARnHauLZbMwOsKXsMBMGA1UdJQQMMAoGCCsGAQUFBwMDMA0GCSqGSIb3 # DQEBCwUAA4ICAQCpq0LlFMbsDbXiQUcCGv90QV3xaaBGmT5tzfMX875z40qzAVcp # NIZlxFm52PszxsXgx1NyX5BH1KuksUdb0lvo20JXj+C4OjRRj2e9cb4J2oB8MyCB # gyeZo1sMHuJzXM6Jiu4xstRiKg26oSRPZNydZOymWA0n+DJMZGQunAJPthn4sf2w # OyC0B/CeR0EO6LAe/I4hWStje8NDkBU/jOzSptAkUGoepZrmV6qhBcqV7KPd/wi0 # 79fyBgY8nQayFeMdLqj40omm9cziW2N0atKhsV9KRc81adj08pyFqmlPqVpnIfTy # 1aC8aOmZR3+4sQgzw4UWCFA4wo808eH2eiR0+ryak8pks1ruHLmymVRj9JxPMOcQ # LT6nrRDfkm2sZD0kPpHNRMI1bUtdv0n9aJ9+4YN/aj/DXN3XHVeFF+UVnvI2t68U # WEbbar0NLuu7/KaeztWyezw4neotKSM+tTDk1sxOXFwd7FpXoZJdKzZSVbLI7ft0 # rLsI2L3xR8wCB2yJjH7tvFv19w9pjzTlv2PylLH79V28VVRyLhAigYeurwhRuc84 # s8cKwoXS53KMWuY8Bb8IaSGG5TpZu+Hnnu4HYKBYvBvOJmOGovDHiHD0+992Wja2 # wBEi0t+DhlFHRfcD8AHMPi4Xy4MKpIGZVGCmF+jic3tmqj854gc0X5tsfTCCBY0w # ggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkG # A1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRp # Z2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENB # MB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMx # FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv # bTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orY # WcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8ae # FaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckg # HWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwr # t0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y # 1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjX # WkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIb # Zpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0c # lcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLim # dwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIW # IgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZ # qbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX # 44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3z # bcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGG # GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2Nh # Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBF # BgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNl # cnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG # 9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviH # GmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59Pes # MHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3 # A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rb # II01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+ # 2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDCCBrQwggScoAMCAQICEA3HrFcF # /yGZLkBDIgw6SYYwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxFTATBgNV # BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8G # A1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MB4XDTI1MDUwNzAwMDAwMFoX # DTM4MDExNDIzNTk1OVowaTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0 # LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGlu # ZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP # ADCCAgoCggIBALR4MdMKmEFyvjxGwBysddujRmh0tFEXnU2tjQ2UtZmWgyxU7UNq # EY81FzJsQqr5G7A6c+Gh/qm8Xi4aPCOo2N8S9SLrC6Kbltqn7SWCWgzbNfiR+2fk # HUiljNOqnIVD/gG3SYDEAd4dg2dDGpeZGKe+42DFUF0mR/vtLa4+gKPsYfwEu7EE # bkC9+0F2w4QJLVSTEG8yAR2CQWIM1iI5PHg62IVwxKSpO0XaF9DPfNBKS7Zazch8 # NF5vp7eaZ2CVNxpqumzTCNSOxm+SAWSuIr21Qomb+zzQWKhxKTVVgtmUPAW35xUU # FREmDrMxSNlr/NsJyUXzdtFUUt4aS4CEeIY8y9IaaGBpPNXKFifinT7zL2gdFpBP # 9qh8SdLnEut/GcalNeJQ55IuwnKCgs+nrpuQNfVmUB5KlCX3ZA4x5HHKS+rqBvKW # xdCyQEEGcbLe1b8Aw4wJkhU1JrPsFfxW1gaou30yZ46t4Y9F20HHfIY4/6vHespY # MQmUiote8ladjS/nJ0+k6MvqzfpzPDOy5y6gqztiT96Fv/9bH7mQyogxG9QEPHrP # V6/7umw052AkyiLA6tQbZl1KhBtTasySkuJDpsZGKdlsjg4u70EwgWbVRSX1Wd4+ # zoFpp4Ra+MlKM2baoD6x0VR4RjSpWM8o5a6D8bpfm4CLKczsG7ZrIGNTAgMBAAGj # ggFdMIIBWTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTvb1NK6eQGfHrK # 4pBW9i/USezLTjAfBgNVHSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNV # HQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEEazBp # MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUH # MAKGNWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRS # b290RzQuY3J0MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0 # LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3JsMCAGA1UdIAQZMBcwCAYGZ4EM # AQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAgEAF877FoAc/gc9EXZx # ML2+C8i1NKZ/zdCHxYgaMH9Pw5tcBnPw6O6FTGNpoV2V4wzSUGvI9NAzaoQk97fr # PBtIj+ZLzdp+yXdhOP4hCFATuNT+ReOPK0mCefSG+tXqGpYZ3essBS3q8nL2UwM+ # NMvEuBd/2vmdYxDCvwzJv2sRUoKEfJ+nN57mQfQXwcAEGCvRR2qKtntujB71WPYA # gwPyWLKu6RnaID/B0ba2H3LUiwDRAXx1Neq9ydOal95CHfmTnM4I+ZI2rVQfjXQA # 1WSjjf4J2a7jLzWGNqNX+DF0SQzHU0pTi4dBwp9nEC8EAqoxW6q17r0z0noDjs6+ # BFo+z7bKSBwZXTRNivYuve3L2oiKNqetRHdqfMTCW/NmKLJ9M+MtucVGyOxiDf06 # VXxyKkOirv6o02OoXN4bFzK0vlNMsvhlqgF2puE6FndlENSmE+9JGYxOGLS/D284 # NHNboDGcmWXfwXRy4kbu4QFhOm0xJuF2EZAOk5eCkhSxZON3rGlHqhpB/8MluDez # ooIs8CVnrpHMiD2wL40mm53+/j7tFaxYKIqL0Q4ssd8xHZnIn/7GELH3IdvG2XlM # 9q7WP/UwgOkw/HQtyRN62JK4S1C8uw3PdBunvAZapsiI5YKdvlarEvf8EA+8hcpS # M9LHJmyrxaFtoza2zNaQ9k+5t1wwggbtMIIE1aADAgECAhAKgO8YS43xBYLRxHan # lXRoMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdp # Q2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3Rh # bXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEwHhcNMjUwNjA0MDAwMDAwWhcN # MzYwOTAzMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs # IEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFNIQTI1NiBSU0E0MDk2IFRpbWVzdGFt # cCBSZXNwb25kZXIgMjAyNSAxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC # AgEA0EasLRLGntDqrmBWsytXum9R/4ZwCgHfyjfMGUIwYzKomd8U1nH7C8Dr0cVM # F3BsfAFI54um8+dnxk36+jx0Tb+k+87H9WPxNyFPJIDZHhAqlUPt281mHrBbZHqR # K71Em3/hCGC5KyyneqiZ7syvFXJ9A72wzHpkBaMUNg7MOLxI6E9RaUueHTQKWXym # OtRwJXcrcTTPPT2V1D/+cFllESviH8YjoPFvZSjKs3SKO1QNUdFd2adw44wDcKgH # +JRJE5Qg0NP3yiSyi5MxgU6cehGHr7zou1znOM8odbkqoK+lJ25LCHBSai25CFyD # 23DZgPfDrJJJK77epTwMP6eKA0kWa3osAe8fcpK40uhktzUd/Yk0xUvhDU6lvJuk # x7jphx40DQt82yepyekl4i0r8OEps/FNO4ahfvAk12hE5FVs9HVVWcO5J4dVmVzi # x4A77p3awLbr89A90/nWGjXMGn7FQhmSlIUDy9Z2hSgctaepZTd0ILIUbWuhKuAe # NIeWrzHKYueMJtItnj2Q+aTyLLKLM0MheP/9w6CtjuuVHJOVoIJ/DtpJRE7Ce7vM # RHoRon4CWIvuiNN1Lk9Y+xZ66lazs2kKFSTnnkrT3pXWETTJkhd76CIDBbTRofOs # NyEhzZtCGmnQigpFHti58CSmvEyJcAlDVcKacJ+A9/z7eacCAwEAAaOCAZUwggGR # MAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOQ7/PIx7f391/ORcWMZUEPPYYzoMB8G # A1UdIwQYMBaAFO9vU0rp5AZ8esrikFb2L9RJ7MtOMA4GA1UdDwEB/wQEAwIHgDAW # BgNVHSUBAf8EDDAKBggrBgEFBQcDCDCBlQYIKwYBBQUHAQEEgYgwgYUwJAYIKwYB # BQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBdBggrBgEFBQcwAoZRaHR0 # cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0VGltZVN0 # YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3J0MF8GA1UdHwRYMFYwVKBSoFCG # Tmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVT # dGFtcGluZ1JTQTQwOTZTSEEyNTYyMDI1Q0ExLmNybDAgBgNVHSAEGTAXMAgGBmeB # DAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAGUqrfEcJwS5rmBB # 7NEIRJ5jQHIh+OT2Ik/bNYulCrVvhREafBYF0RkP2AGr181o2YWPoSHz9iZEN/FP # sLSTwVQWo2H62yGBvg7ouCODwrx6ULj6hYKqdT8wv2UV+Kbz/3ImZlJ7YXwBD9R0 # oU62PtgxOao872bOySCILdBghQ/ZLcdC8cbUUO75ZSpbh1oipOhcUT8lD8QAGB9l # ctZTTOJM3pHfKBAEcxQFoHlt2s9sXoxFizTeHihsQyfFg5fxUFEp7W42fNBVN4ue # LaceRf9Cq9ec1v5iQMWTFQa0xNqItH3CPFTG7aEQJmmrJTV3Qhtfparz+BW60OiM # EgV5GWoBy4RVPRwqxv7Mk0Sy4QHs7v9y69NBqycz0BZwhB9WOfOu/CIJnzkQTwtS # SpGGhLdjnQ4eBpjtP+XB3pQCtv4E5UCSDag6+iX8MmB10nfldPF9SVD7weCC3yXZ # i/uuhqdwkgVxuiMFzGVFwYbQsiGnoa9F5AaAyBjFBtXVLcKtapnMG3VH3EmAp/js # J3FVF3+d1SVDTmjFjLbNFZUWMXuZyvgLfgyPehwJVxwC+UpX2MSey2ueIu9THFVk # T+um1vshETaWyQo8gmBto/m3acaP9QsuLj3FNwFlTxq25+T4QwX9xa6ILs84ZPvm # povq90K8eWyG2N01c4IhSOxqt81nMYIGPDCCBjgCAQEwXDBIMQswCQYDVQQGEwJV # UzESMBAGA1UEChMJSWRlblRydXN0MSUwIwYDVQQDExxUcnVzdElEIEVWIENvZGUg # U2lnbmluZyBDQSA0AhBAAYkJtMecEjtNtgBsSCkGMA0GCWCGSAFlAwQCAQUAoIGI # MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCSqGSIb3DQEJBTEPFw0yNTA2 # MTMwNDM4NThaMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3 # DQEJBDEiBCBMURljysnb9l1Tq+FqalACgdEd7/5TCXxT5Hy3E9YMjjANBgkqhkiG # 9w0BAQEFAASCAgAEVzDl/mQP0K2fJQ9zEhMW1BfoS61Ee8BDBBBX4i666y1w+J+z # jqgVi2Ym5hLL09odUQkNq8VVO6HMh9C4soCwiX6V60vEfXPsAu2imvgMKnIA65fP # EQY/qCKF2HLj6cOytZOgz11yqMVEwS8BUu7j5hFfwVaCIKCPAfCCwYN1s0vLONlP # Dcd2iThdaSL7ZWxu9LmkT48LimF8DkOXRt3TK43BeFsI9pN2d30SLbMjUiF0/nqM # 06MscKapQonHlkzILxEcBKxGoZB/ptCILgYERevOvFOlo6RBGaVkDFOMhQ4lGLh/ # uPl0ax9kc8xQpzzGye0el2r7x1E5v/Ezn8EyeSrR23Vvx75ysmKTG6dcFdRkC84S # M3Pl6p6Wz66g02MattMiegmxaE9k8iq/hImKuEEeeVPpNSbMxX4wwgJEGTke9jRG # XFuxYJSDho0lkw8OoVTi0EFue/qlVCyj1MZ5gfmT1EPPqbs6b9bv35jqg8ZvFJMa # 4yHrlq9B5ZHiUl4hLkwKMEibRg0vmnHsggz8kEhrKJRbJOxrRPPQauZNpfZPpPhq # SSOJi6XH13NKyJHBDD5sUFIuMYRhQ15M1Esrn9Xme28MxkLT7op0pxPuKwFBqSby # iH4zdww2cWjeLtum2LFqvZQwuv+2DedPzu4QDL0STlEKMii2Gg2oUY+d5aGCAyYw # ggMiBgkqhkiG9w0BCQYxggMTMIIDDwIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYD # VQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBH # NCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTECEAqA7xhLjfEF # gtHEdqeVdGgwDQYJYIZIAWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcN # AQcBMBwGCSqGSIb3DQEJBTEPFw0yNTA2MTMwNDM4NThaMC8GCSqGSIb3DQEJBDEi # BCAr7OgCvBB2YYtaVjmxB2qV5+yW72SFc/qQPkqY3bB66zANBgkqhkiG9w0BAQEF # AASCAgAGu5Z2PHfTeI3yKjnkPq5aqqjXhcZ3lsDn3yclx6I1vJu5uQiz3cQl1lpo # LsC2GcZpxpL4pCKYHOvKVnAgBUCnzl9crmrz3dwWCwBf3mNM8khrLfNArz5wnFvr # Hvyf12lNThDPEmgddAl4xu/kZQbJF7tD2VTleDzh+zWSj8p7kbeJoxrr09viO0iI # V32x95DawB/l6M5tM6XOxIXnI8RB9QeHH1PA9c2cyLEieVNNoNYnk1Xq7G347Y4X # OOzjlnxqJw4lgMiQPskBONUoKLrA/VeTEdoNqXmZ0FZoMauCWA+QVtGenCB5GjWo # 1vg89kz+JJyY/UdKIUytjtCx6I8GHOm7bv/M+6wAH6Shesmn4PFyHYFUwzkMwSVc # 9TyoJc6Kv8+gZjPC2Jet+0JAvUhd81sO36qU2ScweNlUOkypx9EEn7CPoP6nOpfv # PEhXwdCyIbyUgarDHq0c9Xfao2A2ji703ii+N7vLA9WfYSxRZmAmJCeRlCAAsVES # /pV4SdCvEMD24SUzeMixrkzc0zAOjIwb9gYX/VNIoEhubfPAGB+1tZE6uDcR+fMC # Wjcz0rgUpeJQLJoxZvwyNXSvWT3/2s7sofZzq1z0G/awsID2pYWdEiwer3bzx7TQ # GaG+99B2blHpvpLIg9REUEHhdWcbsNXvfqsJPWBeymiIo9WvcQ== # SIG # End signature block |