Microsoft.PowerApps.RestClientModule.psm1
$local:ErrorActionPreference = "Stop" #Import-Module "$(Split-Path $script:MyInvocation.MyCommand.Path)\Microsoft.PowerApps.AuthModule.psm1" # -Force function Get-AudienceForHostName { [CmdletBinding()] Param( [string] $Uri ) $hostMapping = @{ "management.azure.com" = "https://management.azure.com/"; "api.powerapps.com" = "https://service.powerapps.com/"; "tip1.api.powerapps.com" = "https://service.powerapps.com/"; "tip2.api.powerapps.com" = "https://service.powerapps.com/"; "graph.windows.net" = "https://graph.windows.net/"; "api.bap.microsoft.com" = "https://service.powerapps.com/"; "tip1.api.bap.microsoft.com" = "https://service.powerapps.com/"; "tip2.api.bap.microsoft.com" = "https://service.powerapps.com/"; "api.flow.microsoft.com" = "https://service.flow.microsoft.com/"; "tip1.api.flow.microsoft.com" = "https://service.flow.microsoft.com/"; "tip2.api.flow.microsoft.com" = "https://service.flow.microsoft.com/"; "gov.api.bap.microsoft.us" = "https://gov.service.powerapps.us/"; "high.api.bap.microsoft.us" = "https://high.service.powerapps.us/"; "gov.api.powerapps.us" = "https://gov.service.powerapps.us/"; "high.api.powerapps.us" = "https://high.service.powerapps.us/"; "gov.api.flow.microsoft.us" = "https://gov.service.flow.microsoft.us/"; "high.api.flow.microsoft.us" = "https://high.service.flow.microsoft.us/"; } $uriObject = New-Object System.Uri($Uri) $host = $uriObject.Host if ($hostMapping[$host] -ne $null) { return $hostMapping[$host]; } Write-Verbose "Unknown host $host. Using https://management.azure.com/ as a default"; return "https://management.azure.com/"; } function Invoke-Request( [CmdletBinding()] [Parameter(Mandatory=$True)] [string] $Uri, [Parameter(Mandatory=$True)] [string] $Method, [object] $Body = $null, [Hashtable] $Headers = @{}, [switch] $ParseContent, [switch] $ThrowOnFailure ) { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $audience = Get-AudienceForHostName -Uri $Uri $token = Get-JwtToken -Audience $audience $Headers["Authorization"] = "Bearer $token"; $Headers["User-Agent"] = "PowerShell cmdlets 1.0"; try { if ($Body -eq $null -or $Body -eq "") { $response = Invoke-WebRequest -Uri $Uri -Headers $Headers -Method $Method -UseBasicParsing } else { $jsonBody = ConvertTo-Json $Body -Depth 20 $response = Invoke-WebRequest -Uri $Uri -Headers $Headers -Method $Method -ContentType "application/json; charset=utf-8" -Body $jsonBody -UseBasicParsing } if ($ParseContent) { if ($response.Content) { return ConvertFrom-Json $response.Content; } } return $response } catch { $response = $_.Exception.Response if ($_.ErrorDetails) { $errorResponse = ConvertFrom-Json $_.ErrorDetails; $code = $response.StatusCode $message = $errorResponse.Error.Message Write-Verbose "Status Code: '$code'. Message: '$message'" } if ($ThrowOnFailure) { throw; } else { return $response } } } function InvokeApi { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string]$Method, [Parameter(Mandatory = $true)] [string]$Route, [Parameter(Mandatory = $false)] [object]$Body = $null, [Parameter(Mandatory = $false)] [switch]$ThrowOnFailure, [Parameter(Mandatory = $false)] [string]$ApiVersion = "2016-11-01" ) Test-PowerAppsAccount; $uri = $Route ` | ReplaceMacro -Macro "{apiVersion}" -Value $ApiVersion ` | ReplaceMacro -Macro "{flowEndpoint}" -Value $global:currentSession.flowEndpoint ` | ReplaceMacro -Macro "{powerAppsEndpoint}" -Value $global:currentSession.powerAppsEndpoint ` | ReplaceMacro -Macro "{bapEndpoint}" -Value $global:currentSession.bapEndpoint ` | ReplaceMacro -Macro "{graphEndpoint}" -Value $global:currentSession.graphEndpoint ` | ReplaceMacro -Macro "{cdsOneEndpoint}" -Value $global:currentSession.cdsOneEndpoint; Write-Verbose $uri If($ThrowOnFailure) { $result = Invoke-Request ` -Uri $uri ` -Method $Method ` -Body $body ` -ParseContent ` -ThrowOnFailure ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } else { $result = Invoke-Request ` -Uri $uri ` -Method $Method ` -Body $body ` -ParseContent ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } if($result.nextLink) { $nextLink = $result.nextLink $resultValue = $result.value while($nextLink) { If($ThrowOnFailure) { $nextResult = Invoke-Request ` -Uri $nextLinkuri ` -Method $Method ` -Body $body ` -ParseContent ` -ThrowOnFailure ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } else { $nextResult = Invoke-Request ` -Uri $nextLink ` -Method $Method ` -Body $body ` -ParseContent ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } $nextLink = $nextResult.nextLink $resultValue = $resultValue + $nextResult.value } return New-Object -TypeName PSObject ` | Add-Member -PassThru -MemberType NoteProperty -Name value -Value $resultValue ` } return $result; } function InvokeApiNoParseContent { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string]$Method, [Parameter(Mandatory = $true)] [string]$Route, [Parameter(Mandatory = $false)] [object]$Body = $null, [Parameter(Mandatory = $false)] [switch]$ThrowOnFailure, [Parameter(Mandatory = $false)] [string]$ApiVersion = "2016-11-01" ) Test-PowerAppsAccount; $uri = $Route ` | ReplaceMacro -Macro "{apiVersion}" -Value $ApiVersion ` | ReplaceMacro -Macro "{flowEndpoint}" -Value $global:currentSession.flowEndpoint ` | ReplaceMacro -Macro "{powerAppsEndpoint}" -Value $global:currentSession.powerAppsEndpoint ` | ReplaceMacro -Macro "{bapEndpoint}" -Value $global:currentSession.bapEndpoint ` | ReplaceMacro -Macro "{graphEndpoint}" -Value $global:currentSession.graphEndpoint ` | ReplaceMacro -Macro "{cdsOneEndpoint}" -Value $global:currentSession.cdsOneEndpoint; Write-Verbose $uri If($ThrowOnFailure) { $result = Invoke-Request ` -Uri $uri ` -Method $Method ` -Body $body ` -ThrowOnFailure ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } else { $result = Invoke-Request ` -Uri $uri ` -Method $Method ` -Body $body ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } if($result.nextLink) { $nextLink = $result.nextLink $resultValue = $result.value while($nextLink) { If($ThrowOnFailure) { $nextResult = Invoke-Request ` -Uri $nextLinkuri ` -Method $Method ` -Body $body ` -ThrowOnFailure ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } else { $nextResult = Invoke-Request ` -Uri $nextLink ` -Method $Method ` -Body $body ` -Verbose:($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent -eq $true); } $nextLink = $nextResult.nextLink $resultValue = $resultValue + $nextResult.value } return New-Object -TypeName PSObject ` | Add-Member -PassThru -MemberType NoteProperty -Name value -Value $resultValue ` } return $result; } function ReplaceMacro { param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [string]$Input, [Parameter(Mandatory = $true)] [string]$Macro, [Parameter(Mandatory = $false)] [string]$Value ) return $Input.Replace($Macro, $Value) } function BuildFilterPattern { param ( [Parameter(Mandatory = $false)] [object]$Filter ) if ($Filter -eq $null -or $Filter.Length -eq 0) { return New-Object System.Management.Automation.WildcardPattern "*" } else { return New-Object System.Management.Automation.WildcardPattern @($Filter,"IgnoreCase") } } function ResolveEnvironment { param ( [Parameter(Mandatory = $false)] [string]$OverrideId ) if (-not [string]::IsNullOrWhiteSpace($OverrideId)) { return $OverrideId; } elseif ($global:currentSession.selectedEnvironment) { return $global:currentSession.selectedEnvironment; } return "~default"; } function Select-CurrentEnvironment { <# .SYNOPSIS Sets the current environment for listing powerapps, flows, and other environment resources .DESCRIPTION The Select-CurrentEnvironment cmdlet sets the current environment in which commands will execute when an environment is not specified. Use Get-Help Select-CurrentEnvironment -Examples for more detail. .PARAMETER EnvironmentName Environment identifier (not display name). .PARAMETER Default Shortcut to specify the default tenant environment .EXAMPLE Select-CurrentEnvironment -EnvironmentName 3c2f7648-ad60-4871-91cb-b77d7ef3c239 Select environment 3c2f7648-ad60-4871-91cb-b77d7ef3c239 as the current environment. Cmdlets invoked after running this command will operate against this environment. .EXAMPLE Select-CurrentEnvironment ~default Select the default environment. Cmdlets invoked after running this will operate against the default environment. #> param ( [Parameter(Mandatory = $true, Position = 0, ValueFromPipelineByPropertyName=$true, ParameterSetName = "Name")] [String]$EnvironmentName, [Parameter(Mandatory = $true, ParameterSetName = "Default")] [Switch]$Default ) Test-PowerAppsAccount; if ($Default) { $global:currentSession.selectedEnvironment = "~default"; } else { $global:currentSession.selectedEnvironment = $EnvironmentName; } } # SIG # Begin signature block # MIIdhAYJKoZIhvcNAQcCoIIddTCCHXECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUVK2955f0kdJPhmQAxzvcFRPT # yqOgghhuMIIE3jCCA8agAwIBAgITMwAAAS0lAv18hhVcPgAAAAABLTANBgkqhkiG # 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw # HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTkwOTA2MjA0MDAz # WhcNMjAxMjA0MjA0MDAzWjCBzjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjEpMCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJp # Y28xJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjk4RkQtQzYxRS1FNjQxMSUwIwYD # VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0B # AQEFAAOCAQ8AMIIBCgKCAQEAvIC4iqAdkOWa2LJqxLkGu77VXiKMf8Oi/gHFiBIJ # 4zjVueQDV6V5fiA1/+9Vl2CCbM7eH/nVqMVmkkVutl91s8JHWnTyPFnbNzSPp213 # n1zxrnoT7hc1gpj23zkXqmB0DKoZ+CBiQqWHeq8StAml6XIs5y9eh5RQ2BZm7J1m # jRj+mdaDatdNliD31J56KAx20VE/ZwCuGzB3/DNokOJxVe5sc0uQ7MiEEK3JWTLq # E2r8/8CaiQyDSxD6KUJAhoW1ds+N12JdMRgLb4yKti5BaKRYS0PhPLmAYCc/TZvF # AzsvyKPCs+7h6X6TpEZ2XJBOv6/KB7FuowEedUce2SyzhQIDAQABo4IBCTCCAQUw # HQYDVR0OBBYEFGri7gxcpj7j3xgxwhe7lyOH8CzNMB8GA1UdIwQYMBaAFCM0+NlS # RnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwubWlj # cm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY3Jvc29mdFRpbWVTdGFtcFBD # QS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsGAQUFBzAChjxodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcnQw # EwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQEFBQADggEBACy8BtIIkXwd # IbjiUkASz1BKKxL7R4pE50CTxabhhrIdZaQ4O8KFc/8bM73GVlbfl2caW7b30Ml4 # deEBPXri/zpXJpRMCxUOLGOksTz5K3TZqZ7oqo86ED86Ji8hMHHiQrjmr8Lqknmn # TimOZsd6akl4o6q5LO+qImOEFWBgQ1EMlWZ/rKySU+fu6ycaxQbul6gACc+GPwyj # eV3Uv5/v5ozLbnqQeNbBKLwm/yAXdH+tNHqpOnx50KcA2j/Q2CnLdR5j1zX2srwK # gMomJ27RH0sIqSUefV+d8FQOo+irZ9wefoOIkxMZu4nOFw5CeA8ZccoFULarb0UU # OC8r6irYEukwggX/MIID56ADAgECAhMzAAABUZ6Nj0Bxow5BAAAAAAFRMA0GCSqG # SIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # KDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwHhcNMTkw # NTAyMjEzNzQ2WhcNMjAwNTAyMjEzNzQ2WjB0MQswCQYDVQQGEwJVUzETMBEGA1UE # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24w # ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVWsaGaUcdNB7xVcNmdfZi # VBhYFGcn8KMqxgNIvOZWNH9JYQLuhHhmJ5RWISy1oey3zTuxqLbkHAdmbeU8NFMo # 49Pv71MgIS9IG/EtqwOH7upan+lIq6NOcw5fO6Os+12R0Q28MzGn+3y7F2mKDnop # Vu0sEufy453gxz16M8bAw4+QXuv7+fR9WzRJ2CpU62wQKYiFQMfew6Vh5fuPoXlo # N3k6+Qlz7zgcT4YRmxzx7jMVpP/uvK6sZcBxQ3WgB/WkyXHgxaY19IAzLq2QiPiX # 2YryiR5EsYBq35BP7U15DlZtpSs2wIYTkkDBxhPJIDJgowZu5GyhHdqrst3OjkSR # AgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEEAYI3TAgBBggrBgEFBQcDAzAd # BgNVHQ4EFgQUV4Iarkq57esagu6FUBb270Zijc8wUAYDVR0RBEkwR6RFMEMxKTAn # BgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMRYwFAYDVQQF # Ew0yMzAwMTIrNDU0MTM1MB8GA1UdIwQYMBaAFEhuZOVQBdOCqhc3NyK1bajKdQKV # MFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv # cHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcmwwYQYIKwYBBQUH # AQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp # b3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcnQwDAYDVR0T # AQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAWg+ArS4Anq7KrogslIQnoMHSXUPr # /RqOIhJX+32ObuY3MFvdlRElbSsSJxrRy/OCCZdSse+f2AqQ+F/2aYwBDmUQbeMB # 8n0pYLZnOPifqe78RBH2fVZsvXxyfizbHubWWoUfNW/FJlZlLXwJmF3BoL8E2p09 # K3hagwz/otcKtQ1+Q4+DaOYXWleqJrJUsnHs9UiLcrVF0leL/Q1V5bshob2OTlZq # 0qzSdrMDLWdhyrUOxnZ+ojZ7UdTY4VnCuogbZ9Zs9syJbg7ZUS9SVgYkowRsWv5j # V4lbqTD+tG4FzhOwcRQwdb6A8zp2Nnd+s7VdCuYFsGgI41ucD8oxVfcAMjF9YX5N # 2s4mltkqnUe3/htVrnxKKDAwSYliaux2L7gKw+bD1kEZ/5ozLRnJ3jjDkomTrPct # okY/KaZ1qub0NUnmOKH+3xUK/plWJK8BOQYuU7gKYH7Yy9WSKNlP7pKj6i417+3N # a/frInjnBkKRCJ/eYTvBH+s5guezpfQWtU4bNo/j8Qw2vpTQ9w7flhH78Rmwd319 # +YTmhv7TcxDbWlyteaj4RK2wk3pY1oSz2JPE5PNuNmd9Gmf6oePZgy7Ii9JLLq8S # nULV7b+IP0UXRY9q+GdRjM2AEX6msZvvPCIoG0aYHQu9wZsKEK2jqvWi8/xdeeeS # I9FN6K1w4oVQM4MwggYHMIID76ADAgECAgphFmg0AAAAAAAcMA0GCSqGSIb3DQEB # BQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJkiaJk/IsZAEZFgltaWNy # b3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv # cml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMxMzAzMDlaMHcxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAfBgNVBAMTGE1pY3Jvc29mdCBU # aW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ+h # bLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn0UytdDAgEesH1VSVFUmUG0KS # rphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0Zxws/HvniB3q506jocEjU8qN # +kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4nrIZPVVIM5AMs+2qQkDBuh/NZ # MJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YRJylmqJfk0waBSqL5hKcRRxQJ # gp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54QTF3zJvfO4OToWECtR0Nsfz3 # m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8GA1UdEwEB/wQFMAMBAf8wHQYD # VR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsGA1UdDwQEAwIBhjAQBgkrBgEE # AYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJgQFYnl+UlE/wq4QpTlVnkpKFj # pGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jv # c29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9y # aXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9j # cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL21pY3Jvc29mdHJvb3Rj # ZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0Um9vdENlcnQuY3J0MBMG # A1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEBBQUAA4ICAQAQl4rDXANENt3p # tK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1iuFcCy04gE1CZ3XpA4le7r1ia # HOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+rkuTnjWrVgMHmlPIGL4UD6ZEq # JCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGctxVEO6mJcPxaYiyA/4gcaMvnM # MUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/FNSteo7/rvH0LQnvUU3Ih7jDK # u3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbonXCUbKw5TNT2eb+qGHpiKe+i # myk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0NbhOxXEjEiZ2CzxSjHFaRkMU # vLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPpK+m79EjMLNTYMoBMJipIJF9a # 6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2JoXZhtG6hE6a/qkfwEm/9ijJs # sv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0eFQF1EEuUKyUsKV4q7OglnUa # 2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng9wFlb4kLfchpyOZu6qeXzjEp # /w7FW1zYTRuh2Povnj8uVRZryROj/TCCB3owggVioAMCAQICCmEOkNIAAAAAAAMw # DQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv # cml0eSAyMDExMB4XDTExMDcwODIwNTkwOVoXDTI2MDcwODIxMDkwOVowfjELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP # ADCCAgoCggIBAKvw+nIQHC6t2G6qghBNNLrytlghn0IbKmvpWlCquAY4GgRJun/D # DB7dN2vGEtgL8DjCmQawyDnVARQxQtOJDXlkh36UYCRsr55JnOloXtLfm1OyCizD # r9mpK656Ca/XllnKYBoF6WZ26DJSJhIv56sIUM+zRLdd2MQuA3WraPPLbfM6XKEW # 9Ea64DhkrG5kNXimoGMPLdNAk/jj3gcN1Vx5pUkp5w2+oBN3vpQ97/vjK1oQH01W # KKJ6cuASOrdJXtjt7UORg9l7snuGG9k+sYxd6IlPhBryoS9Z5JA7La4zWMW3Pv4y # 07MDPbGyr5I4ftKdgCz1TlaRITUlwzluZH9TupwPrRkjhMv0ugOGjfdf8NBSv4yU # h7zAIXQlXxgotswnKDglmDlKNs98sZKuHCOnqWbsYR9q4ShJnV+I4iVd0yFLPlLE # tVc/JAPw0XpbL9Uj43BdD1FGd7P4AOG8rAKCX9vAFbO9G9RVS+c5oQ/pI0m8GLhE # fEXkwcNyeuBy5yTfv0aZxe/CHFfbg43sTUkwp6uO3+xbn6/83bBm4sGXgXvt1u1L # 50kppxMopqd9Z4DmimJ4X7IvhNdXnFy/dygo8e1twyiPLI9AN0/B4YVEicQJTMXU # pUMvdJX3bvh4IFgsE11glZo+TzOE2rCIF96eTvSWsLxGoGyY0uDWiIwLAgMBAAGj # ggHtMIIB6TAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUSG5k5VAF04KqFzc3 # IrVtqMp1ApUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGG # MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h6qfHMdEj # iTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br # aS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNybDBe # BggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDCB # nwYDVR0gBIGXMIGUMIGRBgkrBgEEAYI3LgMwgYMwPwYIKwYBBQUHAgEWM2h0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvZG9jcy9wcmltYXJ5Y3BzLmh0bTBA # BggrBgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBwAG8AbABpAGMAeQBfAHMAdABh # AHQAZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEAZ/KGpZjgVHkaLtPY # dGcimwuWEeFjkplCln3SeQyQwWVfLiw++MNy0W2D/r4/6ArKO79HqaPzadtjvyI1 # pZddZYSQfYtGUFXYDJJ80hpLHPM8QotS0LD9a+M+By4pm+Y9G6XUtR13lDni6WTJ # RD14eiPzE32mkHSDjfTLJgJGKsKKELukqQUMm+1o+mgulaAqPyprWEljHwlpblqY # luSD9MCP80Yr3vw70L01724lruWvJ+3Q3fMOr5kol5hNDj0L8giJ1h/DMhji8MUt # zluetEk5CsYKwsatruWy2dsViFFFWDgycScaf7H0J/jeLDogaZiyWYlobm+nt3TD # QAUGpgEqKD6CPxNNZgvAs0314Y9/HG8VfUWnduVAKmWjw11SYobDHWM2l4bf2vP4 # 8hahmifhzaWX0O5dY0HjWwechz4GdwbRBrF1HxS+YWG18NzGGwS+30HHDiju3mUv # 7Jf2oVyW2ADWoUa9WfOXpQlLSBCZgB/QACnFsZulP0V3HjXG0qKin3p6IvpIlR+r # +0cjgPWe+L9rt0uX4ut1eBrs6jeZeRhL/9azI2h15q/6/IvrC4DqaTuv/DDtBEyO # 3991bWORPdGdVk5Pv4BXIqF4ETIheu9BCrE/+6jMpF3BoYibV3FWTkhFwELJm3Zb # CoBIa/15n8G9bW1qyVJzEw16UM0xggSAMIIEfAIBATCBlTB+MQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29k # ZSBTaWduaW5nIFBDQSAyMDExAhMzAAABUZ6Nj0Bxow5BAAAAAAFRMAkGBSsOAwIa # BQCggZQwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFJsT1GU+zzcvIr89IJuZltEb # 9+tSMDQGCisGAQQBgjcCAQwxJjAkoBKAEABUAGUAcwB0AFMAaQBnAG6hDoAMaHR0 # cDovL3Rlc3QgMA0GCSqGSIb3DQEBAQUABIIBACkc3mDgMX7tWITabqNY+ydzXYDs # dkSe8TqqqFglcDibdotGlxc/BxK1UWmolbhDF+ZT/lkiyPmrNjHrdCDE6ntkAhFC # Pb3ej9Ai308cgdUZV61pp3lg16BmNjwllcD2zQVUqItNzJmsLk7AnRvqpkJH4tce # klbe6iCWhwzkOo5kAd1hvat+1XqDUenidBbUcQ0Bf3zd8YrUEB+HE8H4nKQtTRJ4 # nX26mTbVlSSOyUdoy+z26rIzDb6Xj9qu8qtjEdH7S5+WVqh4IaHTehFSSStk/t6d # yQ7v0Mc6EP1dlnb2tw8U4VGROc6NpBaaJDgTzsaea/fzeUzjEzq9P4pbLy6hggIo # MIICJAYJKoZIhvcNAQkGMYICFTCCAhECAQEwgY4wdzELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUtU3Rh # bXAgUENBAhMzAAABLSUC/XyGFVw+AAAAAAEtMAkGBSsOAwIaBQCgXTAYBgkqhkiG # 9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xOTEwMTcxNzUzNTVa # MCMGCSqGSIb3DQEJBDEWBBR7xsjoU2etsuMAKTV/RSrDt6idFTANBgkqhkiG9w0B # AQUFAASCAQBYpshlvshtStCSJmeqCodJlj6GDC4YbxXApV6YCkVv2zkfRpGR/yAh # GPZbF6KcFq9Wb9d0sdUgXvv5UV8h+4IzUx/qWLFt9cldOmzNc+V2ACCoKQLUBCD0 # vnyVYt9jj1LmEiuiIiUosuYvMRdXxYORd1tOEVIxirsSxXhk6aJ8oX1n0h/yQw0l # z5FAOlOEcSpBWK75zJbJdrPBaS9Fx0XOZE3l8h69AX/lQ6l33xZr0t63LbxKr16S # IQo0o8GXzbZSTNe0o62VnJFbVNuQ7qyXDe9DYpoHoDSBzfGV+Z5S0Jr2j+k6tl7L # uowLUvQjIS7AbNy/1l6Qy3x2fkW1baG1 # SIG # End signature block |