Invoke-LicenseScan.ps1
|
<#
.SYNOPSIS Free, read-only Microsoft 365 unused-license scan. Cross-checks every assigned license against real activity and reports the seats you're paying for but nobody is using. .DESCRIPTION Community edition of the ServerBridge License Auditor. Connects to Microsoft Graph with delegated, READ-ONLY scopes via device-code sign-in (nothing to register, no app, no secrets). It never writes, removes, or changes anything in your tenant, and it stores nothing. Activity signal (chosen automatically): * If the tenant has Microsoft Entra ID P1/P2, it uses directory sign-in activity (signInActivity) - the cleanest signal. * Otherwise it falls back to the Microsoft 365 usage reports (getOffice365ActiveUserDetail), which need no premium license. * Disabled accounts that still hold paid licenses are always flagged - that works on every tenant regardless of the above. Outputs: * A console summary of wasted spend by SKU * A CSV of every dormant licensed user (for your own follow-up) What it deliberately does NOT do (that's the paid ServerBridge License Auditor): * A formatted PDF report, costed recommended actions, scheduled re-audits with drift tracking, multi-tenant roll-up, and support. See https://server-bridge.com/license-auditor.html .PARAMETER InactiveDays A licensed user with no activity in this many days is counted as dormant. Default 90. Range 1-3650. (The usage-report fallback resolves to the nearest supported window: 30, 90 or 180 days.) .PARAMETER OutputCsv Path for the CSV export. Default: .\license-scan_<tenant>_<date>.csv .PARAMETER IncludeGuests Include guest (external) users. Off by default. .PARAMETER PassThru Emit the dormant-seat objects to the pipeline in addition to the CSV. .EXAMPLE .\Invoke-LicenseScan.ps1 .EXAMPLE .\Invoke-LicenseScan.ps1 -InactiveDays 60 -OutputCsv C:\reports\waste.csv .NOTES Requires the Microsoft Graph PowerShell SDK: Install-Module Microsoft.Graph -Scope CurrentUser Delegated scopes requested (all read-only): User.Read.All, Organization.Read.All, AuditLog.Read.All, Reports.Read.All You must be able to consent to these (Global Reader is sufficient). Prices are public list-price ESTIMATES (USD/user/month) - adjust the price table below to match your actual contract for exact figures. Project: https://github.com/lbcrowe-del/ServerBridge-LicenseScan License: MIT #> [CmdletBinding()] param( [ValidateRange(1, 3650)] [int]$InactiveDays = 90, [string]$OutputCsv, [switch]$IncludeGuests, [switch]$PassThru ) $script:RequiredScopes = @('User.Read.All', 'Organization.Read.All', 'AuditLog.Read.All', 'Reports.Read.All') # --- Approximate public list prices, USD / user / month, keyed by SkuPartNumber. # --- ESTIMATES so the tool can put a dollar figure on waste out of the box. # --- Edit to match your real per-seat cost for precise numbers. $script:SkuPrice = @{ 'O365_BUSINESS_ESSENTIALS' = 6.00 # Microsoft 365 Business Basic 'O365_BUSINESS_PREMIUM' = 12.50 # Microsoft 365 Business Standard 'SPB' = 22.00 # Microsoft 365 Business Premium 'ENTERPRISEPACK' = 36.00 # Office 365 E3 'ENTERPRISEPREMIUM' = 57.00 # Office 365 E5 'SPE_E3' = 36.00 # Microsoft 365 E3 'SPE_E5' = 57.00 # Microsoft 365 E5 'SPE_F1' = 8.00 # Microsoft 365 F3 'DESKLESSPACK' = 4.00 # Office 365 F3 'EXCHANGESTANDARD' = 4.00 # Exchange Online Plan 1 'EXCHANGEENTERPRISE' = 8.00 # Exchange Online Plan 2 'MCOEV' = 8.00 # Teams Phone Standard 'POWER_BI_PRO' = 10.00 # Power BI Pro 'POWER_BI_PREMIUM_PER_USER' = 20.00 # Power BI Premium Per User 'PROJECTPROFESSIONAL' = 30.00 # Project Plan 3 'PROJECTPREMIUM' = 55.00 # Project Plan 5 'VISIOCLIENT' = 15.00 # Visio Plan 2 'Microsoft_365_Copilot' = 30.00 # Microsoft 365 Copilot 'FLOW_FREE' = 0.00 # Power Automate (free) 'TEAMS_EXPLORATORY' = 0.00 # Teams Exploratory (free) 'POWERAPPS_VIRAL' = 0.00 # Power Apps (free/viral) } $script:DefaultPrice = 20.00 # fallback for SKUs not in the table # --------------------------------------------------------------------------- # Pure, testable helpers (no Graph calls - safe to dot-source) # --------------------------------------------------------------------------- function Get-SkuMonthlyPrice { [CmdletBinding()] param([Parameter(Mandatory)][string]$PartNumber) if ($script:SkuPrice.ContainsKey($PartNumber)) { return [double]$script:SkuPrice[$PartNumber] } return [double]$script:DefaultPrice } function Test-UserDormant { <# $true when a user has no activity since $Cutoff (never-active counts as dormant). #> [CmdletBinding()] param( [Parameter()][Nullable[datetime]]$LastActivity, [Parameter(Mandatory)][datetime]$Cutoff ) if ($null -eq $LastActivity) { return $true } return ($LastActivity -lt $Cutoff) } function Get-DormantLicenseRow { <# Pure projection: given normalized user objects (DisplayName, UserPrincipalName, UserType, AccountEnabled, LastActivity, AssignedLicenses[].SkuId), a SkuId->PartNumber map and a cutoff, emit one row per dormant user per priced license. No Graph, no I/O - unit-testable. A user is dormant when disabled, OR (when an activity signal is available) when last activity is older than the cutoff or unknown. With no activity signal only disabled accounts are flagged. #> [CmdletBinding()] param( [Parameter(Mandatory)][AllowNull()][AllowEmptyCollection()][object[]]$Users, [Parameter(Mandatory)][hashtable]$SkuMap, [Parameter(Mandatory)][datetime]$Cutoff, [bool]$ActivitySignalAvailable = $true, [switch]$IncludeGuests ) foreach ($u in @($Users | Where-Object { $null -ne $_ })) { if (-not $IncludeGuests -and $u.UserType -eq 'Guest') { continue } $dormant = $false $reason = $null if (-not $u.AccountEnabled) { $dormant = $true; $reason = 'disabled' } elseif ($ActivitySignalAvailable -and (Test-UserDormant -LastActivity $u.LastActivity -Cutoff $Cutoff)) { $dormant = $true; $reason = 'inactive' } if (-not $dormant) { continue } foreach ($lic in $u.AssignedLicenses) { $part = $SkuMap[$lic.SkuId] if (-not $part) { continue } $price = Get-SkuMonthlyPrice -PartNumber $part if ($price -le 0) { continue } # skip free SKUs [pscustomobject]@{ DisplayName = $u.DisplayName UserPrincipalName = $u.UserPrincipalName UserType = $u.UserType AccountEnabled = $u.AccountEnabled Reason = $reason Sku = $part LastActivity = if ($u.LastActivity) { ([datetime]$u.LastActivity).ToString('yyyy-MM-dd') } else { 'never/unknown' } MonthlyCost = $price AnnualCost = [math]::Round($price * 12, 2) } } } } # --------------------------------------------------------------------------- # Graph I/O (kept in functions so tests can dot-source without a tenant) # --------------------------------------------------------------------------- function Get-SignInActivityMap { <# Returns @{ ok=$bool; map=@{ upn(lower) -> [datetime] } }. ok=$false when the tenant lacks Entra ID P1 (signInActivity is premium-only) so the caller can fall back. Other errors are rethrown. #> [CmdletBinding()] param() $map = @{} try { $users = Get-MgUser -All -Property 'userPrincipalName,signInActivity' ` -Filter 'assignedLicenses/$count ne 0' -ConsistencyLevel eventual ` -CountVariable siaCount -ErrorAction Stop foreach ($u in $users) { if ($u.UserPrincipalName) { $map[$u.UserPrincipalName.ToLower()] = $u.SignInActivity.LastSignInDateTime } } return @{ ok = $true; map = $map } } catch { $msg = "$($_.Exception.Message)" if ($msg -match 'NonPremium' -or $msg -match 'premium') { return @{ ok = $false; map = $map } } throw } } function Get-UsageReportActivityMap { <# Fallback that needs no Entra premium: pulls the Microsoft 365 active-user detail report and returns @{ ok=$bool; map=@{ upn(lower) -> [datetime] } }. ok=$false when the tenant de-identifies report data (UPNs masked) so activity can't be matched to users. #> [CmdletBinding()] param([int]$InactiveDays = 90) # NB: the Graph reports API keeps the legacy "Office365" name for this function. $period = if ($InactiveDays -le 30) { 'D30' } elseif ($InactiveDays -le 90) { 'D90' } else { 'D180' } $uri = "https://graph.microsoft.com/v1.0/reports/getOffice365ActiveUserDetail(period='$period')" $resp = Invoke-MgGraphRequest -Method GET -Uri $uri -OutputType HttpResponseMessage -ErrorAction Stop $csv = $resp.Content.ReadAsStringAsync().Result $rows = @($csv | ConvertFrom-Csv) $map = @{} $sawUpn = $false foreach ($r in $rows) { $upn = $r.'User Principal Name' if (-not $upn) { continue } if ($upn -like '*@*') { $sawUpn = $true } # Take the most recent activity across every per-service "* Last Activity Date" column. $maxDate = $null foreach ($p in $r.PSObject.Properties) { if ($p.Name -like '*Last Activity Date' -and $p.Value) { $d = $p.Value -as [datetime] if ($d -and ($null -eq $maxDate -or $d -gt $maxDate)) { $maxDate = $d } } } $map[$upn.ToLower()] = $maxDate } if (-not $sawUpn -and $rows.Count -gt 0) { return @{ ok = $false; map = @{} } } return @{ ok = $true; map = $map } } function ConvertTo-SafeCsvValue { <# Spreadsheet apps run a cell as a formula when it starts with = + - @ (or tab/CR). Directory text such as a guest's display name is attacker-controllable, so prefix a single quote to keep it as plain text when the CSV is opened in Excel. #> [CmdletBinding()] param([Parameter(Mandatory)][AllowNull()][AllowEmptyString()][object]$Value) if ($Value -is [string] -and $Value -match '^[=+\-@\t\r]') { return "'" + $Value } return $Value } function Get-ConcealedNamesHelpText { <# The one-minute fix for de-identified usage reports, as lines of text (testable). #> [CmdletBinding()] param() @( 'Microsoft is hiding user names in your usage reports, so this scan cannot tell who is inactive.' 'Fix it in about a minute (needs a Global Administrator):' ' 1. Open https://admin.microsoft.com' ' 2. Go to Settings > Org settings > Services > Reports' ' 3. Untick "Conceal user, group, and site names in all reports", then click Save' 'This only changes what admins see in Microsoft''s own reports. You can turn it back on after the audit.' ) } function Invoke-LicenseScanMain { [CmdletBinding()] param( [int]$InactiveDays, [string]$OutputCsv, [switch]$IncludeGuests, [switch]$PassThru ) Write-Host '' Write-Host 'ServerBridge - Free M365 License Scan (read-only)' -ForegroundColor Green Write-Host '-------------------------------------------------' -ForegroundColor DarkGray if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication)) { Write-Host 'Microsoft Graph PowerShell SDK not found.' -ForegroundColor Yellow Write-Host 'Install it with: Install-Module Microsoft.Graph -Scope CurrentUser' -ForegroundColor Yellow return } try { Write-Host 'Signing you in (a device code will appear below)...' -ForegroundColor Cyan Connect-MgGraph -Scopes $script:RequiredScopes -UseDeviceCode -NoWelcome -ContextScope Process -ErrorAction Stop } catch { Write-Host "Sign-in failed: $($_.Exception.Message)" -ForegroundColor Red return } if (-not (Get-MgContext)) { Write-Host 'Sign-in cancelled.' -ForegroundColor Red; return } try { $org = Get-MgOrganization -ErrorAction Stop $tenantName = ($org.DisplayName | Select-Object -First 1) Write-Host "Connected to: $tenantName (signed in as $((Get-MgContext).Account))" -ForegroundColor Green $skuMap = @{} foreach ($s in (Get-MgSubscribedSku -All -ErrorAction Stop)) { $skuMap[$s.SkuId] = $s.SkuPartNumber } $select = 'id,displayName,userPrincipalName,userType,accountEnabled,assignedLicenses' $rawUsers = Get-MgUser -All -Property $select -Filter 'assignedLicenses/$count ne 0' ` -ConsistencyLevel eventual -CountVariable userCount -ErrorAction Stop } catch { Write-Host "Graph read failed: $($_.Exception.Message)" -ForegroundColor Red Write-Host 'Confirm you consented to User.Read.All, Organization.Read.All, AuditLog.Read.All and Reports.Read.All.' -ForegroundColor Yellow Disconnect-MgGraph -ErrorAction SilentlyContinue | Out-Null return } # Resolve an activity signal: prefer sign-in activity (premium), fall back to usage reports. $activity = @{} $signalAvailable = $true $signalName = 'directory sign-in activity' $sia = Get-SignInActivityMap if ($sia.ok) { $activity = $sia.map } else { Write-Host 'Sign-in activity needs Entra ID P1; falling back to Microsoft 365 usage reports...' -ForegroundColor Yellow $rep = $null $attempt = 0 while ($true) { try { $rep = Get-UsageReportActivityMap -InactiveDays $InactiveDays } catch { $rep = $null Write-Host "Usage reports unavailable: $($_.Exception.Message)" -ForegroundColor Yellow break } if ($rep.ok) { break } $attempt++ Write-Host '' if ($attempt -gt 1) { Write-Host 'Names are still hidden. Microsoft can take a few minutes to apply the change.' -ForegroundColor Yellow } else { Get-ConcealedNamesHelpText | ForEach-Object { Write-Host $_ -ForegroundColor Yellow } } if ([Console]::IsInputRedirected) { break } $answer = Read-Host 'Press Enter when done to check again (no new sign-in), or type S to skip' if ($answer -match '^\s*[sS]') { break } } if ($rep -and $rep.ok) { $activity = $rep.map $signalName = 'Microsoft 365 usage reports' } else { $signalAvailable = $false Write-Host '' Write-Host 'PARTIAL AUDIT: only disabled accounts that still hold licenses can be checked.' -ForegroundColor Yellow } } if ($signalAvailable) { Write-Host "Flagging licensed users dormant $InactiveDays+ days (via $signalName)..." -ForegroundColor Cyan } $normalized = foreach ($u in $rawUsers) { [pscustomobject]@{ DisplayName = $u.DisplayName UserPrincipalName = $u.UserPrincipalName UserType = $u.UserType AccountEnabled = $u.AccountEnabled AssignedLicenses = $u.AssignedLicenses LastActivity = if ($u.UserPrincipalName) { $activity[$u.UserPrincipalName.ToLower()] } else { $null } } } if ($signalAvailable) { $resolved = @($normalized | Where-Object { $_.LastActivity }).Count Write-Host (" activity resolved for {0} of {1} licensed users" -f $resolved, @($normalized).Count) -ForegroundColor DarkGray } $cutoff = (Get-Date).AddDays(-1 * $InactiveDays) $dormant = @(Get-DormantLicenseRow -Users $normalized -SkuMap $skuMap -Cutoff $cutoff ` -ActivitySignalAvailable $signalAvailable -IncludeGuests:$IncludeGuests) Write-Host '' Write-Host 'Wasted spend by license' -ForegroundColor Green Write-Host '-----------------------' -ForegroundColor DarkGray if ($dormant.Count -eq 0) { Write-Host ' Nothing obvious to reclaim.' -ForegroundColor Green } else { $dormant | Group-Object Sku | ForEach-Object { [pscustomobject]@{ License = $_.Name DormantSeats = $_.Count 'Annual $' = [int][math]::Round((($_.Group | Measure-Object AnnualCost -Sum).Sum), 0) } } | Sort-Object 'Annual $' -Descending | Format-Table -AutoSize } $totalAnnual = [math]::Round((($dormant | Measure-Object AnnualCost -Sum).Sum), 0) Write-Host (" Reclaimable seats : {0:N0}" -f $dormant.Count) -ForegroundColor White Write-Host (" Wasted spend : `${0:N0} / year" -f $totalAnnual) -ForegroundColor Green Write-Host '' if (-not $OutputCsv) { $safeTenant = ($tenantName -replace '[^\w]', '') $OutputCsv = Join-Path (Get-Location) ("license-scan_{0}_{1}.csv" -f $safeTenant, (Get-Date -Format 'yyyyMMdd')) } if ($dormant.Count -gt 0) { $dormant | Sort-Object AnnualCost -Descending | ForEach-Object { $row = $_.PSObject.Copy() foreach ($name in 'DisplayName', 'UserPrincipalName', 'UserType', 'Sku') { $row.$name = ConvertTo-SafeCsvValue -Value $row.$name } $row } | Export-Csv -Path $OutputCsv -NoTypeInformation -Encoding UTF8 Write-Host "Full per-user list saved to:" -ForegroundColor Cyan Write-Host " $OutputCsv" -ForegroundColor White Write-Host '' } Write-Host 'Prices are list-price estimates - edit the price table for exact figures.' -ForegroundColor DarkGray Write-Host 'Want the PDF report, costed recommended actions and scheduled re-audits?' -ForegroundColor DarkGray Write-Host ' https://server-bridge.com/license-auditor.html' -ForegroundColor Cyan Write-Host '' Disconnect-MgGraph -ErrorAction SilentlyContinue | Out-Null if ($PassThru) { $dormant } } # Run unless dot-sourced (e.g. by Pester tests, where InvocationName is '.'). if ($MyInvocation.InvocationName -ne '.') { Invoke-LicenseScanMain -InactiveDays $InactiveDays -OutputCsv $OutputCsv ` -IncludeGuests:$IncludeGuests -PassThru:$PassThru } # SIG # Begin signature block # MII2xQYJKoZIhvcNAQcCoII2tjCCNrICAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCXRvp05ECoK88Z # qnzTv1a26Ris3rY26nGREgybAsphS6CCG2MwggXMMIIDtKADAgECAhBUmNLR1FsZ # lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu # dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy # MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv # c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo # b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD # Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH # or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD # PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV # qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70 # ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1 # vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3 # W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK # xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg # trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj # O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7 # swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE # AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ # T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn # LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c # Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF # xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx # AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8 # FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY # lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2 # 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY # uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al # GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk # ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggbBMIIEqaADAgECAhMzAAYWBv4o # k8/+3au+AAAABhYGMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDQwHhcNMjYwOTEzMTYyMjU2WhcNMjYwOTE2 # MTYyMjU2WjCBgjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCEtlbnR1Y2t5MRIwEAYD # VQQHEwlMZXhpbmd0b24xJTAjBgNVBAoTHExlZSBDcm93ZSBTb2Z0d2FyZSBTb2x1 # dGlvbnMxJTAjBgNVBAMTHExlZSBDcm93ZSBTb2Z0d2FyZSBTb2x1dGlvbnMwggGi # MA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC6o/ubHWtkTCQybBjeFCbEnOX3 # a2V47SPSiI4lvlPpaP4cC82U+TxSBF1uXkUCFNq/hC1ejqKUBvw84Q+eyxiWyZe3 # T/x8HpzPjO1ddlHqII57pDafSG9t0yr2ZzIruKA+s11dNkDK3glFi59rR58ADcek # f99gPElcAKi9UDUU3MpT4CvHLqawCzbh/4YWnMh0luNp0rHlTNdhsyodqgOngsgY # h+5HJOvScHKLNam3VgUSfo26fCWzjlx0OVS+B9ByzglXEzoQ8IlMsI9SzPCg7Kvo # /ogXMjy0Jo0hY5L/XgH5OW59gpy0ShYtiB8mghtrX7GKRfwlPX9gWb6JMHR5Z1BB # SVVwzswFtJ56ALSHuUW9Q+dzjmVPAXDFb8deDRMdff4A47jqDBmBDDI7vzwleWne # y6o4W2TRQTyl/hLQU82DIBFrGZqXDHwZC8r5rC2aVmHSJnliFQa2X6rTJsb9KPI5 # fkDWGpLMIW5rRGaZnI/M426GigtoSzp36yuGm0kCAwEAAaOCAdUwggHRMAwGA1Ud # EwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDwGA1UdJQQ1MDMGCisGAQQBgjdhAQAG # CCsGAQUFBwMDBhsrBgEEAYI3YfX3xXqCm/n9aIL52tE6goGumFEwHQYDVR0OBBYE # FDOrZzZrzUx5bsbrsShjOdZMhNX0MB8GA1UdIwQYMBaAFJrxVHd1DIcWN0agrN55 # +fR/wXjpMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVP # QyUyMENBJTIwMDQuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJ # RCUyMFZlcmlmaWVkJTIwQ1MlMjBFT0MlMjBDQSUyMDA0LmNydDBUBgNVHSAETTBL # MEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQA3 # v3TEmbQr5oE6rOO3ZOIsCf5dzXTSTramkOb178wEc69VxGsjJuiA0WxaUSHUudIY # don1m4IlWQyq5P7QBBvURmrjBOfxEz+DBVNpVjVOCYGOCH3wfPEkhb03Xg7BOkWw # xK9s0zvV4WHmKld0bthcCtyk9A9qAU3xn+RbkghbLXSZ3vKka0s9YzrKlHPcHyhR # 2gs/OpCup4J9rmj6HxlelqocOW9i9/S9rur9oWU04RwFeddU9hsi63bWFLfBgdRr # NQf+k0RWO05ky/JqAF/AxkdjrJE1ZKaPVf2NgkX1W6tz0KfYESuBdj0a+9pkcD/h # +C6WIg3jGeX9JGo1MvlUAQUk3ilX/FG2OdaipQcq+4UYf01+PmcnsV4zlg7hKLWH # s05Qi+oro0t/rydWSOkLCa1FFOeW9zowHrzAqs3GBBtHCnsm5NWQOGnNmnI+DQ75 # KvC/g8Ddgj/yh7Ns5S+EVRLYcBHJfOALoht3R/SiYl9D8E4x2G92rQOjr7YOQYQt # FHxVjsLFLAs25mYd/SyIvbwIcwXZ2wYvY40TkTZYUAdqa1EDzgIChFpQ68s5+vPz # +AkxrKspstw8zNML/ZNRmu3Cfi3f960YVa6A/mpOzZ0S2eHsK59w+phTNhaCYzr7 # TznKM+OBJvYf25Y0w76PLEkt+xGWc3KUtLuP5btmYjCCBygwggUQoAMCAQICEzMA # AAAXJ0UJC4uHr8YAAAAAABcwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9z # b2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYx # ODExMzFaFw0zMTAzMjYxODExMzFaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJp # ZmllZCBDUyBFT0MgQ0EgMDQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC # AQCCx2T+Aw9mKgGVzJ+Tq0PMn49G3itIsYpbx7ClLSRHFe1RELdPcZ1sIqWOhsSf # y6yyqEapClGH9Je9FXA1cQgZvvpQbkg+QInVLr/0EPrVBCwrM96lbRI2PxNeCwXG # 9LsyW2hG6KQgintDmNCBo4zpDIr377plVdSliZm6UB7rHwmvBnR02QT6tnrqWq2i # hzB6lRJVTEzuh0OafzIMeMnYM0+x+ve5EOLHdfiq+HXiMf9Jb7YLHtYgyHIiJA7b # TWLqFSLGaTh7ZlbxbsLXA91OOroEpv7OjzFuu3tkpC9FflA4Dp2Euq4+qPmxUqfG # p+TX0gLRJp9NJOzzILjcTD3rkFFFbxUv1xyg6avivFDLtoKBhM2Td138umE1pNOa # canuSYtPHIeQHmB6haFi64avLBLwTTAm/Rbit860cFXR72wq+5Qh4hSmezHqKXER # WPpVBe+APrJ4Iqc+aPeMmIkoCWZQO22HnLNFUFSXjiwyIbgvlH/LIAJEqTafTzxD # ZgKhlLU7zr6gwsq3WNpcYQI6NuxWnwh3VVDDyF7onQqKs5Ll7bleVN0Y8VvqgE45 # ppyBbvwqN/Run5fMCCRz3aYMY0kZhKO92eP7t4zHqZ5bQMAgZ0tE2Pz/jb0wiykU # F/PcoOqqk3vVLiRDYst6vd3GEMNzMpUUvQcvBG46+COIbwIDAQABo4IB3DCCAdgw # DgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBSa8VR3 # dQyHFjdGoKzeefn0f8F46TBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcC # ARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRv # cnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYB # Af8CAQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkw # ZzBloGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj # cm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIw # MjAyMS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVy # aWZpZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3 # DQEBDAUAA4ICAQCQdVoZ/U0m38l2iKaZFlsxavptpoOLyaR1a9ZK2TSF1kOnFJhM # Dse6KkCgsveoiEjXTVc6Xt86IKHn76Nk5qZB0BXv2iMRQ2giAJmYvZcmstoZqfB2 # M3Kd5wnJhUJOtF/b6HsqSelY6nhrF06zor1lDmDQixBZcLB9zR1+RKQso1jekNxY # uUk+HaN3k1S57qk0O//YbkwU0mELCW04N5vICMZx5T5c7Nq/7uLvbVhCdD7f2bZp # A4U7vOkB1ooB4AaER3pjoJ0Mad5LFyi6Na9p9Zu/hrLeOjU5FItS5YxsqvlfXxAT # hJ176CmkYstKRmytSHZ7JhKRfV6e9Zftk/ODb/CK4pGVAVqsOf4337bQGrOHHCQ3 # IvN9gmnUuDh8JdvbheoWPHxIN1GB5sUiY584tXN7xdD8LCSsRqJvQ8e7a3gZWTgV # iugRs1QWq+N0G9Nje6JHlN1CjJehge+H5PGktJja+juGEr0P+ukSkcL6qaZxFQTh # 3SDI71lvW++3bl/Ezd6SO8N9Udw+reoyvRHCyTiSsplZQSBTVJdPmo3qCpGuyHFt # Po5CBn3/FPTiqJd3M9BHoqKd0G9Kmg6fGcAvFwnLNXA2kov727wRljL3ypfqL7iA # T/Ynpxul6RwHRlcOf9dDGg1RRvr92NP/CWVXIb68geR2rvU/NsfmtjF1wDCCB54w # ggWGoAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzEL # MAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYG # A1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRp # ZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIw # MTUyMFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmlu # ZyBQQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8Z # iCji3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1 # AwoNcHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs # 076Iu+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV # +ayQ2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5 # +TcmJX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJ # s+qG8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv # 9weFxhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5Vp # IVbcNr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWL # tr+bGecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8 # bvxVFyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+ # qM6K4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8B # Af8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX # 9c0pnqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV # HSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZz # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw # SWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBB # dXRob3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUF # BzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jv # c29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmlj # YXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9v # bmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUq # nv7Uq+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4 # LqK0wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW # 8oVH+KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9 # ThVN3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UE # auY0byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjin # MLXNOAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358Z # TFcx0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgP # Cqr+PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNS # yALQe6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww # 94lDf+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1Z # OmBXiCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghq4MIIatAIBATBxMFoxCzAJ # BgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNV # BAMTIk1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBFT0MgQ0EgMDQCEzMABhYG/iiT # z/7dq74AAAAGFgYwDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAig # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL # MQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgD2oPRwF0klUokWewKm21 # G2w2uiSXJUy8a6TyaJDqWtkwDQYJKoZIhvcNAQEBBQAEggGAkOtEQVTW9g1MdovE # oV+cmnNf10/6ZBoI7kCaivbT/EY7fqryDli9aEuwtGLhAuUi+Qv6CXIcbW1zniAs # w2GEz3eKN2QPszXMj5kRloCpRkTow2ALeapWev3mfETCd9XCxP+m32KX721h7Upe # tW1RwiTYjZtU9fTKejM64oqAywOroeG2PDBaDPun9eldmxddTYOUJ0Q06wYd+/Xj # L4A70ucY3tRel+Rrd71Q/U73rB0gkeUOrOQutK7bNRVOCwHC6YN71lczTMMG94nH # S6th/RcUGRWHiojwk44Qzlxz0DXAYQyuBgVrQOmsSJm15yeZqRPHe1b4qwowvcvP # 8M0RqVpYz4XgwXlKJ3kpohgEWQf0GilmnmJcg74dzhfjOjG5O3TwhXn2JjMv+nnF # k9WvYSOJK0pGCEjc1DKgQkenS4OkpRfDOlwtZe+9s6OVl/GSzakw6xB4H5/X0Uze # C+5K1YpmiHkVv/6DP5Rq/Yc8jp2gb1bBd41S1wcwFyfL8wNQoYIYETCCGA0GCisG # AQQBgjcDAwExghf9MIIX+QYJKoZIhvcNAQcCoIIX6jCCF+YCAQMxDzANBglghkgB # ZQMEAgEFADCCAWIGCyqGSIb3DQEJEAEEoIIBUQSCAU0wggFJAgEBBgorBgEEAYRZ # CgMBMDEwDQYJYIZIAWUDBAIBBQAEIH66/bZkUIG0SkHzzpGTtWJSSdIApA5rs+Rd # eK3O0X3fAgZqpBBAlpcYEzIwMjYwOTE0MjM0ODA4LjUzNVowBIACAfSggeGkgd4w # gdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsT # HE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQg # VFNTIEVTTjo3QTAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0IFB1Ymxp # YyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmggg8hMIIHgjCCBWqgAwIBAgIT # MwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJV # UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNy # b3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0 # aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5MjA0MjMxWjBhMQsw # CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD # VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ5851Jj/eDFnwV9Y7UGIqMc # HtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqOQxwuEQXG8kB41wsD # JP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEESnt0MbPEoKdNihwM # 5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtcCEr5ZKTkKKE1CxZvNPWdGWJU # PC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTavwfFP6XaGZGWUG8TZaiTogRo # AlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm5sOTiEQtBLGd9Vhd # 1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+eZ4CNE3ctW4uvSDQ # VeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7gt8hY64XNPO6iyUGsEgt8c2P # xF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5JhtYUrlmAbpxRjb9tSreDdtACpm # 3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8KN5YsJBnczyWB4JyeeFMW3JB # fdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8Y5SwB1lt5dQhABYy # zR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAOBgNVHQ8BAf8EBAMCAYYwEAYJ # KwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1L0hjQM972K9J6T7ZPdshMFQG # A1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jv # c29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYI # KwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUw # AwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0w # ezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj # cm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlm # aWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQw # gYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2Nl # cnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUy # MENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwDQYJKoZIhvcNAQEM # BQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/pO+4ge/XEizXvhs0Y # 7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviwpnK3aL5JedwzbeBF7POyg6IG # G/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+IfvM9lzDmc2O2END7MPnrcjWd # QnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccOiQljjTW6GePe5sGFuRHzdFt8 # y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1jKu3m9KGIqF4aldrYBamyh3g # 4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i79dKOChmoONqbMI8m04uLaEHA # v4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFfR4f/gksSkbJp7oqL # wliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5ODIRfyoGl59BsXR/HpRGtiJquO # YGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOmkFpvPE8CH+EeGGWzqTCjdAsn # o2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqPTXPmaCAJKVHAP19o # EjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG2GwYe6ZoAF1bMIIHlzCCBX+g # AwIBAgITMwAAAFhlzes/odf80gAAAAAAWDANBgkqhkiG9w0BAQwFADBhMQswCQYD # VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD # EylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAeFw0y # NTEwMjMyMDQ2NTVaFw0yNjEwMjIyMDQ2NTVaMIHbMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP # cGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046N0EwMC0wNUUwLUQ5 # NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcg # QXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnXg0pHaQ # 7PVAlln+HZZrJFcLoKbekhW1yL+QNBUgFFUsjZIKaqqN4oIJsJM3ps0rJNSO7ndC # NRuZDX2Wgur3Ak77eXrloBXqZmO6ZVXeDNRCLldW4A0/NfjzJ7XXkdEhjr81ghXE # pR7zC+wbaNN+sPSxzLAZBeibDFP7Xws5wX0ZtIsN1a2+Xq5bvWp3kRMytwskTjun # RgeLZL/tBp237JVdRPFAQ9jYRKpCqUBo/v1xjBLRCV3PalKjnGfb3MN4U7jVyqif # FHShcnW5CERRoBmUa6sygDzFSr8e3g93TPNLFUivUE0GmLfbX5ceD1Gt1FcZ6x/J # LVATzk5+BWHbMxwJIVkVPTqSSMjQ6KTKdcnq3pH0c4AFJp/glvcpq0U9fzZIjJGG # vdpishlRl77RQtUhSjxHvCn3LC/xqQQwOHSQDsGh6NX2D0RfsSyEtTAByAae+2w1 # HByTDTcmlTNLEuQLeCj1gNBdIWj0WOYyDtjjQ/8iTWY6ey1vb9qHljIj5HgIndT5 # P9MYk2Vg2e7hKUZNBNbA/hsgBsuoZ+IX89WvjEN9abF91S4OJVuinmKsLO/MLbnl # 7ikuD0dN6oA0YewyDQncs12sM9HOtu72QA/TZlefvW8r9xtMXAYoQlcGjsk8W4Uc # 7cfqVqbIPjdoc8ZxBzLcXcVyP4p5cyLwvkMCAwEAAaOCAcswggHHMB0GA1UdDgQW # BBRyjU3Fer4VxXJ+hjPcRJnxnRIJsDAfBgNVHSMEGDAWgBRraSg6NS9IY0DPe9iv # Sek+2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3Rh # bXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0wazBpBggrBgEFBQcw # AoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3Nv # ZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3J0 # MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/ # BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEW # M2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5 # Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBAHvrxIiVF1iHcXvxrJTC # D8eOtbPUbK9x+Lz70iYehh+G0UoOMcMf04QD6tQPTeZ5HhGETkcn0raDJ5NpfbRB # uKEH31rxbZK97o12KRDNJ3Nu4ePaUIpH/TcWz8PLVOCECywSxbEgEG20kyydGc46 # c591tXzpfkJDckjoYrypaerdeQLRQH9LaoTYZfdAzMo+Dy0O1DzFJkF5YnsmAM8l # t9r1NtXdFjdbFMCbV5dau64mV22s186A8Umi+l239+Ue0cbJQIykWhIlhhWhxQgo # ksqHz7kp2GFZAAeySTmIOQOWyXOA8JA8TISJyn3JDOgStv583P3V0QSALT6JXDCW # 26FV208VGJMzkv0S22iOTZJ/oamTpk8RzD8oWT8pfbe1q/k/bxPiXYRbzps96a5Y # Oko7n0Vdo61DOJhL/mhk01Y348gq6vhG/VTcdGHh1rCkwOM05B35AZZq9AtPpfRz # JinrHzzGRx+r6fD3ccYMPMMX/Nwd2irzrph172fQcSf1fMwvwIhmfH4GWJJ+mf1H # A6uXoAOVByckguXvlj8gPi7T2ES6RU8+QssfqTNTJKjsBheWKWv2W4ESVen2L7lC # z7i79FhA+0kp0yXJnYwdzWS0ovTINULINmzVyMcSUm5WuVf8YZ33cAud2Opr6N1+ # RuLZDavDvjiehlI5dH+GEy56MYIHQzCCBz8CAQEweDBhMQswCQYDVQQGEwJVUzEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv # ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFhlzes/odf8 # 0gAAAAAAWDANBglghkgBZQMEAgEFAKCCBJwwEQYLKoZIhvcNAQkQAg8xAgUAMBoG # CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwOTE0 # MjM0ODA4WjAvBgkqhkiG9w0BCQQxIgQg5XTaWlPRuiEHYBbvbbqQCul069lGvWnX # PQ8mT+7K4pAwgbkGCyqGSIb3DQEJEAIvMYGpMIGmMIGjMIGgBCDFIlS7sgfQ+wAo # 1cWbWz+WN69VBds58hbran919aLocTB8MGWkYzBhMQswCQYDVQQGEwJVUzEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg # UHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFhlzes/odf80gAA # AAAAWDCCA14GCyqGSIb3DQEJEAISMYIDTTCCA0mhggNFMIIDQTCCAikCAQEwggEJ # oYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUw # IwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5u # U2hpZWxkIFRTUyBFU046N0EwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29m # dCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5oiMKAQEwBwYFKw4D # AhoDFQCdZHkb26ercF2O62vCdZUfUSvEXKBnMGWkYzBhMQswCQYDVQQGEwJVUzEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv # ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDANBgkqhkiG9w0BAQsF # AAIFAO5Sg0EwIhgPMjAyNjA5MTQxNDI5MjFaGA8yMDI2MDkxNTE0MjkyMVowdDA6 # BgorBgEEAYRZCgQBMSwwKjAKAgUA7lKDQQIBADAHAgEAAgIJHDAHAgEAAgITPDAK # AgUA7lPUwQIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIB # AAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQAHQ8xMyZB3VY62 # MDeNcAJmJtY4krAkd8rUrI6ZokVL8vFbSRcM+DWVPxjM021K6adIdthsnXFVN2y4 # bVCo324hwmuaCEePTlmFJlIrOJ4WHMJuT8mlsC3UmOo6T8cs55Rwtn1Jzqt8TwX3 # KGLrLFl8Z/uf/522QB7tRMYqi2Wl0hV9jovS3jxjLiSF6SBFX0EckOHNhkQ01Yju # 8Aqktui/RH8+ukC9KChhsnlcod9kbkwVLQH9N7VthVmtglVVqASUAYhQ5hg3vIBy # H+tWjE6ibyRVK+pfhSbo7qEmuU94l5MUixsqCt8bU16ClX4xBM2OpO9mlw4hlB4v # se3dcNzZMA0GCSqGSIb3DQEBAQUABIICAHWXiTBTtkV77QB2ndXytN5HGWPYJFn4 # i13xGZBrb9K9h//sMuNUVysAzgHey/55gQxfRC1QYsvhiQfNezi+wIkK1zIq2s5o # NgfdQ5ZDc3GkgdBLBe6T1hdZvK/IIjTC/b4mqV+N4JDxA6kjN99gsdxkQCiHfUik # kJ3BcDmYz+N8WUyPDQfaw1zzzSyrltapw9ls7hQ1PBg0iQfIVCgsjADcmYlpEfyS # cGa7aPIiiFv3rQa+hC9V2fXZx2I6ByXGtiQ7kek4MkbQHnIEbKUC7mSgcW2x8wqs # ctHgBa/K9beP8hIoZ7otuinWu9SxOruRtMI3CRiSHAZIvPXJHAdXGIf1xrVO8AQT # ZitJJZuSWfIfr7fQBSKFSs/d3S+iGeqayY+8Ly7hLBjUxmV99pvnfake2H4QLT7g # WZFm59+5AGXcVTfYuM+Xr6IYZOBXWgsguiBtv/iz5npfxx1+h144nlwCcBomX/i0 # i2f2t4E39bhVpOUDiaPa3CxcHIefaX8ViO0Ksnew4buyQICOXyDAiPUPyqFq0+PT # KZbGygRyB0sgoJi56bi7PENNAnowQ8t5zBdz779UAvhZzMlWTy4v6r8xG2wNoEA3 # Fw82UOb1FfAASvKJqZrQguXB3KhKne1qRdeF6e3NxKzRHR5FpS9H5iZH6ELQ9r3A # OEOZTEQXi681 # SIG # End signature block |