Set-ManagedByTenantForAadds.ps1

<#PSScriptInfo
 
.VERSION 2.0.0
 
.GUID ab5fb1d9-e8dd-42c9-9a58-552e06e97bdb
 
.AUTHOR aaddsfb@microsoft.com
 
.COMPANYNAME Microsoft Corporation
 
.COPYRIGHT (c) Microsoft Corporation
 
.TAGS Azure-AD-Domain-Services
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    02/18/2023 - Initial release
    03/31/2023 - Allow an admin group name to be specified
    01/09/2024 - Migrate from AzureAD PowerShell to MS Graph PowerShell, rebrand to Microsoft Entra Domain Services
    02/09/2026 - Explicitly requires MS Graph PowerShell
 
#>


<#
 
.SYNOPSIS
    Uses AzureLighthouse to set up the subscription to be managed by the tenant in order
    to temporarily resolve tenant-subscription mismatch scenario.
 
.DESCRIPTION
    Uses AzureLighthouse to set up the subscription to be managed by the tenant in order
    to temporarily resolve tenant-subscription mismatch scenario.
 
.PARAMETER managedByTenantId [MANDATORY]
    The tenant id of the AADDS instance.
 
.PARAMETER subscriptionId [MANADATORY]
    The subscription id of the AADDS instance.
 
.PARAMETER adminGroupName [MANADATORY]
    The admin group name in the tenant corresponding to the tenant id of the AADDS instance
    to be granted the permission to manage the subscription.
 
.NOTES
    * This cmdlet requires you install the Microsoft Graph PowerShell SDK: https://review.learn.microsoft.com/en-us/powershell/microsoftgraph/installation?view=graph-powershell-1.0&branch=main
 
#>


[CmdletBinding()]
Param (
    [Parameter(Mandatory=$true)]
    [string] $managedByTenantId,

    [Parameter(Mandatory=$true)]
    [string] $subscriptionId,

    [Parameter(Mandatory=$true)]
    [string] $adminGroupName
)

$VerbosePreference = 'Continue'

# Constants
$armServiceAppId = "443155a6-77f3-45e3-882b-22b3a8d431fb"
$armOpsAppId = "abba844e-bc0e-44b0-947a-dc74e5d09022"
$managedServices = "Microsoft.ManagedServices"
$contributorRoleName = "Contributor"
$contributorRoleId = "b24988ac-6180-42a0-ab88-20f7382dd24c"

$subscriptionScope = "/subscriptions/$subscriptionId"

Write-Verbose "Log on to the Entra ID tenant specified by the AADDS resource's tenant id '$managedByTenantId'"
Connect-MgGraph -Scopes "Application.ReadWrite.All","Group.ReadWrite.All" -TenantId $managedByTenantId
$context = Get-MgContext

$principalIds = @()
$principalNames = @()

# Obtain admin user's object id
$logonUser = Get-MgUser -Filter "userPrincipalName eq '$($context.Account)'" -ErrorAction Ignore
if ($null -eq $logonUser)
{
    Write-Error "Cannot retrieve the id of the logon user in the tenant '$managedByTenantId'."
    return
}
$principalIds += $logonUser.Id
$principalNames += "user $($context.Account.Id)"

# Find the admin aad group's object id
$adminGroup = Get-MgGroup -Filter "displayName eq '$adminGroupName'" -ErrorAction Ignore
if ($null -eq $adminGroup)
{
    Write-Error "Cannot retrieve the object id of the admin group '$adminGroupName' in the tenant '$managedByTenantId'."
    return
}
$principalIds += $adminGroup.Id
$principalNames += "group $adminGroupName"

# Obtain a couple of DCaaS service principals
$appIds = @($armServiceAppId, $armOpsAppId)
foreach ($appId in $appIds)
{
    $app = Get-MgServicePrincipal -Filter "AppId eq '$appId'" -ErrorAction Ignore
    if ($null -eq $app)
    {
        Write-Error "Service principal for AppId '$appId' not found."
        Write-Error "Please create it using this command: New-MgServicePrincipal -AppId '$appId'"
        return
    }
    $principalIds += $app.Id
    $principalNames += "application $appId"
}

Write-Verbose "Log on to the subscription '$subscriptionId' which contains the AADDS resource"
Connect-AzAccount | Out-Null
Set-AzContext -SubscriptionId $subscriptionId -ErrorAction Stop | Out-Null

$managedServicesRps = Get-AzResourceProvider -ProviderNamespace $managedServices
$registered = $null -ne $managedServicesRps -and ($managedServicesRps | Where-Object { $_.RegistrationState -ne 'Registered'}).Count -eq 0
if ($registered -eq $false)
{
    Write-Verbose "Registering $managedServices ..."
    Register-AzResourceProvider -ProviderNamespace $managedServices -ErrorAction Stop
    Write-Verbose "Registered $managedServices."
}

for ($i = 0; $i -lt $principalIds.Count; $i++)
{
    $principalId = $principalIds[$i]
    $principalName = $principalNames[$i]

    Write-Verbose "Checking ManagedServicesAssignment for $principalName ..."

    $assignment = Get-AzManagedServicesAssignment -Name $principalId -ErrorAction Ignore
    if ($null -eq $assignment)
    {
        $definition = Get-AzManagedServicesDefinition -Name $principalId -ErrorAction Ignore
        if ($null -eq $definition)
        {
            Write-Verbose "Creating ManagedServicesDefinition for $principalName ..."

            $auth = New-AzManagedServicesAuthorizationObject -PrincipalId $principalId -RoleDefinitionId $contributorRoleId
            $definition = New-AzManagedServicesDefinition `
                -Name $principalId `
                -RegistrationDefinitionName "$principalId as $contributorRoleName" `
                -ManagedByTenantId $managedByTenantId `
                -Authorization $auth `
                -Scope $subscriptionScope `
                -Description "$principalName ($principalId) as $contributorRoleName" `
                -ErrorAction Stop
            Write-Verbose "Created ManagedServicesDefinition for $principalName : $($definition.Id)."
        }

        Write-Verbose "Creating ManagedServicesAssignment for $principalName ..."
        $assignment = New-AzManagedServicesAssignment -Name $principalId -RegistrationDefinitionId $definition.Id -ErrorAction Stop
        Write-Verbose "Created ManagedServicesAssignment for $principalName : $($assignment.Id)."
    }
    else
    {
        Write-Verbose "Found ManagedServicesAssignment for $principalName."
    }
}
# SIG # Begin signature block
# MIIsGQYJKoZIhvcNAQcCoIIsCjCCLAYCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCfLCJKn+Xk9RhM
# IfXGYeQWa6bQ97e3jYG6T41CYGxfDqCCEYcwggiXMIIHf6ADAgECAhM2AAACLAms
# 2/+Ttl/fAAIAAAIsMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH
# QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe
# Fw0yNTEwMjQxODQzMjFaFw0yNjA0MjcxODUzMjFaMC8xLTArBgNVBAMTJE1pY3Jv
# c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBAMObgVZFDaw79JUDvqoXb/YbII6PQ2YcTxkZWLDO4Rku
# ikvCOn62N3ndwKMSTpi5tOjYJU3oHxO9eTs2RLelVxoECaqvrQHg/Fm+AYNnvBXI
# GouozKfvMUvTvu+NfwHUH1KNiEzjrh+ft7+9VByF1+EJOLdoq+0ZtRIBcGKfqjuD
# WKRidxWS9Y7N1rfGHYp9V/3KJNEocB2kJNdlnaF+zoV1MWq8usibztlciVhkzEG5
# p6uunWgBMGB9F4FXrE8jvKQdVvyWNAtuU0yjTMdRRA8NN4+lilsxhgrK4LSybiYC
# TPIVpg8bg2nZ6jihKSIXRF6JvYae/+IJytOzOL/mysUCAwEAAaOCBZgwggWUMCkG
# CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sDATAKBggrBgEFBQcDAzA8BgkrBgEE
# AYI3FQcELzAtBiUrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWDigi2HkK4D
# AgFkAgEQMIICdgYIKwYBBQUHAQEEggJoMIICZDBiBggrBgEFBQcwAoZWaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NlcnRzL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0
# dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUy
# MENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwyLmFt
# ZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAw
# MSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwzLmFtZS5nYmwvYWlhL0JZ
# MlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYI
# KwYBBQUHMAKGRmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwga0GCCsGAQUFBzAChoGg
# bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QUlBLENOPVB1YmxpYyUy
# MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9
# QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlm
# aWNhdGlvbkF1dGhvcml0eTAdBgNVHQ4EFgQUfdQYmnrMmvU1nIYbtDIfOLPsk+Mw
# DgYDVR0PAQH/BAQDAgeAMFQGA1UdEQRNMEukSTBHMS0wKwYDVQQLEyRNaWNyb3Nv
# ZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxFjAUBgNVBAUTDTIzNjE2OSs1
# MDYwNTcwggHmBgNVHR8EggHdMIIB2TCCAdWgggHRoIIBzYY/aHR0cDovL2NybC5t
# aWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBDUyUyMENBJTIwMDEoMiku
# Y3JshjFodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEo
# MikuY3JshjFodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIw
# MDEoMikuY3JshjFodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENB
# JTIwMDEoMikuY3JshjFodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBDUyUy
# MENBJTIwMDEoMikuY3JshoG9bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEo
# MiksQ049QlkyUEtJQ1NDQTAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2
# aWNlcyxDTj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPUFNRSxEQz1HQkw/
# Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERp
# c3RyaWJ1dGlvblBvaW50MB8GA1UdIwQYMBaAFJZRhOBrb3v+2Aarw/KF5imuavnU
# MB8GA1UdJQQYMBYGCisGAQQBgjdbAwEGCCsGAQUFBwMDMA0GCSqGSIb3DQEBCwUA
# A4IBAQBu2lzPUqwSdKnHGn+oZNbiBF0USXFYzjO7JcY1GFxzXCh8NGjWcrTv8xB3
# mLd/0mhXsi7HK4kFXdmvNt88WCA2hQh0rMoonCw2LAz3W9ju0qRduF6Bsr3MnEqQ
# Pkx7RJUQVeaGkpiK4jnP/8i/iGSyEl4ZqbQt0zxBlDDchczakArYd1G0Nnuffcii
# 6xQ+hcOnUGL3AOzEVi7fGxQlVFNip09Q8t1ukqyOk9xKOqXVARdkbq2KR/IIYoOv
# atxc4ywHgHCnXOvNPAaRl+k2UkWwZTrfznemVXwU0c5FyLLFZ/EwFMJPwMEZl/Hr
# 4FyPacAyktf/XcNNQjGD/so1rs0dMIII6DCCBtCgAwIBAgITHwAAAFHqj/accwyo
# OwAAAAAAUTANBgkqhkiG9w0BAQsFADA8MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMw
# EQYKCZImiZPyLGQBGRYDQU1FMRAwDgYDVQQDEwdhbWVyb290MB4XDTIxMDUyMTE4
# NDQxNFoXDTI2MDUyMTE4NTQxNFowQTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEG
# CgmSJomT8ixkARkWA0FNRTEVMBMGA1UEAxMMQU1FIENTIENBIDAxMIIBIjANBgkq
# hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyZpSCX0Bno1W1yqXMhT6BUlJZWpa4p3x
# FeiTHO4vm2Q6C/azR5xwxnyYHrkSGDtS2P9X+KDE64V20mmEQkubxnPNeOVnE2Rv
# dPGxgwlq+BhS3ONdVsQPj79q7XgHM9HhzB9+qk0PC9KN1zm9p/seyiRS6JF1dbOq
# Rf1pUl7FAVxmgiCFgV8hHIb/rDPXig7FDi3S0yEx2CUDVpIq8jEhG8anUFE1WYxM
# +ni0S5KHwwKPKV4qyGDoDO+9AmDoma3Chyu5WDlW5cdtqXTWsGPE3umtnX6Amlld
# UFLms4OVR4guKf+n5LIBCC6bTiocfXPomqYjYTKx7AGMfaVLaaXmhQIDAQABo4IE
# 3DCCBNgwEgYJKwYBBAGCNxUBBAUCAwIAAjAjBgkrBgEEAYI3FQIEFgQUEmgkQiFH
# y9RrvjHPIKTACyN/P0cwHQYDVR0OBBYEFJZRhOBrb3v+2Aarw/KF5imuavnUMIIB
# BAYDVR0lBIH8MIH5BgcrBgEFAgMFBggrBgEFBQcDAQYIKwYBBQUHAwIGCisGAQQB
# gjcUAgEGCSsGAQQBgjcVBgYKKwYBBAGCNwoDDAYJKwYBBAGCNxUGBggrBgEFBQcD
# CQYIKwYBBQUIAgIGCisGAQQBgjdAAQEGCysGAQQBgjcKAwQBBgorBgEEAYI3CgME
# BgkrBgEEAYI3FQUGCisGAQQBgjcUAgIGCisGAQQBgjcUAgMGCCsGAQUFBwMDBgor
# BgEEAYI3WwEBBgorBgEEAYI3WwIBBgorBgEEAYI3WwMBBgorBgEEAYI3WwUBBgor
# BgEEAYI3WwQBBgorBgEEAYI3WwQCMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBB
# MAsGA1UdDwQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFCle
# UV5krjS566ycDaeMdQHRCQsoMIIBaAYDVR0fBIIBXzCCAVswggFXoIIBU6CCAU+G
# MWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lpbmZyYS9jcmwvYW1lcm9vdC5j
# cmyGI2h0dHA6Ly9jcmwyLmFtZS5nYmwvY3JsL2FtZXJvb3QuY3JshiNodHRwOi8v
# Y3JsMy5hbWUuZ2JsL2NybC9hbWVyb290LmNybIYjaHR0cDovL2NybDEuYW1lLmdi
# bC9jcmwvYW1lcm9vdC5jcmyGgapsZGFwOi8vL0NOPWFtZXJvb3QsQ049QU1FUm9v
# dCxDTj1DRFAsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMs
# Q049Q29uZmlndXJhdGlvbixEQz1BTUUsREM9R0JMP2NlcnRpZmljYXRlUmV2b2Nh
# dGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludDCC
# AasGCCsGAQUFBwEBBIIBnTCCAZkwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcmwubWlj
# cm9zb2Z0LmNvbS9wa2lpbmZyYS9jZXJ0cy9BTUVSb290X2FtZXJvb3QuY3J0MDcG
# CCsGAQUFBzAChitodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9BTUVSb290X2FtZXJv
# b3QuY3J0MDcGCCsGAQUFBzAChitodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9BTUVS
# b290X2FtZXJvb3QuY3J0MDcGCCsGAQUFBzAChitodHRwOi8vY3JsMS5hbWUuZ2Js
# L2FpYS9BTUVSb290X2FtZXJvb3QuY3J0MIGiBggrBgEFBQcwAoaBlWxkYXA6Ly8v
# Q049YW1lcm9vdCxDTj1BSUEsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049
# U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1BTUUsREM9R0JMP2NBQ2VydGlm
# aWNhdGU/YmFzZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0G
# CSqGSIb3DQEBCwUAA4ICAQBQECO3Tw/o317Rrd7yadqcswPx1LvIYymkaTN6Kcmu
# Rt6HKa0Xe73Ux2/AQ30TfgA9GBJngweRykKBusRzyOU17iIubJvy3gA21dwtqtB0
# DsoEv1U/ptVu2v++doTCJ/i+GbssVXkgaX8H+6EOGEmT4evp4GbwR4HwWlc+Dvf8
# HH8PdUA2Z04CvcwIfckSipbNm84jxJ8XjmTFTWscldL9edj2NsY6iGnyJFIyur2P
# S7VRYyV3p1VAJp91gj1jRQtWEyCB8P5g9nE3z8u0ANaU/hjwEQCrdGyravWgnf2J
# tG+bT26YAokbc8m+32zUtXRO+NK3tAjhOu2FdsG3qNrF4sc7y37R/C+7Pcb/cFfh
# ttqsirepZii4xStcjMODYuXzGm3IJs0b0owHG6oKd7ZOGvHpmmh9K8/DLriD/sq8
# bURD10qi/wuW8zM7IpLg1vcR9dIK2mc0pj44pc6UX0XbttP/VEJgu3lT2eI9VjWt
# aKjx38xE9woSMyekPRtzTwgfuysF9DkJisr+yA4po/FPxpbBw9c/hBf32DH/GFxt
# eS2pmjgKIbMP8sDukmEq3lVvuWNJsybrZwQvQpvaM49fv+JKpLK5YWYEfwksYRR9
# wU8Hh/ID9hRCEkbUoQ2W7mMpsp2Nbp/kcn4ivfolUy3Q9Yf0scsQ6WTLYpm+AoCU
# JTGCGegwghnkAgEBMFgwQTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT
# 8ixkARkWA0FNRTEVMBMGA1UEAxMMQU1FIENTIENBIDAxAhM2AAACLAms2/+Ttl/f
# AAIAAAIsMA0GCWCGSAFlAwQCAQUAoIGuMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3
# AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEi
# BCCtTxtIawNpMdG06ge1wmaW0GpewlZSzZW/Cmy0SCZzZzBCBgorBgEEAYI3AgEM
# MTQwMqAUgBIATQBpAGMAcgBvAHMAbwBmAHShGoAYaHR0cDovL3d3dy5taWNyb3Nv
# ZnQuY29tMA0GCSqGSIb3DQEBAQUABIIBAH5rYLkYherC0pQh5LqHNTGlc+MajRnn
# 1cpIla/2cyFsu/hmDVZc3xfni0mzqcQeBAzlRI43+sp3ILlYXMX+vLdOFuLV1+JG
# kU9r2Pewh3hkUlV5LJdCKbS86+q+KL6NMqolWmWar+wW6b/YgvMvONUBfytL3RbX
# 76mSMTboGBzGzZoGE5k5w3fy75e1vSFcVtmtzBtmMjFt110IWI8egpt3MyH131Xh
# E4/TlESM6AoLxuSp22F5SdO5+E6hvRqdhh6zltzQnjmgmbuSB4bP3YE55FflwEI2
# +YXLkg7ENi63g33HIShqFVWifOUmu/czgMRxX4jRSGAQVwzxfxMnWUyhghewMIIX
# rAYKKwYBBAGCNwMDATGCF5wwgheYBgkqhkiG9w0BBwKggheJMIIXhQIBAzEPMA0G
# CWCGSAFlAwQCAQUAMIIBWgYLKoZIhvcNAQkQAQSgggFJBIIBRTCCAUECAQEGCisG
# AQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQgFDaV6m4LBijZhBsL+yih7RT/rpkf
# eNqY2zPawsNhQ5ICBmlztT1UhxgTMjAyNjAyMTAwNTU1NTkuNzk1WjAEgAIB9KCB
# 2aSB1jCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsG
# A1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYD
# VQQLEx5uU2hpZWxkIFRTUyBFU046NDAxQS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1p
# Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WgghH+MIIHKDCCBRCgAwIBAgITMwAA
# AhlesthUdfSxjQABAAACGTANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzET
# MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T
# dGFtcCBQQ0EgMjAxMDAeFw0yNTA4MTQxODQ4MjZaFw0yNjExMTMxODQ4MjZaMIHT
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRN
# aWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5T
# aGllbGQgVFNTIEVTTjo0MDFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0
# IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAKahSMlJMyMsaS90NN1pi7suBvWCFEnM54Sq/nBzk/v7uz2q8SPeoMcW9Vq1
# rgMQfKoxi37GyJsfFd6LitZ1HH/kf57J12rOf4k4Ff05d0E0Rk9A3rlwTW6R6nPs
# AtTYk8gO+oC54q70gRKAc5a6TUBRJ7sHWzywi6U0tylkgruSdNm/kRVkf5HBc1cZ
# 4aBN4CGnlEbaxihgWRiiwV76oIJAxDbSpL7b0U99sS7wLy/0aUXruc9fGaIwrO9m
# UqGu+A8vGG2lrA5tzmTqSUWcWbDygh2esTaoBSn9MTR49Lfb9EN1vts+YAFWmrCS
# Qr0edkpdFydgDn95dC0nrV4FAOYA+SENUbxLJU5jZ0qLk6xiA9w9Z42O5gbtKboi
# HTytoyv9Vnnn9vmEeHEKVkJHgWZl4nYfQLlnZcMSkC9eSyeitncPMv7fzwYZi8re
# kAH9AnqVkXYGZzMrVQFLlh8JWUVfSS2O2l/A+eXi/fnDi6V92xjTpjduFKSFvKrW
# Wql2nrBbyDlttyTS4WmkFbzm69XruxhP+TJ+N3vvw27XWJf2yz9iENcWBCXUm3FJ
# AxX1typWRIfpwSg7WkZzUZG4CIMSGynU9/DikMGf2gOLkrIgIOpxD4lgRxrsrSKO
# cFO+TOVXY4RKqkx312LvASYuhk871k/vXpHzF3s6gpJLMWhvAgMBAAGjggFJMIIB
# RTAdBgNVHQ4EFgQUgGjqOR1mrTc6mZ9SBdX3A+p69yEwHwYDVR0jBBgwFoAUn6cV
# XQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5t
# aWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUy
# MFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQ
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQl
# MjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADAW
# BgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcN
# AQELBQADggIBAF8c1WSy1wRX6Aggk4mOzB13W+3IryUk36x2CQuTpNjTe+Tac0zE
# /Vdk3CEI30NwBVG4dTQQGLTFLsMQug+HHhFxuZVwJ275AvWI3i1Q0ciJl2GJn7e8
# /kKZfbdwv/GtLYqpzs/FHvPw2C7TE4L1jJ7KizYyCw2iJjn5xyN+kywoxhXvEWC1
# xnQlHTi5XwHTBnj8UkwN0wADnPhkG5j1o64Li1m8b55dzVY0b6wWVZMRTKFWR9H+
# 6hsAzkoY6Z7+Z2J0OPLny9Lgc+dkWzxnV+Bb/flBjqwaa5nB85iLrRbSXnNmOJLo
# zbUytsARoFrHBDlYRYmlXY3vFSyezFTShOU5rLhjN40y69Z7keQBRrN1CpD+4N3E
# A+HByu13S4k5u3utOkCflqnkLAA2BPXb1PcCFGyPQ5eFHCBKxcPhR2lkk65HyeEr
# y5oSp5eZIYaSdbBd8+ntQcXqVJYlx6s0S4h1ooViFhEhfCBxJRdzzsWz+FSahwYm
# L2lzFdEskYMKA+s13XW1J1/VkeiS9gZagI4x8SDcHpbKf1YcQFk4c7jAOfC8bxP1
# QM43xReFpu2tWQC5iVcN6C/7P7saNTqeLXE/oX2fbjdYbQtSTeA7kahXy7bY7qAJ
# lEKGzuc1BUc7wp/ApP4Yjvm80debKpI5cSzMjI6ZHP3n+ElFIpA+OvL1MIIHcTCC
# BVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG9w0BAQsFADCBiDEL
# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWlj
# cm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMw
# MTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg
# MjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOThpkzntHIhC3mi
# y9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az/1xPx2b3lVNxWuJ+
# Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V29YZQ3MFEyHFcUTE3
# oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oaezOtgFt+jBAcnVL+
# tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkNyjYtcI4xyDUoveO0
# hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7KMtXAhjBcTyziYrLN
# ueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZ
# nkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n
# 6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoYWmEBc8pnol7XKHYC
# 4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiER9vc
# G9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8FdsaN8cIFRg/eKtF
# tvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEE
# BQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1Kc8Q/y8E7jAdBgNV
# HQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3
# TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkG
# CSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8E
# BTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRP
# ME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1
# Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEww
# SgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv
# TWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCd
# VX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQ
# dTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJWAAOwBb6J6Gngugnu
# e99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G82jfZfakVqr3lbYo
# VSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/AyeixmJ5/ALaoHCgRlC
# GVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZ
# lvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1jdEgssU5HLcEUBHG/
# ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZKCS6OEuabvshVGtq
# RRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+
# y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuPNtq6TPmb/wrpNPgk
# NWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvpe784cETRkPHIqzqK
# Oghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCA1kwggJBAgEBMIIBAaGB
# 2aSB1jCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsG
# A1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYD
# VQQLEx5uU2hpZWxkIFRTUyBFU046NDAxQS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1p
# Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVADF2Kf1q
# qncm9Hp4oKy38ZdCJwM+oIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
# IDIwMTAwDQYJKoZIhvcNAQELBQACBQDtNUTcMCIYDzIwMjYwMjEwMDU0NzA4WhgP
# MjAyNjAyMTEwNTQ3MDhaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAO01RNwCAQAw
# CgIBAAICE1UCAf8wBwIBAAICE5owCgIFAO02llwCAQAwNgYKKwYBBAGEWQoEAjEo
# MCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG
# 9w0BAQsFAAOCAQEAUnQ5Ck0yw26Z10KHmH+j3a6oA7YmWFhMPEoiXBl6uYqn1+qs
# bhYizAlX9Wxl5LVnmZw4KqnmkOcN7+WD5j7O1YTnhzqgw3nSnu6gFebHA7z3d68H
# zd4ZoGp8uE2mJKbL3OGrAVbzy3uevG9tL5GR5IU0XEyOfbB9m64eLI0wKlsur10S
# B9SCi48+1xJIsQ1Srk5zf3YAtuhDePcLveCKiyWvxwpmov153kYoequT4+TP4W9G
# 9J3VRdkIZiZmY1l3kl8fC74mT31GRAk32m199zYAzTcZojqn0r3o3F54zkJiMDVD
# Z2l99A0eC1IWE+Jsp9rD3QEwgDL8Ny1GaofF0TGCBA0wggQJAgEBMIGTMHwxCzAJ
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jv
# c29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAACGV6y2FR19LGNAAEAAAIZMA0G
# CWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJ
# KoZIhvcNAQkEMSIEIA/RUNOXW9w6aO/KY9Vatfcw4XxsdZF1fXyybVRdcho6MIH6
# BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQg3JF+t9xNctRBd9ldfM0HK7II8yPf
# ty3u5pb5Njnm7YYwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAx
# MAITMwAAAhlesthUdfSxjQABAAACGTAiBCDxYMo0B09hZ8EdgX6z4Re0rPJe9BKb
# DSCbfTFJPkUwEDANBgkqhkiG9w0BAQsFAASCAgAOK7xHN0RgGLZSCih4WxPoxolp
# uf9BCOIj3DinZ2ZBtYHQViyCajKdCB2KmzV6v2HGPdL7e5szJ9temBL4scd2PFSC
# okF8yYPheVrBThhq+y7Xhw/q/+UmTaY3jX0pIGyIWglfTnc8US+/QXxrJ+lz8LHJ
# QoXCJm6uv1kKk57E9m5RYStJf6Z+y6W8eH6/hTFuOxSq6zO1dE1sPZODO2xaADZx
# DqjZD60nL3x67n2ntV6n5vqqf4UomIbe8t7wYn2rQgkpd90i5u0X3xNoDyuHGZsl
# qbSEMxKpAJM3YNJqtk3HhAyfCLkKU/z8DRTYnh11y28xFTAnzLTH999AmZlO0JrV
# h9NVyNzd2bD9gcRNp8QKGHFUQ2zmF+5Fdg3l11UEtyqJn+RUBZxuw/3bCBqJtWdF
# mG/XZ4oIl148YpIn4o2aWOoU8TEaUcKWugMZysmoZnuVA31m6AiaE1qUxy28mb6I
# xWoBe9nKZNTcJhtys3y2n7+d47clRQdYuJ8a44c+kppepanGhFLW0Ajj7L2hneiA
# /z3uUv57i03OthvbyZVs9liBpRWR0FwRzuss1eKDbAZh8A587QV+G7sjZgNMw8Ju
# XUdn7w9FkEppmWvt1ULBjfXHUAeD1uL5senJLN8SsyHlCo/ysPEgG4tbmTaWxMRH
# oZoCYMZMf55sBiEJ2Q==
# SIG # End signature block