Get-AADAssessRoleAssignmentReport.ps1
<# .SYNOPSIS Gets a report of all role assignments .DESCRIPTION This function returns a list of role assignments .EXAMPLE PS C:\> Get-AADAssessRoleAssignmentReport | Export-Csv -Path ".\RoleAssignmentReport.csv" #> function Get-AADAssessRoleAssignmentReport { [CmdletBinding()] param ( # Role Assignment Data [Parameter(Mandatory = $false)] [psobject] $RoleAssignmentSchedulesData, # Role Eligible Data [Parameter(Mandatory = $false)] [psobject] $RoleEligibilitySchedulesData, # Organization Data [Parameter(Mandatory = $false)] [psobject] $OrganizationData, # Administrative Unit Data [Parameter(Mandatory = $false)] [psobject] $AdministrativeUnitsData, # User Data [Parameter(Mandatory = $false)] [psobject] $UsersData, # Group Data [Parameter(Mandatory = $false)] [psobject] $GroupsData, # Application Data [Parameter(Mandatory = $false)] [psobject] $ApplicationsData, # Service Principal Data [Parameter(Mandatory = $false)] [psobject] $ServicePrincipalsData, # Generate Report Offline, only using the data passed in parameters [Parameter(Mandatory = $false)] [switch] $Offline ) Start-AppInsightsRequest $MyInvocation.MyCommand.Name try { if ($Offline -and (!$PSBoundParameters['roleAssignmentSchedulesData'] -or !$PSBoundParameters['roleEligibilitySchedulesData'])) { Write-Error -Exception (New-Object System.Management.Automation.ItemNotFoundException -ArgumentList 'Use of the offline parameter requires that all data be provided using the data parameters.') -ErrorId 'DataParametersRequired' -Category ObjectNotFound return } function Process-RoleAssignment { param ( # [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] [psobject] $InputObject, # [Parameter(Mandatory = $true)] [psobject] $LookupCache, # [Parameter(Mandatory = $false)] [switch] $UseLookupCacheOnly ) process { $RoleSchedules = $InputObject foreach ($RoleSchedule in $RoleSchedules) { if ($RoleSchedule.directoryScopeId -match '/(?:(.+)s/)?([0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12})') { $ObjectId = $Matches[2] $directoryScopeType = $Matches[1] if ($directoryScopeType) { $directoryScope = Get-AadObjectById $ObjectId -Type $directoryScopeType -LookupCache $LookupCache -UseLookupCacheOnly:$UseLookupCacheOnly } else { $directoryScope = Get-AadObjectById $ObjectId -Type servicePrincipal -LookupCache $LookupCache -UseLookupCacheOnly:$UseLookupCacheOnly if ($directoryScope) { $directoryScopeType = 'servicePrincipal' } else { $directoryScope = Get-AadObjectById $ObjectId -Type application -LookupCache $LookupCache -UseLookupCacheOnly:$UseLookupCacheOnly if ($directoryScope) { $directoryScopeType = 'application' } } } } else { $directoryScopeType = "tenant" $directoryScope = @{ id = $OrganizationData.id displayName = $OrganizationData.displayName } } $principalType = $RoleSchedule.principal.'@odata.type' -replace '#microsoft.graph.', '' $principal = Get-AadObjectById $RoleSchedule.principal.id -Type $principalType -LookupCache $LookupCache -UseLookupCacheOnly:$UseLookupCacheOnly -Properties 'id,displayName' $OutputObject = [PSCustomObject]@{ id = $RoleSchedule.id directoryScopeId = $RoleSchedule.directoryScopeId directoryScopeObjectId = if ($directoryScope) { $directoryScope.id } else { $null } directoryScopeDisplayName = if ($directoryScope) { $directoryScope.displayName } else { $null } directoryScopeType = $directoryScopeType roleDefinitionId = $RoleSchedule.roleDefinition.id roleDefinitionTemplateId = $RoleSchedule.roleDefinition.templateId roleDefinitionDisplayName = $RoleSchedule.roleDefinition.displayName principalId = $RoleSchedule.principal.id principalDisplayName = if ($principal) { $principal.displayName } else { $null } principalType = $principalType memberType = $RoleSchedule.memberType status = $RoleSchedule.status assignmentType = if ($RoleSchedule.psobject.Properties.Name.Contains('assignmentType')) { $RoleSchedule.assignmentType } else { 'Eligible' } startDateTime = $RoleSchedule.scheduleInfo.startDateTime endDateTime = $RoleSchedule.scheduleInfo.expiration.endDateTime } $OutputObject if ($principalType -eq 'group') { $OutputObject.memberType = 'Group' if ($UseLookupCacheOnly) { Expand-GroupTransitiveMembership $RoleSchedule.principal.id -LookupCache $LookupCache ` | ForEach-Object { $principalType = $_.'@odata.type' -replace '#microsoft.graph.', '' $principal = Get-AadObjectById $_.id -Type $principalType -LookupCache $LookupCache -UseLookupCacheOnly:$UseLookupCacheOnly $OutputObject.principalId = $_.id $OutputObject.principalDisplayName = if ($principal) { $principal.displayName } else { $null } $OutputObject.principalType = $principalType $OutputObject } } else { Get-MsGraphResults 'groups/{0}/transitiveMembers' -UniqueId $RoleSchedule.principal.id -Select id, displayName -Top 999 -DisableUniqueIdDeduplication ` | ForEach-Object { $OutputObject.principalId = $_.id $OutputObject.principalDisplayName = $_.displayName $OutputObject.principalType = $_.'@odata.type' -replace '#microsoft.graph.', '' $OutputObject } } } } } } if (!$OrganizationData) { $OrganizationData = Get-MsGraphResults 'organization?$select=id,displayName' } $LookupCache = New-LookupCache if ($AdministrativeUnitsData) { if ($AdministrativeUnitsData -is [System.Collections.Generic.Dictionary[guid, pscustomobject]]) { $LookupCache.administrativeUnit = $AdministrativeUnitsData } else { $AdministrativeUnitsData | Add-AadObjectToLookupCache -Type administrativeUnit -LookupCache $LookupCache } } if ($UsersData) { if ($UsersData -is [System.Collections.Generic.Dictionary[guid, pscustomobject]]) { $LookupCache.user = $UsersData } else { $UsersData | Add-AadObjectToLookupCache -Type user -LookupCache $LookupCache } } if ($GroupsData) { if ($GroupsData -is [System.Collections.Generic.Dictionary[guid, pscustomobject]]) { $LookupCache.group = $GroupsData } else { $GroupsData | Add-AadObjectToLookupCache -Type group -LookupCache $LookupCache } } if ($ApplicationsData) { if ($ApplicationsData -is [System.Collections.Generic.Dictionary[guid, pscustomobject]]) { $LookupCache.application = $ApplicationsData } else { $ApplicationsData | Add-AadObjectToLookupCache -Type application -LookupCache $LookupCache } } if ($ServicePrincipalsData) { if ($ServicePrincipalsData -is [System.Collections.Generic.Dictionary[guid, pscustomobject]]) { $LookupCache.servicePrincipal = $ServicePrincipalsData } else { $ServicePrincipalsData | Add-AadObjectToLookupCache -Type servicePrincipal -LookupCache $LookupCache } } ## Get Role Assignments if ($RoleAssignmentSchedulesData) { $RoleAssignmentSchedulesData | Process-RoleAssignment -LookupCache $LookupCache -UseLookupCacheOnly:$Offline } else { Write-Verbose "Getting roleAssignmentSchedules..." Get-MsGraphResults 'roleManagement/directory/roleAssignmentSchedules' -Select 'id,directoryScopeId,memberType,scheduleInfo,status,assignmentType' -Filter "status eq 'Provisioned' and assignmentType eq 'Assigned'" -QueryParameters @{ '$expand' = 'principal($select=id),roleDefinition($select=id,templateId,displayName)' } -ApiVersion 'beta' ` | Process-RoleAssignment -LookupCache $LookupCache } if ($RoleEligibilitySchedulesData) { $RoleEligibilitySchedulesData | Process-RoleAssignment -LookupCache $LookupCache -UseLookupCacheOnly:$Offline } else { Write-Verbose "Getting roleEligibleSchedules..." Get-MsGraphResults 'roleManagement/directory/roleEligibilitySchedules' -Select 'id,directoryScopeId,memberType,scheduleInfo,status' -Filter "status eq 'Provisioned'" -QueryParameters @{ '$expand' = 'principal($select=id),roleDefinition($select=id,templateId,displayName)' } -ApiVersion 'beta' ` | Process-RoleAssignment -LookupCache $LookupCache } } catch { if ($MyInvocation.CommandOrigin -eq 'Runspace') { Write-AppInsightsException $_.Exception }; throw } finally { Complete-AppInsightsRequest $MyInvocation.MyCommand.Name -Success $? } } # SIG # Begin signature block # MIInuwYJKoZIhvcNAQcCoIInrDCCJ6gCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCARBV911vD1us1d # 5CgaCx9QHeUCDibR/pD8if6EEHi9zqCCDYUwggYDMIID66ADAgECAhMzAAACU+OD # 3pbexW7MAAAAAAJTMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjEwOTAyMTgzMzAwWhcNMjIwOTAxMTgzMzAwWjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDLhxHwq3OhH+4J+SX4qS/VQG8HybccH7tnG+BUqrXubfGuDFYPZ29uCuHfQlO1 # lygLgMpJ4Geh6/6poQ5VkDKfVssn6aA1PCzIh8iOPMQ9Mju3sLF9Sn+Pzuaie4BN # rp0MuZLDEXgVYx2WNjmzqcxC7dY9SC3znOh5qUy2vnmWygC7b9kj0d3JrGtjc5q5 # 0WfV3WLXAQHkeRROsJFBZfXFGoSvRljFFUAjU/zdhP92P+1JiRRRikVy/sqIhMDY # +7tVdzlE2fwnKOv9LShgKeyEevgMl0B1Fq7E2YeBZKF6KlhmYi9CE1350cnTUoU4 # YpQSnZo0YAnaenREDLfFGKTdAgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUlZpLWIccXoxessA/DRbe26glhEMw # VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh # dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzQ2NzU5ODAfBgNVHSMEGDAW # gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw # MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx # XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB # AKVY+yKcJVVxf9W2vNkL5ufjOpqcvVOOOdVyjy1dmsO4O8khWhqrecdVZp09adOZ # 8kcMtQ0U+oKx484Jg11cc4Ck0FyOBnp+YIFbOxYCqzaqMcaRAgy48n1tbz/EFYiF # zJmMiGnlgWFCStONPvQOBD2y/Ej3qBRnGy9EZS1EDlRN/8l5Rs3HX2lZhd9WuukR # bUk83U99TPJyo12cU0Mb3n1HJv/JZpwSyqb3O0o4HExVJSkwN1m42fSVIVtXVVSa # YZiVpv32GoD/dyAS/gyplfR6FI3RnCOomzlycSqoz0zBCPFiCMhVhQ6qn+J0GhgR # BJvGKizw+5lTfnBFoqKZJDROz+uGDl9tw6JvnVqAZKGrWv/CsYaegaPePFrAVSxA # yUwOFTkAqtNC8uAee+rv2V5xLw8FfpKJ5yKiMKnCKrIaFQDr5AZ7f2ejGGDf+8Tz # OiK1AgBvOW3iTEEa/at8Z4+s1CmnEAkAi0cLjB72CJedU1LAswdOCWM2MDIZVo9j # 0T74OkJLTjPd3WNEyw0rBXTyhlbYQsYt7ElT2l2TTlF5EmpVixGtj4ChNjWoKr9y # TAqtadd2Ym5FNB792GzwNwa631BPCgBJmcRpFKXt0VEQq7UXVNYBiBRd+x4yvjqq # 5aF7XC5nXCgjbCk7IXwmOphNuNDNiRq83Ejjnc7mxrJGMIIHejCCBWKgAwIBAgIK # YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm # aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw # OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD # VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la # UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc # 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D # dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+ # lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk # kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6 # A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd # X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL # 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd # sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3 # T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS # 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI # bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL # BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD # uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv # c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF # BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h # cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA # YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn # 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7 # v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b # pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/ # KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy # CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp # mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi # hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb # BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS # oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL # gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX # cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGYwwghmIAgEBMIGVMH4x # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p # Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAJT44Pelt7FbswAAAAA # AlMwDQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIJ1j # KKzPeuEJzyne10oZ4qY00WY+0j+ijdRoJqQg+XgfMEIGCisGAQQBgjcCAQwxNDAy # oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20wDQYJKoZIhvcNAQEBBQAEggEAgw4FxCFcCxItequ6Lt7xDisY1s38Rbx2VXMc # rpUP3ZEWZ4awVs9/d4z+v5fxZHnAT8IRz6OyGLohJJLX6pKOiwROohgsJ9lkvyJx # 8ZUVeqybr/nbJW/c40qNMuxAFP0CeOoJt+AnH9IhcKHqeoNCBxsFB/LzKB39k/V7 # BBgWF/yU9nFoYcskYSv+KMtyLixbmsGyNZ350n2NWbtg/zWo4W7HjdqOd1fUDkS8 # HxR4EehM8Fuf6ou5MBAn4nxfW79CambIFONKJX5t9hJg/KUjlZuvAPtaoiGXSA08 # pjGrGmDdk/rQb/lzjqgiZnWZ480AKAtE0jWtgrGE3lLwo+2uG6GCFxYwghcSBgor # BgEEAYI3AwMBMYIXAjCCFv4GCSqGSIb3DQEHAqCCFu8wghbrAgEDMQ8wDQYJYIZI # AWUDBAIBBQAwggFZBgsqhkiG9w0BCRABBKCCAUgEggFEMIIBQAIBAQYKKwYBBAGE # WQoDATAxMA0GCWCGSAFlAwQCAQUABCAeFsX8QThvBS0WyCmdSa71s36nRGjeV9fT # j1tXggmCuAIGYjEyOBO2GBMyMDIyMDQyMTEyMDMxMS42NDFaMASAAgH0oIHYpIHV # MIHSMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQL # EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsT # HVRoYWxlcyBUU1MgRVNOOkEyNDAtNEI4Mi0xMzBFMSUwIwYDVQQDExxNaWNyb3Nv # ZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIRZTCCBxQwggT8oAMCAQICEzMAAAGNelUu # eHSZKrcAAQAAAY0wDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTAwHhcNMjExMDI4MTkyNzQ1WhcNMjMwMTI2MTkyNzQ1WjCB0jELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9z # b2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMg # VFNTIEVTTjpBMjQwLTRCODItMTMwRTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUt # U3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANo0 # SC2YPjulO3S3LsATzAftLSVM9MBy6ieX+yiV0LE81k6AA1DGFeMVWZ6fZj01qI1C # f5dzuF6noCwzXbhQDm3Iray8mORw7MQH1Btf9mIpXEpEj+gnDKln7EsFCxl+c5bF # Shye7b8INusuni5JVHRTKYqtveE+LiUHV3eTu5hctL1ZGhjxsTVi22cSjc6irRZ1 # kO4zLWdOV72n5CFmazUxb/BhqQJR7UbGdQPCg6OiA0hlTWWV20LPnzsDDhqfwc6H # fH9WCPBm9qDf5sdnHL3Rq/ZWueUGXlbDOy302hD0MW4AHC4Fg5SD3Jk83AZLBMyz # kLEqQc7Kj2liPcpFcOaH5q5BSjG6UE+RDJItrLiaFTOcRoHWVp7f7c9NMbmz0ihY # uAeCDBVAfZnADVKvXB2i7B2wyfgFLFTtKp1Y8M1z2CXkewvwfF9FJelJCHaZWZp3 # EGUgSt8mUMvqBrLiSlxQKtwZcU+pA7oWGLzu4rS6z3mNJJ7rdaypMaJvrourwnbY # Qn5wIspJ8kQtpZJ6s8/MdZg5EOUOjsfaev5XbhbqUiTLYLAjzfXyL636aTAxSL0a # FC7BznSyY60ZYvHKOTPr2Zn9tKE8WLl8zNLW0bqxCcnAeWTG8M57BR8pjpIMsfDn # hZ11d3Gq+ObnoyNQdYqlA23kjcZ73M7joXKc8GnJAgMBAAGjggE2MIIBMjAdBgNV # HQ4EFgQUeMyRboefRsKU7ko7uEk3H5YoZpMwHwYDVR0jBBgwFoAUn6cVXQBeYl2D # 9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3Nv # ZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUy # MDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1l # LVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUE # DDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQsFAAOCAgEANa9zs9JRKt1b6XRZYd2A # cXOIZ2JAC8mDw2vRTuF4KsJAZvC7G/pSt7WxhoKYukCWyt4jNwStDmwXMEWiVQsR # ixra+ic/YUbpkchfKOJ9st2Iir+KJQcTYxUoUhnPRNvSZlYwZi4Jn40aj3P9qw9u # auKMOLgN63PXpImrn4BoXEgHXpP5fpAEm86ITrf+c9viJYE+Ht2rklM7dhgCnymQ # dNmQxliingmN6RC49bboesn6ziTzyJzuGWS1t74Cmr7S/HuhSWciaAxTHsCefaBC # /gCt3tjNiOCBRPZ+i1UvG0vVGzFDL6wJVzeWTNiPBnRwfU23yNe1pv/VH+KrufPD # yTe7wiY/bPisWal3ObBknC4Koj6iG2zUxPvwBGf3k4sXPWC4E8jKmpGSOfcBqo6z # jUEmO7tFRA5BBOopM/hUhUSis6ckm9Fk4DL1sbC725zfAApiEj5wR2GaBrLDwC+3 # 6BhihS3QAU0Atj19fVo638q7IR3YqkpQrKaiBgU8UWh7cjzK6Nwf9uoD3wpdzAt6 # wtzRquMRpyBw2Rkos1JhoPE5EAJaFXVOXSdb/ddII8WsWlK2hoT/CLbRNEVp1OV0 # af7BmjZg3DMG8h7kqWhbJ90NtTs4rT+AZzebaax2p4AAu46HuM5i55kZwIlHPbEa # kNm5rDAL1KbDvJ5ThZojNS8wggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAA # AAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz # aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv # cnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBB # dXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YB # f2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKD # RLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus # 9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTj # kY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56 # KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39 # IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHo # vwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJo # LhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMh # XV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREd # cu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEA # AaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqn # Uv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnp # cjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # EwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEw # CwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/o # olxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNy # b3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYt # MjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5t # aWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5j # cnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+ # TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2Y # urYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4 # U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJ # w7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb # 30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ # /gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGO # WhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFE # fnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJ # jXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rR # nj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUz # WLOhcGbyoYIC1DCCAj0CAQEwggEAoYHYpIHVMIHSMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBP # cGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOkEyNDAt # NEI4Mi0xMzBFMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl # oiMKAQEwBwYFKw4DAhoDFQCAc5WTPU0TQ+D4LaS1kGZEj2FXCaCBgzCBgKR+MHwx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBBQUAAgUA5gsl # VjAiGA8yMDIyMDQyMTA4MzUzNFoYDzIwMjIwNDIyMDgzNTM0WjB0MDoGCisGAQQB # hFkKBAExLDAqMAoCBQDmCyVWAgEAMAcCAQACAgZoMAcCAQACAhE9MAoCBQDmDHbW # AgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSCh # CjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEFBQADgYEAgvXrc0colfjVMPMDzm9nbdwK # TwvaggLt2V7mTu2shnE3DyyfwxXNLeMzVFHoutNNwkJP1AAhe+2fSYq0TkqIbxrb # 4LDFlMxNUlvkDQBiOG5iV3lFVdvmDWJM/sXkZSG81c9N8BcHRWBfed8HhwH7k+EJ # OjEOIMX1+F41JJ71/TExggQNMIIECQIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt # cCBQQ0EgMjAxMAITMwAAAY16VS54dJkqtwABAAABjTANBglghkgBZQMEAgEFAKCC # AUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCBV # jDLGvXDVLSrFRRZ2r6oMWfOwH+5NC+ryzw0jreVnhTCB+gYLKoZIhvcNAQkQAi8x # geowgecwgeQwgb0EIJ6WETP6HV5AwJ839rnS+evVvHHxk4MFbnp0PLbSGM1/MIGY # MIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV # BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG # A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAGNelUueHSZ # KrcAAQAAAY0wIgQggo36J5dKtyYsJe9XwX4mWqwqfjOGPmQZU9QjpG/TZfYwDQYJ # KoZIhvcNAQELBQAEggIAF2YwFQ2sjk2GjYONunbqzCN4s7SP/Gq9zSUvKSthgFGK # 2j7pYO2y9Tn6FLdV3/qjO8CGhv5f2E1LMvK1WQaMFN5ufVk9shmjQPkNOHAFGWTH # dEACS4VNhtokVLvdSjKZHEOuZyOOvtmxsdYn4Aw43D7y44tq1ZHAN+0boDFyNvL3 # ysNyNvA+c3t/G7JA/EgMqhUEEpCf0ZZeavpeF381fXD2ixnTO8ROsk4uYYKgWTN1 # uJmTyydhSHI8EW6QSp9od0owRr7YENmeO+bP1CVw30V7YhufDAHTsDYZOYGcKNuR # 1rSy0LH8T5+ueweKt2myp++bdSvh9WJGpPL3tP2GTLu82/umZm6BMgHIJ5Uydd3z # 0GN7e+cM8LDJv8ITcx3FmhvvZ5UVKjyT4agQkE62gqJ8DYns9MliGB25fUTqSw5r # szEhWbUP30zEdWg8fz4aSCJPmhx3zLbAZNfJ36HId4bZmbTzypqALkSSHeAADuC5 # J5AB0S0q5Zru4+YpLlVxha/rKnbDJ7gbeWxirVxmp5qdoUO2CCXbe8bwnW+WknIM # kvIwyMydK1obOoIo3Qhw1g6SM0THq8Cfua75XKZkvqonhBnf+QaS4nIG6o+ioRYM # yrPIAW9g4xWZtRYwNlRUuUCK9Al6cMoD1B7Via0tYM1Y2VOvBovKPENVANqmS4g= # SIG # End signature block |