Obs/bin/ObsDep/content/Powershell/Roles/Common/CompleteBootDSC.ps1

$waitForTimeSyncScript = "$PSScriptRoot\WaitForTimeSyncBeforeDSC.ps1"
if (Test-Path $waitForTimeSyncScript)
{
    # Wait for time on this machine to syncrhonize before we begin the boot-time DSC process.
    # This ensures that our transcript times don't get messed up by clock changes during this time.
    & $waitForTimeSyncScript
}

$logFile = "$env:windir\SetupComplete.log"
Start-Transcript -Path $logFile -Append

function Trace-Execution
{
    param(
        [Parameter(ValueFromPipeline=$true)]
        [string] $message,
        $ForegroundColor = "White")

    Process {
        if ($message)
        {
            "$message - $([DateTime]::Now.ToString())" | Write-Host
        }
    }
}

Trace-Execution "Starting CompleteBootDSC"

function Start-WaitForLCM
{
    $ErrorActionPreference = 'Stop'
    $waitingForLCM = $true
    $maxRetryCount = 180  # 180 retries X once every 10 seconds = 30 minutes
    $currentIteration = 1

    Trace-Execution "Waiting for LCM"
    while ($waitingForLCM) {
        Trace-Execution "Attempt# $currentIteration"
        $lcmStatus = Get-DscLocalConfigurationManager
        if (($lcmStatus.LCMState -like 'Idle') -or ($lcmStatus.LCMState -like 'PendingConfiguration')) {
            $waitingForLCM = $false
        }
        else
        {
            if($currentIteration -ge $maxRetryCount)
            {
                Trace-Execution "LCM did not reach a stable state after $currentIteration attempts."
                return $false
            }
            Trace-Execution "Waiting 10 seconds for LCM to stabilize"
            sleep 10
        }
        $currentIteration++
    }
    Trace-Execution "LCM Ready"
    return $true
}

function Start-DSCWithCatch
{
    param(
        [CimSession]$CimSession
    )

    # WINRM may restart and fail the connection used use by Start-DscConfiguration.
    # It will continue processing in the background, but Get-DscConfiguration will need to
    # wait for it to finish.
    try
    {
        # Log redirection through DCOM is minimal, unfortunately.
        Start-DscConfiguration -CimSession $CimSession -Force -Wait -UseExisting -Verbose -ErrorAction Stop *>&1 | Trace-Execution
        return $true
    }
    catch
    {
        # If an exception is encountered, wait until LCM is done processing the configuration in the background,
        # and then check whether it succeeded.
        Trace-Execution "*** Start-DscConfiguration threw exception '$_'. This may be expected due to WinRM restarts. Wait for LCM to stabilize."
        $lcmReady = Start-WaitForLCM
        Trace-Execution "LCM ready: $lcmReady"
        Trace-Execution "Testing DSC configuration."
        $result = Test-DscConfiguration -Detailed -Verbose
        Trace-Execution "Converged resources: $(Get-ResourceListAsString $result.ResourcesInDesiredState)"
        Trace-Execution "Unconverged resources: $(Get-ResourceListAsString $result.ResourcesNotInDesiredState)"
        return $result.InDesiredState
    }
}

<#
.Synopsis
    Writes DSC status file at the specified location
.Parameter TargetFolderPath
    Target folder where the DSC status file will be written
.Parameter Version
    Current version being deployed or the version to which the stamp is being updated.
    The name of the status file will contain the version to detect completion of DSC.
.Parameter Status
    Status of CompleteBootDSC script.
#>


function Write-DscStatusFile
{
    param(
        [Parameter(Mandatory)]
        [System.Xml.XmlElement] $TargetPaths,

        [Parameter(Mandatory)]
        [string] $Version,

        [Parameter(Mandatory)]
        [ValidateSet("Started", "Completed", "Failed")]
        [string] $Status,

        [Parameter(Mandatory = $false)]
        [object[]] $ResourcesNotInDesiredState
    )

    $fileName = $env:COMPUTERNAME + "." + $Version + ".xml"
    $filePath = Join-Path -Path $TargetPaths.TargetShare.PrimaryPath -ChildPath $fileName
    Trace-Execution "DSC status file will be written at: $filePath"
    $fileDirectory = Split-Path $filePath
    if (-not (Test-Path $fileDirectory))
    {
        Trace-Execution "Creating directory for the status file: $fileDirectory"
        New-Item -Type Directory -Path $fileDirectory -Force | Out-Null
    }

    Add-Type -AssemblyName System.Xml.Linq

    $xml = [System.Xml.Linq.XElement]::new("DeploymentDSC", [System.Xml.Linq.XElement]::new("Status", $Status))

    if ($ResourcesNotInDesiredState -and $ResourcesNotInDesiredState.Length -gt 0)
    {
        $childElement = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]"ResourcesNotInDesiredState")

        foreach ($resource in $ResourcesNotInDesiredState)
        {
            $childElement.Add([System.Xml.Linq.XElement]::new("ResourceId", $resource.ResourceId))
        }

        $xml.Add($childElement)
    }

    $xml.Save($filePath)
}

function Get-ResourceListAsString
{
    param
    (
        [object[]]$Resources
    )

    if ($Resources)
    {
        return ( ($Resources | % { "$($_.ConfigurationName): $($_.ResourceId)" }) -join ", " )
    }

    return [string]::Empty
}

# Apply settings to the LCM
function Set-LcmMetaConfig
{
    param
    (
        [string[]] $PartialConfigs
    )

    Trace-Execution "Importing $PSScriptRoot\DscMetaConfig.psm1"
    Import-Module "$PSScriptRoot\DscMetaConfig.psm1" -Force

    $metaMofPath = Join-Path -Path $env:temp -ChildPath 'lcm'
    New-Item -Path $metaMofPath -ItemType Directory -Force -ErrorAction SilentlyContinue
    Remove-Item $metaMofPath\localhost.meta.mof -Force -ErrorAction SilentlyContinue
    Trace-Execution "*** Generating LCM configuration"
    $null = MetaMof -OutputPath $metaMofPath -CredentialEncryptionThumbprint $encryptionCert.ThumbPrint -PartialConfigList $PartialConfigs
    $lcmConfig = $false
    do {
        try
        {
            Trace-Execution "*** Setting LCM configuration from $metaMofPath"
            Set-DscLocalConfigurationManager -Path $metaMofPath -Force -ErrorAction Stop
            $lcmConfig = $true
        }
        catch
        {
            $errorMessage = $_.Exception.ToString()
            Trace-Execution "Error setting LCM configuration : '$errorMessage'"
            Start-Sleep 60
        }
    } until ($lcmConfig)
}

$ErrorActionPreference = 'Stop'

try {
    $partialConfigListFileName = "c:\DSCConfigs\DscPartialConfigList.xml"

    # wait for up to 5 minutes for WinRM service to start on it's own
    $retryCount = 0
    do
    {
        $retryCount++
        try
        {
            Trace-Execution "Getting WinRM service, attempt $retryCount"
            $getWinRM = (Get-Service -Name WinRM -ErrorAction Stop).Status
            Trace-Execution "WinRM service status is $getWinRM"
            if ($getWinRM -ne 'Running')
            {
                Start-Sleep -Seconds 15
            }
        }
        catch
        {
            $errorMessage = $_.Exception.Message
            Trace-Execution "Error getting WinRM service : '$errorMessage'"
            Start-Sleep -Seconds 15
        }
    } until (($getWinRM -eq 'Running') -or ($retryCount -ge 20))

    # if WinRM service isn't started after 5 minutes, attempt to start it
    $retryCount = 0
    while ((Get-Service -Name WinRM -ErrorAction SilentlyContinue).Status -ne 'Running')
    {
        $retryCount++
        try
        {
            Trace-Execution "Starting WinRM service, attempt $retryCount"
            Start-Service -Name WinRM -ErrorAction Stop
        }
        catch
        {
            $errorMessage = $_.Exception.Message
            Trace-Execution "Error starting WinRM service : '$errorMessage'"
            Start-Sleep 60
        }
    }

    # Get the configuration file with the information needed to generate the DSC status file
    $configFile = "C:\DscConfigs\CompleteBootDscStatusConfig.xml"
    Trace-Execution "Extracting data from configuration file present at: $configFile"
    $content = [xml] (Get-Content -Path $configFile)

    # Define the path of the file where the status will be defined
    $targetFolderPaths = $content.Configuration.TargetShares
    $version = $content.Configuration.Version

    # Boot-time DSC configuration for hosts sets up the vSwitches, so prior to the convergence of
    # those resources hosts have no network connectivity. We skip attempting to write the initial
    # 'Started' status for hosts because it will always fail.
    if (Test-Path $partialConfigListFileName)
    {
        $isHostDscConfig = Get-Item $partialConfigListFileName | Select-String -SimpleMatch "NewComputeBootstrapDscConfiguration"
    }

    if ($isHostDscConfig)
    {
        Trace-Execution "Not writing initial DSC status for a host configuration, because host networking has not been configured yet."
    }
    else
    {
        Trace-Execution "Trying to write DSC status file with status: Started"
        Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status Started
    }

    Trace-Execution "Installing DSC Configuration decryption certificate"

    # This code is structured to be idempotent, partly for debugging and partly because a one-node POC
    # host will already have the certificates installed, because it is where the deployment collateral
    # runs.
    # Import the cert necessary for verifying DSC MOF signatures.
    $signingCert = Get-ChildItem Cert:\LocalMachine\My | % {if ($_.Subject -like '*DscSigningCert*') {$_}}
    $encryptionCert = Get-ChildItem Cert:\LocalMachine\My | % {if ($_.Subject -like '*DscEncryptionCert*') {$_}}
    $certPasswordPlaintext = Get-Content -Path c:\DSCConfigs\DscCertPassword.txt -ErrorAction SilentlyContinue
    if ($certPasswordPlaintext -ne $null)
    {
        $certPassword = $certPasswordPlaintext | ConvertTo-SecureString -AsPlainText -Force

        # Import the cert necessary for verifying DSC MOF signatures.
        if (-not $signingCert)
        {
            # This can loop indefinitely since deployment will fail on timeout if the certificate is not imported.
            # We need to retry here since the certificate is not always immediately available from Cert:\ path after import.
            do
            {
                Trace-Execution "Installing DSC Configuration signature verification certificate"
                try
                {
                    Import-PfxCertificateSafe -FilePath c:\DSCConfigs\DscSigning.pfx `
                                        -CertStoreLocation Cert:\LocalMachine\My `
                                        -Password $certPassword `
                                        -Exportable `
                                        -ErrorAction Stop
                    $signingCert = Get-ChildItem Cert:\LocalMachine\My | % {if ($_.Subject -like '*DscSigningCert*') {$_}}
                }
                catch
                {
                    Trace-Execution "Failed to import DSC Configuration signature verification certificate due to '$_'."
                }
                finally
                {
                    if (-not $signingCert)
                    {
                        Trace-Execution "Failed to find DSC signature verification certificate, will retry in 10 seconds"
                        Start-Sleep -Seconds 10
                    }
                }
            } until ($signingCert)
            Trace-Execution "Deleting DSC signature verification cert files"
            Remove-Item -Path c:\DSCConfigs\DscSigning.pfx -Force
        }

        # Import the cert necessary for decrypting creds in DSC MOFs.
        if (-not $encryptionCert)
        {
            # This can loop indefinitely since deployment will fail on timeout if the certificate is not imported.
            # We need to retry here since the certificate is not always immediately available from Cert:\ path after import.
            do
            {
                try
                {
                    Trace-Execution "Installing DSC Configuration decryption certificate"
                    Import-PfxCertificateSafe -FilePath c:\DSCConfigs\DscEncryption.pfx `
                                        -CertStoreLocation Cert:\LocalMachine\My `
                                        -Password $certPassword `
                                        -Exportable `
                                        -ErrorAction Stop
                    $encryptionCert = Get-ChildItem Cert:\LocalMachine\My | % {if ($_.Subject -like '*DscEncryptionCert*') {$_}}
                }
                catch
                {
                    Trace-Execution "Failed to import DSC Configuration decryption certificate"
                }
                finally
                {
                    if (-not $encryptionCert)
                    {
                        Trace-Execution "Failed to find DSC decryption certificate, will retry in 10 seconds"
                        Start-Sleep -Seconds 10
                    }
                }
            } until ($encryptionCert)
            Trace-Execution "Deleting DSC Configuration decryption cert files"
            Remove-Item -Path c:\DSCConfigs\DscEncryption.pfx -Force
        }
        Remove-Item -Path c:\DSCConfigs\DscCertPassword.txt -Force
    }

    if (-not $encryptionCert)
    {
        Trace-Execution "Failed to find DSC Signing Certificate"
        throw
    }

    Trace-Execution "Reexporting public key for LCM configuration"
    $encryptionCert | Export-Certificate -FilePath c:\DSCConfigs\DscDecryption.cer -Force

    $partialConfigList = @()
    $partialConfigListFile = Get-ChildItem -Path $partialConfigListFileName -ErrorAction SilentlyContinue
    $partialConfigListFileContent = $null
    if ($partialConfigListFile)
    {
        $partialConfigListFileContent = [xml](Get-Content -Path $partialConfigListFile)
        $partialConfigList = [array] ($partialConfigListFileContent.PartialConfigurations.PartialConfiguration.Name)
        Trace-Execution "Read list of $($partialConfigList.Count) partial configs: $($partialConfigList -join ',')"
    }

    Trace-Execution "Configuring LCM without enabling partial configurations."
    Set-LcmMetaConfig -PartialConfigs @()

    # Use DCOM for invoke the Start-DscConfiguration to avoid complications with WINRM restarting during JEA resources.
    $opt = New-CimSessionOption -Protocol Dcom
    $session = New-CimSession -ComputerName localhost -SessionOption $opt

    # Don't call DSC via WINRM between the Publish and when configuration is complete.
    # After publishing configurations, DSC configuration may auto-start on a timer.
    # When configurations re-start WINRM, calls to DSC through WINRM may cause a dead-lock.

    # If starting the DSC configs in this secion fails, we will make one final attempt below
    # to re-converge them before failing the overall action.

    Trace-Execution "*** Publishing DSC configurations in C:\DSCConfigs"

    # If there are partial configurations, publish them all. If not, just apply them serially.
    if ($partialConfigListFile)
    {
        $availablePhases = [array] (($partialConfigListFileContent.PartialConfigurations.PartialConfiguration.Phase) | Select-Object -Unique | Sort-Object)
        $publishedPhaseCount = 0
        foreach($phase in $availablePhases)
        {
            Trace-Execution "Get list of partial configurations in phase: $phase"
            $selectedPartials = $partialConfigListFileContent.PartialConfigurations.PartialConfiguration | Where-Object {$_.Phase -eq $phase}
            $partialsForCurrentPhase = $selectedPartials.Name
            Trace-Execution "Configurations for this phase: $($partialsForCurrentPhase -join ',')"

            foreach ($configName in $partialsForCurrentPhase)
            {
                $publishedPhaseCount++
                if ($publishedPhaseCount -eq $availablePhases.Count)
                {
                    Trace-Execution "Configuration for all phases has been published. Setting marker file."
                    New-Item -Type File -Name dsc.published -Path C:\DSCConfigs -Force | Out-Null
                }

                $configDirectory = Get-ChildItem "C:\DSCConfigs" -Directory | Where-Object Name -eq $configName
                if ($configDirectory)
                {
                    Trace-Execution "Publishing configuration $configName from directory $($configDirectory.FullName)"
                    Publish-DscConfiguration -Path $configDirectory.FullName -Force -ErrorAction Stop

                    Trace-Execution "Applying configuration $configName"
                    $result = Start-DSCWithCatch -CimSession $session
                    Trace-Execution "Result of applying DSC for phase $($phase) and configuration $($configName): $result"
                }
                else
                {
                    Trace-Execution "Configuration $configName is defined in $partialConfigListFileName but is not present under C:\DSCConfigs"
                }
            }
        }
    }
    else
    {
        $partialDirs = Get-ChildItem C:\DSCConfigs -Directory
        foreach ($partialDir in $partialDirs)
        {
            Trace-Execution "*** Applying DSC configuration from $($partialDir.FullName)"
            Publish-DscConfiguration -Path $partialDir.FullName -Force -ErrorAction Stop
            $result = Start-DSCWithCatch -CimSession $session
            Trace-Execution "Result of applying DSC for directory $($partialDir.FullName): $result"
        }
    }

    $lcmStatusResult = Start-WaitForLCM
    if($lcmStatusResult -eq $false)
    {
        Trace-Execution "Failed to find LCM in acceptable state. Trying to write status file to orchestrator(s)."
        Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status Failed
        return
    }

    Trace-Execution "*** DSC configuration complete"

    Trace-Execution "*** Checking for errors from Get-WinEvent -LogName 'Microsoft-Windows-DSC/Operational' | Sort-Object -Property TimeCreated"
    $evt = Get-WinEvent -LogName "Microsoft-Windows-DSC/Operational" | Sort-Object -Property TimeCreated
    [object[]] $dscErrors = $evt | Where-Object { $_.LevelDisplayName -eq "Error" }
    Trace-Execution "$($dscErrors.Count) errors processing initial DSC configuration. See event log."
    $dscErrors | Format-List TimeCreated, Message

    # At this point WinRM should be stable.
    Trace-Execution "*** Testing whether DSC configuration is in expected states."
    $t = Test-DscConfiguration -Verbose -Detailed

    if(($t -eq $null) -or ($t.InDesiredState -eq $false))
    {
        Trace-Execution "*** Some resources are not in the desired state. Attempt to mitigate by running Start-DscConfiguration again."
        $result = Start-DSCWithCatch -CimSession $session
        Trace-Execution "Result of last DSC convergence attempt: $result"
        Trace-Execution "*** Testing whether DSC configuration is in expected states."
        $t = Test-DscConfiguration -Verbose -Detailed
    }

    Trace-Execution "*** DSC results:"
    Trace-Execution "In desired state: $($t.InDesiredState)"
    Trace-Execution "ResourcesInDesiredState: $(Get-ResourceListAsString $t.ResourcesInDesiredState)"
    Trace-Execution "ResourcesNotInDesiredState: $(Get-ResourceListAsString $t.ResourcesNotInDesiredState)"

    # Allow deployment to detect that the machine has finished processing DSC.
    # By this point, the host has been brought to the state expected by both Wait-BareMetalDeployment and Wait-VirtualNetwork.

    if($null -eq $t)
    {
        Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status "Failed"
    }
    elseif ($t.InDesiredState -eq $false)
    {
        Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status "Failed" -ResourcesNotInDesiredState $t.ResourcesNotInDesiredState
    }
    else
    {
        Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status "Completed"
    }

    Trace-Execution "Resetting LCM to not use Partial Configuration mode."
    Set-LcmMetaConfig -PartialConfigs @()
}
catch
{
    # Attempt to write the DSC status file so the orchestrator has a chance to fail fast rather than timing out.
    Trace-Execution "Encountered an exception during boot-time DSC execution: $_"
    Write-DscStatusFile -TargetPaths $targetFolderPaths -Version $version -Status Failed
    throw
}
finally
{
    $session | Remove-CimSession -ErrorAction Ignore
    Trace-Execution "***CompleteBootDSC.ps1 complete***"
    Stop-Transcript -ErrorAction Ignore
}
# SIG # Begin signature block
# MIInvwYJKoZIhvcNAQcCoIInsDCCJ6wCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBc0apg1mDx1TiH
# C1b6p9flh/dYCKhMmTYuIagIsATYraCCDXYwggX0MIID3KADAgECAhMzAAADTrU8
# esGEb+srAAAAAANOMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjMwMzE2MTg0MzI5WhcNMjQwMzE0MTg0MzI5WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDdCKiNI6IBFWuvJUmf6WdOJqZmIwYs5G7AJD5UbcL6tsC+EBPDbr36pFGo1bsU
# p53nRyFYnncoMg8FK0d8jLlw0lgexDDr7gicf2zOBFWqfv/nSLwzJFNP5W03DF/1
# 1oZ12rSFqGlm+O46cRjTDFBpMRCZZGddZlRBjivby0eI1VgTD1TvAdfBYQe82fhm
# WQkYR/lWmAK+vW/1+bO7jHaxXTNCxLIBW07F8PBjUcwFxxyfbe2mHB4h1L4U0Ofa
# +HX/aREQ7SqYZz59sXM2ySOfvYyIjnqSO80NGBaz5DvzIG88J0+BNhOu2jl6Dfcq
# jYQs1H/PMSQIK6E7lXDXSpXzAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUnMc7Zn/ukKBsBiWkwdNfsN5pdwAw
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzUwMDUxNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAD21v9pHoLdBSNlFAjmk
# mx4XxOZAPsVxxXbDyQv1+kGDe9XpgBnT1lXnx7JDpFMKBwAyIwdInmvhK9pGBa31
# TyeL3p7R2s0L8SABPPRJHAEk4NHpBXxHjm4TKjezAbSqqbgsy10Y7KApy+9UrKa2
# kGmsuASsk95PVm5vem7OmTs42vm0BJUU+JPQLg8Y/sdj3TtSfLYYZAaJwTAIgi7d
# hzn5hatLo7Dhz+4T+MrFd+6LUa2U3zr97QwzDthx+RP9/RZnur4inzSQsG5DCVIM
# pA1l2NWEA3KAca0tI2l6hQNYsaKL1kefdfHCrPxEry8onJjyGGv9YKoLv6AOO7Oh
# JEmbQlz/xksYG2N/JSOJ+QqYpGTEuYFYVWain7He6jgb41JbpOGKDdE/b+V2q/gX
# UgFe2gdwTpCDsvh8SMRoq1/BNXcr7iTAU38Vgr83iVtPYmFhZOVM0ULp/kKTVoir
# IpP2KCxT4OekOctt8grYnhJ16QMjmMv5o53hjNFXOxigkQWYzUO+6w50g0FAeFa8
# 5ugCCB6lXEk21FFB1FdIHpjSQf+LP/W2OV/HfhC3uTPgKbRtXo83TZYEudooyZ/A
# Vu08sibZ3MkGOJORLERNwKm2G7oqdOv4Qj8Z0JrGgMzj46NFKAxkLSpE5oHQYP1H
# tPx1lPfD7iNSbJsP6LiUHXH1MIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg
# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03
# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr
# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg
# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy
# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9
# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh
# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB
# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn
# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90
# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w
# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o
# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa
# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG
# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG
# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl
# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb
# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l
# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6
# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0
# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560
# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam
# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa
# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
# /Xmfwb1tbWrJUnMTDXpQzTGCGZ8wghmbAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBIDIwMTECEzMAAANOtTx6wYRv6ysAAAAAA04wDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIGeRR6jaG2U0Qxb3whBaCYoG
# W4Q+vE3CYBSPcA2IBsI5MEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggEAu1FK9apckRRb5natw/bejl1P0AiT3Zzdu/g/icB8gPlctA349PGS2Ogv
# hknyCN+zmPlf4GE97sjylFQJBYJRkSrgbXRgHrohFeCqeLt+Os3k+Q9aON0IMb11
# EbdbkVADmwivyISxadKUZD6d1wjxuhEQHGFz/DR+wU8EmgCMVOjpJx0xvHE+fxFr
# LAuTVZeQ4NYzBOSRh8adCgLMKvMwi/aIkHLMuwQcmiA2QJGcO72q6s5KFnCMrbsw
# wvNnZZ6nFFashXxXKZRv6pwiWg9uLSwXdcrI+ZMtxJ65HbbVLAtvrdGYqDU8mqTV
# A+JoEd97pod4fy2PhmnHACeop/EwfKGCFykwghclBgorBgEEAYI3AwMBMYIXFTCC
# FxEGCSqGSIb3DQEHAqCCFwIwghb+AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFZBgsq
# hkiG9w0BCRABBKCCAUgEggFEMIIBQAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
# AwQCAQUABCDnRJmul/onXXF7ecvt5qE8cVDKzr4lAWor9Zw52hnZjQIGZMmLFtss
# GBMyMDIzMDgwNzIxMzMzOC4yNTVaMASAAgH0oIHYpIHVMIHSMQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
# bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNO
# OjhENDEtNEJGNy1CM0I3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT
# ZXJ2aWNloIIReDCCBycwggUPoAMCAQICEzMAAAGz/iXOKRsbihwAAQAAAbMwDQYJ
# KoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjIw
# OTIwMjAyMjAzWhcNMjMxMjE0MjAyMjAzWjCB0jELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3Bl
# cmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjo4RDQxLTRC
# RjctQjNCNzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCC
# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALR8D7rmGICuLLBggrK9je3h
# JSpc9CTwbra/4Kb2eu5DZR6oCgFtCbigMuMcY31QlHr/3kuWhHJ05n4+t377PHon
# dDDbz/dU+q/NfXSKr1pwU2OLylY0sw531VZ1sWAdyD2EQCEzTdLD4KJbC6wmACon
# iJBAqvhDyXxJ0Nuvlk74rdVEvribsDZxzClWEa4v62ENj/HyiCUX3MZGnY/AhDya
# zfpchDWoP6cJgNCSXmHV9XsJgXJ4l+AYAgaqAvN8N+EpN+0TErCgFOfwZV21cg7v
# genOV48gmG/EMf0LvRAeirxPUu+jNB3JSFbW1WU8Z5xsLEoNle35icdET+G3wDNm
# cSXlQYs4t94IWR541+PsUTkq0kmdP4/1O4GD54ZsJ5eUnLaawXOxxT1fgbWb9VRg
# 1Z4aspWpuL5gFwHa8UNMRxsKffor6qrXVVQ1OdJOS1JlevhpZlssSCVDodMc30I3
# fWezny6tNOofpfaPrtwJ0ukXcLD1yT+89u4uQB/rqUK6J7HpkNu0fR5M5xGtOch9
# nyncO9alorxDfiEdb6zeqtCfcbo46u+/rfsslcGSuJFzlwENnU+vQ+JJ6jJRUrB+
# mr51zWUMiWTLDVmhLd66//Da/YBjA0Bi0hcYuO/WctfWk/3x87ALbtqHAbk6i1cJ
# 8a2coieuj+9BASSjuXkBAgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQU0BpdwlFnUgwY
# izhIIf9eBdyfw40wHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYD
# VR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j
# cmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwG
# CCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIw
# MjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcD
# CDAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAFqGuzfOsAm4wAJf
# ERmJgWW0tNLLPk6VYj53+hBmUICsqGgj9oXNNatgCq+jHt03EiTzVhxteKWOLoTM
# x39cCcUJgDOQIH+GjuyjYVVdOCa9Fx6lI690/OBZFlz2DDuLpUBuo//v3e4Kns41
# 2mO3A6mDQkndxeJSsdBSbkKqccB7TC/muFOhzg39mfijGICc1kZziJE/6HdKCF8p
# 9+vs1yGUR5uzkIo+68q/n5kNt33hdaQ234VEh0wPSE+dCgpKRqfxgYsBT/5tXa3e
# 8TXyJlVoG9jwXBrKnSQb4+k19jHVB3wVUflnuANJRI9azWwqYFKDbZWkfQ8tpNoF
# fKKFRHbWomcodP1bVn7kKWUCTA8YG2RlTBtvrs3CqY3mADTJUig4ckN/MG6AIr8Q
# +ACmKBEm4OFpOcZMX0cxasopdgxM9aSdBusaJfZ3Itl3vC5C3RE97uURsVB2pvC+
# CnjFtt/PkY71l9UTHzUCO++M4hSGSzkfu+yBhXMGeBZqLXl9cffgYPcnRFjQT97G
# b/bg4ssLIFuNJNNAJub+IvxhomRrtWuB4SN935oMfvG5cEeZ7eyYpBZ4DbkvN44Z
# vER0EHRakL2xb1rrsj7c8I+auEqYztUpDnuq6BxpBIUAlF3UDJ0SMG5xqW/9hLMW
# naJCvIerEWTFm64jthAi0BDMwnCwMIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJ
# mQAAAAAAFTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNh
# dGUgQXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1
# WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD
# Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEB
# BQADggIPADCCAgoCggIBAOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjK
# NVf2AX9sSuDivbk+F2Az/1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhg
# fWpSg0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJp
# rx2rrPY2vjUmZNqYO7oaezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/d
# vI2k45GPsjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka9
# 7aSueik3rMvrg0XnRm7KMtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKR
# Hh09/SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9itu
# qBJR6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyO
# ArxCaC4Q6oRRRuLRvWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItb
# oKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6
# bMURHXLvjflSxIUXk8A8FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6t
# AgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQW
# BBQqp1L+ZMSavoKRPEY1Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacb
# UzUZ6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYz
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku
# aHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIA
# QwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2
# VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu
# bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEw
# LTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYt
# MjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/q
# XBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6
# U03dmLq2HnjYNi6cqYJWAAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVt
# I1TkeFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis
# 9/kpicO8F7BUhUKz/AyeixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTp
# kbKpW99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0
# sHrYUP4KWN1APMdUbZ1jdEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138e
# W0QBjloZkWsNn6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJ
# sWkBRH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7
# Fx0ViY1w/ue10CgaiQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0
# dFtq0Z4+7X6gMTN9vMvpe784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQ
# tB1VM1izoXBm8qGCAtQwggI9AgEBMIIBAKGB2KSB1TCB0jELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxh
# bmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjo4
# RDQxLTRCRjctQjNCNzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
# dmljZaIjCgEBMAcGBSsOAwIaAxUAcYtE6JbdHhKlwkJeKoCV1JIkDmGggYMwgYCk
# fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD
# Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUFAAIF
# AOh7SQswIhgPMjAyMzA4MDcxODQyMTlaGA8yMDIzMDgwODE4NDIxOVowdDA6Bgor
# BgEEAYRZCgQBMSwwKjAKAgUA6HtJCwIBADAHAgEAAgIZDzAHAgEAAgITHzAKAgUA
# 6HyaiwIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAID
# B6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBAJDniY8XqSf7FsqlT5Oe
# XNjXFjIq/GoxOEMJtJurJQdYKSJyNQGkm6Lxd6VJGVnXBfljWN/kgGyJxey4hW6A
# XBnRnStLn/+Vh8KblUhKBv6vxvpTUsf2q3ZTluXgPeN3DenVCDRcq5dF3mZXzXkT
# V/gCmj2XysONsdEU0fl3lfYZMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt
# U3RhbXAgUENBIDIwMTACEzMAAAGz/iXOKRsbihwAAQAAAbMwDQYJYIZIAWUDBAIB
# BQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQx
# IgQgbz8uBw0BJSq4drKCRaW9jiYW6cq8zP5CYEYEIow/pUEwgfoGCyqGSIb3DQEJ
# EAIvMYHqMIHnMIHkMIG9BCCGoTPVKhDSB7ZG0zJQZUM2jk/ll1zJGh6KOhn76k+/
# QjCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABs/4l
# zikbG4ocAAEAAAGzMCIEIL4fCYXemT1zpynEodxnVgjKJ4pgNACPGbrbesO/xloB
# MA0GCSqGSIb3DQEBCwUABIICACedjLNWcuNXmhJ30CdJRzMhHPy8jwIQZ3bI0T4p
# hieZDTmpPNUui4LwhmXFUbuL0HWG8szVYH2/yDJbHsDY7sITNSEHO+jLSiJvA8k8
# OkRQwEbnbPYW5Z45SYydvzZp+ScAe0UcXqV4vmjjbNS0DMK0kLOMuLyQZY9QTV8q
# 9fd+PTu3STDdKKpy0m9AbxH8JEA/c4iwWu4YfzOCcgADYLzf1pqkD3O9ZpYiU3zu
# SE/xMlrB0VgKevKGvNO9qRvC/gF/bV9NrmevjpB6eCIMQghKr6Tq3m1sc6xz0tat
# +JlUuCQUGlUJxt7JKQawVe/NBqB5gfAjaSHSFamFt78Enpe8Cq4WesQVV0nn+7sO
# JXh2rnC0jLPQx2pAkPPYyBCAAQu9aXSqsNyXtvSk9PN7ZP0WXpAluMPDHt/kNNsP
# j9O9pu3fE2bHRgwnJeI0NhF1qSknlwcbj4zuK8io30+btY97BEYBupXIYB+WgBjT
# /MeepcVasQJz1y2aGcf9nlDHoJPU/jZkw1XLcZxUOD23x4lRk2L0aqY8r58cFCU6
# GYk6yu3kzEHPX13mNPc6nkaz/gO9SN4jA+o4+j8Ki/O3tJTKcThwtH7mPG9Slsot
# TlH7KNQFv9p5wLqhyQutP1vE6LqaBpP/GBeAL0WVTorRVGNVt8fQOT2m5B07e1W3
# 8/gG
# SIG # End signature block