Outputs/output-html.ps1
using module "..\CAMP.psm1" class html : CAMPOutput { $OutputDirectory = $null $DisplayReport = $True html() { $this.Name = "HTML" } RunOutput($Checks, $Collection) { <# OUTPUT GENERATION / Header #> # Obtain the tenant domain and date for the report $TenantDomain = ($Collection["AcceptedDomains"] | Where-Object { $_.InitialDomain -eq $True }).DomainName $ReportDate = "$(Get-Date -format 'dd-MMM-yyyy HH:mm') $($(Get-TimeZone).Id)" # Obtain the Remediation Report File name if ($null -eq $this.OutputDirectory) { $OutputDir = $this.DefaultOutputDirectory } else { $OutputDir = $this.OutputDirectory } $RemediationReportFileName = "$OutputDir\CAMP-$(Get-Date -Format 'yyyyMMddHHmm')-Remediation.html" # Summary $RecommendationCount = $($Checks | Where-Object { $_.Result -eq "Fail" }).Count $OKCount = $($Checks | Where-Object { $_.Result -eq "Pass" }).Count $InfoCount = $($Checks | Where-Object { $_.Result -eq "Recommendation" }).Count #> # Misc $ReportTitle = "Configuration Analyzer for Microsoft Purview" # Area icons $AreaIcon = @{} $AreaIcon["Default"] = "fas fa-user-cog" $AreaIcon["Data Loss Prevention"] = "fas fa-scroll" # Output start if ($null -ne $this.VersionCheck.Version) { $version = $($this.VersionCheck.Version.ToString()) } else { $Version = '' } $output = "<!doctype html> <html lang='en'> <head> <!-- Required meta tags --> <meta charset='utf-8'> <meta name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no'> <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css' crossorigin='anonymous'> <link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css' integrity='sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T' crossorigin='anonymous'> <script src='https://code.jquery.com/jquery-3.3.1.slim.min.js' integrity='sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo' crossorigin='anonymous'></script> <script src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js' integrity='sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1' crossorigin='anonymous'></script> <script src='https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js' integrity='sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM' crossorigin='anonymous'></script> <script src='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/js/all.js'></script> <style> .navbar-custom { background-color: #005494; color: white; padding-bottom: 10px; } /* Modify brand and text color */ .navbar-custom .navbar-brand, .navbar-custom .navbar-text { color: white; padding-top: 70px; padding-bottom: 10px; } .card-header { background-color: #0078D4;; color: white; } .table-borderless td, .table-borderless th { border: 0; padding:5px; } .bd-callout { padding: 1.25rem; margin-top: 1.25rem; margin-bottom: 1.25rem; border: 1px solid #eee; border-left-width: .25rem; border-radius: .25rem } .bd-callout h4 { margin-top: 0; margin-bottom: .25rem } .bd-callout p:last-child { margin-bottom: 0 } .bd-callout code { border-radius: .25rem } .bd-callout+.bd-callout { margin-top: -.25rem } .bd-callout-info { border-left-color: #5bc0de } .bd-callout-info h4 { color: #5bc0de } .bd-callout-warning { border-left-color: #f0ad4e } .bd-callout-warning h4 { color: #f0ad4e } .bd-callout-danger { border-left-color: #d9534f } .bd-callout-danger h4 { color: #d9534f } .bd-callout-success { border-left-color: #00bd19 } .app-footer{ background-color: #005494; color: white; padding-top:2px; padding-bottom :2px; } .star-cb-group { /* remove inline-block whitespace */ font-size: 0; /* flip the order so we can use the + and ~ combinators */ unicode-bidi: bidi-override; direction: rtl; /* the hidden clearer */ } .star-cb-group * { font-size: 1rem; } .star-cb-group > input { display: none; } .star-cb-group > input + label { /* only enough room for the star */ display: inline-block; overflow: hidden; text-indent: 9999px; width: 1.7em; white-space: nowrap; cursor: pointer; } .star-cb-group > input + label:before { display: inline-block; text-indent: -9999px; content: ""\2606""; font-size: 30px; color: #005494; } .star-cb-group > input:checked ~ label:before, .star-cb-group > input + label:hover ~ label:before, .star-cb-group > input + label:hover:before { content:""\2605""; color: #e52; font-size: 30px; text-shadow: 0 0 1px #333; } .star-cb-group > .star-cb-clear + label { text-indent: -9999px; width: .5em; margin-left: -.5em; } .star-cb-group > .star-cb-clear + label:before { width: .5em; } .star-cb-group:hover > input + label:before { content: ""\2606""; color: #005494; font-size: 30px; text-shadow: none; } .star-cb-group:hover > input + label:hover ~ label:before, .star-cb-group:hover > input + label:hover:before { content: ""\2605""; color: #e52; font-size: 30px; text-shadow: 0 0 1px #333; } </style> <title>$($ReportTitle)</title> </head> <body class='app bg-light'> <nav class='navbar navbar-custom' > <div class='container-fluid'> <div class='col-sm' style='text-align:left'> <div class='row'><div><i class='fas fa-binoculars'></i></div><div class='ml-3'><strong>Configuration Analyzer for Microsoft Purview (CAMP)</strong></div></div> </div> <div class='col-sm' style='text-align:right'> <button type='button' class='btn btn-primary' onclick='javascript:window.print();'>Print</button> <BR/> </div> </div> </nav> <div class='app-body p-3'> <main class='main'> <!-- Main content here --> <div class='container' style='padding-top:10px;'></div> <div class='card'> <div class='card-body'> <h2 class='card-title'>$($ReportTitle)</h2>" $Output += "<div style='text-align:right;margin-top:-65px;margin-right:8px;color:#005494;';> <b>Rate this report</b> </div> <div style='text-align:right;margin-top:-10px';> <span class='star-cb-group'> <input type='radio' id='rating-5' name='rating' value='5' onclick=""window.open('https://aka.ms/mcca-feedback-5','_blank');"" /> <label for='rating-5'>5</label> <input type='radio' id='rating-4' name='rating' value='4' onclick=""window.open('https://aka.ms/mcca-feedback-4','_blank');"" /> <label for='rating-4'>4</label> <input type='radio' id='rating-3' name='rating' value='3' onclick=""window.open('https://aka.ms/mcca-feedback-3','_blank');"" /> <label for='rating-3'>3</label> <input type='radio' id='rating-2' name='rating' value='2' onclick=""window.open('https://aka.ms/mcca-feedback-2','_blank');"" /> <label for='rating-2'>2</label> <input type='radio' id='rating-1' name='rating' value='1' onclick=""window.open('https://aka.ms/mcca-feedback-1','_blank');"" /> <label for='rating-1'>1</label> <input type='radio' id='rating-0' name='rating' value='0' class='star-cb-clear' /> <label for='rating-0'>0</label> </span> </div>" if ($(Test-Path -Path "$PSScriptRoot\..\Image\logo.jpg") -eq $True) { $Output += "<img src='$PSScriptRoot\..\Image\logo.jpg' align='right' width='250px' height='150px'/> " } $Output += "<strong>Version $version </strong> <p> CAMP assesses your compliance posture, highlights risks and recommends remediation steps to ensure compliance with essential data protection and regulatory standards.</p>" $Output += "<table><tr><td> <strong>Date</strong> </td> <td><strong>: $($ReportDate)</strong> </td> </tr> " if ($Collection["GetOrganisationConfig"] -ne "Error") { $OrganisationName = $Collection["GetOrganisationConfig"].DisplayName if (($null -ne $($OrganisationName)) -and ($($OrganisationName) -ne "")) { $output += " <tr><td><strong>Organization </strong> </td> <td><strong>: $($OrganisationName)</strong> </td></tr> " } } if (($null -ne $($TenantDomain)) -and ($($TenantDomain) -ne "")) { $output += " <tr><td><strong>Tenant </strong> </td> <td><strong>: $($TenantDomain)</strong> </td></tr> " } $TenantGeoLocations = $Collection["GetOrganisationRegion"] | Where-Object { $_ -ne "INTL" } if ($TenantGeoLocations -ne "Error") { $RegionString = "" $NumberToRegionMapping = Get-NumberRegionMappingHashTable foreach ($Region in $TenantGeoLocations) { foreach ($Numbers in $($NumberToRegionMapping.Keys)) { if ($($NumberToRegionMapping[$Numbers].Code) -eq $Region) { if ($RegionString -eq "") { $RegionString += "$($NumberToRegionMapping[$Numbers].Description)" } else { $RegionString += ", $($NumberToRegionMapping[$Numbers].Description)" } } } } $output += " <tr><td><strong>Note </strong> </td> <td><strong>:</strong> The following report is customized for following geolocation(s): $RegionString</td></tr> " } else { $output += " <tr><td><strong>Note </strong> </td> <td><strong>:</strong> The following report is generalized on all geolocations</td></tr> " } $output += " </table>" <# OUTPUT GENERATION / Version Warning #> If ($this.VersionCheck.Updated -eq $False) { $Output += " <div class='alert alert-danger pt-2' role='alert'> CAMP is out of date. You're running version $($this.VersionCheck.Version) but version $($this.VersionCheck.GalleryVersion) is available! Run Update-Module CAMP to get the latest definitions! </div> " } $Output += "</div> </div>" <# OUTPUT GENERATION / Summary cards #> $Output += "<br/>" <# OUTPUT GENERATION / Summary #> $Output += " <div class='card m-3'> <a name='Solutionsummary'></a> <div class='card-header'> Solutions Summary </div> <div class='card-body'>" $Output += "<table class='table table-borderless'> <tr> <td width='20'><i class='fas fa-user-cog'></i> <td><strong>All Solutions</strong></td> <td align='right'> <span class='badge badge-secondary' style='padding:15px;text-align:center;width:40px;"; $output += "'>$($InfoCount)</span> <span class='badge badge-warning' style='padding:15px;text-align:center;width:40px;"; $output += "'>$($RecommendationCount)</span> <span class='badge badge-success' style='padding:15px;text-align:center;width:40px;"; $output += "'>$($OkCount)</span> </td> </tr> " ForEach ($ParentArea in ($Checks | Where-Object { $_.Completed -eq $true } | Group-Object ParentArea)) { $Icon = $AreaIcon["Default"] If ($Null -eq $Icon) { $Icon = $AreaIcon["Default"] } $Output += " <tr > <td width='20'><i class='$Icon'></i> <td><strong>$($ParentArea.Name)</strong></td> </tr> " ForEach ($Area in ($Checks | Where-Object { $_.Completed -eq $true } | Where-Object { $_.ParentArea -eq $ParentArea.Name } | Group-Object Area)) { $Pass = @($Area.Group | Where-Object { $_.Result -eq "Pass" }).Count $Fail = @($Area.Group | Where-Object { $_.Result -eq "Fail" }).Count $Info = @($Area.Group | Where-Object { $_.Result -eq "Recommendation" }).Count $Output += " <tr> <td width='20'> <td style='vertical-align:middle;'> <i class='fa fa-cog'></i> <a href='`#$($Area.Name)'>$($Area.Name)</a></td> <td align='right' style='vertical-align:middle;'> <span class='badge badge-secondary' style='padding:10px;text-align:center;width:30px;"; $output += "'>$($Info)</span> <span class='badge badge-warning' style='padding:10px;text-align:center;width:30px;"; $output += "'>$($Fail)</span> <span class='badge badge-success' style='padding:10px;text-align:center;width:30px;"; $output += "'>$($Pass)</span> </td> </tr> " } } $Output += " <tr><td colspan='3' style='text-align:right'> <span class='badge badge-secondary'style='padding:5px;text-align:center'> </span> Recommendation <span class='badge badge-warning'style='padding:5px;text-align:center'> </span> Improvement <span class='badge badge-success' style='padding:5px;text-align:center'> </span> OK </td></tr></table>" $Output += " </div> </div> " <# OUTPUT GENERATION / Zones #> [bool] $UncompletedChecks = $False [string] $UncompletedChecksName = "" ForEach ($Area in ($Checks | Where-Object { $_.Completed -eq $False } | Group-Object Area)) { if ($UncompletedChecks -eq $False) { $UncompletedChecks = $True } # Each check if ($UncompletedChecksName -eq "") { $UncompletedChecksName += "Note: There was an issue in fetching $($Area.Name)" } else { $UncompletedChecksName += ", $($Area.Name)" } } if ($UncompletedChecks -eq $True) { $UncompletedChecksName += " information. Please try running the tool again after some time." $Output += " <div style='color:red;'> $UncompletedChecksName </div>" } ForEach ($Area in ($Checks | Where-Object { $_.Completed -eq $True } | Group-Object Area)) { # Write the top of the card $CollapseId = $($Area.Name).Replace(" " , "_") $Output += "<a name='$($Area.Name)'></a> <div class='card m-3'> <div class='card-header'> <div class=""row""> <div class='col-sm' style='text-align:left; margin-top:auto; margin-bottom:auto;'><a>$($Area.Name)</a></div> <div class='col-sm' style='text-align:right; padding-right:10px;'> <span id='more_$($CollapseId)' data-toggle='collapse' data-target='#$($CollapseId)_body'> <i class='fas fa-chevron-down' > </i> </span> </div> </div> </div> <div class='card-body collapse show' id='$($CollapseId)_body'>" # Each check [int] $count = 1 ForEach ($Check in ($Area.Group | Sort-Object Result -Descending)) { $RemediationActionsExist = $false $CheckCollapseId = $($CollapseId) + $count.ToString() If ($Check.Result -eq "Pass") { $CalloutType = "bd-callout-success" $BadgeType = "badge-success" $BadgeName = "OK" $Icon = "fas fa-thumbs-up" $IconColor = "green" $Title = $Check.PassText } ElseIf ($Check.Result -eq "Recommendation") { $CalloutType = "bd-callout-secondary" $BadgeType = "badge-secondary" $BadgeName = "Recommendation" $Icon = "fas fa-thumbs-up" $IconColor = "gray" $Title = $Check.FailRecommendation } Else { $CalloutType = "bd-callout-warning" $BadgeType = "badge-warning" $BadgeName = "Improvement" $Icon = "fas fa-thumbs-down" $IconColor = "#e5ad06" $Title = $Check.FailRecommendation } $Output += " <div class='row border-bottom' style='padding:5px; vertical-align:middle;'> <div class='col-sm-10' style='text-align:left; margin-top:auto; margin-bottom:auto;'><h6>$($Check.Name)</h6></div> <div class='col' style='text-align:right;padding-right:10px;'> <h6> <span class='badge $($BadgeType)'>$($BadgeName)</span> <i class='fas fa-chevron-down' data-toggle='collapse' data-target='#$($CheckCollapseId)'></i> </h6> </div> </div> " $Output += " <div class='row collapse' id='$($CheckCollapseId)'> <div class='bd-callout $($CalloutType) b-t-1 b-r-1 b-b-1 p-3' > <div class='container-fluid'> <div class='row'> <div><i class='$($Icon)' color='$($IconColor)'></i></div> <div class='col-8'><h6>$($Title)</h6></div> </div>" if ($Check.Importance) { $Output += " <div class='row p-3'> <div><p>$($Check.Importance)</p></div> </div>" } If ($Check.ExpandResults -eq $True) { # We should expand the results by showing a table of Config Data and Items $Output += " <div class='row pl-2 pt-3'>" if ($Check.Control -ne "Compliance Manager") { $Output += " <table class='table'> <thead class='border-bottom'> <tr>" If ($Check.CheckType -eq [CheckType]::ObjectPropertyValue) { # Object, property, value checks need three columns $Output += " <th align='center' text-align='center'>$($Check.ObjectType)</th> <th align='center' text-align='center'>$($Check.ItemName)</th> <th align='center' text-align='center'> $($Check.DataType)</th> <th align='center' text-align='center'>Status</th> " } Else { $Output += " <th align='center' text-align='center'>$($Check.ItemName)</th> <th align='center' text-align='center'>$($Check.DataType)</th> <th align='center' text-align='center'>Status</th> " } $Output += " <th style='width:50px'></th> </tr> </thead> <tbody> " ForEach ($o in $Check.Config | Sort-Object Level -Descending) { $ActionRequired = $false if ($o.Level -ne [CAMPConfigLevel]::None -and $o.Level -ne [CAMPConfigLevel]::Recommendation) { $oicon = "fas fa-check-circle text-success" $LevelText = $o.Level.ToString() } ElseIf ($o.Level -eq [CAMPConfigLevel]::Recommendation) { $oicon = "fas fa-info-circle text-muted" $LevelText = $o.Level.ToString() } Else { $oicon = "fas fa-times-circle text-danger" $LevelText = "Improvement" $ActionRequired = $true } $Output += " <tr> " if ($($o.RemediationAction)) { $RemediationActionsExist = $true } If ($Check.CheckType -eq [CheckType]::ObjectPropertyValue) { # Object, property, value checks need three columns $Output += " <td>$($o.Object)</td> <td style='word-wrap:break-word;' width = '35%'>$($o.ConfigItem)</td> <td style='word-wrap:break-word;' width = '30%'>$($o.ConfigData)</td> " } Else { $Output += " <td>$($o.ConfigItem)</td> <td style='word-wrap:break-word;' width = '35%'>$($o.ConfigData)</td> " } $Output += " <td style='text-align:left'> <div class='row badge badge-pill badge-light'>" if ($o.Level -eq [CAMPConfigLevel]::Informational) { $Output += "<span style='vertical-align: left;'>$($LevelText)</span><br/></div>" } else { $Output += "<span class='$($oicon)' style='vertical-align: left;'></span> <span style='vertical-align: left;'>$($LevelText)</span><br/></div>" } if ($ActionRequired -eq $true -and $($o.RemediationAction)) { $Output += " <span style='vertical-align: left;'><small><center>Remediation Available</center></small></span> " } $Output += " </td> </tr> " # Recommendation segment #if($o.Level -eq [CAMPConfigLevel]::Recommendation) #{ if (($null -ne $($o.InfoText)) -and ($($o.InfoText) -ne "" ) ) { $Output += " <tr>" If ($Check.CheckType -eq [CheckType]::ObjectPropertyValue) { $Output += "<td colspan='4' style='border: 0;'>" } else { $Output += "<td colspan='3' style='border: 0;'>" } $Output += " <div class='alert alert-light' role='alert' style='text-align: left;'> <span class='fas fa-info-circle text-muted' style='vertical-align: left; padding-right:5px'></span> <span style='vertical-align: middle;'>$($o.InfoText)</span> </div> " $Output += "</td></tr> " } } #} $Output += " </tbody> </table>" } # If any links exist If ($Check.Links) { $Output += " <table class='table'> <tr>" $LinksInfo = $Check.Links [int] $CountOfLinks = $LinksInfo.Keys.Count [int] $itr = 0 $LinksNameValuePair = $LinksInfo.GetEnumerator() | Sort-Object -Property Name while ($itr -lt $CountOfLinks) { $Output += " <td style='padding-top:20px;'><i class='fas fa-external-link-square-alt'></i> <a href='$($LinksNameValuePair.Value[$itr])' target=""blank"">$($LinksNameValuePair.Name[$itr])</a></td> " $itr = $itr + 1 } if ($RemediationActionsExist -eq $true) { $Output += " <td ><a class='btn btn-primary' href='$($RemediationReportFileName)' target='_blank' role='button'>Remediation Script</a></td> " } $Output += " </tr> </table> " $Output += " </table> " } $Output += " </div>" } $Output += " </div> </div> </div> " $count += 1 } # End the card $Output += " <div class='col-sm' style='text-align:right; padding-right:10px;'> <a href='#Solutionsummary'>Go to Solutions Summary</a></div> </div> </div>" } <# OUTPUT GENERATION / Footer #> $Output += " </main> <center>Bugs? Issues? Suggestions? <a href='https://github.com/OfficeDev/CAMP'>GitHub</center> </div> <footer class='app-footer'> <p><center><i> Disclaimer: Recommendations from (CAMP) should not be interpreted as a guarantee of compliance. It is up to you to evaluate and validate the effectiveness of customer controls per your regulatory environment. <br> </i></center> </p></footer> </body> </html>" # Write to file $Tenant = $(($Collection["AcceptedDomains"] | Where-Object { $_.InitialDomain -eq $True }).DomainName -split '\.')[0] $ReportFileName = "CAMP-$($tenant)-$(Get-Date -Format 'yyyyMMddHHmm').html" $OutputFile = "$OutputDir\$ReportFileName" $Output | Out-File -FilePath $OutputFile If ($this.DisplayReport) { Invoke-Expression $OutputFile } $this.Completed = $True $this.Result = $OutputFile } } # SIG # Begin signature block # MIIl1QYJKoZIhvcNAQcCoIIlxjCCJcICAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCRa2Asf9NWK0hM # 4sChcFJW7uufdFSgUAHy13Y4sj6f8KCCC6EwggUGMIID7qADAgECAhMzAAAE4xrK # 0/aegtm7AAEAAATjMA0GCSqGSIb3DQEBCwUAMHkxCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBD # QSAyMDEwMB4XDTIxMDkwMjE5MjYyOFoXDTIyMDkwMTE5MjYyOFowfDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdQ29kZSBTaWdu # IFRlc3QgKERPIE5PVCBUUlVTVCkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK # AoIBAQDokaNBqvPFgH8yAnEicnWyLoQ58nf7j+B20b5uqsDq9EXWyt87+Wc9CCFh # +9gxWx6wx+iRsO/yT8SZhxi/w00uxM5jDWnbAbSIMB2VrNnLGNOxAQj674zPskBs # ecseXAMHA/+o5ujZOse4EorLmTfJ5f/Zzun8KVVwlSd1CVlj0hgk28xmTdLV7ZWw # 0wV9e/0p/XOHSRUNWw8gFfIfzli3oVV4H/DzT2o1jD4HIt3QIX1kRRXVqleASUgD # Z6/6JthrKti4xfyMdSUGyXuxEoe6zZ4EOXltaHw7hqZzH2Ufl3UxB6HmdxvG9BI4 # 3LVKq3pFO+Nj3NdMVkyptnjDJnGpAgMBAAGjggGCMIIBfjATBgNVHSUEDDAKBggr # BgEFBQcDAzAdBgNVHQ4EFgQUPMsdBtvwLsgDf0B50WrJSL+NYrEwUAYDVR0RBEkw # R6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNv # MRYwFAYDVQQFEw0yMzAwNzIrNDY3NjA2MB8GA1UdIwQYMBaAFL9loqtvdaNORZZX # Bc85h/TAFRwcMFwGA1UdHwRVMFMwUaBPoE2GS2h0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRlc3RpbmclMjBQQ0ElMjAyMDEw # KDEpLmNybDBpBggrBgEFBQcBAQRdMFswWQYIKwYBBQUHMAKGTWh0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGVzdGluZyUy # MFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQAD # ggEBAAylFduuUCCNS+ejRtNeqm7geSoNzl+E0wbGZi4W9+rqo972KaS338FB5Y5G # 8PNqaN3RNqNaHra/zI97JaLYjrZ+iCmKMzROdVS5cR/WpAla36J/tpuVSvNwwvW1 # 5KHRv6PEzGQ7BQYU55cMTkUwNtRVbARMdjcFa3pbuIkioVsoFNVOZ4e8aOSPV+Vz # PVmOU2xltmM/8IOgTSfFTCJhqY7d/vjqajXAXg2olbbJ2vX051uUuFfIyfo/5xJS # uyWOUCZ1opzXHy5EwrkmdZs6orQtMy1akT6UYjl4x5VZsqiszDshDNjVgRUdR97M # d7NxQZEScdZfoTf0byI8Cwtp8JIwggaTMIIEe6ADAgECAhMzAAAALTV6RojJB3HY # AAAAAAAtMA0GCSqGSIb3DQEBCwUAMIGQMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMTowOAYDVQQDEzFNaWNyb3NvZnQgVGVzdGluZyBSb290IENl # cnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIwMTIxMDIwNDMyMFoXDTM1MDYx # NzIxMDQxMVoweTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEj # MCEGA1UEAxMaTWljcm9zb2Z0IFRlc3RpbmcgUENBIDIwMTAwggEiMA0GCSqGSIb3 # DQEBAQUAA4IBDwAwggEKAoIBAQC/PGCBq77s/9cXY/KmQtETYpywF866Rhp7Ii5V # c5pUucbU0cqY/ndHDY6d8F7M+FTv8s8q1GLxqTQKBNfFBYbyEPVN05YIZoXbAn0Y # 3OJ6I6eaKV2ueRjPDGPwGv+BqalDP6kLuVHxs0g6/EQuXxHFVjr/yg7NiAjB/cfV # 9T7v6k4bcosjvUU3nh9wwafJuCBz7fNsPYshBc93Ev6h3AfpDVt4CWwyVRBH0DfI # x/f6c/5GNORWFqg3ZFPWNfvDgLaOtoaRoRDWwUr243rUEQqy3i6eEJfgga4SXYgB # XcykxChSnGDwCuaIr0vpV4rsow83Hin2XSHT19pdDslO241tAgMBAAGjggH6MIIB # 9jAOBgNVHQ8BAf8EBAMCAYYwEgYJKwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3 # FQIEFgQU6p9fM7bQX56t6y2mwQK7QDjL57UwHQYDVR0OBBYEFL9loqtvdaNORZZX # Bc85h/TAFRwcMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV # HSMEGDAWgBSjAQR+MIgz67kxnMrrhXZn/GW00TBZBgNVHR8EUjBQME6gTKBKhkho # dHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNUZXNS # b29DZXJBdXRfMjAxMC0wNi0xNy5jcmwwgY0GCCsGAQUFBwEBBIGAMH4wTQYIKwYB # BQUHMAKGQWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljVGVz # Um9vQ2VyQXV0XzIwMTAtMDYtMTcuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8vb25l # b2NzcC5taWNyb3NvZnQuY29tL29jc3AwDQYJKoZIhvcNAQELBQADggIBACe00IWy # nswPpCpTc9Vt2tcxAMj2/2PI9gERtRiS2ty0+a8m6PxKeb3BZ7CIA3llzzU1BViO # 4oMGlvW6fhJZUJvg8NU9nQnzu0bNh7104nfQRgZ6IhppK2QsuYs5gAzqgiciojBX # IiTZIT+raUa3w6/Bxl682Y+RViOTqfImLkR29LpyI9GZb1tFZFPilZTxtkhAv3fw # sTiUc5ACLGsBCJZ6zlLOnZTzkTSct1oOvnD8jbwn9nX7jNbU1qjWmtUI6quiyeg1 # R9V/WS+zB9bcVjaXU+IBinywbI7nsZrO1d0GgQ4FwMt519w+tr340t0QXfo2QTSD # 711uiQVjsrGFQnxakyIKY3jKP0soUu9Bty0Ywklj0TAcWJ+bamBqJpp8oXUbLP42 # u4nMQSCnKwyj9/0BUFD+oJ09BAYRandAMhp5/i2z1BPH5GYMoIEMxMUuAWaaFu1R # jQlaMuQqfuyjP8shwNSV7+nlOIUPhWF9mcBy9hAdd+6yWfKn7K6FbMBKcBA2c4g7 # p9zUkUjCQORwz6T9Oyl8BqPMeihIDBeSs5auNENXrAjRjMxUesTJDSFnk2chdsve # WtOQ4+N/c0G7WdpI0RrJJ25K0NsVWNXdNegQ0SdmK6AkphLCaHOhgczWeCKk3ms1 # 2omIrm6SnoTwsPOLeXn/tdy0lBjf5mAcMmiyMYIZijCCGYYCAQEwgZAweTELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEjMCEGA1UEAxMaTWljcm9z # b2Z0IFRlc3RpbmcgUENBIDIwMTACEzMAAATjGsrT9p6C2bsAAQAABOMwDQYJYIZI # AWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGC # NwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIILp4mo8RNoTtkPT # RzRZv0i1CJnzrvjFzqGr9ZLcMBRSMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkA # YwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZI # hvcNAQEBBQAEggEA4nFEYIRloO20Q297l7hrbcM9cen8MiISc3FnHOU2jp/uWJi4 # r0FN/lPu7K11KFXYAg7a3z00ndka7Oz29A5Rgk2oik+xoQBfPcGkOZFm3lIVwaz6 # pnsIqiYdO+gPjnW2vrt/o73hCVSzEqgICQNmqdHBtiiwQPwaW9Cjbup4wzvfjMqv # OylYaQpMWBTuiKIEVFlvq6dVNZ/QCzfBh+0rC4rByFqcGNmyqExCqGjgUze0Qdtp # QuNAKkMHmr8GxpoSHmwFbl/2JOsoU6sjZYDVnknzZo4YHkYM5KiZQPalzWt40KQM # jhO2YeLzqGWJCRdhROTk68F3o6XSZ77tP1MuIKGCFxkwghcVBgorBgEEAYI3AwMB # MYIXBTCCFwEGCSqGSIb3DQEHAqCCFvIwghbuAgEDMQ8wDQYJYIZIAWUDBAIBBQAw # ggFZBgsqhkiG9w0BCRABBKCCAUgEggFEMIIBQAIBAQYKKwYBBAGEWQoDATAxMA0G # CWCGSAFlAwQCAQUABCDUTlkGZ6pruSKa/eogronjdr7w5ZcWMxEexvYvlRy7jAIG # Yp4CfoRMGBMyMDIyMDYxMDA0MTEzNi4wNThaMASAAgH0oIHYpIHVMIHSMQswCQYD # VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3Nv # ZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBU # U1MgRVNOOkEyNDAtNEI4Mi0xMzBFMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T # dGFtcCBTZXJ2aWNloIIRaDCCBxQwggT8oAMCAQICEzMAAAGNelUueHSZKrcAAQAA # AY0wDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAw # HhcNMjExMDI4MTkyNzQ1WhcNMjMwMTI2MTkyNzQ1WjCB0jELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxh # bmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjpB # MjQwLTRCODItMTMwRTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy # dmljZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANo0SC2YPjulO3S3 # LsATzAftLSVM9MBy6ieX+yiV0LE81k6AA1DGFeMVWZ6fZj01qI1Cf5dzuF6noCwz # XbhQDm3Iray8mORw7MQH1Btf9mIpXEpEj+gnDKln7EsFCxl+c5bFShye7b8INusu # ni5JVHRTKYqtveE+LiUHV3eTu5hctL1ZGhjxsTVi22cSjc6irRZ1kO4zLWdOV72n # 5CFmazUxb/BhqQJR7UbGdQPCg6OiA0hlTWWV20LPnzsDDhqfwc6HfH9WCPBm9qDf # 5sdnHL3Rq/ZWueUGXlbDOy302hD0MW4AHC4Fg5SD3Jk83AZLBMyzkLEqQc7Kj2li # PcpFcOaH5q5BSjG6UE+RDJItrLiaFTOcRoHWVp7f7c9NMbmz0ihYuAeCDBVAfZnA # DVKvXB2i7B2wyfgFLFTtKp1Y8M1z2CXkewvwfF9FJelJCHaZWZp3EGUgSt8mUMvq # BrLiSlxQKtwZcU+pA7oWGLzu4rS6z3mNJJ7rdaypMaJvrourwnbYQn5wIspJ8kQt # pZJ6s8/MdZg5EOUOjsfaev5XbhbqUiTLYLAjzfXyL636aTAxSL0aFC7BznSyY60Z # YvHKOTPr2Zn9tKE8WLl8zNLW0bqxCcnAeWTG8M57BR8pjpIMsfDnhZ11d3Gq+Obn # oyNQdYqlA23kjcZ73M7joXKc8GnJAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUeMyR # boefRsKU7ko7uEk3H5YoZpMwHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ # 6XIwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aW9wcy9jcmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSku # Y3JsMGwGCCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIw # UENBJTIwMjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEF # BQcDCDANBgkqhkiG9w0BAQsFAAOCAgEANa9zs9JRKt1b6XRZYd2AcXOIZ2JAC8mD # w2vRTuF4KsJAZvC7G/pSt7WxhoKYukCWyt4jNwStDmwXMEWiVQsRixra+ic/YUbp # kchfKOJ9st2Iir+KJQcTYxUoUhnPRNvSZlYwZi4Jn40aj3P9qw9uauKMOLgN63PX # pImrn4BoXEgHXpP5fpAEm86ITrf+c9viJYE+Ht2rklM7dhgCnymQdNmQxliingmN # 6RC49bboesn6ziTzyJzuGWS1t74Cmr7S/HuhSWciaAxTHsCefaBC/gCt3tjNiOCB # RPZ+i1UvG0vVGzFDL6wJVzeWTNiPBnRwfU23yNe1pv/VH+KrufPDyTe7wiY/bPis # Wal3ObBknC4Koj6iG2zUxPvwBGf3k4sXPWC4E8jKmpGSOfcBqo6zjUEmO7tFRA5B # BOopM/hUhUSis6ckm9Fk4DL1sbC725zfAApiEj5wR2GaBrLDwC+36BhihS3QAU0A # tj19fVo638q7IR3YqkpQrKaiBgU8UWh7cjzK6Nwf9uoD3wpdzAt6wtzRquMRpyBw # 2Rkos1JhoPE5EAJaFXVOXSdb/ddII8WsWlK2hoT/CLbRNEVp1OV0af7BmjZg3DMG # 8h7kqWhbJ90NtTs4rT+AZzebaax2p4AAu46HuM5i55kZwIlHPbEakNm5rDAL1KbD # vJ5ThZojNS8wggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqG # SIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkg # MjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBU # aW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC # AgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4X # YDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTz # xXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7 # uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlw # aQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedG # bsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXN # xF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03 # dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9 # ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5 # UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReT # wDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZ # MBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8 # RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAE # VTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAww # CgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQD # AgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb # 186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29t # L3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoG # CCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZI # hvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9 # MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2Lpyp # glYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OO # PcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8 # DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA # 0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1Rt # nWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjc # ZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq7 # 7EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJ # C4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328 # y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIC # 1zCCAkACAQEwggEAoYHYpIHVMIHSMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz # aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv # cnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25z # IExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOkEyNDAtNEI4Mi0xMzBF # MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYF # Kw4DAhoDFQCAc5WTPU0TQ+D4LaS1kGZEj2FXCaCBgzCBgKR+MHwxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBU # aW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3DQEBBQUAAgUA5k0eFjAiGA8yMDIy # MDYxMDA5MzQxNFoYDzIwMjIwNjExMDkzNDE0WjB3MD0GCisGAQQBhFkKBAExLzAt # MAoCBQDmTR4WAgEAMAoCAQACAh1XAgH/MAcCAQACAhHNMAoCBQDmTm+WAgEAMDYG # CisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEA # AgMBhqAwDQYJKoZIhvcNAQEFBQADgYEAaIo6hIgeiMujDoqSST+vws/a1yI/N3kV # yfn2j1PMAeKAKpRfQIvG406EzDh3VxNDUeDx8IahB4lun9ujfGfF7FB8sb1W1VyE # v9KeINMi0wygT9N556XclL9vVWsNWVUK0Uj2uwCQXzCbXuT9BSJPv9xV8bIGp4oH # AtqFIQvz07gxggQNMIIECQIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg # MjAxMAITMwAAAY16VS54dJkqtwABAAABjTANBglghkgBZQMEAgEFAKCCAUowGgYJ # KoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCBa4b/QcPRo # WVCCfFIzKBQR06/q69rC+FikrHw9+wktKzCB+gYLKoZIhvcNAQkQAi8xgeowgecw # geQwgb0EIJ6WETP6HV5AwJ839rnS+evVvHHxk4MFbnp0PLbSGM1/MIGYMIGApH4w # fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl # ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd # TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAGNelUueHSZKrcAAQAA # AY0wIgQgs3rbo4oG3glpIsghVOu6gDNwA3qyRRT3mEVOrvYqKIIwDQYJKoZIhvcN # AQELBQAEggIAkpv0v2oTZN9yv9quFh8FkvOsWl2q9LB13I9PRr12o/SmIdnsplY0 # 95r5nCo3omOHN7Lw90ld37rKbjValqGM8LXgqY1n9w1LtWse182lqJ78211KAMx7 # KOsFkO4L+Io9SI0HFmb+hC+cTsDG9jWld+/KpsDyQclAKGRLKqi73nYt6HeUf91x # eImS+jjVEp/fg3NEMrX0gDksR1792vsQ0i1ioLzGRs7Pf5cdN2pjliA2v/JZXZpk # zYEg7+xNaWhTQPe6otj78+zZOgbzkPYcTSaVrJSest8zcWX8sqC8b078m0cWjTwk # 8dG6uVxq3LzF9Som6Kbyq57aodQ77AXS3EJLbrpKpgppgzuNlReW/GCgFkt4ZTTt # y/qQwU5YTYpzHYqWhLupfubgQDRtcY2mPnwmRsaSkB+nLEmReMK/iBXwUCs/0j8J # JLWSj+25qgbaHr3tS1KYhnMu8HnDgHQUX4K7/YK9tXrMCyDLkDnI9Z5+XXgJYTBM # mU0nMYnEUFS5istIpl1i8JxyTAwKxm5vCtrvd56a1O39C0NsUwntmRumv4SOMkWv # 8i1InalrKs67ODSlJtB1f+nrzd0Eq1yg2e85iEmfSQySWbeB/e0rwRogIY+XkAmJ # RVk+ce76Mk1nDGItOZg2nP2+ZpvMmJHc5U72KpE5XkUSLMqoCSCYzQA= # SIG # End signature block |