Samples/Install-UcsAll.ps1

# Install-All <version> <ucs> <ucscredentials> <imageDir> <ccocredentials>

param(
    [parameter(Mandatory=${true})][string]${version},
    [parameter(Mandatory=${true})][string]${ucs},
    [parameter(Mandatory=${true})][string]${imageDir}
)

    
Try
{
    ${Error}.Clear()

    ${versionSplit} = ${version}.Split("()")
    ${versionBundle} = ${versionSplit}[0] + "." + ${versionSplit}[1]
    
    ${aSeriesBundle} = "ucs-k9-bundle-infra." + ${versionBundle} + ".A.bin"
    ${bSeriesBundle} = "ucs-k9-bundle-b-series." + ${versionBundle} + ".B.bin"
    ${cSeriesBundle} = "ucs-k9-bundle-c-series." + ${versionBundle} + ".C.bin"
        
    ${bundle} = @(${aSeriesBundle},${bSeriesBundle},${cSeriesBundle})
    ${ccoImageList} = @()
    
    foreach(${eachBundle} in ${bundle})
    {
        ${fileName} = ${imagedir} +  "\" + ${eachBundle}
        if( test-path -Path ${fileName})
        {
             Write-Host "Image File : ${eachBundle} already exist in local directory."
        }
        else
        {
            ${ccoImageList} += ${eachBundle}
        }
    }
    
    if( ${ccoImageList} -ne ${null})
    {
        Write-Host  "Enter CCO Credential"
        ${ccoCred} = Get-Credential
        foreach(${imageBundle} in ${ccoImageList})
        {
            [array]${ccoImage} += Get-UcsCcoImageList -Credential ${ccoCred} | where { $_.ImageName -match ${imageBundle}} 
        }
        if(${ccoImage} -eq ${null})
        {
            Write-Host "Image File does not exist in repository"
            exit
        }
        Write-Host  "Downloading image on local machine"
        ${ccoImage} | Get-UcsCcoImage -Path ${imageDir}
    }
        
    # Login into UCS
    Write-Host  "Enter UCS Credential"
    ${ucsCred} = Get-Credential
    ${myCon} = Connect-Ucs -Name ${ucs} -Credential ${ucsCred}
        
    if (${Error})
    {
        Write-Host ${Error}
        exit
    }

    foreach (${image} in ${bundle})
    {
         ${firmwarePackage} = Get-UcsFirmwarePackage -Name ${image}

        ${deleted} = $false
        if (${firmwarePackage})
        {
            ${deleted} = ${firmwarePackage} | Get-UcsFirmwareDistImage | ? { $_.ImageDeleted -ne ""}
        }
          
        if (${deleted} -or !${firmwarePackage})
        {
            # Image does not exist on fi, upload
            $fileName = ${imageDir} +  "\" + ${image}
            Write-Host  "Uploading image : ${image} on FI"
            Send-UcsFirmware -LiteralPath $fileName | Watch-Ucs -Property TransferState -SuccessValue downloaded -PollSec 30 -TimeoutSec 600
        }
    }
          
    # Need to convert version to avoid cannot validate argument on parameter 'Name'. Ex 1.4(3i) should be 1.4-3i
    [array]${versionName} = ${version}.Split("()")
    ${versionPack} = ${versionName}[0] + "-" + ${versionName}[1]
            
    ${bSeriesVersion} = ${version} + "B"
    ${cSeriesVersion} = ${version} + "C"
    [array]${imageNames} = (Get-UcsFirmwarePackage | ? { $_.Version -like ${bSeriesVersion} -or $_.Version -like ${cSeriesVersion} } | Get-UcsFirmwareDistImage | select -ExpandProperty Name)
    [array]${images} = (Get-UcsFirmwareInstallable | ? { $_.Model -ne "MGMTEXT" -and $_.Model -ne "CAPCATALOG" -and ${imageNames} -contains $_.Name })

    # Check if host-pack (with the version as name) exist
    if (Get-UcsFirmwareComputeHostPack -Name ${versionPack})
    {
        Write-Host "host-pack already exist"
    }
    else # Create a host-pack
    {
        Write-Host "Creating host-pack ${versionPack}"
        Start-UcsTransaction
        ${firmwareComputeHostPack} = Add-UcsFirmwareComputeHostPack -Name ${versionPack}
        ${images} | ? { $_.Type -ne "blade-controller" -and $_.Type -ne "CIMC" } | % { ${firmwareComputeHostPack} | Add-UcsFirmwarePackItem -HwModel $_.Model -HwVendor $_.Vendor -Type $_.Type -Version $_.Version }
        Complete-UcsTransaction
    }
          
    # Check if mgmt-pack (with the version as name) exist
    if (Get-UcsFirmwareComputeMgmtPack -Name ${versionPack})
    {
        Write-Host "mgmt-pack already exist"
    }
    else # Create a mgmt-pack
    {
        Write-Host "Creating mgmt-pack ${versionPack}"
        Start-UcsTransaction
        ${firmwareComputeMgmtPack} = Add-UcsFirmwareComputeMgmtPack -Name ${versionPack}
        ${images} | ? { $_.Type -eq "blade-controller" -or $_.Type -eq "CIMC" } | % { ${firmwareComputeMgmtPack} | Add-UcsFirmwarePackItem -HwModel $_.Model -HwVendor $_.Vendor -Type $_.Type -Version $_.Version }
        Complete-UcsTransaction
    }

            
    # Activate UCSM
    ${firmwareRunningUcsm} = Get-UcsMgmtController -Subject system | Get-UcsFirmwareRunning
    if (${firmwareRunningUcsm}.version -eq ${version})
    {
        Write-Host "UCSM already at version ${version}"
    }
    else
    {
        Write-Host "Activating UCSM version ${version}. This will require a re-login."
        Get-UcsMgmtController -Subject system | Get-UcsFirmwareBootDefinition | Get-UcsFirmwareBootUnit | Set-UcsFirmwareBootUnit -Version ${version} -AdminState triggered -IgnoreCompCheck yes -ResetOnActivate yes
        Write-Host  "Please wait while system reboots, it may take 5-10 minutes"
        Try
        {
            Disconnect-Ucs
        }
        Catch
        {
            Write-Host  "Error disconnecting from UCS"
        }
        Write-Host  "Sleeping for 5 minutes ..."
        Start-Sleep -s 240
        do
        {
            Start-Sleep -s 60
            Write-Host  "Retrying login ..."
            Try
            {
                ${myCon} = Connect-Ucs -Name ${ucs} -Credential ${ucsCred}
            }
            Catch
            {
                Write-Host  "Error connecting to UCS"
            }
        } while (${myCon} -eq ${null})
    }

    # Update/Activate IOM
    ${iomController} = Get-UcsChassis | Get-UcsIom | Get-UcsMgmtController -Subject iocard 
    ${iomUpdateList} = @()
    ${count} = 0
    foreach (${iom} in ${iomController})
    {
        ${count}++
        ${firmwareRunning} = ${iom} | Get-UcsFirmwareRunning -Deployment system
        if (${firmwareRunning}.version -eq ${version})
        {
            Write-Host "IOM ${count} already at version ${version}"
        }
        else
        { 
            Write-Host "Updating IOM ${count} to version ${version}"
            ${iomUpdateList} += ${iom}
        }
    }

    ${iomUpdateList} |  Get-UcsFirmwareUpdatable | Set-UcsFirmwareUpdatable -Version ${version} -AdminState triggered 

    do
    {
        ${readyCount} = ${iomUpdateList} |  Get-UcsFirmwareUpdatable -OperState ready | measure 
        if (${readyCount}.count -eq ${iomUpdateList}.count)
        {
            break
        }
        Start-Sleep -s 120
    } while (${readyCount}.count -ne ${iomUpdateList}.count)

    ${iomUpdateList} | Get-UcsFirmwareBootDefinition | Get-UcsFirmwareBootUnit | Set-UcsFirmwareBootUnit -Version ${version} -AdminState triggered -IgnoreCompCheck yes -ResetOnActivate no | Watch-Ucs -Property OperState -SuccessValue pending-next-boot -PollSec 30 -TimeoutSec 600
    
    # Version to upgrade in FI
    ${aSeriesVersion} = ${version} + "A"
    ${switchVersion} = Get-UcsFirmwarePackage -Version ${aSeriesVersion} | Get-UcsFirmwareDistImage | % { Get-UcsFirmwareInstallable -Name $_.Name -Type switch-software }

    if (Get-UcsStatus | ? { $_.HaConfiguration -eq "cluster" })
    {
        # Activate secondary FI
        ${secFiController} = Get-UcsNetworkElement -Id (Get-UcsMgmtEntity -Leadership subordinate).Id | Get-UcsMgmtController 
        ${secFiActivated} = ${secFiController} | Get-UcsFirmwareBootDefinition |  Get-UcsFirmwareBootUnit | ? { $_.Version -ne  ${switchVersion}[0].version } | Set-UcsFirmwareBootUnit -Version ${switchVersion}[0].version -AdminState triggered -IgnoreCompCheck yes -ResetOnActivate yes

        # Wait for secondary to complete re-boot & check for activate status .. 8 .. 12 minutes
        if(${secFiActivated} -ne ${null})
        {
            Write-Host  "Please wait while secondary FI activates, it may take 8-10 minutes"
            Write-Host  "Sleeping for 8 minutes ..."
            Start-Sleep -s 480
            do
            {
                ${readyCount} = ${secFiController} | Get-UcsFirmwareBootDefinition |  Get-UcsFirmwareBootUnit |  ?  { $_.OperState -eq "ready" }  | measure 
                if (${readyCount}.count -eq ${secFiActivated}.count)
                {
                    break
                }
                # Sleep for 2 minutes
                Start-Sleep -s 120
            } while (${readyCount}.count -ne ${secFiActivated}.count)
        }
        else
        {
             Write-Host "Secondary FI already at version" ${switchVersion}[0].version
        }
              
        # Activate primary FI
        ${priFiController} = Get-UcsNetworkElement -Id (Get-UcsMgmtEntity -Leadership primary).Id | Get-UcsMgmtController 
        ${priFiActivated} = ${priFiController} | Get-UcsFirmwareBootDefinition |  Get-UcsFirmwareBootUnit | ? { $_.Version -ne  ${switchVersion}[0].version } | Set-UcsFirmwareBootUnit -Version ${switchVersion}[0].version -AdminState triggered -IgnoreCompCheck yes -ResetOnActivate yes
    }
    else
    {
        ${priFiController} = Get-UcsMgmtController -Subject switch
        ${priFiActivated} = ${priFiController} | Get-UcsFirmwareBootDefinition |  Get-UcsFirmwareBootUnit | ? { $_.Version -ne  ${switchVersion}[0].version } | Set-UcsFirmwareBootUnit -Version ${switchVersion}[0].version -AdminState triggered -IgnoreCompCheck yes -ResetOnActivate yes
    }
    
    if (${priFiActivated} -ne ${null})
    {
        Write-Host  "Activating primary FI ..."
        Write-Host  "Please wait while system reboots, it may take 10-15 minutes"
        Try
        {
            Disconnect-Ucs
        }
        Catch
        {
            Write-Host  "Error disconnecting from UCS"
        }
        Write-Host  "Sleeping for 15 minutes ..."
        Start-Sleep -s 840
        do
        {
            Start-Sleep -s 60
            Write-Host  "Retrying login ..."
            Try
            {
                ${myCon} = Connect-Ucs -Name ${ucs} -Credential ${ucsCred}
            }
            Catch
            {
                Write-Host  "Error connecting to UCS"
            }
        } while (${myCon} -eq ${null})
    }

    # Check if primary FI activated successfully
    if(${priFiActivated} -ne ${null})
    {
        do
        {
            if (Get-UcsStatus | ? { $_.HaConfiguration -eq "cluster" })
            {
                ${priFiController} = Get-UcsNetworkElement -Id (Get-UcsMgmtEntity -Leadership primary).Id | Get-UcsMgmtController 
            }
            else
            {
                ${priFiController} = Get-UcsMgmtController -Subject switch
            }
            ${readyCount} = ${priFiController} | Get-UcsFirmwareBootDefinition |  Get-UcsFirmwareBootUnit  |  ?  { $_.OperState -eq "ready" }  | measure 
            if (${readyCount}.count -eq ${priFiActivated}.count)
            {
                break
            }
        } while (${readyCount}.count -ne ${priFiActivated}.count)
    }
    else
    {
         Write-Host "Primary FI already at version" ${switchVersion}[0].version
    }
              

    # Update host & management pack name for all updating-template service profiles
    Get-UcsServiceProfile -Type updating-template | ? { $_.HostFwPolicyName -ne ${versionPack} -or $_.MgmtFwPolicyName -ne ${versionPack} } | Set-UcsServiceProfile -HostFwPolicyName ${versionPack} -MgmtFwPolicyName ${versionPack}

    # Update host & management pack name for all instance and initial-template service profiles
    Get-UcsServiceProfile | ? { $_.Type -ne "updating-template" } | ? { $_.HostFwPolicyName -ne ${versionPack} -or $_.MgmtFwPolicyName -ne ${versionPack} } | Set-UcsServiceProfile -HostFwPolicyName ${versionPack} -MgmtFwPolicyName ${versionPack}

    #Disconnect from UCS
    Write-Host "Install-All executed successfully. Disconnecting from UCS"
    Disconnect-Ucs
}
Catch
{
    Write-Host ${Error}
    exit
}

# SIG # Begin signature block
# MIIeQQYJKoZIhvcNAQcCoIIeMjCCHi4CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDyx6uIkQ/+WuXQ
# AcT/RJ2cOoElIwUYZK2ib8McZ8tniKCCDIYwggXCMIIEqqADAgECAhAFsKypxaqA
# 4gfxbvm70Ew5MA0GCSqGSIb3DQEBCwUAMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV
# BAMTIkRpZ2lDZXJ0IEVWIENvZGUgU2lnbmluZyBDQSAoU0hBMikwHhcNMTkwMzA1
# MDAwMDAwWhcNMjEwMzE5MTIwMDAwWjCB1TETMBEGCysGAQQBgjc8AgEDEwJVUzEb
# MBkGCysGAQQBgjc8AgECEwpDYWxpZm9ybmlhMR0wGwYDVQQPDBRQcml2YXRlIE9y
# Z2FuaXphdGlvbjERMA8GA1UEBRMIQzExODM0NzcxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpDYWxpZm9ybmlhMREwDwYDVQQHEwhTYW4gSm9zZTEcMBoGA1UEChMTQ0lT
# Q08gU1lTVEVNUywgSU5DLjEcMBoGA1UEAxMTQ0lTQ08gU1lTVEVNUywgSU5DLjCC
# ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALVsxgp7cSBymDSAFTz4uPcU
# dcp8ef7lqubpfbCvmiK5BaQOcF6pL2Ekl1o2BiiMOXQfKLO706Ji1lfdZVh/1eDz
# zThFUTJ5LgQv5YrFnYu27TuAoXJ2Qs6pj/DJX+R7Mw+5fweicf0DSK9XiV6C9FCK
# gT7Z7g0WSYH22qZpBzJf766j2sXo84qEzgR683xfCbTQMbg7I2MzuIvMGT4Qs447
# Uzb5lR1DVwMcAdXZD0lXS+0h1C4xl3B+MseIH2mtQTo1+pLhlqSK8xCwixEf1ERL
# 3zmUTLw3G/gM4ccyvlWUaorNAiZw7JSAk3eqojmiAp9fuqRuuDhOHl13MzCxh1UC
# AwEAAaOCAfQwggHwMB8GA1UdIwQYMBaAFI/ofvBtMmoABSPHcJdqOpD/a+rUMB0G
# A1UdDgQWBBSqPgNg7Q9VW7yFRq0K9ceayo35uzAxBgNVHREEKjAooCYGCCsGAQUF
# BwgDoBowGAwWVVMtQ0FMSUZPUk5JQS1DMTE4MzQ3NzAOBgNVHQ8BAf8EBAMCB4Aw
# EwYDVR0lBAwwCgYIKwYBBQUHAwMwewYDVR0fBHQwcjA3oDWgM4YxaHR0cDovL2Ny
# bDMuZGlnaWNlcnQuY29tL0VWQ29kZVNpZ25pbmdTSEEyLWcxLmNybDA3oDWgM4Yx
# aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0VWQ29kZVNpZ25pbmdTSEEyLWcxLmNy
# bDBLBgNVHSAERDBCMDcGCWCGSAGG/WwDAjAqMCgGCCsGAQUFBwIBFhxodHRwczov
# L3d3dy5kaWdpY2VydC5jb20vQ1BTMAcGBWeBDAEDMH4GCCsGAQUFBwEBBHIwcDAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEgGCCsGAQUFBzAC
# hjxodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRFVkNvZGVTaWdu
# aW5nQ0EtU0hBMi5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAQEA
# MLeT7V16i8TpC3++bRSUEajW355sfKiuWEPnc1RIEGMSekaTJKSVDDgaGdPt22qE
# wRrJztKYca2N6ZpOOE477yTiuYMCCVUIcwhaWezA/4Wgs9TpW0QBe53qIJj6t0uH
# M+gZg7Bp0KM65Z+Kh5teHZ6kzs8evRGsH3cgKtfrwwRRdJCgqBz3KmkNhqRQ6/Hl
# SS7GV+wRoGAeqnCGL6IOY7bLl2NC+ItUh1D6bP/9UR0MtVFU6nqY7Lj3Z5xmje8t
# N6sZ1p+FTGaHDwSZX7DDtff766Bl5om/IixIfOPQtZoe12lxZqlAn33JMflIZgNt
# 8ckoE13Gh8lJeoFIFBzgsjCCBrwwggWkoAMCAQICEAPxtOFfOoLxFJZ4s9fYR1ww
# DQYJKoZIhvcNAQELBQAwbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0
# IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNl
# cnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQTAeFw0xMjA0MTgxMjAwMDBaFw0y
# NzA0MTgxMjAwMDBaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNVBAMTIkRpZ2lDZXJ0
# IEVWIENvZGUgU2lnbmluZyBDQSAoU0hBMikwggEiMA0GCSqGSIb3DQEBAQUAA4IB
# DwAwggEKAoIBAQCnU/oPsrUT8WTPhID8roA10bbXx6MsrBosrPGErDo1EjqSkbpX
# 5MTJ8y+oSDy31m7clyK6UXlhr0MvDbebtEkxrkRYPqShlqeHTyN+w2xlJJBVPqHK
# I3zFQunEemJFm33eY3TLnmMl+ISamq1FT659H8gTy3WbyeHhivgLDJj0yj7QRap6
# HqVYkzY0visuKzFYZrQyEJ+d8FKh7+g+03byQFrc+mo9G0utdrCMXO42uoPqMKhM
# 3vELKlhBiK4AiasD0RaCICJ2615UOBJi4dJwJNvtH3DSZAmALeK2nc4f8rsh82zb
# 2LMZe4pQn+/sNgpcmrdK0wigOXn93b89OgklAgMBAAGjggNYMIIDVDASBgNVHRMB
# Af8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD
# AzB/BggrBgEFBQcBAQRzMHEwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj
# ZXJ0LmNvbTBJBggrBgEFBQcwAoY9aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t
# L0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNydDCBjwYDVR0fBIGHMIGE
# MECgPqA8hjpodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRIaWdoQXNz
# dXJhbmNlRVZSb290Q0EuY3JsMECgPqA8hjpodHRwOi8vY3JsNC5kaWdpY2VydC5j
# b20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3JsMIIBxAYDVR0gBIIB
# uzCCAbcwggGzBglghkgBhv1sAwIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3
# LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH
# AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy
# AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj
# AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg
# AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ
# AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt
# AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj
# AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl
# AHIAZQBuAGMAZQAuMB0GA1UdDgQWBBSP6H7wbTJqAAUjx3CXajqQ/2vq1DAfBgNV
# HSMEGDAWgBSxPsNpA/i/RwHUmCYaCALvY2QrwzANBgkqhkiG9w0BAQsFAAOCAQEA
# GTNKDIEzN9utNsnkyTq7tRsueqLi9ENCF56/TqFN4bHb6YHdnwHy5IjV6f4J/SHB
# 7F2A0vDWwUPC/ncr2/nXkTPObNWyGTvmLtbJk0+IQI7N4fV+8Q/GWVZy6OtqQb0c
# 1UbVfEnKZjgVwb/gkXB3h9zJjTHJDCmiM+2N4ofNiY0/G//V4BqXi3zabfuoxrI6
# Zmt7AbPN2KY07BIBq5VYpcRTV6hg5ucCEqC5I2SiTbt8gSVkIb7P7kIYQ5e7pTcG
# r03/JqVNYUvsRkG4Zc64eZ4IlguBjIo7j8eZjKMqbphtXmHGlreKuWEtk7jrDgRD
# 1/X+pvBi1JlqpcHB8GSUgDGCEREwghENAgEBMIGAMGwxCzAJBgNVBAYTAlVTMRUw
# EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
# KzApBgNVBAMTIkRpZ2lDZXJ0IEVWIENvZGUgU2lnbmluZyBDQSAoU0hBMikCEAWw
# rKnFqoDiB/Fu+bvQTDkwDQYJYIZIAWUDBAIBBQCggZowGQYJKoZIhvcNAQkDMQwG
# CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLgYKKwYB
# BAGCNwIBDDEgMB6gHIAaAFMAQQBTAEQALQBQAGgAMwAtADEAMAAyADIwLwYJKoZI
# hvcNAQkEMSIEIPeKDocFtWpbQKn/P06ClPshijVs/TLojNaiw6a3z8HUMA0GCSqG
# SIb3DQEBAQUABIIBADh0o70Is/QT43Cjf2j0+N9lL6/TwFLWqrN+GdnVzhzfi6tj
# aXZLl9PTD7AXH6aUaqNA02Ff8C9CeyN9ov3tdMrNPuJbm3l1fvaDeP/6Urj6d/9X
# awFX2qumn+SgYqKKJh3cIg5q9OEBNVwp8itNUOmwzSpfsECVAQQRy+NpqDfc33d+
# h8gapLafSJSE4qS/1A2fMJ6v93TgpwFpi43tG4pES0+n5K1eYH9tFQlI4A1ADa44
# ICvfrVV/Q6CnpT1yxPRn0tfkXsBFV5IoQOPRoP+9Q555gYdH+PrQtCeJv1KMBnS3
# x0oaTh57TJwsmvGJa4mP4HeeZMvIDfOCV2l4IW6hgg7EMIIOwAYKKwYBBAGCNwMD
# ATGCDrAwgg6sBgkqhkiG9w0BBwKggg6dMIIOmQIBAzEPMA0GCWCGSAFlAwQCAQUA
# MIHyBgsqhkiG9w0BCRABBKCB4gSB3zCB3AIBAQYJYIZIhvpsCgMFMDEwDQYJYIZI
# AWUDBAIBBQAEIPWDTOeZMtqq3v9ii6zF56U+f7rKokB1Hqb202priWM9AgZdrm9A
# EtEYEzIwMTkxMTA2MTkwNTI4LjczOVowBIACAfSgdqR0MHIxCzAJBgNVBAYTAkNB
# MRAwDgYDVQQIEwdPbnRhcmlvMQ8wDQYDVQQHEwZPdHRhd2ExFjAUBgNVBAoTDUVu
# dHJ1c3QsIEluYy4xKDAmBgNVBAMTH0VudHJ1c3QgVGltZSBTdGFtcGluZyBBdXRo
# b3JpdHmgggokMIIFCTCCA/GgAwIBAgIRAKvdZ2XyWu9QAAAAAFWR6QwwDQYJKoZI
# hvcNAQELBQAwgbIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
# MSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYD
# VQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNl
# IG9ubHkxJjAkBgNVBAMTHUVudHJ1c3QgVGltZXN0YW1waW5nIENBIC0gVFMxMB4X
# DTE4MTAwNTIwMzAyN1oXDTMwMDEwNTIxMDAyN1owcjELMAkGA1UEBhMCQ0ExEDAO
# BgNVBAgTB09udGFyaW8xDzANBgNVBAcTBk90dGF3YTEWMBQGA1UEChMNRW50cnVz
# dCwgSW5jLjEoMCYGA1UEAxMfRW50cnVzdCBUaW1lIFN0YW1waW5nIEF1dGhvcml0
# eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu9royPQsuVWVxiJ/lA
# uP9VokBKZf/b7aehiG5AGi7Za9VK7QFZYlTEcxaj1oRu7oBC6lUImHAZPyaexNam
# qOurqSQ9C1dYZPzw2hgy2bHXunMBSw6RMe+9SJqJw4LiCXjzohsujc0O74mzerry
# HJgzpXD4e07sEgjss59PjEu+13yAZ1b+XD4H2oaiKUAbMMqPzRdJotTrzV5QchkZ
# cEcrnQrggMMpBwElJFzN9gbUHRGGyjX2FKS/r25Bgylrkn9Eh4zbhFCgkbwJU3/0
# rL7DN4ejxEoLEDNttwGD8cVHaZ8Uw8/N/H0BKeNFzo+ZjmSpDTyLIOIDhstUREE3
# tekCAwEAAaOCAVcwggFTMA4GA1UdDwEB/wQEAwIHgDAWBgNVHSUBAf8EDDAKBggr
# BgEFBQcDCDBBBgNVHSAEOjA4MDYGCmCGSAGG+mwKAwUwKDAmBggrBgEFBQcCARYa
# aHR0cDovL3d3dy5lbnRydXN0Lm5ldC9ycGEwCQYDVR0TBAIwADBoBggrBgEFBQcB
# AQRcMFowIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1c3QubmV0MDMGCCsG
# AQUFBzAChidodHRwOi8vYWlhLmVudHJ1c3QubmV0L3RzMS1jaGFpbjI1Ni5jZXIw
# MQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC5lbnRydXN0Lm5ldC90czFjYS5j
# cmwwHwYDVR0jBBgwFoAUw8Jx0nvXaAWuOzmbNCUMYgPHV2gwHQYDVR0OBBYEFCCQ
# ed4myxXaB0L7ihUNcZ4ZaIgsMA0GCSqGSIb3DQEBCwUAA4IBAQDEsmLZssupqGDb
# QabTQD1hvfrv95S1SM1uctWG5RipsUGJmK8EFat9q/UVAsRrwKlJKC1Y11MMWQc2
# zqoLeOllwMQjETTUwGqY+4HzrJhgtPc+AHRwhXIwtsJpMVs8Bm4E/0HkRZRecIpS
# Ow7Kh2FsQEhWDx3BJ+ryXmAg/Ib6NFfEP+KlSou7BvNrHQkCUN34F0vSdCGs+Z9J
# 9+xK2DpV+VXpxY9tIgRZSlM9HVOiqjN7bQEVvn6lup+yUd13cdixgupZfY2tPk1G
# jP44Jaf8pN4Tvv4Q0vCWN+WPHKms09hqbqVW3CZa6V+B3ZBPmGmITc+ClKpi9Z8E
# 5v2/ZprCMIIFEzCCA/ugAwIBAgIMWNoT/wAAAABRzg33MA0GCSqGSIb3DQEBCwUA
# MIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3Qu
# bmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMG
# A1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50
# cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMB4XDTE1MDcy
# MjE5MDI1NFoXDTI5MDYyMjE5MzI1NFowgbIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
# Ew1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xl
# Z2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9y
# IGF1dGhvcml6ZWQgdXNlIG9ubHkxJjAkBgNVBAMTHUVudHJ1c3QgVGltZXN0YW1w
# aW5nIENBIC0gVFMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2SPm
# FKTofEuFcVj7+IHmcotdRsOIAB840Irh1m5WMOWv2mRQfcITOfu9ZrTahPuD0Cgf
# y3boYFBpm/POTxPiwT7B3xLLMqP4XkQiDsw66Y1JuWB0yN5UPUFeQ18oRqmmt8oQ
# KyK8W01bjBdlEob9LHfVxaCMysKD4EdXfOdwrmJFJzEYCtTApBhVUvdgxgRLs91o
# Mm4QHzQRuBJ4ZPHuqeD347EijzRaZcuK9OFFUHTfk5emNObQTDufN0lSp1NOny5n
# XO2W/KW/dFGI46qOvdmxL19QMBb0UWAia5nL/+FUO7n7RDilCDkjm2lH+jzE0Oeq
# 30ay7PKKGawpsjiVdQIDAQABo4IBIzCCAR8wEgYDVR0TAQH/BAgwBgEB/wIBADAO
# BgNVHQ8BAf8EBAMCAQYwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEW
# Gmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvcnBhMDMGCCsGAQUFBwEBBCcwJTAjBggr
# BgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMgYDVR0fBCswKTAnoCWg
# I4YhaHR0cDovL2NybC5lbnRydXN0Lm5ldC8yMDQ4Y2EuY3JsMBMGA1UdJQQMMAoG
# CCsGAQUFBwMIMB0GA1UdDgQWBBTDwnHSe9doBa47OZs0JQxiA8dXaDAfBgNVHSME
# GDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDANBgkqhkiG9w0BAQsFAAOCAQEAHSTn
# mnRbqnD8sQ4xRdcsAH9mOiugmjSqrGNtifmf3w13/SQj/E+ct2+P8/QftsH91hzE
# jIhmwWONuld307gaHshRrcxgNhqHaijqEWXezDwsjHS36FBD08wo6BVsESqfFJUp
# yQVXtWc26Dypg+9BwSEW0373LRFHZnZgghJpjHZVcw/fL0td6Wwj+Af2tX3WaUWc
# WH1hLvx4S0NOiZFGRCygU6hFofYWWLuRE/JLxd8LwOeuKXq9RbPncDDnNI7revbT
# tdHeaxOZRrOL0k2TdbXxb7/cACjCJb+856NlNOw/DR2XjPqqiCKkGDXbBY524xDI
# KY9j0K6sGNnaxJ9REjGCA2QwggNgAgEBMIHIMIGyMQswCQYDVQQGEwJVUzEWMBQG
# A1UEChMNRW50cnVzdCwgSW5jLjEoMCYGA1UECxMfU2VlIHd3dy5lbnRydXN0Lm5l
# dC9sZWdhbC10ZXJtczE5MDcGA1UECxMwKGMpIDIwMTUgRW50cnVzdCwgSW5jLiAt
# IGZvciBhdXRob3JpemVkIHVzZSBvbmx5MSYwJAYDVQQDEx1FbnRydXN0IFRpbWVz
# dGFtcGluZyBDQSAtIFRTMQIRAKvdZ2XyWu9QAAAAAFWR6QwwDQYJYIZIAWUDBAIB
# BQCgggFsMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQx
# IgQgdY13Kxva8yBQHqWeKdp4DXV4vOn36RX5IECVv6to6mowggEbBgsqhkiG9w0B
# CRACDDGCAQowggEGMIIBAjCB5wQUwPWUF2Vp14CrDs/f2+Kpwa9kTt4wgc4wgbik
# gbUwgbIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYD
# VQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAo
# YykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkx
# JjAkBgNVBAMTHUVudHJ1c3QgVGltZXN0YW1waW5nIENBIC0gVFMxAhEAq91nZfJa
# 71AAAAAAVZHpDDAWBBSXnp2n95YjPyEMju0Wbe82BAxGjjANBgkqhkiG9w0BAQsF
# AASCAQAu/FPqGinc1BHkTzaRdQZnqDB+RN++eudwTO5iJHRTM/7Dog8nI3XWwJmY
# YUiPeqyzpnGuzySyn+Ikl/LdIbVxq3S/Jiiz69OKE01V+hM8938ZmNAYwQPleMuA
# WWVjqc+uI4BZZsWgg8RXeWYigBz1TCx/T/+ZjrCQeGoHvO8p5In9dLLjIn8xs5n0
# sghOB8A0AeQYdlJo0XsaVOn0DZs9Il7qUfXskEDzGc/duv53YD8jviOBRdQNRuiq
# di89DRDDxsqgmSgXCUzvXHOQsLQ0kmdZEoSfrPCpxHWbeOTmnF5eND+P8pwV+0sE
# 1+cMrjbj1QWcX/c8HW0+bO8VS0AS
# SIG # End signature block