Samples/E2E-hub-devices/common/devices.ps1

# ------------------------------------------------------------------
# Lenovo Copyright
#
# (C) Copyright Lenovo 2026 - present.
#
# LIMITED AND RESTRICTED RIGHTS NOTICE:
# If data or software is delivered pursuant a General Services
# Administration (GSA) contract, use, reproduction, or disclosure
# is subject to restrictions set forth in Contract No. GS-35F-05925.
# ------------------------------------------------------------------

function DiscoverDevices()
{
    [CmdletBinding()]
    param (
        [Parameter(mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string[]] $DevicesIPs,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $ManagerID
    )

    $result = Find-LXC1Devices -ManagerID $ManagerID `
                               -Hosts $DevicesIPs

    return $result
}

function GetDiscoveredDevices()
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $ManagerIP
    )

    $discovered = $null
    do
    {
        $discovered = Get-LXC1DiscoveredDevice -ManagementHub $ManagerIP
        if ($discovered.Response.results.Count -eq 0)
        {
            Write-Host "Waiting for discovered devices to be available in portal ..."
            Start-Sleep -Seconds 5
        }
    } while ($discovered.Response.results.Count -eq 0)
    $devices = @()
    foreach ($device in $($discovered.Response.results))
    {
        $devices += $device.uuid
    }
    return $devices
}

function AddDiscoveredDevices()
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $ManagerID,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $DeviceUUIDs,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [PSCredential]$DeviceCredential
    )

    $result = Add-LXC1Devices -UserName $DeviceCredential.GetNetworkCredential().UserName `
                              -Password $DeviceCredential.Password `
                              -HubID $ManagerID `
                              -DeviceUUIDs $DeviceUUIDs                                   
    return $result
}

function GetDevicesInventory()
{
    $devices = $null
    do
    {
        $devices = Get-LXC1Device
        if ($devices.Response.results.Count -eq 0)
        {
            Write-Host "Waiting for devices to be available in portal ..."
            Start-Sleep -Seconds 5
        }
    } while ($devices.Response.results.Count -eq 0)
    return $devices
}

function DevicePowerOps()
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $Devices,
        [Parameter(Mandatory = $true)]
        [ValidateSet("powerOn", "powerOffNormally", "powerOffImmediately",
         "restartNormally", "restartImmediately", "restartSystemSetup", "restartManagementController")]
        $Action
    )
    $deviceIDs = @()
    foreach($item in $Devices.Response.results)
    {
        $deviceIDs += $item.id
    }
    $result = Invoke-LXC1DevicePowerAction -PowerAction $Action `
                                           -DeviceIDs $deviceIDs
    
    return $result
}

function RemoveDevices()
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $Devices
    )

    $devicesIDs = @()
    foreach($dev in $Devices.Response.results)
    {
        $devicesIDs += $dev.id
    }

    $result = Remove-LXC1Devices -DeviceIDs $devicesIDs
    return $result
}

#EOF

# SIG # Begin signature block
# MIIonAYJKoZIhvcNAQcCoIIojTCCKIkCAQExDzANBglghkgBZQMEAgIFADCBiQYK
# KwYBBAGCNwIBBKB7MHkwNAYKKwYBBAGCNwIBHjAmAgMBAAAEEB/MO2BZSwhOtyTS
# xil+81ECAQACAQACAQACAQACAQAwQTANBglghkgBZQMEAgIFAAQwbdUaYeJbzN6a
# lw03gzCzA/Ks4dyFT0xXu14lpxMcwe9qBXNDALrWCZNbsSkLovCqoIINjjCCBrAw
# ggSYoAMCAQICEAitQLJg0pxMn17Nqb2TrtkwDQYJKoZIhvcNAQEMBQAwYjELMAkG
# A1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRp
# Z2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MB4X
# DTIxMDQyOTAwMDAwMFoXDTM2MDQyODIzNTk1OVowaTELMAkGA1UEBhMCVVMxFzAV
# BgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVk
# IEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENBMTCCAiIwDQYJ
# KoZIhvcNAQEBBQADggIPADCCAgoCggIBANW0L0LQKK14t13VOVkbsYhC9TOM6z2B
# l3DFu8SFJjCfpI5o2Fz16zQkB+FLT9N4Q/QX1x7a+dLVZxpSTw6hV/yImcGRzIED
# Pk1wJGSzjeIIfTR9TIBXEmtDmpnyxTsf8u/LR1oTpkyzASAl8xDTi7L7CPCK4J0J
# wGWn+piASTWHPVEZ6JAheEUuoZ8s4RjCGszF7pNJcEIyj/vG6hzzZWiRok1MghFI
# UmjeEL0UV13oGBNlxX+yT4UsSKRWhDXW+S6cqgAV0Tf+GgaUwnzI6hsy5srC9Kej
# Aw50pa85tqtgEuPo1rn3MeHcreQYoNjBI0dHs6EPbqOrbZgGgxu3amct0r1EGpIQ
# gY+wOwnXx5syWsL/amBUi0nBk+3htFzgb+sm+YzVsvk4EObqzpH1vtP7b5NhNFy8
# k0UogzYqZihfsHPOiyYlBrKD1Fz2FRlM7WLgXjPy6OjsCqewAyuRsjZ5vvetCB51
# pmXMu+NIUPN3kRr+21CiRshhWJj1fAIWPIMorTmG7NS3DVPQ+EfmdTCN7DCTdhSm
# W0tddGFNPxKRdt6/WMtyEClB8NXFbSZ2aBFBE1ia3CYrAfSJTVnbeM+BSj5AR1/J
# gVBzhRAjIVlgimRUwcwhGug4GXxmHM14OEUwmU//Y09Mu6oNCFNBfFg9R7P6tuyM
# MgkCzGw8DFYRAgMBAAGjggFZMIIBVTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1Ud
# DgQWBBRoN+Drtjv4XxGG+/5hewiIZfROQjAfBgNVHSMEGDAWgBTs1+OC0nFdZEzf
# Lmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMw
# dwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
# dC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
# aWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6
# Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3JsMBwG
# A1UdIAQVMBMwBwYFZ4EMAQMwCAYGZ4EMAQQBMA0GCSqGSIb3DQEBDAUAA4ICAQA6
# I0Q9jQh27o+8OpnTVuACGqX4SDTzLLbmdGb3lHKxAMqvbDAnExKekESfS/2eo3wm
# 1Te8Ol1IbZXVP0n0J7sWgUVQ/Zy9toXgdn43ccsi91qqkM/1k2rj6yDR1VB5iJqK
# isG2vaFIGH7c2IAaERkYzWGZgVb2yeN258TkG19D+D6U/3Y5PZ7Umc9K3SjrXyah
# lVhI1Rr+1yc//ZDRdobdHLBgXPMNqO7giaG9OeE4Ttpuuzad++UhU1rDyulq8aI+
# 20O4M8hPOBSSmfXdzlRt2V0CFB9AM3wD4pWywiF1c1LLRtjENByipUuNzW92NyyF
# PxrOJukYvpAHsEN/lYgggnDwzMrv/Sk1XB+JOFX3N4qLCaHLC+kxGv8uGVw5ceG+
# nKcKBtYmZ7eS5k5f3nqsSc8upHSSrds8pJyGH+PBVhsrI/+PteqIe3Br5qC6/To/
# RabE6BaRUotBwEiES5ZNq0RA443wFSjO7fEYVgcqLxDEDAhkPDOPriiMPMuPiAsN
# vzv0zh57ju+168u38HcT5ucoP6wSrqUvImxB+YJcFWbMbA7KxYbD9iYzDAdLoNMH
# AmpqQDBISzSoUSC7rRuFCOJZDW3KBVAr6kocnqX9oKcfBnTn8tZSkP2vhUgh+Vc7
# tJwD7YZF9LRhbr9o4iZghurIr6n+lB3nYxs6hlZ4TjCCBtYwggS+oAMCAQICEA4N
# SQ+9/yWf5fddvJTWmGgwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMCVVMxFzAV
# BgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVk
# IEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENBMTAeFw0yNTA4
# MjIwMDAwMDBaFw0yNjA4MjEyMzU5NTlaMF4xCzAJBgNVBAYTAlVTMRcwFQYDVQQI
# Ew5Ob3J0aCBDYXJvbGluYTEUMBIGA1UEBxMLTW9ycmlzdmlsbGUxDzANBgNVBAoT
# Bkxlbm92bzEPMA0GA1UEAxMGTGVub3ZvMIIBojANBgkqhkiG9w0BAQEFAAOCAY8A
# MIIBigKCAYEAy5eIM5QMR+UMRJIlyLW6kLSSDS92mk9KYxnRrgw2kxTWayrUB1lC
# ICb+RXO4ZCUGpNiSWOizwNd6YExVqCb2/Y7HQ7VSIbwawUqyAX7DRtnhi/hUXcFv
# idKk5qUCuz8p9T8NYgirlxBJd5KZAbx3SBeKKaYtfl6VLw6GpdWxVzRhl/AO21j+
# 8L52t7Eh6md2mizqOgUoJ41XJ15OpnpqY79a0PHeswxukWinUZFAlxtIHg4fCn2/
# wl9hqa6LRyP7+WzroI6fkXJs2slyejY0PCid9nCdSv5CvJeYJ5tRw6yHUVM2gVis
# SAwa4KW954nhZkw94Sx6T65kZ/MZ4dH7kTTmgln33WSHukoIpsF5vICDBsIrbr9i
# PNDw+viT6QrI4CqAOsf75cCstg3vK2b1/TbI/ahJUzAiGHrHi31jq8HAujPryV3a
# oY3e6yLIm7FHLHB1xOdjXfbl5n5roTnQoDHKNk9ybO3SEetoWF5O3QZ1A6gRB15m
# 9RU8HqDpujPbAgMBAAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5h
# ewiIZfROQjAdBgNVHQ4EFgQUxU1hosmsl9DA31WV5+iSfCurk8UwPgYDVR0gBDcw
# NTAzBgZngQwBBAEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5j
# b20vQ1BTMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYD
# VR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNl
# cnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBT
# oFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0
# Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwgZQGCCsGAQUFBwEB
# BIGHMIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYI
# KwYBBQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRy
# dXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1Ud
# EwQCMAAwDQYJKoZIhvcNAQELBQADggIBAG6TLs2hwIBSllVyhSUIwkQ1EGtKToXN
# 6R0Inl/BTh2WUpcZMUyDe4A1I8FoXZkhU5/h9f8OPjUQofRS/UBaqdtWL16kS+Aa
# tRxJK/jquscLChs5FOOedmpKmrbSvM7Ej05UHxDRrFgpkhDdFSWKIDSUhTWQVscd
# URFfCWYzcqzBZLumVyCqPxZSppNlloTf9YB+E1FnRDw+//qxnr4YS2a3f0P5yIq3
# Fvyky6vEb8L5guN+7vBgoFf3mLTxgbpLtLEbCdgPCdsuU4wmGQ7508wuwx4jD/x+
# LepZda21uDT//cC6J3HrfyoDUYc9hOtlxVIDxULguUWQOsC7MrXkUEAm73yYiuD4
# 3uFILe49aONrTG8DAyp2+88Y3sZsrqgzxRjAbfCmLvmi8qhwEQ8cVmv6HPzW1cHJ
# ewG+nnAp4jYC+8BoR1rHMSa/Ro4GfOh6fowxaPsalmKiPQyRsHHqvgL0NYsAgQY/
# O4hxN0K/04QOUXA8tSFpdssu9dHJFcGQkem5NTQAoC7mqP10jM0v7I38o2bdluSO
# GoZB2dwbReid2V+DnLeuzc6Torr1Bok3/XjCXq3P6VVjUcor1raTs1+Q1KaL51mA
# rNziqD45eeUPun6KZhoSEbJNW+Xwr/b69pS+VvPhHXG9Mf+L2KIVhMaUQQcMXqIw
# PCohl+fUhzz6MYIaUzCCGk8CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29k
# ZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAODUkPvf8ln+X3XbyU
# 1phoMA0GCWCGSAFlAwQCAgUAoIGMMBAGCisGAQQBgjcCAQwxAjAAMBkGCSqGSIb3
# DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV
# MD8GCSqGSIb3DQEJBDEyBDBHPvGnqXO+SjaMKS8DhDDaSB6y4ZU2tEAfViMWSnyd
# osM/StGXsOYSy6+hSr+Njl4wDQYJKoZIhvcNAQEBBQAEggGAlbYl2u9172zfZIGY
# EIcYHdgPceB46+lweJm+6wvtu9VAYmvuVOOfhsGZQaOqs3BUsS8eOSUGdLzGnsjX
# 3gg3PqtjTuoHK+LS+28hTmeVu+UF0xUBkoWJOqW0rRSdhfxFNSygLagqQtx0yZ8B
# flQQHgDtIUOZtCqjUyaZKpjeicvz6x2JGioVm4BKBY1TAjOA/pKInduBk5WmyT20
# Q3rmxLHwFYPk44wzCjIQoQ4OEW79rIFkJxcHTilX1i9/ddF51W/8tmlML9CdxCTi
# p0mg1bf+IxKti9C1Ub32Cn4Dkx6rI+0oaHGsN0vTrpv1FKbr+hocOHO4D8xPPyP9
# hKWBpLabYZK29y5wimBuTZiilksRbhCvZbOEyoCoccWBXt4oggpvkOUuvy26jTn4
# cMBVzZpheOFgXxf7oSNamVNEAMIvck2WX1AYU1Z+1Dnun4eu7wWSFnc1oCGac5mb
# 4cV4PNK+tzrLogtWzbU7FsmNsJ8YcodwKTMsFkkPcCagvfYboYIXmDCCF5QGCisG
# AQQBgjcDAwExgheEMIIXgAYJKoZIhvcNAQcCoIIXcTCCF20CAQMxDzANBglghkgB
# ZQMEAgIFADCBiAYLKoZIhvcNAQkQAQSgeQR3MHUCAQEGCWCGSAGG/WwHATBBMA0G
# CWCGSAFlAwQCAgUABDCHSsqjBeFMeC1WQh9Fuz2S5jN1ar2xsq5n158sCIXmrfUf
# 0JCfSBy4DILwPqnpIoYCEQCeySNWQAib0Jt1d14NjbPTGA8yMDI2MDMyNTE4MTUw
# NFqgghM6MIIG7TCCBNWgAwIBAgIQDCBDSfnQ91n7mC3kCBuIezANBgkqhkiG9w0B
# AQwFADBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/
# BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYg
# U0hBMjU2IDIwMjUgQ0ExMB4XDTI1MDYwNDAwMDAwMFoXDTM2MDkwMzIzNTk1OVow
# YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD
# EzJEaWdpQ2VydCBTSEEzODQgUlNBNDA5NiBUaW1lc3RhbXAgUmVzcG9uZGVyIDIw
# MjUgMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANs5UvuLdLflyQ1R
# 2PrzScab+/eLDNzuFEMnJikV5mC7PmEX87cpfECe5/1KsTUylpo3RQ1hr+N/mtqI
# ieNcsTntLC6BcfBdWs9iUU2XO3YQMW53vm8neW39khGZQq7hscVkqm6VGOnQBkQg
# sgTmohWqF4ZJ/i9eXn3KJg0q05wOVYHfabzDvu2zPrUluCcwIiGztpiD8ghHSmLH
# Jj5fmAbnp0j+zScPYnC9bVqZ+tbjOlslDb+EXMgQM/jbyWzX+ZEzOxeOnLwcKdJW
# WIrGUffOcubGI+HuMlAWzwccq0+WjTGfvubYrPBg5hwqaslS0OHix8KYpuYsEePU
# 0RHxE7ZRBTkVk5CdoTjtc81QFrOo7XXqddlbRWaEDoSMHVHzx0rAMN/cRVXrxRBX
# 9rvg1a9bDleyQAmPsXBvIViHqjxlVMJIsgUVE4AOx3gMSW9IkJeBgwQumQQOMBjf
# 2oTMReH7ibDrNc8JDwUp15h5JtfB8B4CDypNvO3TCHIWco5u8xnAmGeG4rKFGFi/
# aE4GvSQnxTE3PcpdulwwdM5fa3UsL4jpmmEpWkWpxfOKMQGJ6oAcumfPcpD4Fp2+
# 0kYt9Tcj9+fVoaJPt+n5MsUz40qwlrzCu6c20YPLXyEZVJ8ZexuWyK5D6jGw/cya
# Ae/TBxYC6+ZY1O663C8MvnBH6cxTAgMBAAGjggGVMIIBkTAMBgNVHRMBAf8EAjAA
# MB0GA1UdDgQWBBRVnrnnZ8iREEm0NlKNebckxT8t+DAfBgNVHSMEGDAWgBTvb1NK
# 6eQGfHrK4pBW9i/USezLTjAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYI
# KwYBBQUHAwgwgZUGCCsGAQUFBwEBBIGIMIGFMCQGCCsGAQUFBzABhhhodHRwOi8v
# b2NzcC5kaWdpY2VydC5jb20wXQYIKwYBBQUHMAKGUWh0dHA6Ly9jYWNlcnRzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZT
# SEEyNTYyMDI1Q0ExLmNydDBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vY3JsMy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2
# U0hBMjU2MjAyNUNBMS5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9
# bAcBMA0GCSqGSIb3DQEBDAUAA4ICAQAbfgskh9gJasVB51Fp2SSO66XQKqND3IpM
# lePC7ZOUFhYMaRz/VrY0d5bJBADpN07M5rjcjIne1bsR5UCZeCnHU6+XENmC8vpe
# etKXgYDO5AOBwiahqnUHc418q5YN2AnX547PcP+wTvMVJpQGqvw/j02WTvjJ8Wt/
# yKMmLBfi/YFl+FScWS5Y1bOSSpqUqJ58rDGL+wmqpEKQQ5iVlNhevJiy2V31NMF2
# w8vUEE7JIHB74skA3gdZeo5f1sDkIkjUzWn2EFEdmbCeazybtTT8ztYbSsHYlI1n
# px8KuQUStQUe/g/k8Bve1B1+FdFvibxWafM93dxubAOz7fajuf+gFmftMn/JzefA
# /hwAEoR5p8tubelu6helUkWQiKRq/IWwI32wYTuDGPBtlPc8FSqekpY7ipJ8Xdm7
# ooTt93YqAhrAera1/vsUCn+EJWEoIBbw/WVkhuMrCT2DsfoW7AUxDjRba/fcejoC
# Z58lZA6LnSJ/oJlfgavmthvvgS1OQFzlXJRMabqFEF1GRead7FK3dtUIxfUWtMeE
# Q9NoEuF8IMzfrb7mPrY4TyAsF5h9xES/nzyKMWU9F4MFT/te1KlG4uWaXuGHWnRu
# Vowkwb7ZpTOCVaLxmEb8gMn5mCScdP9E/qitOcESaYOKvNbzirgkD2hPR/fSQlb3
# wgwZuCo6xDCCBrQwggScoAMCAQICEA3HrFcF/yGZLkBDIgw6SYYwDQYJKoZIhvcN
# AQELBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG
# A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3Rl
# ZCBSb290IEc0MB4XDTI1MDUwNzAwMDAwMFoXDTM4MDExNDIzNTk1OVowaTELMAkG
# A1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdp
# Q2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1
# IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALR4MdMKmEFyvjxG
# wBysddujRmh0tFEXnU2tjQ2UtZmWgyxU7UNqEY81FzJsQqr5G7A6c+Gh/qm8Xi4a
# PCOo2N8S9SLrC6Kbltqn7SWCWgzbNfiR+2fkHUiljNOqnIVD/gG3SYDEAd4dg2dD
# GpeZGKe+42DFUF0mR/vtLa4+gKPsYfwEu7EEbkC9+0F2w4QJLVSTEG8yAR2CQWIM
# 1iI5PHg62IVwxKSpO0XaF9DPfNBKS7Zazch8NF5vp7eaZ2CVNxpqumzTCNSOxm+S
# AWSuIr21Qomb+zzQWKhxKTVVgtmUPAW35xUUFREmDrMxSNlr/NsJyUXzdtFUUt4a
# S4CEeIY8y9IaaGBpPNXKFifinT7zL2gdFpBP9qh8SdLnEut/GcalNeJQ55IuwnKC
# gs+nrpuQNfVmUB5KlCX3ZA4x5HHKS+rqBvKWxdCyQEEGcbLe1b8Aw4wJkhU1JrPs
# FfxW1gaou30yZ46t4Y9F20HHfIY4/6vHespYMQmUiote8ladjS/nJ0+k6Mvqzfpz
# PDOy5y6gqztiT96Fv/9bH7mQyogxG9QEPHrPV6/7umw052AkyiLA6tQbZl1KhBtT
# asySkuJDpsZGKdlsjg4u70EwgWbVRSX1Wd4+zoFpp4Ra+MlKM2baoD6x0VR4RjSp
# WM8o5a6D8bpfm4CLKczsG7ZrIGNTAgMBAAGjggFdMIIBWTASBgNVHRMBAf8ECDAG
# AQH/AgEAMB0GA1UdDgQWBBTvb1NK6eQGfHrK4pBW9i/USezLTjAfBgNVHSMEGDAW
# gBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAww
# CgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhhodHRwOi8v
# b2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDow
# OKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRS
# b290RzQuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkq
# hkiG9w0BAQsFAAOCAgEAF877FoAc/gc9EXZxML2+C8i1NKZ/zdCHxYgaMH9Pw5tc
# BnPw6O6FTGNpoV2V4wzSUGvI9NAzaoQk97frPBtIj+ZLzdp+yXdhOP4hCFATuNT+
# ReOPK0mCefSG+tXqGpYZ3essBS3q8nL2UwM+NMvEuBd/2vmdYxDCvwzJv2sRUoKE
# fJ+nN57mQfQXwcAEGCvRR2qKtntujB71WPYAgwPyWLKu6RnaID/B0ba2H3LUiwDR
# AXx1Neq9ydOal95CHfmTnM4I+ZI2rVQfjXQA1WSjjf4J2a7jLzWGNqNX+DF0SQzH
# U0pTi4dBwp9nEC8EAqoxW6q17r0z0noDjs6+BFo+z7bKSBwZXTRNivYuve3L2oiK
# NqetRHdqfMTCW/NmKLJ9M+MtucVGyOxiDf06VXxyKkOirv6o02OoXN4bFzK0vlNM
# svhlqgF2puE6FndlENSmE+9JGYxOGLS/D284NHNboDGcmWXfwXRy4kbu4QFhOm0x
# JuF2EZAOk5eCkhSxZON3rGlHqhpB/8MluDezooIs8CVnrpHMiD2wL40mm53+/j7t
# FaxYKIqL0Q4ssd8xHZnIn/7GELH3IdvG2XlM9q7WP/UwgOkw/HQtyRN62JK4S1C8
# uw3PdBunvAZapsiI5YKdvlarEvf8EA+8hcpSM9LHJmyrxaFtoza2zNaQ9k+5t1ww
# ggWNMIIEdaADAgECAhAOmxiO+dAt5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUx
# CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
# dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9v
# dCBDQTAeFw0yMjA4MDEwMDAwMDBaFw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYT
# AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy
# dC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJ
# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskh
# PfKK2FnC4SmnPVirdprNrnsbhA3EMB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIP
# Uh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZanMylNEQRBAu34LzB4TmdDttceItDBvu
# INXJIB1jKS3O7F5OyJP4IWGbNOsFxl7sWxq868nPzaw0QF+xembud8hIqGZXV59U
# WI4MK7dPpzDZVu7Ke13jrclPXuU15zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4
# AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJoz
# QL8I11pJpMLmqaBn3aQnvKFPObURWBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw
# 4KISG2aadMreSx7nDmOu5tTvkpI6nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sE
# AMx9HJXDj/chsrIRt7t/8tWMcCxBYKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZD
# pBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0viastkF13nqsX40/ybzTQRESW+UQUOsx
# xcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+Y
# HS312amyHeUbAgMBAAGjggE6MIIBNjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
# BBTs1+OC0nFdZEzfLmc/57qYrhwPTzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
# pyGd823IDzAOBgNVHQ8BAf8EBAMCAYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUF
# BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6
# Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5j
# cnQwRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp
# Z2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJ
# KoZIhvcNAQEMBQADggEBAHCgv0NcVec4X6CjdBs9thbX979XB72arKGHLOyFXqka
# uyL4hxppVCLtpIh3bb0aFPQTSnovLbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP
# +fT3rDB6mouyXtTP0UNEm0Mh65ZyoUi0mcudT6cGAxN3J0TU53/oWajwvy8Lpuny
# NDzs9wPHh6jSTEAZNUZqaVSwuKFWjuyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiE
# n2/K2yCNNWAcAgPLILCsWKAOQGPFmCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4
# VC0nftg62fC2h5b9W9FcrBjDTZ9ztwGpn1eqXijiuZQxggOMMIIDiAIBATB9MGkx
# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4
# RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYg
# MjAyNSBDQTECEAwgQ0n50PdZ+5gt5AgbiHswDQYJYIZIAWUDBAICBQCggeEwGgYJ
# KoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yNjAzMjUx
# ODE1MDRaMCsGCyqGSIb3DQEJEAIMMRwwGjAYMBYEFHK8/aAQf0k0sAccYQ/m15ZQ
# AJh3MDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIDLz47G9oteybU8dG4zdvY+LhHah
# eJ7WEs08qnqe/zXCMD8GCSqGSIb3DQEJBDEyBDDQnPtAdUMuhW2LAtRdoR0+gVMb
# uH7XI/QS7J/i3pWFQhp/oINGYT3kOosMqdqFJvQwDQYJKoZIhvcNAQEBBQAEggIA
# XXKD+N4Fkas/CWR9rY8GPO6sGQE2lH3SIC0bTV4a+OwW4KHuSUH65QPKwpU5H75A
# ijvCU3jQ8rQuRAKrwN+iHcKJ8JfnAv5h2RmGjMmISjjUr2N3d/pIzmFX6p10H/3o
# RJSk6VntSg/TqEIFPjfMjovdPD5VuVvo7TdXGVMk0612z2Muobmr++2KkcO8rpYF
# Dp2eo0w2B8d+kdbNxi3qYMf5ZmspFm9+in/fW0Ir61cIJ7LSse9JbAP19qLOOsWS
# MJxgUa9f4n0xgQeaa+P+wxM7hEINhNMcpGLEI1x7PFLPvj/1/cogBJhgXWJQKUvJ
# S5an7mmNG9rwROY5J1U9gVU1LYSAaqYFuXN6BjP5k5ZZADZWhx68eq/krg5iU6Bk
# mLjWsboTxCfnflaQMHBgCjSNGisJlpjuicUbV2wn5nn6182dcsrJ6Fwzp6Teoos3
# 01ty3LBKzr+6pZPgsHDVB6Jp1C4MZPzXU3kfc62JngXZNm8MmTi91a+opte2NVYQ
# VoL+fBypxADquDx0HypQfVdaDy9CIWLuW2x9+ROMnaEjchF2gsD9bcH6+/xV7O8W
# PGafUBNkJdaGgd85cM3AY20kLUKvSyiXtlNOGjG1fQGvv16gXNqBFuP+YRD8Krer
# sW7lAsk3Nuc07Yc06NyqkXhwszB3jZ8fYlKgH907FiI=
# SIG # End signature block