Akamai.CPS.psm1
|
function Format-CPSResponse { [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipeline)] [PSCustomObject] $ResponseBody ) process { # Enrollment member if ($ResponseBody.enrollment) { if ($ResponseBody.enrollment -match '[\d]+$') { $ResponseBody | Add-Member -NotePropertyName enrollmentId -NotePropertyValue ([int] $Matches[0]) } } # Basic changes if ($ResponseBody.change) { if ($ResponseBody.change -match '[\d]+$') { $ResponseBody | Add-Member -NotePropertyName changeId -NotePropertyValue ([int] $Matches[0]) } } # Enrollment pendingChanges if ($ResponseBody.pendingChanges) { foreach ($PendingChange in $ResponseBody.pendingChanges) { if ($PendingChange.location -match '[\d]+$') { $PendingChange | Add-Member -NotePropertyName changeId -NotePropertyValue ([int] $Matches[0]) } } } # changes array if ($ResponseBody.changes) { $ChangeIDs = New-Object -TypeName System.Collections.Generic.List[long] $ResponseBody.changes | ForEach-Object { if ($_ -match '[\d]+$') { $ChangeIDs.Add([int] $Matches[0]) } } if ($ChangeIDs.count -gt 0) { $ResponseBody | Add-Member -NotePropertyName changeIds -NotePropertyValue $ChangeIDs } } return $ResponseBody } } function Get-BodyObject { [CmdletBinding()] Param( [Parameter(Mandatory)] $Source ) if ($Source -is 'String') { # Trim whitespace $Source = $Source.Trim() # Handle JSON array if ($Source.StartsWith('[')) { $BodyObject = ConvertFrom-Json -InputObject $Source -AsArray -NoEnumerate } # Handle standard JSON object elseif ($Source.StartsWith('{') -and $Source.EndsWith('}')) { $BodyObject = ConvertFrom-Json -InputObject $Source } # If none of the above, just use string as-is else { $BodyObject = $Source } } elseif ($Source -is 'Hashtable') { $BodyObject = [PScustomObject] $Source } elseif ($Source -is 'PSCustomObject' -or $Source -is 'Object' -or $Source -is 'Object[]') { $BodyObject = $Source } else { throw "Source param is of an unhandled type '$($Source.GetType().Name)'" } return $BodyObject } function Add-CPSThirdPartyCert { [CmdletBinding(DefaultParameterSetName = 'Attributes')] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter(ParameterSetName = 'Attributes', Mandatory)] [string] $Certificate, [Parameter(ParameterSetName = 'Attributes')] [string] $TrustChain, [Parameter(ParameterSetName = 'Attributes', Mandatory)] [ValidateSet('RSA', 'ECDSA')] [string] $KeyAlgorithm, [Parameter(ParameterSetName = 'Body', Mandatory, ValueFromPipeline)] $Body, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/update/third-party-cert-and-trust-chain" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change-id.v1+json' 'content-type' = 'application/vnd.akamai.cps.certificate-and-trust-chain.v2+json' } if ($PSCmdlet.ParameterSetName -eq 'Attributes') { $Body = @{ 'certificatesAndTrustChains' = @( @{ 'certificate' = $Certificate 'keyAlgorithm' = $KeyAlgorithm } ) } if ($TrustChain) { $Body.certificatesAndTrustChains[0]['trustChain'] = $TrustChain } } $RequestParams = @{ 'Path' = $Path 'Method' = 'POST' 'AdditionalHeaders' = $AdditionalHeaders 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } function Complete-CPSChange { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter(Mandatory)] [ValidateSet('acknowledge', 'deny')] [string] $Acknowledgement, [Parameter()] [string] $Hash, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/update/change-management-ack" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change-id.v1+json' 'content-type' = 'application/vnd.akamai.cps.acknowledgement.v1+json' } $Body = @{ 'acknowledgement' = $Acknowledgement } if ($Hash) { $AdditionalHeaders['content-type'] = 'application/vnd.akamai.cps.acknowledgement-with-hash.v1+json' $Body['hash'] = $Hash } $RequestParams = @{ 'Path' = $Path 'Method' = 'POST' 'AdditionalHeaders' = $AdditionalHeaders 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } function Confirm-CPSLetsEncryptChallengesCompleted { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter(Mandatory)] [ValidateSet('acknowledge', 'deny')] [string] $Acknowledgement, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/update/lets-encrypt-challenges-completed" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change-id.v1+json' 'content-type' = 'application/vnd.akamai.cps.acknowledgement.v1+json' } $Body = @{ 'acknowledgement' = $Acknowledgement } $RequestParams = @{ 'Path' = $Path 'Method' = 'POST' 'AdditionalHeaders' = $AdditionalHeaders 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } function Confirm-CPSPostVerificationWarnings { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter(Mandatory)] [ValidateSet('acknowledge', 'deny')] [string] $Acknowledgement, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/update/post-verification-warnings-ack" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change-id.v1+json' 'content-type' = 'application/vnd.akamai.cps.acknowledgement.v1+json' } $Body = @{ 'acknowledgement' = $Acknowledgement } $RequestParams = @{ 'Path' = $Path 'Method' = 'POST' 'AdditionalHeaders' = $AdditionalHeaders 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } function Confirm-CPSPreVerificationWarnings { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter(Mandatory)] [ValidateSet('acknowledge', 'deny')] [string] $Acknowledgement, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/update/pre-verification-warnings-ack" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change-id.v1+json' 'content-type' = 'application/vnd.akamai.cps.acknowledgement.v1+json' } $Body = @{ 'acknowledgement' = $Acknowledgement } $RequestParams = @{ 'Path' = $Path 'Method' = 'POST' 'AdditionalHeaders' = $AdditionalHeaders 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } function Get-CPSActiveCertificate { [CmdletBinding()] Param( [Parameter(ValueFromPipeline)] [string] $ContractID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/active-certificates" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.active-certificates.v2+json' } $QueryParameters = @{ 'contractId' = $ContractID } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'QueryParameters' = $QueryParameters 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body.enrollments } } function Get-CPSCertificateHistory { [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [Alias('id')] [int] $EnrollmentID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/history/certificates" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.certificate-history.v2+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body.certificates } } function Get-CPSChangeHistory { [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [Alias('id')] [int] $EnrollmentID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/history/changes" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change-history.v5+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body.changes } } function Get-CPSChangeStagingStatus { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/info/change-management-info" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change-management-info.v6+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function Get-CPSChangeStatus { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change.v2+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function Get-CPSCSR { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/info/third-party-csr" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.csr.v2+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function Get-CPSDeployment { [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [Alias('id')] [int] $EnrollmentID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/deployments" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.deployments.v8+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function Get-CPSDeploymentSchedule { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/deployment-schedule" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.deployment-schedule.v1+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function Get-CPSDVHistory { [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [Alias('id')] [int] $EnrollmentID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/dv-history" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.dv-history.v1+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body.results } } function Get-CPSEnrollment { [CmdletBinding(DefaultParameterSetName = 'Get all')] Param( [Parameter(ParameterSetName = 'Get one', ValueFromPipeline)] [int] $EnrollmentID, [Parameter(ParameterSetName = 'Get all')] [string] $ContractID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { if ($EnrollmentID) { $Path = "/cps/v2/enrollments/$EnrollmentID" } else { $Path = "/cps/v2/enrollments" } if ($PSBoundParameters.EnrollmentID) { $AcceptHeader = 'application/vnd.akamai.cps.enrollment.v12+json' } else { $AcceptHeader = 'application/vnd.akamai.cps.enrollments.v12+json' } $AdditionalHeaders = @{ 'accept' = $AcceptHeader } $QueryParameters = @{ 'contractId' = $ContractID } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'QueryParameters' = $QueryParameters 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams if ($PSBoundParameters.EnrollmentID) { return $Response.Body | Format-CPSResponse } else { return $Response.Body.enrollments | Format-CPSResponse } } } function Get-CPSLetsEncryptChallenges { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/info/lets-encrypt-challenges" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.dv-challenges.v2+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function Get-CPSPostVerificationWarnings { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/info/post-verification-warnings" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.warnings.v1+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function Get-CPSPreVerificationWarnings { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/input/info/pre-verification-warnings" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.warnings.v1+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function Get-CPSProductionDeployment { [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [Alias('id')] [int] $EnrollmentID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/deployments/production" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.deployment.v8+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function Get-CPSStagingDeployment { [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [Alias('id')] [int] $EnrollmentID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/deployments/staging" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.deployment.v8+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'GET' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body } } function New-CPSEnrollment { [CmdletBinding()] Param( [Parameter(Mandatory)] [string] $ContractID, [Parameter(Mandatory, ValueFromPipeline)] $Body, [Parameter()] [string] $DeployNotAfter, [Parameter()] [string] $DeployNotBefore, [Parameter()] [switch] $AllowDuplicateCN, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) begin { $DateMatch = '[\d]{4}-[\d]{2}-[\d]{2}' if (($DeployNotAfter -or $DeployNotBefore) -and ($DeployNotAfter -notmatch $DateMatch -or $DeployNotBefore -notmatch $DateMatch)) { throw "ERROR: DeployNotAfter & DeployNotBefore must be in the format 'YYYY-MM-DD'" } $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.enrollment-status.v1+json' 'content-type' = 'application/vnd.akamai.cps.enrollment.v12+json' } $Path = "/cps/v2/enrollments" $QueryParameters = @{ 'contractId' = $ContractID 'deploy-not-after' = $DeployNotAfter 'deploy-not-before' = $DeployNotBefore 'allowDuplicateCN' = $PSBoundParameters.AllowDuplicateCN } } process { # Cleanup request body to remove additional elements added in Get-CPSEnrollment $Body = Get-BodyObject -Source $Body if ($Body.pendingChanges) { $Body.pendingChanges | ForEach-Object { if ($_.changeId) { $_.PSObject.Members.Remove('changeId') } } } $RequestParams = @{ 'Path' = $Path 'Method' = 'POST' 'AdditionalHeaders' = $AdditionalHeaders 'QueryParameters' = $QueryParameters 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } function Remove-CPSChange { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change-id.v1+json' } $RequestParams = @{ 'Path' = $Path 'Method' = 'DELETE' 'AdditionalHeaders' = $AdditionalHeaders 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } function Remove-CPSEnrollment { [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [Alias('id')] [int] $EnrollmentID, [Parameter()] [switch] $AllowCancelPendingChanges, [Parameter()] [string] $DeployNotAfter, [Parameter()] [string] $DeployNotBefore, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $DateMatch = '[\d]{4}-[\d]{2}-[\d]{2}' if (($DeployNotAfter -or $DeployNotBefore) -and ($DeployNotAfter -notmatch $DateMatch -or $DeployNotBefore -notmatch $DateMatch)) { throw "ERROR: DeployNotAfter & DeployNotBefore must be in the format 'YYYY-MM-DD'" } $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.enrollment-status.v1+json' } $Path = "/cps/v2/enrollments/$EnrollmentID" $QueryParameters = @{ 'allow-cancel-pending-changes' = $PSBoundParameters.AllowCancelPendingChanges 'deploy-not-after' = $DeployNotAfter 'deploy-not-before' = $DeployNotBefore } $RequestParams = @{ 'Path' = $Path 'Method' = 'DELETE' 'AdditionalHeaders' = $AdditionalHeaders 'QueryParameters' = $QueryParameters 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } function Set-CPSDeploymentSchedule { [CmdletBinding()] Param( [Parameter(Mandatory)] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [int] $ChangeID, [Parameter()] [string] $NotAfter, [Parameter()] [string] $NotBefore, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { $Path = "/cps/v2/enrollments/$EnrollmentID/changes/$ChangeID/deployment-schedule" $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.change-id.v1+json' 'content-type' = 'application/vnd.akamai.cps.deployment-schedule.v1+json' } $Body = @{} if ($NotAfter) { $Body['notAfter'] = $NotAfter } if ($NotBefore) { $Body['notBefore'] = $NotBefore } $RequestParams = @{ 'Path' = $Path 'Method' = 'PUT' 'AdditionalHeaders' = $AdditionalHeaders 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } function Set-CPSEnrollment { [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [Alias('id')] [int] $EnrollmentID, [Parameter(Mandatory, ValueFromPipeline)] $Body, [Parameter()] [switch] $AllowCancelPendingChanges, [Parameter()] [switch] $AllowStagingBypass, [Parameter()] [string] $DeployNotAfter, [Parameter()] [string] $DeployNotBefore, [Parameter()] [switch] $ForceRenewal, [Parameter()] [switch] $RenewalDateCheckOverride, [Parameter()] [switch] $AllowMissingCertificateAddition, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) begin { $DateMatch = '[\d]{4}-[\d]{2}-[\d]{2}' if (($DeployNotAfter -or $DeployNotBefore) -and ($DeployNotAfter -notmatch $DateMatch -or $DeployNotBefore -notmatch $DateMatch)) { throw "ERROR: DeployNotAfter & DeployNotBefore must be in the format 'YYYY-MM-DD'" } $QueryParameters = @{ 'allow-cancel-pending-changes' = $PSBoundParameters.AllowCancelPendingChanges 'allow-staging-bypass' = $PSBoundParameters.AllowStagingBypass 'force-renewal' = $PSBoundParameters.ForceRenewal 'renewal-date-check-override' = $PSBoundParameters.RenewalDateCheckOverride 'allow-missing-certificate-addition' = $PSBoundParameters.AllowMissingCertificateAddition } $AdditionalHeaders = @{ 'accept' = 'application/vnd.akamai.cps.enrollment-status.v1+json' 'content-type' = 'application/vnd.akamai.cps.enrollment.v12+json' } } process { $Path = "/cps/v2/enrollments/$EnrollmentID" # Cleanup request body to remove additional elements added in Get-CPSEnrollment $Body = Get-BodyObject -Source $Body if ($Body.pendingChanges) { $Body.pendingChanges | ForEach-Object { if ($_.changeId) { $_.PSObject.Members.Remove('changeId') } } } $RequestParams = @{ 'Path' = $Path 'Method' = 'PUT' 'AdditionalHeaders' = $AdditionalHeaders 'QueryParameters' = $QueryParameters 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } # Make Request $Response = Invoke-AkamaiRequest @RequestParams return $Response.Body | Format-CPSResponse } } # SIG # Begin signature block # MIIo2QYJKoZIhvcNAQcCoIIoyjCCKMYCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCYE2CEvNHXlsIJ # Bp1uaSe6UPkpAr3zKBqHRakLDZxdTqCCDg4wggawMIIEmKADAgECAhAIrUCyYNKc # 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/pQd52MbOoZWeE4wggdWMIIFPqADAgECAhAGRzH371ShX6hjGl1wSSyYMA0G # CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjYwMjI1MDAwMDAwWhcNMjcwMzEw # MjM1OTU5WjCB3jETMBEGCysGAQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgEC # EwhEZWxhd2FyZTEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEDAOBgNV # BAUTBzI5MzM2MzcxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRz # MRIwEAYDVQQHEwlDYW1icmlkZ2UxIDAeBgNVBAoTF0FrYW1haSBUZWNobm9sb2dp # ZXMgSW5jMSAwHgYDVQQDExdBa2FtYWkgVGVjaG5vbG9naWVzIEluYzCCAaIwDQYJ # KoZIhvcNAQEBBQADggGPADCCAYoCggGBAJeMKuhiUI5WSRdGIPhNWLpaVPlXbSaz # hGuvzZxTi623Ht46hiPejDtWB8F8dT2pd+nOWsx5NVgkv7x/Tz35cZcWVMDxq/K7 # wYe9R2GndGgfEL02/j5rslwHr8e6qFzy1axuL/xaGXuBTVrSQw25019l1KalUHwI # nKLIP7Hw1HLPTacyJNNTsYmOpZNqKIiQe9ivzBd7SuPU0cGi1YHUk4ZQh6Ig5tBx # 8XZYjTmzbiQr2WWwk/CufaoIPME5zAvmW99S05rAtOqvoUr7eoLUQ/TcMMA6eOli # AbO5m0w/pv5YDgzhzt9hQez189zZNOkMO6AcHNitJzzsEvCg7fhPHxoXvasRJ0Ea # CEze0nuVakLPf+mGCLoZYGRctayOn4HP6LEEOGmAnQBZkwFR6zxk0hzAMOkK/p7M # V9V6QwOuk9q7WKnIdzS/4RjRtXNxXb2fMNyBEwrwJhdmEhWF0eS0Wd6Uz3IbSr0+ # XH8FHLflQXFCkPcZKiGPgSCp8rTP3KHr6wIDAQABo4ICAjCCAf4wHwYDVR0jBBgw # FoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYEFKT3RICOlmcsnPu7KwUf # 9HL4YegLMD0GA1UdIAQ2MDQwMgYFZ4EMAQMwKTAnBggrBgEFBQcCARYbaHR0cDov # L3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAK # BggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEz # ODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5j # cmwwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5k # aWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0 # LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIw # MjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggIBAGSBrSnUReHU # zGTy9VC6hy2oDSpu2QNu5j3o/uoaaAy2CgI0hVJRL/OfYinLR4hJofuNNKORp2MW # Xpy52L5PCGtD6/Hf92bMkDl1AP6nXuplt5HvkFPh5kVDbQ7oHfI1Pup2IOpKxb00 # UNwjtKy+38ZCX0dgkASP2vQFamBCG0eTaGUh/9ZH9rz11Nkr9p83Snz/3eW3vOeK # AFL3S5RDEMkTvv09540mnzA4J5lKGES2eje/FhwCCQUQBvqCvoNFNZHyXvW9v8Kq # X/3CcN1LAtGCy4XnkFjQRPyn+o/OJv5M5yX2Rm5kq9dYpWnDU2xgxMR1BZaDf+uD # oqGsLo4OqbPV4Dftp2FDs8DHMD8xP6i/k4htaWShkdyjdijr9TBOi+pS9vNlcCKj # wLq6aibcbkUk7ef3wxR5imhajsX22vy8Zd9ByAk07BJrccggJGczCtiKcD6LZtP3 # VjnqhYPSQ4jk6wCruqcTCTwwO7FrIROVrWb2Ro+ph+/a5Llj5ryLyp+6NAgtNwyr # kp2WxZviLbh5AXnmg9Pnwrz64UE93LEjI23AWBJsLFdJTbisZ/tTgozdVdPZf2Dy # 2k8xfYZoIq6V1oWiAoQCzb5B9nETV5NGjiMPskJ4GwnlzOvz+4IgLQjl0V5I08Qw # +3uvPQ8rHHMLbKgncTqSxqtZ73kItOztMYIaITCCGh0CAQEwfTBpMQswCQYDVQQG # EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0 # IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0Ex # AhAGRzH371ShX6hjGl1wSSyYMA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYBBAGCNwIB # DDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIIszWKc9Sqz6KNWj3WZzaMqB # UlTheK7J7R1UIYApXDpoMA0GCSqGSIb3DQEBAQUABIIBgAaYl6aPTdusSF89sGS0 # T6Q9gGOibEI3LdwdSk+/rBinkx3664B7KA27TlFccig4ZUFH5ypP7bJlDZ36FkuC # pIOcon+iE/FCHGyW5iDG6zkwyjUis1dsC0trFneMIsQ6hy9JdxaoZgggOdVK50EQ # k/YT7psCUaWnuhkbl2LwefjaHlp89jmVGwCQBmz1tf6DN+6rjNlsDabWX68eL7Kf # UYDdVjqH+T5TK6KFRXh0fI1AzomgqBP2tEv6FTpZo8IYut2/CtgE3SPairGVtv06 # v5/Nq/y4PXqfYDl1+LQhKXendKzq7g7M9n3tlsGz7+id3hQEvwnE60MlLI3D+4+J # bm6MJ6Yzp2fWW3SKHrLyV4mei7rZXD2NyAbipLPu08xiv7110V9b7AzyE2tyP+Ky # /eYpIs/scqoyvk6QUS/02ZfmPeGhTea9d3FCke3n1CfJ+tVY3M0oNJ/oyxoyu67B # KJ3A3woeaHLlbUHuvqhbuixzpSSb/QaT4uMAd+SJrklW16GCF3cwghdzBgorBgEE # AYI3AwMBMYIXYzCCF18GCSqGSIb3DQEHAqCCF1AwghdMAgEDMQ8wDQYJYIZIAWUD # BAIBBQAweAYLKoZIhvcNAQkQAQSgaQRnMGUCAQEGCWCGSAGG/WwHATAxMA0GCWCG # SAFlAwQCAQUABCBmGe64vRRxogaZuygUiul+HgnrbFdDkgFPGNTG7nMcNAIRAKTb # c6cRM0ErD8hsWNFK3HoYDzIwMjYwODI1MjI0MDUxWqCCEzowggbtMIIE1aADAgEC # AhAKgO8YS43xBYLRxHanlXRoMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVT # MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1 # c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEwHhcN # MjUwNjA0MDAwMDAwWhcNMzYwOTAzMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUG # A1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFNIQTI1NiBS # U0E0MDk2IFRpbWVzdGFtcCBSZXNwb25kZXIgMjAyNSAxMIICIjANBgkqhkiG9w0B # AQEFAAOCAg8AMIICCgKCAgEA0EasLRLGntDqrmBWsytXum9R/4ZwCgHfyjfMGUIw # YzKomd8U1nH7C8Dr0cVMF3BsfAFI54um8+dnxk36+jx0Tb+k+87H9WPxNyFPJIDZ # HhAqlUPt281mHrBbZHqRK71Em3/hCGC5KyyneqiZ7syvFXJ9A72wzHpkBaMUNg7M # OLxI6E9RaUueHTQKWXymOtRwJXcrcTTPPT2V1D/+cFllESviH8YjoPFvZSjKs3SK # O1QNUdFd2adw44wDcKgH+JRJE5Qg0NP3yiSyi5MxgU6cehGHr7zou1znOM8odbkq # oK+lJ25LCHBSai25CFyD23DZgPfDrJJJK77epTwMP6eKA0kWa3osAe8fcpK40uhk # tzUd/Yk0xUvhDU6lvJukx7jphx40DQt82yepyekl4i0r8OEps/FNO4ahfvAk12hE # 5FVs9HVVWcO5J4dVmVzix4A77p3awLbr89A90/nWGjXMGn7FQhmSlIUDy9Z2hSgc # taepZTd0ILIUbWuhKuAeNIeWrzHKYueMJtItnj2Q+aTyLLKLM0MheP/9w6CtjuuV # HJOVoIJ/DtpJRE7Ce7vMRHoRon4CWIvuiNN1Lk9Y+xZ66lazs2kKFSTnnkrT3pXW # ETTJkhd76CIDBbTRofOsNyEhzZtCGmnQigpFHti58CSmvEyJcAlDVcKacJ+A9/z7 # eacCAwEAAaOCAZUwggGRMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOQ7/PIx7f39 # 1/ORcWMZUEPPYYzoMB8GA1UdIwQYMBaAFO9vU0rp5AZ8esrikFb2L9RJ7MtOMA4G # A1UdDwEB/wQEAwIHgDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDCBlQYIKwYBBQUH # AQEEgYgwgYUwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBd # BggrBgEFBQcwAoZRaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3J0MF8G # A1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2Vy # dFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZTSEEyNTYyMDI1Q0ExLmNybDAg # BgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQAD # ggIBAGUqrfEcJwS5rmBB7NEIRJ5jQHIh+OT2Ik/bNYulCrVvhREafBYF0RkP2AGr # 181o2YWPoSHz9iZEN/FPsLSTwVQWo2H62yGBvg7ouCODwrx6ULj6hYKqdT8wv2UV # +Kbz/3ImZlJ7YXwBD9R0oU62PtgxOao872bOySCILdBghQ/ZLcdC8cbUUO75ZSpb # h1oipOhcUT8lD8QAGB9lctZTTOJM3pHfKBAEcxQFoHlt2s9sXoxFizTeHihsQyfF # g5fxUFEp7W42fNBVN4ueLaceRf9Cq9ec1v5iQMWTFQa0xNqItH3CPFTG7aEQJmmr # JTV3Qhtfparz+BW60OiMEgV5GWoBy4RVPRwqxv7Mk0Sy4QHs7v9y69NBqycz0BZw # hB9WOfOu/CIJnzkQTwtSSpGGhLdjnQ4eBpjtP+XB3pQCtv4E5UCSDag6+iX8MmB1 # 0nfldPF9SVD7weCC3yXZi/uuhqdwkgVxuiMFzGVFwYbQsiGnoa9F5AaAyBjFBtXV # LcKtapnMG3VH3EmAp/jsJ3FVF3+d1SVDTmjFjLbNFZUWMXuZyvgLfgyPehwJVxwC # +UpX2MSey2ueIu9THFVkT+um1vshETaWyQo8gmBto/m3acaP9QsuLj3FNwFlTxq2 # 5+T4QwX9xa6ILs84ZPvmpovq90K8eWyG2N01c4IhSOxqt81nMIIGtDCCBJygAwIB # AgIQDcesVwX/IZkuQEMiDDpJhjANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJV # UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu # Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjUwNTA3 # MDAwMDAwWhcNMzgwMTE0MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO # RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt # ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExMIICIjANBgkqhkiG9w0B # AQEFAAOCAg8AMIICCgKCAgEAtHgx0wqYQXK+PEbAHKx126NGaHS0URedTa2NDZS1 # mZaDLFTtQ2oRjzUXMmxCqvkbsDpz4aH+qbxeLho8I6jY3xL1IusLopuW2qftJYJa # DNs1+JH7Z+QdSKWM06qchUP+AbdJgMQB3h2DZ0Mal5kYp77jYMVQXSZH++0trj6A # o+xh/AS7sQRuQL37QXbDhAktVJMQbzIBHYJBYgzWIjk8eDrYhXDEpKk7RdoX0M98 # 0EpLtlrNyHw0Xm+nt5pnYJU3Gmq6bNMI1I7Gb5IBZK4ivbVCiZv7PNBYqHEpNVWC # 2ZQ8BbfnFRQVESYOszFI2Wv82wnJRfN20VRS3hpLgIR4hjzL0hpoYGk81coWJ+Kd # PvMvaB0WkE/2qHxJ0ucS638ZxqU14lDnki7CcoKCz6eum5A19WZQHkqUJfdkDjHk # ccpL6uoG8pbF0LJAQQZxst7VvwDDjAmSFTUms+wV/FbWBqi7fTJnjq3hj0XbQcd8 # hjj/q8d6ylgxCZSKi17yVp2NL+cnT6Toy+rN+nM8M7LnLqCrO2JP3oW//1sfuZDK # iDEb1AQ8es9Xr/u6bDTnYCTKIsDq1BtmXUqEG1NqzJKS4kOmxkYp2WyODi7vQTCB # ZtVFJfVZ3j7OgWmnhFr4yUozZtqgPrHRVHhGNKlYzyjlroPxul+bgIspzOwbtmsg # Y1MCAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFO9v # U0rp5AZ8esrikFb2L9RJ7MtOMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiu # HA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEF # BQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBB # BggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMu # ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkw # FzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQAXzvsW # gBz+Bz0RdnEwvb4LyLU0pn/N0IfFiBowf0/Dm1wGc/Do7oVMY2mhXZXjDNJQa8j0 # 0DNqhCT3t+s8G0iP5kvN2n7Jd2E4/iEIUBO41P5F448rSYJ59Ib61eoalhnd6ywF # LerycvZTAz40y8S4F3/a+Z1jEMK/DMm/axFSgoR8n6c3nuZB9BfBwAQYK9FHaoq2 # e26MHvVY9gCDA/JYsq7pGdogP8HRtrYfctSLANEBfHU16r3J05qX3kId+ZOczgj5 # kjatVB+NdADVZKON/gnZruMvNYY2o1f4MXRJDMdTSlOLh0HCn2cQLwQCqjFbqrXu # vTPSegOOzr4EWj7PtspIHBldNE2K9i697cvaiIo2p61Ed2p8xMJb82Yosn0z4y25 # xUbI7GIN/TpVfHIqQ6Ku/qjTY6hc3hsXMrS+U0yy+GWqAXam4ToWd2UQ1KYT70kZ # jE4YtL8Pbzg0c1ugMZyZZd/BdHLiRu7hAWE6bTEm4XYRkA6Tl4KSFLFk43esaUeq # GkH/wyW4N7OigizwJWeukcyIPbAvjSabnf7+Pu0VrFgoiovRDiyx3zEdmcif/sYQ # sfch28bZeUz2rtY/9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8BlqmyIjlgp2+VqsS # 9/wQD7yFylIz0scmbKvFoW2jNrbM1pD2T7m3XDCCBY0wggR1oAMCAQICEA6bGI75 # 0C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkGA1UEBhMCVVMxFTATBgNV # BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIG # A1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTIyMDgwMTAwMDAw # MFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD # ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln # aUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orYWcLhKac9WKt2ms2uexuE # DcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNw # wrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs0 # 6wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e # 5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtV # gkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmkwuapoGfdpCe8oU85 # tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0yt5LHucOY67m1O+S # kjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0clcOP9yGyshG3u3/y1Yxw # LEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLimdwHhD5QMIR2yVCkliWzl # DlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFr # b7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZqbId5RsCAwEAAaOCATow # ggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX44LScV1kTN8uZz/nupiu # HA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQE # AwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp # Z2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBFBgNVHR8EPjA8MDqgOKA2 # hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290 # Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/ # Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNK # ei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59PesMHqai7Je1M/RQ0SbQyHr # lnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4 # oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rbII01YBwCA8sgsKxYoA5A # Y8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+2DrZ8LaHlv1b0VysGMNN # n3O3AamfV6peKOK5lDGCA3wwggN4AgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNV # BAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0 # IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMQIQCoDvGEuN8QWC # 0cR2p5V0aDANBglghkgBZQMEAgEFAKCB0TAaBgkqhkiG9w0BCQMxDQYLKoZIhvcN # AQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDgyNTIyNDA1MVowKwYLKoZIhvcNAQkQ # AgwxHDAaMBgwFgQU3WIwrIYKLTBr2jixaHlSMAf7QX4wLwYJKoZIhvcNAQkEMSIE # ICs/u7W7RXZXqF197oXqXjfx4JEXrunVZUkV7D2fmkVgMDcGCyqGSIb3DQEJEAIv # MSgwJjAkMCIEIEqgP6Is11yExVyTj4KOZ2ucrsqzP+NtJpqjNPFGEQozMA0GCSqG # SIb3DQEBAQUABIICAG2F0QNnvcHl0K0ZXrpUeZzAY06tQeUP9EUhKVf6TASIcwZs # w7OwyjNw4396ZaDmeEYcbN1/nOiOkxIuo4cDn2KUFL9PbsS50zOHI/6UQiWJaH9k # /92flg+Bfkezss7G4k7pS4S6Oxnfk69oIaEvltoZo4ye5fhRVv3FwPC0kHQsqKUZ # vH75yUBe/hDkJsi/2CdZlSbH70Ee8hqkT+aWzjuWkdbAbLm1LTdkOu7jbI34CuxQ # BbTGK9BjwaqYXc6RyGP/SSz1uniWBzlq2UIPX5rFqyICqalyYHQhGcHsZwhwDKzu # hu5vnnzi9ggPQQpbUQ063CtuYWK4/dwbEgAzDlIZ+gkvv2cJz/zDRdztMFRmxPjt # NURiwbFxcQPNTC/OF8CiKd7sP2rOklhFGfIsLS1Ly+nYPjsmMU1f4D4rJVJjpBg1 # Fs6SOEQ4BELydPz0kAANPOOPQN+olb/w9PoSBFDzicVq0/AdOnscnHIws/oB0Tty # n2jgP2ia6NzO2hWtZJ4d9hHxD5yHNY6Y+1IS44d8/Eu+tjtCxWtrLkf6Ixlvx3NW # 1KaAUG76d5jQORhaxNcHiBHHJ/J7/rtgRhoSO4fzCyyPEm4IpORMR4blLfsnqhE6 # XLXRVZ7+iKcHaLULbzcPSU+ItKIytMMJE6BAXXY3mSxAR8mi4hDS4R8lpMNP # SIG # End signature block |