Private/Replay.ps1
|
function Get-OverageReplay { param( [object[]] $Samples, [datetime[]] $ResetTimes, [datetime] $Start, [datetime] $End, [decimal] $Rate, [datetime[]] $InactiveTimes = @() ) $intervalTicks = [timespan]::FromSeconds(30).Ticks if ($Start -ge $End -or $Start.Ticks % $intervalTicks -ne 0 -or $End.Ticks % $intervalTicks -ne 0) { throw 'The replay window must be nonempty and aligned to 30-second timepoints.' } $ordered = @($Samples | Sort-Object Timepoint) if ($ordered.Count -eq 0) { throw 'No joined 30-second usage/debt data was returned. No cost can be estimated.' } $daily = @{} for ($day = $Start.Date; $day -lt $End; $day = $day.AddDays(1)) { $dayStart = if ($day -lt $Start) { $Start } else { $day } $dayEnd = if ($day.AddDays(1) -gt $End) { $End } else { $day.AddDays(1) } $daily[$day.ToString('yyyy-MM-dd')] = [pscustomobject] @{ Date = $day.ToString('yyyy-MM-dd') EstimatedCUSeconds = [decimal] 0 RecordedCUSeconds = [decimal] 0 PaymentEvents = 0 Timepoints = 0 ExpectedTimepoints = [int] (($dayEnd - $dayStart).Ticks / $intervalTicks) } } $debt = [decimal] 0 $initialDebt = [decimal] 0 $previous = $null $ineligible = 0 $count = 0 $first = $null $last = $null foreach ($sample in $ordered) { if ($sample.Timepoint -lt $Start.AddSeconds(-30) -or $sample.Timepoint -ge $End -or $sample.Timepoint.Ticks % $intervalTicks -ne 0) { throw "Out-of-range or non-30-second timepoint: $($sample.Timepoint)." } if ($null -ne $previous -and $sample.Timepoint -le $previous.Timepoint) { throw "Duplicate or unordered timepoint $($sample.Timepoint). Capacity scoping or app schema is incompatible." } $reset = @($ResetTimes | Where-Object { $_ -le $sample.Timepoint -and ( ($null -eq $previous -and $_ -eq $sample.Timepoint) -or ($null -ne $previous -and $_ -gt $previous.Timepoint) ) }).Count -gt 0 $inactive = $sample.Timepoint -in $InactiveTimes $gap = if ($null -ne $previous) { ($sample.Timepoint - $previous.Timepoint).TotalSeconds - 30 } else { 0 } if ($gap -gt 0) { # A reset at the far side of a gap cannot reconstruct payments # that might have occurred before that reset. $incoming = [math]::Max([decimal] 0, $sample.RecordedCarry + $sample.RecordedBilled - $sample.Add + $sample.Burndown) if ($debt -gt 0 -or $previous.RecordedCarry -gt 0 -or (-not $reset -and $incoming -gt 0)) { throw "Missing timepoints while debt is outstanding at $($sample.Timepoint). Cannot reliably replay burndown/payments across this gap." } } if ($inactive) { $debt = [decimal] 0 } elseif ($reset) { # Resume/creation clears old debt, not new work at this timepoint. $debt = $sample.RecordedCarry + $sample.RecordedBilled } elseif ($null -eq $previous -or $gap -gt 0) { $debt = $sample.RecordedCarry + $sample.RecordedBilled if ($count -eq 0) { $initialDebt = [math]::Max([decimal] 0, $debt - $sample.Add + $sample.Burndown) } } else { $beforePayment = [math]::Max([decimal] 0, $previous.RecordedCarry + $sample.Add - $sample.Burndown) $expectedHistorical = [math]::Max([decimal] 0, $beforePayment - $sample.RecordedBilled) $tolerance = [math]::Max([decimal] 0.01, $sample.RecordedCarry * [decimal] 0.000001) if ($sample.RecordedBilled -gt $beforePayment + $tolerance -or [math]::Abs($expectedHistorical - $sample.RecordedCarry) -gt $tolerance) { throw "Unexplained carry-forward discontinuity at $($sample.Timepoint): expected $expectedHistorical CU-s, got $($sample.RecordedCarry). Billing timing/schema differs or data is incomplete; no cost was inferred." } # Recorded burndown may be capped at zero after historical debt # was paid. Counterfactual debt can still use the full idle budget. $burndown = [math]::Max($sample.Burndown, $sample.AvailableBurndown) $debt = [math]::Max([decimal] 0, $debt + $sample.Add - $burndown) } if ($sample.Timepoint -lt $Start) { $debt = if ($inactive) { [decimal] 0 } else { $sample.RecordedCarry } $initialDebt = $debt $previous = $sample continue } $bucket = $daily[$sample.Timepoint.ToString('yyyy-MM-dd')] if ($count -eq 0) { $first = $sample.Timepoint if ($first -gt $Start -and $initialDebt -gt 0 -and -not $reset) { throw 'Missing leading timepoints while incoming debt is outstanding. No cost can be inferred for this window.' } if ($null -ne $previous -and $previous.DelayRatio -gt 1 -and $initialDebt -gt 0 -and $previous.BaseCU -gt 0 -and $previous.SKU -match '^F[1-9][0-9]*$' -and $sample.BaseCU -gt 0 -and $sample.SKU -match '^F[1-9][0-9]*$' -and -not $reset) { $bucket.EstimatedCUSeconds += $initialDebt $bucket.PaymentEvents++ $burndown = [math]::Max($sample.Burndown, $sample.AvailableBurndown) $debt = [math]::Max([decimal] 0, $sample.Add - $burndown) } } $count++ $bucket.Timepoints++ $last = $sample.Timepoint $bucket.RecordedCUSeconds += $sample.RecordedBilled if ($inactive -or $sample.BaseCU -eq 0 -or $sample.SKU -notmatch '^F[1-9][0-9]*$') { if ($sample.SKU -notmatch '^F[1-9][0-9]*$') { $ineligible++ } $debt = [decimal] 0 } else { $allowance = $sample.BaseCU * [decimal] 600 $adjustedDelay = $sample.DelayRatio + (($debt - $sample.RecordedCarry) / $allowance) if ($adjustedDelay -gt 1 -and $debt -gt 0) { $bucket.EstimatedCUSeconds += $debt $bucket.PaymentEvents++ $debt = [decimal] 0 } } $previous = $sample } if ($count -eq 0) { throw 'Only pre-window data was returned. No cost can be estimated for the requested window.' } if ($last.AddSeconds(30) -lt $End -and ($debt -gt 0 -or $previous.RecordedCarry -gt 0)) { throw 'Missing trailing timepoints while debt is outstanding. No cost can be inferred for this window.' } # Counting from coverage avoids counting a leading gap twice when a # warm-up row exists before the requested window. $missing = [int] (($End - $Start).Ticks / $intervalTicks) - $count $estimated = [decimal] 0 $recorded = [decimal] 0 $payments = 0 $detail = @(foreach ($bucket in ($daily.Values | Sort-Object Date)) { $estimated += $bucket.EstimatedCUSeconds $recorded += $bucket.RecordedCUSeconds $payments += $bucket.PaymentEvents [pscustomobject] @{ Date = $bucket.Date DataStatus = if ($bucket.Timepoints -eq $bucket.ExpectedTimepoints) { 'Complete' } else { 'Partial' } ObservedTimepoints = $bucket.Timepoints ExpectedTimepoints = $bucket.ExpectedTimepoints EstimatedOverageCUHours = if ($bucket.Timepoints -gt 0) { [math]::Round($bucket.EstimatedCUSeconds / [decimal] 3600, 6) } else { $null } EstimatedCost = if ($bucket.Timepoints -gt 0) { [math]::Round($bucket.EstimatedCUSeconds / [decimal] 3600 * $Rate, 2) } else { $null } RecordedOverageCUHours = if ($bucket.Timepoints -gt 0) { [math]::Round($bucket.RecordedCUSeconds / [decimal] 3600, 6) } else { $null } RecordedCostAtSuppliedPrice = if ($bucket.Timepoints -gt 0) { [math]::Round($bucket.RecordedCUSeconds / [decimal] 3600 * $Rate, 2) } else { $null } PaymentEvents = $bucket.PaymentEvents } }) return [pscustomobject] @{ EstimatedCUSeconds = $estimated RecordedCUSeconds = $recorded InitialCarryCUSeconds = $initialDebt RemainingCarryCUSeconds = $debt PaymentEvents = $payments MissingTimepoints = $missing IneligibleTimepoints = $ineligible Timepoints = $count FirstTimepoint = $first LastTimepoint = $last DataStatus = if ($missing -gt 0) { 'Partial' } else { 'Complete' } Daily = $detail } } # SIG # Begin signature block # MII9LgYJKoZIhvcNAQcCoII9HzCCPRsCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD0/pMwbu8ZuP7x # WKbfcOQm2M1h5dotx/7GUUq+T6Cf3KCCIfAwggXMMIIDtKADAgECAhBUmNLR1FsZ # 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 # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggalMIIEjaADAgECAhMzAAdbGEDf # TgkXlXTxAAAAB1sYMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDQwHhcNMjYxMDAxMDI1MDE5WhcNMjYxMDA0 # MDI1MDE5WjBnMQswCQYDVQQGEwJVUzELMAkGA1UECBMCbmQxEzARBgNVBAcTCldl # c3QgRmFyZ28xGjAYBgNVBAoTEUNhbWVyb24gQmF0dGFnbGVyMRowGAYDVQQDExFD # YW1lcm9uIEJhdHRhZ2xlcjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGB # ALVoOcv+l3IwxEApp8l09TPrsNALwfZgh9Fq2DPFwPAODX3D4adBG9TwaG+9WhUz # sKgj3ICTmmW5RMqkERpPqxbWgWpyH11k5wv1MtLM4DN28sq+GgdFOHiifMzEaZBe # szBknSx9GoX8KqsmLlr/ihXJ8EePbgGPTzpzc7Y/zUtwJxgo4J7FCPvKwp1hwm+b # 55pz/3EjdVOW8xH+L3yj0cRfEmXiVMPlz/v/3cObU1H/v3tHNDOFQTYb7oUYdvAD # vuwQv8uO75S+T9B9ZLKq6KCTGOBJL8RIm8lMgus2osbraofB10Ta60UZXGIuph3S # 5v/3YrXMLL4pZYTRzOg1QBwVxm0vIuOANpoTrSOz+cu46JbllR7ztp4MRokIDc1u # /1fT/fZ88Qby0gH9qZats619otwnZ1cCZVXqlNPjunYblf0NxpguejrRGfoL8hOE # g3g9QRZ4qPAl6ge4ektG5p1QhrrfwPzXG1FVXSpK3wz0GT9rU3b1DSCyX3LU8Aeh # 7wIDAQABo4IB1TCCAdEwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwPAYD # VR0lBDUwMwYKKwYBBAGCN2EBAAYIKwYBBQUHAwMGGysGAQQBgjdhgpCMjhjwj9wE # gfC73D+ByYzTEzAdBgNVHQ4EFgQUEB2TH85lgaBpjWqWpUWcJncgK08wHwYDVR0j # BBgwFoAUmvFUd3UMhxY3RqCs3nn59H/BeOkwZwYDVR0fBGAwXjBcoFqgWIZWaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQl # MjBWZXJpZmllZCUyMENTJTIwRU9DJTIwQ0ElMjAwNC5jcmwwdAYIKwYBBQUHAQEE # aDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENB # JTIwMDQuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # DQYJKoZIhvcNAQEMBQADggIBACw5WA5GTU/3h+1vi/q8rC97QBcMfueg0oqMiEg1 # E123nAksZOfJQTe6gWUqa/sWuHvno+hpV8OPTC2FhLlD6nc9OMNmt6IE/eYIDtFv # pzLIg5t11T8NRLpYMINhhezLFmy8ExtA0F4d0qMPzXqIZRnfON3skT6iwm1oZIbV # y0We+ScjAgVFjcCrCeUeZbmQCBG9qIhzmWazMQTt0KDDsCDF14bDmTLLhRsbkNKh # HOYToMRfndhof+Rn0ZrYMXt5eCqhkmaXrMK7NBwqXO2jT6n1/3I7tva+xME8Na6B # Vuu+PcdaQa35GpigYQvJJvqyuV+3Xq9rIXR+TPQyK1249VJL/npb7Pk8yYncLY5t # qTODKIQqCi7V8tuFr3uTmD3TYdsOlAAFodmLzcoYEc4HG7cHy36n3milM6pz8U3K # ZQ8f8Uk1CdSubDxd65JDLWeEcYdWU3agZJaUmIzJgljj0uO6TWThMPXnZ0pcwHwP # QcuQs6Xty4trf0dSaMGRRZS7pvL1mHYlBapOIitmDHiph4SuFnIigpX0EX69zDny # 4jS7H13t1aFvPBYx6+9aRnlmSAMUpZCKqiFopMrIQa8Rn0AyL6RPuJ1RRem7kkgU # v6YmvCYJAs46yoWVAlop/2f+lhG9Zd71QjuVI+sed6Hoe100E8QKwF6JW0KDX+fu # oxsrMIIGpTCCBI2gAwIBAgITMwAHWxhA304JF5V08QAAAAdbGDANBgkqhkiG9w0B # AQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgRU9DIENBIDA0 # MB4XDTI2MTAwMTAyNTAxOVoXDTI2MTAwNDAyNTAxOVowZzELMAkGA1UEBhMCVVMx # CzAJBgNVBAgTAm5kMRMwEQYDVQQHEwpXZXN0IEZhcmdvMRowGAYDVQQKExFDYW1l # cm9uIEJhdHRhZ2xlcjEaMBgGA1UEAxMRQ2FtZXJvbiBCYXR0YWdsZXIwggGiMA0G # CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC1aDnL/pdyMMRAKafJdPUz67DQC8H2 # YIfRatgzxcDwDg19w+GnQRvU8GhvvVoVM7CoI9yAk5pluUTKpBEaT6sW1oFqch9d # ZOcL9TLSzOAzdvLKvhoHRTh4onzMxGmQXrMwZJ0sfRqF/CqrJi5a/4oVyfBHj24B # j086c3O2P81LcCcYKOCexQj7ysKdYcJvm+eac/9xI3VTlvMR/i98o9HEXxJl4lTD # 5c/7/93Dm1NR/797RzQzhUE2G+6FGHbwA77sEL/Lju+Uvk/QfWSyquigkxjgSS/E # SJvJTILrNqLG62qHwddE2utFGVxiLqYd0ub/92K1zCy+KWWE0czoNUAcFcZtLyLj # gDaaE60js/nLuOiW5ZUe87aeDEaJCA3Nbv9X0/32fPEG8tIB/amWrbOtfaLcJ2dX # AmVV6pTT47p2G5X9DcaYLno60Rn6C/IThIN4PUEWeKjwJeoHuHpLRuadUIa638D8 # 1xtRVV0qSt8M9Bk/a1N29Q0gsl9y1PAHoe8CAwEAAaOCAdUwggHRMAwGA1UdEwEB # /wQCMAAwDgYDVR0PAQH/BAQDAgeAMDwGA1UdJQQ1MDMGCisGAQQBgjdhAQAGCCsG # AQUFBwMDBhsrBgEEAYI3YYKQjI4Y8I/cBIHwu9w/gcmM0xMwHQYDVR0OBBYEFBAd # kx/OZYGgaY1qlqVFnCZ3ICtPMB8GA1UdIwQYMBaAFJrxVHd1DIcWN0agrN55+fR/ # wXjpMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUy # MENBJTIwMDQuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUy # MFZlcmlmaWVkJTIwQ1MlMjBFT0MlMjBDQSUyMDA0LmNydDBUBgNVHSAETTBLMEkG # BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQAsOVgO # Rk1P94ftb4v6vKwve0AXDH7noNKKjIhINRNdt5wJLGTnyUE3uoFlKmv7Frh756Po # aVfDj0wthYS5Q+p3PTjDZreiBP3mCA7Rb6cyyIObddU/DUS6WDCDYYXsyxZsvBMb # QNBeHdKjD816iGUZ3zjd7JE+osJtaGSG1ctFnvknIwIFRY3AqwnlHmW5kAgRvaiI # c5lmszEE7dCgw7AgxdeGw5kyy4UbG5DSoRzmE6DEX53YaH/kZ9Ga2DF7eXgqoZJm # l6zCuzQcKlzto0+p9f9yO7b2vsTBPDWugVbrvj3HWkGt+RqYoGELySb6srlft16v # ayF0fkz0MitduPVSS/56W+z5PMmJ3C2ObakzgyiEKgou1fLbha97k5g902HbDpQA # BaHZi83KGBHOBxu3B8t+p95opTOqc/FNymUPH/FJNQnUrmw8XeuSQy1nhHGHVlN2 # oGSWlJiMyYJY49Ljuk1k4TD152dKXMB8D0HLkLOl7cuLa39HUmjBkUWUu6by9Zh2 # JQWqTiIrZgx4qYeErhZyIoKV9BF+vcw58uI0ux9d7dWhbzwWMevvWkZ5ZkgDFKWQ # iqohaKTKyEGvEZ9AMi+kT7idUUXpu5JIFL+mJrwmCQLOOsqFlQJaKf9n/pYRvWXe # 9UI7lSPrHneh6HtdNBPECsBeiVtCg1/n7qMbKzCCBygwggUQoAMCAQICEzMAAAAX # J0UJC4uHr8YAAAAAABcwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0 # IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYxODEx # MzFaFw0zMTAzMjYxODExMzFaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll # ZCBDUyBFT0MgQ0EgMDQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCC # x2T+Aw9mKgGVzJ+Tq0PMn49G3itIsYpbx7ClLSRHFe1RELdPcZ1sIqWOhsSfy6yy # qEapClGH9Je9FXA1cQgZvvpQbkg+QInVLr/0EPrVBCwrM96lbRI2PxNeCwXG9Lsy # W2hG6KQgintDmNCBo4zpDIr377plVdSliZm6UB7rHwmvBnR02QT6tnrqWq2ihzB6 # lRJVTEzuh0OafzIMeMnYM0+x+ve5EOLHdfiq+HXiMf9Jb7YLHtYgyHIiJA7bTWLq # FSLGaTh7ZlbxbsLXA91OOroEpv7OjzFuu3tkpC9FflA4Dp2Euq4+qPmxUqfGp+TX # 0gLRJp9NJOzzILjcTD3rkFFFbxUv1xyg6avivFDLtoKBhM2Td138umE1pNOacanu # SYtPHIeQHmB6haFi64avLBLwTTAm/Rbit860cFXR72wq+5Qh4hSmezHqKXERWPpV # Be+APrJ4Iqc+aPeMmIkoCWZQO22HnLNFUFSXjiwyIbgvlH/LIAJEqTafTzxDZgKh # lLU7zr6gwsq3WNpcYQI6NuxWnwh3VVDDyF7onQqKs5Ll7bleVN0Y8VvqgE45ppyB # bvwqN/Run5fMCCRz3aYMY0kZhKO92eP7t4zHqZ5bQMAgZ0tE2Pz/jb0wiykUF/Pc # oOqqk3vVLiRDYst6vd3GEMNzMpUUvQcvBG46+COIbwIDAQABo4IB3DCCAdgwDgYD # VR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBSa8VR3dQyH # FjdGoKzeefn0f8F46TBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYz # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku # aHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYBAf8C # AQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkwZzBl # oGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9z # b2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAy # MS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZp # ZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3DQEB # DAUAA4ICAQCQdVoZ/U0m38l2iKaZFlsxavptpoOLyaR1a9ZK2TSF1kOnFJhMDse6 # KkCgsveoiEjXTVc6Xt86IKHn76Nk5qZB0BXv2iMRQ2giAJmYvZcmstoZqfB2M3Kd # 5wnJhUJOtF/b6HsqSelY6nhrF06zor1lDmDQixBZcLB9zR1+RKQso1jekNxYuUk+ # HaN3k1S57qk0O//YbkwU0mELCW04N5vICMZx5T5c7Nq/7uLvbVhCdD7f2bZpA4U7 # vOkB1ooB4AaER3pjoJ0Mad5LFyi6Na9p9Zu/hrLeOjU5FItS5YxsqvlfXxAThJ17 # 6CmkYstKRmytSHZ7JhKRfV6e9Zftk/ODb/CK4pGVAVqsOf4337bQGrOHHCQ3IvN9 # gmnUuDh8JdvbheoWPHxIN1GB5sUiY584tXN7xdD8LCSsRqJvQ8e7a3gZWTgViugR # s1QWq+N0G9Nje6JHlN1CjJehge+H5PGktJja+juGEr0P+ukSkcL6qaZxFQTh3SDI # 71lvW++3bl/Ezd6SO8N9Udw+reoyvRHCyTiSsplZQSBTVJdPmo3qCpGuyHFtPo5C # Bn3/FPTiqJd3M9BHoqKd0G9Kmg6fGcAvFwnLNXA2kov727wRljL3ypfqL7iAT/Yn # pxul6RwHRlcOf9dDGg1RRvr92NP/CWVXIb68geR2rvU/NsfmtjF1wDCCB54wggWG # oAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzELMAkG # A1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UE # AxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmlj # YXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIwMTUy # MFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQ # Q0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8ZiCji # 3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1AwoN # cHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs076I # u+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV+ayQ # 2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5+Tcm # JX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJs+qG # 8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv9weF # xhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5VpIVbc # Nr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWLtr+b # Gecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8bvxV # FyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+qM6K # 4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8BAf8E # BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX9c0p # nqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJ # KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME # GDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRl # bnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRo # b3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUFBzAC # hnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m # dCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRl # JTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVv # Y3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUqnv7U # q+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4LqK0 # wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW8oVH # +KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9ThVN # 3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UEauY0 # byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjinMLXN # OAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358ZTFcx # 0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgPCqr+ # PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNSyALQ # e6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww94lD # f+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1ZOmBX # iCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghqUMIIakAIBATBxMFoxCzAJBgNV # BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMT # Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBFT0MgQ0EgMDQCEzMAB1sYQN9OCReV # dPEAAAAHWxgwDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIwADAZBgkq # hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgFwPXpfXm3kyu # mmu+28Rb7qkFKeSSUYPijjbc5VCxeWgwDQYJKoZIhvcNAQEBBQAEggGAXVsWrruJ # YYDGGiFCeo/+hx9PCPEVj8Ceab3PmLLGuG/YVxAmPt3MXdL8mixypkaflvbKYEvL # A98ua9vrlX2EDTqVNV2QkmjMGAKfTnqcDkdXo5pxlwAxGKaCycb47IAbV3oai/9p # ShuBsweXBCmUw4vUyF5HFmwbP8p61LdGYlrhQv6XIKgNHkzbM5986ymPrurangYF # n8fMIV8KexK9DtA/f/4p/M5zK6F2bvOFBK8JSNMcQZMpu2BzMEPUkPrfK0SN7Q7e # jBy/GjBY3xpYCNQ06mlDWrgJQania3KFoScNAc0SNLdMxlZBE0g03WUGdDz25o+Y # gjvbf4ZRs6slwhmS0qqk3GF77y6ZaMINIDF/rVY5xk39+GKAQ9S/XJvzutWd3eHD # 4aBqwP9rVpwUKYFbbiz3thmOm+TJh36MZP0iYqWI6r0f1P0j43ifAvccWE19uWTR # kwk4+C7QwV5K/Tboa2x5woM7gmPLsNfkzxSWfhvqLfkkD6pA92Sk5swKoYIYFDCC # GBAGCisGAQQBgjcDAwExghgAMIIX/AYJKoZIhvcNAQcCoIIX7TCCF+kCAQMxDzAN # BglghkgBZQMEAgEFADCCAWIGCyqGSIb3DQEJEAEEoIIBUQSCAU0wggFJAgEBBgor # BgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIC54MRTJP0BA73YqG7GpzVL70ZZ0 # ZOBleThE6F8RQrD9AgZqqYLTzaYYEzIwMjYxMDAyMTcwMzI3LjQ2NlowBIACAfSg # geGkgd4wgdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAj # BgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5T # aGllbGQgVFNTIEVTTjo3ODAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0 # IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmggg8hMIIHgjCCBWqg # AwIBAgITMwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0BAQwFADB3MQswCQYD # VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQD # Ez9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNh # dGUgQXV0aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5MjA0MjMx # WjBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0Eg # MjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ5851Jj/eDFnwV9 # Y7UGIqMcHtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqOQxwuEQXG # 8kB41wsDJP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEESnt0MbPE # oKdNihwM5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtcCEr5ZKTkKKE1CxZv # NPWdGWJUPC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTavwfFP6XaGZGWUG8T # ZaiTogRoAlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm5sOTiEQt # BLGd9Vhd1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+eZ4CNE3c # tW4uvSDQVeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7gt8hY64XNPO6iyUG # sEgt8c2PxF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5JhtYUrlmAbpxRjb9tSr # eDdtACpm3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8KN5YsJBnczyWB4Jy # eeFMW3JBfdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8Y5SwB1lt # 5dQhABYyzR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAOBgNVHQ8BAf8EBAMC # AYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1L0hjQM972K9J6T7Z # PdshMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0l # BAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0T # AQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYD # VR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j # cmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIw # Q2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBlAYIKwYBBQUHAQEE # gYcwgYQwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp # b3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIw # Um9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwDQYJKoZI # hvcNAQEMBQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/pO+4ge/XE # izXvhs0Y7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviwpnK3aL5JedwzbeBF # 7POyg6IGG/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+IfvM9lzDmc2O2END7 # MPnrcjWdQnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccOiQljjTW6GePe5sGF # uRHzdFt8y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1jKu3m9KGIqF4aldr # YBamyh3g4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i79dKOChmoONqbMI8m # 04uLaEHAv4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFfR4f/gksS # kbJp7oqLwliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5ODIRfyoGl59BsXR/Hp # RGtiJquOYGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOmkFpvPE8CH+EeGGWz # qTCjdAsno2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqPTXPmaCAJ # KVHAP19oEjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG2GwYe6ZoAF1bMIIH # lzCCBX+gAwIBAgITMwAAAFck05XgounJMQAAAAAAVzANBgkqhkiG9w0BAQwFADBh # MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIw # MAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAy # MDAeFw0yNTEwMjMyMDQ2NTNaFw0yNjEwMjIyMDQ2NTNaMIHbMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1l # cmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046NzgwMC0w # NUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3Rh # bXBpbmcgQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA # sWylCpMIfbizJLY1kPXO2cmX2HRWvRbAmeKSZ5ex7/jCymdV7Eap+Ic2iqRtWDkK # Ke5gL6JV80wtn5C2qHJLPxUYFKNG3UkHkAI21MoCN+YWnhT8K/YuPib6+6970jdb # eFKIiZMWwd5hnpX9J3jeteuEdXbp/DfFBK15JuD3JOzWuF2suQCPgqYjQPk/gpq+ # 3KCKtXJRbXSCSJ9YtITU2IHwmfdE7l2PfZ154w041po+fDeTj0gJOzcV/Jv56Q0M # +w19jAKo/I5PEzrLV1IPQnmP4or1X4RbJXk8ONXyOOfXOxK2VLpNxgklK1yAezbF # P2uzqihaXkW1h9GQLGENKESnezwgdRaLNNaYtm8AT/pZHYJ35mZVqkZdMIckpQHJ # k/F1fSLyDKeKtH4TC4cc3ESKUMgItq07ZZm74JCsfhmrQ1ijVNDi1Sln+QBamgC7 # WviZbkQnceQRq9DY+6hANwOrasAZUiVr2kPuj1jHDOXzUG4O9QTK70P/oXSqZAN1 # oTv3UfF8JTGmAxg+l1ZPOz50MY96HBDw/3bI/wBGNvLk6fLVnrxGN5B5unF/lYvj # jWbIUdyBPVQnPOKXu08SRHbY19M1HoWX6PNZv+vzSeqVeWWHKdKjC3GjVjbbGpi+ # JLbiyaKRSwEqo49tJLvu69cQ7dWsbksai4TURnVj2mMCAwEAAaOCAcswggHHMB0G # A1UdDgQWBBSOg8leLTUOAglIZ+bjXpiD7RKSpzAfBgNVHSMEGDAWgBRraSg6NS9I # Y0DPe9ivSek+2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3Lm1pY3Jv # c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBU # aW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0wazBpBggr # BgEFBQcwAoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9N # aWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIw # MjAuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYD # VR0PAQH/BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYB # BQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBv # c2l0b3J5Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBAHJ1wHY86Zk5 # SUBDPY25d/u9YJVaaNa71uxjX4cyO/XJ4uPENCSOwkRTnNogPLxTD0Fg3z4TFf/2 # T/0IFSxdtWVtTjhzrn+WLInzeRawUhTCFVrPBJKEWVshm+Ig7/nB7JbJN88+ltIm # BbL5kT1StBLfG6UksAcDbNSQww90CUXhGueBxlnSvjkAX1ohiN16y1bB2s0rvQx8 # Csepl2CuBefTfDrMGzW/tzNx5YaK2D8OWweqTWZcGlJO4YjZNI83cTrQghfHl/8A # XOHj8cWL3wEFltQQs2xeRYAb3Kdnl7oIWKKXWaBYJY5P3QPsiC+DTMp7ejdYKTrb # 396f3gr+wL/Ms5/Z3vIWZPJJv18qNw40fUNveRnwzMQnx8dM2bGuXXQZ5y7P8aXT # 4HJMo349qZtn4XQwiUE/DDp++MUL0kgjvd/Deo7Xr371PFPPYb4TboZhjV1x9+wC # HDoOpNCBt+VuXU78ytJdKzQ1Jv2cEP1F9H9/wSLsMDUvWME7u9mGElOPDZPMVr8A # uBEuLdbTSEdaLwsZBplzxLBcgxhZ/Cs30yBhuE3QhqT1YDZ2pa56RexPA2SasPcT # oT6gJgJ6E06BmZ2zQTNvWOjs5XQqHbYuXcoeDcwe2UaC7EDOGD8GmLE9LiqtQsuQ # CM7v7I2xR+sPZT2Ax/85HjIkM+3MzTK1MYIHRjCCB0ICAQEweDBhMQswCQYDVQQG # EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylN # aWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFck # 05XgounJMQAAAAAAVzANBglghkgBZQMEAgEFAKCCBJ8wEQYLKoZIhvcNAQkQAg8x # AgUAMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcN # MjYxMDAyMTcwMzI3WjAvBgkqhkiG9w0BCQQxIgQg/ljZbH+4ge72ING/oKez0OG0 # dAsurStf65+4Jj+fHRowgbkGCyqGSIb3DQEJEAIvMYGpMIGmMIGjMIGgBCD1PJ9k # tQVuTGWIbKLO4f1VUOlUU29ARCEpDZmFTHjbUjB8MGWkYzBhMQswCQYDVQQGEwJV # UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNy # b3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFck05Xg # ounJMQAAAAAAVzCCA2EGCyqGSIb3DQEJEAISMYIDUDCCA0yhggNIMIIDRDCCAiwC # AQEwggEJoYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYD # VQQLEx5uU2hpZWxkIFRTUyBFU046NzgwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1p # Y3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5oiMKAQEw # BwYFKw4DAhoDFQD9LzE5nEJRAUE2Ss3xaKKPXHnLw6BnMGWkYzBhMQswCQYDVQQG # EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylN # aWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDANBgkqhkiG # 9w0BAQsFAAIFAO5pwe4wIhgPMjAyNjEwMDIwNTM4NTRaGA8yMDI2MTAwMzA1Mzg1 # NFowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA7mnB7gIBADAKAgEAAgIRZgIB/zAH # AgEAAgISHzAKAgUA7msTbgIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZ # CgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQAE # 2RA8Racgtq6Dmvtvb2R1HauVToD/lf6V9jOGLU6luc2VNwzbnsK5iOwonxn/ObtW # evTW3RFseid7pUSSHT4EuwDc6RW8jIMW576Xga4E0RiaEw3SEU9OGamPJOv+5xmP # Nhq8+qHgr6b2d6weeVeyTmTjLbZ8r9oJYlZGallO+kmXKBAM1TA7ITRBnOzdd4qb # oiEzYiVGI+tQvLhozVr5JmXdAj3FsUTbHBddklfaj1XR3vgb/JhYZGY9uy5Sz8di # 6GR1q1ZZNOqOFKM2qqgF8dYqlAY6fPpbhr4Auu6Ry2NMn2ryYkeCQKEJEnvuoGTq # tV3+5oPHwMuIEffBr0ctMA0GCSqGSIb3DQEBAQUABIICAGK83onusK5bxSXQoHvZ # 2etoMvpewg5kyi0iYz9ZOtJWzxnhHq+eSZzhbCcaNVbq9XeUKyL5cfgNjblMaJQe # Tr/K7/bgkkX1/mQjmE7gkKyBTWKF8NtE+vNGbYUnispM5BMaUzdrZTtKf2JPm/yF # B3ySqwOeG653ohSLYG6jowsHnz9BI7IicohloDmmPcwgIx3Vg05Zn0YKm0ExTeg4 # CA2XDdPWbJmjTSAZ1lNcyqtF9ib3TT2AeYAwQrjCblEJ024voD/eN4E6dFWipYtS # iSXyoU8jF1wrtxmcuU44ahNnh2v3lSzv+dX1rPdXqmaLW7GNRkuhi3AaYo8XKHU5 # U4w99+vsdJPyY3EpHpRNbjb7ErPsbxtZW6oqjEtGoVMm6slktQF2pVENDtpXresK # Dtw1w0AQ6+0bLVgeFUGtHRQ/esCXt4VLs9x18yE87WYNdo62wW8SaDXBNFs+HAfS # E5KE7Ax33pP7gjx3YRqhockeFD1T+dp4HIWnW9LPqonZf302H27WcgjFCyAcyvHF # 3324mAoHff3pUFnVS47ep9y/1RHjHN2z1azk81Lt7xronw17l0SSzVPRKuoZWXBM # Zq5FeDDRgdcZw/A7XOCGPt++3axawNNcfTg/nG/kYnyY3+KvXlMAa3ZkZMAL915I # LG6MJ5tS0SrbODNTzSN3J9/6 # SIG # End signature block |