Utilities/Lenovo.BIOS.Config.ChaCha20.ps1
|
Class ChaCha20 { static hidden [int32]$blockSize = 64 static hidden [byte[]]$salt = [System.Convert]::FromBase64String('plqnkknbuujsklslyscgkycobvflyqwrttalqqjidosyjrodkiuxcokwjrftfyyttipfvtwodwrnvsre') #region Encryption <# Entry point for encryption iterations set to 1 for speed String plaintext String key #> static [string] Encrypt([string]$plain, [string]$keyphrase) { #validate params $bytes = [Chacha20]::Encrypt([System.Text.Encoding]::UTF8.GetBytes($plain), $keyphrase, [ChaCha20]::salt, 1) return [System.Convert]::ToBase64String($bytes) }#end Encrypt <# Alternate entry if user wants to supply their own salt iterations set to 1 for speed String plaintext String key byte[] salt #> static [string] Encrypt([string]$plain, [string]$keyphrase, [byte[]]$salt) { #validate params $bytes = [Chacha20]::Encrypt([System.Text.Encoding]::UTF8.GetBytes($plain), $keyphrase, $salt, 1) return [System.Convert]::ToBase64String($bytes) }#end Encrypt <# Encryption engine #> static hidden [byte[]] Encrypt([byte[]]$bytes, [string]$keyphrase, [byte[]]$salt, [int]$iterations) { #Generate the key value from the keyphrase [byte[]]$key = $null #50000 = num of iterations #grab the first 32 bytes after the key is in sha256 format $key = ([System.Security.Cryptography.Rfc2898DeriveBytes]::new($keyphrase, $salt, 50000, [System.Security.Cryptography.HashAlgorithmName]::SHA256).GetBytes(32)) #local variable for increased speed $tempBytes = $bytes for ($i = 0; $i -lt $iterations; $i++) { # Generate a random nonce for each iteration [byte[]]$nonce = $null $nonce = ([System.Security.Cryptography.Rfc2898DeriveBytes]::new($keyphrase, $salt, ($i + 1), [System.Security.Cryptography.HashAlgorithmName]::SHA256).GetBytes(16)) $tempBytes = [ChaCha20]::Combine([Chacha20]::Encrypt($tempBytes, $key, $nonce), $nonce, $keyphrase) }#end for return $tempBytes }#end Encrypt <# Intermediate encrypt method #> static hidden [byte[]] Encrypt([byte[]]$bytes, [byte[]]$key, [byte[]]$nonce) { #hash to maintain validity [byte[]]$hash = [System.Security.Cryptography.SHA256CryptoServiceProvider]::new().ComputeHash($bytes) #add hash to current bytes [byte[]]$bytes = $bytes + $hash [byte[]]$encryptedBytes = [byte[]]::new($bytes.Length) [byte[]]$block = [byte[]]::new([ChaCha20]::blockSize) [int32]$bytesIndex = 0 [int32]$encryptedIndex = 0 [int32]$blockCounter = 0 while ($bytesIndex -lt $bytes.Length) { $block = [ChaCha20]::GenerateBlock($blockCounter, $key, $nonce) [int32]$bytesToCopy = [Math]::Min($bytes.Length - $bytesIndex, [ChaCha20]::blockSize) for ([int32]$i = 0; $i -lt $bytesToCopy; $i++) { $encryptedBytes[$encryptedIndex + $i] = $bytes[$bytesIndex + $i] -bxor $block[$i] }#end for $bytesIndex += $bytesToCopy $encryptedIndex += $bytesToCopy $blockCounter++ }#end while return $encryptedBytes }#end Encrypt # Bury the nonce for that round inside of the encrpyted bytes static hidden [byte[]] Combine([byte[]]$bytes, [byte[]]$nonce, [string]$keyphrase) { if ($bytes.Length -lt ($nonce.Length + 1)) { throw "Combine: Bytes.Length must be greater than Nonce.Length + 1" }#end if if ([string]::IsNullOrWhiteSpace($keyphrase)) { throw "Combine: Keyphrase is null!" }#end if [int[]]$indexes = [int[]]::new($nonce.Length) $indexes = ([ChaCha20]::GenerateIndexes($nonce.Length, $keyphrase, $bytes.Length)) [byte[]]$combined = [byte[]]::new($bytes.Length + $nonce.Length) for ([int]$i = 0; $i -lt $indexes.Length; $i++) { $combined[$indexes[$i]] = $nonce[$i] }#end for $i = 0 $rem = (0..($combined.Length - 1)) | Where-Object { $_ -NotIn $indexes } foreach ($j in $rem) { $combined[$j] = $bytes[$i++] }#end foreach return $combined }#end Combine #endregion #region Decryption <# Entry point for decryption iterations set to 1 for speed String plaintext String key #> static [string] Decrypt([string]$encrypted, [string]$keyphrase) { $bytes = [ChaCha20]::Decrypt([System.Convert]::FromBase64String($encrypted), $keyphrase, [ChaCha20]::Salt, 1) return [System.Text.Encoding]::UTF8.GetString($bytes) }#end Decrypt <# Alternate entry if user wants to supply their own salt iterations set to 1 for speed String plaintext String key byte[] salt #> static [string] Decrypt([string]$encrypted, [string]$keyphrase, [byte[]]$salt) { $bytes = [ChaCha20]::Decrypt([System.Convert]::FromBase64String($encrypted), $keyphrase, $salt, 1) return [System.Text.Encoding]::UTF8.GetString($bytes) }#end Decrypt <# Decryption engine #> static hidden [byte[]] Decrypt([byte[]]$bytes, [string]$keyphrase, [byte[]]$salt, [int]$iterations) { [byte[]]$key = $null; $key = ([System.Security.Cryptography.Rfc2898DeriveBytes]::new($keyphrase, $salt, 50000, [System.Security.Cryptography.HashAlgorithmName]::SHA256).GetBytes(32)) $tempBytes = $bytes for ($i = 0; $i -lt $iterations; $i++) { $bytes = $null $nonce = $null ($bytes, $nonce) = [Chacha20]::Split($tempBytes, $keyphrase, 16) $tempBytes = [Chacha20]::Decrypt($bytes, $key, $nonce) }#end for return $tempBytes }#end Decrypt <# Intermediate Decrypt method #> static hidden [byte[]] Decrypt([byte[]]$bytes, [byte[]]$key, [byte[]]$nonce) { [byte[]]$decryptedBytes = [byte[]]::new($bytes.Length) [int32]$bytesIndex = 0 [int32]$decryptedIndex = 0 while ($bytesIndex -lt $bytes.Length) { [int32]$blockCounter = $bytesIndex / [ChaCha20]::blockSize [int32]$bytesToCopy = [Math]::Min($bytes.Length - $bytesIndex, [ChaCha20]::blockSize) [byte[]]$block = [ChaCha20]::GenerateBlock($blockCounter, $key, $nonce) for ($i = 0; $i -lt $bytesToCopy; $i++) { $decryptedBytes[$decryptedIndex + $i] = $bytes[$bytesIndex + $i] -bxor $block[$i] }#end for $bytesIndex += [ChaCha20]::blockSize $decryptedIndex += $bytesToCopy }#end while $hash = $decryptedBytes | Select-Object -Last 32 $decrypted = $decryptedBytes | Select-Object -First ($decryptedBytes.Length - 32) if ([convert]::ToBase64String([System.Security.Cryptography.SHA256CryptoServiceProvider]::new().ComputeHash($decrypted)) -ne [convert]::ToBase64String($hash)) { throw "Decrypt: Integrity check failed" }#end if return $decrypted }#end Decrypt #endregion #region Helpers static hidden [Byte[]] GenerateBlock([Int32]$blockCounter, [Byte[]]$key, [Byte[]]$nonce) { # constant "expand 32-byte k" in 4 hex bytes # Key_0, Key_4 Key_8 Key_12 # Key_16, Key_20, Key_24, Key_28 # counter nonce_0, nonce_4, nonce_8 [int32[]]$state = [int32[]]@( 0x61707865, 0x3320646E, 0x79622D32, 0x6B206574, [BitConverter]::ToInt32($key[0..3], 0), [BitConverter]::ToInt32($key[4..7], 0), [BitConverter]::ToInt32($key[8..11], 0), [BitConverter]::ToInt32($key[12..15], 0), [BitConverter]::ToInt32($key[16..19], 0), [BitConverter]::ToInt32($key[20..23], 0), [BitConverter]::ToInt32($key[24..27], 0), [BitConverter]::ToInt32($key[28..31], 0), $blockCounter, [BitConverter]::ToInt32($nonce[0..3], 0), [BitConverter]::ToInt32($nonce[4..7], 0), [BitConverter]::ToInt32($nonce[8..11], 0) ) #10 rounds of QuarterRounds for ([int32]$i = 0; $i -lt 10; $i++) { #column rounds [ChaCha20]::QR([ref]$state[0], [ref]$state[4], [ref]$state[8], [ref]$state[12]) [ChaCha20]::QR([ref]$state[1], [ref]$state[5], [ref]$state[9], [ref]$state[13]) [ChaCha20]::QR([ref]$state[2], [ref]$state[6], [ref]$state[10], [ref]$state[14]) [ChaCha20]::QR([ref]$state[3], [ref]$state[7], [ref]$state[11], [ref]$state[15]) #diagonal rounds [ChaCha20]::QR([ref]$state[0], [ref]$state[5], [ref]$state[10], [ref]$state[15]) [ChaCha20]::QR([ref]$state[1], [ref]$state[6], [ref]$state[11], [ref]$state[12]) [ChaCha20]::QR([ref]$state[2], [ref]$state[7], [ref]$state[8], [ref]$state[13]) [ChaCha20]::QR([ref]$state[3], [ref]$state[4], [ref]$state[9], [ref]$state[14]) }#end for [Byte[]]$result = [Byte[]]::new($state.Length * 4) for ([Int32]$i = 0; $i -lt $state.Length; $i++) { # Copy the bytes from the $i-th int in $state to the correct position in $result [Array]::Copy([BitConverter]::GetBytes($state[$i]), 0, $result, $i * 4, 4) }#end for return $result }#end GenerateBlock # Rotate left function (Rotl) static hidden [Int32] Rotate([Int32]$val, [Int32]$amount) { return (($val -shl $amount) -bor ($val -shr (32 - $amount))) }#end Rotate <#static hidden [Int64] Rotate([Int64]$val, [Int64]$amount) { return (($val -shl $amount) -bor ($val -shr (32 - $amount))) }#> # QuarterRound function static hidden [void] QR([ref]$a, [ref]$b, [ref]$c, [ref]$d) { $a.Value = $a.Value + $b.Value $d.Value = [ChaCha20]::Rotate($d.Value -xor $a.Value, 16) #Needs to be combined to prevent type error $c.Value = $c.Value + $d.Value $b.Value = [ChaCha20]::Rotate($b.Value -xor $c.Value, 12) #Needs to be combined to prevent type error $a.Value = $a.Value + $b.Value $d.Value = [ChaCha20]::Rotate($d.Value -xor $a.Value, 8) #Needs to be combined to prevent type error $c.Value = $c.Value + $d.Value $b.Value = [ChaCha20]::Rotate($b.Value -xor $c.Value, 7) #Needs to be combined to prevent type error }#end QR #generates the location of the nonce bytes static hidden [int[]] GenerateIndexes([int]$nonceLength, [string]$keyphrase, [int]$bytesLength) { if ($bytesLength -lt 3) { throw "Indexes: $bytesLength less than 3!" }#end if if($nonceLength -ge $bytesLength) { throw "Indexes: $nonceLength should be less than $bytesLength!" }#end if if ([string]::IsNullOrWhiteSpace($keyphrase)) { throw "Indexes: keyphrase is null!" }#end if [byte[]]$hash = [System.Security.Cryptography.SHA256]::Create().ComputeHash([System.Text.Encoding]::UTF8.GetBytes([string]$keyphrase)) [int[]]$indexes = [int[]]::new($nonceLength) #generate the locations of the nonce bytes for ($i = 0; $i -lt $nonceLength; $i++) { [int]$nextIndex = [Convert]::ToInt32($hash[$i] % $bytesLength) while ($indexes -contains $nextIndex) { $nextIndex = ($nextIndex + 1) % $bytesLength }#end while $indexes[$i] = $nextIndex }#end for return $indexes }#end GenerateIndexes #splits the nonce from the encrypted bytes static hidden [array] Split([Byte[]]$combined, [string]$keyphrase, [int]$nonceLength) { if ($null -eq $combined) { throw "Split: Byte array is null!" }#end if if ([string]::IsNullOrWhiteSpace($keyphrase)) { throw "Split: Keyphrase is null!" }#end if #list of indexes [int[]]$indexes = [int[]]::new([int]$nonceLength) $indexes = [ChaCha20]::GenerateIndexes($nonceLength, $keyphrase, ($combined.Length - $nonceLength)) #byte array for the nonce $nonce = [Byte[]]::new($nonceLength) #grab everything not listed as an index $rem = (0..($combined.Length - 1)) | Where-Object { $_ -NotIn $indexes } [byte[]]$bytes = @() $i = 0 #fill bytes array foreach ($i in $rem) { $bytes += $combined[$i] }#end foreach #fill nonce array for ($i = 0; $i -lt $nonceLength; $i++) { $nonce[$i] = $combined[$indexes[$i]] }#end for return ($bytes, $nonce) }#end Split } #endregion <#$myKey = "This is my secret key!" $plaintext = "Pass1word" $encryptedText = [ChaCha20]::Encrypt($plaintext,$myKey) $encryptedText $decryptedText = [ChaCha20]::Decrypt($encryptedText, $myKey) $decryptedText#> # SIG # Begin signature block # MIItugYJKoZIhvcNAQcCoIItqzCCLacCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUv8ycS7Bs/p7bpxVIwBAPrcu+ # otGggibcMIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0B # AQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk # IElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw # ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz # 7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS # 5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7 # bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfI # SKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jH # trHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14 # Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2 # h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt # 6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPR # iQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ER # ElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4K # Jpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAd # BgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SS # y4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAC # hjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURS # b290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0 # LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRV # HSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyh # hyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO # 0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo # 8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++h # UD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5x # aiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIFkDCCA3ig # AwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG # EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl # cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMw # ODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Y # q3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lX # FllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxe # TsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbu # yntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I # 9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmg # Z92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse # 5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKy # Ebe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwh # HbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/ # Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwID # AQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4E # FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQADggIBALth2X2p # bL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY # ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdN # Oj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4 # i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJ # EVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9NcCOGDErcgdLM # MpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N0XWs0Mr7QbhD # parTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb/UdK # Dd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP # 0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLS # oCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9T # dSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+MIIGsDCCBJigAwIBAgIQCK1AsmDS # nEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjEwNDI5MDAwMDAwWhcN # MzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs # IEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5n # IFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A # MIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zrPYGXcMW7xIUmMJ+kjmjYXPXr # NCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHMgQM+TXAkZLON4gh9NH1MgFcS # a0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8IrgnQnAZaf6mIBJNYc9URnokCF4 # RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyCEUhSaN4QvRRXXegYE2XFf7JP # hSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0p6MDDnSlrzm2q2AS4+jWufcx # 4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQakhCBj7A7CdfHmzJawv9qYFSL # ScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0XLyTRSiDNipmKF+wc86LJiUG # soPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960IHnWmZcy740hQ83eRGv7bUKJG # yGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2FKZbS110YU0/EpF23r9Yy3IQ # KUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBHX8mBUHOFECMhWWCKZFTBzCEa # 6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q27IwyCQLMbDwMVhECAwEAAaOC # AVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFGg34Ou2O/hfEYb7 # /mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1Ud # DwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDAzB3BggrBgEFBQcBAQRrMGkw # JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcw # AoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJv # b3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwHAYDVR0gBBUwEzAHBgVngQwB # AzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIBADojRD2NCHbuj7w6mdNW4AIa # pfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6jfCbVN7w6XUhtldU/SfQnuxaB # RVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmImoqKwba9oUgYftzYgBoRGRjN # YZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtfJqGVWEjVGv7XJz/9kNF2ht0c # sGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrxoj7bQ7gzyE84FJKZ9d3OVG3Z # XQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3LIU/Gs4m6Ri+kAewQ3+ViCCC # cPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx4b6cpwoG1iZnt5LmTl/eeqxJ # zy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9Oj9FpsToFpFSi0HASIRLlk2r # REDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+ICw2/O/TOHnuO77Xry7fwdxPm # 5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug0wcCampAMEhLNKhRILutG4UI # 4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5Vzu0nAPthkX0tGFuv2jiJmCG # 6sivqf6UHedjGzqGVnhOMIIGtDCCBJygAwIBAgIQDcesVwX/IZkuQEMiDDpJhjAN # BgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg # SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2Vy # dCBUcnVzdGVkIFJvb3QgRzQwHhcNMjUwNTA3MDAwMDAwWhcNMzgwMTE0MjM1OTU5 # WjBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV # BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hB # MjU2IDIwMjUgQ0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtHgx # 0wqYQXK+PEbAHKx126NGaHS0URedTa2NDZS1mZaDLFTtQ2oRjzUXMmxCqvkbsDpz # 4aH+qbxeLho8I6jY3xL1IusLopuW2qftJYJaDNs1+JH7Z+QdSKWM06qchUP+AbdJ # gMQB3h2DZ0Mal5kYp77jYMVQXSZH++0trj6Ao+xh/AS7sQRuQL37QXbDhAktVJMQ # bzIBHYJBYgzWIjk8eDrYhXDEpKk7RdoX0M980EpLtlrNyHw0Xm+nt5pnYJU3Gmq6 # bNMI1I7Gb5IBZK4ivbVCiZv7PNBYqHEpNVWC2ZQ8BbfnFRQVESYOszFI2Wv82wnJ # RfN20VRS3hpLgIR4hjzL0hpoYGk81coWJ+KdPvMvaB0WkE/2qHxJ0ucS638ZxqU1 # 4lDnki7CcoKCz6eum5A19WZQHkqUJfdkDjHkccpL6uoG8pbF0LJAQQZxst7VvwDD # jAmSFTUms+wV/FbWBqi7fTJnjq3hj0XbQcd8hjj/q8d6ylgxCZSKi17yVp2NL+cn # T6Toy+rN+nM8M7LnLqCrO2JP3oW//1sfuZDKiDEb1AQ8es9Xr/u6bDTnYCTKIsDq # 1BtmXUqEG1NqzJKS4kOmxkYp2WyODi7vQTCBZtVFJfVZ3j7OgWmnhFr4yUozZtqg # PrHRVHhGNKlYzyjlroPxul+bgIspzOwbtmsgY1MCAwEAAaOCAV0wggFZMBIGA1Ud # EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFO9vU0rp5AZ8esrikFb2L9RJ7MtOMB8G # A1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjAT # BgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGG # GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2Nh # Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYD # VR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9 # bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQAXzvsWgBz+Bz0RdnEwvb4LyLU0pn/N0IfF # iBowf0/Dm1wGc/Do7oVMY2mhXZXjDNJQa8j00DNqhCT3t+s8G0iP5kvN2n7Jd2E4 # /iEIUBO41P5F448rSYJ59Ib61eoalhnd6ywFLerycvZTAz40y8S4F3/a+Z1jEMK/ # DMm/axFSgoR8n6c3nuZB9BfBwAQYK9FHaoq2e26MHvVY9gCDA/JYsq7pGdogP8HR # trYfctSLANEBfHU16r3J05qX3kId+ZOczgj5kjatVB+NdADVZKON/gnZruMvNYY2 # o1f4MXRJDMdTSlOLh0HCn2cQLwQCqjFbqrXuvTPSegOOzr4EWj7PtspIHBldNE2K # 9i697cvaiIo2p61Ed2p8xMJb82Yosn0z4y25xUbI7GIN/TpVfHIqQ6Ku/qjTY6hc # 3hsXMrS+U0yy+GWqAXam4ToWd2UQ1KYT70kZjE4YtL8Pbzg0c1ugMZyZZd/BdHLi # Ru7hAWE6bTEm4XYRkA6Tl4KSFLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAv # jSabnf7+Pu0VrFgoiovRDiyx3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3J # E3rYkrhLULy7Dc90G6e8BlqmyIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM # 1pD2T7m3XDCCBu0wggTVoAMCAQICEAqA7xhLjfEFgtHEdqeVdGgwDQYJKoZIhvcN # AQELBQAwaTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw # PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2 # IFNIQTI1NiAyMDI1IENBMTAeFw0yNTA2MDQwMDAwMDBaFw0zNjA5MDMyMzU5NTla # MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UE # AxMyRGlnaUNlcnQgU0hBMjU2IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAy # MDI1IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDQRqwtEsae0Oqu # YFazK1e6b1H/hnAKAd/KN8wZQjBjMqiZ3xTWcfsLwOvRxUwXcGx8AUjni6bz52fG # Tfr6PHRNv6T7zsf1Y/E3IU8kgNkeECqVQ+3bzWYesFtkepErvUSbf+EIYLkrLKd6 # qJnuzK8Vcn0DvbDMemQFoxQ2Dsw4vEjoT1FpS54dNApZfKY61HAldytxNM89PZXU # P/5wWWURK+IfxiOg8W9lKMqzdIo7VA1R0V3Zp3DjjANwqAf4lEkTlCDQ0/fKJLKL # kzGBTpx6EYevvOi7XOc4zyh1uSqgr6UnbksIcFJqLbkIXIPbcNmA98Oskkkrvt6l # PAw/p4oDSRZreiwB7x9ykrjS6GS3NR39iTTFS+ENTqW8m6THuOmHHjQNC3zbJ6nJ # 6SXiLSvw4Smz8U07hqF+8CTXaETkVWz0dVVZw7knh1WZXOLHgDvundrAtuvz0D3T # +dYaNcwafsVCGZKUhQPL1naFKBy1p6llN3QgshRta6Eq4B40h5avMcpi54wm0i2e # PZD5pPIssoszQyF4//3DoK2O65Uck5Wggn8O2klETsJ7u8xEehGifgJYi+6I03Uu # T1j7FnrqVrOzaQoVJOeeStPeldYRNMmSF3voIgMFtNGh86w3ISHNm0IaadCKCkUe # 2LnwJKa8TIlwCUNVwppwn4D3/Pt5pwIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIw # ADAdBgNVHQ4EFgQU5Dv88jHt/f3X85FxYxlQQ89hjOgwHwYDVR0jBBgwFoAU729T # SunkBnx6yuKQVvYv1Ensy04wDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoG # CCsGAQUFBwMIMIGVBggrBgEFBQcBAQSBiDCBhTAkBggrBgEFBQcwAYYYaHR0cDov # L29jc3AuZGlnaWNlcnQuY29tMF0GCCsGAQUFBzAChlFodHRwOi8vY2FjZXJ0cy5k # aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2 # U0hBMjU2MjAyNUNBMS5jcnQwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL2NybDMu # ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5 # NlNIQTI1NjIwMjVDQTEuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG # /WwHATANBgkqhkiG9w0BAQsFAAOCAgEAZSqt8RwnBLmuYEHs0QhEnmNAciH45PYi # T9s1i6UKtW+FERp8FgXRGQ/YAavXzWjZhY+hIfP2JkQ38U+wtJPBVBajYfrbIYG+ # Dui4I4PCvHpQuPqFgqp1PzC/ZRX4pvP/ciZmUnthfAEP1HShTrY+2DE5qjzvZs7J # IIgt0GCFD9ktx0LxxtRQ7vllKluHWiKk6FxRPyUPxAAYH2Vy1lNM4kzekd8oEARz # FAWgeW3az2xejEWLNN4eKGxDJ8WDl/FQUSntbjZ80FU3i54tpx5F/0Kr15zW/mJA # xZMVBrTE2oi0fcI8VMbtoRAmaaslNXdCG1+lqvP4FbrQ6IwSBXkZagHLhFU9HCrG # /syTRLLhAezu/3Lr00GrJzPQFnCEH1Y58678IgmfORBPC1JKkYaEt2OdDh4GmO0/ # 5cHelAK2/gTlQJINqDr6JfwyYHXSd+V08X1JUPvB4ILfJdmL+66Gp3CSBXG6IwXM # ZUXBhtCyIaehr0XkBoDIGMUG1dUtwq1qmcwbdUfcSYCn+OwncVUXf53VJUNOaMWM # ts0VlRYxe5nK+At+DI96HAlXHAL5SlfYxJ7La54i71McVWRP66bW+yERNpbJCjyC # YG2j+bdpxo/1Cy4uPcU3AWVPGrbn5PhDBf3Froguzzhk++ami+r3Qrx5bIbY3TVz # giFI7Gq3zWcwggdWMIIFPqADAgECAhADMlFYfN/evhzf5XYSzZUnMA0GCSqGSIb3 # DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFB # MD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5 # NiBTSEEzODQgMjAyMSBDQTEwHhcNMjUwMzIwMDAwMDAwWhcNMjYwNjAzMjM1OTU5 # WjBeMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExFDASBgNV # BAcTC01vcnJpc3ZpbGxlMQ8wDQYDVQQKEwZMZW5vdm8xDzANBgNVBAMTBkxlbm92 # bzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOPjJ/+Kdi4SqmdpYRYm # 5E/ctl9H/KHwC3GK10hQmHGetCCuJkcx+STyvxLIuuzh6CIupbxzDPXQ2x2/5jA6 # 2EROThgMKl/0fV+hwvZhVl45idBUi0qo+91jYeK9kXjjLrxXEsX6A5Uu4Lgl56vr # 8h6cGZg/te9ozF3k2JN80MIzSj/F769/ZpuGq9i4j1HQ7xq/aoXFlrTD86zSC7YG # AVU5PSU06ZOOTMAAvGm7ifKv/xQyeO8EE4acIgFB5a8RRC0JQj19eIRBhtfkh1dy # TX/ocPdsBQICpqo0VXvRb/9iaHj3+r9CWSPtx0kQxRkpHMv/qCtM7kBscljbejLA # VOXuhWKmNemNGIu7UMIZyro3+XzI4s1biJlGp6bTShs02EbmzlyUJTgithsYgC5n # X/WRcaHbshvy5S1EJo8m1fi5v/4bj9OTBUOjaYAVKvOjzYE7QR4PhuN/ww8HpGdR # jLS/eS8Sz3Jxz7EVApPNSzwycDkxAR6Y0w4ymaGy3ZnTOUJjESfwqJvqigjYMcbZ # +LJOqbLE6bQEmQ+tZiclcdoU4FhleAqQlfksb9kLc5GcU23uIp1aKQ1nji6pxMif # IHtE5OcMgJzy60tyX/dPpxBGbR3l6+K02v5KI1/GtrVSWxvJHKlXnIMQ4EcgIZBz # U+NPRgmPG7ZSzYRhpZl/+PrhAgMBAAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Dr # tjv4XxGG+/5hewiIZfROQjAdBgNVHQ4EFgQUcBJh2GrEdlUHxwi/fkRtYI55VfAw # PgYDVR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5k # aWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEF # BQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIx # Q0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwgZQG # CCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy # dC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEu # Y3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggIBACeB1ob7bkUKbCC40mTr # HpXQHQbaeE7ymacNpXKyHefcQij+Op9DsduyOHNLbEojHm24k8GiGjx3ZnaZGKTh # RQHiijGN+H8Qy27SDvw2MzLnyB7XNg+uCPqIf6xWLdtdQ65T7MaBon6BIX/shzxQ # t+Jpkr1+qcAP6wWCQ0Q0W5I0w5PKb19dMaT26mw6mnGd06pnTvgpCVRnVy8UJtb7 # Ltt7dfE1G0Cz3LdWW9iBVCI73n/DGWhO8fbiK4D4NpdiNnWVfsxhJ7DSb+6RKJXP # eG3GwGbmuyDD3D2N9mJnW/6VYAiBwnewGRqwA6D20QKPB0QFHlqVHwkyoYIynVcE # dfM4K3dtxP8mh6IrEEbWfctNLRgnvRsEE/GnAEmpHxLyzWRx+FILzlaZmRPSyYAO # O8bE4nWNOTKLdpa/OMum6r/qDJmjcLs80aqMlRiG1k4F2grobscDV+lzy65du9+W # a8qUeY6rZsnHK02DGOf4iWLqEgaUf36QH10MUpGgj/dkK5cwLCpA1+/d+mySgEF3 # 1N2RHkf5bRVq0DsR8AGT76npVtpyRdnIlIHksfB0G8dDjioKEzCneATEUkketoL1 # ML+ZOcM8t2uURmjK8ZecklHZF74jmrkYVyve2HrxcHOr2qPuwOkRQ5NLnYluYKQo # Qv4KrbHKxS/bQKd55kJZVzTbMYIGSDCCBkQCAQEwfTBpMQswCQYDVQQGEwJVUzEX # MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0 # ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhADMlFY # fN/evhzf5XYSzZUnMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgACh # AoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAM # BgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBRi7cnxHT7OD9/jM2/KtOB7zP4k # ADANBgkqhkiG9w0BAQEFAASCAgAidQRj9IqzHoiqwiJ6S6/iCaXob2zMPiYTFXTz # gyzc8YBdmTkQXmnOtlPLh7Zl4+qBPnVTdI/reFbcLbfIZQCHWOSiEj35jNE1vFuf # gX/9b8efXAIqHbUsdTSf4PzP8s1yramdWFY+pQpNM8MmNfx4x6/1AfIS40wYyiJW # zo1uEmRVlvSxfH9xH/gPqD+SJl44qnbaT+FsonhcfRTh+tuFhzkZbAKwgVhCLwOh # NnUFQRqIuYvNgON8gtGqo/enOQKMhBItcMURQ+9V3uyO54m+d2IeL1wVpGPo6GeM # gy7ASNlRE1TQIAA4D57C+mFACQiaS5Hf5Jg16QrIJKs06YdMCydNrsK2sy7LZgBe # q6/T22J8Gw5SpPuqM1RjHUSu58dbhPQpEB6o+8jB3vzKdwuZ6zrOOLaCcbejddpf # SM3UHQL+qjxii73EZ1+k086y0KwEzwphl2BKmHakBw8iqT0syhrKaXQX+BO/i2jV # arnOSAOm3b/pumNw7ogMYWFoyzrLBgU0I2pPkV+7ljiZvrCMuSv1r++rOQKktJaO # j0miWqdNEqqNRNwNAvJV68fYKx8+x7xPjQdwW2v+JVr/fcIMCgVayaeEDleHcQjd # C348V8wzfvnQpHEENN9E0dKlfiNJQkq+GP06frW7LN0lQuIy3+2t4Cs4nVC5FFdd # lyycNaGCAyYwggMiBgkqhkiG9w0BCQYxggMTMIIDDwIBATB9MGkxCzAJBgNVBAYT # AlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQg # VHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEC # EAqA7xhLjfEFgtHEdqeVdGgwDQYJYIZIAWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMx # CwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNTExMDYyMjM1MDFaMC8GCSqG # SIb3DQEJBDEiBCAzTq24BV0Ij6HeQsQt7KlTXRQZ4VSZ9Y4Vs9QMe3tz2TANBgkq # hkiG9w0BAQEFAASCAgBlfoxZtdK1q4iylXxcNgqf10F5uHb2rAajJ+sWmWxpGwWc # TPi5BDzIDk02zPP8wKEMEdMSea0jwUjnAhgBoqKwXstSuP1jhPRrkB2mqoJVv4cR # UW7YPkR97W5PpnXxAenGwkgx5uQsVm6uNxnazC28JvaCApNTe6dozK9CDNBJ+eO7 # 47gz5KU8H7XlyxeyppSyrVnMwb9H6/9cHqKEgN8EiYWQmnvXP3ieHIKmAAmvLMwi # Y8IDYnsqdMFS3643hugd0jhkkH0ZmyRDL9r6hVPS/vBlARNu4qtKyzoq1c7QFlAj # 4YEbwpPiQkHzbAThjvYN7sQhyheGl3q1GKiEcE/ODkCS77LW5PBkRxvwe0nUBefy # NFSCxutjprt0KIg4eJKpcG2OdPchgumgURGqShDfFw+Jzqc5tQ7/+0yMAT2SZVgB # y1CqGsjWSn4zw2Ixum7RmyCw22d5TPBIeSuALf81dr6/LvYht0z47SgcsZpe4Dhy # AwRZp7/ZSjavD+IHCU+GhOZjGpWH5ZBV++C0bNcCyNUoZlV7zkzul5GgpDvLGmgl # GjAkPJh5gSM17CAFn6GomwCeLGPqplrn6PuaY9zEPiHkHkE08EUkYyMZL+LmOpOz # kwRukx9Q6bla1OEmxJJyZVMHqErlbStmICL+OVhC/cxqAICNwgn8C4EnWmHoEA== # SIG # End signature block |