123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656 |
- <#
- .SYNOPSIS
- KeePassXC Release Tool
- .DESCRIPTION
- Commands:
- merge Merge release branch into main branch and create release tags
- build Build and package binary release from sources
- sign Sign previously compiled release packages
- .NOTES
- The following are descriptions of certain parameters:
- -Vcpkg Specify VCPKG toolchain location (example: C:\vcpkg)
- -Tag Release tag to check out (defaults to version number)
- -Snapshot Build current HEAD without checkout out Tag
- -CMakeGenerator Override the default CMake generator
- -CMakeOptions Additional CMake options for compiling the sources
- -CPackGenerators Set CPack generators (default: WIX;ZIP)
- -Compiler Compiler to use (example: g++, clang, msbuild)
- -MakeOptions Options to pass to the make program
- -SignBuild Perform platform specific App Signing before packaging
- -SignCert Specify the App Signing Certificate
- -TimeStamp Explicitly set the timestamp server to use for appsign
- -SourceBranch Source branch to merge from (default: 'release/$Version')
- -TargetBranch Target branch to merge to (default: master)
- -VSToolChain Specify Visual Studio Toolchain by name if more than one is available
- #>
- param(
- [Parameter(ParameterSetName = "merge", Mandatory, Position = 0)]
- [switch] $Merge,
- [Parameter(ParameterSetName = "build", Mandatory, Position = 0)]
- [switch] $Build,
- [Parameter(ParameterSetName = "sign", Mandatory, Position = 0)]
- [switch] $Sign,
- [Parameter(ParameterSetName = "merge", Mandatory, Position = 1)]
- [Parameter(ParameterSetName = "build", Mandatory, Position = 1)]
- [Parameter(ParameterSetName = "sign", Mandatory, Position = 1)]
- [string] $Version,
- [Parameter(ParameterSetName = "build", Mandatory)]
- [string] $Vcpkg,
- [Parameter(ParameterSetName = "sign", Mandatory)]
- [SupportsWildcards()]
- [string[]] $SignFiles,
- # [Parameter(ParameterSetName = "build")]
- # [switch] $DryRun,
- [Parameter(ParameterSetName = "build")]
- [switch] $Snapshot,
- [Parameter(ParameterSetName = "build")]
- [switch] $SignBuild,
-
- [Parameter(ParameterSetName = "build")]
- [string] $CMakeGenerator = "Ninja",
- [Parameter(ParameterSetName = "build")]
- [string] $CMakeOptions,
- [Parameter(ParameterSetName = "build")]
- [string] $CPackGenerators = "WIX;ZIP",
- [Parameter(ParameterSetName = "build")]
- [string] $Compiler,
- [Parameter(ParameterSetName = "build")]
- [string] $MakeOptions,
- [Parameter(ParameterSetName = "build")]
- [Parameter(ParameterSetName = "sign")]
- [X509Certificate] $SignCert,
- [Parameter(ParameterSetName = "build")]
- [Parameter(ParameterSetName = "sign")]
- [string] $Timestamp = "http://timestamp.sectigo.com",
- [Parameter(ParameterSetName = "merge")]
- [Parameter(ParameterSetName = "build")]
- [Parameter(ParameterSetName = "sign")]
- [string] $GpgKey = "CFB4C2166397D0D2",
- [Parameter(ParameterSetName = "merge")]
- [Parameter(ParameterSetName = "build")]
- [string] $SourceDir = ".",
- [Parameter(ParameterSetName = "build")]
- [string] $OutDir = ".\release",
- [Parameter(ParameterSetName = "merge")]
- [Parameter(ParameterSetName = "build")]
- [string] $Tag,
- [Parameter(ParameterSetName = "merge")]
- [string] $SourceBranch,
- [Parameter(ParameterSetName = "build")]
- [string] $VSToolChain,
- [Parameter(ParameterSetName = "merge")]
- [Parameter(ParameterSetName = "build")]
- [Parameter(ParameterSetName = "sign")]
- [string] $ExtraPath
- )
- # Helper function definitions
- function Test-RequiredPrograms {
- # If any of these fail they will throw an exception terminating the script
- if ($Build) {
- Get-Command git | Out-Null
- Get-Command cmake | Out-Null
- }
- if ($Merge) {
- Get-Command git | Out-Null
- Get-Command tx | Out-Null
- Get-Command lupdate | Out-Null
- }
- if ($Sign) {
- Get-Command gpg | Out-Null
- }
- }
- function Test-VersionInFiles {
- # Check CMakeLists.txt
- $Major, $Minor, $Patch = $Version.split(".", 3)
- if (!(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MAJOR `"$Major`"" -Quiet) `
- -or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MINOR `"$Minor`"" -Quiet) `
- -or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_PATCH `"$Patch`"" -Quiet)) {
- throw "CMakeLists.txt has not been updated to $Version."
- }
- # Check Changelog
- if (!(Select-String "$SourceDir\CHANGELOG.md" -pattern "^## $Version \(\d{4}-\d{2}-\d{2}\)$" -Quiet)) {
- throw "CHANGELOG.md does not contain a section for $Version."
- }
- # Check AppStreamInfo
- if (!(Select-String "$SourceDir\share\linux\org.keepassxc.KeePassXC.appdata.xml" `
- -pattern "<release version=`"$Version`" date=`"\d{4}-\d{2}-\d{2}`">" -Quiet)) {
- throw "share/linux/org.keepassxc.KeePassXC.appdata.xml does not contain a section for $Version."
- }
- }
- function Test-WorkingTreeClean {
- & git diff-index --quiet HEAD --
- if ($LASTEXITCODE) {
- throw "Current working tree is not clean! Please commit or unstage any changes."
- }
- }
- function Invoke-VSToolchain([String] $Toolchain, [String] $Path, [String] $Arch) {
- # Find Visual Studio installations
- $vs = Get-CimInstance MSFT_VSInstance -Namespace root/cimv2/vs
-
- if ($vs.count -eq 0) {
- $err = "No Visual Studio installations found, download one from https://visualstudio.com/downloads."
- $err = "$err`nIf Visual Studio is installed, you may need to repair the install then restart."
- throw $err
- }
- $VSBaseDir = $vs[0].InstallLocation
- if ($Toolchain) {
- # Try to find the specified toolchain by name
- foreach ($_ in $vs) {
- if ($_.Name -eq $Toolchain) {
- $VSBaseDir = $_.InstallLocation
- break
- }
- }
- } elseif ($vs.count -gt 1) {
- # Ask the user which install to use
- $i = 0
- foreach ($_ in $vs) {
- $i = $i + 1
- $i.ToString() + ") " + $_.Name | Write-Host
- }
- $i = Read-Host -Prompt "Which Visual Studio installation do you want to use?"
- $i = [Convert]::ToInt32($i, 10) - 1
- if ($i -lt 0 -or $i -ge $vs.count) {
- throw "Invalid selection made"
- }
- $VSBaseDir = $vs[$i].InstallLocation
- }
-
- # Bootstrap the specified VS Toolchain
- Import-Module "$VSBaseDir\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
- Enter-VsDevShell -VsInstallPath $VSBaseDir -Arch $Arch -StartInPath $Path | Write-Host
- Write-Host # Newline after command output
- }
- function Invoke-Cmd([string] $command, [string[]] $options = @(), [switch] $maskargs, [switch] $quiet) {
- $call = ('{0} {1}' -f $command, ($options -Join ' '))
- if ($maskargs) {
- Write-Host "$command <masked>" -ForegroundColor DarkGray
- }
- else {
- Write-Host $call -ForegroundColor DarkGray
- }
- if ($quiet) {
- Invoke-Expression $call > $null
- } else {
- Invoke-Expression $call
- }
- if ($LASTEXITCODE -ne 0) {
- throw "Failed to run command: {0}" -f $command
- }
- Write-Host #insert newline after command output
- }
- function Find-SignCert() {
- $certs = Get-ChildItem Cert:\CurrentUser\My -codesign
- if ($certs.Count -eq 0) {
- throw "No code signing certificate found in User certificate store"
- } elseif ($certs.Count -gt 1) {
- # Ask the user which to use
- $i = 0
- foreach ($_ in $certs) {
- $i = $i + 1
- $i.ToString() + ") $($_.Thumbprint) - $($_.NotAfter)" | Write-Host
- }
- $i = Read-Host -Prompt "Which certificate do you want to use?"
- $i = [Convert]::ToInt32($i, 10) - 1
- if ($i -lt 0 -or $i -ge $certs.count) {
- throw "Invalid selection made"
- }
- return $certs[$i]
- } else {
- Write-Host "Found signing certificate: $($certs[0].Subject) ($($certs[0].Thumbprint))" -ForegroundColor Cyan
- Write-Host
- return $certs[0]
- }
- }
- function Invoke-SignFiles([string[]] $files, [X509Certificate] $cert, [string] $time) {
- if ($files.Length -eq 0) {
- return
- }
- Write-Host "Signing files using $($cert.Subject) ($($cert.Thumbprint))" -ForegroundColor Cyan
-
- foreach ($_ in $files) {
- Write-Host "Signing file '$_'"
- $tmp = Set-AuthenticodeSignature -Certificate $cert -FilePath "$_" -TimestampServer "$Timestamp" -HashAlgorithm "SHA256"
- }
- }
- function Invoke-GpgSignFiles([string[]] $files, [string] $key) {
- if ($files.Length -eq 0) {
- return
- }
- Write-Host "Signing files using GPG key $key" -ForegroundColor Cyan
- foreach ($_ in $files) {
- Write-Host "Signing file '$_' and creating DIGEST..."
- if (Test-Path "$_.sig") {
- Remove-Item "$_.sig"
- }
- Invoke-Cmd "gpg" "--output `"$_.sig`" --armor --local-user `"$key`" --detach-sig `"$_`""
- $FileName = (Get-Item $_).Name
- (Get-FileHash "$_" SHA256).Hash + " *$FileName" | Out-File "$_.DIGEST" -NoNewline
- }
- }
- # Handle errors and restore state
- $OrigDir = (Get-Location).Path
- $OrigBranch = & git rev-parse --abbrev-ref HEAD
- $ErrorActionPreference = 'Stop'
- trap {
- Write-Host "Restoring state..." -ForegroundColor Yellow
- & git checkout $OrigBranch
- Set-Location "$OrigDir"
- }
- Write-Host "KeePassXC Release Preparation Helper" -ForegroundColor Green
- Write-Host "Copyright (C) 2022 KeePassXC Team <https://keepassxc.org/>`n" -ForegroundColor Green
- # Prepend extra PATH locations as specified
- if ($ExtraPath) {
- $env:Path = "$ExtraPath;$env:Path"
- }
- # Resolve absolute directory for paths
- $SourceDir = (Resolve-Path $SourceDir).Path
- $OutDir = (Resolve-Path $OutDir).Path
- # Check format of -Version
- if ($Version -notmatch "^\d+\.\d+\.\d+(-Beta\d*)?$") {
- throw "Invalid format for -Version input"
- }
- # Check platform
- if (!$IsWindows) {
- throw "The PowerShell release tool is not available for Linux or macOS at this time."
- }
- if ($Merge) {
- Test-RequiredPrograms
- # Change to SourceDir
- Set-Location "$SourceDir"
- Test-VersionInFiles
- Test-WorkingTreeClean
- if (!$SourceBranch.Length) {
- $SourceBranch = & git branch --show-current
- }
- if ($SourceBranch -notmatch "^release/.*$") {
- throw "Must be on a release/* branch to continue."
- }
- # Update translation files
- Write-Host "Updating source translation file..."
- Invoke-Cmd "lupdate" "-no-ui-lines -disable-heuristic similartext -locations none", `
- "-extensions c,cpp,h,js,mm,qrc,ui -no-obsolete ./src -ts share/translations/keepassxc_en.ts"
- Write-Host "Pulling updated translations from Transifex..."
- Invoke-Cmd "tx" "pull -af --minimum-perc=60 -r keepassxc.share-translations-keepassxc-en-ts--develop"
- # Only commit if there are changes
- $changes = & git status --porcelain
- if ($changes.Length -gt 0) {
- Write-Host "Committing translation updates..."
- Invoke-Cmd "git" "add -A ./share/translations/" -quiet
- Invoke-Cmd "git" "commit -m `"Update translations`"" -quiet
- }
- # Read the version release notes from CHANGELOG
- $Changelog = ""
- $ReadLine = $false
- Get-Content "CHANGELOG.md" | ForEach-Object {
- if ($ReadLine) {
- if ($_ -match "^## ") {
- $ReadLine = $false
- } else {
- $Changelog += $_ + "`n"
- }
- } elseif ($_ -match "$Version \(\d{4}-\d{2}-\d{2}\)") {
- $ReadLine = $true
- }
- }
- Write-Host "Creating tag for '$Version'..."
- $tmp = New-TemporaryFile
- "Release $Version`n$Changelog" | Out-File $tmp.FullName
- Invoke-Cmd "git" "tag -a `"$Version`" -F `"$tmp`" -s" -quiet
- Remove-Item $tmp.FullName -Force
- Write-Host "Moving latest tag..."
- Invoke-Cmd "git" "tag -f -a `"latest`" -m `"Latest stable release`" -s" -quiet
- Write-Host "All done!"
- Write-Host "Please merge the release branch back into the develop branch now and then push your changes."
- Write-Host "Don't forget to also push the tags using 'git push --tags'."
- } elseif ($Build) {
- $Vcpkg = (Resolve-Path "$Vcpkg/scripts/buildsystems/vcpkg.cmake").Path
- # Find Visual Studio and establish build environment
- Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
- if ($SignBuild && !$SignCert) {
- $SignCert = Find-SignCert
- }
- Test-RequiredPrograms
- if ($Snapshot) {
- $Tag = "HEAD"
- $SourceBranch = & git rev-parse --abbrev-ref HEAD
- $ReleaseName = "$Version-snapshot"
- $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Snapshot -DOVERRIDE_VERSION=`"$ReleaseName`" $CMakeOptions"
- Write-Host "Using current branch '$SourceBranch' to build." -ForegroundColor Cyan
- } else {
- Test-WorkingTreeClean
- # Clear output directory
- if (Test-Path $OutDir) {
- Remove-Item $OutDir -Recurse
- }
-
- if ($Version -match "-beta\d*$") {
- $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=PreRelease $CMakeOptions"
- } else {
- $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Release $CMakeOptions"
- }
- # Setup Tag if not defined then checkout tag
- if ($Tag -eq "" -or $Tag -eq $null) {
- $Tag = $Version
- }
- Write-Host "Checking out tag 'tags/$Tag' to build." -ForegroundColor Cyan
- Invoke-Cmd "git" "checkout `"tags/$Tag`""
- }
- # Create directories
- New-Item "$OutDir" -ItemType Directory -Force | Out-Null
- $OutDir = (Resolve-Path $OutDir).Path
- $BuildDir = "$OutDir\build-release"
- New-Item "$BuildDir" -ItemType Directory -Force | Out-Null
- # Enter build directory
- Set-Location "$BuildDir"
- # Setup CMake options
- $CMakeOptions = "-DWITH_XC_ALL=ON -DWITH_TESTS=OFF -DCMAKE_BUILD_TYPE=Release $CMakeOptions"
- $CMakeOptions = "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=`"$Vcpkg`" -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON $CMakeOptions"
- Write-Host "Configuring build..." -ForegroundColor Cyan
- Invoke-Cmd "cmake" "-G `"$CMakeGenerator`" $CMakeOptions `"$SourceDir`""
- Write-Host "Compiling sources..." -ForegroundColor Cyan
- Invoke-Cmd "cmake" "--build . --config Release -- $MakeOptions"
-
- if ($SignBuild) {
- $VcpkgDir = $BuildDir + "\vcpkg_installed\"
- if (Test-Path $VcpkgDir) {
- $files = Get-ChildItem $VcpkgDir -Filter "*.dll" -Recurse -File |
- Where-Object {$_.FullName -notlike "$VcpkgDir*debug\*" -and $_.FullName -notlike "$VcpkgDir*tools\*"} |
- ForEach-Object {$_.FullName}
- }
- $files += Get-ChildItem "$BuildDir\src" -Include "*keepassxc*.exe", "*keepassxc*.dll" -Recurse -File | ForEach-Object { $_.FullName }
- Invoke-SignFiles $files $SignCert $Timestamp
- }
- Write-Host "Create deployment packages..." -ForegroundColor Cyan
- Invoke-Cmd "cpack" "-G `"$CPackGenerators`""
- Move-Item "$BuildDir\keepassxc-*" -Destination "$OutDir" -Force
- if ($SignBuild) {
- # Enter output directory
- Set-Location -Path "$OutDir"
- # Sign MSI files using AppSign key
- $files = Get-ChildItem $OutDir -Include "*.msi" -Name
- Invoke-SignFiles $files $SignCert $Timestamp
- # Sign all output files using the GPG key then hash them
- $files = Get-ChildItem $OutDir -Include "*.msi", "*.zip" -Name
- Invoke-GpgSignFiles $files $GpgKey
- }
- # Restore state
- Invoke-Command {git checkout $OrigBranch}
- Set-Location "$OrigDir"
- } elseif ($Sign) {
- Test-RequiredPrograms
- if (!$SignCert) {
- $SignCert = Find-SignCert
- }
- # Resolve wildcard paths
- $ResolvedFiles = @()
- foreach ($_ in $SignFiles) {
- $ResolvedFiles += (Get-ChildItem $_ -File | ForEach-Object { $_.FullName })
- }
- $AppSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|exe|dll)$" })
- Invoke-SignFiles $AppSignFiles $SignCert $Timestamp
- $GpgSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|zip|gz|xz|dmg|appimage)$" })
- Invoke-GpgSignFiles $GpgSignFiles $GpgKey
- }
- # SIG # Begin signature block
- # MIIk4QYJKoZIhvcNAQcCoIIk0jCCJM4CAQExDzANBglghkgBZQMEAgEFADB5Bgor
- # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
- # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCccYNZIS81XLXj
- # I4u2xwAAZSxeq/ghk/Li/aWf6Pd9dKCCHqUwggU6MIIEIqADAgECAhBYotctjMD9
- # icz/IeDU7cdKMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAkdCMRswGQYDVQQI
- # ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT
- # D1NlY3RpZ28gTGltaXRlZDEkMCIGA1UEAxMbU2VjdGlnbyBSU0EgQ29kZSBTaWdu
- # aW5nIENBMB4XDTIxMDMxNTAwMDAwMFoXDTI0MDMxNDIzNTk1OVowgaExCzAJBgNV
- # BAYTAlVTMQ4wDAYDVQQRDAUyMjMxNTERMA8GA1UECAwIVmlyZ2luaWExEjAQBgNV
- # BAcMCUZyYW5jb25pYTEbMBkGA1UECQwSNjY1MyBBdWRyZXkgS2F5IEN0MR4wHAYD
- # VQQKDBVEcm9pZE1vbmtleSBBcHBzLCBMTEMxHjAcBgNVBAMMFURyb2lkTW9ua2V5
- # IEFwcHMsIExMQzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALAH0v/7
- # XOVxc5Auhi92tgBZL0Hm6L7sT1xcKfrBwHg12ZpFs0zeR1ZzyduM44d45y3aNXNW
- # 7+klHVJqAj5XVHUF/OB/O5bnljKIeupdAZ8v3GGokBZK91BGKe+WRn5ZjdDGc6HN
- # xCT4FMth1TCrTg7eMy/u+cfp+4ur8dcSyAM5tkLsTIoS1VtZWjiepjS1RO+Ile9E
- # j+wUM3wO9Qt5/BlYi8XsbXU0V4oi3bj6EMLO9UEq0SfsM2YUY7UIkAHtLPiMV7BX
- # gw/WC+IwB8ZtIGpq/JEME4bt51pJVvVmrjzbKgc0Cz6akhArZIa9QooAkrbAINvO
- # Cm+7mx/PBK2lzSECAwEAAaOCAZAwggGMMB8GA1UdIwQYMBaAFA7hOqhTOjHVir7B
- # u61nGgOFrTQOMB0GA1UdDgQWBBTu7ZZnt+omJoze71KXMDAYGGhYfTAOBgNVHQ8B
- # Af8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzARBglg
- # hkgBhvhCAQEEBAMCBBAwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIBAwIwJTAjBggr
- # BgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQQBMEMGA1Ud
- # HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1JTQUNv
- # ZGVTaWduaW5nQ0EuY3JsMHMGCCsGAQUFBwEBBGcwZTA+BggrBgEFBQcwAoYyaHR0
- # cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBQ29kZVNpZ25pbmdDQS5jcnQw
- # IwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEB
- # CwUAA4IBAQAPbD9O3krI9tfYz6FZXCCqkqbjaeTpo3Ye9Kn4paWsHa37OIv7UhFf
- # CrtLRXunZ7Vkry5cvMGNQNUaMFy6CHmEYb3kwZWW3EImuv9uTUd7rYvszBXF8flv
- # kysT+8L9wdxLEQHUBnBnFgqMM99HzVuINVyH75d4qa9TF9PhcajsxwmpPgr9NwvC
- # KNJv8BaxdH6vYFcQCqCygbfuST99s8qKaknTuHF39E1hWkTfcT3fMJDVONzW0/cN
- # ourxylLqMZRjk007NGCnaYZwYfKW/pD/F/jmo28eKoVVy129j2h/RAWODl5gOvis
- # sNr6aSz1/Ul3xoNYpyx8IGeWiFMoh99tMIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX
- # 02wQ3TE1lTANBgkqhkiG9w0BAQwFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
- # R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFD
- # b21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZp
- # Y2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYT
- # AlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEe
- # MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1
- # c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
- # AAOCAg8AMIICCgKCAgEAgBJlFzYOw9sIs9CsVw127c0n00ytUINh4qogTQktZAnc
- # zomfzD2p7PbPwdzx07HWezcoEStH2jnGvDoZtF+mvX2do2NCtnbyqTsrkfjib9Ds
- # FiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQIjy8/hPwhxR79uQfjtTkUcYRZ0YIUcuG
- # FFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfbIWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9X
- # Wrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeU
- # vlM3kHND8zLDU+/bqv50TmnHa4xgk97Exwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP
- # 8yUmazNt925H+nND5X4OpWaxKXwyhGNVicQNwZNUMBkTrNN9N6frXTpsNVzbQdcS
- # 2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5D9kCnusSTJV882sFqV4Wg8y4Z+LoE53M
- # W4LTTLPtW//e5XOsIzstAL81VXQJSdhJWBp/kjbmUZIO8yZ9HE0XvMnsQybQv0Ff
- # QKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLe
- # vni3/GcV4clXhB4PY9bpYrrWX1Uu6lzGKAgEJTm4Diup8kyXHAc/DVL17e8vgg8C
- # AwEAAaOB8jCB7zAfBgNVHSMEGDAWgBSgEQojPpbxB+zirynvgqV/0DCktDAdBgNV
- # HQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgGGMA8GA1Ud
- # EwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSG
- # Mmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0FBQUNlcnRpZmljYXRlU2VydmljZXMu
- # Y3JsMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29t
- # b2RvY2EuY29tMA0GCSqGSIb3DQEBDAUAA4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDm
- # y14R3iJvm3WOnnL+5Nb+qh+cli3vA0p+rvSNb3I8QzvAP+u431yqqcau8vzY7qN7
- # Q/aGNnwU4M309z/+3ri0ivCRlv79Q2R+/czSAaF9ffgZGclCKxO/WIu6pKJmBHaI
- # kU4MiRTOok3JMrO66BQavHHxW/BBC5gACiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWv
- # u6rvP3t3O9LEApE9GQDTF1w52z97GA1FzZOFli9d31kWTz9RvdVFGD/tSo7oBmF0
- # Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyAvGp4z7h/jnZymQyd/teRCBaho1+VMIIF
- # 9TCCA92gAwIBAgIQHaJIMG+bJhjQguCWfTPTajANBgkqhkiG9w0BAQwFADCBiDEL
- # MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
- # eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
- # JVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgxMTAy
- # MDAwMDAwWhcNMzAxMjMxMjM1OTU5WjB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS
- # R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9T
- # ZWN0aWdvIExpbWl0ZWQxJDAiBgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmlu
- # ZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIYijTKFehifSfCW
- # L2MIHi3cfJ8Uz+MmtiVmKUCGVEZ0MWLFEO2yhyemmcuVMMBW9aR1xqkOUGKlUZEQ
- # auBLYq798PgYrKf/7i4zIPoMGYmobHutAMNhodxpZW0fbieW15dRhqb0J+V8aouV
- # Hltg1X7XFpKcAC9o95ftanK+ODtj3o+/bkxBXRIgCFnoOc2P0tbPBrRXBbZOoT5X
- # ax+YvMRi1hsLjcdmG0qfnYHEckC14l/vC0X/o84Xpi1VsLewvFRqnbyNVlPG8Lp5
- # UEks9wO5/i9lNfIi6iwHr0bZ+UYc3Ix8cSjz/qfGFN1VkW6KEQ3fBiSVfQ+noXw6
- # 2oY1YdMCAwEAAaOCAWQwggFgMB8GA1UdIwQYMBaAFFN5v1qqK0rPVIDh2JvAnfKy
- # A2bLMB0GA1UdDgQWBBQO4TqoUzox1Yq+wbutZxoDha00DjAOBgNVHQ8BAf8EBAMC
- # AYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHSUEFjAUBggrBgEFBQcDAwYIKwYB
- # BQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6
- # Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0
- # aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9j
- # cnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggr
- # BgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwF
- # AAOCAgEATWNQ7Uc0SmGk295qKoyb8QAAHh1iezrXMsL2s+Bjs/thAIiaG20QBwRP
- # vrjqiXgi6w9G7PNGXkBGiRL0C3danCpBOvzW9Ovn9xWVM8Ohgyi33i/klPeFM4Mt
- # SkBIv5rCT0qxjyT0s4E307dksKYjalloUkJf/wTr4XRleQj1qZPea3FAmZa6ePG5
- # yOLDCBaxq2NayBWAbXReSnV+pbjDbLXP30p5h1zHQE1jNfYw08+1Cg4LBH+gS667
- # o6XQhACTPlNdNKUANWlsvp8gJRANGftQkGG+OY96jk32nw4e/gdREmaDJhlIlc5K
- # ycF/8zoFm/lv34h/wCOe0h5DekUxwZxNqfBZslkZ6GqNKQQCd3xLS81wvjqyVVp4
- # Pry7bwMQJXcVNIr5NsxDkuS6T/FikyglVyn7URnHoSVAaoRXxrKdsbwcCtp8Z359
- # LukoTBh+xHsxQXGaSynsCz1XUNLK3f2eBVHlRHjdAd6xdZgNVCT98E7j4viDvXK6
- # yz067vBeF5Jobchh+abxKgoLpbn0nu6YMgWFnuv5gynTxix9vTp3Los3QqBqgu07
- # SqqUEKThDfgXxbZaeTMYkuO1dfih6Y4KJR7kHvGfWocj/5+kUZ77OYARzdu1xKeo
- # gG/lU9Tg46LC0lsa+jImLWpXcBw8pFguo/NbSwfcMlnzh6cabVgwggbsMIIE1KAD
- # AgECAhAwD2+s3WaYdHypRjaneC25MA0GCSqGSIb3DQEBDAUAMIGIMQswCQYDVQQG
- # EwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkx
- # HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRy
- # dXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xOTA1MDIwMDAwMDBa
- # Fw0zODAxMTgyMzU5NTlaMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVy
- # IE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28g
- # TGltaXRlZDElMCMGA1UEAxMcU2VjdGlnbyBSU0EgVGltZSBTdGFtcGluZyBDQTCC
- # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMgbAa/ZLH6ImX0BmD8gkL2c
- # gCFUk7nPoD5T77NawHbWGgSlzkeDtevEzEk0y/NFZbn5p2QWJgn71TJSeS7JY8IT
- # m7aGPwEFkmZvIavVcRB5h/RGKs3EWsnb111JTXJWD9zJ41OYOioe/M5YSdO/8zm7
- # uaQjQqzQFcN/nqJc1zjxFrJw06PE37PFcqwuCnf8DZRSt/wflXMkPQEovA8NT7OR
- # AY5unSd1VdEXOzQhe5cBlK9/gM/REQpXhMl/VuC9RpyCvpSdv7QgsGB+uE31DT/b
- # 0OqFjIpWcdEtlEzIjDzTFKKcvSb/01Mgx2Bpm1gKVPQF5/0xrPnIhRfHuCkZpCkv
- # RuPd25Ffnz82Pg4wZytGtzWvlr7aTGDMqLufDRTUGMQwmHSCIc9iVrUhcxIe/arK
- # CFiHd6QV6xlV/9A5VC0m7kUaOm/N14Tw1/AoxU9kgwLU++Le8bwCKPRt2ieKBtKW
- # h97oaw7wW33pdmmTIBxKlyx3GSuTlZicl57rjsF4VsZEJd8GEpoGLZ8DXv2DolNn
- # yrH6jaFkyYiSWcuoRsDJ8qb/fVfbEnb6ikEk1Bv8cqUUotStQxykSYtBORQDHin6
- # G6UirqXDTYLQjdprt9v3GEBXc/Bxo/tKfUU2wfeNgvq5yQ1TgH36tjlYMu9vGFCJ
- # 10+dM70atZ2h3pVBeqeDAgMBAAGjggFaMIIBVjAfBgNVHSMEGDAWgBRTeb9aqitK
- # z1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUGqH4YRkgD8NBd0UojtE1XwYSBFUwDgYD
- # VR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYB
- # BQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6
- # Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0
- # aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9j
- # cnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggr
- # BgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwF
- # AAOCAgEAbVSBpTNdFuG1U4GRdd8DejILLSWEEbKw2yp9KgX1vDsn9FqguUlZkCls
- # Ycu1UNviffmfAO9Aw63T4uRW+VhBz/FC5RB9/7B0H4/GXAn5M17qoBwmWFzztBEP
- # 1dXD4rzVWHi/SHbhRGdtj7BDEA+N5Pk4Yr8TAcWFo0zFzLJTMJWk1vSWVgi4zVx/
- # AZa+clJqO0I3fBZ4OZOTlJux3LJtQW1nzclvkD1/RXLBGyPWwlWEZuSzxWYG9vPW
- # S16toytCiiGS/qhvWiVwYoFzY16gu9jc10rTPa+DBjgSHSSHLeT8AtY+dwS8BDa1
- # 53fLnC6NIxi5o8JHHfBd1qFzVwVomqfJN2Udvuq82EKDQwWli6YJ/9GhlKZOqj0J
- # 9QVst9JkWtgqIsJLnfE5XkzeSD2bNJaaCV+O/fexUpHOP4n2HKG1qXUfcb9bQ11l
- # PVCBbqvw0NP8srMftpmWJvQ8eYtcZMzN7iea5aDADHKHwW5NWtMe6vBE5jJvHOsX
- # TpTDeGUgOw9Bqh/poUGd/rG4oGUqNODeqPk85sEwu8CgYyz8XBYAqNDEf+oRnR4G
- # xqZtMl20OAkrSQeq/eww2vGnL8+3/frQo4TZJ577AWZ3uVYQ4SBuxq6x+ba6yDVd
- # M3aO8XwgDCp3rrWiAoa6Ke60WgCxjKvj+QrJVF3UuWp0nr1Irpgwggb1MIIE3aAD
- # AgECAhA5TCXhfKBtJ6hl4jvZHSLUMA0GCSqGSIb3DQEBDAUAMH0xCzAJBgNVBAYT
- # AkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZv
- # cmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2VjdGlnbyBS
- # U0EgVGltZSBTdGFtcGluZyBDQTAeFw0yMzA1MDMwMDAwMDBaFw0zNDA4MDIyMzU5
- # NTlaMGoxCzAJBgNVBAYTAkdCMRMwEQYDVQQIEwpNYW5jaGVzdGVyMRgwFgYDVQQK
- # Ew9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMMI1NlY3RpZ28gUlNBIFRpbWUgU3Rh
- # bXBpbmcgU2lnbmVyICM0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
- # pJMoUkvPJ4d2pCkcmTjA5w7U0RzsaMsBZOSKzXewcWWCvJ/8i7u7lZj7JRGOWogJ
- # ZhEUWLK6Ilvm9jLxXS3AeqIO4OBWZO2h5YEgciBkQWzHwwj6831d7yGawn7XLMO6
- # EZge/NMgCEKzX79/iFgyqzCz2Ix6lkoZE1ys/Oer6RwWLrCwOJVKz4VQq2cDJaG7
- # OOkPb6lampEoEzW5H/M94STIa7GZ6A3vu03lPYxUA5HQ/C3PVTM4egkcB9Ei4GOG
- # p7790oNzEhSbmkwJRr00vOFLUHty4Fv9GbsfPGoZe267LUQqvjxMzKyKBJPGV4ag
- # czYrgZf6G5t+iIfYUnmJ/m53N9e7UJ/6GCVPE/JefKmxIFopq6NCh3fg9EwCSN1Y
- # pVOmo6DtGZZlFSnF7TMwJeaWg4Ga9mBmkFgHgM1Cdaz7tJHQxd0BQGq2qBDu9o16
- # t551r9OlSxihDJ9XsF4lR5F0zXUS0Zxv5F4Nm+x1Ju7+0/WSL1KF6NpEUSqizADK
- # h2ZDoxsA76K1lp1irScL8htKycOUQjeIIISoh67DuiNye/hU7/hrJ7CF9adDhdgr
- # OXTbWncC0aT69c2cPcwfrlHQe2zYHS0RQlNxdMLlNaotUhLZJc/w09CRQxLXMn2Y
- # bON3Qcj/HyRU726txj5Ve/Fchzpk8WBLBU/vuS/sCRMCAwEAAaOCAYIwggF+MB8G
- # A1UdIwQYMBaAFBqh+GEZIA/DQXdFKI7RNV8GEgRVMB0GA1UdDgQWBBQDDzHIkSqT
- # vWPz0V1NpDQP0pUBGDAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADAWBgNV
- # HSUBAf8EDDAKBggrBgEFBQcDCDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEBAgEDCDAl
- # MCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBBAIw
- # RAYDVR0fBD0wOzA5oDegNYYzaHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdv
- # UlNBVGltZVN0YW1waW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA/BggrBgEFBQcw
- # AoYzaHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBVGltZVN0YW1waW5n
- # Q0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkq
- # hkiG9w0BAQwFAAOCAgEATJtlWPrgec/vFcMybd4zket3WOLrvctKPHXefpRtwyLH
- # BJXfZWlhEwz2DJ71iSBewYfHAyTKx6XwJt/4+DFlDeDrbVFXpoyEUghGHCrC3vLa
- # ikXzvvf2LsR+7fjtaL96VkjpYeWaOXe8vrqRZIh1/12FFjQn0inL/+0t2v++kwzs
- # baINzMPxbr0hkRojAFKtl9RieCqEeajXPawhj3DDJHk6l/ENo6NbU9irALpY+zWA
- # T18ocWwZXsKDcpCu4MbY8pn76rSSZXwHfDVEHa1YGGti+95sxAqpbNMhRnDcL411
- # TCPCQdB6ljvDS93NkiZ0dlw3oJoknk5fTtOPD+UTT1lEZUtDZM9I+GdnuU2/zA2x
- # OjDQoT1IrXpl5Ozf4AHwsypKOazBpPmpfTXQMkCgsRkqGCGyyH0FcRpLJzaq4Jgc
- # g3Xnx35LhEPNQ/uQl3YqEqxAwXBbmQpA+oBtlGF7yG65yGdnJFxQjQEg3gf3AdT4
- # LhHNnYPl+MolHEQ9J+WwhkcqCxuEdn17aE+Nt/cTtO2gLe5zD9kQup2ZLHzXdR+P
- # EMSU5n4k5ZVKiIwn1oVmHfmuZHaR6Ej+yFUK7SnDH944psAU+zI9+KmDYjbIw74A
- # hxyr+kpCHIkD3PVcfHDZXXhO7p9eIOYJanwrCKNI9RX8BE/fzSEceuX1jhrUuUAx
- # ggWSMIIFjgIBATCBkDB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBN
- # YW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExp
- # bWl0ZWQxJDAiBgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQQIQWKLX
- # LYzA/YnM/yHg1O3HSjANBglghkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQow
- # CKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
- # AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCClTHkKOG5BeIXQuZeR
- # qwwE8AAIAc5Ygaq8ElaHav3yZDANBgkqhkiG9w0BAQEFAASCAQBDfc08YhR0CGst
- # QY87ZyIwWXCkS5no07miWZo806Rhl28AqeNlIsYm4RHxtXTTLfENz3Wkc8h/2fnQ
- # +3MAif0m8CAXd5bQUHXXK01wI0ksKMpYNVZEjEeqjFuO22kT4RbUhTwI437Xa/iG
- # j+OZB1bWYdsClMY15vTkrGLyGZGxK7nGVyYcAzFL9oZNg5izhA7z3X8B4tP/VIZ6
- # vhZTOw75gTiOoS4pJX+0lGBMj1URs6Hh1/oXI10hTaopD2DGGTljQME2B495LhN4
- # WRQ2WTZLhEBHLHe5bNBA/F7rWhzKZ8qpwQfLdG2CeYyCPn2zAb3Se/tW4xsKFPbV
- # nXCrfarsoYIDSzCCA0cGCSqGSIb3DQEJBjGCAzgwggM0AgEBMIGRMH0xCzAJBgNV
- # BAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh
- # bGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2VjdGln
- # byBSU0EgVGltZSBTdGFtcGluZyBDQQIQOUwl4XygbSeoZeI72R0i1DANBglghkgB
- # ZQMEAgIFAKB5MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkF
- # MQ8XDTI0MDMwOTIxMjE1OVowPwYJKoZIhvcNAQkEMTIEMFC4yhLWLtNfpFox+egv
- # RCh29BdkBTGJcqIcz8DJK2RcrmfQu5cDRW2Sgeh0PMRvRTANBgkqhkiG9w0BAQEF
- # AASCAgCWWrib6aQ86zx7NB0PetoKZkzv9q76m7auuJiM83uFrpke3UlUf8DgxwTC
- # RZEV9pwnCDjZ3VU0CGwC1eVr2tgZx3ylYvHSfE8xFtYLKQjk5O2Y/d+SyYGgyHs9
- # rLNMhZmK5Qj5JP6KJhNkLi3zZYbyP6xCnwv72nHKdl76xOAulJnb7G24wm/WRqQH
- # 9AhQ0ZVdGcWYYYpOa1eWCe6wdvFlgfCLQwZWU3a54I28pa02jFaRaX9ZSlf9kr2T
- # MBbcylZYvyVc0bDgIyIjVQAj/rQjvRiwpnxlruhm24/HfY3B3M0GdSbGB0E1z69h
- # uiyDjBhRHCPWbATs5ruM6pY/csGTvB7kl6+qfym0sg3t1aOd1LzYBD2/O+FxuDlM
- # cjBp8h2CTGs7R+moephhASSjVRte8sr0GRMRLRVFiUK4W/QzWRc3e371NmMeADsr
- # 4PCfiOfyzpkl6Bf5rXyEvRPnnSjQ5jaVVbSfh66++6o81mJF3ZehVlBUVdV8qvLm
- # YmRe6kjhhh0xXu8uaC1YA3uyXNPJCB0su9mZrou8gIBF9xcexQnEd9HPF9uydJHj
- # d5xTor+6XVzpiEJHDYPfOIiA4ojrT++q5WVd3TZue/XiQUGnYlvWAzUdMi7cO+Ek
- # SMuWviD9lMHkfhtLzBKdcC4DDcEPYRQ7NCwL6mLO4bZi748S8Q==
- # SIG # End signature block
|