functions/Set-WUGActiveMonitor.ps1
|
<#
.SYNOPSIS Manage monitors in WhatsUp Gold at both the library and device levels, including assigning monitors to devices, updating device assignments (including batch), and updating library monitor definitions. .DESCRIPTION - Update library (template) monitor definitions. - Assign new monitors to one or more devices. - Update or disable/enable one or more monitor assignments by AssignmentId(s) for any device, supporting batch operations. - All operations use the WhatsUp Gold REST API. - Handles paging for bulk device assignment updates if required. .PARAMETER Mode "Library" (update template), "Device" (assign new or update assignment). .PARAMETER MonitorId Monitor's unique ID (required for library-level operations). .PARAMETER DeviceId Device ID(s) (required for device operations). .PARAMETER AssignmentId Assignment ID(s) to update for the device(s) (array/batch supported). .PARAMETER MonitorTypeId Monitor type ID (for assignment/creation). .PARAMETER MonitorTypeName Monitor type name (for assignment/creation). .PARAMETER Enabled Enable ("true") or disable ("false") the monitor assignment/template. .PARAMETER Name Template name (library only). .PARAMETER Description Template/assignment description. .PARAMETER PropertyBags Array of custom property bags (template only). .PARAMETER UseInDiscovery Boolean, for library monitors. .PARAMETER PollingIntervalSeconds Polling interval for device-level monitors in seconds. .PARAMETER CriticalOrder Critical order for device-level monitors. .PARAMETER ActionPolicyId Action policy ID for device-level monitors. .PARAMETER ActionPolicyName Action policy name for device-level monitors. .EXAMPLE # Disable a set of monitor assignments on a device: Set-WUGActiveMonitor -Mode Device -DeviceId 123 -AssignmentId 456,457,458 -Enabled "false" .EXAMPLE # Enable and update polling interval for multiple assignments on multiple devices: Set-WUGActiveMonitor -Mode Device -DeviceId 123,124 -AssignmentId 456,789 -Enabled "true" -PollingIntervalSeconds 300 .EXAMPLE # Assign a new monitor to a device Set-WUGActiveMonitor -Mode Device -DeviceId 101 -MonitorTypeName "CPU Usage" -PollingIntervalSeconds 120 -Enabled "true" .EXAMPLE # Update a monitor's library configuration Set-WUGActiveMonitor -Mode Library -MonitorId "12345" -Name "Updated Monitor" -Description "Updated Description" -UseInDiscovery $true .NOTES Author: jayyx2 + Copilot Reference: WhatsUp Gold REST API documentation #> function Set-WUGActiveMonitor { [CmdletBinding()] param ( [Parameter(Mandatory=$true)][ValidateSet("Library", "Device")][string]$Mode, [Parameter()][string]$MonitorId, [Parameter()][Alias("id")][int[]]$DeviceId, [Parameter()][int[]]$AssignmentId, [Parameter()][string]$MonitorTypeId, [Parameter()][string]$MonitorTypeName, [Parameter()][ValidateSet("true", "false")][string]$Enabled, [Parameter()][string]$Name, [Parameter()][string]$Description, [Parameter()][array]$PropertyBags, [Parameter()][bool]$UseInDiscovery, [Parameter()][ValidateRange(10, 86400)][int]$PollingIntervalSeconds, [Parameter()][ValidateRange(1, 32)][int]$CriticalOrder, [Parameter()][string]$ActionPolicyId, [Parameter()][string]$ActionPolicyName ) begin { if (-not $global:WUGBearerHeaders) { Write-Error "Authorization header not set. Please run Connect-WUGServer first." return } if (-not $global:WhatsUpServerBaseURI) { Write-Error "Base URI not found. Please run Connect-WUGServer first." return } } process { if ($Mode -eq "Library") { if (-not $MonitorId) { Write-Error "-MonitorId is required for library-level operations." return } $body = @{} if ($Name) { $body.name = $Name } if ($Description) { $body.description = $Description } if ($PropertyBags) { $body.propertyBags = $PropertyBags } if (!$UseInDiscovery) { $body.useInDiscovery = $UseInDiscovery } if (!$Enabled) { $body.enabled = [System.Convert]::ToBoolean($Enabled) } $uri = "${global:WhatsUpServerBaseURI}/api/v1/monitor/${MonitorId}" $jsonBody = $body | ConvertTo-Json -Depth 10 try { $response = Get-WUGAPIResponse -Uri $uri -Method PUT -Body $jsonBody Write-Verbose "Library-level configuration updated successfully for monitor ID: ${MonitorId}." return $response } catch { Write-Error "Failed to update library configuration for monitor ID: ${MonitorId}: $_" } } elseif ($Mode -eq "Device") { if ($AssignmentId -and $DeviceId) { # Batch update/disable/enable existing assignments on one or more devices foreach ($deviceId in $DeviceId) { foreach ($assignmentId in $AssignmentId) { $body = @{} if (!$Enabled) { $body.enabled = [System.Convert]::ToBoolean($Enabled) } if ($Description) { $body.description = $Description } $active = @{} if ($PollingIntervalSeconds) { $active.pollingIntervalSeconds = $PollingIntervalSeconds } if ($CriticalOrder) { $active.criticalOrder = $CriticalOrder } if ($ActionPolicyId) { $active.actionPolicyId = $ActionPolicyId } if ($ActionPolicyName) { $active.actionPolicyName = $ActionPolicyName } if ($active.Count -gt 0) { $body.active = $active } $uri = "${global:WhatsUpServerBaseURI}/api/v1/devices/${deviceId}/monitors/${assignmentId}" $jsonBody = $body | ConvertTo-Json -Depth 10 try { $response = Get-WUGAPIResponse -Uri $uri -Method PUT -Body $jsonBody Write-Verbose "Assignment updated for device ID: ${deviceId}, assignment ID: ${assignmentId}." } catch { Write-Error "Failed to update assignment for device ID: ${deviceId}, assignment ID: ${assignmentId}: $_" } } } } elseif ($DeviceId) { # Assign new monitor to device(s) (no AssignmentId means this is a create, not update) foreach ($deviceId in $DeviceId) { $body = @{} $body.type = "active" if ($MonitorTypeId) { $body.monitorTypeId = $MonitorTypeId } if ($MonitorTypeName) { $body.monitorTypeName = $MonitorTypeName } if (!$Enabled) { $body.enabled = [System.Convert]::ToBoolean($Enabled) } if ($Description) { $body.description = $Description } $active = @{} if ($PollingIntervalSeconds) { $active.pollingIntervalSeconds = $PollingIntervalSeconds } if ($CriticalOrder) { $active.criticalOrder = $CriticalOrder } if ($ActionPolicyId) { $active.actionPolicyId = $ActionPolicyId } if ($ActionPolicyName) { $active.actionPolicyName = $ActionPolicyName } if ($active.Count -gt 0) { $body.active = $active } $uri = "${global:WhatsUpServerBaseURI}/api/v1/devices/${deviceId}/monitors" $jsonBody = $body | ConvertTo-Json -Depth 10 try { $response = Get-WUGAPIResponse -Uri $uri -Method POST -Body $jsonBody Write-Verbose "Monitor assigned/updated successfully for device ID: ${deviceId}." } catch { Write-Error "Failed to assign/update monitor for device ID: ${deviceId}: $_" } } } else { Write-Error "For device-level operations, you must provide -DeviceId. To update/disable a specific assignment, provide both -DeviceId and -AssignmentId." } } else { Write-Error "Invalid -Mode. Use 'Library' or 'Device'." } } } # SIG # Begin signature block # MIIVvgYJKoZIhvcNAQcCoIIVrzCCFasCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDh27oUK6+H19wl # NvsnrQk2sM/fMRfhWljcoStS9GVijKCCEfkwggVvMIIEV6ADAgECAhBI/JO0YFWU # jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI # DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM # EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy # dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG # EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv # IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s # hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD # J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7 # P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme # me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz # T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q # RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz # mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc # QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T # OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/ # AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID # AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD # VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE # VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v # ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE # KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI # hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF # OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC # J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ # pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl # d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH # +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M # UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD # VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv # ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5 # NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp # BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G # CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI # ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV # DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3 # 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw # mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm # +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe # dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4 # 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM # dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY # MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU # pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV # HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG # A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1 # YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG # AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl # U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0 # aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh # w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd # OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj # cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc # WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO # hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs # zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7 # 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J # KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH # j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2 # Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/ # L9Uo2bC5a4CH2RwwggZkMIIEzKADAgECAhEA6IUbK/8zRw2NKvPg4jKHsTANBgkq # hkiG9w0BAQwFADBUMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p # dGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2 # MB4XDTIzMDQxOTAwMDAwMFoXDTI2MDcxODIzNTk1OVowVTELMAkGA1UEBhMCVVMx # FDASBgNVBAgMC0Nvbm5lY3RpY3V0MRcwFQYDVQQKDA5KYXNvbiBBbGJlcmlubzEX # MBUGA1UEAwwOSmFzb24gQWxiZXJpbm8wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQC2JA01BehqpO3INejKVsKScaS9sd0Hjoz1tceFig6Yyu2glTKimH9n # r9l5438Cjpc1x+n42gMfnS5Cza4tZUWr1usOq3d0TljKFOOSW8Uve1J+PC0f/Hxp # DbI8hE38ICDmgv8EozBOgo4lPm/rDHVTHgiRZvy1H8gPTuE13ck2sevVslku2E2F # 8wst5Kb12OqngF96RXptEeM0iTipPhfNinWCa8e58+mbt1dHCbX46593DRd3yQv+ # rvPkIh9QkMGmumfjV5lv1S3iqf/Vg6XP9R3lTPMWNO2IEzIjk12t817rU3xYyf2Q # 4dlA/i1bRpFfjEVcxQiZJdQKnQlqd3hOk0tr8bxTI3RZxgOLRgC8mA9hgcnJmreM # WP4CwXZUKKX13pMqzrX/qiSUsB+Mvcn7LHGEo9pJIBgMItZW4zn4uPzGbf53EQUW # nPfUOSBdgkRAdkb/c7Lkhhc1HNPWlUqzS/tdopI7+TzNsYr7qEckXpumBlUSONoJ # n2V1zukFbgsBq0mRWSZf+ut3OVGo7zSYopsMXSIPFEaBcxNuvcZQXv6YdXEsDpvG # mysbgVa/7uP3KwH9h79WeFU/TiGEISH5B59qTg26+GMRqhyZoYHj7wI36omwSNja # tUo5cYz4AEYTO58gceMcztNO45BynLwPbZwZ0bxPN2wL1ruIYd+ewQIDAQABo4IB # rjCCAaowHwYDVR0jBBgwFoAUDyrLIIcouOxvSK4rVKYpqhekzQwwHQYDVR0OBBYE # FJHuVIzRubayI0tfw82Q7Q/47iu9MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E # AjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMEoGA1UdIARDMEEwNQYMKwYBBAGyMQEC # AQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeB # DAEEATBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLnNlY3RpZ28uY29tL1Nl # Y3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2LmNybDB5BggrBgEFBQcBAQRtMGsw # RAYIKwYBBQUHMAKGOGh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1Ymxp # Y0NvZGVTaWduaW5nQ0FSMzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5z # ZWN0aWdvLmNvbTAjBgNVHREEHDAagRhqYXNvbi5hbGJlcmlub0BnbWFpbC5jb20w # DQYJKoZIhvcNAQEMBQADggGBAET0EFH0r+hqoQWr4Ha9UDuEv28rTgV2aao1nFRg # GZ/5owM7x9lxappLUbgQFfeIzzAsp3gwTKMYf47njUjvOBZD9zV/3I/vaLmY2enm # MXZ48Om9GW4pNmnvsef2Ub1/+dRzgs8UFX5wBJcfy4OWP3t0OaKJkn+ZltgFF1cu # L/RPiWSRcZuhh7dIWgoPQrVx8BtC8pkh4F5ECxogQnlaDNBzGYf1UYNfEQOFec31 # UK8oENwWx5/EaKFrSi9Y4tu6rkpH0idmYds/1fvqApGxujhvCO4Se8Atfc98icX4 # DWkc1QILREHiVinmoO3smmjB5wumgP45p9OVJXhI0D0gUFQfOSappa5eO2lbnNVG # 90rCsADmVpDDmNt2qPG01luBbX6VtWMP2thjP5/CWvUy6+xfrhlqvwZyZt3SKtuf # FWkqnNWMnmgtBNSmBF5+q8w5SJW+24qrncKJWSIim/nRtC11XnoI9SXlaucS3Nlb # crQVicXOtbhksEqMTn52i8NOfzGCAxswggMXAgEBMGkwVDELMAkGA1UEBhMCR0Ix # GDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJs # aWMgQ29kZSBTaWduaW5nIENBIFIzNgIRAOiFGyv/M0cNjSrz4OIyh7EwDQYJYIZI # AWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0B # CQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAv # BgkqhkiG9w0BCQQxIgQg7vB/4Dc11BQFi2orbPwWuwhvt+y2xFrDypjGXgtRND4w # DQYJKoZIhvcNAQEBBQAEggIAYVA0lCKQ1WuJGWxOxqPqtrvxkDPAIpWXqHXCo5/F # u0j/UaN8Pxp0Kj3NjOuhes5er6dBYbIOzQNDHnTp0ch9V6q5fG/W4rqE+grm9JMF # Ta2zDE/8ihed7imufeCDj/DCet6LVPM8YvEEhxgDJr/8UgYmmoOgkEP95uyfGfwO # LxhYnbnfWiavSFbczfqUtQ4pao1POG3TMh9Goa1aaGoOEAyqX63JCxqW9yu93gxD # 2WWCJLwPGpOiLuOHR8MnJhBHM/tggLtmqed53TJfu/f3o8a7c9FBUutTQUoYAo5o # 2qKtWq95xS6JtYKkRhyNqQMEzUsndXLsQioMxKprBIkydz4mPeNv+7YubJNC+KkF # 0pAxeKBFsUOWHmkQ2f/3xjpGYUxuyVtJpHbFzwSJEO6Kjab48TK7d/CAavKWElxA # 4ibo6ttH8ysuRxgTXy+B3S12a7M8ylvAa2D9DMd9K702wYIMKFrHr96fTQjg8q7d # lYYatsE1kY7rokLUR/qasV12MPi6FzHoJUeaz72QP8aXbrmf6E/WFbn7q5ALILxF # N9afRS3yOkaOJNT0YoszMq6lB651Vbj1HB+QlDwHsE2v6P1Wo5V5ZziuQf9hSJAY # RQUVdlfA4M0IfRGabd3vTjY/tdjPlOEkZV3Wo2/JZHDqNZ/Z9Jt6W8Z5YqQiueH/ # 4pA= # SIG # End signature block |