private/scripts/updateTeppAsync.ps1

if (-not ([Dataplat.Dbatools.TabExpansion.TabExpansionHost]::TeppAsyncDisabled -or [Dataplat.Dbatools.TabExpansion.TabExpansionHost]::TeppDisabled)) {
    $scriptBlock = {
        $script:___ScriptName = 'dbatools-teppasynccache'

        # Defer module import to avoid collisions and reduce CPU impact
        Start-Sleep -Seconds 15
        $dbatoolsPath = Join-Path -Path ([Dataplat.Dbatools.dbaSystem.SystemHost]::ModuleBase) -ChildPath "dbatools.psd1"
        Import-Module $dbatoolsPath
        $script:dbatools = Get-Module dbatools

        #region Utility Functions
        function Get-PriorityServer {
            [Dataplat.Dbatools.TabExpansion.TabExpansionHost]::InstanceAccess.Values | Where-Object -Property LastUpdate -LT (New-Object System.DateTime(1, 1, 1, 1, 1, 1))
        }

        function Get-ActionableServer {
            [Dataplat.Dbatools.TabExpansion.TabExpansionHost]::InstanceAccess.Values | Where-Object -Property LastUpdate -LT ((Get-Date) - ([Dataplat.Dbatools.TabExpansion.TabExpansionHost]::TeppUpdateInterval)) | Where-Object -Property LastUpdate -GT ((Get-Date) - ([Dataplat.Dbatools.TabExpansion.TabExpansionHost]::TeppUpdateTimeout))
        }

        function Update-TeppCache {
            [CmdletBinding()]
            param (
                [Parameter(ValueFromPipeline)]
                $ServerAccess
            )
            process {
                if ([Dataplat.Dbatools.TabExpansion.TabExpansionHost]::TeppUdaterStopper) { break }

                foreach ($instance in $ServerAccess) {
                    if ([Dataplat.Dbatools.TabExpansion.TabExpansionHost]::TeppUdaterStopper) { break }
                    $server = New-Object Microsoft.SqlServer.Management.Smo.Server($instance.ConnectionObject)
                    try {
                        $server.ConnectionContext.Connect()
                    } catch {
                        & $script:dbatools { Write-Message "Failed to connect to $instance" -ErrorRecord $_ -Level Debug }
                        continue
                    }

                    $FullSmoName = ([Dataplat.Dbatools.Parameter.DbaInstanceParameter]$instance.ConnectionObject.ConnectionString).FullSmoName.ToLowerInvariant()

                    foreach ($scriptBlock in ([Dataplat.Dbatools.TabExpansion.TabExpansionHost]::TeppGatherScriptsFast)) {
                        $scriptName = ([Dataplat.Dbatools.TabExpansion.TabExpansionHost]::Scripts.Values | Where-Object ScriptBlock -EQ $scriptBlock).Name
                        # Workaround to avoid stupid issue with scriptblock from different runspace
                        try { [ScriptBlock]::Create($scriptBlock).Invoke() }
                        catch { & $script:dbatools { Write-Message "Failed to execute TEPP $scriptName against $FullSmoName" -ErrorRecord $_ -Level Debug } }
                    }

                    foreach ($scriptBlock in ([Dataplat.Dbatools.TabExpansion.TabExpansionHost]::TeppGatherScriptsSlow)) {
                        $scriptName = ([Dataplat.Dbatools.TabExpansion.TabExpansionHost]::Scripts.Values | Where-Object ScriptBlock -EQ $scriptBlock).Name
                        # Workaround to avoid stupid issue with scriptblock from different runspace
                        try { [ScriptBlock]::Create($scriptBlock).Invoke() }
                        catch { & $script:dbatools { Write-Message "Failed to execute TEPP $scriptName against $FullSmoName" -ErrorRecord $_ -Level Debug } }
                    }

                    $server.ConnectionContext.Disconnect()
                    $instance.LastUpdate = Get-Date
                }
            }
        }
        #endregion Utility Functions

        try {
            #region Main Execution
            while ($true) {
                # This portion is critical to gracefully closing the script
                if ([Dataplat.Dbatools.Runspace.RunspaceHost]::Runspaces[$___ScriptName.ToLowerInvariant()].State -notlike "Running") {
                    break
                }

                Get-PriorityServer | Update-TeppCache
                Get-ActionableServer | Update-TeppCache
                Start-Sleep -Seconds 5
            }
            #endregion Main Execution
        } catch {
            & $script:dbatools { Write-Message "General Failure" -ErrorRecord $_ -Level Debug }
        } finally {
            [Dataplat.Dbatools.Runspace.RunspaceHost]::Runspaces[$___ScriptName.ToLowerInvariant()].SignalStopped()
        }
    }

    Register-DbaRunspace -ScriptBlock $scriptBlock -Name "dbatools-teppasynccache"
    Start-DbaRunspace -Name "dbatools-teppasynccache"
}
# SIG # Begin signature block
# MIItZgYJKoZIhvcNAQcCoIItVzCCLVMCAQMxDTALBglghkgBZQMEAgEwewYKKwYB
# BAGCNwIBBKBtBGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAMUoWyM3Zh7OqE
# /ci5Y0gAnGF/mRUj9vLGOpEWWanyEqCCFWUwggaTMIIEe6ADAgECAhMzAAOgqgpo
# I/U4oJx8AAAAA6CqMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMwHhcNMjYwNzMwMDUxMDQ5WhcNMjYwODAy
# MDUxMDQ5WjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExDzANBgNV
# BAcTBlZpZW5uYTERMA8GA1UEChMIZGJhdG9vbHMxETAPBgNVBAMTCGRiYXRvb2xz
# MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAqoaOCUkXEX+9ryrqpP/B
# V1R59oshr/i/SqUZ2/qgTEqeS9PqCb0Qhu0QlAgtRjmp+zCdLe0u+mZ2azjedLec
# 0t72CAtXeU6jLoBTeUJaYq1iXtK4pvcd61Qe4CG0b0WO/L2pC22NQmM532YjGhHL
# c4L0cRKlOJ4cnlldiBVgqsCoDbE5/Axw6O+CwRQkVRp01n3WAzhsy9rN/e5PNiqm
# dbTuGF0/iv1K6jaZrM/IEGYvwZ+r4RrnmJF60YzCqKadHRu3Tqp3xXIP5ZrudicD
# e1Hur7oR3mM/VIb4jQUEcrk8AylhV4rbUrLcAFIW5kz1XfBP0HJ8FiXBEl+osaLk
# BwxNlgaryURYNTj09KJoewDHO6ttfVMhxysXu5sNX5TYvsEwqJ6VtWzoYtnTR1Om
# WLn3SFJdts30dLpvSrb6mxFmpzwEiXp6ovbjiQueIC/yHJ6FWs8qmFyy6jCM86Gm
# XuTTfxEqR2WYJtqnNZMkl+NYh5icugyoFUPDAIZsBLhXAgMBAAGjggHTMIIBzzAM
# BgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA6BgNVHSUEMzAxBgorBgEEAYI3
# YQEABggrBgEFBQcDAwYZKwYBBAGCN2H5+cEspPS4DoOuxLIcm56wGDAdBgNVHQ4E
# FgQUUVH/T1Mo1hW71GYEEgeCvaLGGmgwHwYDVR0jBBgwFoAUa16lNMMFxWJKIVqO
# q3NgYtSsY4UwZwYDVR0fBGAwXjBcoFqgWIZWaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIw
# RU9DJTIwQ0ElMjAwMy5jcmwwdAYIKwYBBQUHAQEEaDBmMGQGCCsGAQUFBzAChlho
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUy
# MElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDMuY3J0MFQGA1UdIARN
# MEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wDQYJKoZIhvcNAQEMBQADggIB
# AEdb1HOJEYSPIY4/4NFDMBmJh2vnDGU2Etj+lwzlKLhE9V8Qtea5x6Tytl/ANMLj
# vtfzDlEw0KR0F/6+OcMn2PnGmkIGixJnjxTf34wc5rxwzmGktUXAKgBUYmOeXkxx
# C5sVozaDc6o9FNfzx9iA1zJmnaWM00ix1GN2xYkx9SwhY3Ufi2gk2fJiJW81dPs/
# 5198lzV4zhMcUfJWu76/sy+M93ZqcPk12WzdonjL92JEVckU0zMArqFXl6ANF8zN
# XJNsY0kne4ooAEVw2NewxhUGL2V3D5sgDm+9D46H9ex5kvXezw+wAvlwmDZQHmWm
# xaT7+eml4q2+trD0brqldA5AYa5Hfponm34fKlBMAvez0jmfqxm0PSvz2Lt6bDd5
# s6Vrk0sO7dRdVnwsCCCiE1TnX4In1jduwqKZEuRFDRbmc3jwOCNV4PodEVw+eCsm
# 56yllvNteE4HMw+eFcVkKAWrgX6NE2iaHBtP6UCfQnR+KuLh9Mw1p0oMBjWDp8Ui
# 4RKt4c/ARixS7+Cd9Oo0A3zRaXJyTmhISBJ0ZrgmNRlvk3RWQShrhPbniiSakkCk
# 6AAk3yw7fpxiXgcgvwViluyaTlzdiTKrYOcvXZ819nUqkbUEguUlywL+Iw2Ux0V5
# sB+MaEBK6gGeDTOTKBN0FpRXrdI2gIe1cloYF0xlfFjtMIIHKDCCBRCgAwIBAgIT
# MwAAABUFPm4ZjpMp2QAAAAAAFTANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQGEwJV
# UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTQwMgYDVQQDEytNaWNy
# b3NvZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWduaW5nIFBDQSAyMDIxMB4XDTI2MDMy
# NjE4MTEyOFoXDTMxMDMyNjE4MTEyOFowWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZl
# cmlmaWVkIENTIEVPQyBDQSAwMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAOD0yz0Cqi8Ocx4+8w574rJuEJ3z6WiTNg5GVLeQFVex55xvIbAFyx6eWbls
# u0wY+OIgUvMFAX6CGVVX9Tb2rkZx14QQEIdNMaEvaSgistzhSuWIxFxu/2Y4y1H+
# Xv/ECa/QXHgEkefV0e3ft++sGpeYqMp8Z/kOnI7/6GdXtMSt4y1LX2I75uNn/0ee
# mDc8KTR7thJtFMWTH3sVnBFakLizc16lF9FdCH9YwCPsmaxh5VmiGLhMXnJbYkys
# lmrAdzLMlli0PYeWejlkQmR2JlwRrEc6hubA7TpnUn1zbemz08YiEZqrWwosQDP0
# OhzmsuRhYa14OuxwqECnaQhz+hiUf0iPoGQ6qqBYg0SQS0Lxk0bUxqT6HejrlqPS
# JAqZ3Fbshloc7ly7KgyL4q1h9d4giDexUhtLYQvyRS2wMZ0So2oCr+KypOLWNeot
# 7qIqnWeLVI9289b0bTcJOxgXrxv/K4hBHBt2gEJd6Yw0kJLR2isJFjhvZYADLieD
# tIA1wSCsGBl/nfn5B8tTmEbOsqMilsxptq5ZvkUpZQqQyw9xcWRdFY7iego+bgpa
# UXKmo6lsn8o41VF4iXEdBF6AA4HMiFEHuCv0gNDWxzYyA6BD7FUZbiirgcPSZ8CL
# CLIuyRmuRpDsmhqdiME1xH1FLbpjEBVtwG0uK0VPMIgSDll1AgMBAAGjggHcMIIB
# 2DAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGte
# pTTDBcViSiFajqtzYGLUrGOFMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUF
# BwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3Np
# dG9yeS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwEgYDVR0TAQH/BAgw
# BgEB/wIBADAfBgNVHSMEGDAWgBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBwBgNVHR8E
# aTBnMGWgY6Bhhl9odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9N
# aWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0El
# MjAyMDIxLmNybDB9BggrBgEFBQcBAQRxMG8wbQYIKwYBBQUHMAKGYWh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBW
# ZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAyMS5jcnQwDQYJKoZI
# hvcNAQEMBQADggIBAF1uIjzPBctfyCUkSH/xDbZQwJSFYE7jpn0U+HA5HeZ2WpFU
# uRg6if8xzNTCuMOHHdf31I8fk9J+WQahO+c71lYczlgVVik7s1i4H6Z9VIYAZnCI
# Y4BJaTSLYHu+f2cSUkmaiJfG6B8flh0GytSBO3QAU1eTOapOCT5LUfFvW7/QcKoQ
# dVk+TYD/p4ldhu2lEzkVzPTSOKxSX0FFmBJ5s4NXzlsHM696rILd/Q+ccLFEk2Ex
# vzE/+wH9Ujul/auF5JXvOpRK/y+f98gxuVd5pUiWmqirxI/0EkyMT8KhVcnGeRlB
# EzUVruQ33LO29F46HFKA+ClnH9eX+OTDIQVUlMF8GnexOB8hz+maq/Z6G1qQvYAS
# PvwSY49CiHElPfDJf4/vwYDbm0ukC/OPdEwwd3zPXxm65WL7rQwDMak4BIfUvw2W
# vd9lFmdA76nLJ7YMK9iYdoh91SBgmqfuejHEZW/z35FoROHW2AIO/A2kUJIbu+Xk
# DhqSj7Z/HjT2v1NaNcLs6J/UhDlknMHhF/wa8GIdiO8yYemV52nUUZEt1JEVWkLf
# 84qlljpq8ipmnv7yk/9ZA/3TcN2Cu8BPpbjE84HFc9ri0aSw3dK6olqIVgdI3J4G
# 5+fyKx66NbghsFJscPgE+psXepn7ucb13938bb8vHiQf1wKYF+axl1KQea6QMIIH
# njCCBYagAwIBAgITMwAAAAeHozSje6WOHAAAAAAABzANBgkqhkiG9w0BAQwFADB3
# MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgw
# RgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2Vy
# dGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjEwNDAxMjAwNTIwWhcNMzYwNDAx
# MjAxNTIwWjBjMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMTQwMgYDVQQDEytNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWdu
# aW5nIFBDQSAyMDIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsvDA
# rxmIKOLdVHpMSWxpCFUJtFL/ekr4weslKPdnF3cpTeuV8veqtmKVgok2rO0D05Bp
# yvUDCg1wdsoEtuxACEGcgHfjPF/nZsOkg7c0mV8hpMT/GvB4uhDvWXMIeQPsDgCz
# UGzTvoi76YDpxDOxhgf8JuXWJzBDoLrmtThX01CE1TCCvH2sZD/+Hz3RDwl2MsvD
# SdX5rJDYVuR3bjaj2QfzZFmwfccTKqMAHlrz4B7ac8g9zyxlTpkTuJGtFnLBGaso
# Onn5NyYlf0xF9/bjVRo4Gzg2Yc7KR7yhTVNiuTGH5h4eB9ajm1OCShIyhrKqgOkc
# 4smz6obxO+HxKeJ9bYmPf6KLXVNLz8UaeARo0BatvJ82sLr2gqlFBdj1sYfqOf00
# Qm/3B4XGFPDK/H04kteZEZsBRc3VT2d/iVd7OTLpSH9yCORV3oIZQB/Qr4nD4YT/
# lWkhVtw2v2s0TnRJubL/hFMIQa86rcaGMhNsJrhysLNNMeBhiMezU1s5zpusf54q
# lYu2v5sZ5zL0KvBDLHtL8F9gn6jOy3v7Jm0bbBHjrW5yQW7S36ALAt03QDpwW1JG
# 1Hxu/FUXJbBO2AwwVG4Fre+ZQ5Od8ouwt59FpBxVOBGfN4vN2m3fZx1gqn52Gvai
# Bz6ozorgIEjn+PhUXILhAV5Q/ZgCJ0u2+ldFGjcCAwEAAaOCAjUwggIxMA4GA1Ud
# DwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU2UEpsA8PY2zv
# adf1zSmepEhqMOYwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0
# bTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAPBgNVHRMBAf8EBTADAQH/MB8G
# A1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBPaKiiMIGEBgNVHR8EfTB7MHmgd6B1
# hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQl
# MjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUy
# MEF1dGhvcml0eSUyMDIwMjAuY3JsMIHDBggrBgEFBQcBAQSBtjCBszCBgQYIKwYB
# BQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWlj
# cm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlm
# aWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNydDAtBggrBgEFBQcwAYYhaHR0cDov
# L29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMA0GCSqGSIb3DQEBDAUAA4ICAQB/
# JSqe/tSr6t1mCttXI0y6XmyQ41uGWzl9xw+WYhvOL47BV09Dgfnm/tU4ieeZ7NAR
# 5bguorTCNr58HOcA1tcsHQqt0wJsdClsu8bpQD9e/al+lUgTUJEV80Xhco7xdgRr
# ehbyhUf4pkeAhBEjABvIUpD2LKPho5Z4DPCT5/0TlK02nlPwUbv9URREhVYCtsDM
# +31OFU3fDV8BmQXv5hT2RurVsJHZgP4y26dJDVF+3pcbtvh7R6NEDuYHYihfmE2H
# dQRq5jRvLE1Eb59PYwISFCX2DaLZ+zpU4bX0I16ntKq4poGOFaaKtjIA1vRElIta
# OKcwtc04CBrXSfyL2Op6mvNIxTk4OaswIkTXbFL81ZKGD+24uMCwo/pLNhn7VHLf
# nxlMVzHQVL+bHa9KhTyzwdG/L6uderJQn0cGpLQMStUuNDArxW2wF16QGZ1NtBWg
# KA8Kqv48M8HfFqNifN6+zt6J0GwzvU8g0rYGgTZR8zDEIJfeZxwWDHpSxB5FJ1VV
# U1LIAtB7o9PXbjXzGifaIMYTzU4YKt4vMNwwBmetQDHhdAtTPplOXrnI9SI6HeTt
# jDD3iUN/7ygbahmYOHk7VB7fwT4ze+ErCbMh6gHV1UuXPiLciloNxH6K4aMfZN1o
# LVk6YFeIJEokuPgNPa6EnTiOL60cPqfny+Fq8UiuZzGCF1cwghdTAgEBMHEwWjEL
# MAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkG
# A1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAwMwITMwADoKoK
# aCP1OKCcfAAAAAOgqjALBglghkgBZQMEAgGgfDAQBgorBgEEAYI3AgEMMQIwADAZ
# BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB
# BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgGqeARGeTZMgzzWG4j2rb8lxreMdqk8P6
# Wc8Wf3/cHF8wCwYJKoZIhvcNAQEBBIIBgHenrm1upB9ceIK8QV4KxEVs+SrnCZXV
# jhdixzmjiO/PW9Ez6RdqfWulxmzP7hpguxVyhGReN668cxJKgmfW/FW16Xgb9gpF
# NDe7Jdkxva2QUFJqH6iSbsUeUbT7XGDRsiSi8kQIUPV5pLOL+W8rMRFVzs3aXdER
# imdWWEUQIuk27ZonNms5FISl2N3B7PFF9bb9Yfj9A/qx54EtJwCEjSuYofVWVlds
# 3kzH7qVIRagSyECZATIQD9t3pGweCV5aTAIHg+TxO3+3a3oP3ks4wW2VHMv8pHW7
# jQ5JxgsQuNuxj4tYU/h1Sw5WdTE+mz+/FyMMbOvLWCh17Fsp4lsaeGChFbyFgl02
# ARpYvc8OXEcofzrkhvEJnGJ7aLUjw50hWhNj2E5YXjDZibn7mUGjvu6k0IZsoeo8
# 1gX5f4P4LjTRHiJhEfEsiswaRqYIV2Pe1104+mK4yi35f/QkE2KRW6Rhpu42p2bG
# a8qaha3vU/+pSL8ke9KFmWXDuWLgLCVO1aGCFL0wghS5BgorBgEEAYI3AwMBMYIU
# qTCCFKUGCSqGSIb3DQEHAqCCFJYwghSSAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggF1
# BgsqhkiG9w0BCRABBKCCAWQEggFgMIIBXAIBAQYKKwYBBAGEWQoDATAxMA0GCWCG
# SAFlAwQCAQUABCC33ptHbfWhPqs8zveHRwZURFpvD0o4+9Zc0Eb5TC0kngIGajVn
# aVIMGBMyMDI2MDczMTIxMTY0My4zMzNaMASAAgH0AgkAufrZ7L6Y5a+ggemkgeYw
# geMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsT
# JE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMe
# blNoaWVsZCBUU1MgRVNOOjdBMUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3Nv
# ZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaCCDykwggeCMIIF
# aqADAgECAhMzAAAABeXPD/9mLsmHAAAAAAAFMA0GCSqGSIb3DQEBDAUAMHcxCzAJ
# BgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNV
# BAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZp
# Y2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMDExMTkyMDMyMzFaFw0zNTExMTkyMDQy
# MzFaMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBD
# QSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnnznUmP94MWf
# BX1jtQYioxwe1+eXM9ETBb1lRkd3kcFdcG9/sqtDlwxKoVIcaqDb+omFio5DHC4R
# BcbyQHjXCwMk/l3TOYtgoBjxnG/eViS4sOx8y4gSq8Zg49REAf5huXhIkQRKe3Qx
# s8Sgp02KHAznEa/Ssah8nWo5hJM1xznkRsFPu6rfDHeZeG1Wa1wISvlkpOQooTUL
# Fm809Z0ZYlQ8Lp7i5F9YciFlyAKwn6yjN/kR4fkquUWfGmMopNq/B8U/pdoZkZZQ
# bxNlqJOiBGgCWpx69uKqKhTPVi3gVErnc/qi+dR8A2MiAz0kN0nh7SqINGbmw5OI
# RC0EsZ31WF3Uxp3GgZwetEKxLms73KG/Z+MkeuaVDQQheangOEMGJ4pQZH55ngI0
# Tdy1bi69INBV5Kn2HVJo9XxRYR/JPGAaM6xGl57Ei95HUw9NV/uC3yFjrhc087qL
# JQawSC3xzY/EXzsT4I7sDbxOmM2rl4uKK6eEpurRduOQ2hTkmG1hSuWYBunFGNv2
# 1Kt4N20AKmbeuSnGnsBCd2cjRKG79+TX+sTehawOoxfeOO/jR7wo3liwkGdzPJYH
# gnJ54UxbckF914AqHOiEV7xTnD1a69w/UTxwjEugpIPMIIE67SFZ2PMo27xjlLAH
# WW3l1CEAFjLNHd3EQ79PUr8FUXetXr0CAwEAAaOCAhswggIXMA4GA1UdDwEB/wQE
# AwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUa2koOjUvSGNAz3vYr0np
# Ptk92yEwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNV
# HSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAPBgNV
# HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBPaKiiMIGE
# BgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3Ql
# MjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIGUBggrBgEFBQcB
# AQSBhzCBhDCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24l
# MjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNydDANBgkq
# hkiG9w0BAQwFAAOCAgEAX4h2x35ttVoVdedMeGj6TuHYRJklFaW4sTQ5r+k77iB7
# 9cSLNe+GzRjv4pVjJviceW6AF6ycWoEYR0LYhaa0ozJLU5Yi+LCmcrdovkl53DNt
# 4EXs87KDogYb9eGEndSpZ5ZM74LNvVzY0/nPISHz0Xva71QjD4h+8z2XMOZzY7YQ
# 0Psw+etyNZ1CesufU211rLslLKsO8F2aBs2cIo1k+aHOhrw9xw6JCWONNboZ497m
# wYW5EfN0W3zL5s3ad4Xtm7yFM7Ujrhc0aqy3xL7D5FR2J7x9cLWMq7eb0oYioXhq
# V2tgFqbKHeDick+P8tHYIFovIP7YG4ZkJWag1H91KlELGWi3SLv10o4KGag42psw
# jybTi4toQcC/irAodDW8HNtX+cbz0sMptFJK+KObAnDFHEsukxD+7jFfEV9Hh/+C
# SxKRsmnuiovCWIOb+H7DRon9TlxydiFhvu88o0w35JkNbJxTk4MhF/KgaXn0GxdH
# 8elEa2Imq45gaa8D+mTm8LWVydt4ytxYP/bqjN49D9NZ81coE6aQWm88TwIf4R4Y
# ZbOpMKN0CyejaPNN41LGXHeCUMYmBx3PkP8ADHD1J2Cr/6tjuOOCztfp+o9Nc+Zo
# IAkpUcA/X2gSMkgHAPUvIdtoSAHEUKiBhI6JQivRepyvWcl+JYbYbBh7pmgAXVsw
# ggefMIIFh6ADAgECAhMzAAAAW0q1jUEybdx0AAAAAABbMA0GCSqGSIb3DQEBDAUA
# MGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# MjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAy
# MDIwMB4XDTI2MDEwODE4NTkwNVoXDTI3MDEwNzE4NTkwNVowgeMxCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJ
# cmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1Mg
# RVNOOjdBMUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVibGljIFJT
# QSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
# ADCCAgoCggIBAJBUzBbbnlDXee0B0KD5G4/475thFyfctCyuESTWQXvlLi4Wx/td
# 2qUdeq4ideeg6VWhiOHfu3wJV4TUGSRtqh9Ccr1BmiBKv9iuFpgHyIBu5Qx38Zsx
# wlFeXVS+ZqJJKnXRbDNQdcYSoC/6c0hQJ/PH50DBRDQkPXVwyFizLrRH9AlrJeUg
# 7BKeT23zftS8/KOJLvEEbHOF6pSOY3ZVprZUWbWjWwRTmoHaQ/E8vrWtLNyEJ+b0
# 89VW1Ikra3t4GTB5Wby3CL1K2zYnAxBIvafsKMFyj9OuXHcTPKMDoFSMeamG9MKO
# Mb6uoG1PjdnDgsLP6EOMRSzrLL7jED1mbB9RSd9fhty+HQr6vZgsBn6oUy+YTpNV
# LskwdtUM82WYAkPztlOt3AiL0qyV7/U3j/uq3vHMjPM0w0340M57Nei0g4BCcMt0
# dbqoc91VgCb3/36sHQANontn1HOF2oLk8190QRS43isHVra8H8sf5+GlqIYsYiCK
# X04HZiOzZW826nVI6d++8lyTeWmpj90Ua9uPbJhVjwE3oh6tO510ySqmSMSLEN07
# p3Ibe3E6BAb2w93rWzb26+dpSthbKF4kApofqBsWPX4MEtHKSOftPmVTCQ47tghr
# VuHia9jY+Hsj01m4KW4WtkmVm3L6hMZECMa4sjMxAXz+bX/AJhWTe6TZAgMBAAGj
# ggHLMIIBxzAdBgNVHQ4EFgQU7/LqUlWWYhXJdXwgYKx4b8Gv0rYwHwYDVR0jBBgw
# FoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+gXYZbaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwUHVibGlj
# JTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5BggrBgEFBQcB
# AQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv
# cHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5n
# JTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG
# AQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsGAQQBgjdMg30B
# ATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3DQEBDAUAA4IC
# AQAAH+zd+XKh4OxXYMWFmtgilXAQGctOjCUB1w/uBiC/OXcH3Ia4/XbdUhKzFbai
# TbIE6vYZKd1p4u7nKOLkawymAMVyuO7LSl6rLKttZIyLhWjTK0zXOz0u4xLq9+bR
# tBEKJvA6sD5nJwH1IO6z1YizyuIRoalMCnbrUixfWxQn4TAmN7t9uk+X2FUThEa3
# ewzRwhtG+xwaAbLMkxRmR24JnfXd1VxKo90+m7Wzuov96Uugx5wZdewiIIm1ZWTj
# 4lCJHup679LcOa7tAxJMipVaSltQH9fm9TOKczlfxtWuBcLU4duZfqwgsILsH7PM
# kcX1zwQzQD0yAtPhnYz9KNG125bX+iilOe1S8RHqv2bbBpMpao4kcUvQI6dMgKRv
# Fmm1eLbhSNOQplDMTGD1tNVdNGkI96jUu+troUjWMMi46TQfBAHxtDTpRhIu/87v
# AVQ8Z6RHhFxesz4Ed5JThaIQRAy6GcO/Jk+QzDzoZ0arRIkIsGJ7rZgOVAjx9ctf
# w8lH9RfjcwB3wdGBYNMNVJqQpUai2Taddf5pXzTZEHIqLEF53SrBjIeInoQrP7U5
# VlXiMQsxewLdINrAE2l2TR3KBikb+RQRygbTp8jj2yiC0NCUwG+K+ndglN5RMbXj
# FW6aKa59Xq+b8XzK/DK+AJtgOpHgJv8Qrk62A+twOVLOpjGCA9QwggPQAgEBMHgw
# YTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy
# MDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIw
# MjACEzMAAABbSrWNQTJt3HQAAAAAAFswDQYJYIZIAWUDBAIBBQCgggEtMBoGCSqG
# SIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg1Orr8Hvt8Qu1
# dJ3QqeVLrtxaRCcB7OE7t8lt9SeaLZYwgd0GCyqGSIb3DQEJEAIvMYHNMIHKMIHH
# MIGgBCAvMQNVXZ0b0xxlGw8X/3IEybObuT6a5W1d61CW+cGD7zB8MGWkYzBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAIT
# MwAAAFtKtY1BMm3cdAAAAAAAWzAiBCA/mG7zjsFh4tetjPVhLXV2eyqrEVle0VFL
# TARta1RTqDANBgkqhkiG9w0BAQsFAASCAgBpI/BNJYQR1SI5GvZkAussB8kqb59W
# hYTp4hEr7sKjB+Qo+x0C1gyn+qLiGkZsjh/aGvNetxD2/0cDMM0xxVxj50WPAYNr
# JEhFkwkN1iutJdWl8fqnjO16+VJUaLdwJ8kORFVh2DEDGIgwXeV4ewNODk7pObwm
# c6liYQt23xBKGwalxq4V6UdxZNzyra90zb6OtTZjdEb9Kqn9F8mYAhAUcDdJ/M2o
# NsPL8ZdO2gHkn/GqlAtXQn+9N1nWgA4clf/EITdLuXTBkwY4tmAoR3JnyXqbaBRj
# lfNEoQ4d33OO6V8y8A52I7efn0SljB0nbx3bKpbAmVL3i9mJh6yiMoRqlPd6Jy+p
# 6i/RyapMWiBGc1gX0weEStzXjatkmHcxZPiitvgQQS2bfCOVRHM8a0vt0Lmh65sf
# GKJ5GWHK1m7uL8QiUcEOmP25CSpZjbJZaPjsD0rAjgu0f1WcyttzOtvwKOwHpd52
# /OoFcbdPlMB+/glVOvSI/w85A7UWeirZrtafm27bXVbQWNPQDhqpda1GgfAl8UfP
# xY26Hgxlz4LgDgv6N115Gl2q1wFGD8VxJEdwQ9BMZcWAccDnX7LQN0YWGuU8ydPG
# sNPO8uir+5B4kzaCQ7kRZ9yCRCqYkcZJKahfxkr2S/W2VqhnVxUvw+d6V8rbrUdC
# cth69yhblcIAnA==
# SIG # End signature block