ComplianceDiagnostics.psm1

Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName PresentationCore
Add-Type -AssemblyName WindowsBase
Add-Type -AssemblyName Microsoft.VisualBasic
Add-Type -AssemblyName System.Net;
Add-Type -AssemblyName System.Drawing;

Import-Module "$PSScriptRoot\ComplianceDiagnosticUtils.psm1"
Import-Module "$PSScriptRoot\ComplianceDiagnosticDLP.psm1"
Import-Module "$PSScriptRoot\ComplianceDiagnosticAutoLabeling.psm1"
Import-Module "$PSScriptRoot\ComplianceDiagnosticMIP.psm1"
Import-Module "$PSScriptRoot\ComplianceDiagnosticEncryption.psm1"
Import-Module "$PSScriptRoot\ComplianceDiagnosticDataClassification.psm1"
Import-Module "$PSScriptRoot\ComplianceDiagnosticIB.psm1"

############################################## Utility Functions #########################################
# setting global variables to pass between event functions like button clicks
$global:ContextScopeVariables = @{}
$global:MipControlVariables = @{}
$global:DlpControlVariables = @{}
$global:alpControlVariables = @{}
$global:EncryptControlVariables = @{}
$global:ClassificationControlVariables = @{}
$global:IBControlVariables = @{}

# Function to check if the module is installed and prompt the user to install it if it is not found
function Check-Module {
    param (
        [Parameter(Mandatory=$true)]
        [string]$ModuleName,

        [Parameter(Mandatory=$false)]
        [int]$Version
    )

    # Check if the module is installed
    $module = Get-Module -ListAvailable -Name $ModuleName

    if ($null -eq $module -or !($module.Version.Major -ge $Version)) {
        # Module not found, show a message box asking the user to install it
        $messageBoxTitle = "Module '$ModuleName' with required version not found"
        $messageBoxText = "The '$ModuleName' module with Major version '$Version' is required for this script to run. Would you like to install it now?"
        $messageBoxButtons = [System.Windows.Forms.MessageBoxButtons]::YesNo
        $messageBoxIcon = [System.Windows.Forms.MessageBoxIcon]::Question

        $result = [System.Windows.Forms.MessageBox]::Show($messageBoxText, $messageBoxTitle, $messageBoxButtons, $messageBoxIcon)

        if ($result -eq [System.Windows.Forms.DialogResult]::Yes) {
            # Open the PowerShell Gallery in the user's default web browser to allow them to install the module
            Start-Process "https://www.powershellgallery.com/packages/$ModuleName"
        }
        return $false
    }
    return $true
}

# Function to run on startup to check if the ExchangeOnlineManagement module is installed
function StartupCheck {
    # Check if the ExchangeOnlineManagement module is installed
    Write-Host "Checking presence of ExchangeOnlineManagement PowerShell Module"
    $exchangeModuleCheck = Check-Module -ModuleName "ExchangeOnlineManagement" -Version 3
    
    if(!$exchangeModuleCheck){
        Write-Host "ExchangeOnlineManagement PowerShell Module not installed. Please install it running the command 'Install-Module ExchangeOnlineManagement' in an admin powershell."
        exit
    }
}

#Connecting to the service if there is no connection or if the connection is not connected
function Start-ComplianceDiagnostics {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false)]
        [ValidateSet('O365Default','O365GermanyCloud','O365China','O365USGovGCCHigh', 'O365USGovDoD')]
        [string] $Environment = "O365Default"
    )
    # Call the startup function
    StartupCheck
    LoginAndConnect($Environment)

    # Create the main window
    $window = New-Object Windows.Window
    $window.Title = "ComplianceDiagnostics"
    $window.Width = 1600
    $window.Height = 1200

    # Create the main grid
    $grid = New-Object Windows.Controls.Grid
    $window.Content = $grid

    # # Create the left-side tab control
    $leftTabControl = Get-LeftTabControl
    $grid.Children.Add($leftTabControl) > $null

    $MSLogo = Get-MSLogo

    $leftTabControl.Items.Add($MSLogo) > $null

    # Get forest info for all the tabs
    Get-ForestInfo

    # Create and add Classification tab on left panel
    if (Confirm-ClassificationCommandsPresent) {
        $ClassificationTabItem = Get-TabItem -Name "Data Classification"
        Get-ClassificationTabContent -TabObject $ClassificationTabItem  > $null
        $leftTabControl.Items.Add($ClassificationTabItem) > $null
        $leftTabControl.SelectedIndex = 1
    }

    # Create and add MIP Labels tab on left panel
    if (Confirm-MipLabelCommandsPresent) {
        $MipLabelsTabItem = Get-TabItem -Name "Information Protection"
        Get-MIPLabelTabContent -TabObject $MipLabelsTabItem  > $null
        $leftTabControl.Items.Add($MipLabelsTabItem) > $null
    }

    # Create and add DLP tab on left panel
    if (Confirm-DlpCommandsPresent) {
    $DLPTabItem = Get-TabItem -Name "Data Loss Prevention"
        Get-DLPTabContent -TabObject $DLPTabItem  > $null
        $leftTabControl.Items.Add($DLPTabItem) > $null
    }

    # Create and add ALP tab on left panel
    if (Confirm-AutoLabelingCommandsPresent) {
        $AlpTabItem = Get-TabItem -Name "Auto Labeling"
        Get-AutoLabelingTabContent -TabObject $AlpTabItem  > $null
        $leftTabControl.Items.Add($AlpTabItem) > $null
    }

    # Create and add Encryption tab on left panel
    $EncryptTabItem = Get-TabItem -Name "Encryption"
    Get-EncryptTabContent -TabObject $EncryptTabItem  > $null
    $leftTabControl.Items.Add($EncryptTabItem) > $null

    # Create and add Information Barriers tab on left panel
    if (Confirm-IBCommandsPresent) {
        $IBTabItem = Get-TabItem -Name "Information Barriers"
        Get-IBTabContent -TabObject $IBTabItem  > $null
        $leftTabControl.Items.Add($IBTabItem) > $null
    }

    # Show the window
    Write-Host "Starting UX......"
    $window.ShowDialog()
}

Export-ModuleMember -Function Start-ComplianceDiagnostics
# SIG # Begin signature block
# MIIn0AYJKoZIhvcNAQcCoIInwTCCJ70CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA/kCxnnvlycNYt
# essvjjjmem0CEeIaT7MiIYyWJygqJKCCDYUwggYDMIID66ADAgECAhMzAAADri01
# UchTj1UdAAAAAAOuMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwODU5WhcNMjQxMTE0MTkwODU5WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQD0IPymNjfDEKg+YyE6SjDvJwKW1+pieqTjAY0CnOHZ1Nj5irGjNZPMlQ4HfxXG
# yAVCZcEWE4x2sZgam872R1s0+TAelOtbqFmoW4suJHAYoTHhkznNVKpscm5fZ899
# QnReZv5WtWwbD8HAFXbPPStW2JKCqPcZ54Y6wbuWV9bKtKPImqbkMcTejTgEAj82
# 6GQc6/Th66Koka8cUIvz59e/IP04DGrh9wkq2jIFvQ8EDegw1B4KyJTIs76+hmpV
# M5SwBZjRs3liOQrierkNVo11WuujB3kBf2CbPoP9MlOyyezqkMIbTRj4OHeKlamd
# WaSFhwHLJRIQpfc8sLwOSIBBAgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUhx/vdKmXhwc4WiWXbsf0I53h8T8w
# VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh
# dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzUwMTgzNjAfBgNVHSMEGDAW
# gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw
# MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx
# XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB
# AGrJYDUS7s8o0yNprGXRXuAnRcHKxSjFmW4wclcUTYsQZkhnbMwthWM6cAYb/h2W
# 5GNKtlmj/y/CThe3y/o0EH2h+jwfU/9eJ0fK1ZO/2WD0xi777qU+a7l8KjMPdwjY
# 0tk9bYEGEZfYPRHy1AGPQVuZlG4i5ymJDsMrcIcqV8pxzsw/yk/O4y/nlOjHz4oV
# APU0br5t9tgD8E08GSDi3I6H57Ftod9w26h0MlQiOr10Xqhr5iPLS7SlQwj8HW37
# ybqsmjQpKhmWul6xiXSNGGm36GarHy4Q1egYlxhlUnk3ZKSr3QtWIo1GGL03hT57
# xzjL25fKiZQX/q+II8nuG5M0Qmjvl6Egltr4hZ3e3FQRzRHfLoNPq3ELpxbWdH8t
# Nuj0j/x9Crnfwbki8n57mJKI5JVWRWTSLmbTcDDLkTZlJLg9V1BIJwXGY3i2kR9i
# 5HsADL8YlW0gMWVSlKB1eiSlK6LmFi0rVH16dde+j5T/EaQtFz6qngN7d1lvO7uk
# 6rtX+MLKG4LDRsQgBTi6sIYiKntMjoYFHMPvI/OMUip5ljtLitVbkFGfagSqmbxK
# 7rJMhC8wiTzHanBg1Rrbff1niBbnFbbV4UDmYumjs1FIpFCazk6AADXxoKCo5TsO
# zSHqr9gHgGYQC2hMyX9MGLIpowYCURx3L7kUiGbOiMwaMIIHejCCBWKgAwIBAgIK
# YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm
# aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw
# OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD
# VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG
# 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la
# UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc
# 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D
# dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+
# lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk
# kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6
# A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd
# X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL
# 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd
# sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3
# T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS
# 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI
# bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL
# BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD
# uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv
# c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
# MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
# MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h
# cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA
# YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn
# 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7
# v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b
# pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/
# KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy
# CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp
# mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi
# hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb
# BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS
# oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL
# gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX
# cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGaEwghmdAgEBMIGVMH4x
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p
# Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAOuLTVRyFOPVR0AAAAA
# A64wDQYJYIZIAWUDBAIBBQCggbAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIBCf
# iBwRWbzO/xsh38kMvMnUgVnjbc6+lMRDrtInZCXGMEQGCisGAQQBgjcCAQwxNjA0
# oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEcgBpodHRwczovL3d3dy5taWNyb3NvZnQu
# Y29tIDANBgkqhkiG9w0BAQEFAASCAQAz8a5INnhea0CUJPfE8pW6mBWinQtLrYiR
# W4ynjqbGC0pFv5VQUfdjfGi7hWKfjT24VEbqaoXTdX36rl/w9v/VJpfJJky/xKzp
# MoR8XTNb3bT50e9k0c9ARjOdOl90xD9FTSpvyfgrVG0zYemcezvCa5TNKkDzCf+l
# DujJ2CUFVhf1pq4/V82JzTTl4bl0vtRx4547lZJ/NpwemtoyGPirx5bDzg8qBGBT
# qCyDz5lkLxipZz5JpBgYF16msHBqE9t4ts6i1tAWGaCkHtktUc4T6190SMOf7ExY
# LSEqJgmkRQiw83lR/BhMpU1GGm7P3+AD7StOL40+5klZC7oTtkYvoYIXKTCCFyUG
# CisGAQQBgjcDAwExghcVMIIXEQYJKoZIhvcNAQcCoIIXAjCCFv4CAQMxDzANBglg
# hkgBZQMEAgEFADCCAVkGCyqGSIb3DQEJEAEEoIIBSASCAUQwggFAAgEBBgorBgEE
# AYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIOgBoTYJOQR9uTJ9kqnk3D6KPYYTKm7K
# 5b9yqwo33pyyAgZlup4A2DcYEzIwMjQwMjIwMjEyNTMwLjgzOFowBIACAfSggdik
# gdUwgdIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNV
# BAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UE
# CxMdVGhhbGVzIFRTUyBFU046OEQ0MS00QkY3LUIzQjcxJTAjBgNVBAMTHE1pY3Jv
# c29mdCBUaW1lLVN0YW1wIFNlcnZpY2WgghF4MIIHJzCCBQ+gAwIBAgITMwAAAePf
# vZuaHGiDIgABAAAB4zANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt
# cCBQQ0EgMjAxMDAeFw0yMzEwMTIxOTA3MjlaFw0yNTAxMTAxOTA3MjlaMIHSMQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNy
# b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxl
# cyBUU1MgRVNOOjhENDEtNEJGNy1CM0I3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt
# ZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# vqQNaB5Gn5/FIFQPo3/K4QmleCDMF40bkoHwz0BshZ4SiQmA6CGUyDwmaqQ2wHha
# XU0RdHtwvq+U8KxYYsyHKqaxxC7fr/yHZvHpNTgzx1VkR3pXhT6X2Cm175UX3WQ4
# jfl86onp5AMzBIFDlz0SU8VSKNMDvNXtjk9FitLgUv2nj3hOJ0KkEQfk3oA7m7zA
# 0D+Mo73hmR+OC7uwsXxJR2tzUZE0STYX3UvenFH7fYWy5BNmLyGq2sWkQ5HFvJKC
# JAE/dwft8+V43U3KeExF/pPtcLUvQ9HIrL0xnpMFau7Yd5aK+TEi57WctBv87+fS
# PZBV3jZl/QCtcH9WrniBDwki9QfRxu/JYzw+iaEWLqrYXuF7jeOGvHK+fVeLWnAc
# 5WxsfbpjEMpNbGXbSF9At3PPhFVOjxwVEx1ALGUqRKehw9ap9X/gfkA9I9eTSvwJ
# z9wya9reDgS+6kXgSttI7RQ2cJG/tQPGVIaLCIaSafLneaq0Bns0t4+EW3B/GnoB
# MiiOXwleOvf5udBZQIMJ3k5qnnh8Z4ZhTwrE6iGbPrTgGBPXh7exFYAGlb6hdhIL
# IVDdJlDf8s1NVvL0Q2y4SHZQhApZTuW/tyGsGscIPDSMz5bA6NhRLtjEwCFpLI5q
# Glu50Au9FRelCEQsWg7q07H/rqHOqCNJM4Rjem7joEUCAwEAAaOCAUkwggFFMB0G
# A1UdDgQWBBSxrg1mvjUVt6Fnxj56nabZiJipAzAfBgNVHSMEGDAWgBSfpxVdAF5i
# XYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENB
# JTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRp
# bWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1Ud
# JQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsF
# AAOCAgEAt76bLqnU08wRbW3vRrxjaEbGPqyINK6UYCzhTGaR/PEwCJziPT4ZM9sf
# GTX3eZDQVE9r121tFtp7NXQYuQSxRZMYXa0/pawN2Xn+UPjBRDvoCsU56dwKkrmy
# 8TSw7QXKGskdnEwsI5yW93q8Ag86RkBiKEEf9FdzHNuKWI4Kv//fDtESewu46n/u
# +VckCwbOYl6wE//QRGrGMq509a4EbP+p1GUm06Xme/01mTIuKDgPmHL2nYRzXNqi
# 2IuIecn2aWwkRxQOFiPw+dicmOOwLG/7InNqjZpQeIhDMxsWr4zTxzy4ER/6zfth
# tlDtcAXHB7YRUkBTClaOa0ndvfNJZMyYVa6cWvZouTq9V5LS7UzIR8S/7RsOT43e
# OawLBsuQz0VoOLurYe1SffPqTsCcRNzbx0C8t/+KipStVhPAGttEfhdUUS9ohD6L
# t6wNCJxZbV0IMD8nfE6gIQJXrzrXWOuJqN91WDyjRan4UKDkIBS2yWA4W6JhQuBz
# GerOSY/aLnxkRrSubgtnKYcHOwgxTTIya5WYCRjFt0QOLleqVki6k+mqYPr98uMP
# i5vRIQS206mDSenStr8w0J+/+1WEm3PnCCIQgpf6zhqRrAt9j7XrEMHrg2bQegaz
# 8bLzbe6UibgbKtRyk1nGde8To5kyMj9XUCBICDxT+F4xa5lNZVQwggdxMIIFWaAD
# AgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv
# ZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIy
# MjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw
# MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5
# vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64
# NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhu
# je3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl
# 3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPg
# yY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I
# 5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2
# ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/
# TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy
# 16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y
# 1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6H
# XtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMB
# AAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQW
# BBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30B
# ATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYB
# BAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMB
# Af8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBL
# oEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv
# TWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggr
# BgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNS
# b29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1Vffwq
# reEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27
# DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pv
# vinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9Ak
# vUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWK
# NsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2
# kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+
# c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep
# 8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+Dvk
# txW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1Zyvg
# DbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/
# 2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIC1DCCAj0CAQEwggEAoYHYpIHV
# MIHSMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQL
# EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsT
# HVRoYWxlcyBUU1MgRVNOOjhENDEtNEJGNy1CM0I3MSUwIwYDVQQDExxNaWNyb3Nv
# ZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQA9iJe7w5FDiG8p
# y4TsYrQI6DFaeqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw
# MA0GCSqGSIb3DQEBBQUAAgUA6X95nzAiGA8yMDI0MDIyMTAzMTg1NVoYDzIwMjQw
# MjIyMDMxODU1WjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDpf3mfAgEAMAcCAQAC
# Ag7/MAcCAQACAhGMMAoCBQDpgMsfAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisG
# AQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEFBQAD
# gYEApGVWJ//SV7B+I+aOkXSAnoM8JWiUE2CAtrd8DFED4Qu0cQMHLwS9uakZFxw3
# zWX1Oz6gmOjEKZbuNtbt4CnXvB8wzH5oplzzR00wo6Qt3CJwhojMXnfWxYAkFYch
# +DnE8lMRveVptXERQXxrEFES7nL2f9qPG7/mQrRDYKWWK/AxggQNMIIECQIBATCB
# kzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD
# Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAePfvZuaHGiDIgAB
# AAAB4zANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJ
# EAEEMC8GCSqGSIb3DQEJBDEiBCCGR44oGVZvUy41vjU72wXcftlySTQPFT9qVtZ8
# KQuPPjCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIDPUI6vlsP5k90SBCNa9
# wha4MlxBt2Crw12PTHIy5iYqMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# UENBIDIwMTACEzMAAAHj372bmhxogyIAAQAAAeMwIgQgkNTX5OvBHsqWtcwd+Itf
# MjfZgaAPgXFNKo3ubH8O7Q8wDQYJKoZIhvcNAQELBQAEggIAWPRGvU/y7bVeE8sI
# vkcfffNwd7mWCiMqSH1lXAwVzcdkMeGSjx96lNDt1NFuVSqoNDYKLFAsJHwsCMpc
# l6JBANliR4NW6qBH6+ZzkgS82v+ExZ4/omCN6an8fOnPTnKJIqtDOLqLkKZylwGh
# aAzCK7Sl7L6Npe1tPQ7860DmKosLtce9R9wXr1pccVu5VAnrUCodj+nC02z5b6+E
# lwoB39zaArRK7s9Q6O6gVZqb9UiFuQqEfZfzJITt/dttDa0hplhRjAy7Fgi/zBEG
# GCgiF0Tzy4YimwLtAHZIxtMN7SvSN8AFRX81Nn+mGxAcZlChZwy835J6NHQ8Iz4I
# Jq/GUXK27te4rCQCoprmghxKBsV5UKOrKlTE6bgLUtWqGcprpxhv1IaWhKlo6YW1
# /Ctx7irCLNxd3ar8id0wy0kd/4LHcIqYq5N9UPoUDzwLrcUVvy+UswXbINDE9uk7
# 203kZyHf1rP767z9M6jmDitNRCkNvxvc5yjcUmVA6czcCYq0wgxgmZohWKyUeyvM
# F2JqqzHr8g1D/E60FtPcYG/DR/Mj5oIoLsNQ0M0aW16pN2Dfvc7qg/u56iSJGtsA
# pDoRVHCRTR/BUY9IfyH7wJdYa0bRvVqzXguqWQp75d0Qatj+PN0XD6GOgl/r15fr
# +ZJW4rckM9Q2KSvXKmFwHAD2jdw=
# SIG # End signature block