DSCResources/Cisco_UcsSyncMoWithReference/Cisco_UcsSyncMoWithReference.psm1

# DSC uses the Get-TargetResource function to fetch the status of the resource instance specified in the parameters for the target machine
function Get-TargetResource 
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param 
    (       
        [parameter(Mandatory = $true)]
        [System.String]
        $Identifier,

        [parameter(Mandatory = $true)]
        [System.String]
        $UcsConnectionString,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $UcsCredentials,

        [parameter(Mandatory = $true)]
        [System.String]
        $RefUcsConnectionString,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $RefUcsCredentials,

        [System.String]
        $Dn,

        [System.String]
        $ClassId,

        [System.Boolean]
        $Hierarchy=$false,

        [ValidateSet("Present", "Absent")]
        [string]$Ensure = "Present",

        [System.Management.Automation.PSCredential]
        $WebProxyCredentials,

        [System.UInt32[]]
        $DiffCount=0,

        [System.Boolean]
        $DeleteNotPresent=$false
   
    )
    try
    {
            Write-Verbose("Started execution of Get() method")
            $getTargetResourceResult = $null;
            Write-Verbose("Connecting to target UCS...")
            $handle=  Get-UcsConnection -UcsConnectionString $UcsConnectionString -UcsCredentials $UcsCredentials -WebProxyCredentials $WebProxyCredentials
            if($handle -eq $null)
            {
                Write-Verbose("Failed to connect to Target UCS " +$UcsConnectionString)
                throw "Failed to connect to Target Ucs $UcsConnectionString"
            }

            Write-Verbose("Connecting to reference UCS...")
            $refHandle= Get-UcsConnection -UcsConnectionString $RefUcsConnectionString -UcsCredentials $RefUcsCredentials -WebProxyCredentials $RefWebProxyCredentials
            if($refHandle -eq $null)
            {
                Write-Verbose("Failed to connect to reference UCS " +$RefUcsConnectionString)
                throw "Failed to connect to Reference Ucs $RefUcsConnectionString"
            }
       
            if($PSBoundParameters.ContainsKey("ClassId"))
            {
               Write-Verbose("Getting moList from " +$handle.Name)
               $moList= Get-UcsMo -ClassId $ClassId -Ucs $handle
           
               Write-Verbose("Getting moList from reference UCS " +$refHandle.Name)
               $refMoList= Get-UcsMo -ClassId $ClassId -Ucs $refHandle
            } 
           else
            {
                if(!$PSBoundParameters.ContainsKey(("Dn")))
                {
                   $Dn= "sys"
                }

                if($Hierarchy)
                {
                    Write-Verbose("Getting moList from " +$handle.Name)
                    $moList= Get-UcsMo -Dn $Dn -Hierarchy -Ucs $handle
                    Write-Verbose("Getting moList from reference UCS " +$refHandle.Name)
                    $refMoList= Get-UcsMo -Dn $Dn -Hierarchy -Ucs $refHandle
                }
               else
                {
                    Write-Verbose("Getting moList from " +$handle.Name)
                    $moList= Get-UcsMo -Dn $Dn -Ucs $handle
                    Write-Verbose("Getting moList from reference UCS " +$refHandle.Name) 
                    $refMoList= Get-UcsMo -Dn $Dn -Ucs $refHandle
                }
            }
        
            Write-Verbose("Disconnecting Reference UCS...")
            Disconnect-Ucs -Ucs $refHandle
            Write-Verbose("Reference UCS Disconnected")

            Write-Verbose("Comparing reference UCS:"+$refHandle.Name+ "moList with UCS:" +$handle.Name+"moList")
            $diffMos= Compare-UcsManagedObject -ReferenceObject $moList -DifferenceObject $refMoList -ErrorAction SilentlyContinue
            $diffCount=0
            if($diffMos -ne $null)
            {
                if($DeleteNotPresent)
                {
                    $diffCount= $diffMos.Count
                }
                else
                {
                    $diffCount= (($diffMos | %{$_.SideIndicator -eq "=>"} ) | where { $_ -eq $true } | measure).Count 
                }

                if($diffCount -gt 0)
                {
                    $Ensure= "Absent"
                }
                else
                {
                    $Ensure= "Present"
                }
            }
            else
            {
                Write-Verbose("Difference is null.")
                $Ensure= "Present"
            }

            Write-Verbose("Disconnecting Target UCS...")
            Disconnect-Ucs -Ucs $handle
            Write-Verbose("Target UCS Disconnected")
        
        
            $result = @{    Ensure=$Ensure;
                            Identifier  = $Identifier; 
                            ClassId = $ClassId;
                            Dn = $Dn;
                            Hierarchy= $Hierarchy;
                            DeleteNotPresent=$DeleteNotPresent;
                            DiffCount=$diffCount;
                            UcsConnectionString = $UcsConnectionString;
                            UcsCredentials = $null;
                            RefUcsConnectionString = $RefUcsConnectionString;
                            RefUcsCredentials = $null;
                            WebProxyCredentials = $null;
                                           
                          }
        }
        catch
        {
            Write-Verbose("Error occured in Get-TargetResoucrce. Disconnecting UCS(s)...")
            if($handle -ne $null)
             {$temp = Disconnect-Ucs -Ucs $handle}

            if($refHandle -ne $null)
             {$temp = Disconnect-Ucs -Ucs $refHandle}
            throw
        }

        Write-Verbose("Completed execution of Get() method")
        $result;
} 

# The Set-TargetResource function.
function Set-TargetResource 
{
    [CmdletBinding(SupportsShouldProcess=$true)]
    param 
    (       
        [parameter(Mandatory = $true)]
        [System.String]
        $Identifier,

        [parameter(Mandatory = $true)]
        [System.String]
        $UcsConnectionString,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $UcsCredentials,

        [parameter(Mandatory = $true)]
        [System.String]
        $RefUcsConnectionString,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $RefUcsCredentials,

        [System.String]
        $Dn,

        [System.String]
        $ClassId,

        [System.Boolean]
        $Hierarchy=$false,

        [ValidateSet("Present", "Absent")]
        [string]$Ensure = "Present",

        [System.Management.Automation.PSCredential]
        $WebProxyCredentials= $null,

        [System.UInt32[]]
        $DiffCount=0,

        [System.Boolean]
        $DeleteNotPresent=$false
    )

    Write-Verbose("Started execution of Set() method")

    try
    {
        if($Ensure -eq "Present" )
        {
            Write-Verbose("Connecting to target UCS...")
            $handle=  Get-UcsConnection -UcsConnectionString $UcsConnectionString -UcsCredentials $UcsCredentials -WebProxyCredentials $WebProxyCredentials

            Write-Verbose("Connecting to Reference UCS...")
            $refHandle= Get-UcsConnection -UcsConnectionString $RefUcsConnectionString -UcsCredentials $RefUcsCredentials -WebProxyCredentials $RefWebProxyCredentials

       
            if($PSBoundParameters.ContainsKey("ClassId"))
            {
               Write-Verbose("Getting moList from " +$handle.Name)
               $moList= Get-UcsMo -ClassId $ClassId -Ucs $handle
           
               Write-Verbose("Getting moList from reference UCS " +$refHandle.Name)
               $refMoList= Get-UcsMo -ClassId $ClassId -Ucs $refHandle
            } 
            else
            {
                if(!$PSBoundParameters.ContainsKey(("Dn")))
                {
                   $Dn= "sys"
                }

                if($Hierarchy)
                {
                    Write-Verbose("Getting moList from " +$handle.Name)
                    $moList= Get-UcsMo -Dn $Dn -Hierarchy -Ucs $handle
                    Write-Verbose("Getting moList from reference UCS " +$refHandle.Name)
                    $refMoList= Get-UcsMo -Dn $Dn -Hierarchy -Ucs $refHandle
                }
               else
                {
                    Write-Verbose("Getting moList from " +$handle.Name)
                    $moList= Get-UcsMo -Dn $Dn -Ucs $handle
                    Write-Verbose("Getting moList from reference UCS " +$refHandle.Name) 
                    $refMoList= Get-UcsMo -Dn $Dn -Ucs $refHandle
                }
            }
            Write-Verbose("Disconnecting Reference UCS...")
            Disconnect-Ucs -Ucs $refHandle
            Write-Verbose("Reference UCS Disconnected")

            Write-Verbose("Comparing reference UCS:"+$refHandle.Name+ "moList with UCS:" +$handle.Name+"moList")
            $diffMos= Compare-UcsManagedObject -ReferenceObject $moList -DifferenceObject $refMoList -ErrorAction SilentlyContinue
       
            if($diffMos -ne $null -and $diffMos.Count -gt 0)
            {
                Write-Verbose("Executing Sync-UcsManagedObject cmdlet.")
                if($DeleteNotPresent)
                {
                 $temp=   Sync-UcsManagedObject -Difference $diffMos -DeleteNotPresent -Ucs $handle -Force
                }
                else
                {
                  $temp= Sync-UcsManagedObject -Difference $diffMos -Ucs $handle -Force
                }
          
            }
            else
            {
                Write-Verbose("DiffCount is zero or null.")
            }

            Write-Verbose("Disconnecting Target UCS...")
            Disconnect-Ucs -Ucs $handle
            Write-Verbose("Target UCS Disconnected")

         }
         elseif($Ensure -eq "Absent" )
        {
            Write-Verbose("Ensure ='Absent'. No further processing required.")
        }
    }
    catch
    {
        Write-Verbose("Error occurred in Set-TargetResoucrce. Disconnecting UCS(s)...")
        if($handle -ne $null)
         {$temp = Disconnect-Ucs -Ucs $handle}

        if($refHandle -ne $null)
         {$temp = Disconnect-Ucs -Ucs $refHandle}
        throw
    }

    Write-Verbose("Completed execution of Set() method")
} 

function Test-TargetResource
{
[CmdletBinding()]
[OutputType([System.Boolean])]
param
(
        [parameter(Mandatory = $true)]
        [System.String]
        $Identifier,

        [parameter(Mandatory = $true)]
        [System.String]
        $UcsConnectionString,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $UcsCredentials,

        [parameter(Mandatory = $true)]
        [System.String]
        $RefUcsConnectionString,

        [parameter(Mandatory = $true)]
        [System.Management.Automation.PSCredential]
        $RefUcsCredentials,

        [System.String]
        $Dn,

        [System.String]
        $ClassId,

        [System.Boolean]
        $Hierarchy=$false,

        [ValidateSet("Present", "Absent")]
        [string]$Ensure = "Present",

        [System.Management.Automation.PSCredential]
        $WebProxyCredentials= $null,

        [System.UInt32[]]
        $DiffCount=0,

        [System.Boolean]
        $DeleteNotPresent=$false
)
        #Write-Debug "Use this cmdlet to write debug information while troubleshooting."
        Write-Verbose("Started execution of Test-TargetResource method")

        $result = [System.Boolean]
        try
        {
            if($Ensure -eq "Present")
            {
                if($PSBoundParameters.ContainsKey("ClassId"))
                {
                    $getTargetResult= Get-TargetResource  -Identifier $Identifier -UcsConnectionString $UcsConnectionString -UcsCredentials $UcsCredentials -RefUcsConnectionString $RefUcsConnectionString -RefUcsCredentials $RefUcsCredentials -WebProxyCredentials $WebProxyCredentials -ClassId $ClassId -DeleteNotPresent $DeleteNotPresent 
                }
                elseif( $PSBoundParameters.ContainsKey("Dn"))
                {
                    $getTargetResult= Get-TargetResource -Identifier $Identifier -UcsConnectionString $UcsConnectionString -UcsCredentials $UcsCredentials -RefUcsConnectionString $RefUcsConnectionString -RefUcsCredentials $RefUcsCredentials -WebProxyCredentials $WebProxyCredentials -Dn $Dn -DeleteNotPresent $DeleteNotPresent -Hierarchy $Hierarchy
                }
                else
                {
                    $getTargetResult= Get-TargetResource -Identifier $Identifier -UcsConnectionString $UcsConnectionString -UcsCredentials $UcsCredentials -RefUcsConnectionString $RefUcsConnectionString -RefUcsCredentials $RefUcsCredentials -WebProxyCredentials $WebProxyCredentials $Identifier -DeleteNotPresent $DeleteNotPresent -Hierarchy $Hierarchy
                }
                if($getTargetResult.Ensure -eq "Present")
                {
            
                        $result= $true
                }
                else
                {
            
                    $result= $false
                 }
             }
             else
             {
                 $result= $true
             }
         }
         catch
         {
            Write-Verbose("Error occurred in Test-TargetResoucrce. ")
            $result=$true
            throw
         }

        Write-Verbose("Completed execution of Test-TargetResource method")
      # Clear-UcsConnection

        Write-Verbose("Output: "+$result)
        return $result 
} 

# SIG # Begin signature block
# MIIeQAYJKoZIhvcNAQcCoIIeMTCCHi0CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAKgFvieKWAqG//
# RPFwrivFqsqn6yV4MMH4F9aVkrpjlqCCDIYwggXCMIIEqqADAgECAhAFsKypxaqA
# 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+pvBi1JlqpcHB8GSUgDGCERAwghEMAgEBMIGAMGwxCzAJBgNVBAYTAlVTMRUw
# EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
# KzApBgNVBAMTIkRpZ2lDZXJ0IEVWIENvZGUgU2lnbmluZyBDQSAoU0hBMikCEAWw
# rKnFqoDiB/Fu+bvQTDkwDQYJYIZIAWUDBAIBBQCggZowGQYJKoZIhvcNAQkDMQwG
# CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLgYKKwYB
# BAGCNwIBDDEgMB6gHIAaAFMAQQBTAEQALQBQAGgAMwAtADEAMAAyADIwLwYJKoZI
# hvcNAQkEMSIEIOy+He0vh+GieY8H9sOYxQSYpiP89LNc0iCwPaNJXfR+MA0GCSqG
# SIb3DQEBAQUABIIBADSzyMTOkzbBS2GpQGKcZK7TFQRYQ1nPHUQ7fpb+YUXpriSC
# eOo2vrkp1fZq5KkhhTnywNSOgLOSPdj9H7m61YAjeTLQ2T1L8iPGHwHGuDNM2PVr
# 1XOmZpOf9arwrmu92BjKHDX64Q1fWpfXo53PZ199kixeIAYcm6MIAqoSB63eO74B
# WmFtlYCThfMIrvpDeAKnWYRg7m1MRR30ixvZpCoQxiW2LN3/FlQp6ZXWLD2rmAXW
# nSGIy+zwGxHAzgzb+uGTywORtRY1Kn1imJ1kPH5gQqaOnGPQtUOkHmxaNkvGnCOR
# km6Fvh1xNCStXDDMd+ld/7rnUMcfkDQV2uIvXQuhgg7DMIIOvwYKKwYBBAGCNwMD
# ATGCDq8wgg6rBgkqhkiG9w0BBwKggg6cMIIOmAIBAzEPMA0GCWCGSAFlAwQCAQUA
# MIHxBgsqhkiG9w0BCRABBKCB4QSB3jCB2wIBAQYJYIZIhvpsCgMFMDEwDQYJYIZI
# AWUDBAIBBQAEIMsn/FaTrovsRG0S9claF7KhKU8ELI4aFM1/iSBMlD6LAgZdrm9A
# Ek0YEjIwMTkxMTA2MTkwNDE2LjY4WjAEgAIB9KB2pHQwcjELMAkGA1UEBhMCQ0Ex
# EDAOBgNVBAgTB09udGFyaW8xDzANBgNVBAcTBk90dGF3YTEWMBQGA1UEChMNRW50
# cnVzdCwgSW5jLjEoMCYGA1UEAxMfRW50cnVzdCBUaW1lIFN0YW1waW5nIEF1dGhv
# cml0eaCCCiQwggUJMIID8aADAgECAhEAq91nZfJa71AAAAAAVZHpDDANBgkqhkiG
# 9w0BAQsFADCBsjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4x
# KDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNV
# BAsTMChjKSAyMDE1IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
# b25seTEmMCQGA1UEAxMdRW50cnVzdCBUaW1lc3RhbXBpbmcgQ0EgLSBUUzEwHhcN
# MTgxMDA1MjAzMDI3WhcNMzAwMTA1MjEwMDI3WjByMQswCQYDVQQGEwJDQTEQMA4G
# A1UECBMHT250YXJpbzEPMA0GA1UEBxMGT3R0YXdhMRYwFAYDVQQKEw1FbnRydXN0
# LCBJbmMuMSgwJgYDVQQDEx9FbnRydXN0IFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5
# MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq72ujI9Cy5VZXGIn+UC4
# /1WiQEpl/9vtp6GIbkAaLtlr1UrtAVliVMRzFqPWhG7ugELqVQiYcBk/Jp7E1qao
# 66upJD0LV1hk/PDaGDLZsde6cwFLDpEx771ImonDguIJePOiGy6NzQ7vibN6uvIc
# mDOlcPh7TuwSCOyzn0+MS77XfIBnVv5cPgfahqIpQBswyo/NF0mi1OvNXlByGRlw
# RyudCuCAwykHASUkXM32BtQdEYbKNfYUpL+vbkGDKWuSf0SHjNuEUKCRvAlTf/Ss
# vsM3h6PESgsQM223AYPxxUdpnxTDz838fQEp40XOj5mOZKkNPIsg4gOGy1REQTe1
# 6QIDAQABo4IBVzCCAVMwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG
# AQUFBwMIMEEGA1UdIAQ6MDgwNgYKYIZIAYb6bAoDBTAoMCYGCCsGAQUFBwIBFhpo
# dHRwOi8vd3d3LmVudHJ1c3QubmV0L3JwYTAJBgNVHRMEAjAAMGgGCCsGAQUFBwEB
# BFwwWjAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYIKwYB
# BQUHMAKGJ2h0dHA6Ly9haWEuZW50cnVzdC5uZXQvdHMxLWNoYWluMjU2LmNlcjAx
# BgNVHR8EKjAoMCagJKAihiBodHRwOi8vY3JsLmVudHJ1c3QubmV0L3RzMWNhLmNy
# bDAfBgNVHSMEGDAWgBTDwnHSe9doBa47OZs0JQxiA8dXaDAdBgNVHQ4EFgQUIJB5
# 3ibLFdoHQvuKFQ1xnhloiCwwDQYJKoZIhvcNAQELBQADggEBAMSyYtmyy6moYNtB
# ptNAPWG9+u/3lLVIzW5y1YblGKmxQYmYrwQVq32r9RUCxGvAqUkoLVjXUwxZBzbO
# qgt46WXAxCMRNNTAapj7gfOsmGC09z4AdHCFcjC2wmkxWzwGbgT/QeRFlF5wilI7
# DsqHYWxASFYPHcEn6vJeYCD8hvo0V8Q/4qVKi7sG82sdCQJQ3fgXS9J0Iaz5n0n3
# 7ErYOlX5VenFj20iBFlKUz0dU6KqM3ttARW+fqW6n7JR3Xdx2LGC6ll9ja0+TUaM
# /jglp/yk3hO+/hDS8JY35Y8cqazT2GpupVbcJlrpX4HdkE+YaYhNz4KUqmL1nwTm
# /b9mmsIwggUTMIID+6ADAgECAgxY2hP/AAAAAFHODfcwDQYJKoZIhvcNAQELBQAw
# gbQxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5u
# ZXQvQ1BTXzIwNDggaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYD
# VQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRy
# dXN0Lm5ldCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAoMjA0OCkwHhcNMTUwNzIy
# MTkwMjU0WhcNMjkwNjIyMTkzMjU0WjCBsjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
# DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
# YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDE1IEVudHJ1c3QsIEluYy4gLSBmb3Ig
# YXV0aG9yaXplZCB1c2Ugb25seTEmMCQGA1UEAxMdRW50cnVzdCBUaW1lc3RhbXBp
# bmcgQ0EgLSBUUzEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZI+YU
# pOh8S4VxWPv4geZyi11Gw4gAHzjQiuHWblYw5a/aZFB9whM5+71mtNqE+4PQKB/L
# duhgUGmb885PE+LBPsHfEssyo/heRCIOzDrpjUm5YHTI3lQ9QV5DXyhGqaa3yhAr
# IrxbTVuMF2UShv0sd9XFoIzKwoPgR1d853CuYkUnMRgK1MCkGFVS92DGBEuz3Wgy
# bhAfNBG4Enhk8e6p4PfjsSKPNFply4r04UVQdN+Tl6Y05tBMO583SVKnU06fLmdc
# 7Zb8pb90UYjjqo692bEvX1AwFvRRYCJrmcv/4VQ7uftEOKUIOSObaUf6PMTQ56rf
# RrLs8ooZrCmyOJV1AgMBAAGjggEjMIIBHzASBgNVHRMBAf8ECDAGAQH/AgEAMA4G
# A1UdDwEB/wQEAwIBBjA7BgNVHSAENDAyMDAGBFUdIAAwKDAmBggrBgEFBQcCARYa
# aHR0cDovL3d3dy5lbnRydXN0Lm5ldC9ycGEwMwYIKwYBBQUHAQEEJzAlMCMGCCsG
# AQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAyBgNVHR8EKzApMCegJaAj
# hiFodHRwOi8vY3JsLmVudHJ1c3QubmV0LzIwNDhjYS5jcmwwEwYDVR0lBAwwCgYI
# KwYBBQUHAwgwHQYDVR0OBBYEFMPCcdJ712gFrjs5mzQlDGIDx1doMB8GA1UdIwQY
# MBaAFFXkgdERgL7YibkIozH5oSQJFrlwMA0GCSqGSIb3DQEBCwUAA4IBAQAdJOea
# dFuqcPyxDjFF1ywAf2Y6K6CaNKqsY22J+Z/fDXf9JCP8T5y3b4/z9B+2wf3WHMSM
# iGbBY426V3fTuBoeyFGtzGA2GodqKOoRZd7MPCyMdLfoUEPTzCjoFWwRKp8UlSnJ
# BVe1ZzboPKmD70HBIRbTfvctEUdmdmCCEmmMdlVzD98vS13pbCP4B/a1fdZpRZxY
# fWEu/HhLQ06JkUZELKBTqEWh9hZYu5ET8kvF3wvA564per1Fs+dwMOc0jut69tO1
# 0d5rE5lGs4vSTZN1tfFvv9wAKMIlv7zno2U07D8NHZeM+qqIIqQYNdsFjnbjEMgp
# j2PQrqwY2drEn1ESMYIDZDCCA2ACAQEwgcgwgbIxCzAJBgNVBAYTAlVTMRYwFAYD
# VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
# L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0g
# Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJjAkBgNVBAMTHUVudHJ1c3QgVGltZXN0
# YW1waW5nIENBIC0gVFMxAhEAq91nZfJa71AAAAAAVZHpDDANBglghkgBZQMEAgEF
# AKCCAWwwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEi
# BCB94rlGr61XQmtt+uWweajzUMzf0oubIvPMMR9TPjP3ADCCARsGCyqGSIb3DQEJ
# EAIMMYIBCjCCAQYwggECMIHnBBTA9ZQXZWnXgKsOz9/b4qnBr2RO3jCBzjCBuKSB
# tTCBsjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNV
# BAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChj
# KSAyMDE1IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEm
# MCQGA1UEAxMdRW50cnVzdCBUaW1lc3RhbXBpbmcgQ0EgLSBUUzECEQCr3Wdl8lrv
# UAAAAABVkekMMBYEFJeenaf3liM/IQyO7RZt7zYEDEaOMA0GCSqGSIb3DQEBCwUA
# BIIBAJ3SqKYKjNtxm4bz6smQ0IMTGyP/OtrIqDcy/HL9GNSWCqUx+upzkqbGzHEt
# lm86sozbT/7Wf1AIfeGxcpOMxIfF65lrYaeUN7RZZDwe8NLgJT4KJW9P1yXEtT2e
# BOET37JzrtOSn5t1lQ9MofdrFCN1GOY5IzwylG2ELcCviwbzNjYHQuOKiJQRfdyl
# xs8HuDyvAORuotbfznVoX+/5eA88RKzlIVIKNMkErDYEq2FxyzkgVZnnkRUw0r9d
# DJpRTtSYoZ+mCX/DkhgpxuKLMOCqQjOHMziJsZ+fW8qh5eI+wPKR60RAlUgXdv24
# UE/iiaCxXcoWvdXGtwZNm3kZdow=
# SIG # End signature block