RemoteWrench.psm1

# Copyright: (c) 2026, Jordan Borean (@jborean93) <jborean93@gmail.com>
# MIT License (see LICENSE or https://opensource.org/licenses/MIT)

using namespace System.IO
using namespace System.Management.Automation
using namespace System.Reflection

# Resolve the cmdlet through $ExecutionContext to ensure we don't load a
# shadowed version of Import-Module.
$importModule = $ExecutionContext.InvokeCommand.GetCommand(
    'Microsoft.PowerShell.Core\Import-Module',
    [CommandTypes]::Cmdlet)

$moduleName = [Path]::GetFileNameWithoutExtension($PSCommandPath)

$innerMod = if ($PSVersionTable.PSEdition -eq 'Desktop') {
    # Windows PowerShell has no AssemblyLoadContext, the module assembly is
    # imported directly and its dependencies load in the same context as
    # every other module. Avoiding conflicts with them is best effort.
    $modulePath = [Path]::Combine($PSScriptRoot, 'bin', 'net472', "$moduleName.dll")
    & $importModule -Name $modulePath -ErrorAction Stop -PassThru
}
else {
    $loaderName = "$moduleName.Loader.LoadContext"
    $loaderPath = [Path]::Combine($PSScriptRoot, 'bin', 'net8.0', "$moduleName.Loader.dll")

    $isReload = $true
    $loaderType = $loaderName -as [type]
    if (-not $loaderType) {
        $isReload = $false

        $null = [Assembly]::LoadFrom($loaderPath)
        $loaderType = $loaderName -as [type]
    }
    elseif ($loaderType.Assembly.Location -ne $loaderPath) {
        # Assemblies cannot be unloaded so once a version of this module is loaded
        # in the process it is the only one that can be used.
        $msg = "Cannot import $moduleName from '$PSScriptRoot' as a different copy is already loaded in this process " +
        "from '$($loaderType.Assembly.Location)'. Start a new PowerShell process to use this copy."
        $err = [ErrorRecord]::new(
            [InvalidOperationException]::new($msg),
            'ModuleAlreadyLoadedFromDifferentPath',
            [ErrorCategory]::ResourceExists,
            $PSScriptRoot)
        throw $err
    }

    $mainModule = $loaderType::Initialize($moduleName)
    & $importModule -Assembly $mainModule -PassThru:$isReload
}

if ($innerMod) {
    # The cmdlets of a module imported in this script are not exported from
    # this module unless added here. On pwsh this is only needed on a reload,
    # Import-Module in an assembly will pick up a cached instance and not call
    # the same path to set the nested module's cmdlets to the current module
    # scope.
    # https://github.com/PowerShell/PowerShell/issues/20710
    $addExportedCmdlet = [PSModuleInfo].GetMethod(
        'AddExportedCmdlet',
        [BindingFlags]'Instance, NonPublic')
    $addExportedAlias = [PSModuleInfo].GetMethod(
        'AddExportedAlias',
        [BindingFlags]'Instance, NonPublic')
    foreach ($cmd in $innerMod.ExportedCmdlets.Values) {
        $addExportedCmdlet.Invoke($ExecutionContext.SessionState.Module, @(, $cmd))
    }
    foreach ($alias in $innerMod.ExportedAliases.Values) {
        $addExportedAlias.Invoke($ExecutionContext.SessionState.Module, @(, $alias))
    }
}

# SIG # Begin signature block
# MIIw1AYJKoZIhvcNAQcCoIIwxTCCMMECAQMxDTALBglghkgBZQMEAgEwewYKKwYB
# BAGCNwIBBKBtBGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCujVb9zeSmEro+
# bvliHGlzeCXSQMYspnpExpai58L7FKCCFXUwggajMIIEi6ADAgECAhMzAAg69Td6
# kxNse69GAAAACDr1MA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMwHhcNMjYxMDEzMDI0OTE3WhcNMjYxMDE2
# MDI0OTE3WjBlMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDERMA8G
# A1UEBxMIQnJpc2JhbmUxFjAUBgNVBAoTDUpvcmRhbiBCb3JlYW4xFjAUBgNVBAMT
# DUpvcmRhbiBCb3JlYW4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCG
# hMCzQwaZCP1QE0dzmy6j1iQ5Bs7Bd0omWRyWZzcfgWddu24yJ79b+m1lykxRbERL
# 2t2zIXuea3SMHR70iNb3WlKCEBMBS2nEkq4eipDaLsZvZpB8bZRWJDVpCco5/Wty
# CR1JDMZUUtjMTBeFzPYM6cmXW6mvCZQgYXJZeYd8UKC18OMXT1jTNTcB3us5NYRs
# V83wm0x8sZY+NTfCQdGwyzHdtbnQV4khBSMuBynIywD7dk+eoJaP6rhPcwN0B9IY
# 4H6aECjx9LBXx/cNFLfrN/SqNyfKx/nocSJfTXVbHaMq+jcPgPA+SgqPRQ/b0521
# PNc0TzC20x+OX1DQLAw95Ej9YfcGKywSDMyN7bhXHbI4uo+h5sd1ik01Iz7JMFCB
# FMuuZWSF6fYh2COGyY5Ksl+e6g+F49+5dvpXO7xCkFpMGzevYppWEFcqeLYFxBma
# 6F+z8vpzg0iSpr9CnyfspjpFYT6QaaX4VZFtlJBc+h7YwExjBZhpKEgugRmABj0C
# AwEAAaOCAdUwggHRMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDwGA1Ud
# JQQ1MDMGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhsrBgEEAYI3YcD1uzmDxbqHboKj
# 0bsfgZfH91YwHQYDVR0OBBYEFO2BhyDu77dgDkZl53M5PpgB36zBMB8GA1UdIwQY
# MBaAFGtepTTDBcViSiFajqtzYGLUrGOFMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIw
# VmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgw
# ZjBkBggrBgEFBQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j
# ZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBFT0MlMjBDQSUy
# MDAzLmNydDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0G
# CSqGSIb3DQEBDAUAA4ICAQDL/RmeYDPPrA2XYSr9MacKvorbD3IzdCCOtxmoasTj
# qP4luE8w33bYEx3R6eolhwyCwgF0YQobrRh9ndTsh158aYJi7Kw/JghxyfhiSU3a
# p3eAmj2EZkArxXBc64p9n/faWo5SChxV7JqNrY+N+6crr33N9uJ4DkMwAi6IbAq8
# YYitpEgLgIGDRpZcnySmiZGFPTt9tPAu2LwI9CkfZEfdzb1mjBFINqEHYzuwLDq7
# SmiEbiDirctCAKVPgejJWeibwrHt3Jy8smle6HHmmaqoSRsnAqDEs199MXOUSysF
# lqfrAengdpbUDWjbSKq4FR9wjpDGJsVOsZ7jFpcreZvJg0EqyvgHDC//kIap5sFN
# 8fvignsgJt7pO/+hvY85MRQFrIKPMcw9n4aehy5F2s6gGww9K8+v8Sa+rO2NHK+D
# B0Fyty1HpQNzsV5kmHj0RvODiuHzjvEyluq/ssm5ZXA1Pug9WDOh+xH7jcJ7vwZv
# QaZPovdor0vXFmxmYXM8QPmgtLm8TGUS0zNrUtuzwSNlWUEs3IDQTVilaSa+f6zi
# lVtc/f5d2R/5YauNbw2xEGmnTlJ09uj0ke8cumkU4eTRBamGjUchhLjG4Qgfgz4U
# NmW0OKxUtuvvI7o4J5qbOnFvkUSieUpQf2fsASOqJSctNgWGiwk7yOoMIMEFWqbH
# bDCCBygwggUQoAMCAQICEzMAAAAVBT5uGY6TKdkAAAAAABUwDQYJKoZIhvcNAQEM
# BQAwYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQ
# Q0EgMjAyMTAeFw0yNjAzMjYxODExMjhaFw0zMTAzMjYxODExMjhaMFoxCzAJBgNV
# BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMT
# Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQDg9Ms9AqovDnMePvMOe+KybhCd8+lokzYORlS3
# kBVXseecbyGwBcsenlm5bLtMGPjiIFLzBQF+ghlVV/U29q5GcdeEEBCHTTGhL2ko
# IrLc4UrliMRcbv9mOMtR/l7/xAmv0Fx4BJHn1dHt37fvrBqXmKjKfGf5DpyO/+hn
# V7TEreMtS19iO+bjZ/9Hnpg3PCk0e7YSbRTFkx97FZwRWpC4s3NepRfRXQh/WMAj
# 7JmsYeVZohi4TF5yW2JMrJZqwHcyzJZYtD2Hlno5ZEJkdiZcEaxHOobmwO06Z1J9
# c23ps9PGIhGaq1sKLEAz9Doc5rLkYWGteDrscKhAp2kIc/oYlH9Ij6BkOqqgWINE
# kEtC8ZNG1Mak+h3o65aj0iQKmdxW7IZaHO5cuyoMi+KtYfXeIIg3sVIbS2EL8kUt
# sDGdEqNqAq/isqTi1jXqLe6iKp1ni1SPdvPW9G03CTsYF68b/yuIQRwbdoBCXemM
# NJCS0dorCRY4b2WAAy4ng7SANcEgrBgZf535+QfLU5hGzrKjIpbMabauWb5FKWUK
# kMsPcXFkXRWO4noKPm4KWlFypqOpbJ/KONVReIlxHQRegAOBzIhRB7gr9IDQ1sc2
# MgOgQ+xVGW4oq4HD0mfAiwiyLskZrkaQ7JoanYjBNcR9RS26YxAVbcBtLitFTzCI
# Eg5ZdQIDAQABo4IB3DCCAdgwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQD
# AgEAMB0GA1UdDgQWBBRrXqU0wwXFYkohWo6rc2Bi1KxjhTBUBgNVHSAETTBLMEkG
# BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIA
# QwBBMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1
# zSmepEhqMOYwcAYDVR0fBGkwZzBloGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUl
# MjBTaWduaW5nJTIwUENBJTIwMjAyMS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsG
# AQUFBzAChmFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p
# Y3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUy
# MDIwMjEuY3J0MA0GCSqGSIb3DQEBDAUAA4ICAQBdbiI8zwXLX8glJEh/8Q22UMCU
# hWBO46Z9FPhwOR3mdlqRVLkYOon/MczUwrjDhx3X99SPH5PSflkGoTvnO9ZWHM5Y
# FVYpO7NYuB+mfVSGAGZwiGOASWk0i2B7vn9nElJJmoiXxugfH5YdBsrUgTt0AFNX
# kzmqTgk+S1Hxb1u/0HCqEHVZPk2A/6eJXYbtpRM5Fcz00jisUl9BRZgSebODV85b
# BzOveqyC3f0PnHCxRJNhMb8xP/sB/VI7pf2rheSV7zqUSv8vn/fIMblXeaVIlpqo
# q8SP9BJMjE/CoVXJxnkZQRM1Fa7kN9yztvReOhxSgPgpZx/Xl/jkwyEFVJTBfBp3
# sTgfIc/pmqv2ehtakL2AEj78EmOPQohxJT3wyX+P78GA25tLpAvzj3RMMHd8z18Z
# uuVi+60MAzGpOASH1L8Nlr3fZRZnQO+pyye2DCvYmHaIfdUgYJqn7noxxGVv89+R
# aETh1tgCDvwNpFCSG7vl5A4ako+2fx409r9TWjXC7Oif1IQ5ZJzB4Rf8GvBiHYjv
# MmHpledp1FGRLdSRFVpC3/OKpZY6avIqZp7+8pP/WQP903DdgrvAT6W4xPOBxXPa
# 4tGksN3SuqJaiFYHSNyeBufn8iseujW4IbBSbHD4BPqbF3qZ+7nG9d/d/G2/Lx4k
# H9cCmBfmsZdSkHmukDCCB54wggWGoAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcw
# DQYJKoZIhvcNAQEMBQAwdzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjFIMEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlm
# aWNhdGlvbiBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQw
# MTIwMDUyMFoXDTM2MDQwMTIwMTUyMFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZl
# cmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQAD
# ggIPADCCAgoCggIBALLwwK8ZiCji3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3r
# lfL3qrZilYKJNqztA9OQacr1AwoNcHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE
# /xrweLoQ71lzCHkD7A4As1Bs076Iu+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUw
# grx9rGQ//h890Q8JdjLLw0nV+ayQ2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPI
# Pc8sZU6ZE7iRrRZywRmrKDp5+TcmJX9MRff241UaOBs4NmHOyke8oU1TYrkxh+Ye
# HgfWo5tTgkoSMoayqoDpHOLJs+qG8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyf
# NrC69oKpRQXY9bGH6jn9NEJv9weFxhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/
# cgjkVd6CGUAf0K+Jw+GE/5VpIVbcNr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCz
# TTHgYYjHs1NbOc6brH+eKpWLtr+bGecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461u
# ckFu0t+gCwLdN0A6cFtSRtR8bvxVFyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgR
# nzeLzdpt32cdYKp+dhr2ogc+qM6K4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMB
# AAGjggI1MIICMTAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYD
# VR0OBBYEFNlBKbAPD2Ns72nX9c0pnqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBB
# MD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0Rv
# Y3MvUmVwb3NpdG9yeS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYD
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCB
# hAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w
# cy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290
# JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUH
# AQEEgbYwgbMwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9u
# JTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYI
# KwYBBQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkq
# hkiG9w0BAQwFAAOCAgEAfyUqnv7Uq+rdZgrbVyNMul5skONbhls5fccPlmIbzi+O
# wVdPQ4H55v7VOInnmezQEeW4LqK0wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2p
# fpVIE1CRFfNF4XKO8XYEa3oW8oVH+KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5St
# Np5T8FG7/VEURIVWArbAzPt9ThVN3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6X
# G7b4e0ejRA7mB2IoX5hNh3UEauY0byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7Sq
# uKaBjhWmirYyANb0RJSLWjinMLXNOAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWS
# hg/tuLjAsKP6SzYZ+1Ry358ZTFcx0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErV
# LjQwK8VtsBdekBmdTbQVoCgPCqr+PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMw
# xCCX3mccFgx6UsQeRSdVVVNSyALQe6PT12418xon2iDGE81OGCreLzDcMAZnrUAx
# 4XQLUz6ZTl65yPUiOh3k7Yww94lDf+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVL
# lz4i3IpaDcR+iuGjH2TdaC1ZOmBXiCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcx
# ghq1MIIasQIBATBxMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBF
# T0MgQ0EgMDMCEzMACDr1N3qTE2x7r0YAAAAIOvUwCwYJYIZIAWUDBAIBoHwwEAYK
# KwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYB
# BAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEILgMN4HcONlb
# IT4H5ZK0/VZ14uJNf4G3TftA0r3uZyYkMAsGCSqGSIb3DQEBAQSCAYBeKMXtmqMG
# FYQRaanUNNynVitWjBes2CRKykrEgd9/GPcEsITvKSgDXRSLv2DMBFWx4FKPyOVc
# 3bwO3lgycKqrVASAaWpJmbyd7rRWQE2Q4IcPk2U9jpAQOoG5ZFu/GYWWWchfkNUT
# Sppf8LyEBMDCcUHPBWW+kRB4r11fa6IDOMCKcPgRqbGzcrOseE7VSnFoQDFoMmKr
# /abKtfstGjKGoINqhQ3CBrU2RSU0U7IvPtRhPtFX/Y+w6kTTq5YqFvZlGE+fGxdd
# swIygkf6a2Aee8t7q69EqpJbyYHjZjpxqkmE/NTB+1xdpxmVhtZbFVoadaBj4+T5
# NEaxkVgS0TpKNMrJKZh8CLAyvcPgaHHGfxvtPt/92l46gBDH5Pn9b1wBtvbAeaQr
# FrOlW7RDw5P7YqLzahGxSmDH2ph7NxMidj17YXqm4vktFrEcc3RyYpg4jqDm62cp
# /5/3EE+ieJsh4c4YJ47/pLMVDUyyv2GtpUZbAs5vuuYmVnc2jThei1qhghgbMIIY
# FwYKKwYBBAGCNwMDATGCGAcwghgDBgkqhkiG9w0BBwKgghf0MIIX8AIBAzEPMA0G
# CWCGSAFlAwQCAQUAMIIBaQYLKoZIhvcNAQkQAQSgggFYBIIBVDCCAVACAQEGCisG
# AQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQgqMGXTLMXcoY60A119Ih2Pgds1b5m
# 5uSf/MulID5Ly/ACBmrJPbRAjhgRMjAyNjEwMTQyMjE3NDEuOVowBIACAfQCBzUU
# 9lWJv+iggeGkgd4wgdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNV
# BAsTHm5TaGllbGQgVFNTIEVTTjo3RDAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWlj
# cm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmggg8hMIIH
# gjCCBWqgAwIBAgITMwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0BAQwFADB3
# MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgw
# RgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2Vy
# dGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5
# MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBp
# bmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ5851Jj
# /eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqO
# QxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEE
# Snt0MbPEoKdNihwM5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtcCEr5ZKTk
# KKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTavwfFP6Xa
# GZGWUG8TZaiTogRoAlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm
# 5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+
# eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7gt8hY64X
# NPO6iyUGsEgt8c2PxF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5JhtYUrlmAbp
# xRjb9tSreDdtACpm3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8KN5YsJBn
# czyWB4JyeeFMW3JBfdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8
# Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAOBgNVHQ8B
# Af8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1L0hjQM97
# 2K9J6T7ZPdshMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w
# EwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEw
# DwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2io
# ojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBS
# b290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBlAYIKwYB
# BQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0
# aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQw
# DQYJKoZIhvcNAQEMBQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/p
# O+4ge/XEizXvhs0Y7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviwpnK3aL5J
# edwzbeBF7POyg6IGG/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+IfvM9lzDm
# c2O2END7MPnrcjWdQnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccOiQljjTW6
# GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1jKu3m9KG
# IqF4aldrYBamyh3g4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i79dKOChmo
# ONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFf
# R4f/gksSkbJp7oqLwliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5ODIRfyoGl5
# 9BsXR/HpRGtiJquOYGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOmkFpvPE8C
# H+EeGGWzqTCjdAsno2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqP
# TXPmaCAJKVHAP19oEjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG2GwYe6Zo
# AF1bMIIHlzCCBX+gAwIBAgITMwAAAF8q5PgjRbwaSQAAAAAAXzANBgkqhkiG9w0B
# AQwFADBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcg
# Q0EgMjAyMDAeFw0yNjA5MTcxODU3MjVaFw0yNzA5MTQxODU3MjVaMIHbMQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3Nv
# ZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046
# N0QwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRp
# bWUgU3RhbXBpbmcgQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEA51SXw150uzdVDaSg9y81N0KF1++mAwWpNpRQgF8rEc9NWiswhKtKgRer
# h+PjXSHbiwIqlZvX4u6VwRDdNmNo2oBRfieExGrTNw56kaLCB31wVvyBMt5Lxi4h
# kIc21Ek+poAzU9EhRgsUr7MYJQLKcBL07GGX3/PGdSrLNTkgxaUz/2oZvcmS4f8q
# qoVBOUh22ia7QFJHPUOa12moxGmze28Fu9+Jxto8kLEZ9Gs9K2CTYrLxs6KSP10W
# wjouAj2fSgqH2POob3euigzLwpmj6Yh+KdJu0NYBNfoEBTJLV7kPx5HoZXkSf/Yz
# 3h9G9XQNFcNibTqtpkR8PpdjYMdRJvnoEVa/8vrfc5sbuYrJkVeZ9H16HVUGDsDH
# WPvLn1MSxMTg4Td3Jv6Y5tnAnl/yHxiQFlE1zW/c2fKfYvD+ZcSeKEYvUTmp31/b
# Z0V8pmEOD9IL3gECb7a6cGhsMZvpzg6WUNpW66CwL/m5MXLEzrM0qJNnYUF1RkaQ
# 8IYuGYzdJPf06i0Cu/deEsiZLbhkCcZG3WVj/JuBjYQiKl8OKwqs//Qawn7OcyxU
# 1cWL3J37x6Pta6CyKrxZ2rriFBMgIDJHJIDJ4kwPinvlkUDbwLnjo0hs0Smi903e
# mDdG9IH/vXGzPSiFIveh+5sg3eiXYbklkfHYZOM5mRP5sE6GXV0CAwEAAaOCAcsw
# ggHHMB0GA1UdDgQWBBRSh08N0S56eMV5ovb2CoDv/Dla3DAfBgNVHSMEGDAWgBRr
# aSg6NS9IY0DPe9ivSek+2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBS
# U0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0w
# azBpBggrBgEFBQcwAoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j
# ZXJ0cy9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBD
# QSUyMDIwMjAuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUH
# AwgwDgYDVR0PAQH/BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBADGi
# VwzuujXhCimnfTFpNUQoBQkG0A1fWl4/K4oqFCh6/JK+xZdA42GNGoIZ5Qbxls4c
# MTDHfECHr+A5ZzIZ9AZODvHkPrvTAbtK3wdaykDvbWLC+LP0SZp3HpeaqX39+MSo
# jslm+AoqpqwQB0xazBrZ/eS2AhaoKNXd0coLhJ9EnwzhO0/C7FgGG+uLWS5qBQ77
# 66vpguEjbftNivU5odo9YXlPuPbmhHRJwBchZSFbLNV/9Jdce6nDzdG519o7sOJw
# zAISLDTlhXN2ezH4NqRIpFYo9O2qvjNXfNDoopqHoeg0BoDPacdouiJTrZ4F2FyY
# S1lwQWrY1CS362zukhFWelBiOk8HCxfyXLPnkrKKIdxIegEVHz/2IzchxQVc9jk2
# d+mUZdUPSGyaYZBAGYYY/XdV5/7G6vC3WoZ4ducToCSzhI4k3p8TlfnsgMaSuQ2/
# MryubX7w6jvPx0+NXhYuS9ROcy2Sgt846q+zAzhWM2aFapwmf/aGvUItPjiEcdNk
# EfwThGLhlO2p+NFDA8eWAX69VCNigGAUhey9PFJkbYstbLExGTLEJB2mmWPplSdQ
# NjiKP1zE5k9lxWydqP9UswvvYMce9QmhL1dZoUye7Y0BuDzUnAaPoKJje3JD9u0d
# YDTUdxqi7D0FZbI4Q0jl4C5L9UtGwfKqLhMdFcMjMYIHRjCCB0ICAQEweDBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAIT
# MwAAAF8q5PgjRbwaSQAAAAAAXzANBglghkgBZQMEAgEFAKCCBJ8wEQYLKoZIhvcN
# AQkQAg8xAgUAMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0B
# CQUxDxcNMjYxMDE0MjIxNzQxWjAvBgkqhkiG9w0BCQQxIgQgxOWZ/8p8T9cGbe+K
# ITT+/WOHo7veojvJhbX+LqNiuM8wgbkGCyqGSIb3DQEJEAIvMYGpMIGmMIGjMIGg
# BCBs9gl+q1f0gODShST0SrC3UF5snHnW4n8wXlLHWy4lwzB8MGWkYzBhMQswCQYD
# VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD
# EylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAA
# AF8q5PgjRbwaSQAAAAAAXzCCA2EGCyqGSIb3DQEJEAISMYIDUDCCA0yhggNIMIID
# RDCCAiwCAQEwggEJoYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z
# MScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046N0QwMC0wNUUwLUQ5NDcxNTAzBgNV
# BAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5
# oiMKAQEwBwYFKw4DAhoDFQBxCTre8Ly7mMuvAIjyU0vuhvLsb6BnMGWkYzBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAN
# BgkqhkiG9w0BAQsFAAIFAO56U60wIhgPMjAyNjEwMTQxOTE3MDFaGA8yMDI2MTAx
# NTE5MTcwMVowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA7npTrQIBADAKAgEAAgIK
# FQIB/zAHAgEAAgISRzAKAgUA7nulLQIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgor
# BgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUA
# A4IBAQB9NDBYh+KNZWmb6qHdWgUkbM9l7GIIEzWX07A+Sl2CjFiuQRAgc8WLRv6e
# 4T73Se/+Z8bhnw5JW+FBTE5ws0S1kShQKOSPpBffYZ+Ws7Zp5npRYwYrARl+PTgR
# gqSGzlQySfmY3ygq/Va06HtSP04CbwWzDhvy8MwJk3S72eG9fLqaRvS1WxYlGbjc
# kmaC+y+zQs6/HU489t2stgvTJX8hYFh3JFOvUmpl6wrTJivNyeEV5dp7nKzdlx2y
# BSvYp1XLtHiGvNFFutDUVJWUEa4AXEpEQ/y6/2EP2PmwJl0flOMi/AkUei3KKuwK
# v0fWKJw7XARl+w89WW6MrsG0sBqzMA0GCSqGSIb3DQEBAQUABIICAM8TfrhA1DXr
# LQYCYShX9Ut1dy+nunaIA6FnoQMFBU1pYhIumLKa9DwmPj458K5j5lamPzfdVjdd
# PSbAsCsMQPSmcVvCs/iA66vrsv87qglOdEioVbsTSeE+YdMybI+VknZkvSaqwJKo
# zVHYztg+BGynZDESxe0S6B7Ya6pIgvA1W27jjXDJA2JnlAnMx4b2FaaTLrQV/z8f
# Rmj0kjK96L82b8H2GEN7/Rc3lmf807bGN+O+6iWoliduDYqmVsxwnhrtx55s8zB4
# +HUCDfDP7c4W99z0kCXEbAOYVoOqwnRJOHMIvp2kFMs529rJnmGCNXOH+k08oHvu
# nNatc/4jmGsIFObZhz6Jy630YQw8CxmrdGfgePq4lK/qxlDrd43/ho3n48xANrWZ
# MWxIM+WUaZrbE7WKZuHrDhhgfcke0Isec7ZSlmvCodo8SxT8pQgJ72rxk73sPznC
# 6hP3JcsoVMfORjbEFDgYK76nk2BwFDmu8BAnc4pNIVPhPtzvaMYevlukdy/GtX+s
# 3/vHpisTv5NNkqtUkcCokOZr5H4YIUm90ZOW49dsrT0TCCq3l+DcS+OGRQ08HsWB
# X9As9npLn4gOhQCppaINnNS5hNaKhKRctkeeUh4QO65/2yhqUQoPqG7cyzokEBe7
# M7mv6TJcnKKuGKUXkzALoXbudtrvO1Dh
# SIG # End signature block