Modules/COM-Schedules.psm1
|
#------------------- FUNCTIONS FOR COMPUTE OPS MANAGEMENT SCHEDULES ----------------------------------------------------------------------------------------------------------------------------------------------- using module .\Constants.psm1 # Public functions Function Get-HPECOMSchedule { <# .SYNOPSIS Retrieve the list of schedules. .DESCRIPTION This Cmdlet returns a collection of all schedules that are available in the specified region. .PARAMETER Region Specifies the region code of a Compute Ops Management instance provisioned in the workspace (e.g., 'us-west', 'eu-central', etc.). This mandatory parameter can be retrieved using 'Get-HPEGLService -Name "Compute Ops Management" -ShowProvisioned' or 'Get-HPEGLRegion -ShowProvisioned'. Auto-completion (Tab key) is supported for this parameter, providing a list of region codes provisioned in your workspace. .PARAMETER Name Optional parameter that can be used to specify the name of a schedule to display. .PARAMETER History Optional switch parameter that can be used together with -Name to get all history of a schedule. .PARAMETER ShowPendingSchedules Optional switch parameter that can be used to display scheduled tasks that are not yet executed. .PARAMETER WhatIf Shows the raw REST API call that would be made to COM instead of sending the request. This option is useful for understanding the inner workings of the native REST API calls used by COM. .EXAMPLE Get-HPECOMSchedule -Region eu-central Return the last 50 schedules resources located in the western US region. .EXAMPLE Get-HPECOMSchedule -Region eu-central -name "Firmware update for group Prod" Return the schedule resource named "Firmware update for group Prod" located in the central EU region. .EXAMPLE Get-HPECOMSchedule -Region eu-central -name "Firmware update for group Prod" -History Return the list of history entries of the schedule resource named "Firmware update for group Prod" located in the central EU region. .EXAMPLE Get-HPECOMSchedule -Region eu-central -ShowPendingSchedules Return the list of pending schedules located in the central EU region. .INPUTS None. You cannot pipe objects to this cmdlet. #> [CmdletBinding(DefaultParameterSetName = 'NameShowPendingSchedules')] Param( [Parameter(Mandatory)] [ValidateScript({ # First check if there's an active session with COM regions if (-not $Global:HPEGreenLakeSession -or -not $Global:HPECOMRegions -or $Global:HPECOMRegions.Count -eq 0) { Throw "No active HPE GreenLake session found.`n`nCAUSE:`nYou have not authenticated to HPE GreenLake yet, or your previous session has been disconnected.`n`nACTION REQUIRED:`nRun 'Connect-HPEGL' to establish an authenticated session.`n`nExample:`n Connect-HPEGL`n Connect-HPEGL -Credential (Get-Credential)`n Connect-HPEGL -Workspace `"MyWorkspace`"`n`nAfter connecting, you will be able to use HPE GreenLake cmdlets." } # Then validate the region if (($_ -in $Global:HPECOMRegions.region)) { $true } else { Throw "The COM region '$_' is not provisioned in this workspace! Please specify a valid region code (e.g., 'us-west', 'eu-central'). `nYou can retrieve the region code using: Get-HPEGLService -Name 'Compute Ops Management' -ShowProvisioned. `nYou can also use the Tab key for auto-completion to see the list of provisioned region codes." } })] [ArgumentCompleter({ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) # Filter region based on $Global:HPECOMRegions global variable and create completions $Global:HPECOMRegions.region | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) } })] [String]$Region, [Parameter(Mandatory, ParameterSetName = 'NameHistory')] [Parameter(ParameterSetName = 'NameShowPendingSchedules')] [String]$Name, [Parameter(ParameterSetName = 'NameHistory')] [Switch]$History, [Parameter(ParameterSetName = 'NameShowPendingSchedules')] [Switch]$ShowPendingSchedules, [Switch]$WhatIf ) Begin { $Caller = (Get-PSCallStack)[1].Command "[{0}] Called from: {1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Caller | Write-Verbose } Process { "[{0}] Bound PS Parameters: {1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($PSBoundParameters | out-string) | Write-Verbose if ($Name) { $Uri = (Get-COMSchedulesUri) + "?filter=name eq '$Name'" } elseif ($ID) { $Uri = (Get-COMSchedulesUri) + "?filter=id eq '$ID'" } else { $Uri = Get-COMSchedulesUri } if ($History) { $Uri = (Get-COMSchedulesUri) + "?filter=name eq '$Name'" try { [Array]$SchedulesList = Invoke-HPECOMWebRequest -Method Get -Uri $Uri -Region $Region $ScheduleID = $SchedulesList.id "[{0}] ID found for the schedule '{1}': '{2}'" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Name, $ScheduleID | Write-Verbose if ($Null -eq $ScheduleID) { "[{0}] Schedule name '{1}' cannot be found!" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Name | Write-Verbose Return } $Uri = (Get-COMSchedulesUri) + "/" + $ScheduleID + "/history" } catch { $PSCmdlet.ThrowTerminatingError($_) } } try { [Array]$CollectionList = Invoke-HPECOMWebRequest -Method Get -Uri $Uri -Region $Region -WhatIfBoolean $WhatIf -Verbose:$VerbosePreference } catch { $PSCmdlet.ThrowTerminatingError($_) } $ReturnData = @() if ($Null -ne $CollectionList) { # Add region to object $CollectionList | Add-Member -type NoteProperty -name region -value $Region if ($ShowPendingSchedules) { $CollectionList = $CollectionList | Where-Object { $Null -ne $_.nextStartAt } } if ($History) { $ReturnData = Invoke-RepackageObjectWithType -RawObject $CollectionList -ObjectName "COM.Schedules.History" } else { $ReturnData = Invoke-RepackageObjectWithType -RawObject $CollectionList -ObjectName "COM.Schedules" $ReturnData = $ReturnData | Sort-Object name, purpose, nextStartAt } return $ReturnData } else { return } } } Function Remove-HPECOMSchedule { <# .SYNOPSIS Remove a schedule resource from a region. .DESCRIPTION This Cmdlet can be used to delete a schedule resource and its associated history in a region using its name property. .PARAMETER Name Name of the schedule resource to remove. .PARAMETER Region Specifies the region code of a Compute Ops Management instance provisioned in the workspace (e.g., 'us-west', 'eu-central', etc.) where to remove a schedule resource. This mandatory parameter can be retrieved using 'Get-HPEGLService -Name "Compute Ops Management" -ShowProvisioned' or 'Get-HPEGLRegion -ShowProvisioned'. Auto-completion (Tab key) is supported for this parameter, providing a list of region codes provisioned in your workspace. .PARAMETER WhatIf Shows the raw REST API call that would be made to COM instead of sending the request. This option is useful for understanding the inner workings of the native REST API calls used by COM. .EXAMPLE Remove-HPECOMSchedule -Region eu-central -Name "ESXi_group_ServerFirmwareUpdate_Schedule_663933" Remove the schedule named "ESXi_group_ServerFirmwareUpdate_Schedule_663933" from the central EU region. .EXAMPLE Get-HPECOMSchedule -Region eu-central -Name 'ESXi_group_ServerFirmwareUpdate_Schedule_663933' | Remove-HPECOMSchedule Remove schedule 'ESXi_group_ServerFirmwareUpdate_Schedule_663933' from the central EU region using 'Get-HPECOMSchedule' as a pipeline input. .EXAMPLE Get-HPECOMSchedule -Region eu-central -ShowPendingSchedules | Remove-HPECOMSchedule Remove all pending schedules from the central EU region using 'Get-HPECOMSchedule' as a pipeline input. .EXAMPLE Get-HPECOMSchedule -Region eu-central | Where-Object name -match "Inventory_Report_Schedule" | Remove-HPECOMSchedule Remove all schedules with names that match 'Inventory_Report_Schedule' from the 'eu-central' region. .EXAMPLE Get-HPECOMSchedule -Region eu-central | Remove-HPECOMSchedule Remove all schedules from the central EU region. .INPUTS System.Collections.ArrayList List of schedule(s) from 'Get-HPECOMSchedule'. .OUTPUTS System.Collections.ArrayList A custom status object or array of objects containing the following PsCustomObject keys: * Name - Name of the schedule attempted to be removed * Region - Name of the region where the schedule is removed * Status - Status of the removal attempt (Failed for http error return; Complete if removal is successful; Warning if no action is needed) * Details - More information about the status * Exception: Information about any exceptions generated during the operation. #> [CmdletBinding(DefaultParameterSetName = 'Default')] Param( [Parameter (Mandatory, ValueFromPipelineByPropertyName)] [ValidateScript({ # First check if there's an active session with COM regions if (-not $Global:HPEGreenLakeSession -or -not $Global:HPECOMRegions -or $Global:HPECOMRegions.Count -eq 0) { Throw "No active HPE GreenLake session found.`n`nCAUSE:`nYou have not authenticated to HPE GreenLake yet, or your previous session has been disconnected.`n`nACTION REQUIRED:`nRun 'Connect-HPEGL' to establish an authenticated session.`n`nExample:`n Connect-HPEGL`n Connect-HPEGL -Credential (Get-Credential)`n Connect-HPEGL -Workspace `"MyWorkspace`"`n`nAfter connecting, you will be able to use HPE GreenLake cmdlets." } # Then validate the region if (($_ -in $Global:HPECOMRegions.region)) { $true } else { Throw "The COM region '$_' is not provisioned in this workspace! Please specify a valid region code (e.g., 'us-west', 'eu-central'). `nYou can retrieve the region code using: Get-HPEGLService -Name 'Compute Ops Management' -ShowProvisioned. `nYou can also use the Tab key for auto-completion to see the list of provisioned region codes." } })] [ArgumentCompleter({ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) # Filter region based on $Global:HPECOMRegions global variable and create completions $Global:HPECOMRegions.region | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) } })] [String]$Region, [Parameter (Mandatory, ValueFromPipelineByPropertyName)] [String]$Name, [Switch]$WhatIf ) Begin { $Caller = (Get-PSCallStack)[1].Command "[{0}] Called from: '{1}'" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Caller | Write-Verbose $RemoveScheduleStatus = [System.Collections.ArrayList]::new() } Process { "[{0}] Bound PS Parameters: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($PSBoundParameters | out-string) | Write-Verbose try { $ScheduleResource = Get-HPECOMSchedule -Region $Region -Name $Name } catch { $PSCmdlet.ThrowTerminatingError($_) } # Build object for the output $objStatus = [pscustomobject]@{ Name = $Name Region = $Region Status = $Null Details = $Null Exception = $Null } $ScheduleID = $ScheduleResource.id if (-not $ScheduleID) { # Must return a message if not found if ($WhatIf) { $ErrorMessage = "Schedule '{0}': Resource cannot be found in the '{1}' region!" -f $Name, $Region Write-warning $ErrorMessage return } else { $objStatus.Status = "Failed" $objStatus.Details = "Schedule cannot be found in the region!" } } else { $Uri = (Get-COMSchedulesUri) + "/" + $ScheduleID # Removal task try { $Response = Invoke-HPECOMWebRequest -Region $Region -Uri $Uri -method DELETE -WhatIfBoolean $WhatIf -Verbose:$VerbosePreference if (-not $WhatIf) { "[{0}] Schedule removal raw response: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Response | Write-Verbose "[{0}] Schedule '{1}' successfully deleted from '{2}' region" -f $MyInvocation.InvocationName.ToString().ToUpper(), $name, $Region | Write-Verbose $objStatus.Status = "Complete" $objStatus.Details = "Schedule successfully deleted from $Region region" } } catch { if (-not $WhatIf) { $objStatus.Status = "Failed" $objStatus.Details = "Schedule cannot be deleted!" $objStatus.Exception = $Global:HPECOMInvokeReturnData } } } [void] $RemoveScheduleStatus.add($objStatus) } end { if (-not $WhatIf) { $RemoveScheduleStatus = Invoke-RepackageObjectWithType -RawObject $RemoveScheduleStatus -ObjectName "COM.objStatus.NSDE" Return $RemoveScheduleStatus } } } Function Set-HPECOMSchedule { <# .SYNOPSIS Update a schedule resource in a region. .DESCRIPTION This Cmdlet can be used to modify the basic settings of a schedule resource in a region. Basic settings include name, description, and schedule. To modify advanced settings, such as the schedule operations or the associated resource, it's necessary to remove the existing schedule (using 'Remove-HPECOMSchedule') and re-create it using one of the Register cmdlets (such as 'Register-HPECOMGroupFirmwareUpdateSchedule', 'Register-HPECOMServerFirmwareUpdateSchedule', etc.). .PARAMETER Name Name of the schedule to update. .PARAMETER ID ID of the schedule to update. .PARAMETER Region Specifies the region code of a Compute Ops Management instance provisioned in the workspace (e.g., 'us-west', 'eu-central', etc.) where the schedule is located. This mandatory parameter can be retrieved using 'Get-HPEGLService -Name "Compute Ops Management" -ShowProvisioned' or 'Get-HPEGLRegion -ShowProvisioned'. Auto-completion (Tab key) is supported for this parameter, providing a list of region codes provisioned in your workspace. .PARAMETER NewName New name for the schedule. .PARAMETER NewScheduleTime New time for the scheduled operation's execution. .PARAMETER NewInterval Specifies the new execution interval of a schedule in ISO 8601 format (e.g., P1D, P1W), useful for executing a recurring schedule. The accepted formats include periods (P) and time (T) designations, referencing days, weeks, months, years, hours, minutes, and seconds. This parameter supports common ISO 8601 durations such as: - PT15M (15 Minutes) - PT1H (1 Hour) - P1D (1 Day) - P1W (1 Week) - P1M (1 Month) - P1Y (1 Year) .PARAMETER NewDescription New description for the schedule. .PARAMETER WhatIf Shows the raw REST API call that would be made to COM instead of sending the request. This option is useful for understanding the inner workings of the native REST API calls used by COM. .EXAMPLE Set-HPECOMSchedule -Region us-west -Name ServerFirmwareUpdate_Schedule -NewName CZ12312312_ServerFirmwareUpdate_Schedule Change the name of the schedule named 'ServerFirmwareUpdate_Schedule' to 'CZ12312312_ServerFirmwareUpdate_Schedule' in the western US region. .EXAMPLE Set-HPECOMSchedule -Region eu-central -Name ServerFirmwareUpdate_Schedule -NewDescription "This is my new description" Change the description of the schedule named 'ServerFirmwareUpdate_Schedule' to 'This is my new description' in the central EU region. .EXAMPLE Set-HPECOMSchedule -Region eu-central -Name ServerFirmwareUpdate_Schedule -NewScheduleTime (Get-Date).AddMonths(6) Change the schedule time of the schedule named 'ServerFirmwareUpdate_Schedule' to six months from the current date. .EXAMPLE Set-HPECOMSchedule -Region eu-central -Name ServerFirmwareUpdate_Schedule -NewInterval P2M Change the interval time of the schedule named 'ServerFirmwareUpdate_Schedule' to an interval of two months. .EXAMPLE Set-HPECOMSchedule -Region eu-central -Name ServerFirmwareUpdate_Schedule -NewScheduleTime (Get-Date).AddMonths(6) -NewInterval P2M Change both the schedule time and the interval time of the schedule named 'ServerFirmwareUpdate_Schedule' in the eu-central region. Set the schedule time to six months from the current date and the interval to recur every two months. .EXAMPLE Set-HPECOMSchedule -Region eu-central -Name ServerFirmwareUpdate_Schedule -NewName CZ12312312_ServerFirmwareUpdate_Schedule -NewScheduleTime ((Get-Date).AddMonths(6)) -NewDescription "My new description" Change the name, the schedule time and description of the schedule named 'ServerFirmwareUpdate_Schedule' in the central EU region. .EXAMPLE Get-HPECOMSchedule -Region eu-central | Set-HPECOMSchedule -NewScheduleTime (Get-Date).AddDays(7) Change the schedule time of all schedules found in the central EU region to 7 days from the current date. .INPUTS System.Collections.ArrayList List of schedule(s) from 'Get-HPECOMSchedule'. .OUTPUTS System.Collections.ArrayList A custom status object or array of objects containing the following PsCustomObject keys: * Name - Name of the schedule attempted to be updated * Region - Name of the region where the schedule is updated * Status - Status of the modification attempt (Failed for http error return; Complete if modification is successful; Warning if no action is needed) * Details - More information about the status * Exception: Information about any exceptions generated during the operation. #> [CmdletBinding(DefaultParameterSetName = 'Name')] Param( [Parameter (Mandatory, ValueFromPipelineByPropertyName)] [ValidateScript({ # First check if there's an active session with COM regions if (-not $Global:HPEGreenLakeSession -or -not $Global:HPECOMRegions -or $Global:HPECOMRegions.Count -eq 0) { Throw "No active HPE GreenLake session found.`n`nCAUSE:`nYou have not authenticated to HPE GreenLake yet, or your previous session has been disconnected.`n`nACTION REQUIRED:`nRun 'Connect-HPEGL' to establish an authenticated session.`n`nExample:`n Connect-HPEGL`n Connect-HPEGL -Credential (Get-Credential)`n Connect-HPEGL -Workspace `"MyWorkspace`"`n`nAfter connecting, you will be able to use HPE GreenLake cmdlets." } # Then validate the region if (($_ -in $Global:HPECOMRegions.region)) { $true } else { Throw "The COM region '$_' is not provisioned in this workspace! Please specify a valid region code (e.g., 'us-west', 'eu-central'). `nYou can retrieve the region code using: Get-HPEGLService -Name 'Compute Ops Management' -ShowProvisioned. `nYou can also use the Tab key for auto-completion to see the list of provisioned region codes." } })] [ArgumentCompleter({ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) # Filter region based on $Global:HPECOMRegions global variable and create completions $Global:HPECOMRegions.region | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) } })] [String]$Region, [Parameter (Mandatory, ValueFromPipelineByPropertyName, ParameterSetName = 'Name')] [String]$Name, [Parameter (Mandatory, ValueFromPipelineByPropertyName, ParameterSetName = 'ID')] [String]$ID, [ValidateScript({ $_.Length -le 100 })] [String]$NewName, [ValidateScript({ if ($_ -ge (Get-Date) -and $_ -le (Get-Date).AddYears(1)) { $true } else { throw "The ScheduleTime must be within one year from the current date." } })] [DateTime]$NewScheduleTime, [ValidateScript({ if ($_ -match '^P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$') { return $true } else { throw "Invalid duration format. Please use an ISO 8601 period interval (e.g., P1D, P1W, P1M, P1Y, PT1H, PT15M)" } })] [String]$NewInterval, [Parameter (ValueFromPipelineByPropertyName)] [ValidateScript({ $_.Length -le 10000 })] [alias('description')] [String]$NewDescription, [Switch]$WhatIf ) Begin { $Caller = (Get-PSCallStack)[1].Command "[{0}] Called from: '{1}'" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Caller | Write-Verbose $SetScheduleStatus = [System.Collections.ArrayList]::new() } Process { "[{0}] Bound PS Parameters: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($PSBoundParameters | out-string) | Write-Verbose try { if ($Name) { $ParamUsed = $Name $SchedulesResources = Get-HPECOMSchedule -Region $Region -Name $Name if ($SchedulesResources.length -gt 1) { $ErrorMessage = "More than one schedule uses the name '{0}' in the '{1}' region!" -f $Name, $Region Write-warning $ErrorMessage break } else { $ScheduleID = $SchedulesResources.id } } else { $ParamUsed = $ID $SchedulesResources = Get-HPECOMSchedule -Region $Region $ScheduleID = $SchedulesResources | Where-Object id -eq $ID } } catch { $PSCmdlet.ThrowTerminatingError($_) } # Build object for the output $objStatus = [pscustomobject]@{ Name = $ParamUsed Region = $Region Status = $Null Details = $Null Exception = $Null } "[{0}] Schedule ID found: '{1}'" -f $MyInvocation.InvocationName.ToString().ToUpper(), $ScheduleID | Write-Verbose if (-not $ScheduleID) { # Must return a message if not found if ($WhatIf) { $ErrorMessage = "Schedule '{0}' cannot be found in the Compute Ops Management instance!" -f $ParamUsed $ErrorRecord = New-ErrorRecord ScheduleNotFoundInCOM ObjectNotFound -TargetObject 'Schedule' -Message $ErrorMessage -TargetType $ParamUsed.GetType().Name $PSCmdlet.ThrowTerminatingError($ErrorRecord) } else { $objStatus.Status = "Failed" $objStatus.Details = "Schedule cannot be found in the Compute Ops Management instance!" } } else { $_Schedule = Get-HPECOMSchedule -Region $Region -ID $ScheduleID $Uri = (Get-COMSchedulesUri) + "/" + $ScheduleID $Payload = @{} # Conditionally add properties if ($NewName) { $Payload.name = $NewName } else { $Payload.name = $Name } if (-not $PSBoundParameters.ContainsKey('NewDescription')) { if ($_Schedule.description) { $Payload.description = $_Schedule.description } else { $Payload.description = $Null } } else { $Payload.description = $NewDescription } if ($NewScheduleTime -and -not $NewInterval) { $Payload.schedule = @{ startAt = $NewScheduleTime.ToString("o") # Convert to ISO 8601 format as $ScheduleTime alone is convert by PS5.1 to '/Date(...)\/ notation' interval = $_Schedule.schedule.interval } } elseif ($NewScheduleTime -and $NewInterval) { $Payload.schedule = @{ startAt = $NewScheduleTime.ToString("o") # Convert to ISO 8601 format as $ScheduleTime alone is convert by PS5.1 to '/Date(...)\/ notation' interval = $NewInterval } } elseif (-not $NewScheduleTime -and $NewInterval) { $Payload.schedule = @{ startAt = $_Schedule.schedule.startAt interval = $NewInterval } } else { $Payload.schedule = @{ startAt = $_Schedule.schedule.startAt interval = $_Schedule.schedule.interval } } $Payload.purpose = $_Schedule.purpose $Payload.associatedResourceUri = $_Schedule.associatedResourceUri # Convert the hashtable to JSON $jsonPayload = $Payload | ConvertTo-Json # Set resource try { $Response = Invoke-HPECOMWebRequest -Region $Region -Uri $Uri -method PATCH -body $jsonPayload -ContentType "application/merge-patch+json" -WhatIfBoolean $WhatIf -Verbose:$VerbosePreference if (-not $WhatIf) { "[{0}] Schedule update raw response: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Response | Write-Verbose "[{0}] Schedule '{1}' successfully updated in '{2}' region" -f $MyInvocation.InvocationName.ToString().ToUpper(), $name, $Region | Write-Verbose $objStatus.Status = "Complete" $objStatus.Details = "Schedule successfully updated in $Region region" } } catch { if (-not $WhatIf) { $objStatus.Status = "Failed" $objStatus.Details = "Schedule cannot be updated!" $objStatus.Exception = $Global:HPECOMInvokeReturnData } } } [void] $SetScheduleStatus.add($objStatus) } end { if (-not $WhatIf) { $RemoveScheduleStatus = Invoke-RepackageObjectWithType -RawObject $RemoveScheduleStatus -ObjectName "COM.objStatus.NSDE" Return $SetScheduleStatus } } } # Private functions (not exported) function New-ErrorRecord { <# .Synopsis Creates an custom ErrorRecord that can be used to report a terminating or non-terminating error. .Description Creates an custom ErrorRecord that can be used to report a terminating or non-terminating error. .Parameter Exception The Exception that will be associated with the ErrorRecord. Uses RuntimeException by default. .Parameter ErrorID A scripter-defined identifier of the error. This identifier must be a non-localized string for a specific error type. .Parameter ErrorCategory An ErrorCategory enumeration that defines the category of the error. The supported Category Members are (from: http://msdn.microsoft.com/en-us/library/system.management.automation.errorcategory(v=vs.85).aspx) : * AuthenticationError - An error that occurs when the user cannot be authenticated by the service. This could mean that the credentials are invalid or that the authentication system is not functioning properly. * CloseError - An error that occurs during closing. * ConnectionError - An error that occurs when a network connection that the operation depEnds on cannot be established or maintained. * DeadlockDetected - An error that occurs when a deadlock is detected. * DeviceError - An error that occurs when a device reports an error. * FromStdErr - An error that occurs when a non-Windows PowerShell command reports an error to its STDERR pipe. * InvalidArgument - An error that occurs when an argument that is not valid is specified. * InvalidData - An error that occurs when data that is not valid is specified. * InvalidOperation - An error that occurs when an operation that is not valid is requested. * InvalidResult - An error that occurs when a result that is not valid is returned. * InvalidType - An error that occurs when a .NET Framework type that is not valid is specified. * LimitsExceeded - An error that occurs when internal limits prevent the operation from being executed. * MetadataError - An error that occurs when metadata contains an error. * NotEnabled - An error that occurs when the operation attempts to use functionality that is currently disabled. * NotImplemented - An error that occurs when a referenced application programming interface (API) is not implemented. * NotInstalled - An error that occurs when an item is not installed. * NotSpecified - An unspecified error. Use only when not enough is known about the error to assign it to another error category. Avoid using this category if you have any information about the error, even if that information is incomplete. * ObjectNotFound - An error that occurs when an object cannot be found. * OpenError - An error that occurs during opening. * OperationStopped - An error that occurs when an operation has stopped. For example, the user interrupts the operation. * OperationTimeout - An error that occurs when an operation has exceeded its timeout limit. * ParserError - An error that occurs when a parser encounters an error. * PermissionDenied - An error that occurs when an operation is not permitted. * ProtocolError An error that occurs when the contract of a protocol is not being followed. This error should not happen with well-behaved components. * QuotaExceeded An error that occurs when controls on the use of traffic or resources prevent the operation from being executed. * ReadError An error that occurs during reading. * ResourceBusy An error that occurs when a resource is busy. * ResourceExists An error that occurs when a resource already exists. * ResourceUnavailable An error that occurs when a resource is unavailable. * SecurityError An error that occurs when a security violation occurs. This field is introduced in Windows PowerShell 2.0. * SyntaxError An error that occurs when a command is syntactically incorrect. * WriteError An error that occurs during writing. .Parameter TargetObject The object that was being Processed when the error took place. .Parameter Message Describes the Exception to the user. .Parameter InnerException The Exception instance that caused the Exception association with the ErrorRecord. .Parameter TargetType To customize the TargetType value, specify the appropriate Target object type. Values can be "Array", "PSObject", "HashTable", etc. Can be provided by ${ParameterName}.GetType().Name. .Example $errorMessage = "Timeout reached waiting for job to complete." $errorRecord = New-ErrorRecord TimeoutError OperationTimeout -Message $ErrorMessage $PSCmdlet.ThrowTerminatingError($ErrorRecord ) .EXAMPLE $ErrorMessage = "Filter '{0}' cannot be found in the Compute Ops Management instance!" -f $Name $ErrorRecord = New-ErrorRecord FilterNotFoundInCOM ObjectNotFound -TargetObject 'Filter' -Message $ErrorMessage -TargetType $Name.GetType().Name $PSCmdlet.ThrowTerminatingError($ErrorRecord ) #> [CmdletBinding ()] Param ( [Parameter (Mandatory, Position = 0)] [Alias ('ID')] [System.String]$ErrorId, [Parameter (Mandatory, Position = 1)] [Alias ('Category')] [ValidateSet ('AuthenticationError', 'ConnectionError', 'NotSpecified', 'OpenError', 'CloseError', 'DeviceError', 'DeadlockDetected', 'InvalidArgument', 'InvalidData', 'InvalidOperation', 'InvalidResult', 'InvalidType', 'MetadataError', 'NotImplemented', 'NotInstalled', 'ObjectNotFound', 'OperationStopped', 'OperationTimeout', 'SyntaxError', 'ParserError', 'PermissionDenied', 'ResourceBusy', 'ResourceExists', 'ResourceUnavailable', 'ReadError', 'WriteError', 'FromStdErr', 'SecurityError')] [System.Management.Automation.ErrorCategory]$ErrorCategory, [Parameter (Position = 2)] [System.Object]$TargetObject, [System.String]$Exception = "System.Management.Automation.RuntimeException", # [Parameter (Mandatory)] [System.String]$Message, [System.Exception]$InnerException, [System.String]$TargetType = "String" ) Process { # ...build and save the new Exception depending on present arguments, if it... $_exception = if ($Message -and $InnerException) { # ...includes a custom message and an inner exception New-Object $Exception $Message, $InnerException } elseif ($Message) { # ...includes a custom message only New-Object $Exception $Message } else { # ...is just the exception full name New-Object $Exception } # now build and output the new ErrorRecord "[{0}] Building ErrorRecord object" -f $MyInvocation.InvocationName.ToString().ToUpper() | Write-Verbose $record = [Management.Automation.ErrorRecord]::new($_exception, $ErrorID, $ErrorCategory, $TargetObject) $record.CategoryInfo.TargetType = $TargetType Return $record } } function Invoke-RepackageObjectWithType { Param ( $RawObject, $ObjectName, [boolean] $WhatIf = $false ) process { if ( $RawObject ) { $OutputObject = @() if ( $WhatIf ) { Return } foreach ( $RawElementObject in $RawObject ) { # "[{0}] Element: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($RawElementObject | out-string) | write-verbose $DataSetType = "HPEGreenLake.$ObjectName" $RawElementObject.PSTypeNames.Insert(0, $DataSetType) # "[{0}] Element PSTypeName set: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($RawElementObject.PSTypeNames[0] | out-string)| write-verbose # "[{0}] Element PSObject TypeNames set: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($RawElementObject.PSObject.TypeNames[0] | out-string)| write-verbose $RawElementObject.PSObject.TypeNames.Insert(0, $DataSetType) # "[{0}] Element PSObject TypeNames set: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($RawElementObject.PSObject.TypeNames[0] | out-string)| write-verbose $OutputObject += $RawElementObject } # "[{0}] Object typenames : `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($OutputObject.PSObject.TypeNames | Out-String) | write-verbose if ($OutputObject.PSObject.TypeNames -notcontains $DataSetType) { # "[{0}] Object typenames added using Add-Member as the object is read only" -f $MyInvocation.InvocationName.ToString().ToUpper() | write-verbose foreach ($item in $OutputObject) { [void]($item | Add-Member -MemberType NoteProperty -Name PSObject.TypeNames -Value @( $DataSetType) -Force) } } return $OutputObject } else { # "[{0}] Null value sent to create object type." -f $MyInvocation.InvocationName.ToString().ToUpper() | Write-Verbose return } } } # Export only public functions and aliases Export-ModuleMember -Function 'Get-HPECOMSchedule', 'Remove-HPECOMSchedule', 'Set-HPECOMSchedule' -Alias * # SIG # Begin signature block # MIIungYJKoZIhvcNAQcCoIIujzCCLosCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBFRaPpJWV1gjMH # CgqQmUIbfWdSUZjJ4CATljQLxYnK5qCCEfYwggVvMIIEV6ADAgECAhBI/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/ # L9Uo2bC5a4CH2RwwggZhMIIEyaADAgECAhEAyDHh+zCQwUNyJV9S6gqqvTANBgkq # hkiG9w0BAQwFADBUMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p # dGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2 # MB4XDTI1MDUyMDAwMDAwMFoXDTI4MDUxOTIzNTk1OVowdzELMAkGA1UEBhMCVVMx # DjAMBgNVBAgMBVRleGFzMSswKQYDVQQKDCJIZXdsZXR0IFBhY2thcmQgRW50ZXJw # cmlzZSBDb21wYW55MSswKQYDVQQDDCJIZXdsZXR0IFBhY2thcmQgRW50ZXJwcmlz # ZSBDb21wYW55MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA37AD03qw # cmuCQyxRB2VBM7SfUf0SmpQb8iaPvGmxw5uoDBY3gdC/3Xq/rfM3ndCn03hNdGyu # cpC7tD4zmel6yYqxyXDVr45Jd2cz9jFXoYTOMcuDV6I6CvU/EnbFxWhv0VCp+2Ip # z4+uJGI6aVlMpFpLbgPjhp9ogd/89HEyi1FkSFoarnvxxaXm93S81k7FD/4Edtvu # muGI4V8p39GfbCiMuHku8BzSQ2g86gWFnOaVhY6h4XWvEmE8LPYkU/STrej28Flg # kSt9f/Jg6+dvRKm92uN2Z760Eql9+DTWkGmGe4YrIyD25XDa07sS9tIpVWzLrGOy # ecaVpJwVVBqCadXDgkgTYKw/UlS+cEqsviT6wREGl4aX/GbeNO6Y4oDTTYkabW3p # eg1ku0v90oDqzoTaWEE5ly2UajvXIgzpFLLXqpR6GYkv/y3ZJV0chBqRtAObebH7 # XOBa5a2kqMBw0gkIZBJHd8+PCPH/U7eJkeKXtGGj2uTudcGjZgOjVcFYdCRnufJd # isrV7bj0Hzghcv3QyRXL3rRjcNb4ccKNnSgF/8cmiTVpvFHTfUKsYdkbM6wsbjXR # dJNADjGOYRms7tKsii3/oXO+2S1Um7yomBZQ2+wVRCY6MrRX1onDKid5t5AyWFtR # u0aQcdBmHG6JeDiQ3Hrb2g9kZhuFkgABVBkCAwEAAaOCAYkwggGFMB8GA1UdIwQY # MBaAFA8qyyCHKLjsb0iuK1SmKaoXpM0MMB0GA1UdDgQWBBQH4rUE0gsy8LW2G3vm # oYtOnZ8zEjAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAK # BggrBgEFBQcDAzBKBgNVHSAEQzBBMDUGDCsGAQQBsjEBAgEDAjAlMCMGCCsGAQUF # BwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBBAEwSQYDVR0fBEIw # QDA+oDygOoY4aHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29k # ZVNpZ25pbmdDQVIzNi5jcmwweQYIKwYBBQUHAQEEbTBrMEQGCCsGAQUFBzAChjho # dHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NB # UjM2LmNydDAjBggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJ # KoZIhvcNAQEMBQADggGBAIax+Yaj5EciDlztft4iAfD2CtIWEF0cxR+UbbvJEs86 # 5wyoO3ZQoujr0FJ+P5fjDKLbamHrEWmyoD2YC4lzecmnFOnY0y4uJ9zBY8B6X6TU # 9e6+TfZtlXd44YffXYAfoLX+uYjVJcZOaMuXF61+CFpjLJjepsD8m1gdj5QUz2sH # 6GOfU6mEm8SHvKpgPMV/yhEKqgjlenY6Ao49RkxnDuvRlMP8SFPB+8bxiLegEdGa # ei8nSr/j5YeDZFevUJ696T4W45QGrwAhBBpbKDz6CzlImC1b2C8Bp02XBAsOQs/u # CIaQv5XxUmVxmb85tDJkd7QfqHo2z1T2NYMkvXUcSClYRuVxxC/frpqcrxS9O9xE # v65BoUztAJSXsTdfpUjWeNOnhq8lrwa2XAD3fbagNF6ElsBiNDSbwHCG/iY4kAya # VpbAYtaa6TfzdI/I0EaCX5xYRW56ccI2AnbaEVKz9gVjzi8hBLALlRhrs1uMFtPj # nZ+oA+rbZZyGZkz3xbUYKTGCG/4wghv6AgEBMGkwVDELMAkGA1UEBhMCR0IxGDAW # BgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMg # Q29kZSBTaWduaW5nIENBIFIzNgIRAMgx4fswkMFDciVfUuoKqr0wDQYJYIZIAWUD # BAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGC # NwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQx # IgQgbYnkF/D5IAnKR56s+DkfFDfNlmNLWn75vEgTTIVD8T8wDQYJKoZIhvcNAQEB # BQAEggIAqAOJs5Kx+Ob+lRfy6NY5Fx7VlJ+CcjEcjQ7L9QR1Du0NtDx2YzxeaBJZ # MTnWPwVmeNu7ybxdPaw2BCxVnM/9VNP/1kVpZb5tC1+dbwIn5b058ez0VLY9gsC8 # 5F4fbTElnpvHr1egjQgBXrnXUzS2X53kn2aygQm9nSgjUoQhcBtkZWKaXjv44ySy # Zldmd3+8BC7WQmbB4Cuy+BvA05TwwQlfrTB76xi33yIQwjvxR6sORx6NRc98WQxe # lpEKGP6loastqZTQ1li5r/nbxek2OEIL5L8AkFYd/hw4fPic9cwjh5Jne/pBm6f0 # Aye6dnBbvYzt3YmeoDmXx6gFUl8Mg8LYsu6bLm2kPqNr/JNknDIqnAEG37nHzDU0 # urAEahYIfnGx7b5lVO1TBHy6PQ8S0nyp2RqtMXhK4/UMQcETEfNhAr5pCCb3Yw68 # vclF+NUHweGClNtto9gAAg4/xlXSYDp+xIx1f4QZzq4rQo4KxeVhiO1nnn0kx2eC # f5sUCNITKROxpYP/TMFon76VRLanIj8kbOaYRj4WGDMnjIQFPykqVuFUBfA27wr1 # KyIsOnp0frmfEXJddwTw8UTw7UP2SKz4WTw3pJIt/PP6mIbYv1Oq6t8Efhx95vvu # VZRg2hKG5QSppWjfd/dWEPxs3liGZi9LSaUb/lVQbX5CKr8YD+qhghjoMIIY5AYK # KwYBBAGCNwMDATGCGNQwghjQBgkqhkiG9w0BBwKgghjBMIIYvQIBAzEPMA0GCWCG # SAFlAwQCAgUAMIIBBwYLKoZIhvcNAQkQAQSggfcEgfQwgfECAQEGCisGAQQBsjEC # AQEwQTANBglghkgBZQMEAgIFAAQwMN1OIGCjNYNA0FB+56i7sBZhK3eACll7NnUx # 0CD1QKe9LVsbDzOdeKobcCHIwJYWAhQi92kQgPoP4Lf/pD6girM4X0POfBgPMjAy # NjAxMTkxODE5NTRaoHakdDByMQswCQYDVQQGEwJHQjEXMBUGA1UECBMOV2VzdCBZ # b3Jrc2hpcmUxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEwMC4GA1UEAxMnU2Vj # dGlnbyBQdWJsaWMgVGltZSBTdGFtcGluZyBTaWduZXIgUjM2oIITBDCCBmIwggTK # oAMCAQICEQCkKTtuHt3XpzQIh616TrckMA0GCSqGSIb3DQEBDAUAMFUxCzAJBgNV # BAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMTI1NlY3Rp # Z28gUHVibGljIFRpbWUgU3RhbXBpbmcgQ0EgUjM2MB4XDTI1MDMyNzAwMDAwMFoX # DTM2MDMyMTIzNTk1OVowcjELMAkGA1UEBhMCR0IxFzAVBgNVBAgTDldlc3QgWW9y # a3NoaXJlMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxMDAuBgNVBAMTJ1NlY3Rp # Z28gUHVibGljIFRpbWUgU3RhbXBpbmcgU2lnbmVyIFIzNjCCAiIwDQYJKoZIhvcN # AQEBBQADggIPADCCAgoCggIBANOElfRupFN48j0QS3gSBzzclIFTZ2Gsn7BjsmBF # 659/kpA2Ey7NXK3MP6JdrMBNU8wdmkf+SSIyjX++UAYWtg3Y/uDRDyg8RxHeHRJ+ # 0U1jHEyH5uPdk1ttiPC3x/gOxIc9P7Gn3OgW7DQc4x07exZ4DX4XyaGDq5LoEmk/ # BdCM1IelVMKB3WA6YpZ/XYdJ9JueOXeQObSQ/dohQCGyh0FhmwkDWKZaqQBWrBwZ # ++zqlt+z/QYTgEnZo6dyIo2IhXXANFkCHutL8765NBxvolXMFWY8/reTnFxk3Maj # gM5NX6wzWdWsPJxYRhLxtJLSUJJ5yWRNw+NBqH1ezvFs4GgJ2ZqFJ+Dwqbx9+rw+ # F2gBdgo4j7CVomP49sS7CbqsdybbiOGpB9DJhs5QVMpYV73TVV3IwLiBHBECrTgU # fZVOMF0KSEq2zk/LsfvehswavE3W4aBXJmGjgWSpcDz+6TqeTM8f1DIcgQPdz0IY # gnT3yFTgiDbFGOFNt6eCidxdR6j9x+kpcN5RwApy4pRhE10YOV/xafBvKpRuWPjO # PWRBlKdm53kS2aMh08spx7xSEqXn4QQldCnUWRz3Lki+TgBlpwYwJUbR77DAayNw # AANE7taBrz2v+MnnogMrvvct0iwvfIA1W8kp155Lo44SIfqGmrbJP6Mn+Udr3MR2 # oWozAgMBAAGjggGOMIIBijAfBgNVHSMEGDAWgBRfWO1MMXqiYUKNUoC6s2GXGaIy # mzAdBgNVHQ4EFgQUiGGMoSo3ZIEoYKGbMdCM/SwCzk8wDgYDVR0PAQH/BAQDAgbA # MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwSgYDVR0gBEMw # QTA1BgwrBgEEAbIxAQIBAwgwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdv # LmNvbS9DUFMwCAYGZ4EMAQQCMEoGA1UdHwRDMEEwP6A9oDuGOWh0dHA6Ly9jcmwu # c2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ0NBUjM2LmNybDB6 # BggrBgEFBQcBAQRuMGwwRQYIKwYBBQUHMAKGOWh0dHA6Ly9jcnQuc2VjdGlnby5j # b20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ0NBUjM2LmNydDAjBggrBgEFBQcw # AYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEMBQADggGBAAKB # PqSGclEh+WWpLj1SiuHlm8xLE0SThI2yLuq+75s11y6SceBchpnKpxWaGtXc8dya # 1Aq3RuW//y3wMThsvT4fSba2AoSWlR67rA4fTYGMIhgzocsids0ct/pHaocLVJSw # nTYxY2pE0hPoZAvRebctbsTqENmZHyOVjOFlwN2R3DRweFeNs4uyZN5LRJ5EnVYl # cTOq3bl1tI5poru9WaQRWQ4eynXp7Pj0Fz4DKr86HYECRJMWiDjeV0QqAcQMFsIj # JtrYTw7mU81qf4FBc4u4swphLeKRNyn9DDrd3HIMJ+CpdhSHEGleeZ5I79YDg3B3 # A/fmVY2GaMik1Vm+FajEMv4/EN2mmHf4zkOuhYZNzVm4NrWJeY4UAriLBOeVYODd # A1GxFr1ycbcUEGlUecc4RCPgYySs4d00NNuicR4a9n7idJlevAJbha/arIYMEuUq # TeRRbWkhJwMKmb9yEvppRudKyu1t6l21sIuIZqcpVH8oLWCxHS0LpDRF9Y4jijCC # BhQwggP8oAMCAQICEHojrtpTaZYPkcg+XPTH4z8wDQYJKoZIhvcNAQEMBQAwVzEL # MAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEuMCwGA1UEAxMl # U2VjdGlnbyBQdWJsaWMgVGltZSBTdGFtcGluZyBSb290IFI0NjAeFw0yMTAzMjIw # MDAwMDBaFw0zNjAzMjEyMzU5NTlaMFUxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9T # ZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMTI1NlY3RpZ28gUHVibGljIFRpbWUgU3Rh # bXBpbmcgQ0EgUjM2MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAzZjY # Q0GrboIr7PYzfiY05ImM0+8iEoBUPu8mr4wOgYPjoiIz5vzf7d5wu8GFK1JWN5hc # iN9rdqOhbdxLcSVwnOTJmUGfAMQm4eXOls3iQwfapEFWuOsYmBKXPNSpwZAFoLGl # 5y1EaGGc5LByM8wjcbSF52/Z42YaJRsPXY545E3QAPN2mxDh0OLozhiGgYT1xtjX # VfEzYBVmfQaI5QL35cTTAjsJAp85R+KAsOfuL9Z7LFnjdcuPkZWjssMETFIueH69 # rxbFOUD64G+rUo7xFIdRAuDNvWBsv0iGDPGaR2nZlY24tz5fISYk1sPY4gir99aX # AGnoo0vX3Okew4MsiyBn5ZnUDMKzUcQrpVavGacrIkmDYu/bcOUR1mVBIZ0X7P4b # Kf38JF7Mp7tY3LFF/h7hvBS2tgTYXlD7TnIMPrxyXCfB5yQq3FFoXRXM3/DvqQ4s # hoVWF/mwwz9xoRku05iphp22fTfjKRIVpm4gFT24JKspEpM8mFa9eTgKWWCvAgMB # AAGjggFcMIIBWDAfBgNVHSMEGDAWgBT2d2rdP/0BE/8WoWyCAi/QCj0UJTAdBgNV # HQ4EFgQUX1jtTDF6omFCjVKAurNhlxmiMpswDgYDVR0PAQH/BAQDAgGGMBIGA1Ud # EwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwgwEQYDVR0gBAowCDAG # BgRVHSAAMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuc2VjdGlnby5jb20v # U2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ1Jvb3RSNDYuY3JsMHwGCCsGAQUFBwEB # BHAwbjBHBggrBgEFBQcwAoY7aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdv # UHVibGljVGltZVN0YW1waW5nUm9vdFI0Ni5wN2MwIwYIKwYBBQUHMAGGF2h0dHA6 # Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAS13sgrQ41WAye # gR0lWP1MLWd0r8diJiH2VVRpxqFGhnZbaF+IQ7JATGceTWOS+kgnMAzGYRzpm8jI # cjlSQ8JtcqymKhgx1s6cFZBSfvfeoyigF8iCGlH+SVSo3HHr98NepjSFJTU5KSRK # K+3nVSWYkSVQgJlgGh3MPcz9IWN4I/n1qfDGzqHCPWZ+/Mb5vVyhgaeqxLPbBIqv # 6cM74Nvyo1xNsllECJJrOvsrJQkajVz4xJwZ8blAdX5umzwFfk7K/0K3fpjgiXpq # NOpXaJ+KSRW0HdE0FSDC7+ZKJJSJx78mn+rwEyT+A3z7Ss0gT5CpTrcmhUwIw9jb # vnYuYRKxFVWjKklW3z83epDVzoWJttxFpujdrNmRwh1YZVIB2guAAjEQoF42H0BA # 7WBCueHVMDyV1e4nM9K4As7PVSNvQ8LI1WRaTuGSFUd9y8F8jw22BZC6mJoB40d7 # SlZIYfaildlgpgbgtu6SDsek2L8qomG57Yp5qTqof0DwJ4Q4HsShvRl/59T4IJBo # vRwmqWafH0cIPEX7cEttS5+tXrgRtMjjTOp6A9l0D6xcKZtxnLqiTH9KPCy6xZEi # 0UDcMTww5Fl4VvoGbMG2oonuX3f1tsoHLaO/Fwkj3xVr3lDkmeUqivebQTvGkx5h # GuJaSVQ+x60xJ/Y29RBr8Tm9XJ59AjCCBoIwggRqoAMCAQICEDbCsL18Gzrno7Pd # NsvJdWgwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpO # ZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVT # RVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmlj # YXRpb24gQXV0aG9yaXR5MB4XDTIxMDMyMjAwMDAwMFoXDTM4MDExODIzNTk1OVow # VzELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEuMCwGA1UE # AxMlU2VjdGlnbyBQdWJsaWMgVGltZSBTdGFtcGluZyBSb290IFI0NjCCAiIwDQYJ # KoZIhvcNAQEBBQADggIPADCCAgoCggIBAIid2LlFZ50d3ei5JoGaVFTAfEkFm8xa # FQ/ZlBBEtEFAgXcUmanU5HYsyAhTXiDQkiUvpVdYqZ1uYoZEMgtHES1l1Cc6HaqZ # zEbOOp6YiTx63ywTon434aXVydmhx7Dx4IBrAou7hNGsKioIBPy5GMN7KmgYmuu4 # f92sKKjbxqohUSfjk1mJlAjthgF7Hjx4vvyVDQGsd5KarLW5d73E3ThobSkob2SL # 48LpUR/O627pDchxll+bTSv1gASn/hp6IuHJorEu6EopoB1CNFp/+HpTXeNARXUm # dRMKbnXWflq+/g36NJXB35ZvxQw6zid61qmrlD/IbKJA6COw/8lFSPQwBP1ityZd # wuCysCKZ9ZjczMqbUcLFyq6KdOpuzVDR3ZUwxDKL1wCAxgL2Mpz7eZbrb/JWXiOc # NzDpQsmwGQ6Stw8tTCqPumhLRPb7YkzM8/6NnWH3T9ClmcGSF22LEyJYNWCHrQqY # ubNeKolzqUbCqhSqmr/UdUeb49zYHr7ALL8bAJyPDmubNqMtuaobKASBqP84uhqc # RY/pjnYd+V5/dcu9ieERjiRKKsxCG1t6tG9oj7liwPddXEcYGOUiWLm742st50jG # wTzxbMpepmOP1mLnJskvZaN5e45NuzAHteORlsSuDt5t4BBRCJL+5EZnnw0ezntk # 9R8QJyAkL6/bAgMBAAGjggEWMIIBEjAfBgNVHSMEGDAWgBRTeb9aqitKz1SA4dib # wJ3ysgNmyzAdBgNVHQ4EFgQU9ndq3T/9ARP/FqFsggIv0Ao9FCUwDgYDVR0PAQH/ # BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEwYDVR0lBAwwCgYIKwYBBQUHAwgwEQYD # VR0gBAowCDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNl # cnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNy # bDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0 # cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAA6+ZUHtaES45aHF1BGH5Lc7JYzr # ftrIF5Ht2PFDxKKFOct/awAEWgHQMVHol9ZLSyd/pYMbaC0IZ+XBW9xhdkkmUV/K # bUOiL7g98M/yzRyqUOZ1/IY7Ay0YbMniIibJrPcgFp73WDnRDKtVutShPSZQZAdt # FwXnuiWl8eFARK3PmLqEm9UsVX+55DbVIz33Mbhba0HUTEYv3yJ1fwKGxPBsP/Mg # TECimh7eXomvMm0/GPxX2uhwCcs/YLxDnBdVVlxvDjHjO1cuwbOpkiJGHmLXXVNb # sdXUC2xBrq9fLrfe8IBsA4hopwsCj8hTuwKXJlSTrZcPRVSccP5i9U28gZ7OMzoJ # GlxZ5384OKm0r568Mo9TYrqzKeKZgFo0fj2/0iHbj55hc20jfxvK3mQi+H7xpbzx # ZOFGm/yVQkpo+ffv5gdhp+hv1GDsvJOtJinJmgGbBFZIThbqI+MHvAmMmkfb3fTx # mSkop2mSJL1Y2x/955S29Gu0gSJIkc3z30vU/iXrMpWx2tS7UVfVP+5tKuzGtgkP # 7d/doqDrLF1u6Ci3TpjAZdeLLlRQZm867eVeXED58LXd1Dk6UvaAhvmWYXoiLz4J # A5gPBcz7J311uahxCweNxE+xxxR3kT0WKzASo5G/PyDez6NHdIUKBeE3jDPs2ACc # 6CkJ1Sji4PKWVT0/MYIEkjCCBI4CAQEwajBVMQswCQYDVQQGEwJHQjEYMBYGA1UE # ChMPU2VjdGlnbyBMaW1pdGVkMSwwKgYDVQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1l # IFN0YW1waW5nIENBIFIzNgIRAKQpO24e3denNAiHrXpOtyQwDQYJYIZIAWUDBAIC # BQCgggH5MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUx # DxcNMjYwMTE5MTgxOTU0WjA/BgkqhkiG9w0BCQQxMgQw+9elcxDD+7wpYK2tWP4m # 9KttURWAykkszhn4/ONJ/oZi5nq26nGGB3bS1ssq1ZFbMIIBegYLKoZIhvcNAQkQ # AgwxggFpMIIBZTCCAWEwFgQUOMkUgRBEtNxmPpPUdEuBQYaptbEwgYcEFMauVOR4 # hvF8PVUSSIxpw0p6+cLdMG8wW6RZMFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9T # ZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIFRpbWUgU3Rh # bXBpbmcgUm9vdCBSNDYCEHojrtpTaZYPkcg+XPTH4z8wgbwEFIU9Yy2TgoJhfNCQ # NcSR3pLBQtrHMIGjMIGOpIGLMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3 # IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VS # VFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0 # aW9uIEF1dGhvcml0eQIQNsKwvXwbOuejs902y8l1aDANBgkqhkiG9w0BAQEFAASC # AgAOBfK78QReg5c0x9N+xGyV8yYiugSs2/6UUqUmnz4zme0TzyG31EcHofjfJb3S # hGEHNpomGXKniyzsjIEm9SVhS5CBymdkn4lEWCFfIDUou+tj2VMnnzL7kLFa1hPM # xfyTov4RPsp+eH0awGTw2ObSohSLzguEU2VPxNFS8fTga1PIasEdrgde03lF5YYK # XZBTS3fAnp/yGRE3u7600/wHqNpQACI+m0j2GU3BgdyhrWezbfP/zWcQyjSvgNYl # eVZqlBCeMYlAk75/J3MvI/XLZNDCSLKUN+H7wuSBjzpuqvn1X3TxdBTj71ZbqfCy # RZiZy3BUDQi1WVrA0D4QM8M5fWQ1f6bb4RTdSk6RrURckQYE2AnLYf3K1X6teaFe # be0BEgYmI/iOZW9BlBCW55oE+RL2i7K17zcX/9H6cg3Lltiuqp0H/ALODyfGqc7i # VdO5rBtoxlJjrGxc2Ca6FNX/VWJhnwfULlIJUJDP/RRuZELmIcGP01f77qTYQmH+ # CS8U0em1ubCcBAGKy6qu+WjGf14W8tAJK+jxiSEa8/7UzGeM5eGwyFNKSsnSNHO9 # dWve2XSA5WLW1z98/JhgT9lzRya2DBqJWYwS7WMUrz1gNocsN0Xre2I78Ye3mccm # g1uhHO/5xVIn/lefi9nd0qMARtJ1tJtQVnlLpa8jDNeWIg== # SIG # End signature block |