<# .SYNOPSIS This script uses Exchange EWS to check if there are new unread voicemail messages in a user's mailbox & sets a Blynclight to Red if there are. If there are no messages, it sets the Blynclight to Green. .DESCRIPTION This script uses Exchange EWS to check if there are new unread voicemail messages in a user's mailbox & sets a Blynclight to Red if there are. If there are no messages, it sets the Blynclight to Green. The Exhcnage EWS dll is required. The script will abort if this is not found/loaded. It will run with no command-line parameters and assumes the logged-in user. .NOTES Version : 1.0 Date : April 2015 Author : Greig Sheridan Based upon : http://www.infinitec.de/post/2011/07/25/How-to-get-the-number-of-unread-mails-from-multiple-mailboxes-using-the-EWS-Managed-API-and-PowerShell.aspx Revision History : v1.0: April 2015 Initial release. .LINK https://greiginsydney.com/MuckingWithMwi-PartI .EXAMPLE .\Get-UnreadVoicemailMessagesl.ps1 Description ----------- Checks the e-mail Inbox of the currently-logged-on user and retrieves the count of their unread voicemail messages. Usage: .\Get-UnreadVoicemailMessagesl.ps1 EmailAddress UnreadVoicemailCount ------------ -------------------- greig@contoso.com 0 .EXAMPLE .\Get-UnreadVoicemailMessagesl.ps1 -identity "jessica rabbit" -cred $cred Description ----------- Checks the e-mail Inbox of a different user and retrieves the count of their unread voicemail messages. $Cred is a variable of type Credential. Usage: PS C:\>$cred = get-credential PS C:\>.\Get-UnreadVoicemailMessagesl.ps1 -identity "jessica rabbit" -cred $cred | ft -auto EmailAddress UnreadVoicemailCount ------------ -------------------- jessica@contoso.com 1 .EXAMPLE .\Get-UnreadVoicemailMessagesl.ps1 -identity "gilligan" -passwordfile "c:\temp\gilligan-pwd.txt" Description ----------- Checks the e-mail Inbox of a different user and retrieves the count of their unread voicemail messages. "passwordfile" is their an encoded password and "identity" MUST be their SamId. .PARAMETER Identity The e-mail address of the user's mailbox. Optional. You only need to provide it if you want to query the mailbox of someone other than the account of the logged-in user .PARAMETER Credential A Windows credential value. Optional. You only need to supply this is you want to query the mailbox of someone other than the account of the logged-in user Credential and PasswordFile are mutually exclusive. .PARAMETER PasswordFile A user's password stored as a secure string in a text file. Run this command to generate the secured password file: "read-host "Password?" -assecurestring | convertfrom-securestring | out-file C:\cred.txt" The script will use the "-identity" you provided with this password to attempt to login to EWS: but it needs to be their *SamID*! PasswordFile and Credential are mutually exclusive. #> [CmdletBinding(SupportsShouldProcess = $False, DefaultParameterSetName='None')] param( [Parameter(Mandatory = $false)] [alias("i")][String]$Identity, [Parameter(ParameterSetName='Cred', Mandatory = $false)] [alias("c")][System.Management.Automation.PSCredential]$Cred, [Parameter(ParameterSetName='Pass', Mandatory = $false)] [alias("p")][String]$PasswordFile ) $ScriptVersion = "1.0" #Written to the title page of the document $Error.Clear() #Clear PowerShell's error variable $ErrorActionPreference = "Stop" $mail = "" $scriptpath = $MyInvocation.MyCommand.Path $scriptdir = Split-Path $scriptpath if ($identity -eq "") { $searcher = [adsisearcher]"(samaccountname=$env:USERNAME)" $mail = $searcher.FindOne().Properties.mail } else { if ($identity -match "@") { #We'll assume it's an e-mail address! write-verbose "A valid-looking e-mail address was provided" $mail = $identity } else { #We'll try our luck in AD: $AttributeList = @("samaccountname","displayname") foreach ($Attribute in $AttributeList) { $searcher = [adsisearcher]"($Attribute=$identity)" $mail = $searcher.FindOne().Properties.mail if ($mail -ne $null) { write-verbose "Found a mail address ($($mail)) against $($Attribute)" break } } } } if (($mail -eq "") -or ($mail -eq $null)) { throw "Invalid or no e-mail address found" } $EwsDll = "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll" #Download it from here: http://www.microsoft.com/en-us/download/details.aspx?id=42951 if (test-path $EwsDll) { try { [Reflection.Assembly]::LoadFrom($EWsDll) | out-null } catch { throw "Error loading the EWS DLL: ({0})." -f $EwsDll } } else { throw "Unable to find the EWS DLL: ({0})." -f $EwsDll } $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1) if ($Cred -ne $null) { write-verbose "Authenticating with the credentials provided in the `$cred variable" $service.Credentials = $Cred.GetNetworkCredential() } elseif (($PasswordFile -ne $null) -and ($PasswordFile -ne "")) { write-host "its not null" $PasswordFile = $PasswordFile.trimStart(".", "\") # Just in case we tabbed to auto-complete the file name #If the user only provided a filename, add the script's path for an absolute reference: if (!([System.IO.Path]::GetDirectoryName($PasswordFile))) { $PasswordFile = $scriptdir + "\" + $PasswordFile } write-verbose "Authenticating with the password from ""$passwordfile""" $password = get-content $PasswordFile | convertto-securestring $credential = new-object -typename System.Management.Automation.PSCredential -argumentlist $identity,$password $service.Credentials = $credential.GetNetworkCredential() } else { write-verbose "Authenticating as the logged-in user" $service.UseDefaultCredentials = $true; } function GetUnreadInboxVoiceMail([string] $emailAddress) { $service.AutodiscoverUrl($emailAddress, {$true}); $maibox = New-Object Microsoft.Exchange.WebServices.Data.Mailbox($emailAddress) $folderId = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Voicemail, $mailbox) $folder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service, $folderId); $result = New-Object PSObject -Property @{ EmailAddress = $emailAddress UnreadVoicemailCount= $folder.UnreadCount; } return $result; } $Voicemails = GetUnreadInboxVoiceMail($mail) $Voicemails #Comment this line out to suppress the on-screen display of unread messages try { if ($Voicemails.UnreadVoicemailCount -gt 0) { invoke-expression "& '$($scriptdir)\blynccommander' -light red -flash high" } else { invoke-expression "& '$($scriptdir)\blynccommander' -light off" } } catch { write-verbose "An error occurred. Check the ""errors.txt"" file" $_ | fl * -f | Out-File ($scriptdir + "\errors.txt") } # ------------------------------- # Credits: # # This script is based upon a script from Henning Krause's Blog: # http://www.infinitec.de/post/2011/07/25/How-to-get-the-number-of-unread-mails-from-multiple-mailboxes-using-the-EWS-Managed-API-and-PowerShell.aspx # # AD-query for your e-mail address courtesy of Shay Levy: # http://www.powershellmagazine.com/2012/11/14/pstip-how-to-get-the-email-address-of-the-currently-logged-on-user/ # # Encoding a password into an encrypted file: # http://blogs.technet.com/b/robcost/archive/2008/05/01/powershell-tip-storing-and-using-password-credentials.aspx # # ------------------------------- # Code-signing certificate with thanks to DigiCert: # # SIG # Begin signature block # MIIcdAYJKoZIhvcNAQcCoIIcZTCCHGECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUlX9PlcjLxbkLlWLHN4jlFUHb # bhKgghejMIIFLDCCBBSgAwIBAgIQDcqIIit7XxEAplLxvqP4QTANBgkqhkiG9w0B # AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE0MTExNzAwMDAwMFoXDTE2MDIx # ODEyMDAwMFowczELMAkGA1UEBhMCQVUxGDAWBgNVBAgTD05ldyBTb3V0aCBXYWxl # czEYMBYGA1UEBxMPUGV0ZXJzaGFtIE5vcnRoMRcwFQYDVQQKEw5HcmVpZyBTaGVy # aWRhbjEXMBUGA1UEAxMOR3JlaWcgU2hlcmlkYW4wggEiMA0GCSqGSIb3DQEBAQUA # A4IBDwAwggEKAoIBAQCwfeal69RryMozRaU3uH26m9i5v5ln9iprIE7pLXpBUcE+ # 7yDrs7fx2HrYGg8ZL9gciD35Hz/2Fa2oy7kuoKwSoYtPU3khpc6q/cJKWOfh0PtY # 9sNcLqDKm8uAlAySSXnZQaD5aB11Nhhq4l4X+HO6qqfdOqT/cd50jU0DX1ZDVWeF # qQH21gi2d8IaUtZSaJgxEYdkA/0kcSMplSJle6duEWlz7ZlC8hNtiH+zxY5el4fP # 41RynI9fFbdkW1gYtx5Mfhtwliq6it/0eMiIITstz1xxRHtdOBgusqsqHmaoXujt # i2ENTfTSPCumFsUgNqCYxftyZM8XidL1Yo0rJM5fAgMBAAGjggG7MIIBtzAfBgNV # HSMEGDAWgBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAdBgNVHQ4EFgQUwzSjtYS43JIC # mI/FKEgG1IPsBP4wDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMD # MHcGA1UdHwRwMG4wNaAzoDGGL2h0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9zaGEy # LWFzc3VyZWQtY3MtZzEuY3JsMDWgM6Axhi9odHRwOi8vY3JsNC5kaWdpY2VydC5j # b20vc2hhMi1hc3N1cmVkLWNzLWcxLmNybDBCBgNVHSAEOzA5MDcGCWCGSAGG/WwD # ATAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGE # BggrBgEFBQcBAQR4MHYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0 # LmNvbTBOBggrBgEFBQcwAoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0U0hBMkFzc3VyZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQC # MAAwDQYJKoZIhvcNAQELBQADggEBABtD6gTMwsKbzL8he2NbJb96yDR0xGidB99p # p2u+meWprw8uj+lDk8Q0SFxguN+OMeV6y1D/df0Ohc5KHKLkWvoPxPyQ4UXzDNSc # /ipOAH6K0F07GNmQIYWWY/vSPpoTBd4mbFcYlpWFZmESOv0SFr8Ry8CkNy6WdEM2 # uLAUiY9PbfMZwNwGIWwVsRKQJM9gjHS3CGqzJ/T50SMj3oosvEh3BlB7gnwloKfG # YsmPqksdmS8MPvCuZ0f7uY2akyi3l4l3zQK2KBPgryFIAyLww98u04H83vLrh/v1 # w7zTiaUTVyzAcYJqDJ+C2PqDprxmic+h5LembJDJcubTB3f1F+IwggUwMIIEGKAD # AgECAhAECRgbX9W7ZnVTQ7VvlVAIMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYT # AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy # dC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0x # MzEwMjIxMjAwMDBaFw0yODEwMjIxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYD # VQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAv # BgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0Ew # ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD407Mcfw4Rr2d3B9MLMUkZ # z9D7RZmxOttE9X/lqJ3bMtdx6nadBS63j/qSQ8Cl+YnUNxnXtqrwnIal2CWsDnko # On7p0WfTxvspJ8fTeyOU5JEjlpB3gvmhhCNmElQzUHSxKCa7JGnCwlLyFGeKiUXU # LaGj6YgsIJWuHEqHCN8M9eJNYBi+qsSyrnAxZjNxPqxwoqvOf+l8y5Kh5TsxHM/q # 8grkV7tKtel05iv+bMt+dDk2DZDv5LVOpKnqagqrhPOsZ061xPeM0SAlI+sIZD5S # lsHyDxL0xY4PwaLoLFH3c7y9hbFig3NBggfkOItqcyDQD2RzPJ6fpjOp/RnfJZPR # AgMBAAGjggHNMIIByTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIB # hjATBgNVHSUEDDAKBggrBgEFBQcDAzB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUH # MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDov # L2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNy # dDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDovL2NybDMuZGln # aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDBPBgNVHSAESDBG # MDgGCmCGSAGG/WwAAgQwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNl # cnQuY29tL0NQUzAKBghghkgBhv1sAzAdBgNVHQ4EFgQUWsS5eyoKo6XqcQPAYPkt # 9mV1DlgwHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcN # AQELBQADggEBAD7sDVoks/Mi0RXILHwlKXaoHV0cLToaxO8wYdd+C2D9wz0PxK+L # /e8q3yBVN7Dh9tGSdQ9RtG6ljlriXiSBThCk7j9xjmMOE0ut119EefM2FAaK95xG # Tlz/kLEbBw6RFfu6r7VRwo0kriTGxycqoSkoGjpxKAI8LpGjwCUR4pwUR6F6aGiv # m6dcIFzZcbEMj7uo+MUSaJ/PQMtARKUT8OZkDCUIQjKyNookAv4vcn4c10lFluhZ # Hen6dGRrsutmQ9qzsIzV6Q3d9gEgzpkxYz0IGhizgZtPxpMQBvwHgfqL2vmCSfdi # bqFT+hKUGIUukpHqaGxEMrJmoecYpJpkUe8wggZqMIIFUqADAgECAhADAZoCOv9Y # sWvW1ermF/BmMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV # BAMTGERpZ2lDZXJ0IEFzc3VyZWQgSUQgQ0EtMTAeFw0xNDEwMjIwMDAwMDBaFw0y # NDEwMjIwMDAwMDBaMEcxCzAJBgNVBAYTAlVTMREwDwYDVQQKEwhEaWdpQ2VydDEl # MCMGA1UEAxMcRGlnaUNlcnQgVGltZXN0YW1wIFJlc3BvbmRlcjCCASIwDQYJKoZI # hvcNAQEBBQADggEPADCCAQoCggEBAKNkXfx8s+CCNeDg9sYq5kl1O8xu4FOpnx9k # WeZ8a39rjJ1V+JLjntVaY1sCSVDZg85vZu7dy4XpX6X51Id0iEQ7Gcnl9ZGfxhQ5 # rCTqqEsskYnMXij0ZLZQt/USs3OWCmejvmGfrvP9Enh1DqZbFP1FI46GRFV9GIYF # jFWHeUhG98oOjafeTl/iqLYtWQJhiGFyGGi5uHzu5uc0LzF3gTAfuzYBje8n4/ea # 8EwxZI3j6/oZh6h+z+yMDDZbesF6uHjHyQYuRhDIjegEYNu8c3T6Ttj+qkDxss5w # RoPp2kChWTrZFQlXmVYwk/PJYczQCMxr7GJCkawCwO+k8IkRj3cCAwEAAaOCAzUw # ggMxMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoG # CCsGAQUFBwMIMIIBvwYDVR0gBIIBtjCCAbIwggGhBglghkgBhv1sBwEwggGSMCgG # CCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIIBZAYIKwYB # BQUHAgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMA # ZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEA # YwBjAGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIA # dAAgAEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcA # IABQAGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwA # aQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkA # bgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUA # ZgBlAHIAZQBuAGMAZQAuMAsGCWCGSAGG/WwDFTAfBgNVHSMEGDAWgBQVABIrE5iy # mQftHt+ivlcNK2cCzTAdBgNVHQ4EFgQUYVpNJLZJMp1KKnkag0v0HonByn0wfQYD # VR0fBHYwdDA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # QXNzdXJlZElEQ0EtMS5jcmwwOKA2oDSGMmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3JsMHcGCCsGAQUFBwEBBGswaTAkBggr # BgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVo # dHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURDQS0x # LmNydDANBgkqhkiG9w0BAQUFAAOCAQEAnSV+GzNNsiaBXJuGziMgD4CH5Yj//7HU # aiwx7ToXGXEXzakbvFoWOQCd42yE5FpA+94GAYw3+puxnSR+/iCkV61bt5qwYCbq # aVchXTQvH3Gwg5QZBWs1kBCge5fH9j/n4hFBpr1i2fAnPTgdKG86Ugnw7HBi02JL # sOBzppLA044x2C/jbRcTBu7kA7YUq/OPQ6dxnSHdFMoVXZJB2vkPgdGZdA0mxA5/ # G7X1oPHGdwYoFenYk+VVFvC7Cqsc21xIJ2bIo4sKHOWV2q7ELlmgYd3a822iYemK # C23sEhi991VUQAOSK2vCUcIKSK+w1G7g9BQKOhvjjz3Kr2qNe9zYRDCCBs0wggW1 # oAMCAQICEAb9+QOWA63qAArrPye7uhswDQYJKoZIhvcNAQEFBQAwZTELMAkGA1UE # BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj # ZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4X # DTA2MTExMDAwMDAwMFoXDTIxMTExMDAwMDAwMFowYjELMAkGA1UEBhMCVVMxFTAT # BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEh # MB8GA1UEAxMYRGlnaUNlcnQgQXNzdXJlZCBJRCBDQS0xMIIBIjANBgkqhkiG9w0B # AQEFAAOCAQ8AMIIBCgKCAQEA6IItmfnKwkKVpYBzQHDSnlZUXKnE0kEGj8kz/E1F # kVyBn+0snPgWWd+etSQVwpi5tHdJ3InECtqvy15r7a2wcTHrzzpADEZNk+yLejYI # A6sMNP4YSYL+x8cxSIB8HqIPkg5QycaH6zY/2DDD/6b3+6LNb3Mj/qxWBZDwMiEW # icZwiPkFl32jx0PdAug7Pe2xQaPtP77blUjE7h6z8rwMK5nQxl0SQoHhg26Ccz8m # SxSQrllmCsSNvtLOBq6thG9IhJtPQLnxTPKvmPv2zkBdXPao8S+v7Iki8msYZbHB # c63X8djPHgp0XEK4aH631XcKJ1Z8D2KkPzIUYJX9BwSiCQIDAQABo4IDejCCA3Yw # DgYDVR0PAQH/BAQDAgGGMDsGA1UdJQQ0MDIGCCsGAQUFBwMBBggrBgEFBQcDAgYI # KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCDCCAdIGA1UdIASCAckwggHFMIIB # tAYKYIZIAYb9bAABBDCCAaQwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cuZGlnaWNl # cnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5odG0wggFkBggrBgEFBQcCAjCCAVYe # ggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIAdABpAGYA # aQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMAZQBwAHQA # YQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAAQwBQAC8A # QwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAAYQByAHQA # eQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0AaQB0ACAA # bABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMAbwByAHAA # bwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUAcgBlAG4A # YwBlAC4wCwYJYIZIAYb9bAMVMBIGA1UdEwEB/wQIMAYBAf8CAQAweQYIKwYBBQUH # AQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYI # KwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFz # c3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmwz # LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaG # NGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RD # QS5jcmwwHQYDVR0OBBYEFBUAEisTmLKZB+0e36K+Vw0rZwLNMB8GA1UdIwQYMBaA # FEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBBQUAA4IBAQBGUD7Jtygk # pzgdtlspr1LPUukxR6tWXHvVDQtBs+/sdR90OPKyXGGinJXDUOSCuSPRujqGcq04 # eKx1XRcXNHJHhZRW0eu7NoR3zCSl8wQZVann4+erYs37iy2QwsDStZS9Xk+xBdIO # PRqpFFumhjFiqKgz5Js5p8T1zh14dpQlc+Qqq8+cdkvtX8JLFuRLcEwAiR78xXm8 # TBJX/l/hHrwCXaj++wc4Tw3GXZG5D2dFzdaD7eeSDY2xaYxP+1ngIw/Sqq4AfO6c # Qg7PkdcntxbuD8O9fAqg7iwIVYUiuOsYGk38KiGtSTGDR5V3cdyxG0tLHBCcdxTB # nU8vWpUIKRAmMYIEOzCCBDcCAQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoT # DERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UE # AxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQQIQDcqI # Iit7XxEAplLxvqP4QTAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAA # oQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4w # DAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU1NTH3KuE2R3mfD3IOBxsndbD # bFMwDQYJKoZIhvcNAQEBBQAEggEAYBcKSFiHKy//yQ5F5S06KTsjoC6zob8Xdt+J # eMie50G9Tok17yicJtbSCBo8961czD+cS2ms0ZImLxd6heK38mbWHygX9ybqA7uh # +yEcZih/Ww+iZZBsWJ+gZg/sN1u6Ruc6b4/HpGCCTWe6AAbLDXBsvUyGWTJge6UA # IKUvblaMBBAux7yCAxWSJY5zSgDYPnjpH1TaXVde9zbFQ30xaZQmTyQnHer7IstY # jU2X50lTx1hFdlJimZBnA7d+v4pdVid56h1C4HA45HpclRf8TkFY0GhUjvrymSpB # M+RZ7K3Sn6OOXZIEd2wWk4TwEwNBsUMTnS5vJavT3VLikxlHl6GCAg8wggILBgkq # hkiG9w0BCQYxggH8MIIB+AIBATB2MGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxE # aWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMT # GERpZ2lDZXJ0IEFzc3VyZWQgSUQgQ0EtMQIQAwGaAjr/WLFr1tXq5hfwZjAJBgUr # DgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUx # DxcNMTUwNDAxMDEwNDEyWjAjBgkqhkiG9w0BCQQxFgQUcyx3t2MgIpji2R60FDwD # 9o3nVmYwDQYJKoZIhvcNAQEBBQAEggEAehk8mrEi4v1+SvWmF7VlStpzGnBtg065 # 2rT2oswV8zGXcIIt55JZ3404X6/hXUjg8xC3ur29FDspmuWgH8nconbd7PevPqML # b9pTdAqoiC2kh6grV9G1Oh63Chz3J2mRSZNDT58NApXywvAJmdYzwrarBriSHOEX # y3NmQcklSLY9o0QxOFmqchknRiaKnwoeRifUqyniTNuvksfedjmz0cgjWdVvOkpv # fv0d7Uxrk2BTGmUTJBr8I8s8BiL2kPQ1pGfeDOWU8ybLQIuT5EgpAMXzAKLXXMat # GLUvrhFJMRVwgQwij3u8mWtdJkCyvg9rDbjHKLH9qMwW8wuQk6Cvcw== # SIG # End signature block