public/cbb/Get-MBSBackupPlan.ps1
function Get-MBSBackupPlan { <# .SYNOPSIS Get backup plans from MBS backup agent. .EXAMPLE PS C:\> Get-MBSBackupPlan -StorageType All -PlanFormat All -PlanType All Lists all backup plans .EXAMPLE PS C:\> Get-MBSBackupPlan -StorageType Local -PlanFormat All -PlanType All Lists only backup plans with a local destination. .EXAMPLE PS C:\> Get-MBSBackupPlan -StorageType Cloud -PlanFormat All -PlanType All Lists only backup plans with a cloud destination. .EXAMPLE PS C:\> Get-MBSBackupPlan -StorageType All -PlanFormat CBF -PlanType All Lists all CBF (Legacy) backup plans. .EXAMPLE PS C:\> Get-MBSBackupPlan -StorageType All -PlanFormat NBF -PlanType All Lists all NBF backup plans. .EXAMPLE PS C:\> Get-MBSBackupPlan -StorageType All -PlanFormat All -PlanType File-Level Lists all File-level backup plans. .EXAMPLE PS C:\> Get-MBSBackupPlan -StorageType All -PlanFormat All -PlanType Image-Based Lists all Image-Based backup plans. .EXAMPLE PS C:\> Get-MBSBackupPlan -StorageType Local -PlanFormat CBF -PlanType Image-Based Lists CBF (Legacy) Image-Based backup plans with a local destination. .EXAMPLE PS C:\> Get-MBSBackupPlan -StorageType All -PlanFormat All -PlanType All -OutputType Full Get extended parameters of all backup plans. .INPUTS None .OUTPUTS System.Management.Automation.PSCustomObject .NOTES Author: MSP360 Onboarding Team .LINK https://mspbackups.com/AP/Help/powershell/cmdlets/backup-agent/get-mbsbackupplan #> [CmdletBinding()] param ( # [Parameter(Mandatory=$false, HelpMessage="Backup destination storage type")] [ValidateSet("All", "Local", "Cloud", "Hybrid")] [string] $StorageType = "All", # [Parameter(Mandatory=$false, HelpMessage="Backup plan format")] [ValidateSet("All", "CBF", "Legacy", "NBF")] [string] $PlanFormat = "All", # [Parameter(Mandatory=$false, HelpMessage="Backup plan type")] [ValidateSet("All", "File-Level", "Image-Based", "MSSQL","MSExchange","VMware","Hyper-V")] [string] $PlanType = "All", # [Parameter(Mandatory=$false, HelpMessage="Output type")] [ValidateSet("Short", "Full", "Raw")] [string] $OutputType = "Short" ) begin { if (-not($CBB = Get-MBSAgent)) { Break } } process { function Compare-StorageTypes { param ( $Account, [string]$StorageType ) $result = $false switch -exact ($StorageType) { "All" {$result = $true} "Cloud" { if($Account.SGCloudTypeValue -ne "FileSystemConnection" -and $Account.SGCloudTypeValue -ne "PhysicalFile" -and $BackupPlan.BasePlan.HybridID -eq "00000000-0000-0000-0000-000000000000"){ $result = $true }else { $result = $false } } "Local" { if($Account.Type -eq "FileSystemConnection" -or $Account.SGCloudTypeValue -eq "PhysicalFile"){ $result = $true }else { $result = $false } } "Hybrid" { if ($BackupPlan.BasePlan.HybridID -ne "00000000-0000-0000-0000-000000000000") { $result = $true }else { $result = $false } } Default {} } return $result } function Convert-Output { param ( $InputArray ) $OutputResult = $null switch ($OutputType) { "Short" { $OutputResult = $InputArray | Select-Object ID, Name, Type, Bucket, ConnectionID, UseEncryption, UseCompression, Items, ExcludedItems, DiskInfo, Schedule, ForceFullSchedule } "Full" { $OutputResult = $InputArray | Select-Object -Property * -ExcludeProperty xsd, xsi, Tag } "Raw" { $OutputResult = $InputArray | Select-Object * } Default {Write-Error -message "Incorrect OutputType parameter"} } return $OutputResult } function Convert-NBFFileLevelOutput { param ( $BackupPlanNBFConverted ) $NBFFileLevelOutputResult = New-Object -TypeName MBS.Agent.Plan.NBFFileLevelBackupPlan -Property @{ Name = $BackupPlanNBFConverted.Name ID = $BackupPlanNBFConverted.ID StorageAccount = Get-MBSStorageAccount -ID $BackupPlanNBFConverted.ConnectionID BackupPlanCommonOption = New-Object -TypeName MBS.Agent.Plan.NBFBackupPlanCommonOption -Property @{ SyncRepositoryBeforeRun = $BackupPlanNBFConverted.SyncBeforeRun UseServerSideEncryption = $BackupPlanNBFConverted.UseServerSideEncryption EncryptionAlgorithm = ($BackupPlanNBFConverted.EncryptionAlgorithm+$BackupPlanNBFConverted.EncryptionKeySize) EncryptionPassword = $(if($BackupPlanNBFConverted.UseEncryption){ConvertTo-SecureString -string "!<encrypted_string>!" -AsPlainText -Force}else{$null}) UseCompression = $BackupPlanNBFConverted.UseCompression StorageClass = ([MBS.Agent.Plan.StorageClassCBB]$BackupPlanNBFConverted.StorageClass).value__ FullConsistencyCheck = $BackupPlanNBFConverted.UseFullConsistencyCheck StopIfPlanRunsFor = $(if($BackupPlanNBFConverted.Schedule.StopAfterTicks -eq "9223372036854775807"){[timespan]"00:00:00"}else{[timespan]$BackupPlanNBFConverted.Schedule.StopAfterTicks}) RunMissedPlanImmediately = $BackupPlanNBFConverted.ForceMissedSchedule PreActionCommand = $(if($BackupPlanNBFConverted.Actions.Pre.Enabled){$BackupPlanNBFConverted.Actions.Pre.CommandLine + " " + $BackupPlanNBFConverted.Actions.Pre.Arguments}) PreActionContinueAnyway = $(if($BackupPlanNBFConverted.Actions.Pre.Enabled){-not $BackupPlanNBFConverted.Actions.Pre.TerminateOnFailure}) PostActionCommand = $(if($BackupPlanNBFConverted.Actions.Post.Enabled){$BackupPlanNBFConverted.Actions.Post.CommandLine + " " + $BackupPlanNBFConverted.Actions.Post.Arguments}) PostActionRunAnyway = $(if($BackupPlanNBFConverted.Actions.Post.Enabled){$BackupPlanNBFConverted.Actions.Post.RunOnBackupFailure}) ResultEmailNotification = $(if($BackupPlanNBFConverted.Notification.SendNotification -and $BackupPlanNBFConverted.Notification.OnlyOnFailure){ [MBS.Agent.Plan.Notification]"errorOnly" }elseif ($BackupPlanNBFConverted.Notification.SendNotification -and -not $BackupPlanNBFConverted.Notification.OnlyOnFailure) { [MBS.Agent.Plan.Notification]"on" }elseif (-not $BackupPlanNBFConverted.Notification.SendNotification) { [MBS.Agent.Plan.Notification]"off" }) AddEventToWindowsLog = $(if($BackupPlanNBFConverted.WindowsEventLogNotification.SendNotification -and $BackupPlanNBFConverted.WindowsEventLogNotification.OnlyOnFailure){ [MBS.Agent.Plan.Notification]"errorOnly" }elseif ($BackupPlanNBFConverted.WindowsEventLogNotification.SendNotification -and -not $BackupPlanNBFConverted.WindowsEventLogNotification.OnlyOnFailure) { [MBS.Agent.Plan.Notification]"on" }elseif (-not $BackupPlanNBFConverted.WindowsEventLogNotification.SendNotification) { [MBS.Agent.Plan.Notification]"off" }) KeepVersionPeriod = $(if($BackupPlanNBFConverted.SerializationSupportRetentionTime -eq "10675199.02:48:05.4775807") { $null }else{ [timespan]$BackupPlanNBFConverted.SerializationSupportRetentionTime }) GFSKeepWeekly = $(if($BackupPlanNBFConverted.GFSPolicySettings.IsEnabled -and $BackupPlanNBFConverted.GFSPolicySettings.Weekly.IsEnabled){ $BackupPlanNBFConverted.GFSPolicySettings.Weekly.StorePeriod }else { $null }) GFSKeepMonthly = $(if($BackupPlanNBFConverted.GFSPolicySettings.IsEnabled -and $BackupPlanNBFConverted.GFSPolicySettings.Monthly.IsEnabled){ $BackupPlanNBFConverted.GFSPolicySettings.Monthly.StorePeriod }else { $null }) GFSKeepYearly = $(if($BackupPlanNBFConverted.GFSPolicySettings.IsEnabled -and $BackupPlanNBFConverted.GFSPolicySettings.Yearly.IsEnabled){ $BackupPlanNBFConverted.GFSPolicySettings.Yearly.StorePeriod }else { $null }) GFSMonthOfTheYear = $(if($BackupPlanNBFConverted.GFSPolicySettings.IsEnabled -and $BackupPlanNBFConverted.GFSPolicySettings.Yearly.IsEnabled){ $BackupPlanNBFConverted.GFSPolicySettings.Yearly.TakeBackupFromMonth }else { 0 }) } Schedule = $(if($BackupPlanNBFConverted.Schedule.Enabled){ New-Object -TypeName MBS.Agent.Plan.NBFIncrementalSchedule -Property @{ Frequency = $(if (-not (Compare-Object -ReferenceObject $BackupPlanNBFConverted.Schedule.WeekDays.DayOfWeek -DifferenceObject @("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"))) { "Daily" }else { $BackupPlanNBFConverted.Schedule.RecurType }) At = $(if (-not $BackupPlanNBFConverted.Schedule.DailyRecurrence) { [datetime]"$($BackupPlanNBFConverted.Schedule.Hour):$($BackupPlanNBFConverted.Schedule.Minutes)" }else{ [datetime]"1/1/0001 0:00:00" }) DayOfMonth = $(if ($BackupPlanNBFConverted.Schedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.Schedule.DayOfMonth }else{ $null }) DayOfWeek = $(if ($BackupPlanNBFConverted.Schedule.RecurType -eq "Weekly" -and (Compare-Object -ReferenceObject $BackupPlanNBFConverted.Schedule.WeekDays.DayOfWeek -DifferenceObject @("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"))) { $BackupPlanNBFConverted.Schedule.WeekDays.DayOfWeek }else { $null }) WeekNumber = $(if ($BackupPlanNBFConverted.Schedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.Schedule.WeekNumber }else { $null }) OccursFrom = $(if ($BackupPlanNBFConverted.Schedule.DailyRecurrence) { [timespan]"$($BackupPlanNBFConverted.Schedule.DailyFromHour):$($BackupPlanNBFConverted.Schedule.DailyFromMinutes)" }else{ [timespan]"00:00:00" }) OccursTo = $(if ($BackupPlanNBFConverted.Schedule.DailyRecurrence) { [timespan]"$($BackupPlanNBFConverted.Schedule.DailyTillHour):$($BackupPlanNBFConverted.Schedule.DailyTillMinutes)" }else{ [timespan]"00:00:00" }) OccursEvery = $(if ($BackupPlanNBFConverted.Schedule.DailyRecurrence) { New-TimeSpan -Minutes $BackupPlanNBFConverted.Schedule.DailyRecurrencePeriod }else{ [timespan]"00:00:00" }) } }else { $null }) ForceFullSchedule = $(if($BackupPlanNBFConverted.ForceFullSchedule.Enabled){ New-Object -TypeName MBS.Agent.Plan.NBFFullSchedule -Property @{ Frequency = $(if (-not (Compare-Object -ReferenceObject $BackupPlanNBFConverted.ForceFullSchedule.WeekDays.DayOfWeek -DifferenceObject @("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"))) { "Daily" }else { $BackupPlanNBFConverted.ForceFullSchedule.RecurType }) DayOfMonth = $(if ($BackupPlanNBFConverted.ForceFullSchedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.ForceFullSchedule.DayOfMonth }else{ $null }) DayOfWeek = $(if ($BackupPlanNBFConverted.ForceFullSchedule.RecurType -eq "Weekly" -and (Compare-Object -ReferenceObject $BackupPlanNBFConverted.ForceFullSchedule.WeekDays.DayOfWeek -DifferenceObject @("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"))) { $BackupPlanNBFConverted.ForceFullSchedule.WeekDays.DayOfWeek }elseif($BackupPlanNBFConverted.ForceFullSchedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.ForceFullSchedule.DayOfWeek }else{ $null }) WeekNumber = $(if ($BackupPlanNBFConverted.ForceFullSchedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.ForceFullSchedule.WeekNumber }else { $null }) } }else { $null }) BackupNTFSPermissions = $BackupPlanNBFConverted.BackupNTFSPermissions FastNTFSScan = $BackupPlanNBFConverted.UseFastNtfsScan ForceUsingVSS = $BackupPlanNBFConverted.AlwaysUseVSS UseShareReadWriteModeOnError = $BackupPlanNBFConverted.UseShareReadWriteModeOnError BackupEmptyFolders = $BackupPlanNBFConverted.BackupEmptyFolders BackupOnlyAfter = [datetime]$BackupPlanNBFConverted.BackupOnlyAfterUTC ExcludeSystemHiddenFiles = -not $BackupPlanNBFConverted.BackupFilter.IncludeSystemAndHidden SkipFolder = $BackupPlanNBFConverted.ExcludeFodlerList.string IncludeFilesMask = $(if ($BackupPlanNBFConverted.BackupFilter.FilterType -eq "UseIncludeMask") { $BackupPlanNBFConverted.BackupFilter.Filters.string }else { $null }) ExcludeFilesMask = $(if ($BackupPlanNBFConverted.BackupFilter.FilterType -eq "UseExcludeMask") { $BackupPlanNBFConverted.BackupFilter.Filters.string }else { $null }) IgnoreErrorPathNotFound = $BackupPlanNBFConverted.UseIgnoreErrorsOnPathNotFound BackupItem = $BackupPlanNBFConverted.Items.PlanItem.Path ExcludeItem = $BackupPlanNBFConverted.ExcludedItems.PlanItem.Path #| ForEach-Object -Begin {$BackupFileArray = @()} -Process { # if(([IO.FileInfo]$_).Extension -ne ""){ # $BackupFileArray += $_ # } #} -End {if($BackupFileArray){$BackupFileArray}else{$null}}) #BackupDirectory = $($BackupPlanNBFConverted.Items.PlanItem.Path | ForEach-Object -Begin {$BackupDirectoryArray = @()} -Process { # if(([IO.FileInfo]$_).Extension -eq ""){ # $BackupDirectoryArray += $_ # } #} -End {if($BackupDirectoryArray){$BackupDirectoryArray}else{$null}}) GenerateDetailedReport = $BackupPlanNBFConverted.Notification.GenerateReport } return $NBFFileLevelOutputResult } function Convert-NBFImageBasedOutput { param ( $BackupPlanNBFConverted ) $NBFImageBasedOutputResult = New-Object -TypeName MBS.Agent.Plan.NBFImageBasedBackupPlanCBB -Property @{ Name = $BackupPlanNBFConverted.Name ID = $BackupPlanNBFConverted.ID StorageAccount = Get-MBSStorageAccount -ID $BackupPlanNBFConverted.ConnectionID BackupPlanCommonOption = New-Object -TypeName MBS.Agent.Plan.NBFBackupPlanCommonOption -Property @{ SyncRepositoryBeforeRun = $BackupPlanNBFConverted.SyncBeforeRun UseServerSideEncryption = $BackupPlanNBFConverted.UseServerSideEncryption EncryptionAlgorithm = ($BackupPlanNBFConverted.EncryptionAlgorithm+$BackupPlanNBFConverted.EncryptionKeySize) EncryptionPassword = $(if($BackupPlanNBFConverted.UseEncryption){ConvertTo-SecureString -string "!<encrypted_string>!" -AsPlainText -Force}else{$null}) UseCompression = $BackupPlanNBFConverted.UseCompression StorageClass = ([MBS.Agent.Plan.StorageClassCBB]$BackupPlanNBFConverted.StorageClass).value__ FullConsistencyCheck = $BackupPlanNBFConverted.UseFullConsistencyCheck StopIfPlanRunsFor = $(if($BackupPlanNBFConverted.Schedule.StopAfterTicks -eq "9223372036854775807"){[timespan]"00:00:00"}else{[timespan]$BackupPlanNBFConverted.Schedule.StopAfterTicks}) RunMissedPlanImmediately = $BackupPlanNBFConverted.ForceMissedSchedule PreActionCommand = $(if($BackupPlanNBFConverted.Actions.Pre.Enabled){$BackupPlanNBFConverted.Actions.Pre.CommandLine + " " + $BackupPlanNBFConverted.Actions.Pre.Arguments}) PreActionContinueAnyway = $(if($BackupPlanNBFConverted.Actions.Pre.Enabled){-not $BackupPlanNBFConverted.Actions.Pre.TerminateOnFailure}) PostActionCommand = $(if($BackupPlanNBFConverted.Actions.Post.Enabled){$BackupPlanNBFConverted.Actions.Post.CommandLine + " " + $BackupPlanNBFConverted.Actions.Post.Arguments}) PostActionRunAnyway = $(if($BackupPlanNBFConverted.Actions.Post.Enabled){$BackupPlanNBFConverted.Actions.Post.RunOnBackupFailure}) ResultEmailNotification = $(if($BackupPlanNBFConverted.Notification.SendNotification -and $BackupPlanNBFConverted.Notification.OnlyOnFailure){ [MBS.Agent.Plan.Notification]"errorOnly" }elseif ($BackupPlanNBFConverted.Notification.SendNotification -and -not $BackupPlanNBFConverted.Notification.OnlyOnFailure) { [MBS.Agent.Plan.Notification]"on" }elseif (-not $BackupPlanNBFConverted.Notification.SendNotification) { [MBS.Agent.Plan.Notification]"off" }) AddEventToWindowsLog = $(if($BackupPlanNBFConverted.WindowsEventLogNotification.SendNotification -and $BackupPlanNBFConverted.WindowsEventLogNotification.OnlyOnFailure){ [MBS.Agent.Plan.Notification]"errorOnly" }elseif ($BackupPlanNBFConverted.WindowsEventLogNotification.SendNotification -and -not $BackupPlanNBFConverted.WindowsEventLogNotification.OnlyOnFailure) { [MBS.Agent.Plan.Notification]"on" }elseif (-not $BackupPlanNBFConverted.WindowsEventLogNotification.SendNotification) { [MBS.Agent.Plan.Notification]"off" }) KeepVersionPeriod = $(if($BackupPlanNBFConverted.SerializationSupportRetentionTime -eq "10675199.02:48:05.4775807") { $null }else{ [timespan]$BackupPlanNBFConverted.SerializationSupportRetentionTime }) GFSKeepWeekly = $(if($BackupPlanNBFConverted.GFSPolicySettings.IsEnabled -and $BackupPlanNBFConverted.GFSPolicySettings.Weekly.IsEnabled){ $BackupPlanNBFConverted.GFSPolicySettings.Weekly.StorePeriod }else { $null }) GFSKeepMonthly = $(if($BackupPlanNBFConverted.GFSPolicySettings.IsEnabled -and $BackupPlanNBFConverted.GFSPolicySettings.Monthly.IsEnabled){ $BackupPlanNBFConverted.GFSPolicySettings.Monthly.StorePeriod }else { $null }) GFSKeepYearly = $(if($BackupPlanNBFConverted.GFSPolicySettings.IsEnabled -and $BackupPlanNBFConverted.GFSPolicySettings.Yearly.IsEnabled){ $BackupPlanNBFConverted.GFSPolicySettings.Yearly.StorePeriod }else { $null }) GFSMonthOfTheYear = $(if($BackupPlanNBFConverted.GFSPolicySettings.IsEnabled -and $BackupPlanNBFConverted.GFSPolicySettings.Yearly.IsEnabled){ $BackupPlanNBFConverted.GFSPolicySettings.Yearly.TakeBackupFromMonth }else { 0 }) } Schedule = $(if($BackupPlanNBFConverted.Schedule.Enabled){ New-Object -TypeName MBS.Agent.Plan.NBFIncrementalSchedule -Property @{ Frequency = $(if (-not (Compare-Object -ReferenceObject $BackupPlanNBFConverted.Schedule.WeekDays.DayOfWeek -DifferenceObject @("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"))) { "Daily" }else { $BackupPlanNBFConverted.Schedule.RecurType }) At = $(if (-not $BackupPlanNBFConverted.Schedule.DailyRecurrence) { [datetime]"$($BackupPlanNBFConverted.Schedule.Hour):$($BackupPlanNBFConverted.Schedule.Minutes)" }else{ [datetime]"1/1/0001 0:00:00" }) DayOfMonth = $(if ($BackupPlanNBFConverted.Schedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.Schedule.DayOfMonth }else{ $null }) DayOfWeek = $(if ($BackupPlanNBFConverted.Schedule.RecurType -eq "Weekly" -and (Compare-Object -ReferenceObject $BackupPlanNBFConverted.Schedule.WeekDays.DayOfWeek -DifferenceObject @("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"))) { $BackupPlanNBFConverted.Schedule.WeekDays.DayOfWeek }else { $null }) WeekNumber = $(if ($BackupPlanNBFConverted.Schedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.Schedule.WeekNumber }else { $null }) OccursFrom = $(if ($BackupPlanNBFConverted.Schedule.DailyRecurrence) { [timespan]"$($BackupPlanNBFConverted.Schedule.DailyFromHour):$($BackupPlanNBFConverted.Schedule.DailyFromMinutes)" }else{ [timespan]"00:00:00" }) OccursTo = $(if ($BackupPlanNBFConverted.Schedule.DailyRecurrence) { [timespan]"$($BackupPlanNBFConverted.Schedule.DailyTillHour):$($BackupPlanNBFConverted.Schedule.DailyTillMinutes)" }else{ [timespan]"00:00:00" }) OccursEvery = $(if ($BackupPlanNBFConverted.Schedule.DailyRecurrence) { New-TimeSpan -Minutes $BackupPlanNBFConverted.Schedule.DailyRecurrencePeriod }else{ [timespan]"00:00:00" }) } }else { $null }) ForceFullSchedule = $(if($BackupPlanNBFConverted.ForceFullSchedule.Enabled){ New-Object -TypeName MBS.Agent.Plan.NBFFullSchedule -Property @{ Frequency = $(if (-not (Compare-Object -ReferenceObject $BackupPlanNBFConverted.ForceFullSchedule.WeekDays.DayOfWeek -DifferenceObject @("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"))) { "Daily" }else { $BackupPlanNBFConverted.ForceFullSchedule.RecurType }) DayOfMonth = $(if ($BackupPlanNBFConverted.ForceFullSchedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.ForceFullSchedule.DayOfMonth }else{ $null }) DayOfWeek = $(if ($BackupPlanNBFConverted.ForceFullSchedule.RecurType -eq "Weekly" -and (Compare-Object -ReferenceObject $BackupPlanNBFConverted.ForceFullSchedule.WeekDays.DayOfWeek -DifferenceObject @("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"))) { $BackupPlanNBFConverted.ForceFullSchedule.WeekDays.DayOfWeek }elseif($BackupPlanNBFConverted.ForceFullSchedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.ForceFullSchedule.DayOfWeek }else{ $null }) WeekNumber = $(if ($BackupPlanNBFConverted.ForceFullSchedule.RecurType -eq "Monthly") { $BackupPlanNBFConverted.ForceFullSchedule.WeekNumber }else { $null }) } }else { $null }) BackupVolumes = $(switch ($BackupPlanNBFConverted.BackupVolumes) { "AllDrives" {[MBS.Agent.Plan.BackupVolumeType]"AllVolumes"} "FixedOnly" {[MBS.Agent.Plan.BackupVolumeType]"FixedVolumes"} "SystemRequired" { [MBS.Agent.Plan.BackupVolumeType]"SystemRequired" } "SelectedOnly" { [MBS.Agent.Plan.BackupVolumeType]"SelectedVolumes" } Default { } }) Volumes = $(if ($BackupPlanNBFConverted.BackupVolumes -eq "SelectedOnly") { $BackupPlanNBFConverted.DiskInfo.DiskInfoCommunication.Volumes.VolumeInfoCommunication | Where-Object Enabled -eq $true | ForEach-Object -Begin {$BackupVolumeArray = [System.Collections.Generic.List[MBS.Agent.IBBVolumeCBB]]::new()} -Process{ $BackupVolumeArray += New-Object -TypeName MBS.Agent.IBBVolumeCBB -Property @{ MountPoints = $_.MountPoints.string Supported = $_.Supported RequiredBySystem = $_.RequiredBySystem DriveType = $_.DriveType FileSystemType = $_.FileSystemType WindowsVolumeIdentity = $_.WindowsVolumeIdentity Length = $_.Length UsedSpace = $_.UsedSpace Label = $_.Label IsBoot = $_.IsBoot IsActive = $_.BiosIsActive IsBitLocker = $_.IsBitLocker BackupOptions = New-Object -TypeName MBS.Agent.IBBVolumeBackupOptionsCBB -Property @{ UseVss = $_.BackupOptions.UseVss ExcludeRules = $(if ($null -ne $_.BackupOptions.ExcludeRules.FileExcludeRule) { $_.BackupOptions.ExcludeRules.FileExcludeRule | ForEach-Object -Begin {$ExcludeRulesArray = [System.Collections.Generic.List[MBS.Agent.IBBVolumeBackupOptionsExcludeRulesCBB]]::new()} -Process{ $ExcludeRulesArray += New-Object -TypeName MBS.Agent.IBBVolumeBackupOptionsExcludeRulesCBB -Property @{ Folder = $_.Folder Mask = $_.Mask Recursive = $_.Recursive DeleteFolder = $_.DeleteFolder } } -End {if($ExcludeRulesArray){$ExcludeRulesArray}else{}} }else { $null }) KeepBitLocker = $_.BackupOptions.KeepBitLocker } } } -End {if($BackupVolumeArray){$BackupVolumeArray}else{}} }else { $null }) DisableVSS = $BackupPlanNBFConverted.DisableVSS IgnoreBadSectors = $BackupPlanNBFConverted.IgnoreBadSectors UseSystemVSS = $(if ($BackupPlanNBFConverted.VSSProviderID -eq "b5946137-7b9f-4925-af80-51abd60b20d5") { $true }else { $false }) PrefetchBlockCount = $BackupPlanNBFConverted.PrefetchBlockCount BlockSize = $BackupPlanNBFConverted.BlockSize / 1024 RestoreVerificationMode = $(switch ($BackupPlanNBFConverted.RunRestoreVerificationOn) { "None" { [MBS.Agent.Plan.RestoreVerificationMode]"DoNotRun" } "OnFull" { [MBS.Agent.Plan.RestoreVerificationMode]"RunForFull" } "OnDiff" { [MBS.Agent.Plan.RestoreVerificationMode]"RunForIncremental" } "OnAll" { [MBS.Agent.Plan.RestoreVerificationMode]"RunForFullAndIncremental" } Default {} }) } return $NBFImageBasedOutputResult } Write-Verbose -Message "$($PSCmdlet.MyInvocation.MyCommand.Name): Arguments: -StorageType $StorageType -PlanFormat $PlanFormat -PlanType $PlanType" $BackupPlansCBFArray = @() $BackupPlansNBFArray = @() $BackupPlansNBFClassArray = @() $BackupPlansReturnArray = @() foreach ($_ in (Get-ChildItem ("$($CBB.CBBProgramData)\*.cbb") -ErrorAction SilentlyContinue)){ if (Get-Content $_.FullName){ $BackupPlan = [xml](Get-Content ($_.FullName)) switch ($PlanType) { "All" { if ($BackupPlan.BasePlan.type -notlike "*Restore*" -and $BackupPlan.BasePlan.type -ne "ConsistencyCheckPlan"){ if(Compare-StorageTypes -Account (Get-MBSStorageAccount -ID $BackupPlan.BasePlan.ConnectionID) -StorageType $StorageType){ if ($BackupPlan.BasePlan.IsArchive -eq "true") { if ($BackupPlan.BasePlan.type -eq "Plan"){ $BackupPlanNBFConvertedObject = Convert-XMLtoPSObject $BackupPlan.BasePlan $BackupPlansNBFClassArray += Convert-NBFFileLevelOutput $BackupPlanNBFConvertedObject } elseif ($BackupPlan.BasePlan.type -eq "BackupDiskImagePlan") { $BackupPlanNBFConvertedOnject = Convert-XMLtoPSObject $BackupPlan.BasePlan $BackupPlansNBFClassArray += Convert-NBFImageBasedOutput $BackupPlanNBFConvertedOnject } else { $BackupPlansNBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } } else { $BackupPlansCBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } } } } "File-Level" { if ($BackupPlan.BasePlan.type -eq "Plan"){ if(Compare-StorageTypes -Account (Get-MBSStorageAccount -ID $BackupPlan.BasePlan.ConnectionID) -StorageType $StorageType){ if ($BackupPlan.BasePlan.IsArchive -eq "true") { $BackupPlanNBFConvertedObject = Convert-XMLtoPSObject $BackupPlan.BasePlan $BackupPlansNBFClassArray += Convert-NBFFileLevelOutput $BackupPlanNBFConvertedObject }else{ $BackupPlansCBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } } } } "Image-Based" { if ($BackupPlan.BasePlan.type -eq "BackupDiskImagePlan") { if(Compare-StorageTypes -Account (Get-MBSStorageAccount -ID $BackupPlan.BasePlan.ConnectionID) -StorageType $StorageType){ if ($BackupPlan.BasePlan.IsArchive -eq "true") { $BackupPlanNBFConvertedOnject = Convert-XMLtoPSObject $BackupPlan.BasePlan $BackupPlansNBFClassArray += Convert-NBFImageBasedOutput $BackupPlanNBFConvertedOnject }else{ $BackupPlansCBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } } } } "MSSQL" { if ($BackupPlan.BasePlan.type -eq "BackupDatabasePlan") { if(Compare-StorageTypes -Account (Get-MBSStorageAccount -ID $BackupPlan.BasePlan.ConnectionID) -StorageType $StorageType){ if ($BackupPlan.BasePlan.IsArchive -eq "true") { $BackupPlansNBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } else { $BackupPlansCBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } } } } "MSExchange" { if ($BackupPlan.BasePlan.type -eq "BackupExchangePlan") { if(Compare-StorageTypes -Account (Get-MBSStorageAccount -ID $BackupPlan.BasePlan.ConnectionID) -StorageType $StorageType){ if ($BackupPlan.BasePlan.IsArchive -eq "true") { $BackupPlansNBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } else { $BackupPlansCBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } } } } "VMware" { if ($BackupPlan.BasePlan.type -eq "BackupVirtualMachinesESXiPlan") { if(Compare-StorageTypes -Account (Get-MBSStorageAccount -ID $BackupPlan.BasePlan.ConnectionID) -StorageType $StorageType){ if ($BackupPlan.BasePlan.IsArchive -eq "true") { $BackupPlansNBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } else { $BackupPlansCBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } } } } "Hyper-V" { if ($BackupPlan.BasePlan.type -eq "BackupVirtualMachinesHyperVPlan") { if(Compare-StorageTypes -Account (Get-MBSStorageAccount -ID $BackupPlan.BasePlan.ConnectionID) -StorageType $StorageType){ if ($BackupPlan.BasePlan.IsArchive -eq "true") { $BackupPlansNBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } else { $BackupPlansCBFArray += Convert-XMLtoPSObject $BackupPlan.BasePlan } } } } Default {Write-Error -message "Incorrect PlanType parameter"} } } } if ($PlanFormat -eq "Legacy") {$PlanFormat = "CBF"} switch ($PlanFormat) { "All" { $BackupPlansReturnArray += $BackupPlansNBFClassArray $BackupPlansReturnArray += Convert-Output -InputArray $BackupPlansNBFArray $BackupPlansReturnArray += Convert-Output -InputArray $BackupPlansCBFArray } "CBF" { $BackupPlansReturnArray += Convert-Output -InputArray $BackupPlansCBFArray } "NBF" { $BackupPlansReturnArray += $BackupPlansNBFClassArray $BackupPlansReturnArray += Convert-Output -InputArray $BackupPlansNBFArray } Default {Write-Error -message "Incorrect PlanFormat parameter"} } return $BackupPlansReturnArray } end{ } } # SIG # Begin signature block # MIInWgYJKoZIhvcNAQcCoIInSzCCJ0cCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAp14QdQ6HRhKhp # Vz8g0pI4mpTIrdJ+YmZMzkK3qxwZXqCCEekwggVvMIIEV6ADAgECAhBI/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/ # L9Uo2bC5a4CH2RwwggZUMIIEvKADAgECAhBQGj1MeADxcRs/FOU26uyrMA0GCSqG # SIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0 # ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYw # HhcNMjExMjAzMDAwMDAwWhcNMjQxMjAyMjM1OTU5WjBYMQswCQYDVQQGEwJVUzEV # MBMGA1UECAwMUGVubnN5bHZhbmlhMRgwFgYDVQQKDA9NU1BCeXRlcywgQ29ycC4x # GDAWBgNVBAMMD01TUEJ5dGVzLCBDb3JwLjCCAiIwDQYJKoZIhvcNAQEBBQADggIP # ADCCAgoCggIBAKNUOYUGihQGjTJdJ6k5Fm3+6QJGhj2wUbubiiqxJeqmW6616o5e # ExwiGSxPOqafJzOJNq0XOigb3OQhtdIR4bG38+JghFt8rZe/DxBmPBZDR9bD1hrk # 9vY714QhqvhIlUDXHnDUc9pnVGFfI945hRgaFHL77GQAEFyMvjNupOvT674/E8rI # gYKMQBwY0cqiuRQwr3FnRMmNhd8/5mqrZGglDT1JizOnpfFVgNJ0x4ev7mPYIF6T # rFGPwHsOOujzydmGgqvtGASEuz74A6arzYrhbjXv8XsEdT2tz6hHIpMwsgWMk6BD # KDCsSIl5oEmVbQNXKrC0k62/XpbWRd+i350k07kl1bdV+nbi1K62TyS+7eVxehC1 # gFp+Knob1aqAJD9sPBLdbN3E4FOB/rvOLP1i2IxAcTGirAyRkkUriD4LUSWO6pju # Qv2V4ZU/+K/3ZLXYCbIflzpDq6z9FmazK5csv99Coslv9s6lm9s1RRxgRBj5sn1q # Xe/5l0VbF7tG/cgBvt8aJBD0u8knujI17lDy1TGA77r/KKj65xSsxC6nm0RA9pTw # 0tz5OQ4ABYrH6TpdUBJz8m8cFgPipvyohN0RdE7InB3Nao11L1UHlnnL0SG1z5qQ # YU7BhvfiSu44pSY9/uTPmAPlNIj3MO5utjfMD+MX9u86d8h/DWwrvQZzAgMBAAGj # ggGcMIIBmDAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimqF6TNDDAdBgNVHQ4E # FgQU7XGG9N0fpUpnonmgh6+IzR3lGj0wDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB # /wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4QgEBBAQDAgQQMEoG # A1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8v # c2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBJBgNVHR8EQjBAMD6gPKA6hjhodHRw # Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2 # LmNybDB5BggrBgEFBQcBAQRtMGswRAYIKwYBBQUHMAKGOGh0dHA6Ly9jcnQuc2Vj # dGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3J0MCMGCCsG # AQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOC # AYEAhLlUlrWxmB3MSCX9LcaY3p6jCnaeFR4chgRmhjdH+Gy5UyFpEq1/3X/Pv2Ih # GGnX0uVbXsQ90D/CwFk7bXCFUUblu4ldzNqjmnf+lcTtv/WJR9FTS9t79WdiWbuN # /YIEXVDERUGPC7v55aaJvXJbDS+4vYeJPAHl2xsvbARWui1nwBLOSVGTGk6T2Q6s # BnlHFToFc4UFtMhYUMf8L03jypocNGM9z6yamsOANd/dXt582U5DD0g7SVS2pyHD # Ot7UvVq6769TGZNwq9s1tFwQjm3IGz4DIO1ADMwoGLzqqalYQ1xq2JAqUq41hSlN # YHecLTjAOTwA81wv71XbZdARR0DfmpqdzdKkTbVucWhJFWL7clDQ0WzfAx1/ZsjR # t6X9p+XuLnJPMD3V5swX52ZCcB6LY3FyK7kgwNseH+Xqo+Ln7OtAs3Bwa/Cm9lbL # xYs8wkDitxFnpKFstyE7EE+wtEJkyszfLqjkmUCw/hjzX6I40hahbPCxaxdlv8+3 # drczMYIUxzCCFMMCAQEwaDBUMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGln # byBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcg # Q0EgUjM2AhBQGj1MeADxcRs/FOU26uyrMA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYB # BAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGC # NwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIEPTMVNSgpCxgUMT # lcDu5lijj2eoSpaMC66ACmU6XjJYMA0GCSqGSIb3DQEBAQUABIICAD8ykZ0/yH5v # CFR4w4IY27vJj/MsrzzNTtNNfdwX3HwtEkhI68M8jCnhVPXu3Wmnsml6BmzOoOzi # 6u7QSUhoHevZP2RnWsDrb50TT4yvQkW+QYvvXmHTwSX7xV2+doB2M68MBAaK8jMg # Hs1p7eCMVVUk0sL0t8rvqn1w5BFbHdxv75oETivgZwNaq26spfld1S3p/y9TR8kB # R7GQIiDDI/9i5NiETqPQV6TGOBuLcuzmA5WOCbLODx1Pm/Gg/KVXUzcTHR5Pq5gH # aDsct7ab8m7XQ4t2Y8NCGPMAsGt9JcIbthmi693Z6xf8Bjs5wJoYPxlhqayOLSt9 # 4PhSx1QPj6EIu1F4qPWyNa94kt82TESSB9LNP/efNIWK5K0Dppun+PrA9wq9ehxK # +1r3tZjwH5FDCKD6/8hV4JMQiSiDvUSPZn7l0VkrGo2HOcybFLBtKZRzxAPUWU/d # vz0i1bxNk+WBA/el6huKZnl83abV9ATZoRJlH5jjMGHaleW+D95mBmUFfflIWCZS # LFVe45Bq1yYHdsbs66Y721ap1l5GKvjOHkrDTIz2bjpTqhchWvnQYlpcHCebH+ZE # /z1zI3c1DDZQY4nrAygDvNEYWLrgJBt5KOdsJbiOHythuRiTk3QkLq9b5aUGQEsM # ZPUDrzz216vLnTnDPvP9k/kQ7PR7zoESoYIRsjCCEa4GCisGAQQBgjcDAwExghGe # MIIRmgYJKoZIhvcNAQcCoIIRizCCEYcCAQMxDzANBglghkgBZQMEAgEFADB3Bgsq # hkiG9w0BCRABBKBoBGYwZAIBAQYJYIZIAYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAE # IN/Rdn8f9gt4NKdNIaK6Ga4zrPzPiDOfbE5cCSSyRcCnAhBmGbvzWatFWfIxFwWZ # jFLmGA8yMDIyMDYxMDIwMTg1N1qggg18MIIGxjCCBK6gAwIBAgIQCnpKiJ7JmUKQ # BmM4TYaXnTANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO # RGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNB # NDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIyMDMyOTAwMDAwMFoXDTMz # MDMxNDIzNTk1OVowTDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ # bmMuMSQwIgYDVQQDExtEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMiAtIDIwggIiMA0G # CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC5KpYjply8X9ZJ8BWCGPQz7sxcbOPg # JS7SMeQ8QK77q8TjeF1+XDbq9SWNQ6OB6zhj+TyIad480jBRDTEHukZu6aNLSOiJ # QX8Nstb5hPGYPgu/CoQScWyhYiYB087DbP2sO37cKhypvTDGFtjavOuy8YPRn80J # xblBakVCI0Fa+GDTZSw+fl69lqfw/LH09CjPQnkfO8eTB2ho5UQ0Ul8PUN7UWSxE # dMAyRxlb4pguj9DKP//GZ888k5VOhOl2GJiZERTFKwygM9tNJIXogpThLwPuf4UC # yYbh1RgUtwRF8+A4vaK9enGY7BXn/S7s0psAiqwdjTuAaP7QWZgmzuDtrn8oLsKe # 4AtLyAjRMruD+iM82f/SjLv3QyPf58NaBWJ+cCzlK7I9Y+rIroEga0OJyH5fsBrd # Gb2fdEEKr7mOCdN0oS+wVHbBkE+U7IZh/9sRL5IDMM4wt4sPXUSzQx0jUM2R1y+d # +/zNscGnxA7E70A+GToC1DGpaaBJ+XXhm+ho5GoMj+vksSF7hmdYfn8f6CvkFLIW # 1oGhytowkGvub3XAsDYmsgg7/72+f2wTGN/GbaR5Sa2Lf2GHBWj31HDjQpXonrub # S7LitkE956+nGijJrWGwoEEYGU7tR5thle0+C2Fa6j56mJJRzT/JROeAiylCcvd5 # st2E6ifu/n16awIDAQABo4IBizCCAYcwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB # /wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwIAYDVR0gBBkwFzAIBgZngQwB # BAIwCwYJYIZIAYb9bAcBMB8GA1UdIwQYMBaAFLoW2W1NhS9zKXaaL3WMaiCPnshv # MB0GA1UdDgQWBBSNZLeJIf5WWESEYafqbxw2j92vDTBaBgNVHR8EUzBRME+gTaBL # hklodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRSU0E0 # MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3JsMIGQBggrBgEFBQcBAQSBgzCBgDAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFgGCCsGAQUFBzAC # hkxodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRS # U0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3DQEBCwUAA4IC # AQANLSN0ptH1+OpLmT8B5PYM5K8WndmzjJeCKZxDbwEtqzi1cBG/hBmLP13lhk++ # kzreKjlaOU7YhFmlvBuYquhs79FIaRk4W8+JOR1wcNlO3yMibNXf9lnLocLqTHbK # odyhK5a4m1WpGmt90fUCCU+C1qVziMSYgN/uSZW3s8zFp+4O4e8eOIqf7xHJMUpY # tt84fMv6XPfkU79uCnx+196Y1SlliQ+inMBl9AEiZcfqXnSmWzWSUHz0F6aHZE8+ # RokWYyBry/J70DXjSnBIqbbnHWC9BCIVJXAGcqlEO2lHEdPu6cegPk8QuTA25POq # aQmoi35komWUEftuMvH1uzitzcCTEdUyeEpLNypM81zctoXAu3AwVXjWmP5UbX9x # qUgaeN1Gdy4besAzivhKKIwSqHPPLfnTI/KeGeANlCig69saUaCVgo4oa6TOnXbe # qXOqSGpZQ65f6vgPBkKd3wZolv4qoHRbY2beayy4eKpNcG3wLPEHFX41tOa1DKKZ # pdcVazUOhdbgLMzgDCS4fFILHpl878jIxYxYaa+rPeHPzH0VrhS/inHfypex2Efq # HIXgRU4SHBQpWMxv03/LvsEOSm8gnK7ZczJZCOctkqEaEf4ymKZdK5fgi9OczG21 # Da5HYzhHF1tvE9pqEG4fSbdEW7QICodaWQR2EaGndwITHDCCBq4wggSWoAMCAQIC # EAc2N7ckVHzYR6z9KGYqXlswDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMx # FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv # bTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MB4XDTIyMDMyMzAw # MDAwMFoXDTM3MDMyMjIzNTk1OVowYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp # Z2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQw # OTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP # ADCCAgoCggIBAMaGNQZJs8E9cklRVcclA8TykTepl1Gh1tKD0Z5Mom2gsMyD+Vr2 # EaFEFUJfpIjzaPp985yJC3+dH54PMx9QEwsmc5Zt+FeoAn39Q7SE2hHxc7Gz7iuA # hIoiGN/r2j3EF3+rGSs+QtxnjupRPfDWVtTnKC3r07G1decfBmWNlCnT2exp39mQ # h0YAe9tEQYncfGpXevA3eZ9drMvohGS0UvJ2R/dhgxndX7RUCyFobjchu0CsX7Le # Sn3O9TkSZ+8OpWNs5KbFHc02DVzV5huowWR0QKfAcsW6Th+xtVhNef7Xj3OTrCw5 # 4qVI1vCwMROpVymWJy71h6aPTnYVVSZwmCZ/oBpHIEPjQ2OAe3VuJyWQmDo4EbP2 # 9p7mO1vsgd4iFNmCKseSv6De4z6ic/rnH1pslPJSlRErWHRAKKtzQ87fSqEcazjF # KfPKqpZzQmiftkaznTqj1QPgv/CiPMpC3BhIfxQ0z9JMq++bPf4OuGQq+nUoJEHt # Qr8FnGZJUlD0UfM2SU2LINIsVzV5K6jzRWC8I41Y99xh3pP+OcD5sjClTNfpmEpY # PtMDiP6zj9NeS3YSUZPJjAw7W4oiqMEmCPkUEBIDfV8ju2TjY+Cm4T72wnSyPx4J # duyrXUZ14mCjWAkBKAAOhFTuzuldyF4wEr1GnrXTdrnSDmuZDNIztM2xAgMBAAGj # ggFdMIIBWTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBS6FtltTYUvcyl2 # mi91jGogj57IbzAfBgNVHSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNV # HQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEEazBp # MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUH # MAKGNWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRS # b290RzQuY3J0MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0 # LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3JsMCAGA1UdIAQZMBcwCAYGZ4EM # AQQCMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAgEAfVmOwJO2b5ipRCIB # fmbW2CFC4bAYLhBNE88wU86/GPvHUF3iSyn7cIoNqilp/GnBzx0H6T5gyNgL5Vxb # 122H+oQgJTQxZ822EpZvxFBMYh0MCIKoFr2pVs8Vc40BIiXOlWk/R3f7cnQU1/+r # T4osequFzUNf7WC2qk+RZp4snuCKrOX9jLxkJodskr2dfNBwCnzvqLx1T7pa96kQ # sl3p/yhUifDVinF2ZdrM8HKjI/rAJ4JErpknG6skHibBt94q6/aesXmZgaNWhqsK # RcnfxI2g55j7+6adcq/Ex8HBanHZxhOACcS2n82HhyS7T6NJuXdmkfFynOlLAlKn # N36TU6w7HQhJD5TNOXrd/yVjmScsPT9rp/Fmw0HNT7ZAmyEhQNC3EyTN3B14OuSe # reU0cZLXJmvkOHOrpgFPvT87eK1MrfvElXvtCl8zOYdBeHo46Zzh3SP9HSjTx/no # 8Zhf+yvYfvJGnXUsHicsJttvFXseGYs2uJPU5vIXmVnKcPA3v5gA3yAWTyf7YGcW # oWa63VXAOimGsJigK+2VQbc61RWYMbRiCQ8KvYHZE/6/pNHzV9m8BPqC3jLfBInw # AM1dwvnQI38AC+R2AibZ8GV2QqYphwlHK+Z/GqSFD/yYlvZVVCsfgPrA8g4r5db7 # qS9EFUrnEw4d2zc4GqEr9u3WfPwxggN2MIIDcgIBATB3MGMxCzAJBgNVBAYTAlVT # MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1 # c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0ECEAp6SoieyZlC # kAZjOE2Gl50wDQYJYIZIAWUDBAIBBQCggdEwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3 # DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yMjA2MTAyMDE4NTdaMCsGCyqGSIb3DQEJ # EAIMMRwwGjAYMBYEFIUI84ZRXLPTB322tLfAfxtKXkHeMC8GCSqGSIb3DQEJBDEi # BCAViAKnt3UDpFO9bBASGZhr6wps1aEdy60KRGrxUYYELjA3BgsqhkiG9w0BCRAC # LzEoMCYwJDAiBCCdppAVw0nGwYl4Rbo1gq1wyI+kKTvbar6cK9JTknnmOzANBgkq # hkiG9w0BAQEFAASCAgAUIUkbUWtsOYl/zKiEWazfB2ZdG5XZPN4trhOBMHAuWQCc # c7bLTV9fkdmWnxBLZIQ25XgLuHHlUNUB2bCi2WTeGGmZPUXuZ/5u54L7gUd1c8XT # E23gFdi4ETD2hRYBlo1bK5lxhlSFQEkQ+TRBRwW1DjW02gD6u9DvRWt/ZFy+0IhF # vwjzXJhH98R0XzKhHLyxO3GTCONdBMAy6CK5vSxnuHDU9MFp79zIiqTHZ+lg6HpA # YixRaX2ZOOxXgpajDpAG8E7iYXg5HcrZ3YHnhrpeV/xs1JOEt6v/OPPm5TXZ7pxs # I8gtQYEoed3z5/3uNneXRcCBMjuVtBlBZgRUon9SajvZ/66WnG02iJV7V92WVG8g # 2N5TIU+ktBxyeNRTN85RHN5MHFY7Aw0ne1AJK6k1URlAGwcmEKNheQkRaNDZMh/q # Hl12vejsgSMMaod8E4fbazpHiLg1ii9j6gq5VQHXzk9h9OhwKSrdwYyDI2Kn3f9t # zOYMbz0EUA05KcxYLvnY1aYNJQQO4H6rUUXaoTwdBNuPEd3sGclFruc4bONtr6MT # ZqPlUvyhNbNaAcrr1S5QEO6t/42uKEv7Gp4pzHUHh1AtcZ5Stm1BsXWUrN9cEB/F # 8oBRZFGwXp/4jus1Xny4Hi7ieYQGdOzGmkuueguxo51LekazOCEIBnAqVtOeww== # SIG # End signature block |