AzStackHciNetworkSLB/AzStackHci.NetworkSLB.psm1

<#############################################################
 # #
 # Copyright (C) Microsoft Corporation. All rights reserved. #
 # #
 #############################################################>




<#
Import-Module $PSScriptRoot\AzStackHci.NetworkSLB.Helpers.psm1 -DisableNameChecking -Global
.SYNOPSIS
    Validates the Software Load Balancer (SLB) network configuration for Azure Stack HCI environments.
 
.DESCRIPTION
    The Invoke-AzStackHciNetworkSLBValidation function runs a set of validation tests on the SLB network configuration using provided parameters. It supports multiple operation types (DeploySLB, ScaleOutSLB, ScaleInSLB, PostSLB, PreUpdate, PostUpdate, AddNode) and generates logs and reports for the validation process.
 
.PARAMETER Parameters
    The environment configuration parameters required for validation.
 
.PARAMETER OperationType
    Indicates the operation type. Valid values are 'DeploySLB', 'ScaleOutSLB', 'ScaleInSLB', 'PostSLB', 'PreUpdate', 'PostUpdate', 'AddNode'.
 
.PARAMETER PSSession
    PowerShell session(s) used to perform the validation.
 
.PARAMETER PassThru
    If specified, returns the PSObject result instead of writing output to the console.
 
.PARAMETER Include
    Specifies which tests to include in the validation.
 
.PARAMETER Exclude
    Specifies which tests to exclude from the validation.
 
.PARAMETER HardwareClass
    Specifies the hardware class for the environment. Valid values are 'Small', 'Medium', or 'Large'. Default is 'Medium'.
 
.PARAMETER ClusterPattern
    Specifies the cluster pattern for the environment. Valid values are 'Standard', 'Stretch', or 'RackAware'. Default is 'Standard'.
 
.PARAMETER OutputPath
    Directory path for log and report output.
 
.PARAMETER CleanReport
    If specified, removes all previous progress and creates a clean report.
 
.PARAMETER ShowFailedOnly
    If specified, only failed results are shown on the screen.
 
.EXAMPLE
    Invoke-AzStackHciNetworkSLBValidation -Parameters $params -OperationType DeploySLB -PSSession $session -OutputPath "C:\Logs"
 
.NOTES
    - This function is intended for use in Azure Stack HCI deployment and update validation scenarios.
    - The list of validators to run is explicitly maintained in the script for clarity and maintainability.
    - Requires supporting modules and helper functions to be available in the module path.
#>

function Invoke-AzStackHciNetworkSLBValidation
{
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $Parameters,

        [Parameter(Mandatory = $true, HelpMessage = "Indicating Operation Type")]
        [ValidateSet('DeploySLB', 'ScaleOutSLB', 'ScaleInSLB', 'PostSLB', 'DnsSLB','PreUpdate', 'PostUpdate', 'AddNode')]
        [String]$OperationType,

        [Parameter(Mandatory = $true,HelpMessage = "Specify the PsSession(s) used to validation from.")]
        [System.Management.Automation.Runspaces.PSSession[]]
        $PSSession,

        [Parameter(Mandatory = $false, HelpMessage = "Return PSObject result.")]
        [switch]
        $PassThru,

        [Parameter(Mandatory = $false, HelpMessage = "Tests to include.")]
        [ArgumentCompleter({ Get-TestListByFunction -ModuleName AzStackHci.NetworkSLB.Helpers })]
        [ValidateScript({ $_ -in (Get-TestListByFunction -ModuleName AzStackHci.NetworkSLB.Helpers) })]
        [string[]]
        $Include,

        [Parameter(Mandatory = $false, HelpMessage = "Tests to exclude.")]
        [ArgumentCompleter({ Get-TestListByFunction -ModuleName AzStackHci.NetworkSLB.Helpers })]
        [ValidateScript({ $_ -in (Get-TestListByFunction -ModuleName AzStackHci.NetworkSLB.Helpers) })]
        [string[]]
        $Exclude,

        [Parameter(Mandatory = $false, HelpMessage = "Hardware class: Small, Medium, or Large")]
        [ValidateSet('Small','Medium','Large')]
        [String] $HardwareClass = "Medium",

        [Parameter(Mandatory = $false, HelpMessage = "Cluster Pattern: Standard, Stretch, or RackAware")]
        [ValidateSet('Standard','Stretch','RackAware')]
        [String]
        $ClusterPattern = "Standard",

        [Parameter(Mandatory = $true, HelpMessage = "Directory path for log and report output")]
        [string]$OutputPath,

        [Parameter(Mandatory = $false, HelpMessage = "Remove all previous progress and create a clean report")]
        [switch]$CleanReport = $false,

        [Parameter(Mandatory = $false, HelpMessage = "Show only failed results on screen.")]
        [switch]$ShowFailedOnly
    )

    try {
        # Set error action preference to stop on errors for strict validation
        $script:ErrorActionPreference = 'Stop'

        # Initialize the output path for logs and reports
        Set-AzStackHciOutputPath -Path $OutputPath

        # Initialize the parameter hashtable that will be passed to validation tests
        $callingTestParam = @{}

        # Extract the region name from the parameters (e.g., 'AzureLocal' for Azure.local)
        $regionName = Get-RegionNameFromParameters -Parameters $Parameters

        # If a region name is specified, add it to the calling test parameters
        if ($regionName -ne '') {
            $params = @{
                RegionName = $regionName
            }
            $callingTestParam += $params
        }

        switch ($OperationType)
        {
            # DeploySLB: Initial deployment of Software Load Balancer
            # Extracts SLB configuration from runtime parameters and prepares validation parameters
            # DnsSLB: Also used for DNS SLB validation
            { $_ -in @("DeploySLB", "DnsSLB") }
            {
                $runtimeParameters = $null
                if ($null -ne $Parameters.RunInformation -and $Parameters.RunInformation.ContainsKey('RuntimeParameter'))
                {
                    # Runtime parameter is available to all the interfaces to the action plan; it is a property bag of the customer provided data.
                    # During remediation the failed summary xml is also added to the runtime parameters.
                    # Failed summary xml will provide us the information on failed step's role, interface and execution-context details.
                    Log-Info -Message "Runtime Parameter is found."
                    $runtimeParameters = $Parameters.RunInformation['RuntimeParameter']
                }
                else
                {
                    # Fail because no runtime parameters found
                    throw "No runtime parameters with SLB Configuration Path Found"
                }

                # Extract SLB configuration JSON from runtime parameters
                $slbConfiguration = $runtimeParameters["InputJsonString"]
                Log-Info -Message "SLB user configuration: $slbConfiguration"

                # Parse the SLB configuration JSON and extract relevant sections
                $slbConfigurationObject = $slbConfiguration | ConvertFrom-Json
                $softwareLoadbalancerConfiguration = $slbConfigurationObject.SdnIntegration.SoftwareLoadBalancer
                $networksConfiguration = $slbConfigurationObject.SdnIntegration.Networks

                $eceClient = Create-ECEClusterServiceClient
                $eceXml = [XML]($eceClient.GetCloudParameters().getAwaiter().GetResult().CloudDefinitionAsXmlString)
                $sdnInt = $eceXml.Parameters.Category | Where-Object { $_.Name -eq "SDNIntegration" }
                $sdnPrefix = ($sdnInt.Parameter | Where-Object { $_.Name -eq "SDNPrefix" }).Value
                Log-Info -Message "SDN Prefix: $sdnPrefix"

                # Build parameter hashtable for deployment validation tests
                Log-Info -Message "Performing SLB Validation using Deploy parameters"
                $callingTestParam = @{
                    SoftwareLoadbalancerConfiguration = $softwareLoadbalancerConfiguration
                    NetworksConfiguration = $networksConfiguration
                    PSSession = $PSSession
                    ClusterPattern = $ClusterPattern
                    HardwareClass = $HardwareClass
                    IsDeployment = $true
                    SDNPrefix = $sdnPrefix.Trim().ToLower()
                }
            }
            # PreUpdate/PostUpdate/PostSLB: Validation during update operations or after SLB deployment
            # Checks server, SLB Mux, and load balancer manager configuration and provisioning state
            { $_ -in @("PreUpdate", "PostUpdate", "PostSLB") }
            {
                Log-Info -Message "$($_) scenario, will check all server, SLB Mux and load balancer manager configuration and provisioning state"

                # Build parameter hashtable for update/post-deployment validation tests
                $callingTestParam = @{
                    Parameters = $Parameters
                    PSSession = $PSSession
                    ClusterPattern = $ClusterPattern
                    HardwareClass = $HardwareClass
                }
            }
            # AddNode: Validation when adding new nodes to the cluster
            # Extracts node information and validates HNVPA IP pool allocation
            "AddNode"
            {
                $runtimeParameters = $null
                if ($null -ne $Parameters.RunInformation -and $Parameters.RunInformation.ContainsKey('RuntimeParameter'))
                {
                    Log-Info -Message "Runtime Parameter is found."
                    $runtimeParameters = $Parameters.RunInformation['RuntimeParameter']
                }
                else
                {
                    # Fail because no runtime parameters found
                    throw "No runtime parameters found"
                }

                # Parse the list of new node names being added to the cluster
                [System.String[]] $nodeNames = $runtimeParameters["NodeName"].Split()
                Log-Info -Message "AddNode scenario, new hosts to be added: $($nodeNames -join ',')"

                # Count the number of new hosts for validation purposes
                $numberOfNewHosts = @($nodeNames).Count
                Log-Info -Message "AddNode scenario, number of new hosts to be added: $numberOfNewHosts"

                # Build parameter hashtable for add node validation tests
                $callingTestParam = @{
                    NumberOfNewHosts = $numberOfNewHosts
                    Parameters = $Parameters
                    PSSession = $PSSession
                    ClusterPattern = $ClusterPattern
                    HardwareClass = $HardwareClass
                }
            }
            # ScaleOutSLB: Validation when scaling SLB Mux instances out
            # Validates that the SLB infrastructure is correctly scaled to the target count
            "ScaleOutSLB"
            {
                # Determine the current number of SLB nodes from the parameters
                $numOfSLBs = @($Parameters.Roles['VirtualMachines'].PublicConfiguration.Nodes.Node | Where-Object {$_.Role -eq 'SLB' -and $_.ProvisioningStatus -ne 'Removed'}).Count
                Log-Info -Message "The number of SLB nodes: $numOfSLBs"

                # Build parameter hashtable for scale validation tests
                Log-Info -Message "In SLB scale out scenario, the validator will check all SLB mux and manager configuration and provisioning status and ensure they are correctly scaled."
                $callingTestParam = @{
                    SoftwareLoadbalancerConfiguration = $null
                    NumberOfMuxes = ++$numOfSLBs
                    Parameters = $Parameters
                    PSSession = $PSSession
                    ClusterPattern = $ClusterPattern
                    HardwareClass = $HardwareClass
                }
            }
            # ScaleInSLB: Validation when scaling SLB Mux instances in
            "ScaleInSLB"
            {
                # Determine the current number of SLB nodes from the parameters
                $numOfSLBs = @($Parameters.Roles['VirtualMachines'].PublicConfiguration.Nodes.Node | Where-Object {$_.Role -eq 'SLB' -and $_.ProvisioningStatus -ne 'Removed'}).Count
                Log-Info -Message "The number of SLB nodes: $numOfSLBs"

                # Build parameter hashtable for scale validation tests
                Log-Info -Message "In SLB scale in scenario, the validator will check all SLB mux and manager configuration and provisioning status and ensure they are correctly scaled."
                $callingTestParam = @{
                    SoftwareLoadbalancerConfiguration = $null
                    NumberOfMuxes = --$numOfSLBs
                    Parameters = $Parameters
                    PSSession = $PSSession
                    ClusterPattern = $ClusterPattern
                    HardwareClass = $HardwareClass
                }
            }
            # Default case: Unknown operation type
            default
            {
                throw "Unknown OperationType [$OperationType]"
            }
        }

        # Write header information for the validation run
        Write-AzStackHciHeader -invocation $MyInvocation -params $PSBoundParameters -PassThru:$PassThru

        # Initialize or retrieve the environment checker report
        # If CleanReport is specified, previous progress is removed and a fresh report is created
        $envcheckerReport = Get-AzStackHciEnvProgress -clean:$CleanReport
        $envcheckerReport = Add-AzStackHciEnvJob -report $envcheckerReport

        # Import the SLB network validation helper module containing test functions
        Import-Module $PSScriptRoot\AzStackHci.NetworkSLB.Helpers.psm1 -DisableNameChecking -Global

        #region Get test list
        # Display progress indicator for the validation process
        Write-Progress -Id 1 -Activity "Checking AzStackHci Dependencies" -Status "SLB Network Configuration" -PercentComplete 0 -ErrorAction SilentlyContinue

        # Define the list of SLB network validation tests to run based on the operation type
        # Each operation type has a specific set of tests tailored to its validation requirements
        $script:envchktestList = @()
        switch ($OperationType)
        {
            # DeploySLB: Validates all SLB network configuration during initial deployment
            # Tests include FC/NC installation, node count, network configurations, IP pools, and BGP peers
            "DeploySLB"
            {
                Log-Info -Message "DeploySLB scenario, will check all SLB networks configuration."
                $script:envchktestList = @(
                                "Test-SLB_ValidateFCNCInstalled",              # Verify Failover Clustering and Network Controller are installed
                                "Test-SLB_ValidateNumberOfSLBNodes",           # Validate the number of SLB nodes matches requirements
                                "Test-SLB_ValidateSoftwareLoadBalancer",       # Verify SLB configuration is valid
                                "Test-SLB_ValidateHNVPANetwork",               # Validate HNV Provider Address (HNVPA) network configuration
                                "Test-SLB_ValidatePublicPrivateVIPNetworks",   # Validate public and private VIP network configurations
                                "Test-SLB_ValidateOverlappingIPPools",         # Check for overlapping IP address pools
                                "Test-SLB_ValidateBGPPeersReachable",          # Verify BGP peers are reachable
                                "Test-SLB_ValidateInfraIPPools")               # Validate infrastructure IP pool configuration
            }
            # DnsSLB: Validates DNS name resolution for SLB VMs during deployment
            # Tests include DNS configuration validation
            "DnsSLB"
            {
                Log-Info -Message "DeploySLB scenario, will check all SLB networks configuration."
                $script:envchktestList = @("Test-SLB_ValidateDNSName")          # Validate DNS configuration
            }
            # PreUpdate/PostUpdate/PostSLB: Validates SLB components and their provisioning status
            # Tests focus on Network Controller resources: Load Balancer Manager, Mux, and Servers
            { $_ -in @("PreUpdate", "PostUpdate", "PostSLB") }
            {
                Log-Info -Message "PreUpdate, PostUpdate and PostSLB scenario, will check all NC SLB mux, LB manager and servers configuration and provisioning status"
                $script:envchktestList = @(
                                "Test-SLB_ValidateNCLoadBalancerManager",      # Validate Network Controller Load Balancer Manager configuration
                                "Test-SLB_ValidateNCLoadBalancerMux",          # Validate Network Controller SLB Mux configuration
                                "Test-SLB_ValidateNCServers")                  # Validate Network Controller server configuration
            }
            # AddNode: Validates SLB configuration when adding new nodes to the cluster
            # Includes standard NC validation plus HNVPA IP pool validation for new hosts
            "AddNode"
            {
                Log-Info -Message "AddNode scenario, will check all NC SLB mux, LB manager and servers configuration and provisioning status. In addition, it will validate HNVPA IP pools."
                $script:envchktestList = @(
                                "Test-SLB_ValidateNCLoadBalancerMux",          # Validate Network Controller SLB Mux configuration
                                "Test-SLB_ValidateNCLoadBalancerManager",      # Validate Network Controller Load Balancer Manager configuration
                                "Test-SLB_ValidateNCServers",                  # Validate Network Controller server configuration
                                "Test-SLB_ValidateNCHNVPAIPPools")             # Validate HNVPA IP pools have sufficient capacity for new nodes
            }
            # Scale In/Out SLB: Validates SLB configuration when scaling SLB Mux instances
            # Includes node count validation, NC component validation, and infrastructure IP pool validation
            { $_ -in @("ScaleOutSLB", "ScaleInSLB") }
            {
                Log-Info -Message "Scale In/Out SLB scenario, will check all NC SLB mux, LB manager and servers configuration and provisioning status. In addition, it will validate Infrastructure IP pools and MUX count."
                $script:envchktestList = @(
                                "Test-SLB_ValidateNumberOfSLBNodes",           # Validate the number of SLB nodes matches the target scale
                                "Test-SLB_ValidateNCLoadBalancerMux",          # Validate Network Controller SLB Mux configuration
                                "Test-SLB_ValidateNCLoadBalancerManager",      # Validate Network Controller Load Balancer Manager configuration
                                "Test-SLB_ValidateNCServers",                  # Validate Network Controller server configuration
                                "Test-SLB_ValidateInfraIPPools")               # Validate infrastructure IP pools for scaled environment
            }
        }
        #endregion

        # Apply Include/Exclude parameters and all exclusion mechanisms (manifest, file-based)
        $script:envchktestList = Select-TestList -Include $Include -Exclude $Exclude -TestList $script:envchktestList

        # Calculate the total number of tests to run for progress tracking
        $TotalTestCount = ($script:envchktestList).Count

        # Run validation
        $i = 0
        $Result = @()
        $ProgressActivity = "Checking AzStackHci SLB network compatibility"
        $i = 0
        $ProgressStatus = "Testing $ENV:ComputerName"

        # Configure progress bar parameters
        $progressParams = @{
            Id          = 1
            Activity    = $ProgressActivity
            Status      = $ProgressStatus
            ErrorAction = 'SilentlyContinue'
        }
        Write-Progress @progressParams

        # Execute each validation test in sequence
        :noTestsBreak foreach ($test in $script:envchktestList)
        {
            # Log and display the current test being executed
            $OpMsg = "Run SLB network validator [{0}] on {1}" -f $test, $ENV:ComputerName
            Log-Info -Message $OpMsg
            Write-Progress @progressParams -CurrentOperation $OpMsg -PercentComplete (($i++ / $TotalTestCount) * 100)

            # Build the parameter hashtable for the current test by matching available parameters
            # Only pass parameters that the test function accepts
            $invokeParameters = @{}
            Get-Command $test | Select-Object -ExpandProperty Parameters | Select-Object -ExpandProperty Keys | ForEach-Object {
                if ($callingTestParam[$PSITEM]) {
                    $invokeParameters += @{
                        $PSITEM = $callingTestParam[$PSITEM]
                    }
                }
            }

            # Log the parameters being passed to the validator for debugging purposes
            Log-Info "Validator parameters:"
            Log-Info -Message ($invokeParameters | Out-String)

            # Execute the test function with the prepared parameters and collect results
            $Result += Invoke-Expression "$test @invokeParameters"

            # Log completion of the current test
            $OpMsg = "End of SLB network validator [{0}] run on {1}`n" -f $test, $ENV:ComputerName
            Log-Info -Message $OpMsg
        }

        # Feedback results - user scenario
        Log-Info "SLB validation finished!" -ConsoleOut:(-not $PassThru)

        # If PassThru is not specified, format and display results to the console
        if (-not $PassThru)
        {
            # Show progress while formatting results
            $progressParams = @{
                Id              = 3
                Activity        = "Formating Results"
                Status          = "Writing Results for $($ENV:ComputerName)"
                PercentComplete = 1
                ErrorAction     = 'SilentlyContinue'
            }
            Write-Progress @progressParams

            # Write formatted results to console, optionally showing only failed tests
            Write-AzStackHciResult -Title "$($ENV:COMPUTERNAME):" -Result $Result -ShowFailedOnly:$ShowFailedOnly -Seperator ': '
            Write-Summary -Result $Result -Property1 Detail
        }
        else
        {
            # If PassThru is specified, log and return the raw result object
            Log-Info "SLB validation result: $($Result | Out-String)"
            return $result
        }
    }
    catch
    {
        Log-Info -Message "" -ConsoleOut
        Log-Info -Message "$($_.Exception.Message)" -ConsoleOut -Type Error
        Log-Info -Message "$($_.ScriptStackTrace)" -ConsoleOut -Type Error
        $cmdletException = $_
        throw $_
    }
    finally
    {
        $Script:ErrorActionPreference = 'SilentlyContinue'
        # Write result to telemetry channel
        foreach ($r in $result)
        {
            Write-ETWResult -Result $r
        }

        # Write validation result to report object and close out report
        $envcheckerReport | Add-Member -MemberType NoteProperty -Name 'NetworkSLB' -Value $Result -Force
        $envcheckerReport = Close-AzStackHciEnvJob -report $envcheckerReport
        Write-AzStackHciEnvReport -report $envcheckerReport
        Write-AzStackHciFooter -invocation $MyInvocation -Exception $cmdletException -PassThru:$PassThru
    }
}

<#
.SYNOPSIS
    Contains helper functions for AzStackHci Network SLB validation.
 
.DESCRIPTION
    Provides utility functions used by AzStackHci Network SLB validation, including region name extraction from environment parameters.
 
.FUNCTIONALITY
    - Get-RegionNameFromParameters: Extracts the region name based on RegistrationCloudName in the provided parameters.
    - Additional helper functions can be added here to support SLB validation scenarios.
.NOTES
    This file is intended to be imported by AzStackHci.NetworkSLB.psm1 and related modules.
#>

function Get-RegionNameFromParameters
{
    param (
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $Parameters
    )

    # Specify the region name to target for connectivity validation
    $RegionName = ''

    # Retrieve the RegistrationCloudName from the parameters to determine the cloud environment.
    $RegistrationCloudName = $Parameters.Roles["Cloud"].PublicConfiguration.PublicInfo.RegistrationCloudName

    # If the RegistrationCloudName is 'Azure.local' (case-insensitive), set the RegionName parameter to 'AzureLocal'.
    if ($RegistrationCloudName -ieq 'Azure.local')
    {
        $RegionName = 'AzureLocal'
    }

    return $RegionName
}

# SIG # Begin signature block
# MIInSQYJKoZIhvcNAQcCoIInOjCCJzYCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDivaE6L1lDxKYF
# bdeCB6IehOS9bDMllC83I6kUeWVD5aCCDLowggX1MIID3aADAgECAhMzAAACHU0Z
# yE7XD1dIAAAAAAIdMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD
# b2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwNDE2MTg1OTQzWhcNMjcwNDE1MTg1
# OTQzWjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYD
# VQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IB
# DwAwggEKAoIBAQDQvewXxx9gZZFC6Ys1WBay8BJ8kGA4JQnH5CMafqOASlTpK9H8
# o5ZXTXt0caVQTNMUPt445wXYD+dFtaKWTwDn1I52oUSrC9vJin1Gsqt+zyKJL5Dg
# 3eQXbQNR61DmMy20GLTIO3SFed9Rfi/ophgCLGFLDR3r0KvHjwMb/jYWS0celV/4
# Lz27LfAekm8v9E5IXaeiXbAUYZKK090n4CVl3JBtbN+9DtI9SNu/yjvozW52/u7R
# X/Ttpa/KDlpuokZ+Zcbvmtd9ur9gFLvZzh41o9MsE/clQtdaFWGvuo6Jua/ntpgk
# ey3E5/vBFe+MJPG6phdnuo6r57ZudCudiI1bAgMBAAGjggGbMIIBlzAOBgNVHQ8B
# Af8EBAMCB4AwHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0O
# BBYEFH6QuMwqcPG0hQlQ6c5jCtTTLrVeMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQL
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzMDAxMis1MDc1NTkw
# HwYDVR0jBBgwFoAUf1k/VCHarU/vBeXmo9ctBpQSCDEwYAYDVR0fBFkwVzBVoFOg
# UYZPaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0
# JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNybDBtBggrBgEFBQcBAQRh
# MF8wXQYIKwYBBQUHMAKGUWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv
# Y2VydHMvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNy
# dDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQBKTbYOjzwTG/DXGaz9
# s6+fQeaTtDcFmMY+5UyVFCyj7Pv+5i37qfX8lSL/tBIfYQfWsMuBQlfZurJD6r4H
# VJ2CeH+1fgiq8dcHdVKoZ3Sa2qXoX3cq9iS8cVb06B7+5/XJ7I0OxHH9fDsvJ3T3
# w5V/ZtAIFmLrl+P0CtG+92uzRsn0nTbdFjOkLMLWPLAU3THohKRlSEMgFJpPkm5n
# 5UAZ35xX6FWCrDLsSKb555bTifwa8mJBwdlof0bmfYidH+dxZ1FdDxvLnNl9zeKs
# A4kejaaIqqIPguhwAti5Ql7BlTNoJNwxCvBmqW2MQLnCkYN/VVUsR3V2x/rcTNzo
# Bf/Z/SpROvdaA2ZOOd1uioXJt3tdLQ7vHpqpib0KfWr/FWXW10q38VxfCnRQBqzb
# SuztR7nEMuzX7Ck+B/XaPDXd1qh72+QYyB0Z2VzWmO9zsnb9Uq/dwu8LGeQqnyu6
# 7SDGACvnXii2fb9+US492VTnXSnFKyqwgzUyFMtZK1/sHYTv6bG4TtQUygQxTN+Z
# V+aJIlKO2MqZ7bKrAnOzS9m6NgoTdWOq11bTOZwKlIEV/EhV9SWkDmdpR/hPPT2v
# 6TEj4F8PT/zHjRezIU5c/DGlt/VhY/pK0XkJtEyMmmS1BMtjU/rqBZVMIm3dnxQs
# /TBByr+Cf8Z1r7aifQVQ+WSqzjCCBr0wggSloAMCAQICEzMAAAA5O7Y3Gb8GHWcA
# AAAAADkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRl
# IEF1dGhvcml0eSAyMDExMB4XDTI0MDgwODIwNTQxOFoXDTM2MDMyMjIyMTMwNFow
# VzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEo
# MCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAyNDCCAiIwDQYJ
# KoZIhvcNAQEBBQADggIPADCCAgoCggIBANgBnB7jOMeqlRYHNa265v4IY9fH8TKh
# emHfPINe1gpLaV3dhg324WwH06LcHbpnsBukCDNitryo0dtS/EW6I/yEL/bLSY8h
# KpbfQuWusBPr9qazYcDxCW/qnjb5JsI1s8bNOg3bVATvQVL4tcf03aTycsz8QeCd
# M0l/yHRObJ9QqazM1r6VPEOJ7LL+uEEb73w6QCuhs89a1uv1zerOYMnsneRRwCbp
# yW11IcggU0cRKDDq1pjVJzIbIF6+oiXXbReOsgeI8zu1FyQfK0fVkaya8SmVHQ/t
# Of23mZ4W9k0Ri22QW9p3UgSC5OUDktKxxcCmGL6tXLfOGSWHIIV4YrTJTT6PNty5
# REojHJuZHArkF9VnHTERWoTjAzfI3kP+5b4alUdhgAZ7ttOu1bVnXfHaqPYl2rPs
# 20ji03LOVWsh/radgE17es5hL+t6lV0eVHrVhsssROWJuz2MXMCt7iw7lFPG9LXK
# Gjsmonn2gotGdHIuEg5JnJMJVmixd5LRlkmgYRZKzhxSCwyoGIq0PhaA7Y+VPct5
# pCHkijcIIDm0nlkK+0KyepolcqGm0T/GYQRMhHJlGOOmVQop36wUVUYklUy++vDW
# eEgEo4s7hxN6mIbf2MSIQ/iIfMZgJxC69oukMUXCrOC3SkE/xIkgpfl22MM1itkZ
# 35nNXkMolU1lAgMBAAGjggFOMIIBSjAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGC
# NxUBBAMCAQAwHQYDVR0OBBYEFH9ZP1Qh2q1P7wXl5qPXLQaUEggxMBkGCSsGAQQB
# gjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU
# ci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2Ny
# bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0MjAx
# MV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0MjAx
# MV8yMDExXzAzXzIyLmNydDANBgkqhkiG9w0BAQwFAAOCAgEAFJQfOChP7onn6fLI
# MKrSlN1WYKwDFgAddymOUO3FrM8d7B/W/iQ6DxXsDn7D5W4wMwYeLystcEqfkjz4
# NURRgazyMu5yRzQh4LqjA4tStTcJh1opExo7nn5PuPBYnbu0+THSuVHTe0VTTPVh
# ily/piFrDo3axQ9P4C+Ol5yet+2gTfekICS5xS+cYfSIvgn0JksVBVMYVI5QFu/q
# hnLhsEFEUzG8fvv0hjgkO+lkpV9ty6GkN4vdnd7ya6Q6aR9y34aiM1qmxaxBi6OU
# nyNl6fkuun/diTFnYDLTppOkr/mg5WSfCiDVMNCxtj4wPKC5OmHm1DQIt/MNokbb
# H3UGsFP1QbzsLocuSqLCvH09Io3fDPTmscR9Y75G4qX7RTX8AdBPo0I6OEojf39z
# uFZt0qOHm65YWQE69cZM2ueE1MB05dNNgHK9gTE7zKvK/fg8B2qjW88MT/WF5V5u
# vZGtqa9FSL2RazArA+rDPuf6JGYz4HpgMZHB4S6szWSKYBv0VisCzfxgeU+dquXW
# 9bd0auYlOB58DPcOYKdc3Se94g+xL4pcEhbB54JOgAkwYTu/9dLeH2pDqeJZAABV
# DWRQCaXfO5LgyKwKCLYXpigrZYCjUSBcr+Ve8PFWMhVTQl0v4q8J/AUmQN5W4n10
# 1cY2L4A7GTQG1h32HHAvfQESWP0xghnlMIIZ4QIBATBuMFcxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jv
# c29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMjQCEzMAAAIdTRnITtcPV0gAAAAAAh0w
# DQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK
# KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIGH3d35/
# L13N02+EgxdWOAttUk1HnKBwFA//bVKOozgBMEIGCisGAQQBgjcCAQwxNDAyoBSA
# EgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20w
# DQYJKoZIhvcNAQEBBQAEggEAL4dzqoSgNafsPLucaB1h6b2jdBkEcROgnDbWCM56
# 3GICnuuzTAV8s+VR2yXH8aPkd7eauVT+lmKsoTg1MY+xR+iOEYIjA8ceWRfrThhz
# j8fkQei3s3Kxj4axLmTdlwinyNCmasb4IFoAeQryusG+7MCW1jlaOM10IdPVJPy1
# yGSFscI6xpOZ3o1OynuwxTtg4Qaeeo8q63Ie+l0PUxMWy1k3MD+YKZWYLN/xD80C
# tVglAxVqig3DEb+ahp4UZDg53OdKYpOaSS7Z0XLjkqCJjhQ1yAbAnmYf3qplUzZr
# t0Cp1mKdIsKMpCJn2yPTFqm0w8LKF+7KxNmmeJpC/r6NZ6GCF5cwgheTBgorBgEE
# AYI3AwMBMYIXgzCCF38GCSqGSIb3DQEHAqCCF3AwghdsAgEDMQ8wDQYJYIZIAWUD
# BAIBBQAwggFSBgsqhkiG9w0BCRABBKCCAUEEggE9MIIBOQIBAQYKKwYBBAGEWQoD
# ATAxMA0GCWCGSAFlAwQCAQUABCCkOF3tV5fpSUffzGv9wHa/BXG60GPAdioxOP1l
# y9FP1QIGaefB+1SZGBMyMDI2MDUwMzE0MzExMS40NzhaMASAAgH0oIHRpIHOMIHL
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxN
# aWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRT
# UyBFU046MzcwMy0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0
# YW1wIFNlcnZpY2WgghHtMIIHIDCCBQigAwIBAgITMwAAAh86cGnkojAulQABAAAC
# HzANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAe
# Fw0yNjAyMTkxOTM5NTFaFw0yNzA1MTcxOTM5NTFaMIHLMQswCQYDVQQGEwJVUzET
# MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmlj
# YSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046MzcwMy0wNUUw
# LUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIi
# MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLO8XFOcfGqAqgiz0+AmQmFl3d
# Z0aTG4UFJkqqNdMHy28DaheCBs6ONufukye5x42CWkzgRIy9kE2VWwEntZ8Zkgyr
# ykC0bIqsID7+6FxguseTXf1Vwvm1D8104VmetoBJlJ4uGbuyJZUvXDx55nVh50yg
# LTzZ24WkQsnPpvRZv2kPc39f3bhLyHVtnHsa/W/86Vrftd+AfFveA+qN/EY+XGj5
# c/DPMXCYECb0arYb92dDJWtwzpyBrp4gfHlgY1UEpc4l4AGELrf2J4wrxTzTW+SM
# 8XhV1dOOPrYjD080IbZqL8B+IF0RCdn269YXrGK6QIHipznKZcCS8jN30YAHnTJV
# N5Zzs6t/2YsqBGDquvDad7934FFTwzvUcO3VoIyd93XWwvP8/SCFVJh21W8oGQTp
# tGHyly+Fl4henVMVZF1v6osOtirX8GFTiEhnf8nRdOg7yZYAJ0xy9CtDfbXaTn/c
# f3Lq3N/GCYKFjC+5mUCE+AJhmxMuMdvSUGmKiAFdiPAjUTqsWWBBZJm0eCwgeGJF
# mmQA+V7/98BKcE+gUL7O9eWRDQwKeAcvo6rxNv2Y4jKrHA6Z/wi3a/fKUhLCNZES
# 8qGdrpDAm7qh+6FjYxytAbkiKM6uTNy/ULPlwtlYZoAJDDQP7eYCywwVbNTbHXRB
# SS+NccC0sSB4W7U67wIDAQABo4IBSTCCAUUwHQYDVR0OBBYEFNk72sGDlH0r5Dwv
# fGR5XwJI8B7bMB8GA1UdIwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1Ud
# HwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3Js
# L01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggr
# BgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIw
# MTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgw
# DgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4ICAQBlbu3IoynnPz0K1iPb
# eNnsej2b15l5sdl2FAFBBGT9lRdc2gNV8LAIusPYHHhUvRDcsx4lbMNhVKPGu4TD
# LaqNt/CI+SFtGuqdRLpVP1XE9cCLyKrKPpcJFJCqPpV+efoAtYBmIUQcxxwT7WIQ
# 7gag8+rkKvrMkCoRqKS0mKv8J1sKfi85+G2uhZ/1RteSVdYZOZOj+Sb4wzonTCTj
# 7EtgMN/BX35W5dTzd7wJdGepYkVi871dSrC2Tr1ZFzAR7S44drCWZpJ6phJabVNO
# sNxFJKgSykugOGWzQ318Rr3MTPg2s3Bns+pUPVgMijd4bUOH2BlEsLMMwOcolTTZ
# qg1HYrdY1jxpUAI9ipjBQRINL/O705Z+/f2LjNmJQooCVJVX24adpZ519SsfazGo
# qXGt91bmqKo0fI09Il4sUHh4ih6rpiQDBlyL7vmvCejwVxYevY4qVwTZ/o3gvl+R
# 0lFxYS9feIM4NeG0+WsDZ7jLci5MFeuNwosQY3z26Xg1oj0U9u+ncR9uTU+xBmJ8
# BtlCdhQ13RNMX5P+krRYPB3XCp9Jm6XaO1995q32AIZm1mzBGI6yHlviXaEC5TzG
# iO1LXuPtXZU2X93oQJbMoe3v8+5CPKrQalGWyYuh2a3V1pwbj+W0FEmEFPpu8TI+
# qYO1IIQWUSRvFjXth5Ob02hMMjCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkA
# AAAAABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRl
# IEF1dGhvcml0eSAyMDEwMB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVow
# fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
# ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd
# TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX
# 9gF/bErg4r25PhdgM/9cT8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1q
# UoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8d
# q6z2Nr41JmTamDu6GnszrYBbfowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byN
# pOORj7I5LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2k
# rnopN6zL64NF50ZuyjLVwIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4d
# Pf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgS
# Uei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8
# QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6Cm
# gyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzF
# ER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQID
# AQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQU
# KqdS/mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1
# GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0
# bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMA
# QTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbL
# j+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1p
# Y3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0w
# Ni0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIz
# LmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwU
# tj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN
# 3Zi6th542DYunKmCVgADsAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU
# 5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5
# KYnDvBewVIVCs/wMnosZiefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGy
# qVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB6
# 2FD+CljdQDzHVG2dY3RILLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltE
# AY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFp
# AUR+fKFhbHP+CrvsQWY9af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcd
# FYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRb
# atGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQd
# VTNYs6FwZvKhggNQMIICOAIBATCB+aGB0aSBzjCByzELMAkGA1UEBhMCVVMxEzAR
# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg
# T3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjM3MDMtMDVFMC1E
# OTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEw
# BwYFKw4DAhoDFQBLIMg1P7sNuCXpmbH2IXT2tXeEEKCBgzCBgKR+MHwxCzAJBgNV
# BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
# HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29m
# dCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA7aFn5DAiGA8y
# MDI2MDUwMzA2MjEyNFoYDzIwMjYwNTA0MDYyMTI0WjB3MD0GCisGAQQBhFkKBAEx
# LzAtMAoCBQDtoWfkAgEAMAoCAQACAhT3AgH/MAcCAQACAhNsMAoCBQDtorlkAgEA
# MDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAI
# AgEAAgMBhqAwDQYJKoZIhvcNAQELBQADggEBAHq7s9YMgMpIuyTAwWsMxFD0DDmR
# QoXeyij+UMPaYdsxa3ei47tU4WE0xqHP+0mYPcDDrbUyiue3JiyjGqyZhs63H39t
# kyIRrg787TNyIuzMJH04BSpAsjQL9jKHDPuDN03FtnZFcxLvnFz+i2e1OAQ5Odan
# ScUkOnVkC7TLm/DMelMwJm5tfFkMo6hKZS1tLtKyjJBB8ZMZlm+35LeUNJBgFRCA
# D0iG1bZFVD09Rf7diPhBQPHI70wqiFkIrPwgHUS8EKHQ1RrMajudvnX/GWgSZH2L
# As6VIoh8Xy8inHRClIVPQeQvEclLgJYcJ7qPQRmfh7UZHYThMVUooesH7aYxggQN
# MIIECQIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAh86
# cGnkojAulQABAAACHzANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0G
# CyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCCgWnSyoJx4ilxUoHJekO2NqHbb
# Cl/iyHMdmwTsL+IzlDCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EILAkCt9W
# kCsMtURkFu6TY0P3UXdRnCiYuPZhe3ykLfwUMIGYMIGApH4wfDELMAkGA1UEBhMC
# VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
# BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp
# bWUtU3RhbXAgUENBIDIwMTACEzMAAAIfOnBp5KIwLpUAAQAAAh8wIgQgXDVXUUgM
# F2UJ5kLBUeKOgKL/uQDhW3pavs3L2zobM+AwDQYJKoZIhvcNAQELBQAEggIAg9hz
# 9o5KZdxualZ+6IGjWqHcV69xYmIGDAcHPfV8495DH7I/zkm3/bjy6xFMlv2aa4/8
# FOlmoh1BUWDxXLkzkYeTS9dLujb+ERxfBxdbc83nqm0DMUFAjEWa0mHgVVyaVcYz
# GPMAlW8WLnDHWPcbQ2uxZfpQXZQT754DGkkeuIY8OAcAYBF3Y/rD+DGheP8VVBsV
# lSzgHtrOUKSKO8joLnFIuyaHjIxWhSFxn17WreIXJRq71eEhJFdymDWvHaINB+RH
# 5EESm2nH1avfmqbzJsaDyVq73BlktMQIXiIpkAdXqb+9LqRwib/6ZJosmbTObIJe
# HirUdHYth2s2HHBG9Qa+yHhv4DNSSYHsCzcH10t2ez0M97ybur/O+3SYVvODYIVq
# mA+JiIJS3WeskhdhbO92E7plP/BqQqereBygWU80KjNInErPdTkwBI4E8m0lExGb
# M+erWtDHeBQ5Vlhd86xCW2ZCRKpPwRyvK2Xv7ylBgtQiarznpmWxgGPGte2Y367f
# hN9AKVbvZeE6AiAiXnYel/1gjsrDU0gF8HSeRm/noN9Uv67OPrDt3ZuyxcnuYffi
# pvesKNpH4UaK1gd7Rayb+/kqLBsCJM6ChfmrcO5vJY+T7FcCv/jktiZoT9+iYYm3
# XdUyGMp4YiXey24YxgcsyC5t5/shjL0iEXXc/Yg=
# SIG # End signature block