Yayaml.psm1

# Copyright: (c) 2023, Jordan Borean (@jborean93) <jborean93@gmail.com>
# MIT License (see LICENSE or https://opensource.org/licenses/MIT)

$importModule = Get-Command -Name Import-Module -Module Microsoft.PowerShell.Core
$moduleName = [System.IO.Path]::GetFileNameWithoutExtension($PSCommandPath)

if (-not $IsCoreClr) {
    # PowerShell 5.1 has no concept of an Assembly Load Context so it will
    # just load the module assembly directly.

    $innerMod = if ('Yayaml.Module.NewYamlSchemaCommand' -as [type]) {
        $modAssembly = [Yayaml.Module.NewYamlSchemaCommand].Assembly
        &$importModule -Assembly $modAssembly -Force -PassThru
    }
    else {
        $modPath = [System.IO.Path]::Combine($PSScriptRoot, 'bin', 'net472', "$moduleName.Module.dll")
        &$importModule -Name $modPath -ErrorAction Stop -PassThru
    }
}
else {
    # This is used to load the shared assembly in the Default ALC which then sets
    # an ALC for the moulde and any dependencies of that module to be loaded in
    # that ALC.

    $isReload = $true
    if (-not ('Yayaml.LoadContext' -as [type])) {
        $isReload = $false

        Add-Type -Path ([System.IO.Path]::Combine($PSScriptRoot, 'bin', 'net8.0', "$moduleName.dll"))
    }

    $mainModule = [Yayaml.LoadContext]::Initialize()
    $innerMod = &$importModule -Assembly $mainModule -PassThru:$isReload
}

if ($innerMod) {
    # Bug in pwsh, Import-Module in an assembly will pick up a cached instance
    # and not call the same path to set the nested module's cmdlets to the
    # current module scope.
    # https://github.com/PowerShell/PowerShell/issues/20710
    $addExportedCmdlet = [System.Management.Automation.PSModuleInfo].GetMethod(
        'AddExportedCmdlet',
        [System.Reflection.BindingFlags]'Instance, NonPublic'
    )
    foreach ($cmd in $innerMod.ExportedCommands.Values) {
        $addExportedCmdlet.Invoke($ExecutionContext.SessionState.Module, @(, $cmd))
    }
}

# Use this for testing that the dlls are loaded correctly and outside the Default ALC.
# [System.AppDomain]::CurrentDomain.GetAssemblies() |
# Where-Object { $_.GetName().Name -like "*yaml*" } |
# ForEach-Object {
# $alc = [Runtime.Loader.AssemblyLoadContext]::GetLoadContext($_)
# [PSCustomObject]@{
# Name = $_.FullName
# Location = $_.Location
# ALC = $alc
# }
# } | Format-List

# SIG # Begin signature block
# MIIxSgYJKoZIhvcNAQcCoIIxOzCCMTcCAQMxDTALBglghkgBZQMEAgEwewYKKwYB
# BAGCNwIBBKBtBGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDBmCXIWS2fm2al
# K4fjTycaQg4wSxjvQM881KDuCHABCKCCFeswggbnMIIEz6ADAgECAhMzAAVnfVmd
# 97XgJcLKAAAABWd9MA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDEwHhcNMjUwOTExMTA1NzUxWhcNMjUwOTE0
# MTA1NzUxWjBlMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDERMA8G
# A1UEBxMIQnJpc2JhbmUxFjAUBgNVBAoTDUpvcmRhbiBCb3JlYW4xFjAUBgNVBAMT
# DUpvcmRhbiBCb3JlYW4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCK
# MgXg/ixC/2JopwFwJLK597cHqL01Uj7SpEp5pk+QM70tJUtGc719mf1lxPytkZAe
# 9q10lcsPFJ6A9p7lETjtiUWMWCN/ay8SkMl6UvLUniGIq8NwkEbZfnI7iB3BdF41
# oPLTnMX7uaTZ5z3R8IkL9PqDkoQWVAvLc+I0uUXErsKlnppzPvpAc9bTuGPhyUT9
# xQfTAgRlooBZrFbpHmJBSmZeQV4y5eeb0clw6weJ/gnSROJOFmnwzC7G8cFWX6om
# pjjLYNAnmICElVAwrwbuv7psvODnnAHIZUT1vSRlFe+iiF+00yYkUejMGq+RQFlv
# y/jruGSK7xc+6BCTfm5aDJMZKXdYvcDflVXoqmcqQKmPsRe330uF62Eab0WIK3//
# Lg9wJpZYeyr3Gdtm58kKtlfkDOqC3ze22YkUXeMcNoCgwoPO38pWjiAmhXny/Vue
# KPJek/xkb8ZkzYbYObD0cgLzhsmRxDjQ5q27r0uUEGhOqQUzXUdNaI6wN2BS9OkC
# AwEAAaOCAhkwggIVMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDwGA1Ud
# JQQ1MDMGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhsrBgEEAYI3YcD1uzmDxbqHboKj
# 0bsfgZfH91YwHQYDVR0OBBYEFKdNKqB3XhpELCFJEKw1+CwqtgZAMB8GA1UdIwQY
# MBaAFOiDxDPX3J8MnHaaCqbU34emXljuMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIw
# VmVyaWZpZWQlMjBDUyUyMEFPQyUyMENBJTIwMDEuY3JsMIGlBggrBgEFBQcBAQSB
# mDCBlTBkBggrBgEFBQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w
# cy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBD
# QSUyMDAxLmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9zb2Z0
# LmNvbS9vY3NwMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUH
# AgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0
# b3J5Lmh0bTAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIBAAowqfkhmmDncqkl
# vbU40rMHk8TZMFihcGg0EoHsuB6wjFT3uKKsOkciiUaIaBu56pxhkjM1Zc6EXRmV
# RU8WN4dd+lhnQIf4+9ofCEvh4pYk576iPy7USCNrv3jquLbl5+hL0D1Vj5qeqxU7
# KsZwhmrG2rnIcZ+JzLUPJbtndG97w4duY+RhRqJVU6SBFeH/NJalM/ZdcdJeoZbK
# mLYKQ8s+iBFhl/EyNYS31tw/ZLqNSZY8lwOiXqcc4X9nCWoEjQDoO7AK+0j0/TD3
# QFBtaQOG97Uh5dXNIqHurRb+kCKyvGpaholNCGS/+8K/5x0+AX3ukabeBkf8QZ/3
# 0vf/AxjMmkecaNTlbWjdZgr1Pb0yC4PpWwe7Xq8IaQrpLjKN1/cWrY7pripHGO62
# bJQlTHYJ0JwoJ3jB5E4ZKqmExFpUVtVkH1hl/YJTJD035g/tjpy62CzBv2In3iF9
# 3c1otrNboy4B3AFdCWJt522/w3TokcEAFqaMZzzxm2G8tkwV4Uqx/1tGWAOClzBR
# tSEvICxoOR1XMCVMjVrj06uHBh1swKHCQbb2W3GBr7EG9KWJeYW6eK1pIN+zpmux
# MUSZi6r5H0d73fG5ZJvjrpK0Eeuyn5dwKUDckLKxU05t4yYnvsta3gJNpSyPXPlp
# 7YGTh5ZuMclzF0xRVW4J5gqt5PPPMIIHWjCCBUKgAwIBAgITMwAAAAc3jFuh2VuM
# 1AAAAAAABzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQGEwJVUzEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMTQwMgYDVQQDEytNaWNyb3NvZnQgSUQgVmVy
# aWZpZWQgQ29kZSBTaWduaW5nIFBDQSAyMDIxMB4XDTIxMDQxMzE3MzE1NFoXDTI2
# MDQxMzE3MzE1NFowWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEFP
# QyBDQSAwMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALf3wAMoB8W6
# Po8QNOITSPG8/hKm1r0rvXUYAGsIwmWrtWOeCEGpeQK6SVovHCI9FgPpqcIsfIk0
# YLqvSRC2b0zKNmdVOgLRNU595r6t5ssGfUnsVXfqzzk6/rnWuhlYMCwPNC4UX/Ng
# L60sMZmaQh/5Wk9PHZ+/hrdHF2FTSiTkZtYUqwI4w0ImdSYqv0qog6Bzejxpk+YV
# yrNthO/THhVmAeMtFJTaltGdizzbmvJNK2xEXYjUvp0z/8bBEmVJ625sl2Wh73Mh
# CmCvOVgc90q+hLfFZW3Ynf6YwaXByPh8raGlABhOq0lqpoe/2hGXgw1JM/bjCjhm
# rCIGJ3p1JORNG9lP/20Kg796nYY/VCWFgAzWAv94t4sXFtVRC2lPsE6l08SwBXpQ
# ov5UR0o2loqQ3hP02wW9M0woi53PZ5jo2TypbrTDYaPdcMaOIrXCaCJNmz6Lfbfg
# FflMDWg0SG3BGkGgcnJfaXGMFpn9GyeCBZ/wpmDFRtXpAgcQcskTZBZB5rjFy1+j
# zF3L3hOOozK/bMgtzPCR0XXUeM1Y3fxcQZ0uRzq6N6YOkrbhD7Ia6eyPypNXExvM
# jlpfGqn+jiXgFchuJcifVfmcQpWJmlOcr7SmCpNRSwZxAXw1sPlAM0FdL3C6egFc
# dhXPJ9L6aMrna90sGZnJCbs+0fku/QczAgMBAAGjggIOMIICCjAOBgNVHQ8BAf8E
# BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFOiDxDPX3J8MnHaaCqbU
# 34emXljuMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJ
# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNV
# HSMEGDAWgBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBwBgNVHR8EaTBnMGWgY6Bhhl9o
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJ
# RCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDIxLmNybDCB
# rgYIKwYBBQUHAQEEgaEwgZ4wbQYIKwYBBQUHMAKGYWh0dHA6Ly93d3cubWljcm9z
# b2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUy
# MENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAyMS5jcnQwLQYIKwYBBQUHMAGGIWh0
# dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOC
# AgEAd/7rSyLZMC06eDX4ffb626UrC/DcDyI9vkwZ2Ri9wvHrUxmLPh2VMTRvqzXm
# Wvkc7vaBHAGSQ4hoxFsrczGrw+gYod5xFhbCFuGhoeIAeJ/6UT3nlayuItSxu4yd
# 5Dy0YTTh2Yi1ELZqxeFeiMbVBY7wZ4o2mfaCMbEkkD/IhzIz/dqY0KxwRVhxg25J
# sfsjuiGp90Dd2Jm3X3sM0r50Jim5Ik4myYHCdS9E2ewcJrA75vtF0bDznxYJ84S1
# amXRMlsMNdG35TngSqpG90mgjUE8/J7IWlGYa8VVOajYGI2mg0EJvj9khKQRe0aJ
# RAt5ZZX7i+ADhgraDXTzlq8fbwWU1wFXUxNq9CA5PPuctZCxkyys5jRZ+pFQnOQX
# XTO8aA1kOGlKAkV3LAXkYbHJZO5FVz/syRjzl8I1CW589irfYhf/AehQzuG5Rrhq
# 6IDKcl5LsAgtmeF3H8jIzw4amWADxhk1CDTLRW2ruUbRhtQzlhPXnQmobbjzA4Ac
# nz4sb4ct7J+81B4CAv2LDkzMVbjEIv24GpnpqP1TSma7GWktJ85jsSqYPag3n4+X
# yfYCB13KdhdDh3FcHtypxF2vJKszA360Zf8MCqzUhZ96e4NG+OAHdTjQ5lretTC0
# LxeeCxutoun34UwnqBU/WfaW1KNoMZckxYOwZtH4DpZ0XxgwggeeMIIFhqADAgEC
# AhMzAAAAB4ejNKN7pY4cAAAAAAAHMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYT
# AlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01p
# Y3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBB
# dXRob3JpdHkgMjAyMDAeFw0yMTA0MDEyMDA1MjBaFw0zNjA0MDEyMDE1MjBaMGMx
# CzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xNDAy
# BgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25pbmcgUENBIDIw
# MjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCy8MCvGYgo4t1UekxJ
# bGkIVQm0Uv96SvjB6yUo92cXdylN65Xy96q2YpWCiTas7QPTkGnK9QMKDXB2ygS2
# 7EAIQZyAd+M8X+dmw6SDtzSZXyGkxP8a8Hi6EO9Zcwh5A+wOALNQbNO+iLvpgOnE
# M7GGB/wm5dYnMEOguua1OFfTUITVMIK8faxkP/4fPdEPCXYyy8NJ1fmskNhW5Hdu
# NqPZB/NkWbB9xxMqowAeWvPgHtpzyD3PLGVOmRO4ka0WcsEZqyg6efk3JiV/TEX3
# 9uNVGjgbODZhzspHvKFNU2K5MYfmHh4H1qObU4JKEjKGsqqA6RziybPqhvE74fEp
# 4n1tiY9/ootdU0vPxRp4BGjQFq28nzawuvaCqUUF2PWxh+o5/TRCb/cHhcYU8Mr8
# fTiS15kRmwFFzdVPZ3+JV3s5MulIf3II5FXeghlAH9CvicPhhP+VaSFW3Da/azRO
# dEm5sv+EUwhBrzqtxoYyE2wmuHKws00x4GGIx7NTWznOm6x/niqVi7a/mxnnMvQq
# 8EMse0vwX2CfqM7Le/smbRtsEeOtbnJBbtLfoAsC3TdAOnBbUkbUfG78VRclsE7Y
# DDBUbgWt75lDk53yi7C3n0WkHFU4EZ83i83abd9nHWCqfnYa9qIHPqjOiuAgSOf4
# +FRcguEBXlD9mAInS7b6V0UaNwIDAQABo4ICNTCCAjEwDgYDVR0PAQH/BAQDAgGG
# MBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTZQSmwDw9jbO9p1/XNKZ6kSGow
# 5jBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5t
# aWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQB
# gjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU
# yH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElkZW50aXR5
# JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5
# JTIwMjAyMC5jcmwwgcMGCCsGAQUFBwEBBIG2MIGzMIGBBggrBgEFBQcwAoZ1aHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJ
# ZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1
# dGhvcml0eSUyMDIwMjAuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8vb25lb2NzcC5t
# aWNyb3NvZnQuY29tL29jc3AwDQYJKoZIhvcNAQEMBQADggIBAH8lKp7+1Kvq3WYK
# 21cjTLpebJDjW4ZbOX3HD5ZiG84vjsFXT0OB+eb+1TiJ55ns0BHluC6itMI2vnwc
# 5wDW1ywdCq3TAmx0KWy7xulAP179qX6VSBNQkRXzReFyjvF2BGt6FvKFR/imR4CE
# ESMAG8hSkPYso+GjlngM8JPn/ROUrTaeU/BRu/1RFESFVgK2wMz7fU4VTd8NXwGZ
# Be/mFPZG6tWwkdmA/jLbp0kNUX7elxu2+HtHo0QO5gdiKF+YTYd1BGrmNG8sTURv
# n09jAhIUJfYNotn7OlThtfQjXqe0qrimgY4Vpoq2MgDW9ESUi1o4pzC1zTgIGtdJ
# /IvY6nqa80jFOTg5qzAiRNdsUvzVkoYP7bi4wLCj+ks2GftUct+fGUxXMdBUv5sd
# r0qFPLPB0b8vq516slCfRwaktAxK1S40MCvFbbAXXpAZnU20FaAoDwqq/jwzwd8W
# o2J83r7O3onQbDO9TyDStgaBNlHzMMQgl95nHBYMelLEHkUnVVVTUsgC0Huj09du
# NfMaJ9ogxhPNThgq3i8w3DAGZ61AMeF0C1M+mU5eucj1Ijod5O2MMPeJQ3/vKBtq
# GZg4eTtUHt/BPjN74SsJsyHqAdXVS5c+ItyKWg3Eforhox9k3WgtWTpgV4gkSiS4
# +A09roSdOI4vrRw+p+fL4WrxSK5nMYIatTCCGrECAQEwcTBaMQswCQYDVQQGEwJV
# UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYDVQQDEyJNaWNy
# b3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDAxAhMzAAVnfVmd97XgJcLKAAAA
# BWd9MAsGCWCGSAFlAwQCAaB8MBAGCisGAQQBgjcCAQwxAjAAMBkGCSqGSIb3DQEJ
# AzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8G
# CSqGSIb3DQEJBDEiBCDburpZk+/SJKKTs/0X4l8986P4ysZr0VCbFjLJ8ASZTTAL
# BgkqhkiG9w0BAQEEggGAQD1f8fYBXvQscreKarN7xcxX22a/RB5QE7yDrZKPYAnt
# YRZca8CCAUWNkGImH9omDyyun7lSw9CPbRQ2reK0yogdj6uyZ4JQi03/iTIwAO3o
# bqanQYfZYwO//qAcYcznlmLoigdssA93ZFcTaCS86eXnhMe12luSyXSR+OQhQJV/
# v7USsJC2IrDGvU2wWJNp77lAItBCn+/tcs82OXY6h91EokPJwQ1HkhkbxBWQf1DO
# VE0OJWv7LD8hJ5ANchyMjPrh+18zei5iRoqSjjhCzbDy6CAhtMu+WqYcXyAF56UZ
# cwaVgL1ecBulb0tJC9KOWcaY6CHEb6bT/Ekin0x2OP0fmT1rmaAUR8VxLpExJgdq
# zdRDJ7wzSLmTQxYJaj4QV2wKdyEDZIXHt3rVPoPXgZToN+XW380nYEqR6OeGCBHA
# ++/vm5OiY5R0WrB6BfFRr+AWT4Mdgi9W5StmblT3gHplzqxqVGwYtgOmHVuMbI8j
# EMX8pBOpM34kuVUkQSn/oYIYGzCCGBcGCisGAQQBgjcDAwExghgHMIIYAwYJKoZI
# hvcNAQcCoIIX9DCCF/ACAQMxDzANBglghkgBZQMEAgEFADCCAWwGCyqGSIb3DQEJ
# EAEEoIIBWwSCAVcwggFTAgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAE
# IL/U8S6Zov3KCKJrQ21hF4Ng7oVO1eINVARtlF4QSb0UAgZowf5ZnngYEjIwMjUw
# OTEyMDEyNDMzLjAxWjAEgAIB9AIJAO25UiMTABLpoIHhpIHeMIHbMQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQg
# QW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046N0Ew
# MC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUg
# U3RhbXBpbmcgQXV0aG9yaXR5oIIPITCCB4IwggVqoAMCAQICEzMAAAAF5c8P/2Yu
# yYcAAAAAAAUwDQYJKoZIhvcNAQEMBQAwdzELMAkGA1UEBhMCVVMxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UEAxM/TWljcm9zb2Z0IElkZW50
# aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDIw
# MB4XDTIwMTExOTIwMzIzMVoXDTM1MTExOTIwNDIzMVowYTELMAkGA1UEBhMCVVMx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9z
# b2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjAwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQCefOdSY/3gxZ8FfWO1BiKjHB7X55cz0RMFvWVG
# R3eRwV1wb3+yq0OXDEqhUhxqoNv6iYWKjkMcLhEFxvJAeNcLAyT+XdM5i2CgGPGc
# b95WJLiw7HzLiBKrxmDj1EQB/mG5eEiRBEp7dDGzxKCnTYocDOcRr9KxqHydajmE
# kzXHOeRGwU+7qt8Md5l4bVZrXAhK+WSk5CihNQsWbzT1nRliVDwunuLkX1hyIWXI
# ArCfrKM3+RHh+Sq5RZ8aYyik2r8HxT+l2hmRllBvE2Wok6IEaAJanHr24qoqFM9W
# LeBUSudz+qL51HwDYyIDPSQ3SeHtKog0ZubDk4hELQSxnfVYXdTGncaBnB60QrEu
# azvcob9n4yR65pUNBCF5qeA4QwYnilBkfnmeAjRN3LVuLr0g0FXkqfYdUmj1fFFh
# H8k8YBozrEaXnsSL3kdTD01X+4LfIWOuFzTzuoslBrBILfHNj8RfOxPgjuwNvE6Y
# zauXi4orp4Sm6tF245DaFOSYbWFK5ZgG6cUY2/bUq3g3bQAqZt65KcaewEJ3ZyNE
# obv35Nf6xN6FrA6jF9447+NHvCjeWLCQZ3M8lgeCcnnhTFtyQX3XgCoc6IRXvFOc
# PVrr3D9RPHCMS6Ckg8wggTrtIVnY8yjbvGOUsAdZbeXUIQAWMs0d3cRDv09SvwVR
# d61evQIDAQABo4ICGzCCAhcwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQD
# AgEAMB0GA1UdDgQWBBRraSg6NS9IY0DPe9ivSek+2T3bITBUBgNVHSAETTBLMEkG
# BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkG
# CSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
# BBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElk
# ZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0
# aG9yaXR5JTIwMjAyMC5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMIGBBggrBgEFBQcw
# AoZ1aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3Nv
# ZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0
# ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0MA0GCSqGSIb3DQEBDAUAA4ICAQBfiHbH
# fm21WhV150x4aPpO4dhEmSUVpbixNDmv6TvuIHv1xIs174bNGO/ilWMm+Jx5boAX
# rJxagRhHQtiFprSjMktTliL4sKZyt2i+SXncM23gRezzsoOiBhv14YSd1Klnlkzv
# gs29XNjT+c8hIfPRe9rvVCMPiH7zPZcw5nNjthDQ+zD563I1nUJ6y59TbXWsuyUs
# qw7wXZoGzZwijWT5oc6GvD3HDokJY401uhnj3ubBhbkR83RbfMvmzdp3he2bvIUz
# tSOuFzRqrLfEvsPkVHYnvH1wtYyrt5vShiKheGpXa2AWpsod4OJyT4/y0dggWi8g
# /tgbhmQlZqDUf3UqUQsZaLdIu/XSjgoZqDjamzCPJtOLi2hBwL+KsCh0Nbwc21f5
# xvPSwym0Ukr4o5sCcMUcSy6TEP7uMV8RX0eH/4JLEpGyae6Ki8JYg5v4fsNGif1O
# XHJ2IWG+7zyjTDfkmQ1snFOTgyEX8qBpefQbF0fx6URrYiarjmBprwP6ZObwtZXJ
# 23jK3Fg/9uqM3j0P01nzVygTppBabzxPAh/hHhhls6kwo3QLJ6No803jUsZcd4JQ
# xiYHHc+Q/wAMcPUnYKv/q2O444LO1+n6j01z5mggCSlRwD9faBIySAcA9S8h22hI
# AcRQqIGEjolCK9F6nK9ZyX4lhthsGHumaABdWzCCB5cwggV/oAMCAQICEzMAAABH
# 45ULN6Fg3ccAAAAAAEcwDQYJKoZIhvcNAQEMBQAwYTELMAkGA1UEBhMCVVMxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0
# IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjAwHhcNMjQxMTI2MTg0ODUw
# WhcNMjUxMTE5MTg0ODUwWjCB2zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEn
# MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjdBMDAtMDVFMC1EOTQ3MTUwMwYDVQQD
# EyxNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCC
# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOhwum733P/414hmZHfYYmDZ
# VP+N33qlguy82eB4fipfArWpWYVpdeSRVvFvV85Aky6RiRtrdYRzr1b9ngGzMC7G
# C5OENWVj2yThliQYyDGirVnmKdQ++PhCHzFW+WGIBLo5/+4vAOxuwqWDZ8ama/O2
# I9I4v0/XmTTQjhuyXW+WZFK63a03AlDmxemhPsYj/ZPYDQadZsUQIpELIZb2uyfL
# 2jQs0hSXg1gB3hrAZKzo4jMo+kgrUl8r3TBce9pfAYlw30/xA9Ekgcq4WhUbMhQb
# 8LSNALitDrbJMa9zaxngDFNDB+V9UEFqIeryCf9gMelmKV4aQHYhBrNkSIRzk6vl
# d6v2ZQNT7YUR7rrDx7ZaQtdqerFoPn5lyj4T5B3BxNgajvyMXE8O82tpOvlACAhN
# zh1j88ELdxgXNyAPJTHbE5UIG+BpuonGPuteuPgGF3ZL9lNg5UeGLxwNYFp58zwm
# CI7wYIghG+U1aeDwUoW3T1l83GaxJ0ImVbDes0DCwFjXGnymaa/2vYz2s0hGRn6y
# HTF3ca4BJazZs6uoGLRpPOBj1vcLFj7+b5FT5ROKbkmSakkz8Ag/rz9L7U3AWpcr
# nLFMkEgieGgSB0QeL5rYlHZKVXcCSklrT8HqxlqgRr7OCyEh8VrrpcGaeezJ1Xi4
# btbUg2ho1XDEEoN2ao1HAgMBAAGjggHLMIIBxzAdBgNVHQ4EFgQU5FR2WCA6Pu9P
# ubZe8WFIRbyG3WgwHwYDVR0jBBgwFoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYD
# VR0fBGUwYzBhoF+gXYZbaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j
# cmwvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0El
# MjAyMDIwLmNybDB5BggrBgEFBQcBAQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGlj
# JTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8E
# AjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNV
# HSAEXzBdMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EM
# AQQCMA0GCSqGSIb3DQEBDAUAA4ICAQANIlRD1dqYOHSCQLVe+uFXPoAzAZUq4okD
# 62SUnMFrhRVg/dj2vVEtTTxFgkiM8SSnCLANaK0rnyCxnHA2Hg1zh8WJCtlQln0E
# id+eh2/xY47zfNjxhB0kxymAHN5hVeI0J526aoUpePSYwy5ZoHKe/vDCfsWccnDM
# uu7iO3hUt55/4HJydjA+gxrvksX/3Fmj/RMnfvWq0Fh1uxx4qY2FBRMPa8i+8+Qd
# M8f80DYiQuxDUCbnWfOHnZYQPNEKhd6V3r78oKWd+wQHX+99Hqlg/HBlO9Nnu6Hv
# LwPqDiEOkRyMix6zvnhbZpGnFM+u7qf7PYTOS8cXvQH+DmgCh2ZVNQFv6nGm7vtQ
# ebROtpWh2N9ckk2z6HVGOcK70yKS7YqE+akGuxKd7fXLeBey2bm9y2nW0WjH1qZN
# a+EhXzyXUQgLfJf4E31wYq0vrlESX/LzKprY8hbaLXwkxEivhPuWId9fQDqx0+yX
# sa50vIRUcBaxbw0VXO3+93JGHMxSmzGE8vWoZCAPjlD7duBOV6XkxaVaBgb5v4st
# RdHm6LJtsizCc5FNT+MPJw0DHy7hzn7Xix6fn9+apytBrfXqXtapxDqs5yjEMXKb
# uTZFW4SFk1Dhc1cIojuRvw8ytG0xuhtXSavJ3RSVtBRs+wm432dQTYAOaCc7dtAb
# IRG+ml50ITGCB0Mwggc/AgEBMHgwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBS
# U0EgVGltZXN0YW1waW5nIENBIDIwMjACEzMAAABH45ULN6Fg3ccAAAAAAEcwDQYJ
# YIZIAWUDBAIBBQCgggScMBEGCyqGSIb3DQEJEAIPMQIFADAaBgkqhkiG9w0BCQMx
# DQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI1MDkxMjAxMjQzM1owLwYJ
# KoZIhvcNAQkEMSIEICiSOHv8/Gs3MpX6gnz/lhuD+VkB9KDjcQV+aXdglIOEMIG5
# BgsqhkiG9w0BCRACLzGBqTCBpjCBozCBoAQgk2bzlnKFAAYZ71A+F3f7G+YwoK9+
# MeF/y2XqZEgKzKcwfDBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0Eg
# VGltZXN0YW1waW5nIENBIDIwMjACEzMAAABH45ULN6Fg3ccAAAAAAEcwggNeBgsq
# hkiG9w0BCRACEjGCA00wggNJoYIDRTCCA0EwggIpAgEBMIIBCaGB4aSB3jCB2zEL
# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWlj
# cm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1Mg
# RVNOOjdBMDAtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVibGljIFJT
# QSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaIjCgEBMAcGBSsOAwIaAxUAIAXT2b4g
# vIw3J1lPs/eU4s1UXN2gZzBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBS
# U0EgVGltZXN0YW1waW5nIENBIDIwMjAwDQYJKoZIhvcNAQELBQACBQDsbc5eMCIY
# DzIwMjUwOTExMjI0MDMwWhgPMjAyNTA5MTIyMjQwMzBaMHQwOgYKKwYBBAGEWQoE
# ATEsMCowCgIFAOxtzl4CAQAwBwIBAAICBe4wBwIBAAICEq0wCgIFAOxvH94CAQAw
# NgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgC
# AQACAwGGoDANBgkqhkiG9w0BAQsFAAOCAQEA1TsbS6Zgos2TwTxp2SddxEMyLhZA
# QJhnoohhhZwuQ7hSA8zRoZEqDMNPfIo0igmwBlLIun+bl1D4kjqhtAsRaZ24NY+V
# e2D2F8MfV2armAtIXbFw8UI36m3rLIePaDBI0iBxEzM45atEcgAs9EUTGW0wmmRc
# XZZkGoFNxVvuhwdbAw/FS0WgLuwwrMhKnsfPjL8urEktjyvS74NvaMfVZM8ipgBB
# bkRoPkdAGkKxtqVbqF0IYUh8KlD9xdfMwBB143J2Zh7pba9CCtQowVryNElaGbET
# 1gwG4Ox6WnDAMCUvAVG40VW+rt6XUBX/dcHERsuuMjovt4lG2iEoh1EJCzANBgkq
# hkiG9w0BAQEFAASCAgCLoy7EfkW9wldh6xH4rNd9h5ImMbse1xhUHS80K7+r6Bm5
# SXKYMojD5d+JO3Ivstwibqu5xLr3iScX7D1zIYgu52ErfZGkBHB6WDx/nQbwGvoc
# m0vm6FnILfsvRzKkW+GD9K6iAPJbDYW5gv9cAp016mNGus2AnKQhmqBbsCIPe5eY
# AlywEq+qc3lRRuOajrAYv/p89D7HEwNiWhibxy2mabVYh7Jc4m3KpS40xVDT/6jX
# 2PZFLP8L5Eb+J/m8vwR4E88dbKK9N6ytZzcuqDiM1+TibYKoDEqanJO7ev7xAVhU
# 9exnZg3JpXw1bXN5HuifC3E3kol4anWjFFlhRLlo2Ld4kOMOuwvDWkQ8wjAEc4kZ
# XfbmGnBd/CMs5DjctS5Ya3DQrLyLo+nvkehfdQAKcsxdc71uGlxeGE/RX+WNGJDg
# SxcrainVCTAKhM4HuqhSM5UR2RPVDT9SJfINPgZC+tPKzaAZ5+rC9VfmUAylNkOy
# rqAG9c79zidvUzoVNWvYRSHOHXYMxg4T1VveB0v2mdkLTKDgp6SAPlyid8b2GovG
# 6IMNL+qV6cyNy+ZD4WZwQtWoQ7ChdvKtRVOytHd8L1rsT9F1tKB6kD+rBpLlEt0C
# k6ulN0lxx2RLvQwxB4J7CiPV+zVI/G7RW5uv+jjeqMw7HN/+iFOixgqhhzpULA==
# SIG # End signature block