Public/SCJBServerTeamTools.ps1

function SCJBServerTeamTools {
    <#
    .LINK
        https://www.powershellgallery.com/packages/SCJBServerTeamTools
    .EXAMPLE
        SCJBServerTeamTools
        Open to the home window
    .EXAMPLE
        SCJBServerTeamTools -QuickLaunch RSOP
        Open to the RSOP window
    #>


    # MAIN TODO
    # - function for creating windows (leave out variable creation) or a foreach of each .xml in the assets folder.
    # - find textblock as databinding https://stackoverflow.com/questions/75673323/convert-powershell-output-to-datagrid-in-wpf
    # - help window
    # - better handling of no connection to DC
    # - fix SCCM Devices
    # - recursive search includes the group their in
    # - update checking added back
    # - sccm server and default collection not displaying
    # - sccm and exchange check box not honoring.
    # - computer tab: installed updates and other gathered information.
    # - when settings are saved, can/should they be reloaded to update the $STTSettings object?
    # - enter triggers Run Report in RSOP
    # - get installed software on computer tab
    # - PDQ feature setting for installed software pulling from there or live.
    # - sccm deployment window
    # - test permissions on remote computer before running something

    [CmdletBinding()]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'Blackholes are fun.')]

    param (
        [Parameter(Mandatory = $false)]
        [ValidateSet('ADLookups', 'RSOP')]
        [string]
        $QuickLaunch
    )

    # WPF framework
    Add-Type -AssemblyName PresentationFramework

    # Windows Form framework (message boxes)
    Add-Type -AssemblyName System.Windows.Forms
    # Add-Type -AssemblyName System.Drawing

    #region Pre-run checks
    if ((Get-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools).State -eq 'NotPresent') {
        Write-Warning 'RSAT AD Tools must be installed prior to use.'
        break
    }

    Write-Verbose 'Checking for first run'
    if (!(Test-Path -Path $env:APPDATA\LoganShell)) {
        # App directory doesn't exist
        Write-Verbose 'First Run, creating directory and saving settings.'
        $Blackhole = New-Item -Path $env:APPDATA -Name 'LoganShell' -ItemType Directory
        Write-Verbose 'Prompting for initial input'

        $userinput = Read-Host -Prompt 'Do you want to enable SCCM functionality? (Y/N)'
        switch ($userinput) {
            'Y' {
                $EnableSCCM = $true
                $SCCMServerInput = Read-Host -Prompt 'What is the hostname for the SCCM server?'
            }
            'N' {
                $EnableSCCM = $false
            }
            default {
                Write-Host 'Invalid option. Run again.'
                break
            }
        }

        $userinput = Read-Host -Prompt 'Do you want to enable Exchange on-premise functionality? (Y/N)'
        switch ($userinput) {
            'Y' {
                $EnableExchange = $true
            }
            'N' {
                $EnableExchange = $false
            }
            default {
                Write-Host 'Invalid option. Run again.'
                break
            }
        }

        Write-Verbose 'Set PDCEmulator DC as default'
        $DefaultDC = (Get-ADDomainController -Filter * | Where-Object OperationMasterRoles -Contains 'PDCEmulator').Name

        try {
            # Save default settings
            _InitialSettings -Path "$env:APPDATA\LoganShell\" -SCCM:$EnableSCCM -SCCMServer $SCCMServerInput -Exchange:$EnableExchange -DefaultDC $DefaultDC -ErrorAction Stop
        }
        catch {
            throw $_
        }
        Write-Verbose 'Done setting up for first run.'
    }

    Write-Verbose 'Loading Settings'
    try {
        $Script:STTSettings = _LoadSettings -File $env:APPDATA\LoganShell\Settings.json -ErrorAction Stop
    }
    catch {
        throw $_
    }

    if ($STTSettings.DCSettings.DomainController) {
        $Script:GetObjectSplat = @{
            Server = $STTSettings.DCSettings.DomainController
        }
    }
    else {
        $Script:GetObjectSplat = @{
        }
    }
    #endregion

    #region HomeWindow
    $xamlFile = "$ModuleRoot\Assets\HomeWindow.xaml"

    #create window
    $inputXML = Get-Content $xamlFile -Raw
    $inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace 'x:N', 'N' -replace '^<Win.*', '<Window'
    [XML]$XAML = $inputXML

    #Read XAML
    $reader = (New-Object System.Xml.XmlNodeReader $xaml)
    try {
        $HomeWindow = [Windows.Markup.XamlReader]::Load( $reader )
    }
    catch {
        Write-Warning $_.Exception
        throw
    }

    $xaml.SelectNodes('//*[@Name]') | ForEach-Object {
        try {
            Set-Variable -Name "HomeWindow_$($_.Name)" -Value $HomeWindow.FindName($_.Name) -ErrorAction Stop
        }
        catch {
            throw
        }
    }
    #endregion

    #region RSOP
    $xamlFile = "$ModuleRoot\Assets\RSOP.xaml"

    #create window
    $inputXML = Get-Content $xamlFile -Raw
    $inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace 'x:N', 'N' -replace '^<Win.*', '<Window'
    [XML]$XAML = $inputXML

    #Read XAML
    $reader = (New-Object System.Xml.XmlNodeReader $xaml)
    try {
        $RSOP = [Windows.Markup.XamlReader]::Load( $reader )
    }
    catch {
        Write-Warning $_.Exception
        throw
    }

    $xaml.SelectNodes('//*[@Name]') | ForEach-Object {
        try {
            Set-Variable -Name "RSOP_$($_.Name)" -Value $RSOP.FindName($_.Name) -ErrorAction Stop
        }
        catch {
            throw
        }
    }
    #endregion

    #region ADLookups
    $xamlFile = "$ModuleRoot\Assets\ADLookups.xaml"

    #create window
    $inputXML = Get-Content $xamlFile -Raw
    $inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace 'x:N', 'N' -replace '^<Win.*', '<Window'
    [XML]$XAML = $inputXML

    #Read XAML
    $reader = (New-Object System.Xml.XmlNodeReader $xaml)
    try {
        $ADLookups = [Windows.Markup.XamlReader]::Load( $reader )
    }
    catch {
        Write-Warning $_.Exception
        throw
    }

    $xaml.SelectNodes('//*[@Name]') | ForEach-Object {
        try {
            Set-Variable -Name "ADLookups_$($_.Name)" -Value $ADLookups.FindName($_.Name) -ErrorAction Stop
        }
        catch {
            throw
        }
    }
    #endregion

    _HomeWindowUIEvents
    _ADLookupsUIEvents
    _RSOPWindowUIEvents

    switch ($QuickLaunch) {
        'ADLookups' {
            Write-Output 'Loading ADLookups....'
            $null = $ADLookups.ShowDialog()
        }
        'RSOP' {
            Write-Output 'Loading RSOP....'
            $null = $RSOP.ShowDialog()
        }
        Default {
            $null = $HomeWindow.ShowDialog()
        }
    }
}
# SIG # Begin signature block
# MIImiQYJKoZIhvcNAQcCoIImejCCJnYCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUAJUyV7t0yao/qHJI5wmTTIrH
# a72ggiC0MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0B
# AQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk
# IElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQsw
# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw
# ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz
# 7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS
# 5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7
# bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfI
# SKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jH
# trHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14
# Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2
# h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt
# 6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPR
# iQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ER
# ElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4K
# Jpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAd
# BgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SS
# y4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAC
# hjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURS
# b290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRV
# HSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyh
# hyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO
# 0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo
# 8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++h
# UD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5x
# aiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIGPjCCBCag
# AwIBAgITZAAAAAT67s1SpFDmsAAAAAAABDANBgkqhkiG9w0BAQwFADAXMRUwEwYD
# VQQDEwxTQ0pEIFJvb3QgQ0EwHhcNMjQwMjA2MTc0NDQ4WhcNMzkwMjA2MTc1NDQ4
# WjBjMRMwEQYKCZImiZPyLGQBGRYDb3JnMRgwFgYKCZImiZPyLGQBGRYIc2Njb3Vy
# dHMxGDAWBgoJkiaJk/IsZAEZFghpbnRlcm5hbDEYMBYGA1UEAxMPU0NKRCBJc3N1
# aW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5DLg7pXEZCNb
# EPyFNct8EI9a6YNjDxhcCQS5hS1xThzcz4ADpjYOywz70aew97E5CFEjIFLBEpWd
# sQ/cf4KNPpfEEBHTFvuka/rUZMtfP1bESIHJVSgSgf2NCKKQ41jYeRcnqrc7KHoo
# aT7mHUJRFjURmFF12iqyhqcu5gEI1SSc6Mz5+2y+SYMySYO4OIIlV44jcgViDXKc
# 16Xt9GKBPTTevJQHPnvfyDPRA62VtMW2bDY2zk4HnxFYYuiNvxv32IwN7fRgJu5X
# IhMCgjs/c0yFmeyUZ99QLNDCcXUyr03PNxmaNiwyDA9Idtn7JfLQf5EyHteejcUy
# xuxJVt4a6+YeVQXB3ZdnW8grVh8brG/+mi0Us0XWKJ+pi4KvrjHvh9cKRNvL+F59
# d472ZN+7+gkXOJi8ILvOx2EJY82yfYpPnyQkyfce9YSDud3+h2sNAvjX7ZIkmaY8
# 6NjREEbWOwxGku+Mn5x54GMGq7YKzIil73AWKGRdZiU0ywHBTSoaK1lw5sphW+9F
# V8Bdn7CYhbLzKhHjOxPGngB7yn3U5n6uN7EnWQSqouKetmU+fRX3dVtwcVR419F3
# 6WjWCmAWfaJAja4Xy5PidYdEeE6x6sUYCyrusbc1NAy8PQ74PaRczK/mGRuwStuC
# 4XAZ7IScrjuz+VsBEiy0cP8tnxcVB20CAwEAAaOCATUwggExMBAGCSsGAQQBgjcV
# AQQDAgEBMCMGCSsGAQQBgjcVAgQWBBT7/ZbSo/lUKHe1I7Opxo6jEFsofjAdBgNV
# HQ4EFgQUbHWbLF6RTmsK1/ryWaXsnTRw21IwGQYJKwYBBAGCNxQCBAweCgBTAHUA
# YgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU
# 0V4RhBwKFIA1uI8UCmztqBjIr9AwOQYDVR0fBDIwMDAuoCygKoYoaHR0cDovL3d3
# dy5zY2NvdXJ0cy5vcmcvcGtpL1NDSkRSb290LmNybDBEBggrBgEFBQcBAQQ4MDYw
# NAYIKwYBBQUHMAKGKGh0dHA6Ly93d3cuc2Njb3VydHMub3JnL3BraS9TQ0pEUm9v
# dC5jcnQwDQYJKoZIhvcNAQEMBQADggIBADbUWpbxeQsZWsLw+/H/6M3Io3LK0k+o
# jYqp7cihcSnF220wpvby6TYELB+jFl/+UZCRFRN5HjOH5PqMemRjeTAskL1ZL9Y1
# 5/ws4SpQjcsCmkMIj9u7gudqvY8qjP/hrmhrpbVmQmsnXYsamJKVjupZzuID2DzM
# n3fYhzA0UqUlwm74HowixlX+lr2CG6b9Mpz+8X07EtB7EZInuE7Uxbkr8xWoK/9B
# 9WyyhDMzGzIyHdcv6Wn/Db87W6Zu8QF+7qB/bDdUfhRdfp3+CzkgC6awdQdaTK2t
# g/6UD0p67dLjwhFzwrczMaJGD7ThgQEco7Tb2pNZYyHRRfOaTejS13hh8gxp564u
# Umt0yaDjfJHg/pTom07nWv//thJm+i9GDZwgI8riVDTDaH/Q3/G5SJCWFswF5hen
# V+YwraeHaIXz9BpfoYSbF66DAWLoDyPZychoc6evvdpHnGjHYT1LBM1alymB5urN
# qFLXrOS793p1mf+kxHOrputOvE5sOon8KSeal2MTmdmlkJkG1RIEbHvwAefm4QKH
# gias09AODT/Y6hDiFJ1Yjnq2ChU/lLjx8Tv12oXqqCf3ehp9lWUIJqupcT86/miT
# RX4H1LUJcXOkCoXkgW1E8rNEcHGpu8Uy/ObaOYfpx2PVormBU5pyvLLkCMm/aRhi
# 1/YWJWFbA08GMIIGrjCCBJagAwIBAgIQBzY3tyRUfNhHrP0oZipeWzANBgkqhkiG
# 9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw
# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVz
# dGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcNMzcwMzIyMjM1OTU5WjBjMQsw
# CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRp
# Z2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENB
# MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxoY1BkmzwT1ySVFVxyUD
# xPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+kiPNo+n3znIkLf50fng8zH1AT
# CyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+vaPcQXf6sZKz5C3GeO6lE98NZW
# 1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RBidx8ald68Dd5n12sy+iEZLRS
# 8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn7w6lY2zkpsUdzTYNXNXmG6jB
# ZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAxE6lXKZYnLvWHpo9OdhVVJnCY
# Jn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB3iIU2YIqx5K/oN7jPqJz+ucf
# WmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNCaJ+2RrOdOqPVA+C/8KI8ykLc
# GEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklSUPRR8zZJTYsg0ixXNXkrqPNF
# YLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP015LdhJRk8mMDDtbiiKowSYI
# +RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXiYKNYCQEoAA6EVO7O6V3IXjAS
# vUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQIMAYBAf8C
# AQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCPnshvMB8GA1UdIwQYMBaAFOzX
# 44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggr
# BgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3Nw
# LmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNl
# cnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDag
# NIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RH
# NC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3
# DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULhsBguEE0TzzBTzr8Y+8dQXeJL
# Kftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAlNDFnzbYSlm/EUExiHQwIgqgW
# valWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XNQ1/tYLaqT5Fmniye4Iqs5f2M
# vGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ8NWKcXZl2szwcqMj+sAngkSu
# mScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDnmPv7pp1yr8THwcFqcdnGE4AJ
# xLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsdCEkPlM05et3/JWOZJyw9P2un
# 8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcma+Q4c6umAU+9Pzt4rUyt+8SV
# e+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+8kaddSweJywm228Vex4Ziza4
# k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6KYawmKAr7ZVBtzrVFZgxtGIJ
# Dwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAjfwAL5HYCJtnwZXZCpimHCUcr
# 5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucTDh3bNzgaoSv27dZ8/DCCBrww
# ggSkoAMCAQICEAuuZrxaun+Vh8b56QTjMwQwDQYJKoZIhvcNAQELBQAwYzELMAkG
# A1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdp
# Q2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAe
# Fw0yNDA5MjYwMDAwMDBaFw0zNTExMjUyMzU5NTlaMEIxCzAJBgNVBAYTAlVTMREw
# DwYDVQQKEwhEaWdpQ2VydDEgMB4GA1UEAxMXRGlnaUNlcnQgVGltZXN0YW1wIDIw
# MjQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC+anOf9pUhq5Ywultt
# 5lmjtej9kR8YxIg7apnjpcH9CjAgQxK+CMR0Rne/i+utMeV5bUlYYSuuM4vQngvQ
# epVHVzNLO9RDnEXvPghCaft0djvKKO+hDu6ObS7rJcXa/UKvNminKQPTv/1+kBPg
# HGlP28mgmoCw/xi6FG9+Un1h4eN6zh926SxMe6We2r1Z6VFZj75MU/HNmtsgtFjK
# fITLutLWUdAoWle+jYZ49+wxGE1/UXjWfISDmHuI5e/6+NfQrxGFSKx+rDdNMseP
# W6FLrphfYtk/FLihp/feun0eV+pIF496OVh4R1TvjQYpAztJpVIfdNsEvxHofBf1
# BWkadc+Up0Th8EifkEEWdX4rA/FE1Q0rqViTbLVZIqi6viEk3RIySho1XyHLIAOJ
# fXG5PEppc3XYeBH7xa6VTZ3rOHNeiYnY+V4j1XbJ+Z9dI8ZhqcaDHOoj5KGg4Yui
# Yx3eYm33aebsyF6eD9MF5IDbPgjvwmnAalNEeJPvIeoGJXaeBQjIK13SlnzODdLt
# uThALhGtyconcVuPI8AaiCaiJnfdzUcb3dWnqUnjXkRFwLtsVAxFvGqsxUA2Jq/W
# TjbnNjIUzIs3ITVC6VBKAOlb2u29Vwgfta8b2ypi6n2PzP0nVepsFk8nlcuWfyZL
# zBaZ0MucEdeBiXL+nUOGhCjl+QIDAQABo4IBizCCAYcwDgYDVR0PAQH/BAQDAgeA
# MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwIAYDVR0gBBkw
# FzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMB8GA1UdIwQYMBaAFLoW2W1NhS9zKXaa
# L3WMaiCPnshvMB0GA1UdDgQWBBSfVywDdw4oFZBmpWNe7k+SH3agWzBaBgNVHR8E
# UzBRME+gTaBLhklodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz
# dGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3JsMIGQBggrBgEFBQcB
# AQSBgzCBgDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFgG
# CCsGAQUFBzAChkxodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRU
# cnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3
# DQEBCwUAA4ICAQA9rR4fdplb4ziEEkfZQ5H2EdubTggd0ShPz9Pce4FLJl6reNKL
# kZd5Y/vEIqFWKt4oKcKz7wZmXa5VgW9B76k9NJxUl4JlKwyjUkKhk3aYx7D8vi2m
# pU1tKlY71AYXB8wTLrQeh83pXnWwwsxc1Mt+FWqz57yFq6laICtKjPICYYf/qgxA
# CHTvypGHrC8k1TqCeHk6u4I/VBQC9VK7iSpU5wlWjNlHlFFv/M93748YTeoXU/fF
# a9hWJQkuzG2+B7+bMDvmgF8VlJt1qQcl7YFUMYgZU1WM6nyw23vT6QSgwX5Pq2m0
# xQ2V6FJHu8z4LXe/371k5QrN9FQBhLLISZi2yemW0P8ZZfx4zvSWzVXpAb9k4Hpv
# pi6bUe8iK6WonUSV6yPlMwerwJZP/Gtbu3CKldMnn+LmmRTkTXpFIEB06nXZrDwh
# CGED+8RsWQSIXZpuG4WLFQOhtloDRWGoCwwc6ZpPddOFkM2LlTbMcqFSzm4cd0bo
# GhBq7vkqI1uHRz6Fq1IX7TaRQuR+0BGOzISkcqwXu7nMpFu3mgrlgbAW+BzikRVQ
# 3K2YHcGkiKjA4gi4OA/kz1YCsdhIBHXqBzR0/Zd2QwQ/l4Gxftt/8wY3grcc/nS/
# /TVkej9nmUYu83BDtccHHXKibMs/yXHhDXNkoPIdynhVAku7aRZOwqw6pDCCB2sw
# ggVToAMCAQICExwAAP27cTgi6HzZv/cAAAAA/bswDQYJKoZIhvcNAQEMBQAwYzET
# MBEGCgmSJomT8ixkARkWA29yZzEYMBYGCgmSJomT8ixkARkWCHNjY291cnRzMRgw
# FgYKCZImiZPyLGQBGRYIaW50ZXJuYWwxGDAWBgNVBAMTD1NDSkQgSXNzdWluZyBD
# QTAeFw0yMzA2MTIxMzI5NDVaFw0yNTA2MTExMzI5NDVaMBcxFTATBgNVBAMTDENv
# ZGUgU2lnbmluZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKvKpx2W
# kRtORFfBVlp92yFlMBWOfFeomnTC1d/b4D4gpY1U6byZ2xHQ60AOPKtTbjly/bRr
# hHSbjyiU/n0YEenMzep9jzHjhFF9Z0Y9WsvAnCZJaTwjYV6McsaGDIdoSCW/1z24
# f+N2lShPwnE1cWKtn8Rwr1tCKh6Ihci4DHglnoTWb6uKLpW9p+VzLHIXS9ElC33X
# SrgDmod1Y1EKqcrRicv18oKvHPYgG0aGr4WanMlz4W86yljTy700lKMNgUXhQ1aI
# yQ9jlvJapFWib0XAvPkNoHbhDRJqVIHfvOQb2I8QgnAiykmCmx+LUg5Ny2ar/bp0
# G+V44akGWHHh7zUCAwEAAaOCA2IwggNeMAsGA1UdDwQEAwIHgDA9BgkrBgEEAYI3
# FQcEMDAuBiYrBgEEAYI3FQiJnTuD1N1hhdGZPoWp62yHqoEogV6F/JcFg8OTTQIB
# ZAIBCTAdBgNVHQ4EFgQUDOq2blLWBczbzNM1J9+/IFibAdEwHwYDVR0jBBgwFoAU
# bHWbLF6RTmsK1/ryWaXsnTRw21IwggEJBgNVHR8EggEAMIH9MIH6oIH3oIH0hoHE
# bGRhcDovLy9DTj1TQ0pEJTIwSXNzdWluZyUyMENBLENOPUFEQ1MsQ049Q0RQLENO
# PVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3Vy
# YXRpb24sREM9aW50ZXJuYWwsREM9c2Njb3VydHMsREM9b3JnP2NlcnRpZmljYXRl
# UmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Q
# b2ludIYraHR0cDovL3d3dy5zY2NvdXJ0cy5vcmcvcGtpL1NDSkRJc3N1aW5nLmNy
# bDCCAQsGCCsGAQUFBwEBBIH+MIH7MIG/BggrBgEFBQcwAoaBsmxkYXA6Ly8vQ049
# U0NKRCUyMElzc3VpbmclMjBDQSxDTj1BSUEsQ049UHVibGljJTIwS2V5JTIwU2Vy
# dmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1pbnRlcm5hbCxE
# Qz1zY2NvdXJ0cyxEQz1vcmc/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNz
# PWNlcnRpZmljYXRpb25BdXRob3JpdHkwNwYIKwYBBQUHMAKGK2h0dHA6Ly93d3cu
# c2Njb3VydHMub3JnL3BraS9TQ0pESXNzdWluZy5jcnQwEwYDVR0lBAwwCgYIKwYB
# BQUHAwMwGwYJKwYBBAGCNxUKBA4wDDAKBggrBgEFBQcDAzAyBgNVHREEKzApggxD
# b2RlX1NpZ25pbmeCGUNvZGVfU2lnbmluZ0BzY2NvdXJ0cy5vcmcwTgYJKwYBBAGC
# NxkCBEEwP6A9BgorBgEEAYI3GQIBoC8ELVMtMS01LTIxLTgyMzUxODIwNC04Mzk1
# MjIxMTUtMTgwMTY3NDUzMS0zMTIxODANBgkqhkiG9w0BAQwFAAOCAgEAGzYDoLuK
# HdWiR4VSWPsu8I9SN2uwk1iAl/twFlNN6jwJKn/C7J4uFYvlhZoYMfO9AeCK8Vg/
# 4DjovR1pSMD/3gCGRmijKQ32rgxDPZlX6DYWX5bxJRzYDxc737AO5jISuE2WwTF4
# W6WhFxZpeBU9aedel3htKxRlvClsp5wBuhxAUypH5BXowJwhi8q4bab1DT1mYoBN
# hS5htYfqYI9gn96iP02XXjFcSrNAzhpN6mgA2BG3V05KnNalIW/BrTLYSDFz2+O8
# W0j2duLNCNFnOw9G/aYOlvN/mYeXGJjpLCqBv6jEC/kYXyvxUCGFfz/akNPMgUhJ
# PtSbCzM4o8RzJIsItjcHqTafR4Dv4XZ/fT3qPgS3aKrGe8tCYVARLSPkGKXqBpPp
# i89hM6Y22qI1fpxPS0UY8/H9TqO753Mh8DMBA23kHJ8rr4BrvkMIdLz7/DXjkBPH
# mfz78Xl2vlzcyn0JeSPba/YACIwVSA3QJjeKncE6uyXvmcRODBoXy7An02+F2c4s
# QsPXznENriI36G1KYIt1Id6AU4VX9vonnp5MP/7XR73zm1+ktq2tbL2zZ6juc0/t
# h983edyq9X1w2nDvF/juqATaEbugNlGAToeuJGO5r/Vgl8uJYdnQ1Z8KUqFtHDE3
# C3Npoi8q37JHS0EyegZcMzCJ+vrt7OJI5OgxggU/MIIFOwIBATB6MGMxEzARBgoJ
# kiaJk/IsZAEZFgNvcmcxGDAWBgoJkiaJk/IsZAEZFghzY2NvdXJ0czEYMBYGCgmS
# JomT8ixkARkWCGludGVybmFsMRgwFgYDVQQDEw9TQ0pEIElzc3VpbmcgQ0ECExwA
# AP27cTgi6HzZv/cAAAAA/bswCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAI
# oAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIB
# CzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFAr6/RnnfW3OM/gsqdtr
# 9+nSqew3MA0GCSqGSIb3DQEBAQUABIIBABArQH2m4sFii0Ih+5Z+e+YvSt8UHLEa
# WN54Ma3Ya7KwwoGJtXijBQBWgkyVUSDIUjHGyesdb8FH07bwxTo0W02VXcH4oV0f
# jxZnBvrC5883Yj6gLsYBVQKhKYmMVI/uQ1+zYLQ08DzSxVuL9APgdLOOCDOpZTqy
# ZxMo9OamUN21hPCcbvxkyK2lSguO5uDKietFD9H/UkTD8V7VA27kq29ysYN6J+Uo
# ljcta5tX6lfUs/kU9bjf/UeloluLnO5aar97UrbWV+CwT7qv/8zoZL0cJKM4yECj
# KOLszbrcd8AagJJ2nkj8XmlZcKJF2cbXZF4bP6CEu0ik42gxXUquQjChggMgMIID
# HAYJKoZIhvcNAQkGMYIDDTCCAwkCAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUGA1UE
# ChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQg
# UlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBAhALrma8Wrp/lYfG+ekE4zME
# MA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkq
# hkiG9w0BCQUxDxcNMjUwMTAzMTUzODIxWjAvBgkqhkiG9w0BCQQxIgQgWx9n0rHU
# iFpJhd8eFtpz3jP4ZYXCUuH0u71VFctch5QwDQYJKoZIhvcNAQEBBQAEggIAiMOn
# B1JxaZcXrOSLARKtFqMVbTGwaNiN3MfL7GtlXv5GUYetFGCow1H8GUpqnDE17FDL
# yfYjHzuK6d9FJ2vm3Up7R6auSOsaZ1J5FumPmHrlll7kn1DmcPQVDM0Li2+WlLOs
# Ran59x0z8m2Y1fAsU0NwkPwIjNZvO94JaKvkoF+Tj6d1ItUwDL70h8ZTiTAhnFFv
# 76jdoeR6nNwsoK4ERjOvLSV29/Mq/SL5+5+ybVGpKzZYPnR0O8blcfWWDBtk6b0a
# NLcPHtKvwbXb69iTjlQguiyVCtam8/0zfsK/0ggeKZRQeNXXKEMcwLqgVOtqN7lR
# t7m2R0dcrzCz0XEiUltRQNyVHblT+WyNuXpDhlyn1kYVsg4HCT9u1MzdqLsLfFxN
# s5ZclfKS2pQtrd2Vj8uE5zY9JLzqLmDNFnAKQ8UgXG6swdP0c6WiNvVgF3RUdjt4
# INTd0wgo1PlKVw0Kh+XJs3DrfnplQhr4IozZNSYdS1AmmZpyJFuLRZdz7hnnPBCH
# JJEwc2g/YZ80V/fqQP5DUsK5Gj+mhGWSCJkvw3fJgdF/szC2Fkb6LpH4MK9payul
# opPqxhAkMxbRg29jb6H74wFHnKhgOH7YfiRFm/d+pf3L0RtG3qeeXcK+MAv1LbxI
# aSq1yqy6pu/330Q129qitNc8ppvKkr5NuWWeXiU=
# SIG # End signature block