functions/data/Split-ObjectToFiles.ps1

function Split-ObjectToFiles {
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName)]
        [psobject]$Data,
        [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName)]
        [string]$SplitDirectory
    )
    process {
        try {
            #create base directory
            New-Directory -Dir $SplitDirectory -Force
            
            #region CREATE DATAMART FILES
            $Exclusions = @('DatamartNoSpacesNM', 'Entities', 'SourcedByEntities', '_hcposh', 'MaxLastModifiedTimestamp')
            $Out = @()
            $Props = $Data.psobject.properties.name | Where-Object { $Data.$_ }
            forEach ($Prop in $Props | Where-Object { $_ -NotIn $Exclusions }) {
                $OutObj = New-EmptyProperty
                $OutObj.Name = $Data.DatamartNM
                $OutObj.Property = $Prop
                $OutObj.Value = $Data."$($OutObj.Property)"
                if ($OutObj) { $Out += $OutObj }
            }
            $OutFile = "$($SplitDirectory)\_Datamart.csv"
            if ($Out) {
                $Out | Sort-Object Name, @{
                    e = {
                        if ($_.Property -eq 'ContentId') { 0 }
                        else { 1 }
                    }
                }, Property | Export-Csv $OutFile -Force -NoTypeInformation
            }
            #endregion
            #region CREATE SOURCE FILES
            $SourcedByColumns = @()
            forEach ($Entity in $Data.SourcedByEntities | Where-Object TableOrigin -eq 'External' | Sort-Object FullyQualifiedNM) {
                forEach ($Column in $Entity.SourcedByColumns | Sort-Object FullyQualifiedNM) {
                    $SourcedByColumn = New-Object PSObject
                    $SourcedByColumn | Add-Member -Type NoteProperty -Name DatabaseNM -Value $Entity.DatabaseNM
                    $SourcedByColumn | Add-Member -Type NoteProperty -Name SchemaNM -Value $Entity.SchemaNM
                    $SourcedByColumn | Add-Member -Type NoteProperty -Name TableNM -Value $Entity.TableNM
                    $SourcedByColumn | Add-Member -Type NoteProperty -Name ColumnNM -Value $Column.ColumnNM
                    $SourcedByColumns += $SourcedByColumn
                }
            }
            $ByDatabase = $SourcedByColumns | Group-Object DatabaseNM
            forEach ($db in $ByDatabase) {
                $db.Group | Sort-Object SchemaNM, TableNM, ColumnNM | Export-Csv -NoTypeInformation "$SplitDirectory\Sources-$($db.Name).csv" -Force | Out-Null
            }
            #endregion
            #region CREATE ENTITY FILES
            $Exclusions = @('Bindings', 'Columns', 'Indexes', 'SourcedByEntities', 'FullyQualifiedNames', 'LastModifiedTimestamp', 'DataEntryData', 'OverridingExtensionView')
            forEach ($Group in $Data.Entities | Group-Object ClassificationCode) {
                $Out = @()
                forEach ($Entity in $Group.Group) {
                    $Props = $Entity.psobject.properties.name | Where-Object { $_ }
                    forEach ($Prop in $Props | Where-Object { $_ -NotIn $Exclusions }) {
                        $OutObj = New-EmptyProperty
                        $OutObj.Name = $Entity.FullyQualifiedNames.Table
                        $OutObj.Property = $Prop
                        $OutObj.Value = $($Entity."$($OutObj.Property)" -replace "`r`n", "")
                        if ($OutObj) { $Out += $OutObj }
                    }
                }
                $OutFile = "$($SplitDirectory)\Entities-$($Group.Name).csv"
                if ($Out) {
                    $Out | Sort-Object Name, @{
                        e = {
                            if ($_.Property -eq 'ContentId') { 0 }
                            else { 1 }
                        }
                    }, Property | Export-Csv $OutFile -Force -NoTypeInformation
                }
            }
            #endregion
            #region CREATE BINDING FILES
            $Exclusions = @('BindingNameNoSpaces', 'Script', 'SourcedByEntities', 'IncrementalConfigurations')
            forEach ($Group in $Data.Entities.Bindings | Group-Object ClassificationCode) {
                $Out = @()
                forEach ($Binding in $Group.Group) {
                    $Props = $Binding.psobject.properties.name | Where-Object { $_ }
                    forEach ($Prop in $Props | Where-Object { $_ -NotIn $Exclusions }) {
                        $OutObj = New-EmptyProperty
                        $OutObj.Name = $Binding.BindingName
                        $OutObj.Property = $Prop
                        $OutObj.Value = $($Binding."$($OutObj.Property)" -replace "`r`n", "")
                        if ($OutObj) { $Out += $OutObj }
                    }
                }
                $OutFile = "$($SplitDirectory)\Bindings-$($Group.Name).csv"
                if ($Out) {
                    $Out | Sort-Object Name, @{
                        e = {
                            if ($_.Property -eq 'ContentId') { 0 }
                            else { 1 }
                        }
                    }, Property | Export-Csv $OutFile -Force -NoTypeInformation
                }
            }
            #endregion
            #region CREATE SQL FILES
            forEach ($Binding in $Data.Entities.Bindings) {
                switch ($Binding.BindingType) {
                    'SqlBinding' { 
                        $OutFile = "$($SplitDirectory)\SQL-$($Binding.ClassificationCode)-$(Get-CleanFileName $Binding.BindingName -RemoveSpace).sql"
                        $Binding.Script | Out-File $OutFile -Encoding Default -Force
                    }
                    'RBinding' {
                        $OutFile = "$($SplitDirectory)\R-$($Binding.ClassificationCode)-$(Get-CleanFileName $Binding.BindingName -RemoveSpace).r"
                        $Binding.Script | Out-File $OutFile -Encoding Default -Force
                    }
                }
            }
            #endregion
            #region CREATE COLUMN FILES
            $Exclusions = @('Ordinal')
            forEach ($Group in $Data.Entities | Group-Object ClassificationCode) {
                $Out = @()
                forEach ($Entity in $Group.Group) {
                    forEach ($Column in $Entity.Columns) {
                        $Props = $Column.psobject.properties.name | Where-Object { $_ }
                        forEach ($Prop in $Props | Where-Object { $_ -NotIn $Exclusions }) {
                            $OutObj = New-EmptyProperty
                            $OutObj.Name = "$($Entity.FullyQualifiedNames.Table).$($Column.ColumnNM)"
                            $OutObj.Property = $Prop
                            $OutObj.Value = $($Column."$($OutObj.Property)" -replace "`r`n", "")
                            if ($OutObj) { $Out += $OutObj }
                        }
                    }
                }
                $OutFile = "$($SplitDirectory)\Columns-$($Group.Name).csv"
                if ($Out) {
                    $Out | Sort-Object Name, @{
                        e = {
                            if ($_.Property -eq 'ContentId') { 0 }
                            else { 1 }
                        }
                    }, Property | Export-Csv $OutFile -Force -NoTypeInformation
                }
            }
            #endregion
            #region CREATE INDEX FILES
            $Exclusions = @('IndexName')
            forEach ($Group in $Data.Entities | Group-Object ClassificationCode) {
                $Out = @()
                forEach ($Entity in $Group.Group) {
                    forEach ($Index in $Entity.Indexes) {
                        $Props = $Index.psobject.properties.name | Where-Object { $_ }
                        forEach ($Prop in $Props | Where-Object { $_ -NotIn $Exclusions }) {
                            $OutObj = New-EmptyProperty
                            $OutObj.Name = "$($Entity.FullyQualifiedNames.Table).$($Index.IndexName)"
                            $OutObj.Property = $Prop
                            if ($Prop -eq 'IndexColumns') {
                                $OutObj.Value = $(($Index."$($OutObj.Property)" | Sort-Object ColumnNM).ColumnNM -join " | ")
                            }
                            else {
                                $OutObj.Value = $($Index."$($OutObj.Property)" -replace "`r`n", "")
                            }
                            if ($OutObj) { $Out += $OutObj }
                        }
                    }
                }
                $OutFile = "$($SplitDirectory)\Indexes-$($Group.Name).csv"
                if ($Out) {
                    $Out | Sort-Object Name, @{
                        e = {
                            if ($_.Property -eq 'ContentId') { 0 }
                            else { 1 }
                        }
                    }, Property | Export-Csv $OutFile -Force -NoTypeInformation
                }
            }
            #endregion
            #region CREATE INCREMENTAL CONFIG FILES
            $Exclusions = @()
            forEach ($Group in $Data.Entities.Bindings | Group-Object ClassificationCode) {
                $Out = @()
                forEach ($Binding in $Group.Group) {
                    forEach ($Increment in $Binding.IncrementalConfigurations) {
                        $Props = $Increment.psobject.properties.name | Where-Object { $_ }
                        forEach ($Prop in $Props | Where-Object { $_ -NotIn $Exclusions }) {
                            $OutObj = New-EmptyProperty
                            $OutObj.Name = $Binding.BindingName
                            $OutObj.Property = $Prop
                            $OutObj.Value = $($Increment."$($OutObj.Property)" -replace "`r`n", "")
                            if ($null -ne $OutObj.Value -and $OutObj.Value -ne "") { $Out += $OutObj | Sort-Object { $_.Property, $_.Value } }
                        }
                    }
                }
                $OutFile = "$($SplitDirectory)\IncrementalConfigurations-$($Group.Name).csv"
                if ($Out) {
                    $Out | Sort-Object Name, @{
                        e = {
                            if ($_.Property -eq 'ContentId') { 0 }
                            else { 1 }
                        }
                    }, Property | Export-Csv $OutFile -Force -NoTypeInformation
                }
            }
            #endregion
            #region CREATE DATA ENTRY ENTITY FILES
            ForEach ($Entity in $Data.Entities | Where-Object { $_.ClassificationCode -eq 'DataEntry' }) {
                If ($Entity.DataEntryData) {
                    $OutFile = "$($SplitDirectory)\DataEntryData-$(Get-CleanFileName $Entity.DataEntryData.FullyQualifiedNM -RemoveSpace).csv"
                    if ($Entity.DataEntryData.Data_All) {
                        $Entity.DataEntryData.Data_All | Export-Csv $OutFile -NoTypeInformation -Force
                    }
                }
            }
            #endregion
            #region CREATE ISSUE FILES
            if (($Data.Entities.Bindings.SourcedByEntities.SourcedByPossibleColumns | Measure-Object).Count -gt 0) {
                $Out = @()
                forEach ($Binding in $Data.Entities.Bindings) {
                    forEach ($Issue in $Binding.SourcedByEntities.SourcedByPossibleColumns) {
                        $OutObj = New-EmptyProperty
                        $OutObj.Name = $Binding.BindingName
                        $OutObj.Property = "Missing Alias - Unable To Parse"
                        $OutObj.Value = $Issue.FullyQualifiedNM
                        if ($OutObj.Value) { $Out += $OutObj }
                    }
                }
                $OutFile = "$($SplitDirectory)\_ISSUES-Bindings-MissingAlias.csv"
                if ($Out) {
                    $Out | Sort-Object Name, @{
                        e = {
                            if ($_.Property -eq 'ContentId') { 0 }
                            else { 1 }
                        }
                    }, Property | Export-Csv $OutFile -Force -NoTypeInformation
                }
            }
            #endregion
            #Get-Date | Out-File $SplitDirectory\_lastmodified.txt -Encoding Default -Force | Out-Null
        }
        catch {            
            $ErrorMessage = $_.Exception.Message
            $Msg = "$(" " * 8)An error occurred while trying to split data object into smaller files :( --> $ErrorMessage"; Write-Host $Msg -ForegroundColor Red; Write-Verbose $Msg; Write-Log $Msg 'error';
            Exit
        }
    }
}
# SIG # Begin signature block
# MIIpNQYJKoZIhvcNAQcCoIIpJjCCKSICAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB8SvJMywMufgoO
# sNB3Y5h7FNSjxh2NVDiedoefsCqlMqCCDiMwggawMIIEmKADAgECAhAIrUCyYNKc
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
# yK+p/pQd52MbOoZWeE4wggdrMIIFU6ADAgECAhADsuWQRbq1qj3ect5VAxkgMA0G
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjMwNTE2MDAwMDAwWhcNMjYwNTIw
# MjM1OTU5WjBzMQswCQYDVQQGEwJVUzENMAsGA1UECBMEVXRhaDEVMBMGA1UEBxMM
# U291dGggSm9yZGFuMR4wHAYDVQQKExVIZWFsdGggQ2F0YWx5c3QsIEluYy4xHjAc
# BgNVBAMTFUhlYWx0aCBDYXRhbHlzdCwgSW5jLjCCAiIwDQYJKoZIhvcNAQEBBQAD
# ggIPADCCAgoCggIBAObA/ZMm0ngFmqmUW8QpvB5R2WwUIbCHZkoYN3LLelwf6FCX
# NNCZOxBz6CppjoQ4kL1HtQNpENDPMTMxG5/lMTlZvf1mu/mYEYXOddPsgv+QP4bd
# P+9w+NVE4vguFffuBSzQi8KmnrgGgDVLuhTjvN5WlP/AhzHldDNhKtkQh/bzIgrL
# sivSLRo3ow2kVCzJTZYwXudZ/cI2vrNf0jKRQgcC/ao1emvt68RNQJPxDpmd4Eb5
# DOF+jd9w0Sb77/m/ir2rTbVjoLOlPxD9FlGsdB+kyMV45D9hYuD4D1s998j/wDeL
# ezs/sXgrJToXS0Yjpxaul++7GVuLYgBQvB1UAVejXjDuJO2FF7gUeJihWk/OKmaW
# kQTGavOt8/RcOrru1LdJ733fJnMZsmonQPokOdlUADNKBSAEskgRbD3SQ/Y9LKcm
# 8w/hj9L6PSXBF/E/Kaq92SArEjkvYDlsXp7xslKgAxP26pzq7/hn2gro6/jjLUyh
# xt60j8Pm0tjhOdQhCcioRO2zouopusZmPMO6H95T1PEkhd/cEmkywmMqOMVMpAUg
# O796xTvZ4kjOsaQTOKvAEJDjc42EHZd2RWcVUMI41iHpNILkYHSPHe4mVQC8BdZx
# qzGI6ay7U1mEvCYlMYQZwDZ/xYxI7q0YBjQOm5jVuPvAHmlE6pUiWuGz3JKXAgMB
# AAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNV
# HQ4EFgQUaRlF8Nw4+YnDPBwkIaUEjV2a1MowDgYDVR0PAQH/BAQDAgeAMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwz
# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5
# NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIx
# Q0ExLmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRw
# Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsG
# AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0
# dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVT
# aWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZI
# hvcNAQELBQADggIBABpsvUpsQVtdpqQNUxSC3Ix3qXeJ81vNGS7sXYxlYhvEChJF
# gixfjebMfHZu0YLJ3xIeX7VwW8wyF+9RkI4RnPtkJD2JSmDd2mH4y/gy138EZMHa
# n+XbMeMXcsOTL9cI5zUBw86EGj/xcL5NIj9DDym8DPh9/OZY5L5sGXrO1VjA/mUM
# lnpqpoNZaNsjQ7Gla6K5BC0xIoHxNYTX1uRSjmYkKdnNMTcHqOLcgxwaXzix26Bs
# n1pKO+NMe3DqthjFX0Pe6Z47b3GrjEYT4IoJP0N3H1crDfpm2vlBMwdSrNvr+epH
# VfZqOx8/VwS7VKygkP5Dp4zXyOa3W+11sMQIQ4AS4lER4g1GS/DmrlP2FWYGaaVJ
# YB01y1tWA23V3VM/Z/aeOR3uUE8p6tc5AFu2jNa16l9f5XNp9p5Fx2QzFh6pGqBu
# d0ict3T/vGWZWxzOhWqqp/Xd1oV5lMwW50t9CEKWpHidZXZZUkw2vwLnkZZzpFzs
# +b1HFxPKAvBXcwWO9ZV+FGeDk09ZBy3E4hY9JaF2Z9KiYa8EMzEOtHaHAkynD6Za
# TFhRSAnO3OMixVE/ro6dW7drPYKxKKYf1Y5QXaPU9ijer9ub0gnYDjPqsh3gWolp
# 7vjAE7t5JDE1PQDqCuuUn8FQakB/NJVs3Nt/Xz5ADD7e6h6JADmUr1l2e4agMYIa
# aDCCGmQCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
# Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJT
# QTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhADsuWQRbq1qj3ect5VAxkgMA0GCWCGSAFl
# AwQCAQUAoHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQB
# gjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkE
# MSIEIOAPtL+IYmeJ/3fAXskczr0xVYZyViGyLXASgJDTNAT3MA0GCSqGSIb3DQEB
# AQUABIICAIl3WIP7dHF0ALml4O3O80ibfvachFFx/q5//AW8DvYLQd5PVXB2wX7O
# BtzuX8eDSdAoLczyYE/JW+/47tjH6lfmsuenvVRAWFRs0aS/dJyj/7SaGqhoN+VE
# ACXFL0DD58wZz8d4PCm62yf7Pr3oUNsWSpS/oYU9z4xoI7K9iDLly91FGCLoE3CT
# B1gwZeGX/5A5Lmn2sHiSPXK4xXxvponLP23Y+FXMyXyuuF4Fi2BnuYxTQIwt2QN+
# bfZaJmhu/R1kO6sk/etiINxRkWhPPwIzdU7keToML59X4vwuK1dUa6Q++KWRF9Nv
# edcE5WvXYyzZrF1/2nxrKhqCDlhXIULxpgSisYtmpurWsZVMScRsra7s1jblqR5o
# pzRm3gIVGTFYjoBzH+iFv7RzOPTfajm0QJ71RFYB7zFGWGKu/AEQ9g6mHl6WrJaQ
# 2vnigNTHC7wr2cR7Qc68vwogBYSfD3KRqEJRefA3XSyVFWirGE9sfZ7Lx/M6urpO
# qQi2I6UiA5oujuIkAzAxO6j3c2DNiwoukF9zR91eAUm2txoM3ZqmasxiSWeccRnA
# nJEitXCUc3Qml/xuSeOfdTbZFzaPh9T8H1xbx1EaVNQZaQIKjzK//gMH3jjIkPd5
# cXqrDpGNSSFuvV8IMxvWhw/zMiRyD2Z+XPsHLu5dxQODcQgbeKhMoYIXPjCCFzoG
# CisGAQQBgjcDAwExghcqMIIXJgYJKoZIhvcNAQcCoIIXFzCCFxMCAQMxDzANBglg
# hkgBZQMEAgEFADB4BgsqhkiG9w0BCRABBKBpBGcwZQIBAQYJYIZIAYb9bAcBMDEw
# DQYJYIZIAWUDBAIBBQAEIMY7/IKbpneKDoUNtymsdrbq/mF3YxiMLJdFOmLG4Yi2
# AhEA7wR0ZNieoTihPau7kifwDRgPMjAyMzA1MTcxNzA5MjhaoIITBzCCBsAwggSo
# oAMCAQICEAxNaXJLlPo8Kko9KQeAPVowDQYJKoZIhvcNAQELBQAwYzELMAkGA1UE
# BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2Vy
# dCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0y
# MjA5MjEwMDAwMDBaFw0zMzExMjEyMzU5NTlaMEYxCzAJBgNVBAYTAlVTMREwDwYD
# VQQKEwhEaWdpQ2VydDEkMCIGA1UEAxMbRGlnaUNlcnQgVGltZXN0YW1wIDIwMjIg
# LSAyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAz+ylJjrGqfJru43B
# DZrboegUhXQzGias0BxVHh42bbySVQxh9J0Jdz0Vlggva2Sk/QaDFteRkjgcMQKW
# +3KxlzpVrzPsYYrppijbkGNcvYlT4DotjIdCriak5Lt4eLl6FuFWxsC6ZFO7Khbn
# UEi7iGkMiMbxvuAvfTuxylONQIMe58tySSgeTIAehVbnhe3yYbyqOgd99qtu5Wbd
# 4lz1L+2N1E2VhGjjgMtqedHSEJFGKes+JvK0jM1MuWbIu6pQOA3ljJRdGVq/9XtA
# bm8WqJqclUeGhXk+DF5mjBoKJL6cqtKctvdPbnjEKD+jHA9QBje6CNk1prUe2nhY
# HTno+EyREJZ+TeHdwq2lfvgtGx/sK0YYoxn2Off1wU9xLokDEaJLu5i/+k/kezbv
# BkTkVf826uV8MefzwlLE5hZ7Wn6lJXPbwGqZIS1j5Vn1TS+QHye30qsU5Thmh1EI
# a/tTQznQZPpWz+D0CuYUbWR4u5j9lMNzIfMvwi4g14Gs0/EH1OG92V1LbjGUKYvm
# QaRllMBY5eUuKZCmt2Fk+tkgbBhRYLqmgQ8JJVPxvzvpqwcOagc5YhnJ1oV/E9mN
# ec9ixezhe7nMZxMHmsF47caIyLBuMnnHC1mDjcbu9Sx8e47LZInxscS451NeX1XS
# fRkpWQNO+l3qRXMchH7XzuLUOncCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIH
# gDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZ
# MBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2
# mi91jGogj57IbzAdBgNVHQ4EFgQUYore0GH8jzEU7ZcLzT0qlBTfUpwwWgYDVR0f
# BFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1
# c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUH
# AQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBY
# BggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG
# 9w0BAQsFAAOCAgEAVaoqGvNG83hXNzD8deNP1oUj8fz5lTmbJeb3coqYw3fUZPwV
# +zbCSVEseIhjVQlGOQD8adTKmyn7oz/AyQCbEx2wmIncePLNfIXNU52vYuJhZqMU
# KkWHSphCK1D8G7WeCDAJ+uQt1wmJefkJ5ojOfRu4aqKbwVNgCeijuJ3XrR8cuOyY
# QfD2DoD75P/fnRCn6wC6X0qPGjpStOq/CUkVNTZZmg9U0rIbf35eCa12VIp0bcrS
# BWcrduv/mLImlTgZiEQU5QpZomvnIj5EIdI/HMCb7XxIstiSDJFPPGaUr10CU+ue
# 4p7k0x+GAWScAMLpWnR1DT3heYi/HAGXyRkjgNc2Wl+WFrFjDMZGQDvOXTXUWT5D
# mhiuw8nLw/ubE19qtcfg8wXDWd8nYiveQclTuf80EGf2JjKYe/5cQpSBlIKdrAqL
# xksVStOYkEVgM4DgI974A6T2RUflzrgDQkfoQTZxd639ouiXdE4u2h4djFrIHprV
# wvDGIqhPm73YHJpRxC+a9l+nJ5e6li6FV8Bg53hWf2rvwpWaSxECyIKcyRoFfLpx
# tU56mWz06J7UWpjIn7+NuxhcQ/XQKujiYu54BNu90ftbCqhwfvCXhHjjCANdRyxj
# qCU4lwHSPzra5eX25pvcfizM/xdMTQCi2NYBDriL7ubgclWJLCcZYfZ3AYwwggau
# MIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJ
# BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
# aWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAe
# Fw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3Rl
# ZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9Ge
# TKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0
# hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZl
# jZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAsh
# aG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVY
# TXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1
# biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCir
# c0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+
# DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA
# +bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42Pg
# puE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzS
# M7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU
# uhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6
# mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsG
# AQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t
# MEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl
# cnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3Js
# My5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAE
# GTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1Z
# jsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8d
# B+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVp
# P0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp8
# 76i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2
# nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3
# ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQ
# txMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc
# 4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+Y
# AN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZ
# vAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQr
# H4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQDpsY
# jvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMG
# A1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
# IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAw
# MDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln
# aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhE
# aWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57
# G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
# k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFh
# mzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463J
# T17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFw
# q1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yh
# Tzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU
# 75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LV
# jHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJ
# bOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8Qg
# UWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IB
# OjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6
# mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/
# BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
# ZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2Vy
# dC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4
# oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJv
# b3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBw
# oL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0
# E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtD
# IeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlU
# sLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFig
# DkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwY
# w02fc7cBqZ9Xql4o4rmUMYIDdjCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUG
# A1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQg
# RzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBAhAMTWlyS5T6PCpKPSkH
# gD1aMA0GCWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRAB
# BDAcBgkqhkiG9w0BCQUxDxcNMjMwNTE3MTcwOTI4WjArBgsqhkiG9w0BCRACDDEc
# MBowGDAWBBTzhyJNhjOCkjWplLy9j5bp/hx8czAvBgkqhkiG9w0BCQQxIgQgjIAu
# 5mtixuMIO5s9/Q4tfRDnZML5EEikBldt5ySTT/4wNwYLKoZIhvcNAQkQAi8xKDAm
# MCQwIgQgx/ThvjIoiSCr4iY6vhrE/E/meBwtZNBMgHVXoCO1tvowDQYJKoZIhvcN
# AQEBBQAEggIACz7H8tOwKhNc3M0vEgTOupBQu51OvCQZxD6TeJrfauYqXlSyd2h5
# YyhtoIX74R4Ay3LeyR9Bbc/XDP0YlB6A0xDqyG8IZP7aXii5+mY6rXOYLrWalpDA
# epjMS0q37FHCCf8PZhnObTf9xwkG70iBuPMludAJQx4ya7P4NHOPFwXWY4FBPT/c
# 2I+PZUygiizdvLSYBYXPQvtqm+zbbjpdcVKvWTJP8YH6st06efIr+7eZunVs24Z4
# vILWe8Zfzl9Kp4LatMGYJnd32euVBM6VTVKP3jlTodVRWkxKZ8l1+ZMldCpLUt8v
# OtjSq4IEnYwMfZ7+L21XyJfaJ3Vr08ekdX7BAEQTTvbYwSVe4cK0kE6Ft/mIvd8r
# RgaxbDkWEQkvJLnbqMG/QE6R3lMMuyUI2j/rrTK0T8xMiAzPRkU6tVQ3kwjC6aU9
# TnL9PlEGh+G72QQj+V0DxtiFRtYmO7PX38Vsn9vflzlD8Kotwd0eGiWZj6TEW7Xu
# e7ax0lBo8QynAEmBfqC0lR25ef2A9TS9iTVQLalP4fVcradhuyy3Gt8k40VkYgXZ
# r3zfkoiW6dqQ/zktdiUS5HTv1Zbfvelnm7m4nk40dkM6lhO0/KX2yCAJmdWxrC2+
# XnhmSm6AANVMq/hr35UXB2T/ytP5xEQcFlrzenHUsCa5O7ddSi2sihc=
# SIG # End signature block