HP.Sinks.psm1
# HP CONFIDENTIAL # __________________ # # Copyright (C)2018 HP Inc # All Rights Reserved. # # NOTICE: All information contained herein is, and remains the property of HP Inc. # # The intellectual and technical concepts contained herein are proprietary to HP Inc # and may be covered by U.S. and Foreign Patents, patents in process, and are protected by # trade secret or copyright law. Dissemination of this information or reproduction of this material # is strictly forbidden unless prior written permission is obtained from HP Inc. Add-Type -TypeDefinition @" public enum syslog_facility_t { kernel_message = 0, user_message = 1, mail_system = 2, system_daemon =3, auth = 4, syslog_internal = 5, lpr = 6, news = 7, uucp = 8, clock = 9, secauth = 10, ftp = 11, ntp = 12, log_audit = 13, log_alert = 14, cron = 15, local0 = 16, local1 = 17, local2 = 18, local3 = 19, local4 = 20, local5 = 21, local6 = 22, local7 = 23 } public enum syslog_severity_t { emergency = 0, alert = 1, critical = 2, error = 3, warning = 4, notice = 5, informational = 6, debug = 7 } public enum eventlog_severity_t { error = 0x01, warning = 0x02, informational = 0x04, success_audit = 0x08, failure_audit = 0x10 } "@ <# .SYNOPSIS Send a message to a syslog server .DESCRIPTION Use this function to forward data to a syslog server. Currently supports UDP (default) and TCP connections. For more information see RFC 5424 in the "See also" section. The function currently supports UDP and TCP transports. .PARAMETER message The message to send .PARAMETER severity The severity of the message. IF not specified, it defaults to "informational". .PARAMETER facility The facility of the mesage. If not specified, it default to "user message" .PARAMETER clientname The client name. If not specified, it uses the current computer name. .PARAMETER timestamp The event time stamp. If not specified, it uses the current time. .PARAMETER port The target port. If not specified, and HPSINK_SYSLOG_MESSAGE_TARGET_PORT is not set, it uses port 514 for both TCP and UDP. .PARAMETER tcp Use TCP instead of UDP. Default is UDP which is unacknowledged. Switching to TCP may generate additional traffic, but allows the protocol to acknowledge delivery. .PARAMETER tcpframing Choose between octet-counting and non-transparent-framing TCP framing. Only applies if -tcp is specified. Default is octet-counting, unless HPSINK_SYSLOG_MESSAGE_TCPFRAMING is specified. For more information see RFC 6587 in the "See also" section. .PARAMETER maxlen Specify maximum length of message that the syslog server accepts. Common sizes are between 480 and 2048 bytes. Default is 2048 if not specified and HPSINK_SYSLOG_MESSAGE_MAXLEN is not set. .PARAMETER target The computer on which to perform this operation. Local computer is assumed if not specified and HPSINK_SYSLOG_MESSAGE_TARGET is not set. .PARAMETER PassThru Send the message to the pipeline upon completion. When passthru is set, an error in the function is non-terminating. .NOTES This function supports the following environment variables. These overwrite the defaults documented above. * HPSINK_SYSLOG_MESSAGE_TARGET_PORT - override default target port * HPSINK_SYSLOG_MESSAGE_TCPFRAMING - override TCP Framing format * HPSINK_SYSLOG_MESSAGE_MAXLEN - override syslog message max length * HPSINK_SYSLOG_MESSAGE_TARGET - override host name of the syslog server Defaults can be configured via the environment. This affects all related commands. For example, when applying them to event-log related functions, all eventlog-related functions are affected. In the following example, the HPSINK_EVENTLOG_MESSAGE_TARGET and HPSINK_EVENTLOG_MESSAGE_SOURCE variables affect both the Register-EventLogSink and Send-ToEventLog functions. ```powershell $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET="remotesyslog.mycompany.com" $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE="mysource" Register-EventLogSink "hello" | Send-ToEventLog ``` .INPUTS The message can be piped to this command, rather than provided via the -message parameter. .OUTPUTS If -passthru is specified, the original message is returned. This allows chaining multiple SendTo-XXX commands. .EXAMPLE "hello" | Send-ToSyslog -tcp -server mysyslogserver.mycompany.com This sends "hello" to the syslog server on mysyslogserver.mycompany.com via TCP. Alternately, the syslog server could be set in the environment variable HPSINK_SYSLOG_MESSAGE_TARGET. .LINK [RFC 5424 - "The Syslog Protocol"](https://tools.ietf.org/html/rfc5424) .LINK [RFC 6587 - "Transmission of Syslog Messages over TCP"](https://tools.ietf.org/html/rfc6587) .LINK [Send-ToEventlog](Send-ToEventLog) #> function Send-ToSyslog { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Send%E2%80%90ToSyslog")] param ( [ValidateNotNullOrEmpty()][Parameter(Position = 0,ValueFromPipeline = $True,mandatory = $True)] $message, [Parameter(Position = 1,mandatory = $false)] [syslog_severity_t]$severity = [syslog_severity_t]::informational, [Parameter(Position = 2,mandatory = $false)] [syslog_facility_t]$facility = [syslog_facility_t]::user_message, [Parameter(Position = 3,mandatory = $false)] [string]$clientname, [Parameter(Position = 4,mandatory = $false)] [string]$timestamp, [Parameter(Position = 5,mandatory = $false)] [int]$port = $HPSINK:HPSINK_SYSLOG_MESSAGE_TARGET_PORT, [Parameter(Position = 6,mandatory = $false)] [switch]$tcp, [ValidateSet("octet-counting","non-transparent-framing")][Parameter(Position = 7,mandatory = $false)] [string]$tcpframing = $ENV:HPSINK_SYSLOG_MESSAGE_TCPFRAMING, [Parameter(Position = 8,mandatory = $false)] [int]$maxlen = $ENV:HPSINK_SYSLOG_MESSAGE_MAXLEN, [Parameter(Position = 9,mandatory = $false)] [switch]$PassThru , [Parameter(Position = 10,mandatory = $false)] [string]$target = $ENV:HPSINK_SYSLOG_MESSAGE_TARGET ) # Create a UDP Client Object $tcpclient = $null $use_tcp = $false #defaults (change these in environment) if ($target -eq $null -or $target -eq "") { throw "parameter $target is required" } if ($tcpframing -eq $null -or $tcpframing -eq "") { $tcpframing = "octet-counting" } if ($port -eq 0) { $port = 514 } if ($maxlen -eq 0) { $maxlen = 2048 } if ($tcp.IsPresent -eq $false) { switch ([int]$ENV:HPSINK_SYSLOG_MESSAGE_USE_TCP) { 0 { $use_tcp = $false } 1 { $use_tcp = $true } } } else { $use_tcp = $tcp.IsPresent } Write-Verbose "Sending message to syslog server" if ($use_tcp) { Write-Verbose "TCP Connection to $target`:$port" $client = New-Object System.Net.Sockets.TcpClient } else { Write-Verbose "UDP Connection to $target`:$port" $client = New-Object System.Net.Sockets.UdpClient } try { $client.Connect($target,$port) } catch { if ($_.Exception.InnerException -ne $null) { Write-Error $_.Exception.InnerException.Message -Category ConnectionError -ErrorAction Stop } else { Write-Error $_.Exception.Message -Category ConnectionError -ErrorAction Stop } } if ($use_tcp -and -not $client.Connected) { $prefix = "udp" if ($use_tcp) { $prefix = $tcp} throw "Could not connect to syslog host $prefix`://$target`:$port" } Write-Verbose "Syslog faciliy=$($facility.value__), severity=$($severity.value__)" $priority = ($facility.value__ * 8) + $severity.value__ Write-Verbose "Priority is $priority" if (($clientname -eq "") -or ($clientname -eq $null)) { Write-Verbose "Defaulting to client = $($ENV:computername)" $clientname = $env:computername } if (($timestamp -eq "") -or ($timestamp -eq $null)) { $timestamp = Get-Date -Format "yyyy:MM:dd:-HH:mm:ss zzz" Write-Verbose "Defaulting to timestamp = $timestamp" } $msg = "<{0}>{1} {2} {3}" -f $priority,$timestamp,$hostname,$message Write-Verbose ("Sending the message: $msg") if ($use_tcp) { Write-Verbose ("Sending via TCP") if ($msg.length -gt $maxlen) { $maxlen = $maxlen - ([string]$maxlen).length Write-verbose ("This message has been truncated, because maximum effective length is $maxlen but the message is $($msg.length) ") $msg = $msg.Substring(0,$maxlen - ([string]$maxlen).length) } switch ($tcpframing) { "octet-counting" { Write-Verbose "Encoding TCP payload with 'octet-counting'" $encoded = '{0} {1}' -f $msg.Length,$msg $bytes = [System.Text.Encoding]::ASCII.GetBytes($encoded) } "non-transparent-framing" { Write-Verbose "Encoding with 'non-transparent-framing'" $encoded = '{0}{1}' -f $msg.Length,$msg $bytes = [System.Text.Encoding]::ASCII.GetBytes($encoded) } } try { [void]$client.getStream().Write($bytes,0,$bytes.Length) } catch { throw ("Could not send syslog message: $($_.Exception.Message)") } } else { Write-Verbose ("Sending via UDP") try { $bytes = [System.Text.Encoding]::ASCII.GetBytes($msg) if ($bytes.length -gt $maxlen) { Write-verbose ("This message has been truncated, because maximum length is $maxlen but the message is $($bytes.length) ") $bytes = $bytes[0..($maxlen-1)] } [void]$client.Send($bytes,$bytes.Length) } catch { if (-not $PassThru.IsPresent) { throw ("Could not send syslog message: $($_.Exception.Message)") } else { Write-Error -Message $_.Exception.Message -ErrorAction Continue } } } Write-Verbose "Send complete" $client.Close(); if ($PassThru) { return $message } } <# .SYNOPSIS Register a source in event log. THis is required before sending messages to the event log, via "Send-ToEventLog". The source must match the source in Send-ToEventLog. My default, it is assumed that the source is "HP-CSL". This operation can be undone by Unregister-EventLogSink. .PARAMETER logname The log section in which to register this source .PARAMETER source The event log source that will be used when logging. The source can also be specified via the HPSINK_EVENTLOG_MESSAGE_SOURCE environment variable. .PARAMETER target The computer on which to perform this operation. Local computer is assumed if not specified, unless environment variable HPSINK_EVENTLOG_MESSAGE_TARGET is defined. Important: the user identity running the powershell script must have permissions to write to the remote event log. .NOTES This function reads the following environment variables for setting defaults: - HPSINK_EVENTLOG_MESSAGE_SOURCE - override default source name - HPSINK_EVENTLOG_MESSAGE_LOG - override default message log name - HPSINK_EVENTLOG_MESSAGE_TARGET - override event log server name .LINK [Unregister-EventLogSink](Unregister-EventLogSink) .LINK [Send-ToEventLog](Send-ToEventLog) #> function Register-EventLogSink { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Register%E2%80%90EventLogSink")] param ( [Parameter(Position = 0,mandatory = $false)] [string]$logname = $ENV:HPSINK_EVENTLOG_MESSAGE_LOG, [Parameter(Position = 1,mandatory = $false)] [string]$source = $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE, [Parameter(Position = 2,mandatory = $false)] [string]$target = $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET ) #defaults (change these in environment) if ($source -eq $null -or $source -eq "") { $source = "HP-CSL" } if ($logname -eq $null -or $logname -eq "") { $logname = "Application" } if ($target -eq $null -or $target -eq "") { $target = "." } Write-Verbose "Registering source $logname / $source" $params = @{ LogName = $logname Source = $source } if ($target -ne ".") { $params.add("ComputerName",$target) } New-EventLog @params } <# .SYNOPSIS Unregisters a source registered by Register-EventLogSink .DESCRIPTION This function removes a registration that was previously done by Register-EventLogSink. .PARAMETER source The event log source that was registered via Register-EventLogSink The source can also be specified via the HPSINK_EVENTLOG_MESSAGE_SOURCE environment variable. .PARAMETER target The computer on which to perform this operation. Local computer is assumed if not specified, unless environment variable HPSINK_EVENTLOG_MESSAGE_TARGET is defined. Important: the user identity running the powershell script must have permissions to write to the remote event log. .NOTES This function reads the following environment variables for setting defaults: - HPSINK_EVENTLOG_MESSAGE_SOURCE - override default source name - HPSINK_EVENTLOG_MESSAGE_TARGET - override event log server name .LINK [Register-EventLogSink](Register-EventLogSink) .LINK [Send-ToEventLog](Send-ToEventLog) #> function Unregister-EventLogSink { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Unregister%E2%80%90EventLogSink")] param ( [Parameter(Position = 0,mandatory = $false)] [string]$source = $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE, [Parameter(Position = 1,mandatory = $false)] [string]$target = $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET ) #defaults (change these in environment) if ($source -eq $null -or $source -eq "") { $source = "HP-CSL" } if ($target -eq $null -or $target -eq "") { $target = "." } Write-Verbose "Unregistering source $source" $params = @{ Source = $source } if ($target -ne ".") { $params.add("ComputerName",$target) } Remove-EventLog @params } <# .SYNOPSIS Send a message to event log. .DESCRIPTION This message creates a Windows Event Log entry. Normally the source will need to be initialized with Register-EventLogSink to register the source name. .PARAMETER id The "event id" that will be registered under the "Event ID" column in the event log. By default, this is 0. .PARAMETER source The event log source that will be used when logging. This source should've been previously registered, potentially by using Register-EventLogSink. The source can also be specified via the HPSINK_EVENTLOG_MESSAGE_SOURCE environment variable. .PARAMETER message The message to log. This parameter is required. .PARAMETER message The message severity. If not specified, the severity is Information. .PARAMETER category The message category, which shows up under the "Task Category" column. If not specified, it is "General", unless envirionment variable HPSINK_EVENTLOG_MESSAGE_CATEGORY is defined. .PARAMETER logname The log in which to log (e.g. Application, System, etc). If not specified, it will log to Application, unless environment variable HPSINK_EVENTLOG_MESSAGE_LOG is defined. .PARAMETER rawdata Any raw data to add to the log entry. .PARAMETER target The computer on which to perform this operation. Local computer is assumed if not specified, unless environment variable HPSINK_EVENTLOG_MESSAGE_TARGET is defined. Important: the user identity running the powershell script must have permissions to write to the remote event log. .PARAMETER PassThru Send the message to the pipeline upon completion. When passthru is set, an error in the function is non-terminating. .EXAMPLE "hello" | Send-ToEventLog .NOTES This function reads the following environment variables for setting defaults. - HPSINK_EVENTLOG_MESSAGE_SOURCE - override default source name - HPSINK_EVENTLOG_MESSAGE_CATEGORY - override default category id - HPSINK_EVENTLOG_MESSAGE_LOG - override default message log name - HPSINK_EVENTLOG_MESSAGE_TARGET - override event log server name Defaults can be configured via the environment. This affects all related commands. For example, when applying them to event-log related functions, all eventlog-related functions are affected. In the following example, the HPSINK_EVENTLOG_MESSAGE_TARGET and HPSINK_EVENTLOG_MESSAGE_SOURCE variables affect both the Register-EventLogSink and Send-ToEventLog functions. ```powershell $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET="remotesyslog.mycompany.com" $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE="mysource" Register-EventLogSink "hello" | Send-ToEventLog ``` .LINK [Unregister-EventLogSink](Unregister-EventLogSink) .LINK [Register-EventLogSink](Register-EventLogSink) .LINK [Send-ToSyslog](Send-ToSyslog.md) #> function Send-ToEventLog { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Send%E2%80%90ToEventlog")] param ( [Parameter(Position = 0,mandatory = $false)] [string]$source = $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE, [Parameter(Position = 1,mandatory = $false)] [int]$id=0, [ValidateNotNullOrEmpty()][Parameter(Position = 2,ValueFromPipeline = $true,mandatory = $True)] $message, [Parameter(Position = 3,mandatory = $false)] [eventlog_severity_t]$severity = [eventlog_severity_t]::informational, [Parameter(Position = 4,mandatory = $false)] [int16]$category = $ENV:HPSINK_EVENTLOG_MESSAGE_CATEGORY, [Parameter(Position = 5,mandatory = $false)] [string]$logname = $ENV:HPSINK_EVENTLOG_MESSAGE_LOG, [Parameter(Position = 6,mandatory = $false)] [byte[]]$rawdata = $null, [Parameter(Position = 7,mandatory = $false)] [string]$target = $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET, [Parameter(Position = 8,mandatory = $false)] [switch]$PassThru ) #defaults (change these in environment) if ($source -eq $null -or $source -eq "") { $source = "HP-CSL" } if ($logname -eq $null -or $logname -eq "") { $logname = "Application" } if ($target -eq $null -or $target -eq "") { $target = "." } Write-Verbose "Sending message (category=$category, id=$id) to eventlog $logname with source $source" $params = @{ EntryType = $severity.value__ Category = $category Message = $message LogName = $logname Source = $source EventId = $id } if ($target -ne ".") { $params.add("ComputerName",$target) Write-Verbose ("The target machine is remote ($target)") } if ($rawdata -ne $null) { $params.add("RawData",$rawdata) } try { Write-EventLog @params } catch { if (-not $PassThru.IsPresent) { throw ("Could not send eventlog message: $($_.Exception.Message)") } else { Write-Error -Message $_.Exception.Message -ErrorAction Continue } } if ($PassThru) { return $message } } Export-ModuleMember -Function 'Send-*' Export-ModuleMember -Function 'Register-*' Export-ModuleMember -Function 'Unregister-*' # SIG # Begin signature block # MIIcNwYJKoZIhvcNAQcCoIIcKDCCHCQCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC4CBRtVNlwNgbT # 7PnIfO34aY0MS4mNLZjm8et+LlyzO6CCCo0wggU2MIIEHqADAgECAhAM1s71mz4i # 3j/UnuaI4vzeMA0GCSqGSIb3DQEBCwUAMHYxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xNTAzBgNV # BAMTLERpZ2lDZXJ0IFNIQTIgSGlnaCBBc3N1cmFuY2UgQ29kZSBTaWduaW5nIENB # MB4XDTE5MDQyMjAwMDAwMFoXDTIwMDQyOTEyMDAwMFowdTELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEQMA4GA1UE # ChMHSFAgSW5jLjEZMBcGA1UECxMQSFAgQ3liZXJzZWN1cml0eTEQMA4GA1UEAxMH # SFAgSW5jLjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANEwuTFpw7fQ # 3Ds5fvexal46Gg9TNMvdiJu7qMqDZnDJNl7ECdEPyLxsioGS7/yomOS9RXdXMJOm # tyV4/wIPbBaGC8E2tbLTbQQ4IJbgvC+Vc46vbo+sI8YTG6qBICOovFw9VhUNXXEy # SwHMoBNk8JS8R1slPpJKmNGB10HSatMGaHja0Lbqos0QuEx/tx2OXe+mzepIo66T # dtSv2MfPy2tcVcXIdiJGn7f4otxoj6T9X7hVIl78r5Y2XWHYtDK8KaV1E/qkiNXK # 1Xw5S53zv2VsZl6i1LZwt3d1Q9pUmm1AZe2YdhSGvwMP2LYBJGXIBbyLYnxS4HKB # R7MYZyz7H2kCAwEAAaOCAb8wggG7MB8GA1UdIwQYMBaAFGedDyAJDMyKOuWCRnJi # /PHMkOVAMB0GA1UdDgQWBBSnSAWgK15kcBLxsg4XNsT7ncH29zAOBgNVHQ8BAf8E # BAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwbQYDVR0fBGYwZDAwoC6gLIYqaHR0 # cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItaGEtY3MtZzEuY3JsMDCgLqAshipo # dHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc2hhMi1oYS1jcy1nMS5jcmwwTAYDVR0g # BEUwQzA3BglghkgBhv1sAwswKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGln # aWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYgGCCsGAQUFBwEBBHwwejAkBggrBgEF # BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFIGCCsGAQUFBzAChkZodHRw # Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEySGlnaEFzc3VyYW5j # ZUNvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQAD # ggEBAJQblkFw+UYKYSY2M/CIEpJxZDnf+cDhodKAy+goI3XfExRHhyLu3Gc2ibFB # Y4wyz/sJSfHehtNPYckXxR9k/FB/GfYtEACug9xXxJ+iLxWUNQ4KPt3bXY/kmDxW # D1QXJFLbW5Dop3w/K0DL3fxnjOfYCcxsYodbeEiCJprCdNi3zd6x/J8Y35GDbLA5 # p7RfIAzKrmBLPHFGDWr/jWTfwPfUNz6jYJ51m0Ba9j81kzpxNUD0yBIZXBkVvSkx # A09KxzMSSvxvV9DSqSezQBVgWnl9TbElouYUQwk64i0GzL4lTsphK4rQJJ2uuKtH # wN4E0ibpm0uIqbLhgk+3ic8fHTIwggVPMIIEN6ADAgECAhALfhCQPDhJD/ovZ5qH # oae5MA0GCSqGSIb3DQEBCwUAMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp # Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNVBAMTIkRp # Z2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAw # WhcNMjgxMDIyMTIwMDAwWjB2MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNl # cnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTUwMwYDVQQDEyxEaWdp # Q2VydCBTSEEyIEhpZ2ggQXNzdXJhbmNlIENvZGUgU2lnbmluZyBDQTCCASIwDQYJ # KoZIhvcNAQEBBQADggEPADCCAQoCggEBALRKXn0HD0HexPV2Fja9cf/PP09zS5zR # Df5Ky1dYXoUW3QIVVJnwjzwvTQJ4EGjI2DVLP8H3Z86YHK4zuS0dpApUk8SFot81 # sfXxPKezNPtdSMlGyWJEvEiZ6yhJU8M9j8AO3jWY6WJR3z1rQGHuBEHaz6dcVpbR # +Uy3RISHmGnlgrkT5lW/yJJwkgoxb3+LMqvPa1qfYsQ+7r7tWaRTfwvxUoiKewpn # JMuQzezSTTRMsOG1n5zG9m8szebKU3QBn2c13jhJLc7tOUSCGXlOGrK1+7t48Elm # p8/6XJZ1kosactn/UJJTzD7CQzIJGoYTaTz7gTIzMmR1cygmHQgwOwcCAwEAAaOC # AeEwggHdMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1Ud # JQQMMAoGCCsGAQUFBwMDMH8GCCsGAQUFBwEBBHMwcTAkBggrBgEFBQcwAYYYaHR0 # cDovL29jc3AuZGlnaWNlcnQuY29tMEkGCCsGAQUFBzAChj1odHRwOi8vY2FjZXJ0 # cy5kaWdpY2VydC5jb20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3J0 # MIGPBgNVHR8EgYcwgYQwQKA+oDyGOmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwQKA+oDyGOmh0dHA6Ly9j # cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5j # cmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0dHBz # Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMwHQYDVR0OBBYEFGed # DyAJDMyKOuWCRnJi/PHMkOVAMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoIAu9j # ZCvDMA0GCSqGSIb3DQEBCwUAA4IBAQBqDv9+E3wGpUvALoz5U2QJ4rpYkTBQ7Myf # 4dOoL0hGNhgp0HgoX5hWQA8eur2xO4dc3FvYIA3tGhZN1REkIUvxJ2mQE+sRoQHa # /bVOeVl1vTgqasP2jkEriqKL1yxRUdmcoMjjTrpsqEfSTtFoH4wCVzuzKWqOaiAq # ufIAYmS6yOkA+cyk1LqaNdivLGVsFnxYId5KMND66yRdBsmdFretSkXTJeIM8ECq # XE2sfs0Ggrl2RmkI2DK2gv7jqVg0QxuOZ2eXP2gxFjY4lT6H98fDr516dxnZ3pO1 # /W4r/JT5PbdMEjUsML7ojZ4FcJpIE/SM1ucerDjnqPOtDLd67GftMYIRADCCEPwC # AQEwgYowdjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG # A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTE1MDMGA1UEAxMsRGlnaUNlcnQgU0hBMiBI # aWdoIEFzc3VyYW5jZSBDb2RlIFNpZ25pbmcgQ0ECEAzWzvWbPiLeP9Se5oji/N4w # DQYJYIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMx # DAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkq # hkiG9w0BCQQxIgQglNzadYkvGUSzDqxnIUeMnCxVDwxpjWI89gP+0Qio0FEwDQYJ # KoZIhvcNAQEBBQAEggEAOLe5A35sJRO0H3nwxuoh+UBemV7t5kp47mx9T1111Uev # Y3Umu9/rzjPMqONg1bnnhvoZjlZTyt4XHSXmpnKK/aKYSu/merQ0JpmGK/sbY7yg # m4Wy3OiQY+pLq+AQvYnklDaXJ5s8K+WrKoA4mpyJ9s+cUyZjjvG++akHtamUXCtv # GokqNiAyYsToqTjT2u7LakMY2ZvvSFV9y5wqMYQOYLgOzHvVG9RYRkp64VFrFUBy # qQIyA2XurFWvKNced55Rs0HrEyfubtMuBfzjQt7nJfF957tEdsvxSsXBK6OnxOBY # dFoOY9fSuAG+HwzwbD7Jl3kyBlhcCnJwYK9eresqvqGCDsgwgg7EBgorBgEEAYI3 # AwMBMYIOtDCCDrAGCSqGSIb3DQEHAqCCDqEwgg6dAgEDMQ8wDQYJYIZIAWUDBAIB # BQAwdwYLKoZIhvcNAQkQAQSgaARmMGQCAQEGCWCGSAGG/WwHATAxMA0GCWCGSAFl # AwQCAQUABCAE4clrYSoI3qJESZ8m/ly6BRGiFw/ern0is3f+R1G1dQIQe3GF2LvX # d/eQDFB8wTt30xgPMjAyMDAyMTQyMzAwMDFaoIILuzCCBoIwggVqoAMCAQICEATN # P4VornbGG7D+cWDMp20wDQYJKoZIhvcNAQELBQAwcjELMAkGA1UEBhMCVVMxFTAT # BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEx # MC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIFRpbWVzdGFtcGluZyBD # QTAeFw0xOTEwMDEwMDAwMDBaFw0zMDEwMTcwMDAwMDBaMEwxCzAJBgNVBAYTAlVT # MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjEkMCIGA1UEAxMbVElNRVNUQU1QLVNI # QTI1Ni0yMDE5LTEwLTE1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA # 6WQ1nPqpmGVkG+QX3LgpNsxnCViFTTDgyf/lOzwRKFCvBzHiXQkYwvaJjGkIBCPg # dy2dFeW46KFqjv/UrtJ6Fu/4QbUdOXXBzy+nrEV+lG2sAwGZPGI+fnr9RZcxtPq3 # 2UI+p1Wb31pPWAKoMmkiE76Lgi3GmKtrm7TJ8mURDHQNsvAIlnTE6LJIoqEUpfj6 # 4YlwRDuN7/uk9MO5vRQs6wwoJyWAqxBLFhJgC2kijE7NxtWyZVkh4HwsEo1wDo+K # yuDT17M5d1DQQiwues6cZ3o4d1RA/0+VBCDU68jOhxQI/h2A3dDnK3jqvx9wxu5C # FlM2RZtTGUlinXoCm5UUowIDAQABo4IDODCCAzQwDgYDVR0PAQH/BAQDAgeAMAwG # A1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwggG/BgNVHSAEggG2 # MIIBsjCCAaEGCWCGSAGG/WwHATCCAZIwKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3 # LmRpZ2ljZXJ0LmNvbS9DUFMwggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAA # dQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAA # YwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8A # ZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAAQwBQAC8AQwBQAFMAIABhAG4A # ZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUA # ZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwA # aQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQA # IABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wCwYJYIZI # AYb9bAMVMB8GA1UdIwQYMBaAFPS24SAd/imu0uRhpbKiJbLIFzVuMB0GA1UdDgQW # BBRWUw/BxgenTdfYbldygFBM5OyewTBxBgNVHR8EajBoMDKgMKAuhixodHRwOi8v # Y3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLXRzLmNybDAyoDCgLoYsaHR0 # cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC10cy5jcmwwgYUGCCsG # AQUFBwEBBHkwdzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t # ME8GCCsGAQUFBzAChkNodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl # cnRTSEEyQXNzdXJlZElEVGltZXN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3DQEBCwUA # A4IBAQAug6FEBUoE47kyUvrZgfAau/gJjSO5PdiSoeZGHEovbno8Y243F6Mav1gj # skOclINOOQmwLOjH4eLM7ct5a87eIwFH7ZVUgeCAexKxrwKGqTpzav74n8GN0SGM # 5CmCw4oLYAACnR9HxJ+0CmhTf1oQpvgi5vhTkjFf2IKDLW0TQq6DwRBOpCT0R5ze # DyJyd1x/T+k5mCtXkkTX726T2UPHBDNjUTdWnkcEEcOjWFQh2OKOVtdJP1f8Cp8j # Xnv0lI3dnRq733oqptJFplUMj/ZMivKWz4lG3DGykZCjXzMwYFX1/GswrKHt5EdO # M55naii1TcLtW5eC+MupCGxTCbT3MIIFMTCCBBmgAwIBAgIQCqEl1tYyG35B5AXa # NpfCFTANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln # aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtE # aWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTYwMTA3MTIwMDAwWhcNMzEw # MTA3MTIwMDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j # MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBT # SEEyIEFzc3VyZWQgSUQgVGltZXN0YW1waW5nIENBMIIBIjANBgkqhkiG9w0BAQEF # AAOCAQ8AMIIBCgKCAQEAvdAy7kvNj3/dqbqCmcU5VChXtiNKxA4HRTNREH3Q+X1N # aH7ntqD0jbOI5Je/YyGQmL8TvFfTw+F+CNZqFAA49y4eO+7MpvYyWf5fZT/gm+vj # RkcGGlV+Cyd+wKL1oODeIj8O/36V+/OjuiI+GKwR5PCZA207hXwJ0+5dyJoLVOOo # CXFr4M8iEA91z3FyTgqt30A6XLdR4aF5FMZNJCMwXbzsPGBqrC8HzP3w6kfZiFBe # /WZuVmEnKYmEUeaC50ZQ/ZQqLKfkdT66mA+Ef58xFNat1fJky3seBdCEGXIX8RcG # 7z3N1k3vBkL9olMqT4UdxB08r8/arBD13ays6Vb/kwIDAQABo4IBzjCCAcowHQYD # VR0OBBYEFPS24SAd/imu0uRhpbKiJbLIFzVuMB8GA1UdIwQYMBaAFEXroq/0ksuC # MS1Ri6enIZ3zbcgPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGG # MBMGA1UdJQQMMAoGCCsGAQUFBwMIMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcw # AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8v # Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0 # MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGln # aUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMFAGA1UdIARJMEcw # OAYKYIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2Vy # dC5jb20vQ1BTMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAQEAcZUS6VGH # VmnN793afKpjerN4zwY3QITvS4S/ys8DAv3Fp8MOIEIsr3fzKx8MIVoqtwU0HWqu # mfgnoma/Capg33akOpMP+LLR2HwZYuhegiUexLoceywh4tZbLBQ1QwRostt1AuBy # x5jWPGTlH0gQGF+JOGFNYkYkh2OMkVIsrymJ5Xgf1gsUpYDXEkdws3XVk4WTfraS # Z/tTYYmo9WuWwPRYaQ18yAGxuSh1t5ljhSKMYcp5lH5Z/IwP42+1ASa2bKXuh1Eh # 5Fhgm7oMLSttosR+u8QlK0cCCHxJrhO24XxCQijGGFbPQTS2Zl22dHv1VjMiLyI2 # skuiSpXY9aaOUjGCAk0wggJJAgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNV # BAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0ECEATN # P4VornbGG7D+cWDMp20wDQYJYIZIAWUDBAIBBQCggZgwGgYJKoZIhvcNAQkDMQ0G # CyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yMDAyMTQyMzAwMDFaMCsGCyqG # SIb3DQEJEAIMMRwwGjAYMBYEFAMlvVBe2pYwLcIvT6AeTCi+KDTFMC8GCSqGSIb3 # DQEJBDEiBCC/kGkuhPJZ8I/K4wqDGf2QwRou27b7KgOgGDxt88pOSDANBgkqhkiG # 9w0BAQEFAASCAQAZf0qq9DEct9RJOLEjaHo0Gttckc/R7/X49o1WdnHPHKII1Utd # G3z5BZfIZxiJLtAXp1W8O+EqX47wHRPeysMUGcUsscBA3N3JISUx9dEqWjdAx8/3 # kCQgTSzGR+otbBclpiHErrCnf/smGbt1czVT7xnJ6uzLV4ldJn0RPnnH1dlz0WNR # 8CO+79l0QKNqM24bYT2jwowJl7Lo4PaH2jeIvKecYAhlL7Z/jiT9uTcJxqrsR6K+ # JKqYNog6u7t+W5iUHtUuJZbszZSSrSmcpSG0wLzBBiwBnX9mJRzPV/FOMUEDTyOK # MEJizeJc7hhJQesXL28VPsoQoqVa1Ktsk+ug # SIG # End signature block |