# Installs the standalone oh.exe, verified against the release's # SHA256SUMS.txt. Everything resolves through the update feed # (updates.openheaders.io): the current release from versions/stable.json, # the binary from the feed's dl// path - one first-party domain, # no GitHub reachability needed. # # powershell -c "irm https://updates.openheaders.io/install.ps1 | iex" # # Environment: # OH_INSTALL_DIR install directory (default: %LOCALAPPDATA%\OpenHeaders\bin) # OH_RELEASE_TAG release tag to install (default: current stable) $ErrorActionPreference = 'Stop' $feed = 'https://updates.openheaders.io' $installDir = if ($env:OH_INSTALL_DIR) { $env:OH_INSTALL_DIR } else { Join-Path $env:LOCALAPPDATA 'OpenHeaders\bin' } $tag = if ($env:OH_RELEASE_TAG) { $env:OH_RELEASE_TAG } else { $versions = Invoke-RestMethod -Uri "$feed/versions/stable.json" -UseBasicParsing if (-not $versions.cli.tag) { Write-Error "install-oh: could not resolve the current release from $feed/versions/stable.json" } $versions.cli.tag } $baseUrl = "$feed/dl/$tag" if ($env:PROCESSOR_ARCHITECTURE -ne 'AMD64') { Write-Error "install-oh: only win-x64 binaries are published (this machine: $env:PROCESSOR_ARCHITECTURE) - use the Node channel instead: npm install -g @openheaders/cli" } # Resolve the asset name and checksum from the release manifest. $sums = (Invoke-WebRequest -Uri "$baseUrl/SHA256SUMS.txt" -UseBasicParsing).Content $line = $sums -split "`n" | Where-Object { $_ -match '^\s*([0-9a-f]{64})\s+(oh-[0-9]\S*-win-x64\.exe)\s*$' } | Select-Object -First 1 if (-not $line) { Write-Error 'install-oh: release has no oh binary for win-x64' } $null = $line -match '^\s*([0-9a-f]{64})\s+(oh-[0-9]\S*-win-x64\.exe)\s*$' $expected = $Matches[1] $asset = $Matches[2] $tmpFile = Join-Path ([System.IO.Path]::GetTempPath()) $asset Write-Host "install-oh: downloading $asset" Invoke-WebRequest -Uri "$baseUrl/$asset" -OutFile $tmpFile -UseBasicParsing $actual = (Get-FileHash -Path $tmpFile -Algorithm SHA256).Hash.ToLowerInvariant() if ($actual -ne $expected) { Remove-Item $tmpFile -Force Write-Error "install-oh: checksum mismatch for $asset (expected $expected, got $actual)" } New-Item -ItemType Directory -Path $installDir -Force | Out-Null Move-Item -Path $tmpFile -Destination (Join-Path $installDir 'oh.exe') -Force Write-Host "install-oh: installed $installDir\oh.exe ($asset)" # Put the install dir on the user PATH so new shells find `oh`. $userPath = [Environment]::GetEnvironmentVariable('Path', 'User') if (($userPath -split ';') -notcontains $installDir) { [Environment]::SetEnvironmentVariable('Path', "$userPath;$installDir", 'User') Write-Host "install-oh: added $installDir to your user PATH - open a new terminal to use 'oh.exe'" } Write-Host '' Write-Host 'Note: oh.exe is not code-signed yet; SmartScreen may warn on first run (More info -> Run anyway).' Write-Host "Note: PowerShell aliases 'oh' to its Out-Host cmdlet - run 'oh.exe' there, or add 'Remove-Item Alias:oh' to your PowerShell profile. Other shells (cmd) can use plain 'oh'." & (Join-Path $installDir 'oh.exe') --version # SIG # Begin signature block # MIIlkAYJKoZIhvcNAQcCoIIlgTCCJX0CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB3CeLiCDI+70Zq # csQNeImpmALHJpdoUAsxZ4GodgVlQ6CCEtowggXdMIIDxaADAgECAgh7LJvTFoAy # mTANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx # EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8G # A1UEAwwoU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTAe # Fw0xNjAyMTIxNzM5MzlaFw00MTAyMTIxNzM5MzlaMHwxCzAJBgNVBAYTAlVTMQ4w # DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENv # cnBvcmF0aW9uMTEwLwYDVQQDDChTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBB # dXRob3JpdHkgUlNBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA+Q/d # oyt9y9Aq/uxnhabnLhu6d+Hj9a+k7PpKXZHEV0drGHdrdvL9k+Q9D8IWngtmw1aU # nheDhc5W7/IW/QBi9SIJVOhlF05BueBPRpeqG8i4bmJeabFf2yoCfvxsyvNB2O3Q # 6Pw/YUjtsAMUHRAOSxngu07shmX/NvNeZwILnYZVYf16OO3+4hkAt2+hUGJ1dDyg # +sglkrRueiLH+B6h47LdkTGrKx0E/6VKBDfphaQzK/3i1lU0fBmkSmjHsqjTt8qh # k4jrwZe8jPkd2SKEJHTHBD1qqSmTzOu4W+H+XyWqNFjIwSNUnRuYEcM4nH49hmyl # D0CGfAL0XAJPKMuucZ8POsgz/hElNer8usVgPdl8GNWyqdN1eANyIso6wx/vLOUu # qfqeLLZRRv2vA9bqYGjqhRY2a4XpHsCz3cQk3IAqgUFtlD7I4MmBQQCeXr9/xQiY # ohgsQkCz+W84J0tOgPQ9gUfgiHzqHM61dVxRLhwrfxpyKOcAtdF0xtfkn60Hk7ZT # NTX8N+TD9l0WviFz3pIK+KBjaryWkmo++LxlVZve9Q2JJgT8JRqmJWnLwm3KfOJZ # X5es6+8uyLzXG1k8K8zyGciTaydjGc/86Sb4ynGbf5P+NGeETpnr/LN4CTNwumam # du0bc+sapQ3EIhMglFYKTixsTrH9z5wJuqIz7YcCAwEAAaNjMGEwHQYDVR0OBBYE # FN0ECQei9Xp9UlMSkpXuOIAlDaZZMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgw # FoAU3QQJB6L1en1SUxKSle44gCUNplkwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 # DQEBCwUAA4ICAQAgGBGUKfsmnRweHnBh8ZVyk3EkrWiTWI4yrxuzcAP8JSt0hZA9 # eGr0uYullzu1GJG7Hqf5QFuR+VWZrx4R0Fwdp2bjsZQHDDI5puobsHnYHZxwROOK # 3cT5lR+KOEM/AYWlR6c9RrK85SJo93uc2Cw+CiHILTOsv8WBmTF0wXVxxb6x8CNF # 9J1r/BljnaO8BMYYCyW7U4kPs4BQ3kXuRH+rlHhkmNP2KN2H2HBldPsOuRPrpw9h # qTKWzN677WNMGLupQPegVG4giHF1GOp6tDRy4CMnd1y2kOqGJUCr7zMPy5+CvqIg # +/a1LRrmwoWxdA/7yGUCpFIBR91JIsG/2OtrrH7e7GMzFbcjCI/GD41BWt2OxbmP # 5UU/eNu60htAsf5xTT/ggaK6XrTsFeCT3QgffuFVmQsh3pOeCvvmo0m9NjD+53ey # oHWXtS2BiBdlIPfakACfyVLMMso1fPU9D9gr1/UmbMkGNJYW6nBZGjJ5eQu2iH8P # Ukg9v2zYokQu0U63cljTiROV/kSr+NeLG26cvCygW9VqAK9fN+HV+hALmJyG5yaP # zvDsbopXC4DjTrLAoGNhkLpVaDd0araS25+hhiK2ZScO7LafQmDkZ8K12kELxNOL # YRu8+h+RK9dEB166KazZxenvU0ha64DxKFghzbAGVfsnP1OQcKkEHlcnuTCCBnIw # ggRaoAMCAQICCGQzUdPHOJ8IMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVT # MQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NM # IENvcnBvcmF0aW9uMTEwLwYDVQQDDChTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlv # biBBdXRob3JpdHkgUlNBMB4XDTE2MDYyNDIwNDQzMFoXDTMxMDYyNDIwNDQzMFow # eDELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9u # MREwDwYDVQQKDAhTU0wgQ29ycDE0MDIGA1UEAwwrU1NMLmNvbSBDb2RlIFNpZ25p # bmcgSW50ZXJtZWRpYXRlIENBIFJTQSBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP # ADCCAgoCggIBAJ+DE3OqsMZtIcvbi3qHdNBx3I6Xcprku4g0tN2AA8YvRaR0mr8e # D1Dqnm1485/6USapPZ3RspRXPvs5iRuRK1bvZ8vmC+MOOYzGNfSMPd0l6QGsF0J9 # WBZA3PnVKEQdlWQwYTpk8pfXc0x9eyMCbfN161U9b6otxK++dKxd/mq2/OpceekP # Q5y1UgUP7z6xsY/QSa2m40IZVD/zLw6hy3z+E/kjOdolHLg+AEo6bzIwN2Qex651 # B9hV0hjJDoq8o1zwfAqnhYHCDq+PmVzTYCW8g1ppHCUTzXL165yAm9wsZ8TdyQmY # 1XPrxCGj5TKOPi9SmMZgN2SMsm9KVHIYzCeH+s11omMhTLU9ZP0rpptVryZMYLS5 # XP6rQ72t0BNmUB8L0omm/9eABvHDEQIzM2EX91Yfji87aOcV8XdWSimeA9rCKyZh # MlugVuVJKY02p/XHUqJWAyAvOHiAvfYGrkE0y5RFvZvHiRgfC7r/qa5qQJkT3e9Q # 3wG68gTW0DHfNDheV1vIOB5W1KxIpu3/+bjBO+3CJL5EYKd3zdU9mFm0Q+qqYH3N # wuUv8ev11CDVlzRuXQRrBRHS05KMCSdE7U81MUZ+dBkFYuyJ4+ojcJjk0S/UihMY # RpNl5Vhz00w9J3oiP8P4o1W3+eaHguxFHsVuOnyxTrmraPebY9WRQbypAgMBAAGj # gfswgfgwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTdBAkHovV6fVJTEpKV # 7jiAJQ2mWTAwBggrBgEFBQcBAQQkMCIwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3Nw # cy5zc2wuY29tMBEGA1UdIAQKMAgwBgYEVR0gADATBgNVHSUEDDAKBggrBgEFBQcD # AzA7BgNVHR8ENDAyMDCgLqAshipodHRwOi8vY3Jscy5zc2wuY29tL3NzbC5jb20t # cnNhLVJvb3RDQS5jcmwwHQYDVR0OBBYEFFTC/hCVAJPNavXnwNfZsku4jwzjMA4G # A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEA9Q8mh3CvmaLK9dbJ8I1m # PTmC04gj2IK/j1SEJ7bTgwfXnieJTYSOVNEg7mBD21dCPMewlfa+zOqjPY5PBsYr # WYZ/63MbyuVAJuA9b8z2vXHGzX0OIEA51gXSr5QIv3/CUbcrtXuDIfBj2uWc4Wku # dR1Oy2Ee9aUz3wKdFdntaZNXukZFLoC8Zb7nEj7eR/+QnBCt9laypNT61vwuvJch # s3aD0pH6BlDRsYAogP7brQ9n7fh93NlwW3q6aLWzSmYXj+fw51fdaf68XuHVjJ8T # u5WaFft5K4XVbT5nR24bB1z7VEUPFhEuEcOwvLVuHDNXlB7+QjRGjjFQTtszV5X6 # OOTmEturWC5Ft9kiyvRaR0ksKOhPjEI8ZGjp5kOsGZGpxxOCX/xxCje3nVB7PF33 # olKCNeS159MKb2v+jfmk19UdS+d9Ygj42desmUnbtYRBFC72LmCXU0ua/vGIenS6 # nnXp4NqnycwsO3tMCnjPlPc2YLaDPIpUy04NaCqUEXUmFOogN8zreRd2VXhxbeJJ # ODM32+RsWccjYua8zi5US/1eAyrI3R5LcUTQdT4xYmWLKabtJOF6HYQ0f6QXfLSs # fT81WMvDvxrdn1RWbUXlU/OIiisxo8o+UNEANOwnCMNnxlzoaL/PLhZluDxm/zuy # lauajZ3MlPDteFB/7GRHo50wggZ/MIIEZ6ADAgECAhAuHxiYQYKS+IBlytP27olr # MA0GCSqGSIb3DQEBCwUAMHgxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQ # MA4GA1UEBwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxNDAyBgNVBAMMK1NT # TC5jb20gQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBDQSBSU0EgUjEwHhcNMjYw # NzMwMTkwMzM3WhcNMjcwODA3MTkwMzM3WjBmMQswCQYDVQQGEwJSTzEUMBIGA1UE # CAwLSWFzaSBDb3VudHkxDTALBgNVBAcMBElhc2kxGDAWBgNVBAoMD0JJVEhVQiBU # RUFNIFNSTDEYMBYGA1UEAwwPQklUSFVCIFRFQU0gU1JMMIIBojANBgkqhkiG9w0B # AQEFAAOCAY8AMIIBigKCAYEAwiNYQdWUKn0YXARal6tDov6fM1lw44XvX2v3jA2z # 2sx6rXQpr+UxA+OfXb997Ol6oxIFDpXnzJ0D5gqM4GD1hk86a2e37fsawvplTDTP # 3LHM2+0qrCD+Ni1g+w0yf0pPCZyaiPw+LiEvF6wBqk+YwqNWGHFIrWuJ3tcyRBUY # 7krLNXD1WmhkMOd+Gdihib8dZZJ+ej1KfWLGlR3ATaHzxfmGTzTz4tl8R7zWNwix # Cx1NcbfFfKR+lXQeq69vQrUIzhPaJeMlBuFk9kjQp8NWagCtjNSD1raO7hrsPXYH # sxheJk0eF1wJZbx2Ul19DZYXdDqd2xxcdm6kWl5Stb7KdfjKj10hIiwICTl6HbOL # PNJKPylVoz4YDILtoqxmAXyktURhMNRvqPEi7Z8mJKgWaCg8DTw4K4+749xXEp4V # le7ZK4JiY3JYnnIiFjKXV7oha7GxB/qsneahSMD1DYwg97kxpPyzg3hdevuPg6iA # 00bUl10UxmPa6Axnmiknr64FAgMBAAGjggGVMIIBkTAMBgNVHRMBAf8EAjAAMB8G # A1UdIwQYMBaAFFTC/hCVAJPNavXnwNfZsku4jwzjMHoGCCsGAQUFBwEBBG4wbDBI # BggrBgEFBQcwAoY8aHR0cDovL2NlcnQuc3NsLmNvbS9TU0xjb20tU3ViQ0EtQ29k # ZVNpZ25pbmctUlNBLTQwOTYtUjEuY2VyMCAGCCsGAQUFBzABhhRodHRwOi8vb2Nz # cHMuc3NsLmNvbTBRBgNVHSAESjBIMAgGBmeBDAEEATA8BgwrBgEEAYKpMAEDAwEw # LDAqBggrBgEFBQcCARYeaHR0cHM6Ly93d3cuc3NsLmNvbS9yZXBvc2l0b3J5MBMG # A1UdJQQMMAoGCCsGAQUFBwMDME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9jcmxz # LnNzbC5jb20vU1NMY29tLVN1YkNBLUNvZGVTaWduaW5nLVJTQS00MDk2LVIxLmNy # bDAdBgNVHQ4EFgQUP5GG3AzLjWRS2NjngwYgEO5Efn4wDgYDVR0PAQH/BAQDAgeA # MA0GCSqGSIb3DQEBCwUAA4ICAQAlSHOHBeOY8LPt/rAIKaJN1YfZzA6js8gMautc # EcQo/jKHYeo8JFYBgbfHUVLNoZ9DhVQSRp6v1xDCMSUcwMdJa/9W4kzwZUHuBo7d # /Cd560rsw0DQPBzWr+73bx/KqpW9hn2rSPNPXt3uAPUw5EL1aaAcZFDztxfrxsPl # 6Nw8KmhJ8KHYQGe9gRyIUZZjHN7xPTImXfw0rhP/SgWbSN6EVH9SJ/cOaZVtH34W # 3jp8hzza9DSPb4vO0GzEtyq93OHq6Dti+wM8+8W6N3XB2UWqprYrfqE5ANGGD6E9 # sK6FiNBH2m/KwD9J6XCFjq9VEyXKa9j3rscSR8du54f6t/2dTxKYJB8DMRzptmqe # tjVNY+9uvuAjIQWASysSPuk3/wc4ael/GRHDe6vNMgJsi+GSFiTPcEyUeCGa6Xfz # cJQ7W8MHrBpHKE1ckF4UCVZ4Z4s+UrF54iahIKfeVpKv/QMdjLVL/5T0mUo7ySs4 # Eio4v09zqLcnuRi4tSBHOJFiiY4epc+sKirxpQYlh3hR0Xys+V6ZVXkkVnqR4NKu # TszoeAM8ku89aoP7Xd5Zj7qRV7yXm7Z0Sukpo1mEHsSHBqMb+BuTB9xeiJ4fJCwS # LNcys4UpqZHVm7boDVU9ScDYoWZ5mFkPaKePqEuUxdDa2Y4lzPfFqPM1Jv7sCuj9 # LbwjWTGCEgwwghIIAgEBMIGMMHgxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhh # czEQMA4GA1UEBwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxNDAyBgNVBAMM # K1NTTC5jb20gQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBDQSBSU0EgUjECEC4f # GJhBgpL4gGXK0/buiWswDQYJYIZIAWUDBAIBBQCgga8wFAYKKwYBBAGCNwIBDDEG # MAShAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsx # DjAMBgorBgEEAYI3AgEVMC0GCSqGSIb3DQEJNDEgMB4wDQYJYIZIAWUDBAIBBQCh # DQYJKoZIhvcNAQELBQAwLwYJKoZIhvcNAQkEMSIEICzmHV7tK7s1SPMg/yhhQawj # iRzPiXcNWHx/4tmNy9dNMA0GCSqGSIb3DQEBCwUABIIBgK+/d06rp6EVh1hxTmK2 # 2iCuO+8qes4+1GSBogiGUWxjTLFcCAcNgVnWrj1cb4HPvvWRREjjMBJcOfYDpiJM # uY9s9CTV5yIwI4owiRmX586/uUcv1v3xb4HfPNPNxd7CCDacBQPKd1pj6SzXrjOM # w9wGsjOnFsW/ZLKjiDr6ons+UNqkMypj4qCtJNBra9hVhbKGlNJ/yw0+7Jemw9xt # GqYfkC4D2GRfAOI8Zg3R+M15f1U1P9KwYp9OrAfjA0gNcw2CXZbrhVhavuNvx4bt # ysfL8QdTM9QcoU/qmFuSxBlyimBWWM6hvsRCoglVbeA3UqVaA2qZmUATOVQc2Z5g # LBqgNwv4MCHMelp3aKZKFSb0QNjfzabeAb84YJv5K8BDS6VlYbp3WCnjKgF5x3wR # SaI4hmLX0V5n5GPD/GMxGxW37ZdjmowEh821ycyr1HarRM2GhzZTu55Q5mUXcS3O # XYEBxrIZsqa4CGJIxpKa/S6360SyGP1qgNv7cOh12EfQS6GCDx4wgg8aBgorBgEE # AYI3AwMBMYIPCjCCDwYGCSqGSIb3DQEHAqCCDvcwgg7zAgEDMQ0wCwYJYIZIAWUD # BAIBMH8GCyqGSIb3DQEJEAEEoHAEbjBsAgEBBgwrBgEEAYKpMAEDBgEwMTANBglg # hkgBZQMEAgEFAAQgdHtijb0ThIL/3ttD4iEMWnNHDLGe0ZHmAC1Vg9qr458CCBo3 # G4etWVynGA8yMDI2MDgxNDEwMzY1N1owAwIBAQIGAZ//2KnSoIIMADCCBPwwggLk # oAMCAQICEB9rFmLSLhtsXfHAwaBgDjgwDQYJKoZIhvcNAQELBQAwczELMAkGA1UE # BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMREwDwYDVQQK # DAhTU0wgQ29ycDEvMC0GA1UEAwwmU1NMLmNvbSBUaW1lc3RhbXBpbmcgSXNzdWlu # ZyBSU0EgQ0EgUjEwHhcNMjUwMjE4MTYzMjAyWhcNMzQxMTEyMTg1MDA1WjBuMQsw # CQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xETAP # BgNVBAoMCFNTTCBDb3JwMSowKAYDVQQDDCFTU0wuY29tIFRpbWVzdGFtcGluZyBV # bml0IDIwMjUgRTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQb+1FRx2/mVZbs # T15XxNzOrYNF56vHYnPjt7zzgkaWpVDNbzvQPhkc0lVY8soB4WKwcOtlyxYdZL+3 # vskXf2k2o4IBWjCCAVYwHwYDVR0jBBgwFoAUDJ0QJY6apxuZh0PPCH7hvYGQ9M8w # UQYIKwYBBQUHAQEERTBDMEEGCCsGAQUFBzAChjVodHRwOi8vY2VydC5zc2wuY29t # L1NTTC5jb20tdGltZVN0YW1waW5nLUktUlNBLVIxLmNlcjBRBgNVHSAESjBIMDwG # DCsGAQQBgqkwAQMGATAsMCoGCCsGAQUFBwIBFh5odHRwczovL3d3dy5zc2wuY29t # L3JlcG9zaXRvcnkwCAYGZ4EMAQQCMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMEYG # A1UdHwQ/MD0wO6A5oDeGNWh0dHA6Ly9jcmxzLnNzbC5jb20vU1NMLmNvbS10aW1l # U3RhbXBpbmctSS1SU0EtUjEuY3JsMB0GA1UdDgQWBBTOfNnABIDFJBBqCeocqyU9 # Ef2o0jAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAIBzdSSFvWZT # YqdOxX2Pa9SycCyk5dYf8va9QYw4BzBM+1Oye5gMt9icQNSi8owgiajZLkX4Qxxh # RH2bY0zq7uwEDA0g4lA7wgnN42s+acvYxr8CHuZ6ZC216l4QPkqgsxu9fVEooMIR # 5GK+7/DYl6GmNF7tN6dAYmWa3mZaZ4JhgffvOjfeBaiBcdiOWeYrru3eI+2gDmQT # cX1PYxQyCBg7Vn1ngqRdEPKyxP9wxw5cySrOSJd4v1aDpe601Pd/KEq8TMMMOhgw # ZSl/Kxh8b5I4CG/TF5FYJSUgx7DQGQ3gkv4p2sShwPgobgfCuDsSMWupNXvnhwcq # WpAGN8Lje8Oz5T5oTepOSHamZ9x2R7NlY6EfONWfcJlTxXRg3ZAWe1zpm+TmVGir # n7L7REdFW2Ng5M2qgGiLbdZHPiPhVM+z4lc9j1M6XoJH7UUcb6z8iC9PG5SU52zE # NF66gzdKxH7ky7+F4YZysiWl4cQlHYzv3EbpjM2d+UE1DCLQVstcRqdIsqBVZwMm # tqT7FTLgCPrMtc8ZTkvZeYksbyifIKZ6ToI6mE2u7tXsmaPuCZXBqIokdey7YTE6 # xdautrTucTqSPLcVGeoLShrZCVesHY/r2S3MCmdjPdxqlaTqOlAZRo8dbCrFWewC # FMyWZYuDSdDNimHK3zZ5Xm5GCqQ50qlsMIIG/DCCBOSgAwIBAgIQbVIYcIfoI02F # YADQgI+TVjANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwF # VGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlv # bjExMC8GA1UEAwwoU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 # IFJTQTAeFw0xOTExMTMxODUwMDVaFw0zNDExMTIxODUwMDVaMHMxCzAJBgNVBAYT # AlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjERMA8GA1UECgwI # U1NMIENvcnAxLzAtBgNVBAMMJlNTTC5jb20gVGltZXN0YW1waW5nIElzc3Vpbmcg # UlNBIENBIFIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArlEQE9L5 # PCCgIIXeyVAcZMnh/cXpNP8KfzFI6HJaxV6oYf3xh/dRXPu35tDBwhOwPsJjoqgY # /Tg6yQGBqt65t94wpx0rAgTVgEGMqGri6vCI6rEtSZVy9vagzTDHcGfFDc0Eu71m # TAyeNCUhjaYTBkyANqp9m6IRrYEXOKdd/eREsqVDmhryd7dBTS9wbipm+mHLTHEF # BdrKqKDM3fPYdBOro3bwQ6OmcDZ1qMY+2Jn1o0l4N9wORrmPcpuEGTOThFYKPHm8 # /wfoMocgizTYYeDG/+MbwkwjFZjWKwb4hoHT2WK8pvGW/OE0Apkrl9CZSy2ulitW # juqpcCEm2/W1RofOunpCm5Qv10T9tIALtQo73GHIlIDU6xhYPH/ACYEDzgnNfwgn # WiUmMISaUnYXijp0IBEoDZmGT4RTguiCmjAFF5OVNbY03BQoBb7wK17SuGswFlDj # tWN33ZXSAS+i45My1AmCTZBV6obAVXDzLgdJ1A1ryyXz4prLYyfJReEuhAsVp5Vo # uzhJVcE57dRrUanmPcnb7xi57VPhXnCuw26hw1Hd+ulK3jJEgbc3rwHPWqqGT541 # TI7xaldaWDo85k4lR2bQHPNGwHxXuSy3yczyOg57TcqqG6cE3r0KR6jwzfaqjTvN # 695GsPAPY/h2YksNgF+XBnUD9JBtL4c34AcCAwEAAaOCAYEwggF9MBIGA1UdEwEB # /wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAU3QQJB6L1en1SUxKSle44gCUNplkwgYMG # CCsGAQUFBwEBBHcwdTBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5zc2wuY29tL3Jl # cG9zaXRvcnkvU1NMY29tUm9vdENlcnRpZmljYXRpb25BdXRob3JpdHlSU0EuY3J0 # MCAGCCsGAQUFBzABhhRodHRwOi8vb2NzcHMuc3NsLmNvbTA/BgNVHSAEODA2MDQG # BFUdIAAwLDAqBggrBgEFBQcCARYeaHR0cHM6Ly93d3cuc3NsLmNvbS9yZXBvc2l0 # b3J5MBMGA1UdJQQMMAoGCCsGAQUFBwMIMDsGA1UdHwQ0MDIwMKAuoCyGKmh0dHA6 # Ly9jcmxzLnNzbC5jb20vc3NsLmNvbS1yc2EtUm9vdENBLmNybDAdBgNVHQ4EFgQU # DJ0QJY6apxuZh0PPCH7hvYGQ9M8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB # CwUAA4ICAQCSGXUNplpCzxkH2fL8lPrAm/AV6USWWi9xM91Q5RN7mZN3D8T7cm1X # y7qmnItFukgdtiUzLbQokDJyFTrF1pyLgGw/2hU3FJEywSN8crPsBGo812lyWFgA # g0uOwUYw7WJQ1teICycX/Fug0KB94xwxhsvJBiRTpQyhu/2Kyu1Bnx7QQBA1Xupc # mfhbQrK5O3Q/yIi//kN0OkhQEiS0NlyPPYoRboHWC++wogzV6yNjBbKUBrMFxABq # R7mkA0x1Kfy3Ud08qyLC5Z86C7JFBrMBfyhfPpKVlIiiTQuKz1rTa8ZW12ERoHRH # cfEjI1EwwpZXXK5J5RcW6h7FZq/cZE9kLRZhvnRKtb+X7CCtLx2h61ozDJmifYvu # KhiUg9LLWH0Or9D3XU+xKRsRnfOuwHWuhWch8G7kEmnTG9CtD9Dgtq+68KgVHtAW # jKk2ui1s1iLYAYxnDm13jMZm0KpRM9mLQHBK5Gb4dFgAQwxOFPBslf99hXWgLyYE # 33vTIi9p0gYqGHv4OZh1ElgGsvyKdUUJkAr5hfbDX6pYScJI8v9VNYm1JEyFAV9x # 4MpskL6kE2Sy8rOqS9rQnVnIyPWLi8N9K4GZvPit/Oy+8nFL6q5kN2SZbox5d69Y # YFe+rN1sDD4CpNWwBBTI/q0V4pkgvhL99IV2XasjHZf4peSrHdL4RjGCAlgwggJU # AgEBMIGHMHMxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwH # SG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxLzAtBgNVBAMMJlNTTC5jb20gVGlt # ZXN0YW1waW5nIElzc3VpbmcgUlNBIENBIFIxAhAfaxZi0i4bbF3xwMGgYA44MAsG # CWCGSAFlAwQCAaCCAWEwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqG # SIb3DQEJBTEPFw0yNjA4MTQxMDM2NTdaMCgGCSqGSIb3DQEJNDEbMBkwCwYJYIZI # AWUDBAIBoQoGCCqGSM49BAMCMC8GCSqGSIb3DQEJBDEiBCDGOu4Mcw1wCd1LRZb3 # LRpWGOPvg8SKhPoY/YRiH1qLKTCByQYLKoZIhvcNAQkQAi8xgbkwgbYwgbMwgbAE # IFQq+aFqjXIuZhFJeIrplMGKmq7lplyzRKJUmvlseceLMIGLMHekdTBzMQswCQYD # VQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xETAPBgNV # BAoMCFNTTCBDb3JwMS8wLQYDVQQDDCZTU0wuY29tIFRpbWVzdGFtcGluZyBJc3N1 # aW5nIFJTQSBDQSBSMQIQH2sWYtIuG2xd8cDBoGAOODAKBggqhkjOPQQDAgRHMEUC # IDMKPB+46D+quKLW/2BhW7r46SHx6nA64PSnweQhHS/+AiEAuZAy4rn0HLU8wmcD # 576EZhCdbOoqnCA2/KanUZrzIok= # SIG # End signature block