Get-User.ps1

function Get-User {
<#
.SYNOPSIS
Retrieves one or more entities from the User entity set.
 
 
.DESCRIPTION
Retrieves one or more entities from the User entity set.
 
You can retrieve one ore more entities from the entity set by specifying
Id, Name or other properties.
 
 
.INPUTS
The Cmdlet can either return all available entities or filter entities on
specified conditions.
See PARAMETERS section on possible inputs.
 
 
.OUTPUTS
default | json | json-pretty | xml | xml-pretty
 
In addition output can be filtered on specified properties.
 
 
.EXAMPLE
Get-User -ListAvailable -Select Name, Id, ExternalId, Mail
 
Name Id ExternalId Mail
---- -- ---------- ----
Administrator 2 5ab3f3cf-d37e-4714-807b-5bfe14a1e51c Administrator@appclusive.net
User1 3 e67a2c50-b98b-4f25-be52-16ac1926234b User1@appclusive.net
...
 
Retrieves the Name, Id, ExternalId and Mail property of all Users.
 
 
.EXAMPLE
Get-User 2
 
ExternalId : 27af9d74-388b-46f2-90d6-a1545d89d16f
ExternalType : AuthenticationFilter
Mail : Administrator@appclusive.net
Id : 2
Tid : 22222222-2222-2222-2222-222222222222
Name : Administrator
Description : {"Tel":"+41-41-000 00 00"}
CreatedById : 1
ModifiedById : 2
Created : 15.12.2015 00:00:00 +01:00
Modified : 17.12.2015 00:00:00 +01:00
RowVersion : {0, 0, 0, 0...}
Tenant :
CreatedBy : SYSTEM
ModifiedBy : SYSTEM
 
Retrieves the User object with Id 2 and returns all properties of it.
 
 
.EXAMPLE
Get-User 2 -Select Description -ValueOnly -ConvertFromJson
 
Tel
---
+41-41-000 00 00
 
Similar to the previous example, but only returns the 'Description' property
of it. In addition the contents of the property will be converted from JSON.
 
 
.EXAMPLE
Get-User -ListAvailable -Select Id -First 3
 
Id
--
 2
 3
 4
 
Retrieves the id of the first 3 Users.
 
 
.EXAMPLE
Get-User 2 -Select Name -ValueOnly
 
Administrator
 
Retrieves the name of the User with Id 2.
 
 
.EXAMPLE
Get-User -ModifiedBy Administrator -Select Id, Name
 
Id Name
-- ----
 2 Administrator
 3 User1
 
Retrieves id and name of all Users that have been modified by user
with name 'Administrator' (case insensitive substring match).
 
 
.EXAMPLE
Get-User SuperUser -Select Name -ValueOnly -DefaultValue 'Administrator'
 
Administrator
 
Retrieves the 'Name' property of a User with Name 'SuperUser'
and Administrator if the entity is not found.
 
 
.EXAMPLE
# Retrieves information about the currently logged in user
 
PS > Get-User -Current
ExternalId : schnittenfittich
ExternalType : Integrated
Mail : schnittenfittich@appclusive.net
Id : 42
Tid : f2de53c1-62d0-4c15-8626-dac575f857a1
Name : schnittenfittich
Description : schnittenfittich
CreatedById : 1
ModifiedById : 1
Created : 6/22/2016 3:22:29 PM +02:00
Modified : 6/22/2016 3:22:29 PM +02:00
RowVersion : {0, 0, 0, 0...}
Tenant :
CreatedBy :
ModifiedBy :
 
.EXAMPLE
# Retrieves tenant information about the currently logged in user
 
PS > Get-User -TenantInformation
Id : 4048fba5-b81e-4cae-b2f4-6dbb90352875
ParentId : 199a7dca-ca61-4932-ada6-6c19f4af68851
NodeId : 42
JobId : 5
CustomerId : 8
ConfigurationId : 43
BuiltInRoles : biz.dfch.CS.Appclusive.Core.Managers.BuiltInRoles
    CloudAdmin : 19
    CloudUser : 20
    CloudGuest : 21
    CreatorOwner : 18
    Everyone : 17
    AppclusiveEveryone : 7
 
.EXAMPLE
# Retrieves the name of the currently logged in user
 
PS > (Get-User -WhoAmi).Name
schnittenfittich
 
.EXAMPLE
# Gets information about the tenant of the currently logged in user
PS > $tenantInformation = Get-User -TenantInformation;
PS > $tenantInformation
Id : e3c70408-9da0-45f2-ab7b-29d1081e948a
ParentId : d9c2feda-f3da-488a-8dd3-3747e40b6c6a
NodeId : 42
JobId : 123
CustomerId : 5
ConfigurationId : 43
BuiltInRoles : biz.dfch.CS.Appclusive.Core.Managers.BuiltInRoles
PS > $tenantInformation.BuiltInRoles
CloudAdmin : 14
CloudUser : 15
CloudGuest : 16
CreatorOwner : 12
Everyone : 13
AppclusiveEveryone : 5
 
.LINK
Online Version: http://dfch.biz/biz/dfch/PS/Appclusive/Client/Get-User/
 
 
.NOTES
See module manifest for required software versions and dependencies.
 
 
#>

[CmdletBinding(
    SupportsShouldProcess = $true
    ,
    ConfirmImpact = 'Low'
    ,
    HelpURI = 'http://dfch.biz/biz/dfch/PS/Appclusive/Client/Get-User/'
    ,
    DefaultParameterSetName = 'list'
)]
PARAM 
(
    # Specifies the id of the entity
    [Parameter(Mandatory = $false, Position = 0, ParameterSetName = 'id')]
    [long] $Id
    ,
    # Specifies the name of the entity
    [Parameter(Mandatory = $false, Position = 0, ParameterSetName = 'name')]
    [Alias('n')]
    [string] $Name
    ,
    # Filter by creator
    [Parameter(Mandatory = $false, ParameterSetName = 'name')]
    [string] $CreatedBy
    ,
    # Filter by modifier
    [Parameter(Mandatory = $false, ParameterSetName = 'name')]
    [string] $ModifiedBy
    ,
    # Specify the attributes of the entity to return
    [Parameter(Mandatory = $false)]
    [string[]] $Select = @()
    ,
    # Specifies to return only values without header information.
    # This parameter takes precendes over the 'Select' parameter.
    [ValidateScript( { if(1 -eq $Select.Count -And $_) { $true; } else { throw("You must specify exactly one 'Select' property when using 'ValueOnly'."); } } )]
    [Parameter(Mandatory = $false, ParameterSetName = 'name')]
    [Parameter(Mandatory = $false, ParameterSetName = 'id')]
    [Alias('HideTableHeaders')]
    [switch] $ValueOnly
    ,
    # This value is only returned if the regular search would have returned no results
    [Parameter(Mandatory = $false, ParameterSetName = 'name')]
    [Alias('default')]
    $DefaultValue
    ,
    # Specifies to deserialize JSON payloads
    [ValidateScript( { if($ValueOnly -And $_) { $true; } else { throw("You must set the 'ValueOnly' switch when using 'ConvertFromJson'."); } } )]
    [Parameter(Mandatory = $false, ParameterSetName = 'name')]
    [Parameter(Mandatory = $false, ParameterSetName = 'id')]
    [Alias('Convert')]
    [switch] $ConvertFromJson
    ,
    # Limits the output to the specified number of entries
    [Parameter(Mandatory = $false)]
    [Alias('top')]
    [int] $First
    ,
    # Service reference to Appclusive
    [Parameter(Mandatory = $false)]
    [Alias('Services')]
    [hashtable] $svc = (Get-Variable -Name $MyInvocation.MyCommand.Module.PrivateData.MODULEVAR -ValueOnly).Services
    ,
    # Indicates to return all file information
    [Parameter(Mandatory = $false, ParameterSetName = 'list')]
    [switch] $ListAvailable = $false
    ,
    # Specifies the return format of the Cmdlet
    [ValidateSet('default', 'json', 'json-pretty', 'xml', 'xml-pretty')]
    [Parameter(Mandatory = $false)]
    [alias('ReturnFormat')]
    [string] $As = 'default'
    ,
    # Specifies to retrieve information about the currently logged in user
    [Parameter(Mandatory = $false, ParameterSetName = 'current')]
    [alias('WhoAmI')]
    [alias('CurrentUser')]
    [switch] $Current = $false
    ,
    # Specifies to retrieve information about the currently logged in user
    [Parameter(Mandatory = $false, ParameterSetName = 'tenant')]
    [alias('Tenant')]
    [switch] $TenantInformation = $false
)

Begin 
{
    trap { Log-Exception $_; break; }

    $datBegin = [datetime]::Now;
    [string] $fn = $MyInvocation.MyCommand.Name;
    Log-Debug -fn $fn -msg ("CALL. svc '{0}'. Name '{1}'." -f ($svc -is [Object]), $Name) -fac 1;
    
    $EntitySetName = 'Users';
    
    # Parameter validation
    Contract-Requires ($svc.Core -is [biz.dfch.CS.Appclusive.Api.Core.Core]) "Connect to the server before using the Cmdlet"
    
    if($Select) 
    {
        $Select = $Select | Select -Unique;
    }
}
# Begin

Process 
{
    trap { Log-Exception $_; break; }

    # Default test variable for checking function response codes.
    [Boolean] $fReturn = $false;
    # Return values are always and only returned via OutputParameter.
    $OutputParameter = $null;

    Contract-Assert ($PSCmdlet.ShouldProcess(($PSBoundParameters | Out-String)))

    if($PSCmdlet.ParameterSetName -eq 'list') 
    {
        if($Select) 
        {
            if($PSBoundParameters.ContainsKey('First'))
            {
                $Response = $svc.Core.$EntitySetName.AddQueryOption('$orderby','Name').AddQueryOption('$top', $First) | Select -Property $Select;
            }
            else
            {
                $Response = $svc.Core.$EntitySetName.AddQueryOption('$orderby','Name') | Select -Property $Select;
            }
        }
        else 
        {
            if($PSBoundParameters.ContainsKey('First'))
            {
                $Response = $svc.Core.$EntitySetName.AddQueryOption('$orderby','Name').AddQueryOption('$top', $First) | Select;
            }
            else
            {
                $Response = $svc.Core.$EntitySetName.AddQueryOption('$orderby','Name') | Select;
            }
        }
    } 
    elseif($PSCmdlet.ParameterSetName -eq 'current')
    {
        $Response = $svc.Core.InvokeEntitySetActionWithSingleResult("Users", "Current", [biz.dfch.CS.Appclusive.Api.Core.User], $null);
        Contract-Assert (!!$Response);
    }
    elseif($PSCmdlet.ParameterSetName -eq 'tenant')
    {
        $Response = Get-Tenant -svc $svc -Current;
        Contract-Assert (!!$Response);
    }
    else 
    {
        $Exp = @();
        if($PSCmdlet.ParameterSetName -eq 'id')
        {
            $Exp += ("Id eq {0}" -f $Id);
        }
        if($Name) 
        { 
            $Exp += ("tolower(Name) eq '{0}'" -f $Name.ToLower());
        }
        if($CreatedBy) 
        { 
            $CreatedById = Get-User -svc $svc -Name $CreatedBy -Select Id -ValueOnly;
            if ( !$CreatedById )
            {
                # User not found
                throw($gotoSuccess);
            }
            $Exp += ("(CreatedById eq {0})" -f $CreatedById);
        }
        if($ModifiedBy)
        { 
            $ModifiedById = Get-User -svc $svc -Name $ModifiedBy -Select Id -ValueOnly;
            if ( !$ModifiedById )
            {
                # User not found
                throw($gotoSuccess);
            }            
            $Exp += ("(ModifiedById eq {0})" -f $ModifiedById);
        }
        $FilterExpression = [String]::Join(' and ', $Exp);
    
        if($Select) 
        {
            if($PSBoundParameters.ContainsKey('First'))
            {
                $Response = $svc.Core.$EntitySetName.AddQueryOption('$filter', $FilterExpression).AddQueryOption('$top', $First) | Select -Property $Select;
            }
            else
            {
                $Response = $svc.Core.$EntitySetName.AddQueryOption('$filter', $FilterExpression) | Select -Property $Select;
            }
        }
        else 
        {
            if($PSBoundParameters.ContainsKey('First'))
            {
                $Response = $svc.Core.$EntitySetName.AddQueryOption('$filter', $FilterExpression).AddQueryOption('$top', $First) | Select;
            }
            else
            {
                $Response = $svc.Core.$EntitySetName.AddQueryOption('$filter', $FilterExpression) | Select;
            }
        }
        if(1 -eq $Select.Count -And $ValueOnly)
        {
            $Response = $Response.$Select;
        }
        if($PSBoundParameters.ContainsKey('DefaultValue') -And !$Response)
        {
            $Response = $DefaultValue;
        }
        if($ValueOnly -And $ConvertFromJson)
        {
            $ResponseTemp = New-Object System.Collections.ArrayList;
            foreach($item in $Response)
            {
                try
                {
                    $null = $ResponseTemp.Add((ConvertFrom-Json -InputObject $item));
                }
                catch
                {
                    $null = $ResponseTemp.Add($item);
                }
            }
            $Response = $ResponseTemp.ToArray();
        }
    }

    $OutputParameter = Format-ResultAs $Response $As
    $fReturn = $true;
}
# Process

End 
{

$datEnd = [datetime]::Now;
Log-Debug -fn $fn -msg ("RET. fReturn: [{0}]. Execution time: [{1}]ms. Started: [{2}]." -f $fReturn, ($datEnd - $datBegin).TotalMilliseconds, $datBegin.ToString('yyyy-MM-dd HH:mm:ss.fffzzz')) -fac 2;

# Return values are always and only returned via OutputParameter.
return $OutputParameter;

}
# End

} # function

if($MyInvocation.ScriptName) { Export-ModuleMember -Function Get-User; } 

#
# Copyright 2014-2015 d-fens GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# SIG # Begin signature block
# MIIXDwYJKoZIhvcNAQcCoIIXADCCFvwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUeN+oKsnHkv2IfWnfg4s+Adr+
# +kegghHCMIIEFDCCAvygAwIBAgILBAAAAAABL07hUtcwDQYJKoZIhvcNAQEFBQAw
# VzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV
# BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMTA0
# MTMxMDAwMDBaFw0yODAxMjgxMjAwMDBaMFIxCzAJBgNVBAYTAkJFMRkwFwYDVQQK
# ExBHbG9iYWxTaWduIG52LXNhMSgwJgYDVQQDEx9HbG9iYWxTaWduIFRpbWVzdGFt
# cGluZyBDQSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlO9l
# +LVXn6BTDTQG6wkft0cYasvwW+T/J6U00feJGr+esc0SQW5m1IGghYtkWkYvmaCN
# d7HivFzdItdqZ9C76Mp03otPDbBS5ZBb60cO8eefnAuQZT4XljBFcm05oRc2yrmg
# jBtPCBn2gTGtYRakYua0QJ7D/PuV9vu1LpWBmODvxevYAll4d/eq41JrUJEpxfz3
# zZNl0mBhIvIG+zLdFlH6Dv2KMPAXCae78wSuq5DnbN96qfTvxGInX2+ZbTh0qhGL
# 2t/HFEzphbLswn1KJo/nVrqm4M+SU4B09APsaLJgvIQgAIMboe60dAXBKY5i0Eex
# +vBTzBj5Ljv5cH60JQIDAQABo4HlMIHiMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB
# Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRG2D7/3OO+/4Pm9IWbsN1q1hSpwTBHBgNV
# HSAEQDA+MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFs
# c2lnbi5jb20vcmVwb3NpdG9yeS8wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2Ny
# bC5nbG9iYWxzaWduLm5ldC9yb290LmNybDAfBgNVHSMEGDAWgBRge2YaRQ2XyolQ
# L30EzTSo//z9SzANBgkqhkiG9w0BAQUFAAOCAQEATl5WkB5GtNlJMfO7FzkoG8IW
# 3f1B3AkFBJtvsqKa1pkuQJkAVbXqP6UgdtOGNNQXzFU6x4Lu76i6vNgGnxVQ380W
# e1I6AtcZGv2v8Hhc4EvFGN86JB7arLipWAQCBzDbsBJe/jG+8ARI9PBw+DpeVoPP
# PfsNvPTF7ZedudTbpSeE4zibi6c1hkQgpDttpGoLoYP9KOva7yj2zIhd+wo7AKvg
# IeviLzVsD440RZfroveZMzV+y5qKu0VN5z+fwtmK+mWybsd+Zf/okuEsMaL3sCc2
# SI8mbzvuTXYfecPlf5Y1vC0OzAGwjn//UYCAp5LUs0RGZIyHTxZjBzFLY7Df8zCC
# BCkwggMRoAMCAQICCwQAAAAAATGJxjfoMA0GCSqGSIb3DQEBCwUAMEwxIDAeBgNV
# BAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFIzMRMwEQYDVQQKEwpHbG9iYWxTaWdu
# MRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTExMDgwMjEwMDAwMFoXDTE5MDgwMjEw
# MDAwMFowWjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
# MDAuBgNVBAMTJ0dsb2JhbFNpZ24gQ29kZVNpZ25pbmcgQ0EgLSBTSEEyNTYgLSBH
# MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKPv0Z8p6djTgnY8YqDS
# SdYWHvHP8NC6SEMDLacd8gE0SaQQ6WIT9BP0FoO11VdCSIYrlViH6igEdMtyEQ9h
# JuH6HGEVxyibTQuCDyYrkDqW7aTQaymc9WGI5qRXb+70cNCNF97mZnZfdB5eDFM4
# XZD03zAtGxPReZhUGks4BPQHxCMD05LL94BdqpxWBkQtQUxItC3sNZKaxpXX9c6Q
# MeJ2s2G48XVXQqw7zivIkEnotybPuwyJy9DDo2qhydXjnFMrVyb+Vpp2/WFGomDs
# KUZH8s3ggmLGBFrn7U5AXEgGfZ1f53TJnoRlDVve3NMkHLQUEeurv8QfpLqZ0BdY
# Nc0CAwEAAaOB/TCB+jAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIB
# ADAdBgNVHQ4EFgQUGUq4WuRNMaUU5V7sL6Mc+oCMMmswRwYDVR0gBEAwPjA8BgRV
# HSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3Jl
# cG9zaXRvcnkvMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwuZ2xvYmFsc2ln
# bi5uZXQvcm9vdC1yMy5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHwYDVR0jBBgw
# FoAUj/BLf6guRSSuTVD6Y5qL3uLdG7wwDQYJKoZIhvcNAQELBQADggEBAHmwaTTi
# BYf2/tRgLC+GeTQD4LEHkwyEXPnk3GzPbrXsCly6C9BoMS4/ZL0Pgmtmd4F/ximl
# F9jwiU2DJBH2bv6d4UgKKKDieySApOzCmgDXsG1szYjVFXjPE/mIpXNNwTYr3MvO
# 23580ovvL72zT006rbtibiiTxAzL2ebK4BEClAOwvT+UKFaQHlPCJ9XJPM0aYx6C
# WRW2QMqngarDVa8z0bV16AnqRwhIIvtdG/Mseml+xddaXlYzPK1X6JMlQsPSXnE7
# ShxU7alVrCgFx8RsXdw8k/ZpPIJRzhoVPV4Bc/9Aouq0rtOO+u5dbEfHQfXUVlfy
# GDcy1tTMS/Zx4HYwggSfMIIDh6ADAgECAhIRIdaZp2SXPvH4Qn7pGcxTQRQwDQYJ
# KoZIhvcNAQEFBQAwUjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24g
# bnYtc2ExKDAmBgNVBAMTH0dsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gRzIw
# HhcNMTYwNTI0MDAwMDAwWhcNMjcwNjI0MDAwMDAwWjBgMQswCQYDVQQGEwJTRzEf
# MB0GA1UEChMWR01PIEdsb2JhbFNpZ24gUHRlIEx0ZDEwMC4GA1UEAxMnR2xvYmFs
# U2lnbiBUU0EgZm9yIE1TIEF1dGhlbnRpY29kZSAtIEcyMIIBIjANBgkqhkiG9w0B
# AQEFAAOCAQ8AMIIBCgKCAQEAsBeuotO2BDBWHlgPse1VpNZUy9j2czrsXV6rJf02
# pfqEw2FAxUa1WVI7QqIuXxNiEKlb5nPWkiWxfSPjBrOHOg5D8NcAiVOiETFSKG5d
# QHI88gl3p0mSl9RskKB2p/243LOd8gdgLE9YmABr0xVU4Prd/4AsXximmP/Uq+yh
# RVmyLm9iXeDZGayLV5yoJivZF6UQ0kcIGnAsM4t/aIAqtaFda92NAgIpA6p8N7u7
# KU49U5OzpvqP0liTFUy5LauAo6Ml+6/3CGSwekQPXBDXX2E3qk5r09JTJZ2Cc/os
# +XKwqRk5KlD6qdA8OsroW+/1X1H0+QrZlzXeaoXmIwRCrwIDAQABo4IBXzCCAVsw
# DgYDVR0PAQH/BAQDAgeAMEwGA1UdIARFMEMwQQYJKwYBBAGgMgEeMDQwMgYIKwYB
# BQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAkG
# A1UdEwQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWg
# M4YxaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9nc3RpbWVzdGFtcGluZ2cy
# LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly9zZWN1cmUu
# Z2xvYmFsc2lnbi5jb20vY2FjZXJ0L2dzdGltZXN0YW1waW5nZzIuY3J0MB0GA1Ud
# DgQWBBTUooRKOFoYf7pPMFC9ndV6h9YJ9zAfBgNVHSMEGDAWgBRG2D7/3OO+/4Pm
# 9IWbsN1q1hSpwTANBgkqhkiG9w0BAQUFAAOCAQEAj6kakW0EpjcgDoOW3iPTa24f
# bt1kPWghIrX4RzZpjuGlRcckoiK3KQnMVFquxrzNY46zPVBI5bTMrs2SjZ4oixNK
# Eaq9o+/Tsjb8tKFyv22XY3mMRLxwL37zvN2CU6sa9uv6HJe8tjecpBwwvKu8LUc2
# 35IgA+hxxlj2dQWaNPALWVqCRDSqgOQvhPZHXZbJtsrKnbemuuRQ09Q3uLogDtDT
# kipbxFm7oW3bPM5EncE4Kq3jjb3NCXcaEL5nCgI2ZIi5sxsm7ueeYMRGqLxhM2zP
# TrmcuWrwnzf+tT1PmtNN/94gjk6Xpv2fCbxNyhh2ybBNhVDygNIdBvVYBAexGDCC
# BNYwggO+oAMCAQICEhEhDRayW4wRltP+V8mGEea62TANBgkqhkiG9w0BAQsFADBa
# MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEwMC4GA1UE
# AxMnR2xvYmFsU2lnbiBDb2RlU2lnbmluZyBDQSAtIFNIQTI1NiAtIEcyMB4XDTE1
# MDUwNDE2NDMyMVoXDTE4MDUwNDE2NDMyMVowVTELMAkGA1UEBhMCQ0gxDDAKBgNV
# BAgTA1p1ZzEMMAoGA1UEBxMDWnVnMRQwEgYDVQQKEwtkLWZlbnMgR21iSDEUMBIG
# A1UEAxMLZC1mZW5zIEdtYkgwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDNPSzSNPylU9jFM78Q/GjzB7N+VNqikf/use7p8mpnBZ4cf5b4qV3rqQd62rJH
# RlAsxgouCSNQrl8xxfg6/t/I02kPvrzsR4xnDgMiVCqVRAeQsWebafWdTvWmONBS
# lxJejPP8TSgXMKFaDa+2HleTycTBYSoErAZSWpQ0NqF9zBadjsJRVatQuPkTDrwL
# eWibiyOipK9fcNoQpl5ll5H9EG668YJR3fqX9o0TQTkOmxXIL3IJ0UxdpyDpLEkt
# tBG6Y5wAdpF2dQX2phrfFNVY54JOGtuBkNGMSiLFzTkBA1fOlA6ICMYjB8xIFxVv
# rN1tYojCrqYkKMOjwWQz5X8zAgMBAAGjggGZMIIBlTAOBgNVHQ8BAf8EBAMCB4Aw
# TAYDVR0gBEUwQzBBBgkrBgEEAaAyATIwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93
# d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADATBgNVHSUE
# DDAKBggrBgEFBQcDAzBCBgNVHR8EOzA5MDegNaAzhjFodHRwOi8vY3JsLmdsb2Jh
# bHNpZ24uY29tL2dzL2dzY29kZXNpZ25zaGEyZzIuY3JsMIGQBggrBgEFBQcBAQSB
# gzCBgDBEBggrBgEFBQcwAoY4aHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9j
# YWNlcnQvZ3Njb2Rlc2lnbnNoYTJnMi5jcnQwOAYIKwYBBQUHMAGGLGh0dHA6Ly9v
# Y3NwMi5nbG9iYWxzaWduLmNvbS9nc2NvZGVzaWduc2hhMmcyMB0GA1UdDgQWBBTN
# GDddiIYZy9p3Z84iSIMd27rtUDAfBgNVHSMEGDAWgBQZSrha5E0xpRTlXuwvoxz6
# gIwyazANBgkqhkiG9w0BAQsFAAOCAQEAAApsOzSX1alF00fTeijB/aIthO3UB0ks
# 1Gg3xoKQC1iEQmFG/qlFLiufs52kRPN7L0a7ClNH3iQpaH5IEaUENT9cNEXdKTBG
# 8OrJS8lrDJXImgNEgtSwz0B40h7bM2Z+0DvXDvpmfyM2NwHF/nNVj7NzmczrLRqN
# 9de3tV0pgRqnIYordVcmb24CZl3bzpwzbQQy14Iz+P5Z2cnw+QaYzAuweTZxEUcJ
# bFwpM49c1LMPFJTuOKkUgY90JJ3gVTpyQxfkc7DNBnx74PlRzjFmeGC/hxQt0hvo
# eaAiBdjo/1uuCTToigVnyRH+c0T2AezTeoFb7ne3I538hWeTdU5q9jGCBLcwggSz
# AgEBMHAwWjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
# MDAuBgNVBAMTJ0dsb2JhbFNpZ24gQ29kZVNpZ25pbmcgQ0EgLSBTSEEyNTYgLSBH
# MgISESENFrJbjBGW0/5XyYYR5rrZMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEM
# MQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQB
# gjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBS96MiWoI9rjhM5
# 0qAe+nNG3JxS7zANBgkqhkiG9w0BAQEFAASCAQCCSNOri/8ENoDfUvWziLjhTJO2
# OfQrOx0B07FPUsV52Nfq+s2+4nGMSKWZO5vFvGQAkezuIZVcXXypuU4qEV1rx7GM
# FY5h/8ycMyE/y126yka+lwuMdjtmlaoB2uOGqt9zi1bI5nw1NxYElsNbZCiy7oAI
# mHH4/wZtIy9v6fSK7WuRwXdQTYaSVoSeGInVvNcJimj99iGrB4PZ5WrfLs6CxBnT
# zYD53hGLYY9CDhyqgzv2B6kHkv5X8Sysazm3pkUxzYnfDAZj0W8NKG/F7lPciWVF
# agk/0etKgiYSas8AZXugvGnXVxGB3Mx1wMDYBQQWezl7pvj/ZI9RA2U/WHmEoYIC
# ojCCAp4GCSqGSIb3DQEJBjGCAo8wggKLAgEBMGgwUjELMAkGA1UEBhMCQkUxGTAX
# BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExKDAmBgNVBAMTH0dsb2JhbFNpZ24gVGlt
# ZXN0YW1waW5nIENBIC0gRzICEhEh1pmnZJc+8fhCfukZzFNBFDAJBgUrDgMCGgUA
# oIH9MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE2
# MDgyNDE1NTQxNVowIwYJKoZIhvcNAQkEMRYEFNB1wpfKAKbMbqcUxgI7qo4znyeT
# MIGdBgsqhkiG9w0BCRACDDGBjTCBijCBhzCBhAQUY7gvq2H1g5CWlQULACScUCkz
# 7HkwbDBWpFQwUjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt
# c2ExKDAmBgNVBAMTH0dsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gRzICEhEh
# 1pmnZJc+8fhCfukZzFNBFDANBgkqhkiG9w0BAQEFAASCAQBhEXy1ZM9Ou6EdcWEL
# KuZHD7/hMEnGru6vL3qhXWgSSy7bLoBq9xa6P/m5o9zdRjpWyO5/JKfrAYz16ew5
# piz1p92r+rShRVFcUlCP28YfRKjVyjIXie+X5htNPpYx2yZQ8yoUwNvL0rTme4eM
# Iukku5BxyX6df0dfcQJKtEA5sUWp6FHnHtZFGhLMloiZfjuwFnyzaaxvuDQIA5BF
# ptf/USkfy4OcZAlzrs2/K3Vdc/It8wYIpaRQzfirpPPJjQq1t8cLJ/SXLRjQ0FPR
# wziCKjkpk6uIT9GDU+C5tSC5f7qwp29FvpX35lnCg9UH7kNgOdyVOPrPtTQjAqyM
# 0rNx
# SIG # End signature block