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 &nbsp;</strong> </td>
                                             <td><strong>: $($OrganisationName)</strong> </td></tr>
                                             "
 
            }
        }   
        if (($null -ne $($TenantDomain)) -and ($($TenantDomain) -ne "")) {
            $output += " <tr><td><strong>Tenant &nbsp;</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 &nbsp;</strong> </td>
                             <td><strong>:</strong>&nbsp;The following report is customized for following geolocation(s): $RegionString</td></tr>
                             "
 
        }
        else {
            $output += " <tr><td><strong>Note &nbsp;</strong> </td>
                             <td><strong>:</strong>&nbsp;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;'>&nbsp;&nbsp;<i class='fa fa-cog'></i>&nbsp;&nbsp; <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>&nbsp;Recommendation
        <span class='badge badge-warning'style='padding:5px;text-align:center'> </span>&nbsp;Improvement
        <span class='badge badge-success' style='padding:5px;text-align:center'> </span>&nbsp;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;'>&nbsp;&nbsp;&nbsp;
        $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' >&nbsp;&nbsp;</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>&nbsp;&nbsp;
                    <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>&nbsp;<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>&nbsp;&nbsp;&nbsp;&nbsp;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