Private/ApiClient.ps1

#
# Runtime for VMware Infrastructure SDK
# No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
# Version: 1.0
# Contact: powercli@vmware.com
# Generated by OpenAPI Generator: https://openapi-generator.tech
#


# Define Custom Type Exception to wrap WebException with serialized JSON server errors
$InvocationExceptionSource = @"
using System;
public class InvocationException : Exception {
    object _serverError;
    public InvocationException(Exception exception, object serverError) : base(exception.Message, exception) {
        _serverError = serverError;
    }
 
    public object ServerError {
        get {
            return _serverError;
        }
    }
 
    public InvocationException(string message, Exception exception, object serverError) : base(message, exception) {
        _serverError = serverError;
    }
}
"@


Add-Type $InvocationExceptionSource

function Invoke-ApiClient {
    [OutputType('System.Collections.Hashtable')]
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory)]
        [string]$Product,
        [Parameter(Mandatory)]
        [string]$Uri,
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [string[]]$Accepts,
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [string[]]$ContentTypes,
        [Parameter(Mandatory)]
        [hashtable]$HeaderParameters,
        [Parameter(Mandatory)]
        [hashtable]$FormParameters,
        [Parameter(Mandatory)]
        [hashtable]$QueryParameters,
        [Parameter(Mandatory)]
        [hashtable]$CookieParameters,
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$Body,
        [Parameter(Mandatory)]
        [string]$Method,
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$ReturnType,
        [Parameter(Mandatory)]
        [bool]$IsBodyNullable,
        [Parameter(Mandatory)]
        [hashtable]
        $InvocationInfo,
        [Parameter()]
        [PSTypeName('ServerConfiguration')]
        $Server
    )

    'Calling method: Invoke-ApiClient' | Write-Debug
    $PSBoundParameters | Out-DebugParameter | Write-Debug

    $ServerConfigurations = Get-ServerConfiguration -Product $Product
    if ($null -ne $Server) {
        $ServerConfigurations = $Server
    }

    if ($null -eq $ServerConfigurations) {
       throw "There are no Server Configurations for product '$Product'. Please add at least one server configuration first using the Add-ServerConfiguration cmdlet."
    }

    foreach ($Configuration in $ServerConfigurations) {
        # vSphere API Patch for mandatory Query Params
        # vSphere API Specs host multiple operations on same Uri
        # adding different mandatory query params to distinguish them
        # Their OpenAPI Specs provide wrong paths for those operations
        # Replacing '?' in path with mandatory query param with '__'
        # Assume '__' in path is that case and fix the Uri here
        if ($Uri.Indexof("__") -ge 0) {
            $Uri = $Uri.Replace("__", "?")
        }

        $BaseUrl = $Configuration.BaseUrl
        if ([string]::IsNullOrEmpty($BaseUrl)) {
            throw "Server configuration has no BaseUrl. Please set your server configuration first using the Set-ServerConfiguration cmdlet."
        }

        $RequestUri = $BaseUrl + $Uri

        # cookie parameters
        foreach ($Parameter in $Configuration.Authorization.Cookies.GetEnumerator()) {
            if ($Parameter.Name -eq "cookieAuth") {
                $HeaderParameters["Cookie"] = $Parameter.Value
            } else {
                $HeaderParameters[$Parameter.Name] = $Parameter.Value
            }
        }

        # accept, content-type headers
        $Accept = SelectHeaders -Headers $Accepts
        if ($Accept) {
            $HeaderParameters['Accept'] = $Accept
        }

        $ContentType = SelectHeaders -Headers $ContentTypes
        if ($ContentType) {
            $HeaderParameters['Content-Type'] = $ContentType
        }

        # add default headers if any
        foreach ($header in $Configuration.DefaultHeaders.GetEnumerator()) {
            $HeaderParameters[$header.Name] = $header.Value
        }

        if ($Configuration.Username -and $Configuration.Password) {
            $Password = Get-PlainTextPassword -Password $Configuration.Password
            $LocalVarBytes = [System.Text.Encoding]::UTF8.GetBytes($Configuration.Username + ":" + $Password)
            $LocalVarBase64Text =[Convert]::ToBase64String($LocalVarBytes)
            $HeaderParameters['Authorization'] = "Basic " + $LocalVarBase64Text
            Write-Verbose ("Using HTTP basic authentication in {0}" -f $MyInvocation.MyCommand)
        }

        # add headers from authorization if any
        foreach ($header in $Configuration.Authorization.Headers.GetEnumerator()) {
            $HeaderParameters[$header.Name] = $header.Value
        }

        $SerializeNulls = $Configuration.SerializeNulls
        $HttpValues = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)

        # add query parameters from authorization if any
        foreach ($queryParam in $Configuration.Authorization.QueryParameters.GetEnumerator()) {
            AddQueryParameter -HttpValues $HttpValues -ParameterKey $queryParam.Name -ParameterValue $queryParam.Value -SerializeNulls $SerializeNulls
        }

        # constrcut URL query string
        foreach ($Parameter in $QueryParameters.GetEnumerator()) {
            if ($Parameter.Value -is [System.Management.Automation.PSCustomObject]) {
                $ParameterProperties = Get-Member -InputObject $Parameter.Value -MemberType NoteProperty

                foreach ($ParameterProperty in $ParameterProperties) {
                    $ParameterKey = $ParameterProperty.Name
                    $ParameterValue = $Parameter.Value.$ParameterKey

                    AddQueryParameter -HttpValues $HttpValues -ParameterKey $ParameterKey -ParameterValue $ParameterValue -SerializeNulls $SerializeNulls
                }
            }
            else {
                AddQueryParameter -HttpValues $HttpValues -ParameterKey $Parameter.Key -ParameterValue $Parameter.Value -SerializeNulls $SerializeNulls
            }
        }
        # Build the request and load it with the query string.
        $UriBuilder = [System.UriBuilder]($RequestUri)

        <#
            [System.Web.HttpUtility]::ParseQueryString always encodes special characters to unicode,
            so the string 'local-1 (1)' is encoded to 'local-1+(1)'. The [System.UriBuilder].Query internally
            encodes the provided query string, so before being passed as the value of the Query property,
            the string should be decoded so that 'local-1+(1)' has its original value: 'local-1 (1)' which is than internally
            encoded to 'local-1%20(1)'.
        #>

        $QueryParamsString = $HttpValues.ToString()
        if (![string]::IsNullOrEmpty($QueryParamsString)) {
            $UriBuilder.Query = [System.Web.HttpUtility]::UrlDecode($QueryParamsString)
        }

        # include form parameters in the request body
        $RequestBody = $null
        if ($FormParameters -and $FormParameters.Count -gt 0) {
            $RequestBody = $FormParameters
        }

        if ($Body -or $IsBodyNullable) {
            if ($null -eq $Body) {
                $RequestBody = $Body
            }
            else {
                $BodyWithoutNullValues = GetBodyWithoutNullValues -Body (ConvertFrom-JsonX -InputObject $Body) -SerializeNulls $SerializeNulls
                $RequestBody = ($BodyWithoutNullValues | ConvertTo-Json -Depth 100).ToString()
            }

            if ([string]::IsNullOrEmpty($RequestBody) -and $IsBodyNullable -eq $true) {
                $RequestBody = "null"
            }
        }


        $Credential = $null
        if ($Configuration.Username -and $Configuration.Password) {
            $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Configuration.Username, $Configuration.Password
        }

        $invokeParams = @{
            'Uri' = $UriBuilder.Uri
            'Method' = $Method
            'Headers' = $HeaderParameters
            'Body' = $RequestBody
            'ErrorAction' = 'Stop'
            'UseBasicParsing' = $true
            'Credential' = $Credential
        }

        if ($null -ne $Configuration.Proxy) {
            $invokeParams['Proxy'] = $Configuration.ProxyUri
            $invokeParams['ProxyUseDefaultCredentials'] = $true
        }

        if ($null -ne $Configuration.WebOperationTimeoutSeconds -and $Configuration.WebOperationTimeoutSeconds -gt 0) {
            $invokeParams['TimeoutSec'] = $Configuration.WebOperationTimeoutSeconds
        }

        if ($PSBoundParameters.ContainsKey('Debug')) {
            $invokeParams['Debug'] = $Debug
        }

        if ($PSBoundParameters.ContainsKey('Verbose')) {
            $invokeParams['Verbose'] = $Verbose
        }

        if ($PSBoundParameters.ContainsKey('WarningAction')) {
            $invokeParams['WarningAction'] = $PSBoundParameters.WarningAction
        }

        $SkipCertificateCheck = $Configuration.SkipCertificateCheck

        try {
            $InvokeWebRequestXParams = @{
                'InvokeParams' = $invokeParams
                'SkipCertificateCheck' = ([bool] $SkipCertificateCheck)
            }

            $Response = $null
            $Response = Invoke-WebRequestX @InvokeWebRequestXParams
        } catch {
            if ($null -ne $_.Exception.Response) {
                $ExceptionResponse = $_.Exception.Response
                $ServerError = $_.ToString()

                # Serialize JSON body
                if ($Global:PSVersionTable.PSEdition -eq 'Core' -and $_.Exception -is [System.Net.Http.HttpRequestException]) {
                    if (
                        $ExceptionResponse -ne $null -and
                        $ExceptionResponse.Content -ne $null -and
                        $ExceptionResponse.Content.Headers -ne $null -and
                        $ExceptionResponse.Content.Headers.Key -eq 'Content-Type' -and
                        ($ExceptionResponse.Content.Headers.Value | ForEach-Object -Process { IsJsonMIME $_ })
                    ) {
                        $ServerError = ConvertFrom-JsonX -InputObject $ServerError
                    }
                } elseif ($Global:PSVersionTable.PSEdition -eq 'Desktop' -and $_.Exception -is [System.Net.WebException]) {
                    if (
                        $ExceptionResponse -ne $null -and
                        $ExceptionResponse.Headers -ne $null -and
                        $ExceptionResponse.Headers.Keys -Contains 'Content-Type' -and
                        (IsJsonMIME -MIME $ExceptionResponse.Headers['Content-Type'])
                    ) {
                        try {
                            $StreamReader = [System.IO.StreamReader]::new($ExceptionResponse.GetResponseStream())

                            $SerializedServerError = $StreamReader.ReadToEnd() | ConvertFrom-JsonX

                            if ($null -eq $SerializedServerError){
                                try {
                                    $SerializedServerError = ConvertFrom-JsonX -InputObject $_.ToString() -ErrorAction Stop
                                }
                                catch {
                                }
                            }
                            if ($null -ne $SerializedServerError) {
                                $ServerError = $SerializedServerError
                            }
                        } finally {
                            $StreamReader.Close()
                        }
                    }
                }

                $InvocationException = New-Object InvocationException -ArgumentList $_.Exception, $ServerError
                if ($ErrorActionPreference -eq 'Stop') {
                    throw $InvocationException
                } else {
                    Write-Error $InvocationException
                }
            } else {
                Write-Error $_
            }

            $Response = $null
        } finally {
            Submit-FeatureUsage -InvocationInfo $InvocationInfo
        }

        if ($null -ne $Response) {
            $ResponseContentTypes = $Response.Headers["Content-Type"]
            if ($null -eq $ResponseContentTypes) {
                $ResponseContentTypes = @()
            }

            $responseObject = DeserializeResponse -Response $Response -ReturnType $ReturnType -ContentTypes $ResponseContentTypes
            # Add GetServer Script Method to the result objects
            $responseObject | Foreach-Object {
                if ($null -ne $_ -and $null -ne $_.PSObject) {
                    # Store Server Name in the PSObject TypeNames to preserve result object type and public properties
                    # Add GetServer method to retrieve the server from PSObject type names
                    # This each object carries the information obout the server from which it is retrieved preserving the
                    # type and data for serialization when it is passed to the Invoke functions
                    # E.g. Weh an API returns string, string type will be preserved and its ps custom object
                    # will carry the server information in the custom type names and user is able to retrieve it through
                    # GetServer method.
                    $_.PSObject.TypeNames.Add("Server:$($Configuration.Product):$($Configuration.ToString())")
                    $_ = $_ | Add-Member -MemberType ScriptMethod -Name GetServer -Value {
                        # The Server Type Name is in Format <Server>:<Product>:<ServerConfiguration.ToString()>
                        $productServerString = ($this.PSObject.TypeNames | Where-Object { $_.StartsWith('Server:')}).SubString(7)
                        $productSeparatorIndex = $productServerString.IndexOf(':')
                        $product = $productServerString.Substring(0, $productSeparatorIndex)
                        $server = $productServerString.Substring($productSeparatorIndex + 1, $productServerString.Length - $productSeparatorIndex - 1)
                        # result
                        Get-ServerConfiguration -Product $product | Where-Object { $_.ToString() -eq $server }
                    } -Force -PassThru

                    # Store information that the object comes from the server in the PSObject TypeNames.
                    $_.PSObject.TypeNames.Add("ServerObject")
                }
            }
            # result
            @{
                Response = $responseObject
                StatusCode = $Response.StatusCode
                Headers = $Response.Headers
            }
        }

    }
}

# Select JSON MIME if present, otherwise choose the first one if available
function SelectHeaders {
    Param(
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [String[]]$Headers
    )

    foreach ($Header in $Headers) {
        if (IsJsonMIME -MIME $Header) {
            return $Header
        }
    }

    if (!($Headers) -or $Headers.Count -eq 0) {
        return $null
    } else {
        return $Headers[0] # return the first one
    }
}

function IsJsonMIME {
    Param(
        [Parameter(Mandatory)]
        [string]$MIME
    )

    if ($MIME -match "(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$") {
        return $true
    } else {
        return $false
    }
}

function AddQueryParameter {
    Param (
        [Parameter(Mandatory = $true)]
        [PSObject]
        $HttpValues,

        [Parameter(Mandatory = $true)]
        [string]
        $ParameterKey,

        [Parameter(Mandatory = $true)]
        [AllowNull()]
        [PSObject]
        $ParameterValue,

        [Parameter(Mandatory = $true)]
        [bool]
        $SerializeNulls
    )

    if ($ParameterValue.Count -gt 1) {
        foreach ($Value in $ParameterValue) {
            if ($null -ne $Value -or $SerializeNulls) {
                $HttpValues.Add($ParameterKey, $Value)
            }
        }
    } else {
        if ($null -ne $ParameterValue -or $SerializeNulls) {
            $HttpValues.Add($ParameterKey, $ParameterValue)
        }
    }
}

function GetBodyWithoutNullValues {
    Param (
        [Parameter(Mandatory = $true)]
        [AllowNull()]
        [PSObject]
        $Body,

        [Parameter(Mandatory = $true)]
        [bool]
        $SerializeNulls
    )

    $FilteredBody = $null

    if ($Body -is [System.Management.Automation.PSCustomObject]) {
        $FilteredBody = [PSCustomObject] @{}
        $BodyProperties = Get-Member -InputObject $Body -MemberType NoteProperty

        foreach ($BodyProperty in $BodyProperties) {
            $PropertyKey = $BodyProperty.Name
            $PropertyValue = $Body.$PropertyKey

            if ($null -ne $PropertyValue -or $SerializeNulls) {
                $FilteredBody | Add-Member -MemberType NoteProperty -Name $PropertyKey -Value $null

                if ($PropertyValue -is [System.Management.Automation.PSCustomObject]) {
                    $FilteredBody.$PropertyKey = GetBodyWithoutNullValues -Body $PropertyValue -SerializeNulls $SerializeNulls
                }
                else {
                    $FilteredBody.$PropertyKey = $PropertyValue
                }
            }
        }
    }
    else {
        $FilteredBody = $Body
    }

    $FilteredBody
}

function DeserializeResponse {
    Param(
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$ReturnType,
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$Response,
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [string[]]$ContentTypes
    )

    $result = $null
    If ([string]::IsNullOrEmpty($ReturnType) -and $ContentTypes.Count -eq 0) { # void response
        $result = $Response
    } Elseif ($ReturnType -match '\[\]$') { # array
        $result = ConvertFrom-JsonX $Response
    } Elseif (@("System.DateTime") -contains $ReturnType) { # datetime
        $result = $Response
    } Else { # others (e.g. model, file)
        if ($ContentTypes) {
            $ContentType = $null
            if ($ContentTypes.Count -gt 1) {
                $ContentType = SelectHeaders -Headers $ContentTypes
            } else {
                $ContentType = $ContentTypes[0]
            }

            if (IsJsonMIME -MIME $ContentType) { # JSON
                $result = ConvertFrom-JsonX $Response
            }
        } else { # no content type in response header, returning raw response
            $result = $Response
        }
    }

    if ($result -eq [String]::Empty) {
       $result = $null
    }

    return $result
}

function Submit-FeatureUsage {
    Param (
        [Parameter(Mandatory = $true)]
        [hashtable]
        $InvocationInfo
    )

    $participateInCEIP = [VMware.VimAutomation.ViCore.Util10.SettingsManager]::ActualParticipateInCEIP
    if ($participateInCEIP) {
        $cmdletFeatureId = "$($InvocationInfo.ModuleName)\\$($InvocationInfo.CmdletName)"
        $cmdletFeatureName = $InvocationInfo.CmdletName

        $cmdletFeature = [VMware.VimAutomation.Ceip.CmdletFeature]::new($cmdletFeatureId, $cmdletFeatureName)
        $componentFeature = [VMware.VimAutomation.Ceip.ComponentFeature]::new($InvocationInfo.ModuleName, $InvocationInfo.ModuleName)

        [VMware.VimAutomation.Ceip.CeipManager]::ReportFeatureUse($cmdletFeature)
        [VMware.VimAutomation.Ceip.CeipManager]::ReportFeatureUse($componentFeature)
    }
}

# SIG # Begin signature block
# MIIphwYJKoZIhvcNAQcCoIIpeDCCKXQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA92tDRFLSesXom
# LcNPgcLZmayAjvZYchoh8AI6JhiMSaCCDnQwggawMIIEmKADAgECAhAIrUCyYNKc
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
# yK+p/pQd52MbOoZWeE4wgge8MIIFpKADAgECAhAGQAJb/wxIlzKZ1GMgg8N7MA0G
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjQwMzI4MDAwMDAwWhcNMjcwMzMw
# MjM1OTU5WjCBxDETMBEGCysGAQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgEC
# EwhEZWxhd2FyZTEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEDAOBgNV
# BAUTBzY2MTAxMTcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMREw
# DwYDVQQHEwhTYW4gSm9zZTEVMBMGA1UEChMMQnJvYWRjb20gSW5jMRUwEwYDVQQD
# EwxCcm9hZGNvbSBJbmMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC6
# 8C+jJxKfxp9c1A6fghwSNjnvV+Y1my2XmTHEPmk7COFTWw1VRBZBtv/zUXrSStlW
# 9Qqqp48wk+H+H5oM0qL9jsUQ6wAJpmjt33F3xvKqc8ehzVZLXUEACQBXTo30Hnbh
# bcacKAyX9sGByGqKlR6cHHrEebSWMoxOO6TOgYg06xfeYzxpx8HqMQjOKgNEbh4c
# m1Yx+ER/4BmWmYcvVHR9KtXwJWxmzUJCaS5OB9lp8JqO5+uAHvpGtQEAb39/h/vy
# 290isCYw16/uaLOz5Epchv5fogTBTh4o6SXWHam03FfMNVbmbMVuciTzfPSDt0i5
# xQWYtVkwVU+NGE4XUutX4zbaing53QYKNAa+NW9FiWcaoEwE1qTvk7ilsucPzdqC
# ikQpHyaaGCzHoDhveSLiJKgKRiDqee8KXfa/hkCoat9AtCihyd899kJ1kSlTO9fk
# ci5/CdKwmwXQIKh6OPueKr+OJ69XPx0V+RaaMAkkVtFb7/VwecFmFgsXFkAK8ulP
# aGYyIFOFqLMqH8ZuKiLVP5HkxDgSitJcWbaSf89TJuxNqh0vV1k4iwaQpcmQZhPK
# 49pNlj5j0cyw8B+xTYNDwnKvyoWgqKAb2cfzc6pCLk2GJLBwakKZ5YKC50XdhPlS
# yrqlLTb5otZRoYWFGKL1SqxxrBjRqg4qp1RvuxRcBQIDAQABo4ICAjCCAf4wHwYD
# VR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYEFL9ZTMS/Phgv
# GnXZm3XOrmDoJSIfMD0GA1UdIAQ2MDQwMgYFZ4EMAQMwKTAnBggrBgEFBQcCARYb
# aHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIHgDATBgNV
# HSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3Js
# My5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQw
# OTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQu
# Y29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAy
# MUNBMS5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhhodHRwOi8v
# b2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNI
# QTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggIBAMLk
# M/5BZB1j2xjjR9IkyDYtLrqS9IztErzl4ogf2dXuAgBJP1EKm/EN4oOi/BHxLW0T
# VuclGZ3aEa3/n3UlHxqmvKm+4elD5oh4sEOm7+J7ECV0HobeZhRiLmdyla1Mqbxw
# xp56AVvhG/++nf+AVzw95c671a3kb+6VXMDzZK1qcUh6zyLklZ/vfjKipry9KgMR
# sXd81I+PRr+99iRI+5pUsF7ixmS4vTldNh2r/VRFKLtXtTefZ20Q55Efu/8NefJf
# fD/+LLmHszB3LRlguFYOUGon7q8eQKi20PMW6PQb8az4mn6MfA1Y2x+L7HFDiy//
# VMOy5DqcKOHWqz/NZr7/VEPtywoLbHlUwNJyFY0wnQhzvPCg67YpDEYERDnggtpe
# OchKlJoqLKQInq6xDLTtco+ynR6IHnWRcz+oYhm6TdvRcmP7giiqObKEFXQwLsjS
# HsqRluk2FQ4DhG63+8gyD4rKQVoybP0obE7Gi2RYHOT0qwPos6GklZraht/capa7
# wos1gNKXJL7G6BaCXQWCyakT76ZOJOdHzHjJ2n+yBgKWWGBv186nrP5nfuRu0vJE
# HG74cy5oRwe3vme6ztPQy9VSgSrP+g67bZ6yPe+z09T7NczW4aXrXbMUdTb02zKQ
# sK8WEKfcvzBmZ115SwMuf3g34C5yRhOsWInfosmAMYIaaTCCGmUCAQEwfTBpMQsw
# CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERp
# Z2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIw
# MjEgQ0ExAhAGQAJb/wxIlzKZ1GMgg8N7MA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYB
# BAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGC
# NwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIJHeqyTZT2p/565m
# EpfRl2ha8r95RDAKsbyPWCDs6gijMA0GCSqGSIb3DQEBAQUABIICADpoI5G+yJ2c
# OJYd/Ixm6+4hV3ltdUdfatnV7mViPr/YlIhqQom7QQcswQf7Xwz3gTvDwk7x/+RD
# CR0h6ILpDzBtxHcDJYrj8sBSoo3DihXcqgAYzhH6cs3mjjsVfxFtFnLeJ4WcM2pa
# Gs5C53D/n7m8zCE58/+QQKDpQ/RdGaMk912ySBvOTdbk36wANBYe1tSk0DG5Mgx6
# hV4Wc/ON1VFcs6PJetXDfM+8OFCB49ggGvTGPJ9Delj18B1i7pOlqCzf3io7DL63
# 1WGNU8GyWI/AOIGx/yULzPjVXTUDVjaVEI8lQ/+Ch0hr5KblLXeejwO5bZ6ex+BR
# dHZ6D7PH09O/WzpFeM7nEUghEDRSsTDJGAGD7UuTodZTqsZg2Rw0fYnCSLIkPmu8
# 4Z9NRRv99TuunLuFFnutWQabaoYi6TG5vhnHB2SZGK9Q3xtqvWPIRWdd00z9oaqL
# V2ey9UJ9D2kTbyTGP6hIj+tF3tWV9yZcaIwg+qjfyGn1qvX67znYWS9//kZXxRA1
# c2jm+g4z4WGgXdTRe7IDTJjMDNP+k9K5nkyPxCXxsPGMoZOpgpRGPWqTpDS+ZCWJ
# DjiN358sRlqgk6igBJ7FjXmnkTeGKwMPI2rsFXqdwrYKqiPnN5hDlJTNPQrWJP5s
# ampwXIHd3QTzGv9muhBfsykvdd9xs1vaoYIXPzCCFzsGCisGAQQBgjcDAwExghcr
# MIIXJwYJKoZIhvcNAQcCoIIXGDCCFxQCAQMxDzANBglghkgBZQMEAgEFADB3Bgsq
# hkiG9w0BCRABBKBoBGYwZAIBAQYJYIZIAYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAE
# IEo+7XZ+ZpsKki/wMIKeW1/vnqa8ow001WziLyJNsNuSAhAUsyYlYeEzLesvBXpK
# MwBUGA8yMDI0MDcyNDE5MzM0NFqgghMJMIIGwjCCBKqgAwIBAgIQBUSv85SdCDmm
# v9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
# RGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNB
# NDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAwMDAwMFoXDTM0
# MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ
# bmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCCAiIwDQYJKoZI
# hvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X5dLnXaEOCdwv
# SKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uUUI8cIOrHmjsv
# lmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa2mq62DvKXd4Z
# GIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgtXkV1lnX+3RCh
# G4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60pCFkcOvV5aDa
# Y7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17cz4y7lI0+9S7
# 69SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BYQfvYsSzhUa+0
# rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9c33u3Qr/eTQQ
# fqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw9/sqhux7Ujip
# mAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2ckpMEtGlwJw1P
# t7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhRB8qUt+JQofM6
# 04qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIw
# ADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjAL
# BglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYD
# VR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEwT6BNoEuGSWh0
# dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZT
# SEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsG
# AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0
# dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQw
# OTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAIEa
# 1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF7SaCinEvGN1O
# tt5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrCQDifXcigLiV4
# JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFcjGnRuSvExnvP
# nPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8wWkZus8W8oM3
# NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbFKNOt50MAcN7M
# mJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP4xeR0arAVeOG
# v6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VPNTwAvb6cKmx5
# AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvrmoI1VygWy2ny
# Mpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2obhDLN9OTH0e
# aHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJuEbTbDJ8WC9n
# R2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIGrjCCBJagAwIBAgIQBzY3
# tyRUfNhHrP0oZipeWzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMG
# A1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
# HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAw
# WhcNMzcwMzIyMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNl
# cnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBT
# SEEyNTYgVGltZVN0YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAxoY1BkmzwT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQV
# Ql+kiPNo+n3znIkLf50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY
# 3+vaPcQXf6sZKz5C3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB7
# 20RBidx8ald68Dd5n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71
# ORJn7w6lY2zkpsUdzTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW
# 8LAxE6lXKZYnLvWHpo9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7
# W+yB3iIU2YIqx5K/oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qq
# lnNCaJ+2RrOdOqPVA+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWc
# ZklSUPRR8zZJTYsg0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI
# /rOP015LdhJRk8mMDDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27Ktd
# RnXiYKNYCQEoAA6EVO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0w
# ggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WM
# aiCPnshvMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB
# /wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYI
# KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1
# aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RH
# NC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29t
# L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIw
# CwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbY
# IULhsBguEE0TzzBTzr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6
# hCAlNDFnzbYSlm/EUExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6
# q4XNQ1/tYLaqT5Fmniye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/
# KFSJ8NWKcXZl2szwcqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/E
# jaDnmPv7pp1yr8THwcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNT
# rDsdCEkPlM05et3/JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRx
# ktcma+Q4c6umAU+9Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7
# K9h+8kaddSweJywm228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrd
# VcA6KYawmKAr7ZVBtzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C
# +dAjfwAL5HYCJtnwZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QV
# SucTDh3bNzgaoSv27dZ8/DCCBY0wggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFow
# DQYJKoZIhvcNAQEMBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0
# IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNl
# cnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIz
# NTk1OVowYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG
# A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3Rl
# ZCBSb290IEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2je
# u+RdSjwwIjBpM+zCpyUuySE98orYWcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bG
# l20dq7J58soR0uRf1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBE
# EC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/N
# rDRAX7F6Zu53yEioZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A
# 2raRmECQecN4x7axxLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8
# IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfB
# aYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaa
# RBkrfsCUtNJhbesz2cXfSwQAzH0clcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZi
# fvaAsPvoZKYz0YkH4b235kOkGLimdwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXe
# eqxfjT/JvNNBERJb5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g
# /KEexcCPorF+CiaZ9eRpL5gdLfXZqbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB
# /wQFMAMBAf8wHQYDVR0OBBYEFOzX44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQY
# MBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEF
# BQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBD
# BggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# QXNzdXJlZElEUm9vdENBLmNydDBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3Js
# My5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1Ud
# IAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22
# Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih
# 9/Jy3iS8UgPITtAq3votVs/59PesMHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYD
# E3cnRNTnf+hZqPC/Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c
# 2PR3WlxUjG/voVA9/HYJaISfb8rbII01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88n
# q2x2zm8jLfR+cWojayL/ErhULSd+2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5
# lDGCA3YwggNyAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0
# LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hB
# MjU2IFRpbWVTdGFtcGluZyBDQQIQBUSv85SdCDmmv9s/X+VhFjANBglghkgBZQME
# AgEFAKCB0TAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkF
# MQ8XDTI0MDcyNDE5MzM0NFowKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQUZvArMsLC
# yQ+CXc6qisnGTxmcz0AwLwYJKoZIhvcNAQkEMSIEIOykECGaNaAg0UXi1P6UWVQN
# nX3C2wVaHJ2ZADfxiDovMDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEINL25G3tdCLM
# 0dRAV2hBNm+CitpVmq4zFq9NGprUDHgoMA0GCSqGSIb3DQEBAQUABIICAJt/Ng1z
# x9etQeivjGTgoWFkAJPcaHgQf7Z2YitXPEQRX+eVnq9lr8lxFOQrxu0Axi2UDNty
# Pcbn1yatRemzXm69WwIkZkgj7WlMpgyugSBn2zHc3y+zPlgWaUTTEgI7NoSwguPD
# H7EgGIX+yAT6q602EpKuvQf59dRSdYwH1LtXcNp+s9Wu5lMdGnIQI8DNCs2q467J
# QG/2dcK1bzPLFNFo+a52cZXzzLh8iuD6w/tlEb34dm/IQl0RAIOKgiGoWWfad4J+
# GjYlwY/MWE7SK4jMePIRyqIsHNJPrQ1oF5xgwV/dlNA0LYaN9gd62PTkdxTpuqFr
# OLWl6gJ4u79a0KMp4G9osPDUhYVK+Hm9jhf/xpbmv9ob22k4J1Ls5OW+9r59uvEf
# pwgJAhwMCmlE8P4uXlAi/l0Y4cLy0dT/X7Fo9D3zsJtunxExqJpPiuJtfkgPXkCq
# Gs1LdUXlNLq4/2AQ83/vlyMiNZHfSCKBl0kEQGSWgxBqFqazhHQ8xQDN+G0Cwj+x
# NJYODZfnKMh7T91jFnVsje/MVP23WtL7EbmpwRevUZ8ZsjzFCnC5KufxZqKyEcZ5
# ndYpBJuDJX2dfjozo5kCadFy7ER6qHL/fNi2iApWm9y0ZHlhNGyIXNMDfVMlxrCB
# zs9+qzBnfOP3ZpWTTsjt1lHPMMUwSpazWbkU
# SIG # End signature block