Private/Shared/Write-ToConsoleLog.ps1
|
function Write-ToConsoleLog { <# .SYNOPSIS Writes formatted log messages to the console with timestamps and log levels. .DESCRIPTION This function provides consistent console logging with timestamps, log levels, and color coding. It supports error, warning, success, and plan modes with appropriate coloring. Can also write to a file when in plan mode. .PARAMETER Messages One or more messages to write to the console. .PARAMETER Level The log level (INFO, ERROR, WARNING, SUCCESS, PLAN). Defaults to INFO. .PARAMETER Color The console color to use. Defaults to Blue for INFO, or determined by Level. .PARAMETER NewLine Adds the newline prefix before the message. .PARAMETER Overwrite Uses carriage return to overwrite the current line (for progress indicators). .PARAMETER IsError Sets the level to ERROR and uses red coloring. .PARAMETER IsWarning Sets the level to WARNING and uses yellow coloring. .PARAMETER IsSuccess Sets the level to SUCCESS and uses green coloring. .PARAMETER IsPlan Sets the level to PLAN and uses gray coloring. Also enables file writing. .PARAMETER WriteToFile Enables writing the message to a log file. .PARAMETER LogFilePath The path to the log file when WriteToFile is enabled. .EXAMPLE Write-ToConsoleLog "Starting process..." .EXAMPLE Write-ToConsoleLog "Operation completed successfully" -IsSuccess .EXAMPLE Write-ToConsoleLog "Something went wrong" -IsError #> [CmdletBinding()] param ( [Parameter(Mandatory = $true, Position = 0)] [string[]]$Messages, [Parameter(Mandatory = $false)] [string]$Level = "INFO", [Parameter(Mandatory = $false)] [System.ConsoleColor]$Color = [System.ConsoleColor]::White, [Parameter(Mandatory = $false)] [switch]$NewLine, [Parameter(Mandatory = $false)] [switch]$Overwrite, [Parameter(Mandatory = $false)] [switch]$IsError, [Parameter(Mandatory = $false)] [switch]$IsWarning, [Parameter(Mandatory = $false)] [switch]$IsSuccess, [Parameter(Mandatory = $false)] [switch]$IsPlan, [Parameter(Mandatory = $false)] [switch]$IsPrompt, [Parameter(Mandatory = $false)] [switch]$IsSelection, [Parameter(Mandatory = $false)] [switch]$WriteToFile, [Parameter(Mandatory = $false)] [string]$LogFilePath = $null, [Parameter(Mandatory = $false)] [switch]$ShowDateTime, [Parameter(Mandatory = $false)] [switch]$ShowType, [Parameter(Mandatory = $false)] [string]$IndentTemplate = " ", [Parameter(Mandatory = $false)] [int]$IndentLevel = 0, [Parameter(Mandatory = $false)] [array]$Defaults = @( @{ Level = "INFO" Color = [System.ConsoleColor]::Blue NewLine = $false ShowDateTime = $true ShowType = $true WriteToFile = $false }, @{ Level = "ERROR" Color = [System.ConsoleColor]::Red NewLine = $true ShowDateTime = $true ShowType = $true WriteToFile = $false }, @{ Level = "WARNING" Color = [System.ConsoleColor]::Yellow NewLine = $true ShowDateTime = $true ShowType = $true WriteToFile = $false }, @{ Level = "SUCCESS" Color = [System.ConsoleColor]::Green NewLine = $true ShowDateTime = $true ShowType = $true WriteToFile = $false }, @{ Level = "PLAN" Color = [System.ConsoleColor]::Gray NewLine = $false ShowDateTime = $true ShowType = $true WriteToFile = $true }, @{ Level = "INPUT REQUIRED" Color = [System.ConsoleColor]::Magenta NewLine = $true ShowDateTime = $true ShowType = $true WriteToFile = $false }, @{ Level = "SELECTION" Color = [System.ConsoleColor]::White NewLine = $false ShowDateTime = $false ShowType = $false WriteToFile = $false } ) ) if ($IsError) { $Level = "ERROR" } elseif ($IsWarning) { $Level = "WARNING" } elseif ($IsSuccess) { $Level = "SUCCESS" } elseif ($IsPlan) { $Level = "PLAN" } elseif ($IsPrompt) { $Level = "INPUT REQUIRED" } elseif ($IsSelection) { $Level = "SELECTION" } $defaultSettings = $Defaults | Where-Object { $_.Level -eq $Level } | Select-Object -First 1 $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss.fff" if ($Color -eq [System.ConsoleColor]::White) { if ($defaultSettings) { $Color = $defaultSettings.Color } } $prefix = "" if ($Overwrite) { $prefix = "`r" } else { if ($AddNewLine -or ($defaultSettings -and $defaultSettings.NewLine)) { $prefix = [System.Environment]::NewLine } } if ($ShowDateTime -or ($defaultSettings -and $defaultSettings.ShowDateTime)) { $prefix += "[$timestamp] " } if ($ShowType -or ($defaultSettings -and $defaultSettings.ShowType)) { $prefix += "[$Level] " } if ($IndentLevel -gt 0) { $indentString = $IndentTemplate * $IndentLevel $prefix = $indentString + $prefix } $finalMessages = @() foreach ($Message in $Messages) { $finalMessages += "$prefix$Message" } if ($finalMessages.Count -gt 1) { $finalMessages = $finalMessages -join "`n" } Write-Host $finalMessages -ForegroundColor $Color -NoNewline:$Overwrite.IsPresent if (($WriteToFile -or ($defaultSettings -and $defaultSettings.WriteToFile)) -and $LogFilePath) { Add-Content -Path $LogFilePath -Value $finalMessages } } # SIG # Begin signature block # MIIncAYJKoZIhvcNAQcCoIInYTCCJ10CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDSJycjxJQKDglq # 6qk69DTUVlm7IRLPuW4SVUtAb8jxwKCCDMkwggYEMIID7KADAgECAhMzAAACHPrN # xZvoL37EAAAAAAIcMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD # b2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwNDE2MTg1OTQxWhcNMjcwNDE1MTg1 # OTQxWjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYD # VQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IB # DwAwggEKAoIBAQDVsZfgOKmM31HPfoWOoNEiw0SlCiIxUMC0I9NMWbucKOw/e9lP # oAoehQVu6SG65V4EPzrYsnBnFPNoi4/HoOdjhz1qkrEt4I6tEcxXU6oOeY9zGveC # /3iBeuhLYxM3M/PkcUoebF+Nednm8OkdSPoDu8imViHPQq/8CQUu0WRR4rE+dMRf # rpVqfmNi2qWCX94T4MsepijGVkwE//tJg0ryAiYdHT34LSnlG/RSBZmQRGWZ5g8j # qnKjRParSqMft1gvjuUTVgtWNZfgcLFSK5Wa0myrq8OPcgTGGsRgun+tnSS+IxDT # xVsAPH1OzvPjwomguByhUe/OcvUN0D5Wmp7xAgMBAAGjggGqMIIBpjAOBgNVHQ8B # Af8EBAMCB4AwHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0O # BBYEFNoH7a2YDjOSwpkp6DHcmUS7J+0yMFQGA1UdEQRNMEukSTBHMS0wKwYDVQQL # EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxFjAUBgNVBAUT # DTIzMDAxMis1MDc1NjkwHwYDVR0jBBgwFoAUf1k/VCHarU/vBeXmo9ctBpQSCDEw # YAYDVR0fBFkwVzBVoFOgUYZPaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w # cy9jcmwvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNy # bDBtBggrBgEFBQcBAQRhMF8wXQYIKwYBBQUHMAKGUWh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmcl # MjBQQ0ElMjAyMDI0LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IC # AQAUnEqhaRXe0T3hIJjvdQErEkrA/7bByjn6t5IArODkkRjzkYwtKMc2yYj2quaN # rLutWw2YZcngKPy1b71YyDJQTy4NDRwaSh9Tw5thrk3NmcPrAHia5vtcBJ1CgtKK # 7mQbIcQ22d/N3813ayCDDFewu1+jsZmX+r/aTEqaOM4TVxVtRSkuCy8nAXKuChOK # Li/zA4XuH8iEYqIsj2YoNaeSxVmeGiERXpKdo3dDmYi0kO5w2D8VS4c3+9h6gElY # BaAAg/dYErBg27qT3vv0zRDJhJufvCNylA8S7/+8H5E/PV5cng6na9VV/w9OV3qu # uND6zdGa2EX38Glp50F9AIQk3p2xXmcvorDeM4XJ7UlWYBi6g80J1SSOQnInCYFE # msfUNn3+1AaTJKSJL83quKArTac2pKhu0Yzzzrzo6HrsRiQKzpnRBb1/dMa6P3hz # 75XbMRBctNsFhZC07WCmjExdLg2eHW5uV0TY8D5+6wozJf7vF3+WHkYPO85Z+BC6 # U4FkNbYNycZ9cE4j1tXRdyDCfml6c0HWPHjNVDObrv9lKt3qUqFpX38VCqVCyNOO # 1UcXfQiVjJw32U2WUKZjt/neJKHEBsm9kFsLuWzkQ53+qcaSaytmsCnk2gOglrlD # 5d3kKyvvAw+rzm0lT8K38P6PLxfZQHhu4W8dV7Av8N2ZmDCCBr0wggSloAMCAQIC # EzMAAAA5O7Y3Gb8GHWcAAAAAADkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBS # b290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDExMB4XDTI0MDgwODIwNTQxOFoX # DTM2MDMyMjIyMTMwNFowVzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQ # Q0EgMjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANgBnB7jOMeq # lRYHNa265v4IY9fH8TKhemHfPINe1gpLaV3dhg324WwH06LcHbpnsBukCDNitryo # 0dtS/EW6I/yEL/bLSY8hKpbfQuWusBPr9qazYcDxCW/qnjb5JsI1s8bNOg3bVATv # QVL4tcf03aTycsz8QeCdM0l/yHRObJ9QqazM1r6VPEOJ7LL+uEEb73w6QCuhs89a # 1uv1zerOYMnsneRRwCbpyW11IcggU0cRKDDq1pjVJzIbIF6+oiXXbReOsgeI8zu1 # FyQfK0fVkaya8SmVHQ/tOf23mZ4W9k0Ri22QW9p3UgSC5OUDktKxxcCmGL6tXLfO # GSWHIIV4YrTJTT6PNty5REojHJuZHArkF9VnHTERWoTjAzfI3kP+5b4alUdhgAZ7 # ttOu1bVnXfHaqPYl2rPs20ji03LOVWsh/radgE17es5hL+t6lV0eVHrVhsssROWJ # uz2MXMCt7iw7lFPG9LXKGjsmonn2gotGdHIuEg5JnJMJVmixd5LRlkmgYRZKzhxS # CwyoGIq0PhaA7Y+VPct5pCHkijcIIDm0nlkK+0KyepolcqGm0T/GYQRMhHJlGOOm # VQop36wUVUYklUy++vDWeEgEo4s7hxN6mIbf2MSIQ/iIfMZgJxC69oukMUXCrOC3 # SkE/xIkgpfl22MM1itkZ35nNXkMolU1lAgMBAAGjggFOMIIBSjAOBgNVHQ8BAf8E # BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFH9ZP1Qh2q1P7wXl5qPX # LQaUEggxMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMB # Af8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0fBFMwUTBP # oE2gS4ZJaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRSMFAw # TgYIKwYBBQUHMAKGQmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDANBgkqhkiG9w0BAQwFAAOC # AgEAFJQfOChP7onn6fLIMKrSlN1WYKwDFgAddymOUO3FrM8d7B/W/iQ6DxXsDn7D # 5W4wMwYeLystcEqfkjz4NURRgazyMu5yRzQh4LqjA4tStTcJh1opExo7nn5PuPBY # nbu0+THSuVHTe0VTTPVhily/piFrDo3axQ9P4C+Ol5yet+2gTfekICS5xS+cYfSI # vgn0JksVBVMYVI5QFu/qhnLhsEFEUzG8fvv0hjgkO+lkpV9ty6GkN4vdnd7ya6Q6 # aR9y34aiM1qmxaxBi6OUnyNl6fkuun/diTFnYDLTppOkr/mg5WSfCiDVMNCxtj4w # PKC5OmHm1DQIt/MNokbbH3UGsFP1QbzsLocuSqLCvH09Io3fDPTmscR9Y75G4qX7 # RTX8AdBPo0I6OEojf39zuFZt0qOHm65YWQE69cZM2ueE1MB05dNNgHK9gTE7zKvK # /fg8B2qjW88MT/WF5V5uvZGtqa9FSL2RazArA+rDPuf6JGYz4HpgMZHB4S6szWSK # YBv0VisCzfxgeU+dquXW9bd0auYlOB58DPcOYKdc3Se94g+xL4pcEhbB54JOgAkw # YTu/9dLeH2pDqeJZAABVDWRQCaXfO5LgyKwKCLYXpigrZYCjUSBcr+Ve8PFWMhVT # Ql0v4q8J/AUmQN5W4n101cY2L4A7GTQG1h32HHAvfQESWP0xghn9MIIZ+QIBATBu # MFcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # KDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMjQCEzMAAAIc # +s3Fm+gvfsQAAAAAAhwwDQYJYIZIAWUDBAIBBQCggbAwGQYJKoZIhvcNAQkDMQwG # CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZI # hvcNAQkEMSIEIMAVdUOnzzqnjSwqk26EJ6XZT2KmMKP3aLBO5CMgIfgYMEQGCisG # AQQBgjcCAQwxNjA0oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEcgBpodHRwczovL3d3 # dy5taWNyb3NvZnQuY29tIDANBgkqhkiG9w0BAQEFAASCAQC+vn7Q1cb3Dl6LuTka # Zu5gJbkxZnmzWXFdUDtx1SjLGzWB4kLQyknyUItPVeZLeYCgWs9+rOuuy4CoYu9R # HhDwKASkNdQrfJdc0uB6a+vG0X0pcciWpTbCeZjroV+oaKtrmr6RWGNnbNiVohTF # 6pkiZs3SyCi3QlIx4agTJpQLF+6+ZCgtYI3jTMclI0i151EFohLPzCx6jA3T8G1I # HbIh8tGOmDEyoXJ25IxIKtl8nWA7uPPNkT+EDRmcT7kpdst5RLuVEgqzcnIqpz95 # Ci0xr8Rg8MVKFctgWjiv+DaYrA+Y/tCPC7dSuY5Imz/eDTrRmqcfe/wfolhyCFVB # 9m0zoYIXrTCCF6kGCisGAQQBgjcDAwExgheZMIIXlQYJKoZIhvcNAQcCoIIXhjCC # F4ICAQMxDzANBglghkgBZQMEAgEFADCCAVoGCyqGSIb3DQEJEAEEoIIBSQSCAUUw # ggFBAgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIKHPDS9eBD4FPoC0 # 0XI420veG+SeY1qG0segKtlWklctAgZpvGfUlaUYEzIwMjYwNDIzMTYwMjQ1LjIw # N1owBIACAfSggdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGlt # aXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjJBMUEtMDVFMC1EOTQ3MSUw # IwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR+zCCBygwggUQ # oAMCAQICEzMAAAIQq83kFhjvObAAAQAAAhAwDQYJKoZIhvcNAQELBQAwfDELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z # b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjUwODE0MTg0ODEyWhcNMjYxMTEz # MTg0ODEyWjCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEt # MCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScw # JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046MkExQS0wNUUwLUQ5NDcxJTAjBgNVBAMT # HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCNxzirTntnAiCkq7ilNdYt6O9gR25F/7WYiluIkQwVZaZT # bGmKn7MrvEXEoYHUJyVRcFTT9lBnosbwfSAjvK+iyuw8QjUM8H9dxwYK+zApsApy # SeA64ZMQ8aTsr+8Rlr2HRe3TZvubaf0x0iOQusWXSkOuIrLPRAcal2H3dfr40Cl8 # TVMvbhWjTGR6gUakvetf2BeEg4Xn0QydN3ajjkVb+jEyBj2rTLSMY7QesItMJmvn # R7tNlFI1gDLaXIpu8ojYwqU3XAvMm9lttz/8vezWrcnoqFLQoLZU0QiZh0WBWQl6 # PjNmod9JxNvH2GMWAWlWQmXjEflUny3Il1cT369TST0BpPZA/VmbdZCZd51KguOM # jstbOe4fCegYhcuIkxDM+oqpEgUvfDNysOtl5aC0B0E9uKmCVnkJCezoFqPkxvpr # 8RkL0bd9olgrlBUd4Tp4uhITCnV3Pla6stc0+ynRVamWmX8UlvyOtFP+M6ge7zmp # Fx1imAHJT1bshY92u2GbJ+p4DDSiZVY3knFyiBhsujakA0keWwx1afEik3ljAdsY # Q8K6iwEc+TZd334T+lk9BRHq/4Pzl4Q3kD9kz/GI+nFrx0lnzsGlO+6Lv/a5+VQw # l/Zhz1ks+AR2FBCjQvAwNJMNPjzLexXs92j6Dmr4yqcnO03/qq3VyBRN7277KQID # AQABo4IBSTCCAUUwHQYDVR0OBBYEFJ7jb4Wul0XZq9tSGWTzoEtIfmR6MB8GA1Ud # IwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRp # bWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYI # KwYBBQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMv # TWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1Ud # EwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeA # MA0GCSqGSIb3DQEBCwUAA4ICAQC+zis7eijxzM6vE+qedISRRWrvXxDOWsiLLv8R # bsmZBewmgXEdZQXRTHQ8PIoUNFc8lW/b0XuSkmQEkmZxCDkdBXtuVRcgxZDWpfQp # 20VBcj8xEvvtn6krnHWNf61tGQDtrkW3u9a5GgASLTYekUfmb8CSH91+xvHzA6l5 # wlti+4e7LhobT+0bM5YULEww2EYAgnip1Xzsmdj+4wGaKh2Wb4bPfntdZbm2Dceu # 01le5DS1ZS/bq53icYomj+gtkc/vmnhGm3t0x1gpQX0C5UUHDFhlim+CTXa18r7/ # I7Crzj9+NdUJ0zzdCdrC1t6duT+Wdtz0qxmib4ae8DiK0AxSlJcVatxGSp1RAs34 # msbp88GhXz4PxTZDYXheSIJHoRT0nNgrBO68vq3ecW7GeQt02NtODb/K/aPdZoO4 # IrmVI+Cyd0iIfoGS7ZSLcDRpSjoP3P2/5cS4Gz2KhUlo6N//P5SuqDsRKfEbT9PV # 0pyLu8tDZc2BYVg7786UOO0aiZrWKNfibXg32qCtdO5YQbCALuGEGCneJ38sA5/0 # FJNYDmUGuKWwSh7FcGs6f/XAzeuMbSEizG8Xn9g4rvyZVEZjpjvNgn65e3g5M4UH # Bp0+/wySWt5Bks+dA+2LCiniuUtRho8KIPhhSpE1sunxKDKj2DSIBxljOdO5z7xD # xkiuDDCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcN # AQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAw # BgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEw # MB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt # U3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk # 4aZM57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9c # T8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWG # UNzBRMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6Gnsz # rYBbfowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2 # LXCOMcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLV # wIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTd # EonW/aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0 # gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFph # AXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJ # YfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXb # GjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJ # KwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnP # EP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMw # UQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggr # BgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYw # DwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoY # xDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp # L2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYB # BQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v # cGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0B # AQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U5 # 18JxNj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgAD # sAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo # 32X2pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZ # iefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZK # PmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RI # LLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgk # ujhLmm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9 # af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzba # ukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/ # OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNWMIIC # PgIBATCCAQGhgdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGlt # aXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjJBMUEtMDVFMC1EOTQ3MSUw # IwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4D # AhoDFQA6zJ/ZvquI8qedeUiAgvZ/nc9SwqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l # LVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA7ZRfVjAiGA8yMDI2MDQy # MzA5MDUyNloYDzIwMjYwNDI0MDkwNTI2WjB0MDoGCisGAQQBhFkKBAExLDAqMAoC # BQDtlF9WAgEAMAcCAQACAjOsMAcCAQACAhKBMAoCBQDtlbDWAgEAMDYGCisGAQQB # hFkKBAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAw # DQYJKoZIhvcNAQELBQADggEBAI4hF2prkMW3bZ7NU80nVZXVgaTup2MejWN9GAld # 1F2HXsj+ytn3/mAzXRfidZFzAYNov2guRo9qQRRDjgQ1XKWAWy1MoP5VPWnTj4zs # iUq8mEH1bgvSgxOl0v4268zF2t543icHxCm1K70co6SeN6uPXBZnRFdOHyjnswR3 # s/Ff4c2i09JBq7NhqEvbpi4fYepyL5GTF/vEBCl54fbA7rJJAqQ2rfI4UIJAiPza # NG6xR2v+BkcZHXTLaeL4OidIE9cD8Z1SlRf1Uz0Oi32cGyGC7q7F8p8DRbRIsS9H # Io8usJvwcQ2RFQLzYUiP7xFI2h0iEJm3iIRDngMroz9Wy14xggQNMIIECQIBATCB # kzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAhCrzeQWGO85sAAB # AAACEDANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJ # EAEEMC8GCSqGSIb3DQEJBDEiBCDQl3/xvayCIs8GvllsqV/i1uNpyQdkbo4P/GRZ # PwApUzCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIMPVIe5+yPNjn1LWIdRB # j2GewpKsk+Dlr0xzhicaY8fGMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTACEzMAAAIQq83kFhjvObAAAQAAAhAwIgQgRB0Lalv+VB+4aYjZAvQw # E17yokTEwjNeX+Dd2C0AdHwwDQYJKoZIhvcNAQELBQAEggIAPSjiamo///slOUhG # iiA43FHHuzgCs+Yiec3NS6DLWnBLSLvRLKP/HAM0uwVY0i7ykJd/8jEoR4UGPDAz # gaaKSaXDfanDwwrDIdcGbHivWBuTiX1otNwk+SIBb7uOBmPJpT9vDeheu4SiICKD # cSu1L7H13BV9YSqL3vOS8YmgUxUSnr4LZKdJfowCkJDuWxQ7girEUCvanz5LIVZC # B0BLHww4h46klYFPuyX8mMWAzP0aukq8CcoQJ63eSGIEG2FfoZiokLg/TZe7n6N5 # 106KLaCELKNHkjoLcSesREqraA0S/K3Y8wmgoxT0/8FvHIslN4g5xLIfUtm5sGI7 # MJ4ODcnebjUedbJOvjq0vr7fj1xqLF9kxVlPpGmippDy+LxhgEB8BF44LLAxHP73 # SHJLVgbIBNNyhgO93o5Ys43QvBTXbJU+qOsnRMOuVDPshAS/FqpmhksVxucchL9N # SNP3bpNRz2nvycR4jgi8PdObvdvnHL3pMS9Hz7h20om1d5P0HyNoZJmQNHfxGvCn # 4Hkab8gmSs0sNGzAMC6QmOYKRdwP3Nu/5toJKqZGLqo+VEM69f7jDumEk6CS0A60 # tdcajZvxNGVqV89nrtU9R2BauQ0yMwlzRYZeCjABb7mMgUvgQ5lLZePO7+z1/Wvu # HrKj/Okm4s2+MTZu0b3xCyLsu1Y= # SIG # End signature block |