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 # MIIlyAYJKoZIhvcNAQcCoIIluTCCJbUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # 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/tdy0lBjf5mAcMmiyMYIZfTCCGXkCAQEwgZAweTELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEjMCEGA1UEAxMaTWljcm9z # b2Z0IFRlc3RpbmcgUENBIDIwMTACEzMAAATjGsrT9p6C2bsAAQAABOMwDQYJYIZI # AWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGC # NwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIILp4mo8RNoTtkPT # RzRZv0i1CJnzrvjFzqGr9ZLcMBRSMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkA # YwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZI # hvcNAQEBBQAEggEA4nFEYIRloO20Q297l7hrbcM9cen8MiISc3FnHOU2jp/uWJi4 # r0FN/lPu7K11KFXYAg7a3z00ndka7Oz29A5Rgk2oik+xoQBfPcGkOZFm3lIVwaz6 # pnsIqiYdO+gPjnW2vrt/o73hCVSzEqgICQNmqdHBtiiwQPwaW9Cjbup4wzvfjMqv # OylYaQpMWBTuiKIEVFlvq6dVNZ/QCzfBh+0rC4rByFqcGNmyqExCqGjgUze0Qdtp # QuNAKkMHmr8GxpoSHmwFbl/2JOsoU6sjZYDVnknzZo4YHkYM5KiZQPalzWt40KQM # jhO2YeLzqGWJCRdhROTk68F3o6XSZ77tP1MuIKGCFwwwghcIBgorBgEEAYI3AwMB # MYIW+DCCFvQGCSqGSIb3DQEHAqCCFuUwghbhAgEDMQ8wDQYJYIZIAWUDBAIBBQAw # ggFVBgsqhkiG9w0BCRABBKCCAUQEggFAMIIBPAIBAQYKKwYBBAGEWQoDATAxMA0G # CWCGSAFlAwQCAQUABCDUTlkGZ6pruSKa/eogronjdr7w5ZcWMxEexvYvlRy7jAIG # Ynws9yu6GBMyMDIyMDYxMDEwMDUwNy4xMzZaMASAAgH0oIHUpIHRMIHOMQswCQYD # VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3Nv # ZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBF # U046NEQyRi1FM0RELUJFRUYxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1w # IFNlcnZpY2WgghFfMIIHEDCCBPigAwIBAgITMwAAAbCh44My6I07wAABAAABsDAN # BgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0y # MjAzMDIxODUxNDJaFw0yMzA1MTExODUxNDJaMIHOMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3BlcmF0aW9u # cyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046NEQyRi1FM0RE # LUJFRUYxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIi # MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCcxm07DNfSgp0HOUQu1aIJcklz # Ci7rf8llj0Fg+lQJSYAXsVSsdp9c4F96P8QNmYGfzRRnIDQ0Qie5iYjnlu8Xh56D # Vz5YOxI2FrpX5N6DgI+muzteRr3JKWLLy3MfqPEnvAq3yG+NBCfFtEMeEyF39Mg8 # ACeP6jveHSf4Rmm3iWIOBqdBtLkJocBaLwFkx5Q9XIvrKd+gMU/cCIR6sP+9LczL # 65wxe45kI2lVD54zoDzshVmYla+3uq5EpeGp09bS79t0loV6jLNeMKJb+GXkHFj/ # OK1dha69Sm8JCGtL5R45b+MRvWup5U0X6NAmFEA362TjFwiOSnADdgWen1W9ParQ # nbFnTTcQdMuJcDI57jZsfORTX8z3DGY5sABfWkVFDCx7+tuiOu7dfnWaFT6Sqn0j # ZhrVbfQxE1pJg4qZxoOPgXU6Zb4BlavRdymTwxR2m8Wy6Uln11vdDGVzrhR/MgjM # wyTVM3sgKsrRRci2Yq94+E9Rse5UXgjlD8Nablc21irKVezKHWY7TfyFFnVSHZNx # z6eEDdcMHVb3VzrGHYRvJIIxsgGSA+aK+wv++YcikG+RdGfhHtOLmPSvrA2d5d8/ # E0GVgH2Lq22QjFlp5iVbLuVeD0eTzvlOg+7QLTLzFCzWIm0/frMVWSv1kHq9iSfa # t2e5YxbOJYKZn3OgFQIDAQABo4IBNjCCATIwHQYDVR0OBBYEFDrfASQ3ASZuHcug # EmR61yBH1jY/MB8GA1UdIwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1Ud # HwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3Js # L01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggr # BgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIw # MTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJ # KoZIhvcNAQELBQADggIBAN1z4oebDbVHwMi55V6ujGUqQodExfrhvp4SCeOP/3DH # EBhFYmdjdutzcL60IwhTp4v/qMX++o3JlIXCli15PYYXe73xQYWWc3BeWjbNO1JY # oLNuKb3mrBboZieMvNjmJtRtTkWLBZ3WXbxf/za2BsWl6lDZUR0JbJFf6ZnHKjtz # ousCx3Dwdf1kUyybWGyIosBP7kxRBRC+OcFg/9ZkwjxJBV94ZYlxMqcV83WdZOl6 # hk8rBgLS11AeyAugh9umMoCkLlxvEI3CQQFBv/Rd8jWTnWxb5+xYp2cjXCFS8ZXe # 4dGxC30M4SI3pY/ubASoS3GhVNL2425n9FhDYBZp8iTYjKy+/9hWDi7IIkA2yceg # 6ctRH77kRrHS+X/o1VXbOaDGiq4cYFe6BKG6wOmeep51mDeO7MMKLrnB39MptQ0F # h8tgxzhUUTe8r/vs3rNBkgjo0UWDyu669UHPjt57HetODoJuZ0fUKoTjnNjkE677 # UoFwUrbubxelvAz3LJ7Od3EOIHXEdWPTYOSGBMMQmc82LKvaGpcZR/mR/wOie2TH # kjSjZK1z8eqaRV1MR7gt5OJs1cmTRlj/2YHFDotqldN5uiJsrb4tZHxnumHQod9j # zoFnjR/ZXyrfndTPquCISS5l9BNmWSAmBG/UNK6JnjF/BmfnG4bjbBYpiYGv3447 # MIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG9w0BAQsF # ADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT # B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UE # AxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcN # MjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt # cCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOThpkzn # tHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az/1xPx2b3 # lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V29YZQ3MFE # yHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oaezOtgFt+ # jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkNyjYtcI4x # yDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7KMtXAhjBc # TyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRfNN0Sidb9 # pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SUHDSCD/AQ # 8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoYWmEBc8pn # ol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5C4lh8zYG # NRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8FdsaN8cI # FRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TASBgkrBgEE # AYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1Kc8Q/y8E # 7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUwUzBRBgwr # BgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUF # BwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYG # A1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3Js # L3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggrBgEFBQcB # AQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kv # Y2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3DQEBCwUA # A4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEztTnXwnE2 # P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJWAAOwBb6J # 6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G82jfZfak # Vqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/AyeixmJ5/AL # aoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI95ko+ZjtP # u4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1jdEgssU5H # LcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZKCS6OEua # bvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xBZj1p/cvB # QUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuPNtq6TPmb # /wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvpe784cETR # kPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCAtIwggI7AgEB # MIH8oYHUpIHRMIHOMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MSkwJwYDVQQLEyBNaWNyb3NvZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEmMCQG # A1UECxMdVGhhbGVzIFRTUyBFU046NEQyRi1FM0RELUJFRUYxJTAjBgNVBAMTHE1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAAKeL5Dd # 3w+RTQVWGZJWXkvyRTwYoIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB # IDIwMTAwDQYJKoZIhvcNAQEFBQACBQDmTY6rMCIYDzIwMjIwNjEwMTMzNDM1WhgP # MjAyMjA2MTExMzM0MzVaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOZNjqsCAQAw # CgIBAAICErsCAf8wBwIBAAICEWcwCgIFAOZO4CsCAQAwNgYKKwYBBAGEWQoEAjEo # MCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG # 9w0BAQUFAAOBgQA0K8PaTsToH6xnmNeU/WrwUNlzwbuoNaVvarcJcYCEqDt3Ra2R # CBLsf1oaghqpJPVCGXGBB4Z6ndPZt+5rsGQrh4rz0vNA70VkPJgtkOC/0s3poRl0 # 5Rv1O/NWGEv49Qy+VPLMLjeFzbYi/ss6ZY9rp6YnsaURCiHx4sl1oSWu3jGCBA0w # ggQJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABsKHj # gzLojTvAAAEAAAGwMA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYL # KoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIMANMXsBjyLIR4foNiFMNAFVHEdR # t+rLfDR8RciPZl3yMIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgzQYLQ3fL # n/Sk4xn9RuuyHypnDRSZnlk3eopQMucVhKAwgZgwgYCkfjB8MQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt # ZS1TdGFtcCBQQ0EgMjAxMAITMwAAAbCh44My6I07wAABAAABsDAiBCDfLFpjm0Zx # cK5bQiALPhv0NbQOsXAY5VrG9hMTojAH5zANBgkqhkiG9w0BAQsFAASCAgBWdfzS # QBa2oPUmoXPU5lrsmkPXvwyLJI7V3uo4N9btl/XHHjUYINMjrfRd0hnGuNvtlhPs # zYKTlPXiy0K1K634zGRP19ic1f6mimCf1f9uB+LBRSlqC42htqfVPYwQoXTVheLx # Z7UCD2x0YkLrxgfv+FpyJH1gt1pQz1xOf98pUfOOuN3yXL+B3J+mT/bMTVNPSnah # wsNLM/romu6g5GcfrWH7AUHthqyYs1AACB+pnAq6tmLZKS3yXwv7Jv9yXSs15qPW # kYSyNMtC+PpmLCRTEqi0C7dbroMmmAfC9sFBYyKtkkiMW6/9Ah+rut50cmecuZeP # LWeiJRT54UYMhWHCyCgBMabfMJ+gEH9Vso0Otbzvbd1oMop+fNokKMdMv0ZJBP2z # 2s66k8yu3IAMJjbH95VeGxsIZ6bzA4qq+5pFrHOaWQHywhWPw4lD14aX/1oKpxsx # jmzuXMns/1YMAr/BZplHIbq9m6zjZozGwCo/K7QqDFakAiuY372UVnUzkwjz1Ees # OpTgPhbXjWhliyPoNGtwTNQm9vXYEoGM/GI+7/DjSWE89enlQ9dg1kAhklaA6Ben # 0g/XjEOZZ31dknZzXTh2rAgkFmH9Svm+NIBP5ng+AGiQwxeMqo/BnvjnGN7uR+3I # ZLr8BShaqm+cT8j2QUEsVBqYumB/6jedQItyAA== # SIG # End signature block |