release-tool.ps1 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. <#
  2. .SYNOPSIS
  3. KeePassXC Release Tool
  4. .DESCRIPTION
  5. Commands:
  6. merge Merge release branch into main branch and create release tags
  7. build Build and package binary release from sources
  8. sign Sign previously compiled release packages
  9. .NOTES
  10. The following are descriptions of certain parameters:
  11. -Vcpkg Specify VCPKG toolchain location (example: C:\vcpkg)
  12. -Tag Release tag to check out (defaults to version number)
  13. -Snapshot Build current HEAD without checkout out Tag
  14. -CMakeGenerator Override the default CMake generator
  15. -CMakeOptions Additional CMake options for compiling the sources
  16. -CPackGenerators Set CPack generators (default: WIX;ZIP)
  17. -Compiler Compiler to use (example: g++, clang, msbuild)
  18. -MakeOptions Options to pass to the make program
  19. -SignBuild Perform platform specific App Signing before packaging
  20. -SignCert Specify the App Signing Certificate
  21. -TimeStamp Explicitly set the timestamp server to use for appsign
  22. -SourceBranch Source branch to merge from (default: 'release/$Version')
  23. -TargetBranch Target branch to merge to (default: master)
  24. -VSToolChain Specify Visual Studio Toolchain by name if more than one is available
  25. #>
  26. param(
  27. [Parameter(ParameterSetName = "merge", Mandatory, Position = 0)]
  28. [switch] $Merge,
  29. [Parameter(ParameterSetName = "build", Mandatory, Position = 0)]
  30. [switch] $Build,
  31. [Parameter(ParameterSetName = "sign", Mandatory, Position = 0)]
  32. [switch] $Sign,
  33. [Parameter(ParameterSetName = "merge", Mandatory, Position = 1)]
  34. [Parameter(ParameterSetName = "build", Mandatory, Position = 1)]
  35. [Parameter(ParameterSetName = "sign", Mandatory, Position = 1)]
  36. [string] $Version,
  37. [Parameter(ParameterSetName = "build", Mandatory)]
  38. [string] $Vcpkg,
  39. [Parameter(ParameterSetName = "sign", Mandatory)]
  40. [SupportsWildcards()]
  41. [string[]] $SignFiles,
  42. # [Parameter(ParameterSetName = "build")]
  43. # [switch] $DryRun,
  44. [Parameter(ParameterSetName = "build")]
  45. [switch] $Snapshot,
  46. [Parameter(ParameterSetName = "build")]
  47. [switch] $SignBuild,
  48. [Parameter(ParameterSetName = "build")]
  49. [string] $CMakeGenerator = "Ninja",
  50. [Parameter(ParameterSetName = "build")]
  51. [string] $CMakeOptions,
  52. [Parameter(ParameterSetName = "build")]
  53. [string] $CPackGenerators = "WIX;ZIP",
  54. [Parameter(ParameterSetName = "build")]
  55. [string] $Compiler,
  56. [Parameter(ParameterSetName = "build")]
  57. [string] $MakeOptions,
  58. [Parameter(ParameterSetName = "build")]
  59. [Parameter(ParameterSetName = "sign")]
  60. [X509Certificate] $SignCert,
  61. [Parameter(ParameterSetName = "build")]
  62. [Parameter(ParameterSetName = "sign")]
  63. [string] $Timestamp = "http://timestamp.sectigo.com",
  64. [Parameter(ParameterSetName = "merge")]
  65. [Parameter(ParameterSetName = "build")]
  66. [Parameter(ParameterSetName = "sign")]
  67. [string] $GpgKey = "CFB4C2166397D0D2",
  68. [Parameter(ParameterSetName = "merge")]
  69. [Parameter(ParameterSetName = "build")]
  70. [string] $SourceDir = ".",
  71. [Parameter(ParameterSetName = "build")]
  72. [string] $OutDir = ".\release",
  73. [Parameter(ParameterSetName = "merge")]
  74. [Parameter(ParameterSetName = "build")]
  75. [string] $Tag,
  76. [Parameter(ParameterSetName = "merge")]
  77. [string] $SourceBranch,
  78. [Parameter(ParameterSetName = "build")]
  79. [string] $VSToolChain,
  80. [Parameter(ParameterSetName = "merge")]
  81. [Parameter(ParameterSetName = "build")]
  82. [Parameter(ParameterSetName = "sign")]
  83. [string] $ExtraPath
  84. )
  85. # Helper function definitions
  86. function Test-RequiredPrograms {
  87. # If any of these fail they will throw an exception terminating the script
  88. if ($Build) {
  89. Get-Command git | Out-Null
  90. Get-Command cmake | Out-Null
  91. }
  92. if ($Merge) {
  93. Get-Command git | Out-Null
  94. Get-Command tx | Out-Null
  95. Get-Command lupdate | Out-Null
  96. }
  97. if ($Sign) {
  98. Get-Command gpg | Out-Null
  99. }
  100. }
  101. function Test-VersionInFiles {
  102. # Check CMakeLists.txt
  103. $Major, $Minor, $Patch = $Version.split(".", 3)
  104. if (!(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MAJOR `"$Major`"" -Quiet) `
  105. -or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MINOR `"$Minor`"" -Quiet) `
  106. -or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_PATCH `"$Patch`"" -Quiet)) {
  107. throw "CMakeLists.txt has not been updated to $Version."
  108. }
  109. # Check Changelog
  110. if (!(Select-String "$SourceDir\CHANGELOG.md" -pattern "^## $Version \(\d{4}-\d{2}-\d{2}\)$" -Quiet)) {
  111. throw "CHANGELOG.md does not contain a section for $Version."
  112. }
  113. # Check AppStreamInfo
  114. if (!(Select-String "$SourceDir\share\linux\org.keepassxc.KeePassXC.appdata.xml" `
  115. -pattern "<release version=`"$Version`" date=`"\d{4}-\d{2}-\d{2}`">" -Quiet)) {
  116. throw "share/linux/org.keepassxc.KeePassXC.appdata.xml does not contain a section for $Version."
  117. }
  118. }
  119. function Test-WorkingTreeClean {
  120. & git diff-index --quiet HEAD --
  121. if ($LASTEXITCODE) {
  122. throw "Current working tree is not clean! Please commit or unstage any changes."
  123. }
  124. }
  125. function Invoke-VSToolchain([String] $Toolchain, [String] $Path, [String] $Arch) {
  126. # Find Visual Studio installations
  127. $vs = Get-CimInstance MSFT_VSInstance -Namespace root/cimv2/vs
  128. if ($vs.count -eq 0) {
  129. $err = "No Visual Studio installations found, download one from https://visualstudio.com/downloads."
  130. $err = "$err`nIf Visual Studio is installed, you may need to repair the install then restart."
  131. throw $err
  132. }
  133. $VSBaseDir = $vs[0].InstallLocation
  134. if ($Toolchain) {
  135. # Try to find the specified toolchain by name
  136. foreach ($_ in $vs) {
  137. if ($_.Name -eq $Toolchain) {
  138. $VSBaseDir = $_.InstallLocation
  139. break
  140. }
  141. }
  142. } elseif ($vs.count -gt 1) {
  143. # Ask the user which install to use
  144. $i = 0
  145. foreach ($_ in $vs) {
  146. $i = $i + 1
  147. $i.ToString() + ") " + $_.Name | Write-Host
  148. }
  149. $i = Read-Host -Prompt "Which Visual Studio installation do you want to use?"
  150. $i = [Convert]::ToInt32($i, 10) - 1
  151. if ($i -lt 0 -or $i -ge $vs.count) {
  152. throw "Invalid selection made"
  153. }
  154. $VSBaseDir = $vs[$i].InstallLocation
  155. }
  156. # Bootstrap the specified VS Toolchain
  157. Import-Module "$VSBaseDir\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
  158. Enter-VsDevShell -VsInstallPath $VSBaseDir -Arch $Arch -StartInPath $Path | Write-Host
  159. Write-Host # Newline after command output
  160. }
  161. function Invoke-Cmd([string] $command, [string[]] $options = @(), [switch] $maskargs, [switch] $quiet) {
  162. $call = ('{0} {1}' -f $command, ($options -Join ' '))
  163. if ($maskargs) {
  164. Write-Host "$command <masked>" -ForegroundColor DarkGray
  165. }
  166. else {
  167. Write-Host $call -ForegroundColor DarkGray
  168. }
  169. if ($quiet) {
  170. Invoke-Expression $call > $null
  171. } else {
  172. Invoke-Expression $call
  173. }
  174. if ($LASTEXITCODE -ne 0) {
  175. throw "Failed to run command: {0}" -f $command
  176. }
  177. Write-Host #insert newline after command output
  178. }
  179. function Find-SignCert() {
  180. $certs = Get-ChildItem Cert:\CurrentUser\My -codesign
  181. if ($certs.Count -eq 0) {
  182. throw "No code signing certificate found in User certificate store"
  183. } elseif ($certs.Count -gt 1) {
  184. # Ask the user which to use
  185. $i = 0
  186. foreach ($_ in $certs) {
  187. $i = $i + 1
  188. $i.ToString() + ") $($_.Thumbprint) - $($_.NotAfter)" | Write-Host
  189. }
  190. $i = Read-Host -Prompt "Which certificate do you want to use?"
  191. $i = [Convert]::ToInt32($i, 10) - 1
  192. if ($i -lt 0 -or $i -ge $certs.count) {
  193. throw "Invalid selection made"
  194. }
  195. return $certs[$i]
  196. } else {
  197. Write-Host "Found signing certificate: $($certs[0].Subject) ($($certs[0].Thumbprint))" -ForegroundColor Cyan
  198. Write-Host
  199. return $certs[0]
  200. }
  201. }
  202. function Invoke-SignFiles([string[]] $files, [X509Certificate] $cert, [string] $time) {
  203. if ($files.Length -eq 0) {
  204. return
  205. }
  206. Write-Host "Signing files using $($cert.Subject) ($($cert.Thumbprint))" -ForegroundColor Cyan
  207. foreach ($_ in $files) {
  208. $sig = Get-AuthenticodeSignature -FilePath "$_" -ErrorAction SilentlyContinue
  209. if ($sig.Status -ne "Valid") {
  210. Write-Host "Signing file '$_'"
  211. $tmp = Set-AuthenticodeSignature -Certificate $cert -FilePath "$_" -TimestampServer "$Timestamp" -HashAlgorithm "SHA256"
  212. }
  213. }
  214. }
  215. function Invoke-GpgSignFiles([string[]] $files, [string] $key) {
  216. if ($files.Length -eq 0) {
  217. return
  218. }
  219. Write-Host "Signing files using GPG key $key" -ForegroundColor Cyan
  220. foreach ($_ in $files) {
  221. Write-Host "Signing file '$_' and creating DIGEST..."
  222. if (Test-Path "$_.sig") {
  223. Remove-Item "$_.sig"
  224. }
  225. Invoke-Cmd "gpg" "--output `"$_.sig`" --armor --local-user `"$key`" --detach-sig `"$_`""
  226. $FileName = (Get-Item $_).Name
  227. (Get-FileHash "$_" SHA256).Hash + " *$FileName" | Out-File "$_.DIGEST" -NoNewline
  228. }
  229. }
  230. # Handle errors and restore state
  231. $OrigDir = (Get-Location).Path
  232. $OrigBranch = & git rev-parse --abbrev-ref HEAD
  233. $ErrorActionPreference = 'Stop'
  234. trap {
  235. Write-Host "Restoring state..." -ForegroundColor Yellow
  236. & git checkout $OrigBranch
  237. Set-Location "$OrigDir"
  238. }
  239. Write-Host "KeePassXC Release Preparation Helper" -ForegroundColor Green
  240. Write-Host "Copyright (C) 2022 KeePassXC Team <https://keepassxc.org/>`n" -ForegroundColor Green
  241. # Prepend extra PATH locations as specified
  242. if ($ExtraPath) {
  243. $env:Path = "$ExtraPath;$env:Path"
  244. }
  245. # Resolve absolute directory for paths
  246. $SourceDir = (Resolve-Path $SourceDir).Path
  247. # Check format of -Version
  248. if ($Version -notmatch "^\d+\.\d+\.\d+(-Beta\d*)?$") {
  249. throw "Invalid format for -Version input"
  250. }
  251. # Check platform
  252. if (!$IsWindows) {
  253. throw "The PowerShell release tool is not available for Linux or macOS at this time."
  254. }
  255. if ($Merge) {
  256. Test-RequiredPrograms
  257. # Change to SourceDir
  258. Set-Location "$SourceDir"
  259. Test-VersionInFiles
  260. Test-WorkingTreeClean
  261. if (!$SourceBranch.Length) {
  262. $SourceBranch = & git branch --show-current
  263. }
  264. if ($SourceBranch -notmatch "^release/.*$") {
  265. throw "Must be on a release/* branch to continue."
  266. }
  267. # Update translation files
  268. Write-Host "Updating source translation file..."
  269. Invoke-Cmd "lupdate" "-no-ui-lines -disable-heuristic similartext -locations none", `
  270. "-extensions c,cpp,h,js,mm,qrc,ui -no-obsolete ./src -ts share/translations/keepassxc_en.ts"
  271. Write-Host "Pulling updated translations from Transifex..."
  272. Invoke-Cmd "tx" "pull -af --minimum-perc=60 -r keepassxc.share-translations-keepassxc-en-ts--develop"
  273. # Only commit if there are changes
  274. $changes = & git status --porcelain
  275. if ($changes.Length -gt 0) {
  276. Write-Host "Committing translation updates..."
  277. Invoke-Cmd "git" "add -A ./share/translations/" -quiet
  278. Invoke-Cmd "git" "commit -m `"Update translations`"" -quiet
  279. }
  280. # Read the version release notes from CHANGELOG
  281. $Changelog = ""
  282. $ReadLine = $false
  283. Get-Content "CHANGELOG.md" | ForEach-Object {
  284. if ($ReadLine) {
  285. if ($_ -match "^## ") {
  286. $ReadLine = $false
  287. } else {
  288. $Changelog += $_ + "`n"
  289. }
  290. } elseif ($_ -match "$Version \(\d{4}-\d{2}-\d{2}\)") {
  291. $ReadLine = $true
  292. }
  293. }
  294. Write-Host "Creating tag for '$Version'..."
  295. $tmp = New-TemporaryFile
  296. "Release $Version`n$Changelog" | Out-File $tmp.FullName
  297. Invoke-Cmd "git" "tag -a `"$Version`" -F `"$tmp`" -s" -quiet
  298. Remove-Item $tmp.FullName -Force
  299. Write-Host "Moving latest tag..."
  300. Invoke-Cmd "git" "tag -f -a `"latest`" -m `"Latest stable release`" -s" -quiet
  301. Write-Host "All done!"
  302. Write-Host "Please merge the release branch back into the develop branch now and then push your changes."
  303. Write-Host "Don't forget to also push the tags using 'git push --tags'."
  304. } elseif ($Build) {
  305. $Vcpkg = (Resolve-Path "$Vcpkg/scripts/buildsystems/vcpkg.cmake").Path
  306. # Find Visual Studio and establish build environment
  307. Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
  308. if ($SignBuild -and !$SignCert) {
  309. $SignCert = Find-SignCert
  310. }
  311. Test-RequiredPrograms
  312. if ($Snapshot) {
  313. $Tag = "HEAD"
  314. $SourceBranch = & git rev-parse --abbrev-ref HEAD
  315. $ReleaseName = "$Version-snapshot"
  316. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Snapshot -DOVERRIDE_VERSION=`"$ReleaseName`" $CMakeOptions"
  317. Write-Host "Using current branch '$SourceBranch' to build." -ForegroundColor Cyan
  318. } else {
  319. Test-WorkingTreeClean
  320. # Clear output directory
  321. if (Test-Path $OutDir) {
  322. Remove-Item $OutDir -Recurse
  323. }
  324. if ($Version -match "-beta\d*$") {
  325. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=PreRelease $CMakeOptions"
  326. } else {
  327. $CMakeOptions = "-DKEEPASSXC_BUILD_TYPE=Release $CMakeOptions"
  328. }
  329. # Setup Tag if not defined then checkout tag
  330. if ($Tag -eq "" -or $Tag -eq $null) {
  331. $Tag = $Version
  332. }
  333. Write-Host "Checking out tag 'tags/$Tag' to build." -ForegroundColor Cyan
  334. Invoke-Cmd "git" "checkout `"tags/$Tag`""
  335. }
  336. # Create directories
  337. New-Item "$OutDir" -ItemType Directory -Force | Out-Null
  338. $OutDir = (Resolve-Path $OutDir).Path
  339. $BuildDir = "$OutDir\build-release"
  340. New-Item "$BuildDir" -ItemType Directory -Force | Out-Null
  341. # Enter build directory
  342. Set-Location "$BuildDir"
  343. # Setup CMake options
  344. $CMakeOptions = "-DWITH_XC_ALL=ON -DWITH_TESTS=OFF -DCMAKE_BUILD_TYPE=Release $CMakeOptions"
  345. $CMakeOptions = "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=`"$Vcpkg`" -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON $CMakeOptions"
  346. Write-Host "Configuring build..." -ForegroundColor Cyan
  347. Invoke-Cmd "cmake" "-G `"$CMakeGenerator`" $CMakeOptions `"$SourceDir`""
  348. Write-Host "Compiling sources..." -ForegroundColor Cyan
  349. Invoke-Cmd "cmake" "--build . --config Release -- $MakeOptions"
  350. if ($SignBuild) {
  351. $VcpkgDir = $BuildDir + "\vcpkg_installed\"
  352. if (Test-Path $VcpkgDir) {
  353. $files = Get-ChildItem $VcpkgDir -Filter "*.dll" -Recurse -File |
  354. Where-Object {$_.FullName -notlike "$VcpkgDir*debug\*" -and $_.FullName -notlike "$VcpkgDir*tools\*"} |
  355. ForEach-Object {$_.FullName}
  356. }
  357. $files += Get-ChildItem "$BuildDir\src" -Include "*keepassxc*.exe", "*keepassxc*.dll" -Recurse -File | ForEach-Object { $_.FullName }
  358. Invoke-SignFiles $files $SignCert $Timestamp
  359. }
  360. Write-Host "Create deployment packages..." -ForegroundColor Cyan
  361. Invoke-Cmd "cpack" "-G `"$CPackGenerators`""
  362. Move-Item "$BuildDir\keepassxc-*" -Destination "$OutDir" -Force
  363. if ($SignBuild) {
  364. # Enter output directory
  365. Set-Location -Path "$OutDir"
  366. # Sign MSI files using AppSign key
  367. $files = Get-ChildItem $OutDir -Include "*.msi" -Name
  368. Invoke-SignFiles $files $SignCert $Timestamp
  369. # Sign all output files using the GPG key then hash them
  370. $files = Get-ChildItem $OutDir -Include "*.msi", "*.zip" -Name
  371. Invoke-GpgSignFiles $files $GpgKey
  372. }
  373. # Restore state
  374. Invoke-Command {git checkout $OrigBranch}
  375. Set-Location "$OrigDir"
  376. } elseif ($Sign) {
  377. Test-RequiredPrograms
  378. if (!$SignCert) {
  379. $SignCert = Find-SignCert
  380. }
  381. # Resolve wildcard paths
  382. $ResolvedFiles = @()
  383. foreach ($_ in $SignFiles) {
  384. $ResolvedFiles += (Get-ChildItem $_ -File | ForEach-Object { $_.FullName })
  385. }
  386. $AppSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|exe|dll)$" })
  387. Invoke-SignFiles $AppSignFiles $SignCert $Timestamp
  388. $GpgSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|zip|gz|xz|dmg|appimage)$" })
  389. Invoke-GpgSignFiles $GpgSignFiles $GpgKey
  390. }
  391. # SIG # Begin signature block
  392. # MIImVAYJKoZIhvcNAQcCoIImRTCCJkECAQExDzANBglghkgBZQMEAgEFADB5Bgor
  393. # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
  394. # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCRMgDV7DQ6PzRo
  395. # 3ULpsxL1VU2JvIFnZPXlxq/hkfU2Y6CCH2owggYUMIID/KADAgECAhB6I67aU2mW
  396. # D5HIPlz0x+M/MA0GCSqGSIb3DQEBDAUAMFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQK
  397. # Ew9TZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIFRpbWUg
  398. # U3RhbXBpbmcgUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5
  399. # WjBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSwwKgYD
  400. # VQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNjCCAaIwDQYJ
  401. # KoZIhvcNAQEBBQADggGPADCCAYoCggGBAM2Y2ENBq26CK+z2M34mNOSJjNPvIhKA
  402. # VD7vJq+MDoGD46IiM+b83+3ecLvBhStSVjeYXIjfa3ajoW3cS3ElcJzkyZlBnwDE
  403. # JuHlzpbN4kMH2qRBVrjrGJgSlzzUqcGQBaCxpectRGhhnOSwcjPMI3G0hedv2eNm
  404. # GiUbD12OeORN0ADzdpsQ4dDi6M4YhoGE9cbY11XxM2AVZn0GiOUC9+XE0wI7CQKf
  405. # OUfigLDn7i/WeyxZ43XLj5GVo7LDBExSLnh+va8WxTlA+uBvq1KO8RSHUQLgzb1g
  406. # bL9Ihgzxmkdp2ZWNuLc+XyEmJNbD2OIIq/fWlwBp6KNL19zpHsODLIsgZ+WZ1AzC
  407. # s1HEK6VWrxmnKyJJg2Lv23DlEdZlQSGdF+z+Gyn9/CRezKe7WNyxRf4e4bwUtrYE
  408. # 2F5Q+05yDD68clwnweckKtxRaF0VzN/w76kOLIaFVhf5sMM/caEZLtOYqYadtn03
  409. # 4ykSFaZuIBU9uCSrKRKTPJhWvXk4CllgrwIDAQABo4IBXDCCAVgwHwYDVR0jBBgw
  410. # FoAU9ndq3T/9ARP/FqFsggIv0Ao9FCUwHQYDVR0OBBYEFF9Y7UwxeqJhQo1SgLqz
  411. # YZcZojKbMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMBMGA1Ud
  412. # JQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNVHR8ERTBDMEGg
  413. # P6A9hjtodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1lU3Rh
  414. # bXBpbmdSb290UjQ2LmNybDB8BggrBgEFBQcBAQRwMG4wRwYIKwYBBQUHMAKGO2h0
  415. # dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ1Jv
  416. # b3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAN
  417. # BgkqhkiG9w0BAQwFAAOCAgEAEtd7IK0ONVgMnoEdJVj9TC1ndK/HYiYh9lVUacah
  418. # RoZ2W2hfiEOyQExnHk1jkvpIJzAMxmEc6ZvIyHI5UkPCbXKspioYMdbOnBWQUn73
  419. # 3qMooBfIghpR/klUqNxx6/fDXqY0hSU1OSkkSivt51UlmJElUICZYBodzD3M/SFj
  420. # eCP59anwxs6hwj1mfvzG+b1coYGnqsSz2wSKr+nDO+Db8qNcTbJZRAiSazr7KyUJ
  421. # Go1c+MScGfG5QHV+bps8BX5Oyv9Ct36Y4Il6ajTqV2ifikkVtB3RNBUgwu/mSiSU
  422. # ice/Jp/q8BMk/gN8+0rNIE+QqU63JoVMCMPY2752LmESsRVVoypJVt8/N3qQ1c6F
  423. # ibbcRabo3azZkcIdWGVSAdoLgAIxEKBeNh9AQO1gQrnh1TA8ldXuJzPSuALOz1Uj
  424. # b0PCyNVkWk7hkhVHfcvBfI8NtgWQupiaAeNHe0pWSGH2opXZYKYG4Lbukg7HpNi/
  425. # KqJhue2Keak6qH9A8CeEOB7Eob0Zf+fU+CCQaL0cJqlmnx9HCDxF+3BLbUufrV64
  426. # EbTI40zqegPZdA+sXCmbcZy6okx/SjwsusWRItFA3DE8MORZeFb6BmzBtqKJ7l93
  427. # 9bbKBy2jvxcJI98Va95Q5JnlKor3m0E7xpMeYRriWklUPsetMSf2NvUQa/E5vVye
  428. # fQIwggYaMIIEAqADAgECAhBiHW0MUgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUA
  429. # MFYxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNV
  430. # BAMTJFNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAz
  431. # MjIwMDAwMDBaFw0zNjAzMjEyMzU5NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQK
  432. # Ew9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUg
  433. # U2lnbmluZyBDQSBSMzYwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCb
  434. # K51T+jU/jmAGQ2rAz/V/9shTUxjIztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZ
  435. # UKhWThj/yPqy0iSZhXkZ6Pg2A2NVDgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYk
  436. # wmMv0b/83nbeECbiMXhSOtbam+/36F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE2
  437. # 15wzrK0h1SWHTxPbPuYkRdkP05ZwmRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+
  438. # 8yv+KIhE5ILMqgOZYAENHNX9SJDm+qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9
  439. # JeIkNFICiVHNkRmq4TpxtwfvjsUedyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+
  440. # EKv1WuTGwcLmoU3FpOFMbmPj8pz44MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9
  441. # o1M7a5Jnqf2i2/uMSWymR8r2oQBMdlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sC
  442. # AwEAAaOCAWQwggFgMB8GA1UdIwQYMBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0G
  443. # A1UdDgQWBBQPKssghyi47G9IritUpimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYD
  444. # VR0TAQH/BAgwBgEB/wIBADATBgNVHSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDAS
  445. # MAYGBFUdIAAwCAYGZ4EMAQQBMEsGA1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwu
  446. # c2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmww
  447. # ewYIKwYBBQUHAQEEbzBtMEYGCCsGAQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28u
  448. # Y29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUF
  449. # BzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEA
  450. # Bv+C4XdjNm57oRUgmxP/BP6YdURhw1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug
  451. # 2oeunbYAowbFC2AKK+cMcXIBD0ZdOaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCy
  452. # KppP0OcxYEdU0hpsaqBBIZOtBajjcw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099i
  453. # ChnyIMvY5HexjO2AmtsbpVn0OhNcWbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj
  454. # 1lJziVKEoroGs9Mlizg0bUMbOalOhOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO3
  455. # 7PU8ejfkP9/uPak7VLwELKxAMcJszkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqm
  456. # KL5OTunAvtONEoteSiabkPVSZ2z76mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTq
  457. # lLMS7gjrhTqBmzu1L90Y1KWN/Y5JKdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQ
  458. # ZH3pwWvqURR8AgQdULUvrxjUYbHHj95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWU
  459. # H3fTv1Y8Wdho698YADR7TNx8X8z2Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63
  460. # Syatatvx157YK9hlcPmVoa1oDE5/L9Uo2bC5a4CH2RwwggZJMIIEsaADAgECAhAG
  461. # Qz/MzOQzqJLMF7dGpYxlMA0GCSqGSIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgw
  462. # FgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGlj
  463. # IENvZGUgU2lnbmluZyBDQSBSMzYwHhcNMjQwMjIzMDAwMDAwWhcNMjcwMjIyMjM1
  464. # OTU5WjBgMQswCQYDVQQGEwJVUzERMA8GA1UECAwIVmlyZ2luaWExHjAcBgNVBAoM
  465. # FURyb2lkTW9ua2V5IEFwcHMsIExMQzEeMBwGA1UEAwwVRHJvaWRNb25rZXkgQXBw
  466. # cywgTExDMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJtEjRyetghx
  467. # 6Abi1cpMT88uT6nIcTe3AyUvdSkjCtUM8Gat0YJfqTxokb9dBzJa7j8YWOUU1Yc4
  468. # EDXoYYtVRE+1UkdPAcXNMf2hNXGI45iZVwhBPQZBU4QfKltzYqrjAZgDvxeYd68q
  469. # ImjzUfrCY3uZHwEIuCewmNMPpEgbdjuSXDyBAKKBtaO2iqyaJpqcC39QnDKlXMic
  470. # DPqqH5fI7wK7Lg9f4BwOsaO4P68I3pOv7L/6E5GR9+hTj6txhxFz/yCbDxN1PUvD
  471. # sGaXjMmVeP2M95fkwOFwut5yBESDIwAGEWUFsTJ32hSmE74+xG6rVqtueayV7U9c
  472. # GURznSk9ZlTUqQOW9Z4K+pu29gTZ9zVWlONIsQR7QXfGKZWF+Xik6rTujSRTTsK7
  473. # QNMYzBI6b9v0nD2pEWuGZDXIO5o5N2HzXEFlwxCFY483yWSObHNBp9PFtiDueqv+
  474. # 8vrN+lsirZlDFCxI6hW+F8oYp3XxHdSqxsMRTqbO6dUjH2Tyd0G5fbyT8Rid7DbP
  475. # 6p/apzIrdFOM0kdcKLmppYBp7BInTdjbWJYhtuORIUZQbUOSM71vYCUHj7xkckiY
  476. # YmkUf0XH8xx8jqgVWseBW63gCEowhCEYxaWt0QGyXJ6UrlV4WTUCWzxm45I5OQoo
  477. # fymUvdutKgr9bR3nJ5yS/c+E3KnqJhkCAwEAAaOCAYkwggGFMB8GA1UdIwQYMBaA
  478. # FA8qyyCHKLjsb0iuK1SmKaoXpM0MMB0GA1UdDgQWBBQta729krTac3CUndU0S0Dd
  479. # DscjHTAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggr
  480. # BgEFBQcDAzBKBgNVHSAEQzBBMDUGDCsGAQQBsjEBAgEDAjAlMCMGCCsGAQUFBwIB
  481. # FhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBBAEwSQYDVR0fBEIwQDA+
  482. # oDygOoY4aHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNp
  483. # Z25pbmdDQVIzNi5jcmwweQYIKwYBBQUHAQEEbTBrMEQGCCsGAQUFBzAChjhodHRw
  484. # Oi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2
  485. # LmNydDAjBggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZI
  486. # hvcNAQEMBQADggGBAJSy5YPCbh9ZsuDCKgDuzOWZzNza4/FrA+kT7EitDezYN3S/
  487. # P0EVc0tPbgYAKfNqY+ihAMyjZHdgybfBWhGzUTDo+HEipcnZ2pgwPadsw23jJ8MN
  488. # 1tdms9iKDakIQ2MVsB7cGFRU8QjLovkPdZkyLcjuYbkiZRoNoKlhmrOOf6n1oCwX
  489. # VJ9ONJijc+Lr3+4EIqZ39ET2+uI9Wg9Bfd9XrDZfYFEcRJjNzRpCtHb26aIzV/Xi
  490. # MWasHRPaII34SzD0BmaPbsLeGW1UGvW3tQcgVNdT/uajegmShVb+c5J5ktRSJ0cq
  491. # yxmTAYaeMuA6IxG1f6kui1SAFQs2lzlGyEgxgiNGo7cHHN2KidhrBL3U2bGr9Tkd
  492. # p3gmV+Gj3esCdQzJE4aqmUZvIvHpkrair4qbLFZRNozAZJn2SIeQa5u2U0ZmvcAr
  493. # 1C7S3JVLP3t9LKE0mlFkV9pbIU97ND3iH3tO0Zb3SvCK/XjO1PZVb8EXsi67wbfM
  494. # SWAwi2CETDonb7+gBjCCBl0wggTFoAMCAQICEDpSaiyEzlXmHWX8zBLY6YkwDQYJ
  495. # KoZIhvcNAQEMBQAwVTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGlt
  496. # aXRlZDEsMCoGA1UEAxMjU2VjdGlnbyBQdWJsaWMgVGltZSBTdGFtcGluZyBDQSBS
  497. # MzYwHhcNMjQwMTE1MDAwMDAwWhcNMzUwNDE0MjM1OTU5WjBuMQswCQYDVQQGEwJH
  498. # QjETMBEGA1UECBMKTWFuY2hlc3RlcjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk
  499. # MTAwLgYDVQQDEydTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIFNpZ25lciBS
  500. # MzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCN0Wf0wUibvf04STpN
  501. # YYGbw9jcRaVhBDaNBp7jmJaA9dQZW5ighrXGNMYjK7Dey5RIHMqLIbT9z9if753m
  502. # YbojJrKWO4ZP0N5dBT2TwZZaPb8E+hqaDZ8Vy2c+x1NiEwbEzTrPX4W3QFq/zJvD
  503. # DbWKL99qLL42GJQzX3n5wWo60KklfFn+Wb22mOZWYSqkCVGl8aYuE12SqIS4MVO4
  504. # PUaxXeO+4+48YpQlNqbc/ndTgszRQLF4MjxDPjRDD1M9qvpLTZcTGVzxfViyIToR
  505. # NxPP6DUiZDU6oXARrGwyP9aglPXwYbkqI2dLuf9fiIzBugCDciOly8TPDgBkJmjA
  506. # fILNiGcVEzg+40xUdhxNcaC+6r0juPiR7bzXHh7v/3RnlZuT3ZGstxLfmE7fRMAF
  507. # wbHdDz5gtHLqjSTXDiNF58IxPtvmZPG2rlc+Yq+2B8+5pY+QZn+1vEifI0MDtiA6
  508. # BxxQuOnj4PnqDaK7NEKwtD1pzoA3jJFuoJiwbatwhDkg1PIjYnMDbDW+wAc9FtRN
  509. # 6pUsO405jaBgigoFZCw9hWjLNqgFVTo7lMb5rVjJ9aSBVVL2dcqzyFW2LdWk5Xdp
  510. # 65oeeOALod7YIIMv1pbqC15R7QCYLxcK1bCl4/HpBbdE5mjy9JR70BHuYx27n4XN
  511. # OZbwrXcG3wZf9gEUk7stbPAoBQIDAQABo4IBjjCCAYowHwYDVR0jBBgwFoAUX1jt
  512. # TDF6omFCjVKAurNhlxmiMpswHQYDVR0OBBYEFGjvpDJJabZSOB3qQzks9BRqngyF
  513. # MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG
  514. # AQUFBwMIMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMIMCUwIwYIKwYBBQUHAgEW
  515. # F2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEAjBKBgNVHR8EQzBBMD+g
  516. # PaA7hjlodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1lU3Rh
  517. # bXBpbmdDQVIzNi5jcmwwegYIKwYBBQUHAQEEbjBsMEUGCCsGAQUFBzAChjlodHRw
  518. # Oi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1lU3RhbXBpbmdDQVIz
  519. # Ni5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqG
  520. # SIb3DQEBDAUAA4IBgQCw3C7J+k82TIov9slP1e8YTx+fDsa//hJ62Y6SMr2E89rv
  521. # 82y/n8we5W6z5pfBEWozlW7nWp+sdPCdUTFw/YQcqvshH6b9Rvs9qZp5Z+V7nHwP
  522. # TH8yzKwgKzTTG1I1XEXLAK9fHnmXpaDeVeI8K6Lw3iznWZdLQe3zl+Rejdq5l2jU
  523. # 7iUfMkthfhFmi+VVYPkR/BXpV7Ub1QyyWebqkjSHJHRmv3lBYbQyk08/S7TlIeOr
  524. # 9iQ+UN57fJg4QI0yqdn6PyiehS1nSgLwKRs46T8A6hXiSn/pCXaASnds0LsM5OVo
  525. # KYfbgOOlWCvKfwUySWoSgrhncihSBXxH2pAuDV2vr8GOCEaePZc0Dy6O1rYnKjGm
  526. # qm/IRNkJghSMizr1iIOPN+23futBXAhmx8Ji/4NTmyH9K0UvXHiuA2Pa3wZxxR9r
  527. # 9XeIUVb2V8glZay+2ULlc445CzCvVSZV01ZB6bgvCuUuBx079gCcepjnZDCcEuIC
  528. # 5Se4F6yFaZ8RvmiJ4hgwggaCMIIEaqADAgECAhA2wrC9fBs656Oz3TbLyXVoMA0G
  529. # CSqGSIb3DQEBDAUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNl
  530. # eTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1Qg
  531. # TmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1
  532. # dGhvcml0eTAeFw0yMTAzMjIwMDAwMDBaFw0zODAxMTgyMzU5NTlaMFcxCzAJBgNV
  533. # BAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3Rp
  534. # Z28gUHVibGljIFRpbWUgU3RhbXBpbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB
  535. # AQUAA4ICDwAwggIKAoICAQCIndi5RWedHd3ouSaBmlRUwHxJBZvMWhUP2ZQQRLRB
  536. # QIF3FJmp1OR2LMgIU14g0JIlL6VXWKmdbmKGRDILRxEtZdQnOh2qmcxGzjqemIk8
  537. # et8sE6J+N+Gl1cnZocew8eCAawKLu4TRrCoqCAT8uRjDeypoGJrruH/drCio28aq
  538. # IVEn45NZiZQI7YYBex48eL78lQ0BrHeSmqy1uXe9xN04aG0pKG9ki+PC6VEfzutu
  539. # 6Q3IcZZfm00r9YAEp/4aeiLhyaKxLuhKKaAdQjRaf/h6U13jQEV1JnUTCm511n5a
  540. # vv4N+jSVwd+Wb8UMOs4netapq5Q/yGyiQOgjsP/JRUj0MAT9YrcmXcLgsrAimfWY
  541. # 3MzKm1HCxcquinTqbs1Q0d2VMMQyi9cAgMYC9jKc+3mW62/yVl4jnDcw6ULJsBkO
  542. # krcPLUwqj7poS0T2+2JMzPP+jZ1h90/QpZnBkhdtixMiWDVgh60KmLmzXiqJc6lG
  543. # wqoUqpq/1HVHm+Pc2B6+wCy/GwCcjw5rmzajLbmqGygEgaj/OLoanEWP6Y52Hfle
  544. # f3XLvYnhEY4kSirMQhtberRvaI+5YsD3XVxHGBjlIli5u+NrLedIxsE88WzKXqZj
  545. # j9Zi5ybJL2WjeXuOTbswB7XjkZbErg7ebeAQUQiS/uRGZ58NHs57ZPUfECcgJC+v
  546. # 2wIDAQABo4IBFjCCARIwHwYDVR0jBBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZssw
  547. # HQYDVR0OBBYEFPZ3at0//QET/xahbIICL9AKPRQlMA4GA1UdDwEB/wQEAwIBhjAP
  548. # BgNVHRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgw
  549. # BgYEVR0gADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5j
  550. # b20vVVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwNQYIKwYB
  551. # BQUHAQEEKTAnMCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29t
  552. # MA0GCSqGSIb3DQEBDAUAA4ICAQAOvmVB7WhEuOWhxdQRh+S3OyWM637ayBeR7djx
  553. # Q8SihTnLf2sABFoB0DFR6JfWS0snf6WDG2gtCGflwVvcYXZJJlFfym1Doi+4PfDP
  554. # 8s0cqlDmdfyGOwMtGGzJ4iImyaz3IBae91g50QyrVbrUoT0mUGQHbRcF57olpfHh
  555. # QEStz5i6hJvVLFV/ueQ21SM99zG4W2tB1ExGL98idX8ChsTwbD/zIExAopoe3l6J
  556. # rzJtPxj8V9rocAnLP2C8Q5wXVVZcbw4x4ztXLsGzqZIiRh5i111TW7HV1AtsQa6v
  557. # Xy633vCAbAOIaKcLAo/IU7sClyZUk62XD0VUnHD+YvVNvIGezjM6CRpcWed/ODip
  558. # tK+evDKPU2K6synimYBaNH49v9Ih24+eYXNtI38byt5kIvh+8aW88WThRpv8lUJK
  559. # aPn37+YHYafob9Rg7LyTrSYpyZoBmwRWSE4W6iPjB7wJjJpH29308ZkpKKdpkiS9
  560. # WNsf/eeUtvRrtIEiSJHN899L1P4l6zKVsdrUu1FX1T/ubSrsxrYJD+3f3aKg6yxd
  561. # bugot06YwGXXiy5UUGZvOu3lXlxA+fC13dQ5OlL2gIb5lmF6Ii8+CQOYDwXM+yd9
  562. # dbmocQsHjcRPsccUd5E9FiswEqORvz8g3s+jR3SFCgXhN4wz7NgAnOgpCdUo4uDy
  563. # llU9PzGCBkAwggY8AgEBMGgwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3Rp
  564. # Z28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5n
  565. # IENBIFIzNgIQBkM/zMzkM6iSzBe3RqWMZTANBglghkgBZQMEAgEFAKCBhDAYBgor
  566. # BgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEE
  567. # MBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCCw
  568. # CjBOFSrHIl5SZxVeFP1D+IfXa4B5pNieNHIkm0/SqTANBgkqhkiG9w0BAQEFAASC
  569. # AgAgFK2xkUz0aie9HSo0e4qyDk83CNX9G/GR7+DObTay5l7OYVZIdB2kOZIS8UbH
  570. # 4gMSsjplIVObVyf1DjGGCctq4bFDABL7wpwqm7P3tEjs2d/HK2Yxoe1c8YFTYMJJ
  571. # Vc6Q9l/nZA7ZC/SCH1NyEgK+w3vQ6SARudN8/ZgFVa1P3DdwOADmLD774v3bOUKq
  572. # XKDOySeYD7bkCekPv6yx6DnrWBBsYIKFRv2Yv4duThki4CC1FMgEVTmdBDJIP3R8
  573. # 1BgXjPvVxYX3aQ9emC3KluyNr/BEPZiVdwBjXCE60n7g/Y8qNgqY0ZaImSpl9MFx
  574. # VkrxE7iNfBcBE8xVCghyDahs1BxyEeEdQk+QlLD1Cv3KGODlyWjgncDAX7fnkC6l
  575. # M7KUttjXGi9uQG3g2dUCX+744wPhRg+DBfch2Em70I0kYsPY6ETyrQogZdi6QzKO
  576. # Hlf/hUW0o9HCc6BrTSL4y8G0mlKVCgUpMOjlrip88bvW05ZUX20arGKxGg1uxFIA
  577. # r7wvQyFn+RvNc0kqWt/xgwp3HAc80ABPCYumLqGwucBWisiMt4P2s+fkLpYJdC/n
  578. # pS/3fRoepfGmv8J1WAIjGiO7e12aDrTQqNP+2RUzkNpy2eRQDL+3VUFQOQqEfkVL
  579. # Y6wpN6nB7olNULhPUlwZChf49v/h+XUxhgHozWN576qoyqGCAyIwggMeBgkqhkiG
  580. # 9w0BCQYxggMPMIIDCwIBATBpMFUxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0
  581. # aWdvIExpbWl0ZWQxLDAqBgNVBAMTI1NlY3RpZ28gUHVibGljIFRpbWUgU3RhbXBp
  582. # bmcgQ0EgUjM2AhA6UmoshM5V5h1l/MwS2OmJMA0GCWCGSAFlAwQCAgUAoHkwGAYJ
  583. # KoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQwOTE0MDMy
  584. # MTU1WjA/BgkqhkiG9w0BCQQxMgQwwrUMFcAva5866cdprEw/weWm4EfoAA4SCloN
  585. # B50191F7ps9XQIxGfsz+g0vQxzxfMA0GCSqGSIb3DQEBAQUABIICAC3qVFmWQWkL
  586. # kn/AYJPZ3B7Yvwq0P7SqcHO9w5FiV5wsznH6xfvkTzXssQLhKaZdqypnHCTNth8D
  587. # 7mgr6zZYh5CgQQ3SSG2q0xVzs3wanJmZ4g6I7bVeGMLv47tFnCed9G3aP5cywDBn
  588. # vMOiwZnQR1WwM8T6qE4sAb4lKXUYDbIVB1DMRAF3j2rQMAN9e9jF6Ok+ZyQqpBSl
  589. # ve2vBR0TgFXeyidwiz6O2I1FWc1OzwMchbJTANbQqWRKuiQ6gm0Bj/S8dalBb77I
  590. # jxS0Tn7kRH1Sr50ZfWRSxj7H7afsQOKbDHxhWFhctvQfbrmbNj+gHcm9j/rSPpU7
  591. # zj5OvgKyYQnjiLjCnGBTmSML2ZwvXhPv2XkFQ2yL2nYWTRqLjARdcP62kSrkQxEa
  592. # DLAZ7mcndE+HZVMllBGVI9/H5hkE7jINBU4gNvyqQQqF3xTatJMldyrXCQ6R9wfN
  593. # LsdyFB177vZXLrS1EymCzq1COpbrw3oa/LXP+1hZFhoaOYy00LUnCU5Zjd8UFWIh
  594. # FDj3Z7O/Xz3P8BR4t7PGqUu3x8UbxcsGDH0w0e3pvPmxXiBZlspjNieg073YNKxU
  595. # Yuj0b3cX/cpYH0M0Ne/tXuHwbZthwwll3vytT7Aa+oglejolDQjRc8Gv5KW0dUK3
  596. # LmVw9eforeFUrTExSEc/0jf29BmZz9do
  597. # SIG # End signature block