Bindings.ps1

# Copyright (c) Microsoft Corporation. All rights reserved.

$Arch = switch ($env:PROCESSOR_ARCHITECTURE) {
    'AMD64' { 'x86_64' }
    'ARM64' { 'arm64' }
    default { throw "Unsupported architecture '$env:PROCESSOR_ARCHITECTURE'." }
}

$DllPath = "$PSScriptRoot\bin\$Arch\Microsoft.OSConfig.dll" -replace '\\', '\\'

if ((Get-Item -Path $DllPath).VersionInfo.FileVersion -ne '0.1.0') {
    throw "The DLL at '$DllPath' is not the expected version."
}

$TypeDefinition = @"
// <auto-generated>
// This code is generated by csbindgen.
// DON'T CHANGE THIS DIRECTLY.
// </auto-generated>
#pragma warning disable CS8500
#pragma warning disable CS8981
using System;
using System.Runtime.InteropServices;


namespace Microsoft.OSConfig
{
    public static unsafe partial class NativeMethods
    {
        const string __DllName = "$DllPath";





        [DllImport(__DllName, EntryPoint = "init", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void init(ByteBuffer locale, Logger logger);

        [DllImport(__DllName, EntryPoint = "apply_by_file", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void apply_by_file(ByteBuffer authority, ByteBuffer id, ByteBuffer path, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "apply_by_content", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void apply_by_content(ByteBuffer authority, ByteBuffer id, ByteBuffer content, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "apply_by_url", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void apply_by_url(ByteBuffer authority, ByteBuffer id, ByteBuffer url, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "query_by_id", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void query_by_id(ByteBuffer authority, ByteBuffer id, ByteBuffer filter, ByteBuffer format, [MarshalAs(UnmanagedType.U1)] bool execute, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "query_by_file", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void query_by_file(ByteBuffer authority, ByteBuffer path, ByteBuffer filter, ByteBuffer format, [MarshalAs(UnmanagedType.U1)] bool execute, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "query_by_content", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void query_by_content(ByteBuffer authority, ByteBuffer content, ByteBuffer filter, ByteBuffer format, [MarshalAs(UnmanagedType.U1)] bool execute, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "query_by_url", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void query_by_url(ByteBuffer authority, ByteBuffer url, ByteBuffer filter, ByteBuffer format, [MarshalAs(UnmanagedType.U1)] bool execute, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "list_all", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void list_all(CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "remove_by_id", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void remove_by_id(ByteBuffer authority, ByteBuffer id, ByteBuffer filter, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "enable_drift_control", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void enable_drift_control(ByteBuffer authority, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "disable_drift_control", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void disable_drift_control(ByteBuffer authority, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "set_drift_control_refresh_period", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void set_drift_control_refresh_period(ByteBuffer authority, uint minutes, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "get_drift_control_status", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void get_drift_control_status(ByteBuffer authority, CallStatus* call_status);

        [DllImport(__DllName, EntryPoint = "emit_setting_change_event", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
        public static extern void emit_setting_change_event(ByteBuffer setting_name, ByteBuffer old_value, ByteBuffer new_value, ByteBuffer authority, ByteBuffer outcome, CallStatus* call_status);


    }

    [StructLayout(LayoutKind.Sequential)]
    public unsafe partial struct CallStatus
    {
        public CallStatusCode code;
        public ByteBuffer data;
    }

    [StructLayout(LayoutKind.Sequential)]
    public unsafe partial struct ByteBuffer
    {
        public uint len;
        public uint cap;
        public byte* ptr;
    }


    public enum CallStatusCode : sbyte
    {
        Success = 0,
        Error = 1,
        Panic = 2,
    }


}


namespace Microsoft.OSConfig
{
    public unsafe partial struct ByteBuffer
    {
        public static ByteBuffer FromString(string str)
        {
            var bytes = System.Text.Encoding.UTF8.GetBytes(str);
            var buffer = new ByteBuffer
            {
                len = (uint)bytes.Length,
                cap = (uint)bytes.Length,
                ptr = (byte*)Marshal.AllocHGlobal(bytes.Length),
            };
            Marshal.Copy(bytes, 0, (IntPtr)buffer.ptr, bytes.Length);
            return buffer;
        }

        public string AsString()
        {
            var bytes = new byte[len];
            Marshal.Copy((IntPtr)ptr, bytes, 0, (int)len);
            return System.Text.Encoding.UTF8.GetString(bytes);
        }
    }

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void LogCallback([MarshalAs(UnmanagedType.LPStr)] string message);

    [StructLayout(LayoutKind.Sequential)]
    public unsafe struct Logger
    {
        public LogCallback Error;
        public LogCallback Warning;
        public LogCallback Information;
        public LogCallback Debug;
        public LogCallback Verbose;
    };

    public static class Platform
    {
        public static unsafe void Initialize(string locale, Logger logger)
        {
            NativeMethods.init(ByteBuffer.FromString(locale), logger);
        }

        public static unsafe void ApplyByFile(string authority, string id, string path)
        {
            var callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);
            var idBuffer = ByteBuffer.FromString(id);
            var pathBuffer = ByteBuffer.FromString(path);

            try
            {
                NativeMethods.apply_by_file(authorityBuffer, idBuffer, pathBuffer, &callStatus);
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)idBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)pathBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }
        }

        public static unsafe void ApplyByUrl(string authority, string id, string url)
        {
            var callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);
            var idBuffer = ByteBuffer.FromString(id);
            var urlBuffer = ByteBuffer.FromString(url);

            try
            {
                NativeMethods.apply_by_url(authorityBuffer, idBuffer, urlBuffer, &callStatus);
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)idBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)urlBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }
        }

        public static unsafe void ApplyByContent(string authority, string id, string content)
        {
            var callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);
            var idBuffer = ByteBuffer.FromString(id);
            var contentBuffer = ByteBuffer.FromString(content);

            try
            {
                NativeMethods.apply_by_content(authorityBuffer, idBuffer, contentBuffer, &callStatus);
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)idBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)contentBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }
        }

        public static unsafe string QueryById(
            string authority,
            string id,
            string[] filter,
            string format,
            bool execute
        )
        {
            var callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);
            var idBuffer = ByteBuffer.FromString(id);
            var filterBuffer = ByteBuffer.FromString(string.Join(",", (filter == null ? Array.Empty<string>() : filter)));
            var formatBuffer = ByteBuffer.FromString(format);

            try
            {
                NativeMethods.query_by_id(
                    authorityBuffer,
                    idBuffer,
                    filterBuffer,
                    formatBuffer,
                    execute,
                    &callStatus
                );
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)idBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)filterBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)formatBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }

            return callStatus.data.AsString();
        }

        public static unsafe string QueryByFile(
            string authority,
            string path,
            string[] filter,
            string format,
            bool execute
        )
        {
            var callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);
            var pathBuffer = ByteBuffer.FromString(path);
            var filterBuffer = ByteBuffer.FromString(string.Join(",", (filter == null ? Array.Empty<string>() : filter)));
            var formatBuffer = ByteBuffer.FromString(format);

            try
            {
                NativeMethods.query_by_file(
                    authorityBuffer,
                    pathBuffer,
                    filterBuffer,
                    formatBuffer,
                    execute,
                    &callStatus
                );
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)pathBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)filterBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)formatBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }

            return callStatus.data.AsString();
        }

        public static unsafe string QueryByContent(
            string authority,
            string content,
            string[] filter,
            string format,
            bool execute
        )
        {
            var callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);
            var contentBuffer = ByteBuffer.FromString(content);
            var filterBuffer = ByteBuffer.FromString(string.Join(",", (filter == null ? Array.Empty<string>() : filter)));
            var formatBuffer = ByteBuffer.FromString(format);

            try
            {
                NativeMethods.query_by_content(
                    authorityBuffer,
                    contentBuffer,
                    filterBuffer,
                    formatBuffer,
                    execute,
                    &callStatus
                );
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)contentBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)filterBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)formatBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }

            return callStatus.data.AsString();
        }

        public static unsafe string ListAll()
        {
            var callStatus = new CallStatus();

            try
            {
                NativeMethods.list_all(&callStatus);
            }
            finally
            {
                // no-op
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }

            return callStatus.data.AsString();
        }

        public static unsafe void RemoveById(
            string authority,
            string id,
            string[] filter
        )
        {
            var callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);
            var idBuffer = ByteBuffer.FromString(id);
            var filterBuffer = ByteBuffer.FromString(string.Join(",", (filter == null ? Array.Empty<string>() : filter)));

            try
            {
                NativeMethods.remove_by_id(
                    authorityBuffer,
                    idBuffer,
                    filterBuffer,
                    &callStatus
                );
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)idBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)filterBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }
        }

        public static unsafe void EnableDriftControl(string authority)
        {
            CallStatus callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);
            try
            {
                NativeMethods.enable_drift_control(authorityBuffer, &callStatus);
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }
        }

        public static unsafe void DisableDriftControl(string authority)
        {
            CallStatus callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);

            try
            {
                NativeMethods.disable_drift_control(authorityBuffer, &callStatus);
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }
        }

        public static unsafe void SetDriftControlRefreshPeriod(string authority, uint minutes)
        {
            CallStatus callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);

            try
            {
                NativeMethods.set_drift_control_refresh_period(authorityBuffer, minutes, &callStatus);
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }
        }

        public static unsafe string GetDriftControlStatus(string authority)
        {
            CallStatus callStatus = new CallStatus();
            var authorityBuffer = ByteBuffer.FromString(authority);

            try
            {
                NativeMethods.get_drift_control_status(authorityBuffer, &callStatus);
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
            }

            if (callStatus.code == CallStatusCode.Success)
            {
                return callStatus.data.AsString();
            }
            else
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }
        }

        public static unsafe void EmitSettingChangeEvent(
            string settingName,
            string oldValue,
            string newValue,
            string authority,
            string outcome
        )
        {
            CallStatus callStatus = new CallStatus();
            var settingNameBuffer = ByteBuffer.FromString(settingName);
            var oldValueBuffer = ByteBuffer.FromString(oldValue);
            var newValueBuffer = ByteBuffer.FromString(newValue);
            var authorityBuffer = ByteBuffer.FromString(authority);
            var outcomeBuffer = ByteBuffer.FromString(outcome);

            try
            {
                NativeMethods.emit_setting_change_event(settingNameBuffer, oldValueBuffer, newValueBuffer, authorityBuffer, outcomeBuffer, &callStatus);
            }
            finally
            {
                Marshal.FreeHGlobal((IntPtr)settingNameBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)oldValueBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)newValueBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)authorityBuffer.ptr);
                Marshal.FreeHGlobal((IntPtr)outcomeBuffer.ptr);
            }

            if (callStatus.code != CallStatusCode.Success)
            {
                throw new PlatformException(
                    String.Format("Operation failed: {0}", callStatus.data.AsString())
                );
            }
        }
    }

    public class PlatformException : Exception
    {
        public PlatformException(string message)
            : base(message) { }
    }
}

"@


Write-Verbose "Loading '$DllPath'..."

if ($PSVersionTable.PSEdition -eq 'Core') {
    Add-Type -TypeDefinition $TypeDefinition -CompilerOptions "/unsafe" -Language CSharp
} else {
    $CompilerParameters = New-Object -TypeName System.CodeDom.Compiler.CompilerParameters
    $CompilerParameters.CompilerOptions = '/unsafe'
    Add-Type -TypeDefinition $TypeDefinition -CompilerParameters $CompilerParameters -Language CSharp
}

$Script:ErrorCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Error -Message "$Message" }
$Script:WarningCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Warning -Message "$Message" }
$Script:InformationCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Host -Object "$Message" }
$Script:DebugCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Debug -Message "$Message" }
$Script:VerboseCallback = [Microsoft.OSConfig.LogCallback] { param([String] $Message) Write-Verbose -Message "$Message" }

[Microsoft.OSConfig.Platform]::Initialize(
    (Get-Culture).Name,
    [Microsoft.OSConfig.Logger]@{
        Error       = $Script:ErrorCallback
        Warning     = $Script:WarningCallback
        Information = $Script:InformationCallback
        Debug       = $Script:DebugCallback
        Verbose     = $Script:VerboseCallback
    }
)

# SIG # Begin signature block
# MIIoRgYJKoZIhvcNAQcCoIIoNzCCKDMCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC0O2VctJh4qyjs
# y1wz3InmcPvZBSHmPm6XR2R9Wf9soqCCDXYwggX0MIID3KADAgECAhMzAAAEhV6Z
# 7A5ZL83XAAAAAASFMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjUwNjE5MTgyMTM3WhcNMjYwNjE3MTgyMTM3WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDASkh1cpvuUqfbqxele7LCSHEamVNBfFE4uY1FkGsAdUF/vnjpE1dnAD9vMOqy
# 5ZO49ILhP4jiP/P2Pn9ao+5TDtKmcQ+pZdzbG7t43yRXJC3nXvTGQroodPi9USQi
# 9rI+0gwuXRKBII7L+k3kMkKLmFrsWUjzgXVCLYa6ZH7BCALAcJWZTwWPoiT4HpqQ
# hJcYLB7pfetAVCeBEVZD8itKQ6QA5/LQR+9X6dlSj4Vxta4JnpxvgSrkjXCz+tlJ
# 67ABZ551lw23RWU1uyfgCfEFhBfiyPR2WSjskPl9ap6qrf8fNQ1sGYun2p4JdXxe
# UAKf1hVa/3TQXjvPTiRXCnJPAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUuCZyGiCuLYE0aU7j5TFqY05kko0w
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzUwNTM1OTAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBACjmqAp2Ci4sTHZci+qk
# tEAKsFk5HNVGKyWR2rFGXsd7cggZ04H5U4SV0fAL6fOE9dLvt4I7HBHLhpGdE5Uj
# Ly4NxLTG2bDAkeAVmxmd2uKWVGKym1aarDxXfv3GCN4mRX+Pn4c+py3S/6Kkt5eS
# DAIIsrzKw3Kh2SW1hCwXX/k1v4b+NH1Fjl+i/xPJspXCFuZB4aC5FLT5fgbRKqns
# WeAdn8DsrYQhT3QXLt6Nv3/dMzv7G/Cdpbdcoul8FYl+t3dmXM+SIClC3l2ae0wO
# lNrQ42yQEycuPU5OoqLT85jsZ7+4CaScfFINlO7l7Y7r/xauqHbSPQ1r3oIC+e71
# 5s2G3ClZa3y99aYx2lnXYe1srcrIx8NAXTViiypXVn9ZGmEkfNcfDiqGQwkml5z9
# nm3pWiBZ69adaBBbAFEjyJG4y0a76bel/4sDCVvaZzLM3TFbxVO9BQrjZRtbJZbk
# C3XArpLqZSfx53SuYdddxPX8pvcqFuEu8wcUeD05t9xNbJ4TtdAECJlEi0vvBxlm
# M5tzFXy2qZeqPMXHSQYqPgZ9jvScZ6NwznFD0+33kbzyhOSz/WuGbAu4cHZG8gKn
# lQVT4uA2Diex9DMs2WHiokNknYlLoUeWXW1QrJLpqO82TLyKTbBM/oZHAdIc0kzo
# STro9b3+vjn2809D0+SOOCVZMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg
# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03
# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr
# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg
# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy
# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9
# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh
# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB
# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn
# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90
# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w
# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o
# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa
# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG
# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG
# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl
# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb
# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l
# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6
# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0
# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560
# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam
# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa
# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
# /Xmfwb1tbWrJUnMTDXpQzTGCGiYwghoiAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBIDIwMTECEzMAAASFXpnsDlkvzdcAAAAABIUwDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIKMWu5lW6tfYx60yOArWzJ6I
# PxEQjoTytQBnRLKJQZhnMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggEAm7TY7yNFPJgpR6ZGcDakg3YlVjyMAMtpvrH1wk7LWlhaBQxSsz4ns3nB
# X8BAxmSwZ5RkVA1hlHr/W/9V3BD9V7pna+O3/k1zk7cJRwV1bwGXdb8zj/nm4f09
# vYuP70fUkDax0aKDz9u8/qZV5GNs0+74VRZT9Ipi07YnwNyA0VFcX/fJxz0coDrW
# 0rAQwB6+YUzmdFVfp1/4TphrQ0+iZQ/nah78x9FqM1Fvc3p7FM3P9f9Dh4fV6k43
# GnkrmSg9E4dSxV7K6Yh9R4yj34spZo5Dg8ZLKdw4lkz/TSA9EJiB5ZVUTBRrvBmj
# rEIJ8ZXwMcQap37M/iPTnS8fGgHBEqGCF7AwghesBgorBgEEAYI3AwMBMYIXnDCC
# F5gGCSqGSIb3DQEHAqCCF4kwgheFAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsq
# hkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
# AwQCAQUABCAhXrglUOCc2jG2ziRMoi8iGW8Ki606zV5ISWyC+Q8esAIGaKOpP9b3
# GBMyMDI1MDkwMjE3MTM0Ni4zOTJaMASAAgH0oIHZpIHWMIHTMQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
# bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT
# TjozMjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaCCEf4wggcoMIIFEKADAgECAhMzAAAB+KOhJgwMQEj+AAEAAAH4MA0G
# CSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI0
# MDcyNTE4MzEwOFoXDTI1MTAyMjE4MzEwOFowgdMxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9w
# ZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjMyMUEt
# MDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl
# MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxR23pXYnD2BuODdeXs2C
# u/T5kKI+bAw8cbtN50Cm/FArjXyL4RTqMe6laQ/CqeMTxgckvZr1JrW0Mi4F15rx
# /VveGhKBmob45DmOcV5xyx7h9Tk59NAl5PNMAWKAIWf270SWAAWxQbpVIhhPWCnV
# V3otVvahEad8pMmoSXrT5Z7Nk1RnB70A2bq9Hk8wIeC3vBuxEX2E8X50IgAHsyaR
# 9roFq3ErzUEHlS8YnSq33ui5uBcrFOcFOCZILuVFVTgEqSrX4UiX0etqi7jUtKyp
# gIflaZcV5cI5XI/eCxY8wDNmBprhYMNlYxdmQ9aLRDcTKWtddWpnJtyl5e3gHuYo
# j8xuDQ0XZNy7ESRwJIK03+rTZqfaYyM4XSK1s0aa+mO69vo/NmJ4R/f1+KucBPJ4
# yUdbqJWM3xMvBwLYycvigI/WK4kgPog0UBNczaQwDVXpcU+TMcOvWP8HBWmWJQIm
# TZInAFivXqUaBbo3wAfPNbsQpvNNGu/12pg0F8O/CdRfgPHfOhIWQ0D8ALCY+Lsi
# wbzcejbrVl4N9fn2wOg2sDa8RfNoD614I0pFjy/lq1NsBo9V4GZBikzX7ZjWCRgd
# 1FCBXGpfpDikHjQ05YOkAakdWDT2bGSaUZJGVYtepIpPTAs1gd/vUogcdiL51o7s
# huHIlB6QSUiQ24XYhRbbQCECAwEAAaOCAUkwggFFMB0GA1UdDgQWBBS9zsZzz57Q
# lT5nrt/oitLv1OQ7tjAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBf
# BgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmww
# bAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0El
# MjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUF
# BwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAYfk8GzzpEVnG
# l7y6oXoytCb42Hx6TOA0+dkaBI36ftDE9tLubUa/xMbHB5rcNiRhFHZ93RefdPpc
# 4+FF0DAl5lP8xKAO+293RWPKDFOFIxgtZY08t8D9cSQpgGUzyw3lETZebNLEA17A
# /CTpA2F9uh8j84KygeEbj+bidWDiEfayoH2A5/5ywJJxIuLzFVHacvWxSCKoF9hl
# SrZSG5fXWS3namf4tt690UT6AGyWLFWe895coFPxm/m0UIMjjp9VRFH7nb3Ng2Q4
# gPS9E5ZTMZ6nAlmUicDj0NXAs2wQuQrnYnbRAJ/DQW35qLo7Daw9AsItqjFhbMcG
# 68gDc4j74L2KYe/2goBHLwzSn5UDftS1HZI0ZRsqmNHI0TZvvUWX9ajm6SfLBTEt
# oTo6gLOX0UD/9rrhGjdkiCw4SwU5osClgqgiNMK5ndk2gxFlDXHCyLp5qB6BoPpc
# 82RhO0yCzoP9gv7zv2EocAWEsqE5+0Wmu5uarmfvcziLfU1SY240OZW8ld4sS8fn
# ybn/jDMmFAhazV1zH0QERWEsfLSpwkOXaImWNFJ5lmcnf1VTm6cmfasScYtElpjq
# Z9GooCmk1XFApORPs/PO43IcFmPRwagt00iQSw+rBeIH00KQq+FJT/62SB70g9g/
# R8TS6k6b/wt2UWhqrW+Q8lw6Xzgex/YwggdxMIIFWaADAgECAhMzAAAAFcXna54C
# m0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZp
# Y2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMy
# MjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV
# BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51
# yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY
# 6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9
# cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN
# 7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDua
# Rr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74
# kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2
# K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5
# TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZk
# i1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9Q
# BXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3Pmri
# Lq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUC
# BBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJl
# pxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y
# eS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUA
# YgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU
# 1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2Ny
# bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIw
# MTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0w
# Ni0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/yp
# b+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulm
# ZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM
# 9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECW
# OKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4
# FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3Uw
# xTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPX
# fx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVX
# VAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGC
# onsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU
# 5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEG
# ahC0HVUzWLOhcGbyoYIDWTCCAkECAQEwggEBoYHZpIHWMIHTMQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
# bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT
# TjozMjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaIjCgEBMAcGBSsOAwIaAxUAtkQt/ebWSQ5DnG+aKRzPELCFE9GggYMw
# gYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD
# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsF
# AAIFAOxhRCgwIhgPMjAyNTA5MDIxMDIzMzZaGA8yMDI1MDkwMzEwMjMzNlowdzA9
# BgorBgEEAYRZCgQBMS8wLTAKAgUA7GFEKAIBADAKAgEAAgICegIB/zAHAgEAAgIV
# OzAKAgUA7GKVqAIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAow
# CAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQB1J2leaEej
# 6+D7l/fJ8HOSvX4kNgjkJFahGirE9MjXZI2nELxulK3fR/iTvRkLcoyst8hzEecR
# pAlW10vqm5Orim/Q/R1ysdU4UTbbLglwsnsF3y7conJsgbnHBAshp2jElsu3C21z
# zXkXzUlVlPKfBOyvtczNRHgCuRiQN1RgFKgEgBqFdIgOWKy2qBjLQ/vbdCjNJ4k3
# 6irt7qdGqRdSeMFb33s2p72Bu8zIa8/jfjq+bqbgngdpmDpBND3s6zmYCpc5MLJO
# Pw7qU1K4rSyrSmmP6P1shrX0xifwpbCBDavWn+N1iR2jumZNCmYzhJYdVsZCPUy1
# 5n+epUA9+xzbMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
# IDIwMTACEzMAAAH4o6EmDAxASP4AAQAAAfgwDQYJYIZIAWUDBAIBBQCgggFKMBoG
# CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgO/xPMQWD
# cNlS0tjUtH5Um2YU5nQtpY2p+kuABecCyCYwgfoGCyqGSIb3DQEJEAIvMYHqMIHn
# MIHkMIG9BCDvzDPyXw1UkAUFYt8bR4UdjM90Qv5xnVaiKD3I0Zz3WjCBmDCBgKR+
# MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT
# HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB+KOhJgwMQEj+AAEA
# AAH4MCIEIBaVZIjdWVWiEpjf6Hn+1oT75Il7zgdb8vOVLvCTMIgIMA0GCSqGSIb3
# DQEBCwUABIICACBaIfTK7JT3Ilg8rkLprUW8VkUhikVlBUogdn9RG6iJMI+vMsEa
# HGyf3+tW3q1sHEttwecPL0mF/ZkeEdR7bSKmLGgqI7tDY2PvmJoXZ8igz8oqGa5Q
# 7BJHjIJNzowB4gDI2nUpyU0aahFSiCw0DcXlHWQwyD+gUHKbB1gac4YDB19M5sz+
# IuVqhCwQJcd3NywJxLAkTAG85mCxxUeHnbPzVtAEUE075pLSz5A/n6PST/OEcncs
# GbPu8m8tGnKNEev2cm12W63sq+zJA5r4h1ehYnVoj/CUWtK1JVX5sjry0rXPOuKE
# DGacDznkt8AbZgKAGrF/+Go0v8dabuHaoMRbP1hJX6UEyWBFMP9om+Xt+onMWZbW
# jwc9BC0VICDNNEZapxv5HWzv0qbQctVr9KG+lFq/g22c5p2t7eToxOaK/HZNvUyB
# 9uH0boozR1q4gC1mxOBEOCH/aqYFp61u9VUbaLUg+3Bk8BBlcbszDzeNcjsiPNnd
# /R81nygU07lO6t4Xxa/GO0R+hbkGD4BzcCJMHZpiF/dk2Sgtb+fw9Rpqbe4/FtFC
# F2biUjBfxwuEZ1x9jEDXFBqihbeWcxsacMVhKZfa69EmRmHCRnIkUEfbriLokmV3
# GpfkzP0rfKYkOzWBVtKgmudN7K8qkbsBe9eZWOrOiUGO0w4E9FrA7yoX
# SIG # End signature block