AzStackHciStandaloneObservability/package/bin/ObsDep/content/Powershell/Roles/Common/NetworkControllerWorkloadHelpers.psm1
<###################################################
# # # Copyright (c) Microsoft. All rights reserved. # # # ##################################################> Import-Module "NetworkControllerRESTWrappers.psm1" -DisableNameChecking function New-ACL { param( [Parameter(mandatory=$false)] [String] $ResourceId=[System.Guid]::NewGuid(), [Parameter(mandatory=$true)] [object[]] $aclRules ) $ar = @() foreach ($rule in $aclRules) { $ar += New-NCAccessControlListRule -Protocol $rule.Protocol -SourcePortRange $rule.SourcePortRange -DestinationPortRange $rule.DestinationPortRange -sourceAddressPrefix $rule.sourceAddressPrefix -destinationAddressPrefix $rule.destinationAddressPrefix -Action $rule.Action -ACLType $rule.Type -Logging $true -Priority $rule.Priority } $acl1 = New-NCAccessControlList -resourceId $ResourceId -AccessControlListRules $ar return $acl1 } function Get-PortProfileId { param( [Parameter(mandatory=$true)] [String] $VMName, [Parameter(mandatory=$false)] [String] $VMNetworkAdapterName=$null, [Parameter(mandatory=$false)] [String] $ComputerName="localhost" ) Write-Verbose ("Getting port profile for [$vmname] on [$computername]" ) try { $pssession = New-PSSession -ComputerName $computername Invoke-Command -Session $pssession -ScriptBlock { if ([String]::IsNullOrEmpty($using:VMNetworkAdapterName)) { $vmNics = Get-VMNetworkAdapter -VMName $using:VMName } else { $vmNics = @(Get-VMNetworkAdapter -VMName $using:VMName -Name $using:VMNetworkAdapterName) } $result = @() foreach ($vmNic in $vmNics) { $currentProfile = Get-VMSwitchExtensionPortFeature -FeatureId "9940cd46-8b06-43bb-b9d5-93d50381fd56" -VMNetworkAdapter $vmNic if ( $currentProfile -eq $null) { $result += $null } else { $result += [system.guid]::parse($currentProfile.SettingData.ProfileId).tostring() } } return $result } } finally { $pssession | Remove-PSSession -ErrorAction Ignore } } function Get-MacAddress { param( [Parameter(mandatory=$true)] [String] $VMName, [Parameter(mandatory=$false)] [String] $VMNetworkAdapterName=$null, [Parameter(mandatory=$false)] [String] $ComputerName="localhost" ) Write-Verbose ("Getting mac address for [$vmname] on [$computername]" ) try { $pssession = New-PSSession -ComputerName $computername Invoke-Command -Session $pssession -ScriptBlock { if ([String]::IsNullOrEmpty($using:VMNetworkAdapterName)) { $vmNics = Get-VMNetworkAdapter -VMName $using:VMName } else { $vmNics = @(Get-VMNetworkAdapter -VMName $using:VMName -Name $using:VMNetworkAdapterName) } $result = @() foreach ($vmNic in $vmNics) { $result += $VMNic.MacAddress } return $result } } finally { $pssession | Remove-PSSession -ErrorAction Ignore } } function Add-NetworkAdapterToNetwork { param( [Parameter(mandatory=$true)] [String] $VMName, [Parameter(mandatory=$true)] [String] $VMNetworkAdapterName, [Parameter(mandatory=$true)] [String] $ComputerName, [Parameter(mandatory=$false)] [String] $NetworkInterfaceResourceId="", [Parameter(mandatory=$true)] [Object] $LogicalNetworkResourceId, [Parameter(mandatory=$true)] [String] $SubnetAddressPrefix, [Parameter(mandatory=$false)] [String] $ACLResourceId=$null, [Parameter(mandatory=$false)] [String] $IPAddress, [Parameter(mandatory=$false)] [Object] $Credential ) if ([string]::IsNullOrEmpty($NetworkInterfaceResourceId)) { $NetworkInterfaceInstanceId = Get-PortProfileId -vmname $vmname -vmnetworkadaptername $VMNetworkAdapterName -computername $computername $NetworkInterfaceResourceId = Get-NCNetworkInterfaceResourceId -InstanceId $NetworkInterfaceInstanceId } # If NetworkInterfaceResourceId is still null, it is possible that the NIC is already in the NC but the port profile is still a null port profile. This Could # happen in the case of VM update scenario. So try to get the NIC from NC based on mac address and IP address. $mac = Get-MacAddress -vmname $vmname -VMNetworkAdapterName $VMNetworkAdapterName -ComputerName $ComputerName if ($mac.count -eq 0) { throw "Couldn't find the MACAddress for network adapter ($VMNetworkAdapterName) of VM $vmname on host $ComputerName." } $macAddress = $mac.Replace('-', '') $ncNics = get-ncnetworkinterface Trace-Execution "Searching a network interface with MAC address ($macAddress) and IP ($IPAddress) from NC." foreach ($ncnic in $ncNics) { if (($ncnic.properties.privateMacAddress -eq $macAddress) -and ($ncnic.properties.ipconfigurations -ne $null) -and ($ncnic.properties.ipconfigurations.count -gt 0) -and ($ncnic.properties.ipconfigurations[0].properties.privateIPAddress -eq $IPAddress)) { $NetworkInterfaceResourceId = $ncnic.resourceId Trace-Execution "Found NC network interface with resourceId $NetworkInterfaceResourceId for network adapter with MAC address ($macAddress) and IP ($IPAddress)" break } } $ln = Get-NCLogicalNetwork -ResourceId $LogicalNetworkResourceId if ($ln -eq $null) { throw "Logical Network is Null." } foreach ($lnsubnet in $ln.properties.subnets) { if ($subnetaddressprefix -eq $lnsubnet.properties.Addressprefix) { $subnet = $lnsubnet break } } if ([string]::IsNullOrEmpty($subnet)) { throw "Logical Network doesn't contain any subnet that matches [$subnetaddressprefix]." } # if network interface is still not found on NC, we should add a new network interface to NC. if (([string]::IsNullOrEmpty($NetworkInterfaceResourceId)) -or ($NetworkInterfaceResourceId -eq "") -or ($NetworkInterfaceResourceId -eq [System.Guid]::Empty)) { $NetworkInterfaceResourceId = [System.Guid]::NewGuid() } # add acl if specified Trace-Execution "Creating network interface in Network Controller with resourceId $NetworkInterfaceResourceId, MAC address $mac and IP $IPAddress." if (![String]::IsNullOrEmpty($ACLResourceId)) { $acl = Get-NCAccessControlList -resourceID $ACLResourceId if ($acl -eq $null) { throw "ACL with resource id $aclresourceid was not found on the network controller." } $nic = New-NCNetworkInterface -resourceId $NetworkInterfaceResourceId -Subnet $subnet -MACAddress $mac -acl $acl -ipaddress $ipaddress } else { $nic = New-NCNetworkInterface -resourceId $NetworkInterfaceResourceId -Subnet $subnet -MACAddress $mac -ipaddress $ipaddress } if ($nic -eq $null) { throw "Failed to create network interface in Network Controller with resourceId $NetworkInterfaceResourceId." } set-portprofileid -resourceID $nic.instanceid -VMName $vmname -VMNetworkAdapterName $vmnetworkadaptername -computername $computername -Credential $Credential -Force return $nic } function New-LoadBalancerVIP { param( [Parameter(mandatory=$true)] [Object[]] $VMPool, #Object expected type is Microsoft.HyperV.PowerShell.VirtualMachine [Parameter(mandatory=$true, ParameterSetName="PrivateIp")] [string] $Vip, [Parameter(mandatory=$true, ParameterSetName="PublicIpReference")] [string] $PublicIpResourceRef, [Parameter(mandatory=$false)] [string] $protocol="TCP", [Parameter(mandatory=$false)] [int] $frontendPort, [Parameter(mandatory=$false)] [int] $backendPort=$frontendport, [Parameter(mandatory=$false)] [Switch] $EnableOutboundNat, [Parameter(mandatory=$false)] [object] $Probe = $null, [parameter(mandatory=$false)] [string] $LoadBalancerResourceID=[System.Guid]::NewGuid(), [parameter(mandatory=$false)] [string] $VMNicName = $null ) Trace-ECEScript "New load balancer VIP $Vip or PublicVip resource ref $PublicIpResourceRef" { switch($PsCmdlet.ParameterSetName) { "PrivateIp" { $slbm = get-ncloadbalancermanager if ($slbm.properties.vipippools.count -lt 1) { throw "New-LoadBalancerVIP requires at least one VIP pool in the NC Load balancer manager." } $vipPools = $slbm.properties.vipippools # check if the input VIP is within range of one of the VIP pools foreach ($vippool in $vipPools) { # IP pool's resourceRef is in this format: # /logicalnetworks/f8f67956-3906-4303-94c5-09cf91e7e311/subnets/aaf28340-30fe-4f27-8be4-40eca97b052d/ipPools/ed48962b-2789-41bf-aa7b-3e6d5b247384 $sp = $vippool.resourceRef.split("/") $ln = Get-NCLogicalNetwork -resourceId $sp[2] #LN resourceid is always the first ID (after /logicalnetwork/) if (-not $ln) { throw "Can't find logical network with resourceId $($sp[2]) from NC." } $subnet = $ln.properties.subnets | ? {$_.resourceId -eq $sp[4]} if (-not $subnet) { throw "can't find subnet with resourceId $($sp[4]) from NC." } $pool = $subnet.properties.ipPools | ? {$_.resourceId -eq $sp[6]} if (-not $pool) { throw "can't find IP pool with resourceId $($sp[6]) from NC." } $startIp = $pool.properties.startIpAddress $endIp = $pool.properties.endIpAddress if (IsIpWithinPoolRange -targetIp $Vip -startIp $startIp -endIp $endIp) { $vipLn = $ln break; } } if (-not $vipLn) { throw "$Vip is not within range of any of the VIP pools managed by SLB manager." } $lbfe = @(New-NCLoadBalancerFrontEndIPConfiguration -PrivateIPAddress $Vip -SubnetResourceRef ($vipLn.properties.Subnets[0].resourceRef)) } "PublicIpReference" { $lbfe = @(New-NCLoadBalancerFrontEndIPConfiguration -PublicIpResourceRef $PublicIpResourceRef) } } $ppids = @() foreach ($VM in $VMPool) { $vm_name = $VM.Name $vm_computer = $VM.ComputerName if ([String]::IsNullOrEmpty($VMNicName)) { $vm_nic = $VM.NetworkAdapters[0].Name } else { $vm_nic = $VMNicName } $instanceid = Get-PortProfileId -VMName $vm_name -VMNetworkAdapterName $vm_nic -ComputerName $vm_computer #convert port profile id to from instance id to resource id $ppid = Get-NCNetworkInterfaceResourceId -InstanceId $instanceid if (-not $ppid) { throw "Can't find ResourceId for network interface with instanceId $instanceid" } $ppids += $ppid } $lbbe = @(New-NCLoadBalancerBackendAddressPool) $rules = @() if($protocol -ne $null -and $frontendPort -ne 0 -and $backendPort -ne 0) { $rules = @(New-NCLoadBalancerLoadBalancingRule -protocol $protocol -frontendPort $frontendPort -backendport $backendPort -enableFloatingIP $False -frontEndIPConfigurations $lbfe -backendAddressPool $lbbe -probe $Probe) } $probes = @() if ($Probe -ne $null) { $probes = @($Probe) } if ($EnableOutboundNat) { $onats = @(New-NCLoadBalancerOutboundNatRule -frontendipconfigurations $lbfe -backendaddresspool $lbbe) $lb = New-NCLoadBalancer -ResourceID $LoadBalancerResourceID -frontendipconfigurations $lbfe -backendaddresspools $lbbe -loadbalancingrules $rules -outboundnatrules $onats -probes $probes } else { $lb = New-NCLoadBalancer -ResourceID $LoadBalancerResourceID -frontendipconfigurations $lbfe -backendaddresspools $lbbe -loadbalancingrules $rules -probes $probes } if($lb -eq $null) { Trace-Error "Failed to add/update load balancer with resourceID $LoadBalancerResourceID." } Add-LoadBalancerToNetworkAdapter -LoadBalancerResourceID $LoadBalancerResourceID -VMNicResourceIds $ppids } return $lb } Export-ModuleMember -Function Add-IDnsConfiguration Export-ModuleMember -Function Add-LoadBalancerToNetworkAdapter Export-ModuleMember -Function Add-NetworkAdapterToNetwork Export-ModuleMember -Function Convert-IPv4IntToString Export-ModuleMember -Function Convert-IPv4StringToInt Export-ModuleMember -Function ConvertTo-MacAddress Export-ModuleMember -Function Get-MacAddress Export-ModuleMember -Function Get-NCAccessControlList Export-ModuleMember -Function Get-NCCredential Export-ModuleMember -Function Get-NCGateway Export-ModuleMember -Function Get-NCGatewayPool Export-ModuleMember -Function Get-NCIPPool Export-ModuleMember -Function Get-NCLoadBalancer Export-ModuleMember -Function Get-NCLoadbalancerManager Export-ModuleMember -Function Get-NCLoadBalancerMux Export-ModuleMember -Function Get-NCLogicalNetwork Export-ModuleMember -Function Get-NCLogicalNetworkSubnet Export-ModuleMember -Function Get-NCMACPool Export-ModuleMember -Function Get-NCNetworkInterface Export-ModuleMember -Function Get-NCNetworkInterfaceInstanceId Export-ModuleMember -Function Get-NCNetworkInterfaceResourceId Export-ModuleMember -Function Get-NCPublicIPAddress Export-ModuleMember -Function Get-NCServer Export-ModuleMember -Function Get-NCSwitch Export-ModuleMember -Function Get-NCVirtualGateway Export-ModuleMember -Function Get-NCVirtualNetwork Export-ModuleMember -Function Get-NCVirtualServer Export-ModuleMember -Function Get-NCVirtualSubnet Export-ModuleMember -Function Get-PortProfileId Export-ModuleMember -Function Get-ServerResourceId Export-ModuleMember -Function Invoke-WebRequestWithRetries Export-ModuleMember -Function IsIpPoolRangeValid Export-ModuleMember -Function IsIpWithinPoolRange Export-ModuleMember -Function JSONDelete Export-ModuleMember -Function JSONGet Export-ModuleMember -Function JSONPost Export-ModuleMember -Function New-ACL Export-ModuleMember -Function New-LoadBalancerVIP Export-ModuleMember -Function New-NCAccessControlList Export-ModuleMember -Function New-NCAccessControlListRule Export-ModuleMember -Function New-NCBgpPeer Export-ModuleMember -Function New-NCBgpRouter Export-ModuleMember -Function New-NCBgpRoutingPolicy Export-ModuleMember -Function New-NCBgpRoutingPolicyMap Export-ModuleMember -Function New-NCCredential Export-ModuleMember -Function New-NCGateway Export-ModuleMember -Function New-NCGatewayPool Export-ModuleMember -Function New-NCGreTunnel Export-ModuleMember -Function New-NCIPPool Export-ModuleMember -Function New-NCIPSecTunnel Export-ModuleMember -Function New-NCL3Tunnel Export-ModuleMember -Function New-NCLoadBalancer Export-ModuleMember -Function New-NCLoadBalancerBackendAddressPool Export-ModuleMember -Function New-NCLoadBalancerFrontEndIPConfiguration Export-ModuleMember -Function New-NCLoadBalancerLoadBalancingRule Export-ModuleMember -Function New-NCLoadBalancerMux Export-ModuleMember -Function New-NCLoadBalancerMuxPeerRouterConfiguration Export-ModuleMember -Function New-NCLoadBalancerOutboundNatRule Export-ModuleMember -Function New-NCLoadBalancerProbe Export-ModuleMember -Function New-NCLoadBalancerProbeObject Export-ModuleMember -Function New-NCLogicalNetwork Export-ModuleMember -Function New-NCLogicalNetworkSubnet Export-ModuleMember -Function New-NCLogicalSubnet Export-ModuleMember -Function New-NCMACPool Export-ModuleMember -Function New-NCNetworkInterface Export-ModuleMember -Function New-NCPublicIPAddress Export-ModuleMember -Function New-NCServer Export-ModuleMember -Function New-NCServerConnection Export-ModuleMember -Function New-NCServerNetworkInterface Export-ModuleMember -Function New-NCSlbState Export-ModuleMember -Function New-NCSwitch Export-ModuleMember -Function New-NCSwitchPort Export-ModuleMember -Function New-NCVirtualGateway Export-ModuleMember -Function New-NCVirtualNetwork Export-ModuleMember -Function New-NCVirtualServer Export-ModuleMember -Function New-NCVirtualSubnet Export-ModuleMember -Function New-NCVpnClientAddressSpace Export-ModuleMember -Function Remove-LoadBalancerFromNetworkAdapter Export-ModuleMember -Function Remove-NCAccessControlList Export-ModuleMember -Function Remove-NCCredential Export-ModuleMember -Function Remove-NCGateway Export-ModuleMember -Function Remove-NCGatewayPool Export-ModuleMember -Function Remove-NCIPPool Export-ModuleMember -Function Remove-NCLoadBalancer Export-ModuleMember -Function Remove-NCLoadBalancerMux Export-ModuleMember -Function Remove-NCLogicalNetwork Export-ModuleMember -Function Remove-NCMACPool Export-ModuleMember -Function Remove-NCNetworkInterface Export-ModuleMember -Function Remove-NCPublicIPAddress Export-ModuleMember -Function Remove-NCServer Export-ModuleMember -Function Remove-NCSwitch Export-ModuleMember -Function Remove-NCVirtualGateway Export-ModuleMember -Function Remove-NCVirtualNetwork Export-ModuleMember -Function Remove-NCVirtualServer Export-ModuleMember -Function Remove-PortProfileId Export-ModuleMember -Function Set-NCConnection Export-ModuleMember -Function Set-NCLoadBalancerManager Export-ModuleMember -Function Set-PortProfileId Export-ModuleMember -Function Set-PortProfileIdHelper Export-ModuleMember -Function Update-NCCredential Export-ModuleMember -Function Update-NCServer Export-ModuleMember -Function Update-NCVirtualServer # SIG # Begin signature block # MIInvQYJKoZIhvcNAQcCoIInrjCCJ6oCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD9tIEwOl9hxfmC # JTxeneJ2Go4c6NrS4dEGgti7N4hhzKCCDXYwggX0MIID3KADAgECAhMzAAADTrU8 # esGEb+srAAAAAANOMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjMwMzE2MTg0MzI5WhcNMjQwMzE0MTg0MzI5WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDdCKiNI6IBFWuvJUmf6WdOJqZmIwYs5G7AJD5UbcL6tsC+EBPDbr36pFGo1bsU # p53nRyFYnncoMg8FK0d8jLlw0lgexDDr7gicf2zOBFWqfv/nSLwzJFNP5W03DF/1 # 1oZ12rSFqGlm+O46cRjTDFBpMRCZZGddZlRBjivby0eI1VgTD1TvAdfBYQe82fhm # WQkYR/lWmAK+vW/1+bO7jHaxXTNCxLIBW07F8PBjUcwFxxyfbe2mHB4h1L4U0Ofa # +HX/aREQ7SqYZz59sXM2ySOfvYyIjnqSO80NGBaz5DvzIG88J0+BNhOu2jl6Dfcq # jYQs1H/PMSQIK6E7lXDXSpXzAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUnMc7Zn/ukKBsBiWkwdNfsN5pdwAw # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzUwMDUxNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAD21v9pHoLdBSNlFAjmk # mx4XxOZAPsVxxXbDyQv1+kGDe9XpgBnT1lXnx7JDpFMKBwAyIwdInmvhK9pGBa31 # TyeL3p7R2s0L8SABPPRJHAEk4NHpBXxHjm4TKjezAbSqqbgsy10Y7KApy+9UrKa2 # kGmsuASsk95PVm5vem7OmTs42vm0BJUU+JPQLg8Y/sdj3TtSfLYYZAaJwTAIgi7d # hzn5hatLo7Dhz+4T+MrFd+6LUa2U3zr97QwzDthx+RP9/RZnur4inzSQsG5DCVIM # pA1l2NWEA3KAca0tI2l6hQNYsaKL1kefdfHCrPxEry8onJjyGGv9YKoLv6AOO7Oh # JEmbQlz/xksYG2N/JSOJ+QqYpGTEuYFYVWain7He6jgb41JbpOGKDdE/b+V2q/gX # UgFe2gdwTpCDsvh8SMRoq1/BNXcr7iTAU38Vgr83iVtPYmFhZOVM0ULp/kKTVoir # IpP2KCxT4OekOctt8grYnhJ16QMjmMv5o53hjNFXOxigkQWYzUO+6w50g0FAeFa8 # 5ugCCB6lXEk21FFB1FdIHpjSQf+LP/W2OV/HfhC3uTPgKbRtXo83TZYEudooyZ/A # Vu08sibZ3MkGOJORLERNwKm2G7oqdOv4Qj8Z0JrGgMzj46NFKAxkLSpE5oHQYP1H # tPx1lPfD7iNSbJsP6LiUHXH1MIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr # /Xmfwb1tbWrJUnMTDXpQzTGCGZ0wghmZAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAANOtTx6wYRv6ysAAAAAA04wDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEICC/C20pkCKg4GMhoPjASCXv # gumeDrarDWScvBpwMXACMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAzYs3E7wL3BUCnjMXLOL7jrrgcSfjgo6i2r8E71CFYHI8eBw3CIlvx91t # jcu1SFhvF9EVXu/7QFyquSdnPOUBinfdQpNK9PiUvmNYGRGHMBIia78GWko5KtLf # kVAgNMi62UiitpsQ+4jDBGn78RTC79jSY4Pf5lTTmbRWn73KOFlUXGbHlpeLNYdz # SJZV2IJzLzBsBujtY55yC+bwVfV95zEn0prunWb3h0CkdnGincaDn13YC5Jn2TjK # afOalXcib5cen5Xm4CTcroXAhSV7j/zswNJvuRv/7xCg3nnweFZBKeS+dI6lx437 # oWtvBP2ScLqXW2elCdmemyTy9+F3fKGCFycwghcjBgorBgEEAYI3AwMBMYIXEzCC # Fw8GCSqGSIb3DQEHAqCCFwAwghb8AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFXBgsq # hkiG9w0BCRABBKCCAUYEggFCMIIBPgIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCDgQdM4oPfDJ4ai9TpPbM23yDeRSj54aRPcZbqKL1/C2QIGZJMsHE91 # GBEyMDIzMDcxMzE5MjQ1NS4yWjAEgAIB9KCB2KSB1TCB0jELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxh # bmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjo4 # NkRGLTRCQkMtOTMzNTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy # dmljZaCCEXgwggcnMIIFD6ADAgECAhMzAAABtyEnGgeiKoZGAAEAAAG3MA0GCSqG # SIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIyMDky # MDIwMjIxNFoXDTIzMTIxNDIwMjIxNFowgdIxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh # dGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046ODZERi00QkJD # LTkzMzUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIi # MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDH/c9XUDQTZEwatxyXJcqY0HCS # JQwIKb7MOLxyXtOp+d9kShpHJ9Fe6euTngNcDqDvvDbKKZ4z6VWfPuLP0YXTAjDT # 0CV6FnZFjqf96biBLNX8zwYEya3Zs3clGM6wJaCAmMe9toJnaWzX9z9MuWdoETuP # LFiGMmHjSWHIfmXyc16qr7r6uxvDZvCDEIvGWsr8fuXUhgTOVWBwcQhI1xfRDekM # OwOtEml4yo6I0qVJqWjOBZlXnPfOTzXUofITnj9rS+/NUgWp/dg09fbXzR7/R9BQ # JhNhxkcIsx5Cf/5gGXUtLOm4v1MDzJLAImuW6ZyAwTqGmHVpFdJVRuazdPpbUc/c # 45Wh/boXRkyflojSjq+5kZ5c2EAOd37UkiQarBKU8wr+3Ou933b5bcd8uPD3q+r3 # OlEeXuJEmbB9eNSIcYZkUdkphGm7mCjk3Tu0P75bwH0MbhJyfdzS+C2FdSFsPDvs # TTuoJY6waQjnzjk0IFiRfjOvyD8rmK3L+/S7u5XOu0vlPTBLtnaINDLiSKGAjIrl # Wl0ufhZjiYsn4gmZtFSbCee9MvZP7REHumkEfTMQ1tadhdx1nm6JV4/bLu866xJT # ZRwBL6RYXIKDJ4spTU4k2cy8FI+0x/N4J7oMNRQhFVYeVPZcDTDy9SBrs/91PkU/ # cGQgSWCKxST3epPFLQIDAQABo4IBSTCCAUUwHQYDVR0OBBYEFLPyOT4MNCQFYQ3W # AdsjyCPJeLTsMB8GA1UdIwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1Ud # HwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3Js # L01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggr # BgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIw # MTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgw # DgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4ICAQANnWTMm4VcUl02ycxY # LzYjAlefwMp+VLsyVOPeWA7XHn6JXdHoUfUARgYR5gDLddFmAh89lkFMjN5kA+CL # B3xC9SRMIBvbRqu9bnJ/XZJywRw99Cb20EYSCnLxUp70QgqVaYpTPBf2GllwvVYm # 0nn/z1NhlgPtc7OuFRcSah3rsvCqq0MnxdtEgp3fM0WZeGGAXI4fRtBo4SR1DwGB # MdK/I0lo8otqNlgBw+gqaQbZMJ2Un+wOvAy+DsMAaZhQd/r7m44DcGiAkvn5Blb0 # Zz9mYJpX52gGrPDMe4oCanIqqtEOgJ/tKx49ZMYrDXSIk8xZbuRsNnoV6S65efZL # 7JjjVQCR4Z3acd5/9K++kx/t1jUvVE/Y28UJBPrdrYYn+jCuZKxTJ5ASAgkfw1XF # dasPbIOrDBKNMFkl5UGF73EFgOuXlc0pKLMpYSJSGWSy9xh2Q9S0LQI6dgORewty # MODbewu2gwn6RcaJt2bpUZxSaJZTx297p4/YQPcb0Yip1jADKUuDGQKIleDtvc1i # mXVM8oKe4A+FoyitdeSgidKLxHH/dgJ8DAFzJzbNaNCwrM4Prg5okGbOXke483Ss # 1Xxdc+23w2DTwCb5uaUkHW8t8CDrDf7LWIzPhJGj7VM6/DsjMKxvo6RTG7AeHHze # rbyHhra7ZJTCRbZxevAnGWeSADCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkA # AAAAABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRl # IEF1dGhvcml0eSAyMDEwMB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVow # fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl # ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd # TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX # 9gF/bErg4r25PhdgM/9cT8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1q # UoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8d # q6z2Nr41JmTamDu6GnszrYBbfowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byN # pOORj7I5LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2k # rnopN6zL64NF50ZuyjLVwIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4d # Pf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgS # Uei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8 # QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6Cm # gyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzF # ER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQID # AQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQU # KqdS/mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1 # GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0 # bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMA # QTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbL # j+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1p # Y3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0w # Ni0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIz # LmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwU # tj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN # 3Zi6th542DYunKmCVgADsAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU # 5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5 # KYnDvBewVIVCs/wMnosZiefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGy # qVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB6 # 2FD+CljdQDzHVG2dY3RILLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltE # AY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFp # AUR+fKFhbHP+CrvsQWY9af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcd # FYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRb # atGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQd # VTNYs6FwZvKhggLUMIICPQIBATCCAQChgdikgdUwgdIxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5k # IE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046ODZE # Ri00QkJDLTkzMzUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZp # Y2WiIwoBATAHBgUrDgMCGgMVAMhnQRjDmzg5bBgWZklF9qFoH6nGoIGDMIGApH4w # fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl # ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd # TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQACBQDo # WqmqMCIYDzIwMjMwNzE0MDA0OTQ2WhgPMjAyMzA3MTUwMDQ5NDZaMHQwOgYKKwYB # BAGEWQoEATEsMCowCgIFAOhaqaoCAQAwBwIBAAICAokwBwIBAAICE0AwCgIFAOhb # +yoCAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAweh # IKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQBeWeuXqCPurHpkV0StGes5 # wlSiM2ESGjXI5E0QUFmfGrk2ocpab5dGRYV8boYJaMCYd3QccmOlI8jL2qpVVU00 # ToX4bzq9+BkajWX1SzbtnHE9k61LH7zaQsoO2s85QKutrkdT2UqQxDovUJ9eoZkz # BzLQgpB0vUsW+knUUmI0mTGCBA0wggQJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0 # YW1wIFBDQSAyMDEwAhMzAAABtyEnGgeiKoZGAAEAAAG3MA0GCWCGSAFlAwQCAQUA # oIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIE # IHwgzsTdvJ+RGd+cuPKoxo05Hba5aAyvWhtWxjCqqDyVMIH6BgsqhkiG9w0BCRAC # LzGB6jCB5zCB5DCBvQQgbCd407Ie2i/ITXomBi+f/CAZ/M1H6+/0O65DPInNcEEw # gZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw # JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAbchJxoH # oiqGRgABAAABtzAiBCBGENmg1tUqIfsCSRoxKLFI5y79tIs8TRwVWeTyAvVBRzAN # BgkqhkiG9w0BAQsFAASCAgAlTFCDCXsphjd23awCO4D338AyzaTj6m1rU3C/2EGc # oPMqOGVsHAtukqV/UCqgq/vl3rtnH0hVCiyagwEAZfehCc1NcZOiZMctED8yeSZ7 # ZBK1S6UQ4g4zHP8rzjIJ4k7vfu3ymupTH5W7bbRwt+qgpk1mXenG+mejRGF/Yq6L # BrMYHH7/1zhq4Yb7j9iuTh5yzxfuUxpdfiscEhK1mukLNsBHGWicDSAtMt6FnzX4 # TNenr0YSyqDrrY2IfnjAMbMQfMUDdizrGdaOHtPhpl7rL3EI9CJ/ugJd5yIy3HFd # 6As34WfWL4HrWKx8pfqNPql+iQm4T8g6O9xptcWcAzsK2rCjkeJ31UH6Ob6FNbzd # eT5tFXgEjZYUGj5azCQzSmUKnDzrqxw9lfpVtqq9pBJIxPltQKpZCRttCKWecgB0 # aZKUVQk2qbw9Iud6PTprm374t/lJz6RVoVwPEeIYVOroMtJURUS4/7iaUuyx0fw7 # VEX0uTubqrTcvs5QL6I9zNhoiUsDmS1WUzpmLsFYxmvmDjlHUjdwxto0ghwGazbh # Mg713K10osk/dIc+d/G72yXH1mME3R3KijR8RY8vzXdokcOWQ6yhN+uWdh45hiTu # PYDkATqNwfyK2YbrIE0H6ky9GlHqATGpVFnUxOc+LdmAVxhtv1cX10vuX/apQBfv # 8A== # SIG # End signature block |