AzureAD.psm1
$AzureMajorVersion = "1" $AzureRMModules = @( "AzureRM.ApiManagement", "AzureRM.Automation", "AzureRM.Backup", "AzureRM.Batch", "AzureRM.Compute", "AzureRM.DataFactories", "AzureRM.DataLakeAnalytics", "AzureRM.DataLakeStore", "AzureRM.Dns", "AzureRM.HDInsight", "AzureRM.Insights", "AzureRM.KeyVault", "AzureRM.Network", "AzureRM.OperationalInsights", "AzureRM.RedisCache", "AzureRM.Resources", "AzureRM.SiteRecovery", "AzureRM.Sql", "AzureRM.Storage", "AzureRM.StreamAnalytics", "AzureRM.Tags", "AzureRM.TrafficManager", "AzureRM.UsageAggregates", "AzureRM.Websites" ) function Test-AdminRights([string]$Scope) { if ($Scope -ne "CurrentUser") { $user = [Security.Principal.WindowsIdentity]::GetCurrent(); $isAdmin = (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) if($isAdmin -eq $false) { throw "Administrator rights are required to install or uninstall Microsoft Azure modules" } } } function CheckIncompatibleVersion([bool]$Force) { $message = "An incompatible version of Azure Resource Manager PowerShell cmdlets is installed. Please uninstall Microsoft Azure PowerShell using the 'Control Panel' before installing these cmdlets. To install these cmdlets regardless of compatibility issues, execute 'Install-AzureRM -Force'." $path = ${env:ProgramFiles(x86)} if ($path -eq $null) { $path = ${env:ProgramFiles} } if ( Test-Path "$path\Microsoft SDKs\Azure\PowerShell\ResourceManager\AzureResourceManager\AzureResourceManager.psd1") { if ($Force) { Write-Warning $message } else { throw $message } } } function Install-ModuleWithVersionCheck([string]$Name,[string]$MajorVersion,[string]$Repository,[string]$Scope) { $_MinVer = "$MajorVersion.0.0.0" $_MaxVer = "$MajorVersion.9999.9999.9999" $script:InstallCounter ++ try { $_ExistingModule = Get-Module -ListAvailable -Name $Name $_ModuleAction = "installed" if ($_ExistingModule -ne $null) { Install-Module -Name $Name -Repository $Repository -Scope $Scope -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -Force -ErrorAction Stop $_ModuleAction = "updated" } else { Install-Module -Name $Name -Repository $Repository -Scope $Scope -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -ErrorAction Stop } $v = (Get-InstalledModule -Name $Name -ErrorAction Ignore)[0].Version.ToString() Write-Output "$Name $v $_ModuleAction [$script:InstallCounter/$($AzureRMModules.Count + 2)]..." } catch { Write-Warning "Skipping $Name package..." Write-Warning $_ } } <# .Synopsis Install Azure Resource Manager cmdlet modules .Description Installs all the available Azure Resource Manager cmdlet modules that have a matching major version. .Parameter MajorVersion Specifies the major version. .Parameter Repository Limit the search for "AzureRM" cmdlets in a specific repository. .Parameter Scope Specifies the parameter scope. #> function Update-AzureRM { param( [Parameter(Position=0, Mandatory = $false)] [string] $MajorVersion = $AzureMajorVersion, [Parameter(Position=1, Mandatory = $false)] [string] $Repository = "PSGallery", [Parameter(Position=2, Mandatory = $false)] [ValidateSet("CurrentUser","AllUsers")] [string] $Scope = "AllUsers", [switch] $Force = $false) Test-AdminRights $Scope CheckIncompatibleVersion($Force.IsPresent) Write-Output "Installing AzureRM modules." $_InstallationPolicy = (Get-PSRepository -Name $Repository).InstallationPolicy $script:InstallCounter = 0 try { Set-PSRepository -Name $Repository -InstallationPolicy Trusted Install-ModuleWithVersionCheck "AzureRM.Profile" $MajorVersion $Repository $Scope Install-ModuleWithVersionCheck "Azure.Storage" $MajorVersion $Repository $Scope # Start new job $AzureRMModules | ForEach { Install-ModuleWithVersionCheck $_ $MajorVersion $Repository $Scope } } finally { # Clean up Set-PSRepository -Name $Repository -InstallationPolicy $_InstallationPolicy } } <# .Synopsis Import Azure Resource Manager cmdlet modules .Description Imports all the Azure Resource Manager cmdlet modules that have a matching major version. .Parameter MajorVersion Specifies the major version. #> function Import-AzureRM { param( [Parameter(Position=0, Mandatory = $false)] [string] $MajorVersion = $AzureMajorVersion) Write-Output "Importing AzureRM modules." $_MinVer = "$MajorVersion.0.0.0" $_MaxVer = "$MajorVersion.9999.9999.9999" $AzureRMModules | ForEach { $moduleName = $_ $_MatchedModule = Get-InstalledModule -Name $moduleName -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -ErrorAction Ignore | where {$_.Name -eq $moduleName} if ($_MatchedModule -ne $null) { try { Import-Module -Name $_MatchedModule.Name -RequiredVersion $_MatchedModule.Version -ErrorAction Stop Write-Output "$moduleName imported..." } catch { Write-Warning "Skipping $Name module..." Write-Warning $_ } } } } function Uninstall-ModuleWithVersionCheck([string]$Name,[string]$MajorVersion) { $_MinVer = "$MajorVersion.0.0.0" $_MaxVer = "$MajorVersion.9999.9999.9999" # This is a workaround for a bug in PowerShellGet that uses "start with" matching for module name $_MatchedModule = Get-InstalledModule -Name $Name -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -ErrorAction Ignore | where {$_.Name -eq $Name} if ($_MatchedModule -ne $null) { try { Remove-Module -Name $Name -Force -ErrorAction Ignore Uninstall-Module -Name $Name -MinimumVersion $_MinVer -MaximumVersion $_MaxVer -Confirm:$false -ErrorAction Stop if ((Get-Module -Name $Name -ListAvailable) -eq $null) { Write-Output "$Name uninstalled..." } else { Write-Output "$Name partially uninstalled..." } } catch { Write-Warning "Skipping $Name package..." Write-Warning $_ } } } <# .Synopsis Remove Azure Resource Manager cmdlet modules .Description Removes all installed Azure Resource Manager cmdlet modules that have a matching major version. .Parameter MajorVersion Specifies the major version. #> function Uninstall-AzureRM { param( [Parameter(Position=0, Mandatory = $false)] [string] $MajorVersion = $AzureMajorVersion) Test-AdminRights "AllUsers" Write-Output "Uninstalling AzureRM modules." $AzureRMModules | ForEach { $moduleName = $_ Uninstall-ModuleWithVersionCheck $_ $MajorVersion } Uninstall-ModuleWithVersionCheck "Azure.Storage" $MajorVersion Uninstall-ModuleWithVersionCheck "AzureRM.Profile" $MajorVersion } New-Alias -Name Install-AzureRM -Value Update-AzureRM Export-ModuleMember -function * -Alias * # SIG # Begin signature block # MIIkBwYJKoZIhvcNAQcCoIIj+DCCI/QCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCBFeDIzihKuWTz # dY+ooBtlQaurdm1U1EgLXqcBPfBHnKCCDY4wggYMMIID9KADAgECAhMzAAAAeAZm # rCoRZAg+AAAAAAB4MA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMTYwNTA5MjIwNjQ0WhcNMTcwODA5MjIwNjQ0WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDjjEkx/uc8hldkxl009SWe3pOrRROfVpkFxW96tHdc3MpiCk+NrfaezAF+GIJQ # E/HRXqeWBPmHGHhQjPe4fHaSknPvZATMmour8PedpzOYh5kpJGo/g5N7wTrhTevA # 0qFQ8Ztsl6yPHeEfBWp8oK7vfmb2Xg0ebfLeiUVEottoYnz0DJOqbAlL3meYZyye # MrTCFQ2TVQjEITRhhlVjNjsw0uuKigYKCe/v6XD6/3n4JgvqxwWeVZzJjql4L1wE # HV0JUxsez6GMXdxWI0/7cZl9bUQu6b84mya0u+1WZdXWXFfkxR4fspadu7/o+Pvy # D3U+3rq6ypE+0EhEnxM5k0wfAgMBAAGjggGLMIIBhzArBgNVHSUEJDAiBggrBgEF # BQcDAwYKKwYBBAGCN0wIAQYKKwYBBAGCN0wTATAdBgNVHQ4EFgQUx94Wiq/BhJ9h # vcrn+CW7rfB9pjcwUQYDVR0RBEowSKRGMEQxDTALBgNVBAsTBE1PUFIxMzAxBgNV # BAUTKjU0ODE2K2ZiMjIwNGUzLTg0MjEtNDhkNi1hNjQ3LTllMGQ0ODJmNzdlYzAf # BgNVHSMEGDAWgBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BF # hkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQ # Q0EyMDExXzIwMTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcw # AoZFaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RT # aWdQQ0EyMDExXzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcN # AQELBQADggIBAKR7S0vtJ2GiJWqGxiajASpekSUj4YN6Bqd/zGvzEFJkonVR3IAh # kPYH52WL8kl/JVdgg3bxPgz/NO9Nvs1jhFslTk7ZYG1BFoOz2yU98NV9uG3eD3JR # t0tV2wl6dT9MpirfsNfnubh+EAYi1XySy+Nz7QazyUKjSljfx1tAgMmFC5qNe5VO # PGyN2Eqp/swW2VuXGLHQoXNf1L9n9oM3xHDEh+aKgp6KvahKoXa9XGOM9GlSfSLS # 0rZVLsOMDKu1dp9s1mYpWlj4h57L7M0OSwO5hMWYm5dAxQRUthjUazBvNv3iO1SQ # haw/lAUo+zFrjVneUdYBj7PTJGyD5JV/wUdjeGEvsKorhNf2ykEg8Ivf6KnsSGAz # aMojeBi/cpLQBZU0/42Jyn8xoQ2y+NPOqOsP0CcdelQXTWa46sy5qKhVAAeENyrd # FlFwD3feiJiMPNPAGPQC15ovlUnWqIK1MxREitP4ubfghF/zdIloP9zEFTeQsKcV # XAWinUsAjw5+HnElGhF+3kj9034qdSdxT524WvzWV5mj4wmRDMy+4tYakdz/32L/ # quBnYlpNf+4uldWIxETJjtly3Wnx8wcA+rQjLTvVIrOdXv4pzMc9emKzmHFBX7dm # v8l5pbZDENZHPKBG0g/DKy8p/Rp0Hlc6I/mKZq2dG2gJ85mmVX7f1LPmMIIHejCC # BWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMC # VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV # BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJv # b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcN # MjYwNzA4MjEwOTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIIC # IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2 # WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSH # fpRgJGyvnkmc6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQ # z7NEt13YxC4Ddato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHml # SSnnDb6gE3e+lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3o # iU+EGvKhL1nkkDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6 # nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6ep # ZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf # 28AVs70b1FVL5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCn # q47f7Fufr/zdsGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx # 7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O # 9JawvEagbJjS4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0G # A1UdDgQWBBRIbmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMA # dQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAW # gBRyLToCMZBDuRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8v # Y3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQy # MDExXzIwMTFfMDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZC # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQy # MDExXzIwMTFfMDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCB # gzA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9k # b2NzL3ByaW1hcnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABf # AHAAbwBsAGkAYwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEB # CwUAA4ICAQBn8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LR # bYP+vj/oCso7v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r # 4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb # 7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6v # mSiXmE0OPQvyCInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/ # sfQn+N4sOiBpmLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad2 # 5UAqZaPDXVJihsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUf # FL5hYbXw3MYbBL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWx # m6U/RXceNcbSoqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMj # aHXmr/r8i+sLgOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7 # qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCFc8wghXL # AgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAm # BgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAB4Bmas # KhFkCD4AAAAAAHgwDQYJYIZIAWUDBAIBBQCggbowGQYJKoZIhvcNAQkDMQwGCisG # AQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcN # AQkEMSIEIK8gGO7PLqUmbtfQn6GUOT/1Todgh2Slpd41VZ/f4ic5ME4GCisGAQQB # gjcCAQwxQDA+oBqAGABBAHoAdQByAGUAQQBEAC4AcABzAG0AMaEggB5odHRwOi8v # d3d3Lk1pY3Jvc29mdE9ubGluZS5jb20wDQYJKoZIhvcNAQEBBQAEggEARMx0YS10 # xx/AYS4qYMQcJmDCv3Xd+/SbInZt1FP5F5jcusI2ahw9vT6EdrkWa7togCAgbDb+ # yf3FxDr66rRwxu/mzg3fFBqO+qK2BBWrbvJ30n/PnpuFNsDNuz1d7urrwK8eZaBY # xre22Gaai7a/hF7DDgeU/FfwXzE38oCKysbv7zqIE4tVeuKrGf9hlTevIjDVeEPD # EM+w8jDEuslSrWbVDNo7HJmlOPd4X/RAD9j9BR8jsR2NkuMW4gMgZtXc0w1bLt5X # B5iMjx9R2fYsoXiMjTkyMPRkeSTANgIeiuARp1LcFoseozESLPZOvekcAMk3k7wg # gf221W20x+pAWaGCE00wghNJBgorBgEEAYI3AwMBMYITOTCCEzUGCSqGSIb3DQEH # AqCCEyYwghMiAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggE9BgsqhkiG9w0BCRABBKCC # ASwEggEoMIIBJAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCDMZnzO # huIFC009xmCJDvaKzkom6OX2SGbe2pU4Sp2+UwIGVz4X33s4GBMyMDE2MDYwMjIy # MDIzOC4yNDNaMAcCAQGAAgH0oIG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UE # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVy # IERTRSBFU046N0QyRS0zNzgyLUIwRjcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1l # LVN0YW1wIFNlcnZpY2Wggg7QMIIGcTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg # VGltZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC # ggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5m # K1vwFVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcm # gqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5 # hoC732H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/Vm # wAOWRH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQB # wSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQD # AgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIE # DB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNV # HSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVo # dHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29D # ZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAC # hj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1 # dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMw # gYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9j # cy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8A # UABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQEL # BQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJ # at/15/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1 # mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgPF/UveYFl2am1a+THzvbKegBv # SzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/ # amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqW # hqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua # 2A5HmoDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46Pio # SKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqH # czsI5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw # 07t0MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P # 6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkSMIIE2jCCA8Kg # AwIBAgITMwAAAJsh15YBk1eLpAAAAAAAmzANBgkqhkiG9w0BAQsFADB8MQswCQYD # VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv # ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0xNjA0MjcxNzA2MjBaFw0xNzA3Mjcx # NzA2MjBaMIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0w # CwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBFU046N0QyRS0zNzgy # LUIwRjcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEi # MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC27664ibg6nlWOKRaz8buYpeuY # SDwW6Fvu1JFRkI56i/o9ssqzHrq6+bXzp2g8ciuPbi/4SiXnw3uxlde2+gviCcZR # PApflwD3xpVyxDUvvawcgya4gsPFQ7Dr2HtwtsPf3f6y4HE3Q44bg0Y0jxAW5Pd1 # bUJvJc2EjtRl6KB6rp2MDABHyr1khLWOjOzw3iKmn5PXQu8GPjjBkiAjjRejmpkj # Fs93TvTlwpkEIgw3L60ucF3okYjN2soPwkQXyIiRSNPQ5ASewhFgnS1iKwPWnGDI # DXNAZESBWImbAd3UHEJB+nI5hjSb6viBEb83UinBRyOWOt0M9QW7aDEX1Sg/AgMB # AAGjggEbMIIBFzAdBgNVHQ4EFgQU1v9QCRB8wjREZ656a22pdbhif6kwHwYDVR0j # BBgwFoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0 # cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3Rh # UENBXzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+ # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0Ff # MjAxMC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcD # CDANBgkqhkiG9w0BAQsFAAOCAQEApGszlkqdxpoX9EWf80MEsAA7HEm15YYw2FmC # 5jIpUje+XhO5K4+1Pluv3AuIv1KQb21uPZ50/Dx5SfKT/G991+ztzeE1Aib0dYqd # lPLupTYmqTInVWThCEwTBvowXFeZjLIgbIuFkBsTioC0/cXaDf6xumm13+ocIR3F # ISNyX4JJCT2DZWpD8okcImlj+DNpdhZ0ekSs7X9bb/HffF/EmsWqfrbXQT5bLCGH # HAU6bFDkPX9ks7Uq3bIEfoLWSS+WbrGXb3aymBjjR/aYQlR9g9gzBWIHz831Qw0c # i1Vy9w/0WQYcAROvA5NosgTJuUoWtr9C2WR5ZhYMFrOyolM6jaGCA3kwggJhAgEB # MIHjoYG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBFU046N0QyRS0z # NzgyLUIwRjcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wi # JQoBATAJBgUrDgMCGgUAAxUANdTiX7yMkGnOyfaboQijWNe1f+yggcIwgb+kgbww # gbkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsT # BE1PUFIxJzAlBgNVBAsTHm5DaXBoZXIgTlRTIEVTTjo1N0Y2LUMxRTAtNTU0QzEr # MCkGA1UEAxMiTWljcm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkq # hkiG9w0BAQUFAAIFANr65CEwIhgPMjAxNjA2MDIxNjU4MDlaGA8yMDE2MDYwMzE2 # NTgwOVowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA2vrkIQIBADAKAgEAAgIHPQIB # /zAHAgEAAgIb+zAKAgUA2vw1oQIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEE # AYRZCgMBoAowCAIBAAIDFuNgoQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IB # AQACBzmEpuN1JedVi1NyIsMCSEdacMJp7eTrS165R01d2cFuCWkCcDFNfX7yAcSz # Ryd+WOnP2u6So7GEeDfICZHZayqD0seSAVKBkC+W48167AFoboLUXrrU5aTLBzAn # OLYzdwFXBFnNVHoM0WZrWkvzV8jIGynO7vqvpEpwJPnrrLC+dLe1GFM7ngRPtG6z # CoFVWplIW1tUabVSNhmhO1IxBerF/CcSf1DnQGwzDomAS9VJqbEQTe6arEC1fkZA # k2ANooDVaud9h5i2C7figg6LDyDiIHdyEKFhNHeRfeDNNtpEL2yryRDHYICEfuyr # h6VAEUA3oqo7skh50E/bmLAzMYIC9TCCAvECAQEwgZMwfDELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt # U3RhbXAgUENBIDIwMTACEzMAAACbIdeWAZNXi6QAAAAAAJswDQYJYIZIAWUDBAIB # BQCgggEyMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQx # IgQgDxwdxvf6aRsCaEAa0SBP9FwlSQSjqDZh7P3akK+j0cowgeIGCyqGSIb3DQEJ # EAIMMYHSMIHPMIHMMIGxBBQ11OJfvIyQac7J9puhCKNY17V/7DCBmDCBgKR+MHwx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAAmyHXlgGTV4ukAAAAAACb # MBYEFHhXsJpyyfCijCDZw667q1i1UqwdMA0GCSqGSIb3DQEBCwUABIIBAHxPIOiM # 9x/UQBgwuf+Jth0mvyy+LNPZmBtFsM3Vsuqgv3IQeKt5q82pA+3gZOX9Q/sV3bG8 # a+D5roAtU7Cdgv2JBEe75BZVRHOoH7dHBApAzufydjSC3q2BvYvthimj0g0PFxDt # DLyjFNnJ1IjNSlXd/kt5ocviMSg5sOz8COp0/vPbUxd4YxtIjz9po7qrFZvkiikS # TIA/FS8uYA02A3jEj5yyAvY5smKuob2D2K2hPRzxOzy6dwyL0YRAUgOv9//9UFzI # AkEsNOtVKFzt2effk6iOxztvZZc0j2fAV8fhICtBi4zlW6H676yvuTSQWBbB6z4k # Zby5DGJiWpJUems= # SIG # End signature block |