pester/apikey-manager.tests.ps1
Import-Module $PSScriptRoot\..\AkamaiPowershell.psm1 -DisableNameChecking -Force # Setup shared variables $Script:EdgeRCFile = $env:PesterEdgeRCFile $Script:SafeEdgeRCFile = $env:PesterSafeEdgeRCFile $Script:Section = 'default' $Script:TestContract = '1-1NC95D' $Script:TestGroupID = 131831 $Script:TestCollectionName = "Akamai PowerShell" $Script:TestCollectionBody = "{ `"contractId`": `"$TestContract`", `"groupId`": $TestGroupID, `"name`": `"$TestCollectionName`" }" $Script:TestAPIEndpointID = 817948 $Script:TestKey = (New-Guid).Guid $Script:ImportKeys = '[{"value":"7131e629-41fa-4dfb-9ab9-5e556221b8d5","label":"premium","tags":["external","premium"]}]' $Script:TestCounterName = 'Akamai PowerShell counter' $Script:TestCounterBody = "{ `"enabled`": true, `"groupId`": $TestGroupID, `"name`": `"$TestCounterName`", `"throttling`": 1000, `"contractId`": `"$TestContract`", `"onOverLimit`": `"DENY`" }" Describe 'Safe API Key Manager Tests' { BeforeDiscovery { } ### List-APIKeyCollections $Script:KeyCollections = List-APIKeyCollections -EdgeRCFile $EdgeRCFile -Section $Section it 'List-APIKeyCollections returns a list' { $KeyCollections.count | Should -Not -BeNullOrEmpty } ### New-APIKeyCollection $Script:NewCollection = New-APIKeyCollection -Body $TestCollectionBody -EdgeRCFile $EdgeRCFile -Section $Section it 'New-APIKeyCollection creates successfully' { $NewCollection.name | Should -Be $TestCollectionName } ### Get-APIKeyCollection $Script:Collection = Get-APIKeyCollection -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section it 'Get-APIKeyCollection returns the collection collection' { $Collection.name | Should -Be $TestCollectionName } ### Set-APIKeyCollection by pipeline $Script:CollectionByPipeline = ( $NewCollection | Set-APIKeyCollection -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section ) it 'Set-APIKeyCollection by pipeline updates successfully' { $CollectionByPipeline.name | Should -Be $TestCollectionName } ### Set-APIKeyCollection by body $Script:CollectionByBody = Set-APIKeyCollection -CollectionID $NewCollection.id -Body (ConvertTo-Json -depth 100 $NewCollection) -EdgeRCFile $EdgeRCFile -Section $Section it 'Set-APIKeyCollection by body updates successfully' { $CollectionByBody.name | Should -Be $TestCollectionName } ### Set-APIKeyCollectionACL by pipeline $Script:ACLByPipeline = Set-APIKeyCollectionACL -CollectionID $NewCollection.id -ACL @("ENDPOINT-$TestAPIEndpointID") -EdgeRCFile $EdgeRCFile -Section $Section it 'Set-APIKeyCollectionACL by pipeline updates successfully' { $ACLByPipeline.dirtyACL | Should -Contain "ENDPOINT-$TestAPIEndpointID" } ### Set-APIKeyCollectionACL by body $Script:ACLByBody = Set-APIKeyCollectionACL -CollectionID $NewCollection.id -Body "[`"ENDPOINT-$TestAPIEndpointID`"]" -EdgeRCFile $EdgeRCFile -Section $Section it 'Set-APIKeyCollectionACL by body updates successfully' { $ACLByBody.dirtyACL | Should -Contain "ENDPOINT-$TestAPIEndpointID" } $EnabledQuota = $NewCollection.quota $EnabledQuota.enabled = $true ### Set-APIKeyCollectionQuota by pipeline $Script:QuotaByPipeline = ($EnabledQuota | Set-APIKeyCollectionQuota -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section) it 'Set-APIKeyCollectionQuota by pipeline updates successfully' { $QuotaByPipeline.quota.enabled | Should -Be $true } ### Set-APIKeyCollectionQuota by body $Script:QuotaByBody = Set-APIKeyCollectionQuota -CollectionID $NewCollection.id -Body (ConvertTo-Json -Depth 100 $EnabledQuota) -EdgeRCFile $EdgeRCFile -Section $Section it 'Set-APIKeyCollectionQuota by body updates successfully' { $QuotaByBody.quota.enabled | Should -Be $true } ### List-APIKeyCollectionEndpoints $Script:Endpoints = List-APIKeyCollectionEndpoints -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section it 'List-APIKeyCollectionEndpoints returns a list' { $Endpoints.count | Should -Not -Be 0 } ### New-APIKey $Script:NewKey = New-APIKey -CollectionID $NewCollection.id -Value $TestKey -Label "Create single" -EdgeRCFile $EdgeRCFile -Section $Section it 'New-APIKey creates successfully' { $NewKey.value | Should -Be $TestKey } ### Get-APIKey $Script:GetKey = Get-APIKey -KeyID $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section it 'Get-APIKey returns the correct key' { $GetKey.value | Should -Be $TestKey } ### Set-APIKey by pipeline $Script:SetKeyByPipeline = ($NewKey | Set-APIKey -KeyID $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section) it 'Set-APIKey by pipeline returns the correct key' { $SetKeyByPipeline.value | Should -Be $TestKey } ### Set-APIKey by body $Script:SetKeyByBody = Set-APIKey -KeyID $NewKey.id -Body (ConvertTo-Json -Depth 100 $NewKey) -EdgeRCFile $EdgeRCFile -Section $Section it 'Set-APIKey by body returns the correct key' { $SetKeyByBody.value | Should -Be $TestKey } ### New-APIKeys it 'New-APIKey creates successfully' { { New-APIKeys -CollectionID $NewCollection.id -Count 2 -Label "Create multiple" -IncrementLabel -EdgeRCFile $EdgeRCFile -Section $Section } | Should -Not -Throw } ### List-APIKeys $Script:Keys = List-APIKeys -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section it 'List-APIKeys returns a list of keys' { $Keys.items.count | Should -BeGreaterThan 0 } ### Import-APIKey it 'Import-APIKey completes successfully' { {Import-APIKey -CollectionID $NewCollection.id -Content $ImportKeys -Filename sample.json -EdgeRCFile $EdgeRCFile -Section $Section} | Should -Not -Throw } ### Reset-APIKeyQuota it 'Reset-APIKeyQuota completes successfully' { {Reset-APIKeyQuota -Keys $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section} | Should -Not -Throw } ### Revoke-APIKey it 'Revoke-APIKey completes successfully' { {Revoke-APIKey -Keys $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section} | Should -Not -Throw } ### Restore-APIKey it 'Restore-APIKey completes successfully' { {Restore-APIKey -Keys $NewKey.id -EdgeRCFile $EdgeRCFile -Section $Section} | Should -Not -Throw } ### List-APITags $Script:Tags = List-APITags -EdgeRCFile $EdgeRCFile -Section $Section it 'List-APIKeys returns a list' { $Tags.count | Should -Not -BeNullOrEmpty } ### List-APIThrottlingCounters $Script:Counters = List-APIThrottlingCounters -EdgeRCFile $EdgeRCFile -Section $Section it 'List-APIThrottlingCounters returns a list' { $Counters.count | Should -Not -BeNullOrEmpty } ### New-APIThrottlingCounter $Script:NewCounter = New-APIThrottlingCounter -Body $TestCounterBody -EdgeRCFile $EdgeRCFile -Section $Section it 'New-APIThrottlingCounter creates successfully' { $NewCounter.name | Should -Be $TestCounterName } ### Get-APIThrottlingCounter $Script:Counter = Get-APIThrottlingCounter -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section it 'Get-APIThrottlingCounter finds the correct counter' { $Counter.name | Should -Be $TestCounterName } ### Set-APIThrottlingCounter by pipeline $Script:CounterByPipeline = ($NewCounter | Set-APIThrottlingCounter -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section) it 'Set-APIThrottlingCounter by pipeline updates correctly' { $CounterByPipeline.name | Should -Be $TestCounterName } ### Set-APIThrottlingCounter by body $Script:CounterByBody = Set-APIThrottlingCounter -CounterID $NewCounter.id -Body (ConvertTo-Json -Depth 100 $NewCounter) -EdgeRCFile $EdgeRCFile -Section $Section it 'Set-APIThrottlingCounter by body updates correctly' { $CounterByBody.name | Should -Be $TestCounterName } ### List-APIThrottlingCounterEndpoints $Script:CounterEndpoints = List-APIThrottlingCounterEndpoints -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section it 'List-APIThrottlingCounterEndpoints returns a list' { $CounterEndpoints.count | Should -Not -BeNullOrEmpty } ### List-APIThrottlingCounterKeys $Script:CounterKeys = List-APIThrottlingCounterKeys -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section it 'List-APIThrottlingCounterKeys returns a list' { $CounterKeys.count | Should -Not -BeNullOrEmpty } ### Remove-APIThrottlingCounter it 'Remove-APIThrottlingCounter removes successfully' { { $Script:RemoveCounter = Remove-APIThrottlingCounter -CounterID $NewCounter.id -EdgeRCFile $EdgeRCFile -Section $Section } | Should -Not -Throw } ### Remove-APIKeyCollection it 'Remove-APIKeyCollection removes successfully' { { $Script:RemoveCollection = Remove-APIKeyCollection -CollectionID $NewCollection.id -EdgeRCFile $EdgeRCFile -Section $Section } | Should -Not -Throw } AfterAll { } } Describe 'Unsafe API Key Manager Tests' { ### Generate-APIKeyReport $Script:Report = Generate-APIKeyReport -ReportType rapidkey-by-time -Version 1 -Start 2022-08-13T00:00:00Z -End 2022-08-14T00:00:00Z -Interval HOUR -EdgeRCFile $SafeEdgeRCFile -Section $Section it 'Generate-APIKeyReport returns data' { $Report.data | Should -Not -BeNullOrEmpty } } # SIG # Begin signature block # MIIp2AYJKoZIhvcNAQcCoIIpyTCCKcUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA6AAoWNyhveAvC # I4be9QgkAMEjVZl9BN9bl8PmqyX9TKCCDsEwggawMIIEmKADAgECAhAIrUCyYNKc # 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/pQd52MbOoZWeE4wgggJMIIF8aADAgECAhAHIszIesP43uahmQLOEsTtMA0G # CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjIwMzEwMDAwMDAwWhcNMjMwMzAx # MjM1OTU5WjCB3jETMBEGCysGAQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgEC # EwhEZWxhd2FyZTEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEDAOBgNV # BAUTBzI5MzM2MzcxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRz # MRIwEAYDVQQHEwlDYW1icmlkZ2UxIDAeBgNVBAoTF0FrYW1haSBUZWNobm9sb2dp # ZXMgSW5jMSAwHgYDVQQDExdBa2FtYWkgVGVjaG5vbG9naWVzIEluYzCCAiIwDQYJ # KoZIhvcNAQEBBQADggIPADCCAgoCggIBALiCVhyjVWQnarv6/Pdf97vrz6idrh6v # hHMOEaB6CxEnjSEn+ukSkOo1Yuq700EIF3zNtOYNssWNMWHkDMv6HRd4SUgWqObR # UnsxYIcwuiqBZ7lAJ0tnfDv/I4mnSD0WTmOJyMuyBzhQIPErwgDaYZNwKY8z5r8i # XLa5LVampC97cm69gQMh7xqeXG5xXkTm84lQ0Ub0l2s6GsFR6EP5NbiufFqhbECs # sedLu0y788juJZwZuxtfTJ7oAmfnrhZ5nzImGfTmvLVsfnztdf5J4wJqiROTtr/x # 5qDd7zQEnAwMxIH8K75tUclPmfVw/RHCTHBdjBilFajVghSDsFhYB3gN+MFQwPq8 # tXvyCVtv6tMaxtQ5IlDWcVbde1WrM7Y+F0NYUR37kngc1g19+81068Xf5upoFk+s # k1nL5lR7Ppl2Rx/CbOAktuDXOjPGpamZDfL6BMpHYC0He1FAnn0urIif014E2wlh # /6C6Lz3Z7cMq3na/uRZs770bHUDzW5iPqKfviO6It44DvNh3jY0cnUzBq5jbzfVY # u0yyIg2R8CJro3EWnRwViFVvVGTiToUX2DeAoM/eOYtTVDOZNyKC2XscvuoZiT1H # FO1RJA+aLsv2J8xVHrnRuKXGstJgJce90z9ONa7hw4ZAJiFkiOKfyJ93jYfMnDGr # 6Ne9/Z2A+Q/lAgMBAAGjggI1MIICMTAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5h # ewiIZfROQjAdBgNVHQ4EFgQUwv2lfAnAr+YF8AVrOUgJbp0qCEkwLgYDVR0RBCcw # JaAjBggrBgEFBQcIA6AXMBUME1VTLURFTEFXQVJFLTI5MzM2MzcwDgYDVR0PAQH/ # BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+G # TWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVT # aWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3Js # NC5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQw # OTZTSEEzODQyMDIxQ0ExLmNybDA9BgNVHSAENjA0MDIGBWeBDAEDMCkwJwYIKwYB # BQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBlAYIKwYBBQUHAQEE # gYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBcBggr # BgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1 # c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQwDAYDVR0T # AQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEApw9nsvZn9pJnIuDUfGrB4zLqszHo # 7B4MkNI/mYXHOXSTtan6JMTReBpef1FeGR1k9NLV0gw5brI0OJEcEmvvaisK7o9s # G0fI5783FyS/sTEnRrsVVie3+h7THYPHNc/2frleWoZ1BgnfQk+ssK42nO2yJGac # ucuNh4hP5J9HDRY1FRyv+EVu0ez/P/lopbi3FaWF2uON4JWhj9YfHHmvySHCsSOL # EzKt+f8C2UzhdvTl1k/HPYZ80gD8tkX+7XFDFbZte7t0AELvSS7AAoli1uk1LAtg # hJcop2m4izJ6iONfc/jVXeswsOORaNcaQA9VcyuVNgxPpXll4W6haBn20IU+86vo # 6MDJSpisbJvZ7s+0dhyZhy2nrteAFoLATehF2kWinPejeRKy0HV2a1TNaIUh13fu # yIaNghUdStF+CoGNXe7h2yQX1qmZWnZWZRQumU44Vq1Wew0tgHGSMUAxwioafojX # QrEa8S8pYG/675jxqjEXwTt5WoCCWDoSfYkku9qANLxkg1f6ZM5v612w8PEdbJpo # FtwmfLRA57KZ50IcxCk/yUWyFQkvSyupfRurRTjVFDD0OLYr4JdQVpFzZj8z6Quh # pxbUv+GUtlRIRe4sfyam/VRhblyXMA3Uea8cveWiwjuEDppEPgsIs4G4WBn7RuFV # mKw3mUwz0p7xjQIxghptMIIaaQIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQK # Ew5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBD # b2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEAcizMh6w/je5qGZ # As4SxO0wDQYJYIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG # 9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIB # FTAvBgkqhkiG9w0BCQQxIgQgmXgSgEigsQElMztR1iSa+8WASi+mEGED/DnvGmxx # VxMwDQYJKoZIhvcNAQEBBQAEggIAmBeIsGJ6J73HEmVVhUrEvT2W7I4+By+EqA4m # 2MyhThjWZPAevEGKUH22aGOd9tn1rlST1Cti+pg6VMShT3zrHUvTiCeBCLvehy28 # 25tVYVHWml7ioVdreU1Jod5A6t7ov4ncSvigRs+Z057jIy/Gqri3TEbMJxINv9NS # MzI4b8Ccfyc1xTNY7UnAcFMAxm6puuPO0SYYA1WORZUMSfPUaDFZh1o5zwUJwwp2 # LwFJxhOehw3XP+hfMF4kmC/AuvdfMMIJX5cGVtAS+hWE8U+TlMJjlNKygsxq/LGD # VurQVAHUcFQEiNJEWrocUq9ADG0xs9bGguVMJqLeGVB+gIC4KKRZ2b7NBdYfXIes # sz+KdkERs/mwVgZhpH7oaFIBC31KAGv7+HFjD8q+goCzuJjQDopDosto1iygJQCa # 2X8gvThH309cwrtj0ojon/PnWhsgOj9xrKZnf3ivJLSmaOcqT5W4Bfi0ZL+EaG90 # jz7ulbhJPlJBFaPc5CEoPSL4O8Mj7qmN0cJ7X/IZG24gGgiPG2qHfhMLjEklHAP2 # fJ4i6nuErTODZYS55Ejh+zGyifHF4JvPA0vsKY3S98kf7YsraPwVQZVB7bbQiGfR # culazIxHNszSDeFUYlay+4dwxZsUbhkyM6pQGiOSQqRReijmL8O1XcEqplQ6pOjz # 3AJEyP+hghdDMIIXPwYKKwYBBAGCNwMDATGCFy8wghcrBgkqhkiG9w0BBwKgghcc # MIIXGAIBAzEPMA0GCWCGSAFlAwQCAQUAMHcGCyqGSIb3DQEJEAEEoGgEZjBkAgEB # BglghkgBhv1sBwEwMTANBglghkgBZQMEAgEFAAQgzZoFiPmotWxZGQEVmhpxvEa3 # oO04MfncHlTLS70SAFQCEG4MJp3Rg0ps8Ar6v6GqWTAYDzIwMjIwOTE1MTg0NzE3 # WqCCEw0wggbGMIIErqADAgECAhAKekqInsmZQpAGYzhNhpedMA0GCSqGSIb3DQEB # CwUAMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkG # A1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3Rh # bXBpbmcgQ0EwHhcNMjIwMzI5MDAwMDAwWhcNMzMwMzE0MjM1OTU5WjBMMQswCQYD # VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJDAiBgNVBAMTG0RpZ2lD # ZXJ0IFRpbWVzdGFtcCAyMDIyIC0gMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC # AgoCggIBALkqliOmXLxf1knwFYIY9DPuzFxs4+AlLtIx5DxArvurxON4XX5cNur1 # JY1Do4HrOGP5PIhp3jzSMFENMQe6Rm7po0tI6IlBfw2y1vmE8Zg+C78KhBJxbKFi # JgHTzsNs/aw7ftwqHKm9MMYW2Nq867Lxg9GfzQnFuUFqRUIjQVr4YNNlLD5+Xr2W # p/D8sfT0KM9CeR87x5MHaGjlRDRSXw9Q3tRZLER0wDJHGVvimC6P0Mo//8ZnzzyT # lU6E6XYYmJkRFMUrDKAz200kheiClOEvA+5/hQLJhuHVGBS3BEXz4Di9or16cZjs # Fef9LuzSmwCKrB2NO4Bo/tBZmCbO4O2ufyguwp7gC0vICNEyu4P6IzzZ/9KMu/dD # I9/nw1oFYn5wLOUrsj1j6siugSBrQ4nIfl+wGt0ZvZ90QQqvuY4J03ShL7BUdsGQ # T5TshmH/2xEvkgMwzjC3iw9dRLNDHSNQzZHXL537/M2xwafEDsTvQD4ZOgLUMalp # oEn5deGb6GjkagyP6+SxIXuGZ1h+fx/oK+QUshbWgaHK2jCQa+5vdcCwNiayCDv/ # vb5/bBMY38ZtpHlJrYt/YYcFaPfUcONCleieu5tLsuK2QT3nr6caKMmtYbCgQRgZ # Tu1Hm2GV7T4LYVrqPnqYklHNP8lE54CLKUJy93my3YTqJ+7+fXprAgMBAAGjggGL # MIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAK # BggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYD # VR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFI1kt4kh/lZY # RIRhp+pvHDaP3a8NMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2lj # ZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBp # bmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8v # b2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRp # Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3Rh # bXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAA0tI3Sm0fX46kuZPwHk9gzk # rxad2bOMl4IpnENvAS2rOLVwEb+EGYs/XeWGT76TOt4qOVo5TtiEWaW8G5iq6Gzv # 0UhpGThbz4k5HXBw2U7fIyJs1d/2WcuhwupMdsqh3KErlribVakaa33R9QIJT4LW # pXOIxJiA3+5JlbezzMWn7g7h7x44ip/vEckxSli23zh8y/pc9+RTv24KfH7X3pjV # KWWJD6KcwGX0ASJlx+pedKZbNZJQfPQXpodkTz5GiRZjIGvL8nvQNeNKcEiptucd # YL0EIhUlcAZyqUQ7aUcR0+7px6A+TxC5MDbk86ppCaiLfmSiZZQR+24y8fW7OK3N # wJMR1TJ4Sks3KkzzXNy2hcC7cDBVeNaY/lRtf3GpSBp43UZ3Lht6wDOK+EoojBKo # c88t+dMj8p4Z4A2UKKDr2xpRoJWCjihrpM6ddt6pc6pIallDrl/q+A8GQp3fBmiW # /iqgdFtjZt5rLLh4qk1wbfAs8QcVfjW05rUMopml1xVrNQ6F1uAszOAMJLh8Ugse # mXzvyMjFjFhpr6s94c/MfRWuFL+Kcd/Kl7HYR+ocheBFThIcFClYzG/Tf8u+wQ5K # byCcrtlzMlkI5y2SoRoR/jKYpl0rl+CL05zMbbUNrkdjOEcXW28T2moQbh9Jt0Rb # tAgKh1pZBHYRoad3AhMcMIIGrjCCBJagAwIBAgIQBzY3tyRUfNhHrP0oZipeWzAN # BgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg # SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2Vy # dCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcNMzcwMzIyMjM1OTU5 # WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNV # BAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1w # aW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxoY1BkmzwT1y # SVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+kiPNo+n3znIkLf50f # ng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+vaPcQXf6sZKz5C3GeO # 6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RBidx8ald68Dd5n12s # y+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn7w6lY2zkpsUdzTYN # XNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAxE6lXKZYnLvWHpo9O # dhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB3iIU2YIqx5K/oN7j # PqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNCaJ+2RrOdOqPVA+C/ # 8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklSUPRR8zZJTYsg0ixX # NXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP015LdhJRk8mMDDtb # iiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXiYKNYCQEoAA6EVO7O # 6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQI # MAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCPnshvMB8GA1UdIwQY # MBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUE # DDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6 # Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMu # ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDww # OjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3Rl # ZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0G # CSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULhsBguEE0TzzBTzr8Y # +8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAlNDFnzbYSlm/EUExi # HQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XNQ1/tYLaqT5Fmniye # 4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ8NWKcXZl2szwcqMj # +sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDnmPv7pp1yr8THwcFq # cdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsdCEkPlM05et3/JWOZ # Jyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcma+Q4c6umAU+9Pzt4 # rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+8kaddSweJywm228V # ex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6KYawmKAr7ZVBtzrV # FZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAjfwAL5HYCJtnwZXZC # pimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucTDh3bNzgaoSv27dZ8 # /DCCBY0wggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAw # ZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQ # d3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBS # b290IENBMB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UE # BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj # ZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjAN # BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUu # ySE98orYWcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8 # Ug9SH8aeFaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0M # G+4g1ckgHWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldX # n1RYjgwrt0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVq # GDgDEI3Y1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFE # mjNAvwjXWkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6 # SPDgohIbZpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXf # SwQAzH0clcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b23 # 5kOkGLimdwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ # 6zHFynIWIgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRp # L5gdLfXZqbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O # BBYEFOzX44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1R # i6enIZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYB # BQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0 # cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB # LmNydDBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v # RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADAN # BgkqhkiG9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVe # qRq7IviHGmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3vot # Vs/59PesMHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum # 6fI0POz3A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJ # aISfb8rbII01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ # ErhULSd+2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDGCA3YwggNyAgEBMHcw # YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD # EzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGlu # ZyBDQQIQCnpKiJ7JmUKQBmM4TYaXnTANBglghkgBZQMEAgEFAKCB0TAaBgkqhkiG # 9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIyMDkxNTE4NDcx # N1owKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQUhQjzhlFcs9MHfba0t8B/G0peQd4w # LwYJKoZIhvcNAQkEMSIEIGiTfMgIxAzQWFGpUx3r9cig1rnSuxYyOElexTvhX6kU # MDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIJ2mkBXDScbBiXhFujWCrXDIj6QpO9tq # vpwr0lOSeeY7MA0GCSqGSIb3DQEBAQUABIICAGIISP7yQaBTJq5ekK9AtbdET4+R # WymZwxOu4HQpb5VT15KU7LtZBBMi8kA+dc9Z8lEHZLRrwe5jcX0YqgDMGaneMZ0h # a35TmBF5e0JphigZMxTUAIux5Y7BzI7STtup7KMph4n94iX1P/j1FyQIa8xI3ucb # 4enYuFqouW4T8TCJ/bK4Qi27Mg2yi9yRcL19yKvofyA1q9ZQLY9H0zxFyNiIlQiF # XvMXrLNvSqqOjVzgyGb9Dzd/o8SgWsY1pI+7eBO2AvbYraBGo9PfAp0cO6nB5q2B # kDv568eJH3QSt80W1qRySh/SRmNyHjQakJDaxeiPMoZQ/aMMZd7Y2aQ1hciXsBtu # RgO4qnkhSnIkFIb90bMXxX2GUngi8qVPtitU2Qual6rcPkqekMEpEug+v1C1gKUT # RJNXSN2fbjqRNoGcSRlNy6hbzfMgJ0qlaSlzfcgeO3rYmshoXFMY4g5pP/wj0tAl # 3WWiXefg8a2gHYbh8uN1M8OWb5w+nnZHDMwRt0Eh/1Xojmq1NxkFmpAvcvzX/iX9 # U783ukeBeppJKLihVPuhFHfd3s/G3zq7LzQC64xJIDmiqspw/jvwmwayy+a5bkJW # mHNi/kgk1+r8O7SjzmgSnSaQuvG9RtEQe05WqXQSs9kA9A5jsfDdsObG6s5bhINW # G6wCdx7l8WLWCSCs # SIG # End signature block |