public/Copy-AppVentiXPublishingTask.ps1

<#
    .SYNOPSIS
        Copies AppVentiX publishing tasks to a new machine group with optional Azure Virtual Desktop seamless publishing.
 
    .DESCRIPTION
        The Copy-AppVentiXPublishingTask function copies one or more AppVentiX publishing tasks from an existing machine group to a new machine group.
        It supports both standard copying and Azure Virtual Desktop (AVD) seamless publishing scenarios.
 
        The function performs the following operations:
        - Validates that AppVentiX is properly licensed
        - Retrieves existing publishing tasks and machine groups from the configuration
        - Copies task configuration including package paths, groups, and seamless applications
        - Automatically adjusts content share paths for the new machine group
        - Optionally configures Azure Virtual Desktop seamless publishing
        - Updates Active Directory group assignments with SID resolution
        - Preserves or disables seamless publishing based on parameters
 
        When copying tasks with seamless publishing enabled, the function can automatically configure Azure Virtual Desktop
        application groups, host pools, and user assignments.
 
    .PARAMETER Id
        Specifies the GUID of a specific publishing task to copy.
        This parameter accepts pipeline input by property name and is mandatory when copying a single task.
        The value must be a valid GUID format.
 
    .PARAMETER MachineGroupFriendlyname
        Specifies the friendly name of the source machine group containing the publishing tasks to copy.
        All publishing tasks from this machine group will be copied to the new machine group.
        This parameter accepts pipeline input by property name.
 
    .PARAMETER NewMachineGroupFriendlyname
        Specifies the friendly name of the destination machine group where tasks will be copied.
        This parameter is mandatory for all parameter sets.
        The machine group must already exist in the AppVentiX configuration.
 
    .PARAMETER NewGroup
        Specifies the new Active Directory group to assign to the copied publishing tasks.
        Can be specified as "GroupName" or "DOMAIN\GroupName".
        If only the group name is provided, the domain from the original task will be reused.
        If not specified, the original task's group assignment will be retained.
        The function will attempt to resolve the group SID automatically.
 
    .PARAMETER DontPublishSeamless
        Disables seamless publishing for the copied tasks, even if the original tasks had seamless publishing enabled.
        Use this switch when you want to copy task configurations without enabling seamless application publishing.
        Only applicable for non-Azure parameter sets.
 
    .PARAMETER SubscriptionId
        Specifies the Azure subscription ID for Azure Virtual Desktop seamless publishing.
        This parameter is mandatory when using Azure-specific parameter sets (IDAzure or MachineGroupFriendlynameAzure).
        Required for configuring AVD application groups and assignments.
 
    .PARAMETER ResourceGroupName
        Specifies the Azure resource group name containing the AVD resources.
        This parameter is mandatory when using Azure-specific parameter sets.
        The resource group must contain the specified host pool and application group.
 
    .PARAMETER ApplicationGroupName
        Specifies the Azure Virtual Desktop application group name for seamless publishing.
        This parameter has an alias: ApplicationGroup.
        Mandatory for Azure-specific parameter sets.
 
    .PARAMETER HostPoolName
        Specifies the Azure Virtual Desktop host pool name associated with the application group.
        This parameter has an alias: HostPool.
        Mandatory for Azure-specific parameter sets.
 
    .PARAMETER AssignmentName
        Specifies the name for the Azure Virtual Desktop user assignment.
        This is used to create or update user group assignments for seamless applications.
        Mandatory for Azure-specific parameter sets.
 
    .PARAMETER ConfigShare
        Specifies the AppVentiX configuration share path.
        By default, uses the configuration share from the module's current session variable.
        This parameter is hidden from normal parameter discovery.
 
    .EXAMPLE
        PS C:\> Copy-AppVentiXPublishingTask -Id "a1b2c3d4-e5f6-7890-abcd-ef1234567890" -NewMachineGroupFriendlyname "Production"
 
        Copies a single publishing task to the Production machine group, preserving all settings including group assignments and seamless publishing.
 
    .EXAMPLE
        PS C:\> Copy-AppVentiXPublishingTask -MachineGroupFriendlyname "Development" -NewMachineGroupFriendlyname "Testing"
 
        Copies all publishing tasks from the Development machine group to the Testing machine group.
 
    .EXAMPLE
        PS C:\> Copy-AppVentiXPublishingTask -MachineGroupFriendlyname "Development" -NewMachineGroupFriendlyname "Production" -NewGroup "CONTOSO.local\Prod-Users"
 
        Copies all publishing tasks from Development to Production and assigns them to the CONTOSO.local\Prod-Users AD group.
 
    .EXAMPLE
        PS C:\> Copy-AppVentiXPublishingTask -Id "a1b2c3d4-e5f6-7890-abcd-ef1234567890" -NewMachineGroupFriendlyname "Testing" -DontPublishSeamless
 
        Copies a publishing task to Testing but disables seamless publishing even if the source task had it enabled.
 
    .EXAMPLE
        PS C:\> Get-AppVentiXPublishingTask -MachineGroupFriendlyName "Development" | Copy-AppVentiXPublishingTask -NewMachineGroupFriendlyname "Staging"
 
        Uses pipeline input to copy all publishing tasks from Development to Staging.
 
    .EXAMPLE
        PS C:\> $Params = @{
                Id = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
                NewMachineGroupFriendlyname = "AVD-Production"
                SubscriptionId = "12345678-1234-1234-1234-123456789012"
                ResourceGroupName = "RG-AVD-Prod"
                ApplicationGroupName = "AppGroup-Office"
                HostPoolName = "HostPool-Prod"
                AssignmentName = "Office-Users-Assignment"
            }
        PS C:\> Copy-AppVentiXPublishingTask @Params
 
        Copies a publishing task with Azure Virtual Desktop seamless publishing configuration, including subscription, resource group,
        application group, host pool, and user assignment details.
 
    .EXAMPLE
        PS C:\> Copy-AppVentiXPublishingTask -MachineGroupFriendlyname "Development" -NewMachineGroupFriendlyname "Production" -NewGroup "CONTOSO.local\ProdUsers"
 
        Copies tasks and assigns them to ProdUsers group (domain will be inherited from original task if not specified).
 
    .NOTES
        Function : Copy-AppVentiXPublishingTask
        Author : John Billekens
        Copyright: (c) John Billekens Consultancy & AppVentiX
        Version : 2026.130.1000
        Requires : Valid AppVentiX license
#>

function Copy-AppVentiXPublishingTask {
    [CmdletBinding(DefaultParameterSetName = 'ID')]
    param (
        [Parameter(ParameterSetName = 'ID', Mandatory, ValueFromPipelineByPropertyName)]
        [Parameter(ParameterSetName = 'IDAzure', Mandatory, ValueFromPipelineByPropertyName)]
        [ValidateScript({
                if ( [guid]::TryParse("$_", $([ref][guid]::Empty)) ) {
                    $true
                } else {
                    Throw [System.Management.Automation.ValidationMetadataException] "The ID '${_}' is not a valid GUID."
                }
            })]
        [ValidateNotNullOrEmpty()]
        [String]$Id,

        [Parameter(ParameterSetName = 'MachineGroupFriendlyname', Mandatory, ValueFromPipelineByPropertyName)]
        [Parameter(ParameterSetName = 'MachineGroupFriendlynameAzure', Mandatory, ValueFromPipelineByPropertyName)]
        [ValidateNotNullOrEmpty()]
        [String]$MachineGroupFriendlyname,

        [Parameter(ParameterSetName = 'ID', Mandatory)]
        [Parameter(ParameterSetName = 'IDAzure', Mandatory)]
        [Parameter(ParameterSetName = 'MachineGroupFriendlyname', Mandatory)]
        [Parameter(ParameterSetName = 'MachineGroupFriendlynameAzure', Mandatory)]
        [ValidateNotNullOrEmpty()]
        [String]$NewMachineGroupFriendlyname,

        [Parameter(ParameterSetName = 'ID')]
        [Parameter(ParameterSetName = 'IDAzure')]
        [String]$NewGroup,

        [Parameter(ParameterSetName = 'ID')]
        [Parameter(ParameterSetName = 'MachineGroupFriendlyname')]
        [Switch]$DontPublishSeamless,

        [Parameter(ParameterSetName = 'IDAzure', Mandatory)]
        [Parameter(ParameterSetName = 'MachineGroupFriendlynameAzure', Mandatory)]
        [String]$SubscriptionId,

        [Parameter(ParameterSetName = 'IDAzure', Mandatory)]
        [Parameter(ParameterSetName = 'MachineGroupFriendlynameAzure', Mandatory)]
        [String]$ResourceGroupName,

        [Parameter(ParameterSetName = 'IDAzure', Mandatory)]
        [Parameter(ParameterSetName = 'MachineGroupFriendlynameAzure', Mandatory)]
        [Alias('ApplicationGroup')]
        [String]$ApplicationGroupName,

        [Parameter(ParameterSetName = 'IDAzure', Mandatory)]
        [Parameter(ParameterSetName = 'MachineGroupFriendlynameAzure', Mandatory)]
        [Alias('HostPool')]
        [String]$HostPoolName,

        [Parameter(ParameterSetName = 'IDAzure', Mandatory)]
        [Parameter(ParameterSetName = 'MachineGroupFriendlynameAzure', Mandatory)]
        [String]$AssignmentName,

        [Parameter(DontShow, ParameterSetName = 'ID')]
        [Parameter(DontShow, ParameterSetName = 'IDAzure')]
        [Parameter(DontShow, ParameterSetName = 'MachineGroupFriendlyname')]
        [Parameter(DontShow, ParameterSetName = 'MachineGroupFriendlynameAzure')]
        [ValidateNotNullOrEmpty()]
        [String]$ConfigShare = $Script:AppVentix.ConfigShare
    )
    Begin {
        if (Test-AppVentiXIsLicensed -ConfigShare $ConfigShare) {
            $publishingTasksFullname = Join-Path -Path $ConfigShare -ChildPath $Script:AppVentiX.PublishingTasksFilename
            if (-Not (Test-Path -Path $publishingTasksFullname)) {
                Write-Error "Publishing tasks file not found at '$publishingTasksFullname'" -ErrorAction Stop
            }
            $publishingTasks = @(Get-AppVentiXPublishingTask -UserPublishingTasks)
            Write-Verbose "Retrieved $($publishingTasks.Count) publishing task(s)"
            $machineGroups = @(Get-AppVentiXMachineGroup)
            Write-Verbose "Retrieved $($machineGroups.Count) machine group(s)"
            if ($NewGroup -notlike '*\*') {
                Write-Warning "The parameter -NewGroup should contain the domain name and the groupname, e.g. `"DOMAIN.LOCAL\GROUP`" will try to reuse domain from the original publishing task."
            }
        } else {
            Write-Warning 'AppVentiX is not licensed!'
            return
        }
    }

    Process {
        Write-Verbose "Processing the publishing task(s) based on the $($PSCmdlet.ParameterSetName)"
        if ($PSCmdlet.ParameterSetName -in 'ID', 'IDAzure') {
            Write-Verbose "Copying a single publishing task."
            $selectedPublishingTasks = @($publishingTasks | Where-Object { $_.Id -ieq $Id })
        } elseif ($PSCmdlet.ParameterSetName -in 'MachineGroupFriendlyname', 'MachineGroupFriendlynameAzure') {
            Write-Verbose "Copying publishing task(s) from machine group with friendly name '$MachineGroupFriendlyname' to machine group with friendly name '$NewMachineGroupFriendlyname'"
            $selectedPublishingTasks = @($publishingTasks | Where-Object { $_.MachineGroupFriendlyname -eq $MachineGroupFriendlyname })
        }
        if ($selectedPublishingTasks.Count -eq 0) {
            Write-Error "No publishing task(s) found"
            return
        }
        if (-Not ($newMachineGroup = $machineGroups | Where-Object { $_.FriendlyName -ieq "$NewMachineGroupFriendlyname" } )) {
            Write-Error "No machine group found with friendly name '$NewMachineGroupFriendlyname'"
            return
        }
        Write-Verbose "Copying $($selectedPublishingTasks.Count) publishing task(s)"
        foreach ($task in $selectedPublishingTasks) {
            $isWVD = $false
            if ($task.MachineGroupFriendlyname -ieq "All Machine Groups") {
                Write-Warning "Publishing task with ID '$($task.Id)' is set to 'All Machine Groups' and cannot be copied and is skipped."
                continue
            }
            Write-Verbose "Retrieving the publishing tasks"
            [xml]$publishingTasksXml = Get-Content -Path $publishingTasksFullname
            $currentMachineGroup = $machineGroups | Where-Object { $_.FriendlyName -ieq $task.MachineGroupFriendlyname }

            $publishingTask = $publishingTasksXml.SelectSingleNode("//Task[Id='$($task.Id)']")
            if (-Not [String]::IsNullOrEmpty($($publishingTask.Seamless.SeamlessWVDapplicationgroup))) {
                Write-Verbose "Publishing task with ID '$($task.Id)' is a WVD publishing task"
                $isWVD = $true
            } else {
                Write-Verbose "Publishing task with ID '$($task.Id)' is not a WVD publishing task"
            }
            if ($publishingTask.ToString() -ieq "Task") {
                Write-Verbose "Copying publishing task with ID '$($task.Id)'"
                $newPublishingTask = $publishingTask.Clone()
                $newPublishingTask.Id = [System.Guid]::NewGuid().ToString()
                $newPublishingTask.MachineGroupFriendlyname = "$($newMachineGroup.FriendlyName)"
                $newPublishingTask.MachineGroup = "$($newMachineGroup.GroupName)"
                if (($publishingTask.Seamless.SeamlessApplication | Measure-Object).Count -gt 0 -and ($DontPublishSeamless.ToBool() -ne $true) -and $publishingTask.PublishSeamless -eq $true) {
                    if ($isWVD) {
                        Write-Verbose "Publishing the copied publishing task seamless. Removing existing seamless applications"
                        $null = $newPublishingTask.RemoveChild($newPublishingTask.Seamless)
                        Write-Verbose "Adding seamless applications"
                        $SeamlessApps = @()
                        ForEach ($app in $publishingTask.Seamless.SeamlessApplication) {
                            $seamlessApp = [PSCustomObject]@{
                                Order        = $app.SeamlessApplicationNumber
                                Executable   = $app.SeamlessApplicationExecutable
                                Argument     = $app.SeamlessApplicationArgument
                                IconPath     = $app.SeamlessApplicationIconPath
                                FriendlyName = $app.SeamlessApplicationFriendlyName
                                RunVirtual   = $app.SeamlessApplicationRunVirtual
                                Description  = $app.SeamlessApplicationFriendlyName
                            }
                            $SeamlessApps += $seamlessApp
                            Write-Verbose "Added application for processing $($seamlessApp | Format-List | Out-String)"
                        }
                        $publishingParameters = @{
                            Id                   = $newPublishingTask.Id
                            SubscriptionId       = $SubscriptionId
                            ResourceGroupName    = $ResourceGroupName
                            ApplicationGroupName = $ApplicationGroupName
                            HostPoolName         = $HostPoolName
                            AssignmentName       = $AssignmentName
                            SeamlessApps         = @($SeamlessApps)
                            ConfigShare          = $ConfigShare
                        }
                    }
                } else {
                    Write-Verbose "Seamless publishing is disabled"
                    $newPublishingTask.PublishSeamless = "False"
                }
                $basePath = $publishingTask.Path
                ForEach ($share in $currentMachineGroup.GroupContentshares.ContentShare) {
                    Write-Verbose "Checking if '$basePath' is in share '$($share.Path)'"
                    $basePath = ([regex]::Replace($basePath, [regex]::Escape($share.Path), "", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)).TrimStart('\')
                    Write-Verbose "Base path is now '$basePath'"
                }
                $newPath = $null
                ForEach ($share in $newMachineGroup.GroupContentshares.ContentShare) {
                    if (Test-Path -Path "$(Join-Path -Path $share.Path -ChildPath $basePath)" -ErrorAction SilentlyContinue ) {
                        $newPath = Join-Path -Path $share.Path -ChildPath $basePath
                        Write-Verbose "Found '$basePath'"
                        $newPath = Format-ContentSharePath -Path $newPath -ConfigShare $ConfigShare
                    } else {
                        Write-Verbose "Not found '$basePath'"
                    }
                }
                if ([String]::IsNullOrEmpty($newPath)) {
                    $fileName = [System.IO.Path]::GetFileName($basePath)
                    Write-Warning "'$fileName' not found in any content share of machine group '$($newMachineGroup.FriendlyName)'"
                    Write-Warning "Skipping publishing task with ID '$($task.Id)'"
                    continue
                } else {
                    Write-Verbose "Configuring new path"
                    $newPublishingTask.Path = "$newPath"
                }
                if (-Not [String]::IsNullOrEmpty($NewGroup)) {
                    Write-Verbose "Setting the new group for the publishing task"
                    if ($publishingTask.Group -like "*\*") {
                        $domainName, $groupName = $publishingTask.Group.Split('\')
                    }
                    if ($NewGroup.Split('\').Count -eq 1) {
                        $groupName = $NewGroup
                    } else {
                        $domainName, $groupName = $NewGroup.Split('\')
                    }
                    $adGroup = '{0}\{1}' -f $domainName, $groupName
                    $newPublishingTask.Group = $adGroup
                    $groupSID = Get-GroupSID -GroupName $adGroup
                    if ([string]::IsNullOrEmpty($groupSID)) {
                        $adGroupSID = $newPublishingTask.SelectSingleNode("ADGroupSID")
                        if ($adGroupSID) {
                            $null = $newPublishingTask.RemoveChild($adGroupSID)
                            Write-Verbose "Removed ADGroupSID element from the publishing task"
                        } else {
                            Write-Warning "No ADGroupSID element found in the publishing task"
                        }
                    } else {
                        if ($newPublishingTask | Get-Member -Name ADGroupSID -ErrorAction SilentlyContinue) {
                            $newPublishingTask.ADGroupSID = "$groupSID"
                        } else {
                            $null = $($newPublishingTask.AppendChild($publishingTasksXml.CreateElement("ADGroupSID"))).AppendChild($publishingTasksXml.CreateTextNode($groupSID))
                        }
                        Write-Verbose "New group set to '$NewGroup'"
                        Write-Verbose "New group SID set to '$groupSID'"
                    }
                }
                Write-Verbose "Adding the copied publishing task"
                $null = $publishingTask.ParentNode.AppendChild($newPublishingTask)
                Write-Verbose "Saving the updated publishing tasks"
                $publishingTasksXml.Save($publishingTasksFullname)
                if ($isWVD -eq $true -and $newPublishingTask.PublishSeamless -like $true) {
                    Write-Verbose "Enabling seamless publishing for the copied publishing task"
                    Enable-AppVentiXSeamlessPublishing @publishingParameters
                }
            } else {
                Write-Error "No publishing task found with ID '$($task.Id)'"
            }
        }
        Clear-Variable -Name publishingTasksXml, selectedPublishingTasks -ErrorAction SilentlyContinue -Force
    }
    End {
        Clear-Variable -Name publishingTasks, machineGroups, publishingTasksFullname -ErrorAction SilentlyContinue -Force
    }
}

# SIG # Begin signature block
# MIImdwYJKoZIhvcNAQcCoIImaDCCJmQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAQrldb7VGIlQik
# tEu9B2xfZgVDyQySAtqhCckfxmDLxKCCIAowggYUMIID/KADAgECAhB6I67aU2mW
# D5HIPlz0x+M/MA0GCSqGSIb3DQEBDAUAMFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQK
# Ew9TZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIFRpbWUg
# U3RhbXBpbmcgUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5
# WjBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSwwKgYD
# VQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNjCCAaIwDQYJ
# KoZIhvcNAQEBBQADggGPADCCAYoCggGBAM2Y2ENBq26CK+z2M34mNOSJjNPvIhKA
# VD7vJq+MDoGD46IiM+b83+3ecLvBhStSVjeYXIjfa3ajoW3cS3ElcJzkyZlBnwDE
# JuHlzpbN4kMH2qRBVrjrGJgSlzzUqcGQBaCxpectRGhhnOSwcjPMI3G0hedv2eNm
# GiUbD12OeORN0ADzdpsQ4dDi6M4YhoGE9cbY11XxM2AVZn0GiOUC9+XE0wI7CQKf
# OUfigLDn7i/WeyxZ43XLj5GVo7LDBExSLnh+va8WxTlA+uBvq1KO8RSHUQLgzb1g
# bL9Ihgzxmkdp2ZWNuLc+XyEmJNbD2OIIq/fWlwBp6KNL19zpHsODLIsgZ+WZ1AzC
# s1HEK6VWrxmnKyJJg2Lv23DlEdZlQSGdF+z+Gyn9/CRezKe7WNyxRf4e4bwUtrYE
# 2F5Q+05yDD68clwnweckKtxRaF0VzN/w76kOLIaFVhf5sMM/caEZLtOYqYadtn03
# 4ykSFaZuIBU9uCSrKRKTPJhWvXk4CllgrwIDAQABo4IBXDCCAVgwHwYDVR0jBBgw
# FoAU9ndq3T/9ARP/FqFsggIv0Ao9FCUwHQYDVR0OBBYEFF9Y7UwxeqJhQo1SgLqz
# YZcZojKbMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNVHR8ERTBDMEGg
# P6A9hjtodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1lU3Rh
# bXBpbmdSb290UjQ2LmNybDB8BggrBgEFBQcBAQRwMG4wRwYIKwYBBQUHMAKGO2h0
# dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ1Jv
# b3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAN
# BgkqhkiG9w0BAQwFAAOCAgEAEtd7IK0ONVgMnoEdJVj9TC1ndK/HYiYh9lVUacah
# RoZ2W2hfiEOyQExnHk1jkvpIJzAMxmEc6ZvIyHI5UkPCbXKspioYMdbOnBWQUn73
# 3qMooBfIghpR/klUqNxx6/fDXqY0hSU1OSkkSivt51UlmJElUICZYBodzD3M/SFj
# eCP59anwxs6hwj1mfvzG+b1coYGnqsSz2wSKr+nDO+Db8qNcTbJZRAiSazr7KyUJ
# Go1c+MScGfG5QHV+bps8BX5Oyv9Ct36Y4Il6ajTqV2ifikkVtB3RNBUgwu/mSiSU
# ice/Jp/q8BMk/gN8+0rNIE+QqU63JoVMCMPY2752LmESsRVVoypJVt8/N3qQ1c6F
# ibbcRabo3azZkcIdWGVSAdoLgAIxEKBeNh9AQO1gQrnh1TA8ldXuJzPSuALOz1Uj
# b0PCyNVkWk7hkhVHfcvBfI8NtgWQupiaAeNHe0pWSGH2opXZYKYG4Lbukg7HpNi/
# KqJhue2Keak6qH9A8CeEOB7Eob0Zf+fU+CCQaL0cJqlmnx9HCDxF+3BLbUufrV64
# EbTI40zqegPZdA+sXCmbcZy6okx/SjwsusWRItFA3DE8MORZeFb6BmzBtqKJ7l93
# 9bbKBy2jvxcJI98Va95Q5JnlKor3m0E7xpMeYRriWklUPsetMSf2NvUQa/E5vVye
# fQIwggZFMIIELaADAgECAhAIMk+dt9qRb2Pk8qM8Xl1RMA0GCSqGSIb3DQEBCwUA
# MFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMu
# QS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBDQTAeFw0yNDA0
# MDQxNDA0MjRaFw0yNzA0MDQxNDA0MjNaMGsxCzAJBgNVBAYTAk5MMRIwEAYDVQQH
# DAlTY2hpam5kZWwxIzAhBgNVBAoMGkpvaG4gQmlsbGVrZW5zIENvbnN1bHRhbmN5
# MSMwIQYDVQQDDBpKb2huIEJpbGxla2VucyBDb25zdWx0YW5jeTCCAaIwDQYJKoZI
# hvcNAQEBBQADggGPADCCAYoCggGBAMslntDbSQwHZXwFhmibivbnd0Qfn6sqe/6f
# os3pKzKxEsR907RkDMet2x6RRg3eJkiIr3TFPwqBooyXXgK3zxxpyhGOcuIqyM9J
# 28DVf4kUyZHsjGO/8HFjrr3K1hABNUszP0o7H3o6J31eqV1UmCXYhQlNoW9FOmRC
# 1amlquBmh7w4EKYEytqdmdOBavAD5Xq4vLPxNP6kyA+B2YTtk/xM27TghtbwFGKn
# u9Vwnm7dFcpLxans4ONt2OxDQOMA5NwgcUv/YTpjhq9qoz6ivG55NRJGNvUXsM3w
# 2o7dR6Xh4MuEGrTSrOWGg2A5EcLH1XqQtkF5cZnAPM8W/9HUp8ggornWnFVQ9/6M
# ga+ermy5wy5XrmQpN+x3u6tit7xlHk1Hc+4XY4a4ie3BPXG2PhJhmZAn4ebNSBwN
# Hh8z7WTT9X9OFERepGSytZVeEP7hgyptSLcuhpwWeR4QdBb7dV++4p3PsAUQVHFp
# wkSbrRTv4EiJ0Lcz9P1HPGFoHiFAQQIDAQABo4IBeDCCAXQwDAYDVR0TAQH/BAIw
# ADA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY2NzY2EyMDIxLmNybC5jZXJ0dW0u
# cGwvY2NzY2EyMDIxLmNybDBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0
# dHA6Ly9jY3NjYTIwMjEub2NzcC1jZXJ0dW0uY29tMDUGCCsGAQUFBzAChilodHRw
# Oi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY2NzY2EyMDIxLmNlcjAfBgNVHSMEGDAW
# gBTddF1MANt7n6B0yrFu9zzAMsBwzTAdBgNVHQ4EFgQUO6KtBpOBgmrlANVAnyiQ
# C6W6lJwwSwYDVR0gBEQwQjAIBgZngQwBBAEwNgYLKoRoAYb2dwIFAQQwJzAlBggr
# BgEFBQcCARYZaHR0cHM6Ly93d3cuY2VydHVtLnBsL0NQUzATBgNVHSUEDDAKBggr
# BgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAEQsN8wg
# PMdWVkwHPPTN+jKpdns5AKVFjcn00psf2NGVVgWWNQBIQc9lEuTBWb54IK6Ga3hx
# QRZfnPNo5HGl73YLmFgdFQrFzZ1lnaMdIcyh8LTWv6+XNWfoyCM9wCp4zMIDPOs8
# LKSMQqA/wRgqiACWnOS4a6fyd5GUIAm4CuaptpFYr90l4Dn/wAdXOdY32UhgzmSu
# xpUbhD8gVJUaBNVmQaRqeU8y49MxiVrUKJXde1BCrtR9awXbqembc7Nqvmi60tYK
# lD27hlpKtj6eGPjkht0hHEsgzU0Fxw7ZJghYG2wXfpF2ziN893ak9Mi/1dmCNmor
# GOnybKYfT6ff6YTCDDNkod4egcMZdOSv+/Qv+HAeIgEvrxE9QsGlzTwbRtbm6gwY
# YcVBs/SsVUdBn/TSB35MMxRhHE5iC3aUTkDbceo/XP3uFhVL4g2JZHpFfCSu2TQr
# rzRn2sn07jfMvzeHArCOJgBW1gPqR3WrJ4hUxL06Rbg1gs9tU5HGGz9KNQMfQFQ7
# 0Wz7UIhezGcFcRfkIfSkMmQYYpsc7rfzj+z0ThfDVzzJr2dMOFsMlfj1T6l22GBq
# 9XQx0A4lcc5Fl9pRxbOuHHWFqIBD/BCEhwniOCySzqENd2N+oz8znKooSISStnkN
# aYXt6xblJF2dx9Dn89FK7d1IquNxOwt0tI5dMIIGYjCCBMqgAwIBAgIRAKQpO24e
# 3denNAiHrXpOtyQwDQYJKoZIhvcNAQEMBQAwVTELMAkGA1UEBhMCR0IxGDAWBgNV
# BAoTD1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAxMjU2VjdGlnbyBQdWJsaWMgVGlt
# ZSBTdGFtcGluZyBDQSBSMzYwHhcNMjUwMzI3MDAwMDAwWhcNMzYwMzIxMjM1OTU5
# WjByMQswCQYDVQQGEwJHQjEXMBUGA1UECBMOV2VzdCBZb3Jrc2hpcmUxGDAWBgNV
# BAoTD1NlY3RpZ28gTGltaXRlZDEwMC4GA1UEAxMnU2VjdGlnbyBQdWJsaWMgVGlt
# ZSBTdGFtcGluZyBTaWduZXIgUjM2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEA04SV9G6kU3jyPRBLeBIHPNyUgVNnYayfsGOyYEXrn3+SkDYTLs1crcw/
# ol2swE1TzB2aR/5JIjKNf75QBha2Ddj+4NEPKDxHEd4dEn7RTWMcTIfm492TW22I
# 8LfH+A7Ehz0/safc6BbsNBzjHTt7FngNfhfJoYOrkugSaT8F0IzUh6VUwoHdYDpi
# ln9dh0n0m545d5A5tJD92iFAIbKHQWGbCQNYplqpAFasHBn77OqW37P9BhOASdmj
# p3IijYiFdcA0WQIe60vzvrk0HG+iVcwVZjz+t5OcXGTcxqOAzk1frDNZ1aw8nFhG
# EvG0ktJQknnJZE3D40GofV7O8WzgaAnZmoUn4PCpvH36vD4XaAF2CjiPsJWiY/j2
# xLsJuqx3JtuI4akH0MmGzlBUylhXvdNVXcjAuIEcEQKtOBR9lU4wXQpISrbOT8ux
# +96GzBq8TdbhoFcmYaOBZKlwPP7pOp5Mzx/UMhyBA93PQhiCdPfIVOCINsUY4U23
# p4KJ3F1HqP3H6Slw3lHACnLilGETXRg5X/Fp8G8qlG5Y+M49ZEGUp2bneRLZoyHT
# yynHvFISpefhBCV0KdRZHPcuSL5OAGWnBjAlRtHvsMBrI3AAA0Tu1oGvPa/4yeei
# Ayu+9y3SLC98gDVbySnXnkujjhIh+oaatsk/oyf5R2vcxHahajMCAwEAAaOCAY4w
# ggGKMB8GA1UdIwQYMBaAFF9Y7UwxeqJhQo1SgLqzYZcZojKbMB0GA1UdDgQWBBSI
# YYyhKjdkgShgoZsx0Iz9LALOTzAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIw
# ADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEB
# AgEDCDAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZn
# gQwBBAIwSgYDVR0fBEMwQTA/oD2gO4Y5aHR0cDovL2NybC5zZWN0aWdvLmNvbS9T
# ZWN0aWdvUHVibGljVGltZVN0YW1waW5nQ0FSMzYuY3JsMHoGCCsGAQUFBwEBBG4w
# bDBFBggrBgEFBQcwAoY5aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVi
# bGljVGltZVN0YW1waW5nQ0FSMzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2Nz
# cC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAYEAAoE+pIZyUSH5ZakuPVKK
# 4eWbzEsTRJOEjbIu6r7vmzXXLpJx4FyGmcqnFZoa1dzx3JrUCrdG5b//LfAxOGy9
# Ph9JtrYChJaVHrusDh9NgYwiGDOhyyJ2zRy3+kdqhwtUlLCdNjFjakTSE+hkC9F5
# ty1uxOoQ2ZkfI5WM4WXA3ZHcNHB4V42zi7Jk3ktEnkSdViVxM6rduXW0jmmiu71Z
# pBFZDh7Kdens+PQXPgMqvzodgQJEkxaION5XRCoBxAwWwiMm2thPDuZTzWp/gUFz
# i7izCmEt4pE3Kf0MOt3ccgwn4Kl2FIcQaV55nkjv1gODcHcD9+ZVjYZoyKTVWb4V
# qMQy/j8Q3aaYd/jOQ66Fhk3NWbg2tYl5jhQCuIsE55Vg4N0DUbEWvXJxtxQQaVR5
# xzhEI+BjJKzh3TQ026JxHhr2fuJ0mV68AluFr9qshgwS5SpN5FFtaSEnAwqZv3IS
# +mlG50rK7W3qXbWwi4hmpylUfygtYLEdLQukNEX1jiOKMIIGgjCCBGqgAwIBAgIQ
# NsKwvXwbOuejs902y8l1aDANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYD
# VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBS
# U0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMjEwMzIyMDAwMDAwWhcNMzgw
# MTE4MjM1OTU5WjBXMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p
# dGVkMS4wLAYDVQQDEyVTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIFJvb3Qg
# UjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAiJ3YuUVnnR3d6Lkm
# gZpUVMB8SQWbzFoVD9mUEES0QUCBdxSZqdTkdizICFNeINCSJS+lV1ipnW5ihkQy
# C0cRLWXUJzodqpnMRs46npiJPHrfLBOifjfhpdXJ2aHHsPHggGsCi7uE0awqKggE
# /LkYw3sqaBia67h/3awoqNvGqiFRJ+OTWYmUCO2GAXsePHi+/JUNAax3kpqstbl3
# vcTdOGhtKShvZIvjwulRH87rbukNyHGWX5tNK/WABKf+Gnoi4cmisS7oSimgHUI0
# Wn/4elNd40BFdSZ1EwpuddZ+Wr7+Dfo0lcHflm/FDDrOJ3rWqauUP8hsokDoI7D/
# yUVI9DAE/WK3Jl3C4LKwIpn1mNzMyptRwsXKrop06m7NUNHdlTDEMovXAIDGAvYy
# nPt5lutv8lZeI5w3MOlCybAZDpK3Dy1MKo+6aEtE9vtiTMzz/o2dYfdP0KWZwZIX
# bYsTIlg1YIetCpi5s14qiXOpRsKqFKqav9R1R5vj3NgevsAsvxsAnI8Oa5s2oy25
# qhsoBIGo/zi6GpxFj+mOdh35Xn91y72J4RGOJEoqzEIbW3q0b2iPuWLA911cRxgY
# 5SJYubvjay3nSMbBPPFsyl6mY4/WYucmyS9lo3l7jk27MAe145GWxK4O3m3gEFEI
# kv7kRmefDR7Oe2T1HxAnICQvr9sCAwEAAaOCARYwggESMB8GA1UdIwQYMBaAFFN5
# v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBT2d2rdP/0BE/8WoWyCAi/QCj0U
# JTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUEDDAKBggr
# BgEFBQcDCDARBgNVHSAECjAIMAYGBFUdIAAwUAYDVR0fBEkwRzBFoEOgQYY/aHR0
# cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25B
# dXRob3JpdHkuY3JsMDUGCCsGAQUFBwEBBCkwJzAlBggrBgEFBQcwAYYZaHR0cDov
# L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEADr5lQe1oRLjl
# ocXUEYfktzsljOt+2sgXke3Y8UPEooU5y39rAARaAdAxUeiX1ktLJ3+lgxtoLQhn
# 5cFb3GF2SSZRX8ptQ6IvuD3wz/LNHKpQ5nX8hjsDLRhsyeIiJsms9yAWnvdYOdEM
# q1W61KE9JlBkB20XBee6JaXx4UBErc+YuoSb1SxVf7nkNtUjPfcxuFtrQdRMRi/f
# InV/AobE8Gw/8yBMQKKaHt5eia8ybT8Y/Ffa6HAJyz9gvEOcF1VWXG8OMeM7Vy7B
# s6mSIkYeYtddU1ux1dQLbEGur18ut97wgGwDiGinCwKPyFO7ApcmVJOtlw9FVJxw
# /mL1TbyBns4zOgkaXFnnfzg4qbSvnrwyj1NiurMp4pmAWjR+Pb/SIduPnmFzbSN/
# G8reZCL4fvGlvPFk4Uab/JVCSmj59+/mB2Gn6G/UYOy8k60mKcmaAZsEVkhOFuoj
# 4we8CYyaR9vd9PGZKSinaZIkvVjbH/3nlLb0a7SBIkiRzfPfS9T+JesylbHa1LtR
# V9U/7m0q7Ma2CQ/t392ioOssXW7oKLdOmMBl14suVFBmbzrt5V5cQPnwtd3UOTpS
# 9oCG+ZZheiIvPgkDmA8FzPsnfXW5qHELB43ET7HHFHeRPRYrMBKjkb8/IN7Po0d0
# hQoF4TeMM+zYAJzoKQnVKOLg8pZVPT8wgga5MIIEoaADAgECAhEAmaOACiZVO2Wr
# 3G6EprPqOTANBgkqhkiG9w0BAQwFADCBgDELMAkGA1UEBhMCUEwxIjAgBgNVBAoT
# GVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0
# aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0
# d29yayBDQSAyMB4XDTIxMDUxOTA1MzIxOFoXDTM2MDUxODA1MzIxOFowVjELMAkG
# A1UEBhMCUEwxITAfBgNVBAoTGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjEkMCIG
# A1UEAxMbQ2VydHVtIENvZGUgU2lnbmluZyAyMDIxIENBMIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEAnSPPBDAjO8FGLOczcz5jXXp1ur5cTbq96y34vuTm
# flN4mSAfgLKTvggv24/rWiVGzGxT9YEASVMw1Aj8ewTS4IndU8s7VS5+djSoMcbv
# IKck6+hI1shsylP4JyLvmxwLHtSworV9wmjhNd627h27a8RdrT1PH9ud0IF+njvM
# k2xqbNTIPsnWtw3E7DmDoUmDQiYi/ucJ42fcHqBkbbxYDB7SYOouu9Tj1yHIohzu
# C8KNqfcYf7Z4/iZgkBJ+UFNDcc6zokZ2uJIxWgPWXMEmhu1gMXgv8aGUsRdaCtVD
# 2bSlbfsq7BiqljjaCun+RJgTgFRCtsuAEw0pG9+FA+yQN9n/kZtMLK+Wo837Q4QO
# ZgYqVWQ4x6cM7/G0yswg1ElLlJj6NYKLw9EcBXE7TF3HybZtYvj9lDV2nT8mFSkc
# SkAExzd4prHwYjUXTeZIlVXqj+eaYqoMTpMrfh5MCAOIG5knN4Q/JHuurfTI5XDY
# O962WZayx7ACFf5ydJpoEowSP07YaBiQ8nXpDkNrUA9g7qf/rCkKbWpQ5boufUnq
# 1UiYPIAHlezf4muJqxqIns/kqld6JVX8cixbd6PzkDpwZo4SlADaCi2JSplKShBS
# ND36E/ENVv8urPS0yOnpG4tIoBGxVCARPCg1BnyMJ4rBJAcOSnAWd18Jx5n858JS
# qPECAwEAAaOCAVUwggFRMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFN10XUwA
# 23ufoHTKsW73PMAywHDNMB8GA1UdIwQYMBaAFLahVDkCw6A/joq8+tT4HKbROg79
# MA4GA1UdDwEB/wQEAwIBBjATBgNVHSUEDDAKBggrBgEFBQcDAzAwBgNVHR8EKTAn
# MCWgI6Ahhh9odHRwOi8vY3JsLmNlcnR1bS5wbC9jdG5jYTIuY3JsMGwGCCsGAQUF
# BwEBBGAwXjAoBggrBgEFBQcwAYYcaHR0cDovL3N1YmNhLm9jc3AtY2VydHVtLmNv
# bTAyBggrBgEFBQcwAoYmaHR0cDovL3JlcG9zaXRvcnkuY2VydHVtLnBsL2N0bmNh
# Mi5jZXIwOQYDVR0gBDIwMDAuBgRVHSAAMCYwJAYIKwYBBQUHAgEWGGh0dHA6Ly93
# d3cuY2VydHVtLnBsL0NQUzANBgkqhkiG9w0BAQwFAAOCAgEAdYhYD+WPUCiaU58Q
# 7EP89DttyZqGYn2XRDhJkL6P+/T0IPZyxfxiXumYlARMgwRzLRUStJl490L94C9L
# GF3vjzzH8Jq3iR74BRlkO18J3zIdmCKQa5LyZ48IfICJTZVJeChDUyuQy6rGDxLU
# UAsO0eqeLNhLVsgw6/zOfImNlARKn1FP7o0fTbj8ipNGxHBIutiRsWrhWM2f8pXd
# d3x2mbJCKKtl2s42g9KUJHEIiLni9ByoqIUul4GblLQigO0ugh7bWRLDm0CdY9rN
# LqyA3ahe8WlxVWkxyrQLjH8ItI17RdySaYayX3PhRSC4Am1/7mATwZWwSD+B7eMc
# ZNhpn8zJ+6MTyE6YoEBSRVrs0zFFIHUR08Wk0ikSf+lIe5Iv6RY3/bFAEloMU+vU
# BfSouCReZwSLo8WdrDlPXtR0gicDnytO7eZ5827NS2x7gCBibESYkOh1/w1tVxTp
# V2Na3PR7nxYVlPu1JPoRZCbH86gc96UTvuWiOruWmyOEMLOGGniR+x+zPF/2DaGg
# K2W1eEJfo2qyrBNPvF7wuAyQfiFXLwvWHamoYtPZo0LHuH8X3n9C+xN4YaNjt2yw
# zOr+tKyEVAotnyU9vyEVOaIYMk3IeBrmFnn0gbKeTTyYeEEUz/Qwt4HOUBCrW602
# NCmvO1nm+/80nLy5r0AZvCQxaQ4xggXDMIIFvwIBATBqMFYxCzAJBgNVBAYTAlBM
# MSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0Nl
# cnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBDQQIQCDJPnbfakW9j5PKjPF5dUTANBglg
# hkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3
# DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV
# MC8GCSqGSIb3DQEJBDEiBCBgsuhjqD1fO2QtmP7SMdJsihBMYUJH4ZirTp/82cGs
# jDANBgkqhkiG9w0BAQEFAASCAYCDJWaPvmmo4wgep7qvPVFOHxetgld8AIrvMdAv
# x6wzXM+HCnj0/SOZ6Gw0RcbqweG+3ssp2Jg6eSstivQ+VWh3mIuF3CZy66Jv6w7n
# rZRLTM57b9G22FCu5VTsn7PzvkVW1UQz4WrLA/fsok2ST19vbdiyDorA65xft+yQ
# uZl97pez2R1TB9Mw1vaSnSyGjmzTsXSWe6BiANjaz/eYwpqOzk/8aAv7gdDRuFuT
# ax7aOH7OgnIwWQMEKHDjtv/cW9OJiL2AbXpXaWZlZis7k3fQl1AKrMpH4dvZ1LHf
# V+Itc0NjgjZKLTT6a0ljJx5cUZp1SqwwawxkG/lDFic5XI/hx1YM4KEtu8hoDbxD
# VBkMtoOon8uj8gGboTv+MKD7qsX6HbzPeK1qmqqOeHjmXQdZGtsWpyjTSq4tzVx8
# /Zv0ZYZYhyOMnxHmma0f/EPGoPEOyNiROQRXS4ZnTXrmlx2Wwvo/B196xmt3XMuO
# pPxMHd4H1v77ntzwcmpkpyboQdOhggMjMIIDHwYJKoZIhvcNAQkGMYIDEDCCAwwC
# AQEwajBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSww
# KgYDVQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNgIRAKQp
# O24e3denNAiHrXpOtyQwDQYJYIZIAWUDBAICBQCgeTAYBgkqhkiG9w0BCQMxCwYJ
# KoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNjAxMzAxMTAxMDFaMD8GCSqGSIb3
# DQEJBDEyBDCocNubi7sHLISopcTKkzKFv/61THr23A+mj43OPBBGVoATDuWAWYm2
# VIbOCMygNZkwDQYJKoZIhvcNAQEBBQAEggIAik2aS0MkD4akgnBQOvsQ6LTB/o6X
# ulrDCTlwjk2mXtELZAFFfV3f+E+FL4BnzFlyJmo8fa3VV5djIdoCt5YwPZ2hL6bN
# j0SP/i4L8dCGRA0iOI8kZbITtB8oXjwtumRyTbMs8jAqA2vhhc87NoGbUPs5P84/
# h8lwUfg74OELAP7JPcW89wderaIw1YFepQFvB0HdoCKXLjyIx2tVoaGq6+p+Cg61
# gAT+55iO+Vn99f6WJE+WmLXXDw3FNxVzuwoDO8KUsO3D1Hvcb3FmuCrs+IAxvgdp
# oqQ+hTkr9zEfr1P7hvACoSxyYmD8VHz6uCaB05ymzCyiwCGROhtv2qR4nmmQOOBU
# JdSOCwdmlt8cKagkieXAH3lY7kuWz5qOSujqkZFLvyxRB02cDzxY4nBaeQkvagd7
# 9khFi+Q7NKPlPMhKvHFyfY/Q7dvAo1T3H20zVscsDcFGu8pv0GsPo5dTSlsv24E+
# MvGbphjo5kHry12pavHjdkoLWRBPBVCRoNAB8UbofEUKek1hRn7gVS4sWU4x2YJ4
# U4FzwIRG4/cxeySTRfIE5M3RNN5JM+O6CLR29Cj6ezgF3mtzL1L8U7BmHyMzGgmR
# 7mQbHhqCzJ/3SOD9/nxoU1GLWZ+XU6u1Tl6lChRSCGQgBsMtUj+sJghejFvHdkQo
# ktSQT6D4rCjDOLc=
# SIG # End signature block