Private/Tests/ConvertFrom-AvmBicepTestSubscriptionPool.ps1
|
function ConvertFrom-AvmBicepTestSubscriptionPool { [CmdletBinding()] [OutputType([pscustomobject[]])] param( [Parameter(Mandatory)] [AllowEmptyString()] [string] $PoolJson ) Set-StrictMode -Version 3.0 $ErrorActionPreference = 'Stop' $document = $null try { $options = [System.Text.Json.JsonDocumentOptions]::new() $options.MaxDepth = 3 $document = [System.Text.Json.JsonDocument]::Parse($PoolJson, $options) if ($document.RootElement.ValueKind -ne [System.Text.Json.JsonValueKind]::Array -or $document.RootElement.GetArrayLength() -eq 0) { throw [AvmConfigurationException]::new('The test subscription pool must be a nonempty JSON array.') } $ids = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::Ordinal) $records = [System.Collections.Generic.List[object]]::new() foreach ($entry in $document.RootElement.EnumerateArray()) { if ($entry.ValueKind -ne [System.Text.Json.JsonValueKind]::Object) { throw [AvmConfigurationException]::new('Test subscriptions must be objects with id, name, and an optional tag.') } $properties = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) foreach ($property in $entry.EnumerateObject()) { if (-not $properties.Add($property.Name) -or $property.Name -cnotin @('id', 'name', 'tag')) { throw [AvmConfigurationException]::new('Test subscriptions must not contain duplicate, miscased, or unknown properties.') } } $idValue = [System.Text.Json.JsonElement]::new() $nameValue = [System.Text.Json.JsonElement]::new() if (-not $entry.TryGetProperty('id', [ref]$idValue) -or -not $entry.TryGetProperty('name', [ref]$nameValue) -or $idValue.ValueKind -ne [System.Text.Json.JsonValueKind]::String -or $nameValue.ValueKind -ne [System.Text.Json.JsonValueKind]::String) { throw [AvmConfigurationException]::new('Test subscriptions must contain string id and name properties.') } $id = $idValue.GetString() $name = $nameValue.GetString() $guid = [guid]::Empty if ($id.Length -ne 36 -or -not [guid]::TryParseExact($id, 'D', [ref]$guid) -or $guid -eq [guid]::Empty -or -not $ids.Add($guid.ToString('D'))) { throw [AvmConfigurationException]::new('Test subscriptions must contain distinct, nonempty subscription GUIDs.') } if ([string]::IsNullOrWhiteSpace($name) -or $name -match '[\x00-\x1f\x7f]') { throw [AvmConfigurationException]::new('Test subscription names must be nonempty and free of control characters.') } $tag = 'General' $tagValue = [System.Text.Json.JsonElement]::new() if ($entry.TryGetProperty('tag', [ref]$tagValue)) { if ($tagValue.ValueKind -ne [System.Text.Json.JsonValueKind]::String -or $tagValue.GetString().Length -gt 64 -or $tagValue.GetString() -cnotmatch '\A[A-Za-z0-9]+(?:[ -][A-Za-z0-9]+)*\z') { throw [AvmConfigurationException]::new('A test subscription tag must be a string of at most 64 alphanumeric characters separated by single spaces or hyphens.') } $tag = $tagValue.GetString() } $key = [System.Security.Cryptography.SHA256]::HashData( [System.Text.Encoding]::UTF8.GetBytes($guid.ToString('D'))) $records.Add([pscustomobject]@{ SubscriptionId = $id Name = $name Tag = $tag Index = $records.Count Key = [Convert]::ToHexString($key).ToLowerInvariant() }) } return $records.ToArray() } catch [System.Text.Json.JsonException] { throw [AvmConfigurationException]::new('The test subscription pool must be strict JSON containing id/name objects with optional tags.') } finally { if ($null -ne $document) { $document.Dispose() } } } # SIG # Begin signature block # MIInOAYJKoZIhvcNAQcCoIInKTCCJyUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAxmjvPjEKHc/eZ # c2vy/n4mCNEcrxF/ajxKV7bd3QTEJ6CCDMkwggYEMIID7KADAgECAhMzAAACHPrN # xZvoL37EAAAAAAIcMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD # b2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwNDE2MTg1OTQxWhcNMjcwNDE1MTg1 # OTQxWjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYD # VQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IB # DwAwggEKAoIBAQDVsZfgOKmM31HPfoWOoNEiw0SlCiIxUMC0I9NMWbucKOw/e9lP # oAoehQVu6SG65V4EPzrYsnBnFPNoi4/HoOdjhz1qkrEt4I6tEcxXU6oOeY9zGveC # /3iBeuhLYxM3M/PkcUoebF+Nednm8OkdSPoDu8imViHPQq/8CQUu0WRR4rE+dMRf # rpVqfmNi2qWCX94T4MsepijGVkwE//tJg0ryAiYdHT34LSnlG/RSBZmQRGWZ5g8j # qnKjRParSqMft1gvjuUTVgtWNZfgcLFSK5Wa0myrq8OPcgTGGsRgun+tnSS+IxDT # xVsAPH1OzvPjwomguByhUe/OcvUN0D5Wmp7xAgMBAAGjggGqMIIBpjAOBgNVHQ8B # Af8EBAMCB4AwHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0O # BBYEFNoH7a2YDjOSwpkp6DHcmUS7J+0yMFQGA1UdEQRNMEukSTBHMS0wKwYDVQQL # EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxFjAUBgNVBAUT # DTIzMDAxMis1MDc1NjkwHwYDVR0jBBgwFoAUf1k/VCHarU/vBeXmo9ctBpQSCDEw # YAYDVR0fBFkwVzBVoFOgUYZPaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w # cy9jcmwvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNy # bDBtBggrBgEFBQcBAQRhMF8wXQYIKwYBBQUHMAKGUWh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmcl # MjBQQ0ElMjAyMDI0LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IC # AQAUnEqhaRXe0T3hIJjvdQErEkrA/7bByjn6t5IArODkkRjzkYwtKMc2yYj2quaN # rLutWw2YZcngKPy1b71YyDJQTy4NDRwaSh9Tw5thrk3NmcPrAHia5vtcBJ1CgtKK # 7mQbIcQ22d/N3813ayCDDFewu1+jsZmX+r/aTEqaOM4TVxVtRSkuCy8nAXKuChOK # Li/zA4XuH8iEYqIsj2YoNaeSxVmeGiERXpKdo3dDmYi0kO5w2D8VS4c3+9h6gElY # BaAAg/dYErBg27qT3vv0zRDJhJufvCNylA8S7/+8H5E/PV5cng6na9VV/w9OV3qu # uND6zdGa2EX38Glp50F9AIQk3p2xXmcvorDeM4XJ7UlWYBi6g80J1SSOQnInCYFE # msfUNn3+1AaTJKSJL83quKArTac2pKhu0Yzzzrzo6HrsRiQKzpnRBb1/dMa6P3hz # 75XbMRBctNsFhZC07WCmjExdLg2eHW5uV0TY8D5+6wozJf7vF3+WHkYPO85Z+BC6 # U4FkNbYNycZ9cE4j1tXRdyDCfml6c0HWPHjNVDObrv9lKt3qUqFpX38VCqVCyNOO # 1UcXfQiVjJw32U2WUKZjt/neJKHEBsm9kFsLuWzkQ53+qcaSaytmsCnk2gOglrlD # 5d3kKyvvAw+rzm0lT8K38P6PLxfZQHhu4W8dV7Av8N2ZmDCCBr0wggSloAMCAQIC # EzMAAAA5O7Y3Gb8GHWcAAAAAADkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBS # b290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDExMB4XDTI0MDgwODIwNTQxOFoX # DTM2MDMyMjIyMTMwNFowVzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQ # Q0EgMjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANgBnB7jOMeq # lRYHNa265v4IY9fH8TKhemHfPINe1gpLaV3dhg324WwH06LcHbpnsBukCDNitryo # 0dtS/EW6I/yEL/bLSY8hKpbfQuWusBPr9qazYcDxCW/qnjb5JsI1s8bNOg3bVATv # QVL4tcf03aTycsz8QeCdM0l/yHRObJ9QqazM1r6VPEOJ7LL+uEEb73w6QCuhs89a # 1uv1zerOYMnsneRRwCbpyW11IcggU0cRKDDq1pjVJzIbIF6+oiXXbReOsgeI8zu1 # FyQfK0fVkaya8SmVHQ/tOf23mZ4W9k0Ri22QW9p3UgSC5OUDktKxxcCmGL6tXLfO # GSWHIIV4YrTJTT6PNty5REojHJuZHArkF9VnHTERWoTjAzfI3kP+5b4alUdhgAZ7 # ttOu1bVnXfHaqPYl2rPs20ji03LOVWsh/radgE17es5hL+t6lV0eVHrVhsssROWJ # uz2MXMCt7iw7lFPG9LXKGjsmonn2gotGdHIuEg5JnJMJVmixd5LRlkmgYRZKzhxS # CwyoGIq0PhaA7Y+VPct5pCHkijcIIDm0nlkK+0KyepolcqGm0T/GYQRMhHJlGOOm # VQop36wUVUYklUy++vDWeEgEo4s7hxN6mIbf2MSIQ/iIfMZgJxC69oukMUXCrOC3 # SkE/xIkgpfl22MM1itkZ35nNXkMolU1lAgMBAAGjggFOMIIBSjAOBgNVHQ8BAf8E # BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFH9ZP1Qh2q1P7wXl5qPX # LQaUEggxMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMB # Af8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0fBFMwUTBP # oE2gS4ZJaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRSMFAw # TgYIKwYBBQUHMAKGQmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv # TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDANBgkqhkiG9w0BAQwFAAOC # AgEAFJQfOChP7onn6fLIMKrSlN1WYKwDFgAddymOUO3FrM8d7B/W/iQ6DxXsDn7D # 5W4wMwYeLystcEqfkjz4NURRgazyMu5yRzQh4LqjA4tStTcJh1opExo7nn5PuPBY # nbu0+THSuVHTe0VTTPVhily/piFrDo3axQ9P4C+Ol5yet+2gTfekICS5xS+cYfSI # vgn0JksVBVMYVI5QFu/qhnLhsEFEUzG8fvv0hjgkO+lkpV9ty6GkN4vdnd7ya6Q6 # aR9y34aiM1qmxaxBi6OUnyNl6fkuun/diTFnYDLTppOkr/mg5WSfCiDVMNCxtj4w # PKC5OmHm1DQIt/MNokbbH3UGsFP1QbzsLocuSqLCvH09Io3fDPTmscR9Y75G4qX7 # RTX8AdBPo0I6OEojf39zuFZt0qOHm65YWQE69cZM2ueE1MB05dNNgHK9gTE7zKvK # /fg8B2qjW88MT/WF5V5uvZGtqa9FSL2RazArA+rDPuf6JGYz4HpgMZHB4S6szWSK # YBv0VisCzfxgeU+dquXW9bd0auYlOB58DPcOYKdc3Se94g+xL4pcEhbB54JOgAkw # YTu/9dLeH2pDqeJZAABVDWRQCaXfO5LgyKwKCLYXpigrZYCjUSBcr+Ve8PFWMhVT # Ql0v4q8J/AUmQN5W4n101cY2L4A7GTQG1h32HHAvfQESWP0xghnFMIIZwQIBATBu # MFcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # KDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMjQCEzMAAAIc # +s3Fm+gvfsQAAAAAAhwwDQYJYIZIAWUDBAIBBQCggZAwGQYJKoZIhvcNAQkDMQwG # CisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIEIKZ8ron40cUyCIgBjV9sSci4jDPu # 5ltbL0AlXb9uJbJ3MEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8AcwBv # AGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAE # ggEAnuxC0XMsI1m+cWa27wqs83+aekUu/69KHVsewJzhTxeziihOhH7FMa9wA/Hu # W58WiCURTzsE9VnNoyhiqYsJ3/saoEzISwLu1I+vok2MY9ZYfkq38nXJYvEJ3I8p # zuM94hqP0YAm4AF8GPbXkf3k8SyLDbjChGOGwaBfqM1oxoqQsnl72eAyTth9RtJR # HdO6Qvn2j5yifp8Dwiv6xPA6z2XQRN0/XwfjBQCryKQEAN4LnhlFrr3avOHVhKPh # WzXa1Zl5A+ax8twdcNRQiECVUBcwNO10ID0FTy54yCGnfFOZsyfR63T/ie/FXvlA # Gc7+qLLAactmkjeHpylnzoRdw6GCF5UwgheRBgorBgEEAYI3AwMBMYIXgTCCF30G # CSqGSIb3DQEHAqCCF24wghdqAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFQBgsqhkiG # 9w0BCRABBKCCAT8EggE7MIIBNwIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQC # AQUABCBrp8SSXezsdR7ebybTL7wirOBNUbvHsYCY0/kgLgzJzAIGaqmCfEkRGBEy # MDI2MTAxNTE5MDQ1Mi45WjAEgAIB9KCB0aSBzjCByzELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg # T3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkEwMDAtMDVFMC1E # OTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR7TCC # ByAwggUIoAMCAQICEzMAAAIruwBQ/007mqEAAQAAAiswDQYJKoZIhvcNAQELBQAw # fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl # ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd # TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjYwMjE5MTk0MDExWhcN # MjcwNTE3MTk0MDExWjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0 # b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUG # A1UECxMeblNoaWVsZCBUU1MgRVNOOkEwMDAtMDVFMC1EOTQ3MSUwIwYDVQQDExxN # aWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEAl95oujg97MlKkJuEKoJKyj23LCv0Md32HLS/PlTNbjmN26KI # uRscGrk4EH+iRRyE06MUu4I6ipSvDhS8y+lE5dI8RCubeg7jnICV3b7rYpqE5Tkt # At5MiE1wQF6I/4KeoUUfc+lkYqdSrZIpW93SVwo0Kk/T9grro6/lc/K/mfow5dPY # 4v4nP+Bt+K95lcI7P/xp8fT7t9VfK1xYnDYgM8abm2sKW3fKan85Vk9r5xt5BfZe # jIkRG7yd1xy1MB0LIdLf060hcf7P8gqqSVmCeqApRu9Lb7BR9GkT/MAeHD/whWti # C75NuotznCQZfqaiox00gcvZr8EzxA5Z83KNDbfEeqUj012YAbLHB4aCnwtFkJjs # 2NpHl2wJkU3GTMl8+b/wCW5qCNMtOwWs77eTZF3XRvUxK0FsLbBciCqxJQ4Fnx3g # qE7tcLtnIg93Su9s93GtoM6BA8U9o/QVyFCmok803UD0bADGjt3VNM2hsDDJcLUi # cg4deGBIGaFLub0vDLoDKnazY6Yci+ucioY6QFm4WJCBzv9LmY7vebT/M2TalyEY # eLXX1hyTwE5/a/nMZMrodsdFS3X8dZZivV9zYx9DbYALOSQf8DpZMrrncZhU31lc # kay9+4rKTmfGjwBYL8kenDU5BqZBaN+SUY3IjZmYlOKk/VLcvleYLnRZNY8CAwEA # AaOCAUkwggFFMB0GA1UdDgQWBBQ+Fo7kE1CW7W3d45r2ZLtBWdnlNjAfBgNVHSME # GDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1l # LVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsG # AQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p # Y3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMB # Af8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDAN # BgkqhkiG9w0BAQsFAAOCAgEAzvwirHIhDPJK9X6h+E5X0+uhDaE48V8PNdKchKtD # 3a4C8H4E98ftYM+wkB7VHXr6jEOah8gy4ZuqU/ddQmJBjfuoPjFO3zGE6+nd0sYn # icASKFpH0eIO0orRszClOOuShGHo33XaFIKLwv8XEaWgCzuad/wNuPAcoSYjLbQU # DQ7bE/x2ghcERQlEW8v3/HNZJMvBfMZAlxc/vzLWeXdZVhY8DiNoHmR1qvV4oQzo # HnuZ0tpKKOVep/FxtttFE3r1X/qYJqSB+9Vyg1SGExhmSbOsj5Xydml6sNTBODUe # qJDbGNz9TN9R+gzGEXyRjQTXqefeZFxod2MwN3AosoPo5iefIf307454CKblBXzg # 6Q4xcdInNWKCwDcYQhd0YUvamDOyuNDRISrIWLmgJCBtlwSmIoN6/9P29LI74wcL # OeQGKJzJtwPKnF/+pPVX3NJr/XbaJx7lhnwNm/qhNqqQp4cxm3Qx6u4jkmRMNNZz # bqQDH9XONZPSKE0Ns94sOsOGWaCzsoOEyjG6dZK6U+La4qf8t9Ar+ZIcqggzaml0 # KQZDmDjfC4LaEN2plTl+4seY3a58f71MU1EooF761nS+1JPJKZktM7aNk6Mu2k+a # Acwk734/YifwTfxNb4RQZISQr2ez1b7DEp005pMdhWpdpVZM7bgCOOHw/7siyXWj # EEswggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEB # CwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD # VQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAe # Fw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 # YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGm # TOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/H # ZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDc # wUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62A # W36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1w # jjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCG # MFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ # 1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP # 8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFz # ymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHz # NgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3 # xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsG # AQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/ # LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEG # DCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYB # BQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8G # A1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQw # VgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9j # cmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUF # BwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQEL # BQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfC # cTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AF # vonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l # 9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn # 8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5m # O0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyx # TkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4 # S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9 # y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM # +Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhw # RNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDUDCCAjgC # AQEwgfmhgdGkgc4wgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNV # BAsTHm5TaGllbGQgVFNTIEVTTjpBMDAwLTA1RTAtRDk0NzElMCMGA1UEAxMcTWlj # cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUACaw/dMpB # 6aP9ABm+5ZsL7ArakTmggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg # MjAxMDANBgkqhkiG9w0BAQsFAAIFAO57iPIwIhgPMjAyNjEwMTUxNzE2MzRaGA8y # MDI2MTAxNjE3MTYzNFowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA7nuI8gIBADAK # AgEAAgIargIB/zAHAgEAAgIR9zAKAgUA7nzacgIBADA2BgorBgEEAYRZCgQCMSgw # JjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3 # DQEBCwUAA4IBAQAY1Md2rXJnKbs+wJRWVxUsEEjoZl5QPT+xlCWqyNYMEv6lg3RL # v0q10Etzl+ZqSBnnHAA3KEqzxOVUXVRHasChWs0ASMogFt3d7fbF+X0omw06dWmz # ZIJCYbPlrxuC0gFhpSfFk8r5ggqkVYAGtxN0YwhhMDzgjE49LoYe5jWmOLITz6pV # lw+TII0L71AVAiIr6teyME6iklNUBD4zjBEK4e/wVOCBld5u+x9zDJdZjz/HzVg/ # W5MJjTRTo85FdXpDGBWeI9Q+SnFqGUcC01XVJ6N8vR7+DvzIRwPzYnYWAvfr0t4K # xzNmx7v1kvctgINylUns78VcoR0STY/sJcW+MYIEDTCCBAkCAQEwgZMwfDELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z # b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAIruwBQ/007mqEAAQAAAiswDQYJ # YIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkq # hkiG9w0BCQQxIgQgVhHpemHQ2Z0fodrc6MXueW6jbPpmt8Fqg4t0xgPV0fcwgfoG # CyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCByDiP0P5BX7WAPjNjmPtQcd2owQ+v1 # gwLT09rxZL9uUjCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw # AhMzAAACK7sAUP9NO5qhAAEAAAIrMCIEIJFq4fX+ZpTQhbhNsr1aTf0OZCmpsQya # do2OEj+XPvKHMA0GCSqGSIb3DQEBCwUABIICADIgYEDXSvo79TlCDRMg+WDu/qhx # o0QB85dv+kFxn3+c131Q8zw566HhiMiWVNmYWoYGBfnpfNt9TomFzaE4BMkXIl7u # rQuEYFaZviMbOqKA088zYQLHZjyeZOv/S7UcMyRL8UJNXEIPr+RZZhAEj6Z2TOTB # eMrOYeQBZgWsoJQ0iKYJ4LlgXCuzJPD6/gGgak7hYVKApJsk6Ay1wBqCalGmazkB # j0PvLbo1hJZuOuwLefZw+A5BVzeNSwSEoypAvL2tWoFV6jPJq5y6t5sD2YpTceQj # l4tK64YS4h7ELhdc4DzzJxJ631sJGaxUDm14E27IGwNjAzPb1k9Umnphv1Jt0hUM # aUSBArnpc+ASMrCKDtJxe9PTOCN+JPxhp7YB2DVMTJe3t3KE2I/HRSZMTHOFFoyh # EMVGplC79MuYYR2XJUJkt5AtG4fTGQPqbb1Wx4B41rasxxg4+a0CAxr192x6n/vJ # BUxjZUOZcFILyWyuvPnpRSFj/rfV3yeXsIrW2/e7wKp6GWV3BR2X/jLPBS87RkQN # lYdoNVd2JQvvU8Ezf0eiaG43oVPXnp9H0eV156RXxakZ7iokoqPCi4NCI4tBADb9 # soyynzfRP1edlhqJ+3s9qiURb82ZJpI2NUao1r8mZpYeypRtkL7ZxUwcDj3KxVUZ # p8+8Qf2c8f6U9PkM # SIG # End signature block |