custom/Test-AzDeployment.ps1

function Test-AzDeployment {
  [Alias('Test-AzResourceGroupDeployment')]
  [OutputType('Microsoft.Azure.PowerShell.Cmdlets.Resources.Models.Api20180501.IDeploymentValidateResult')]
  [CmdletBinding(DefaultParameterSetName='ValidateWithTemplateFileParameterFile', PositionalBinding=$false, SupportsShouldProcess, ConfirmImpact='Medium')]
  [Microsoft.Azure.PowerShell.Cmdlets.Resources.Profile('latest-2019-04-30')]
  [Microsoft.Azure.PowerShell.Cmdlets.Resources.Description('Validates whether the specified template is syntactically correct and will be accepted by Azure Resource Manager..')]
  param(
      [Parameter(Mandatory, HelpMessage='The name of the deployment.')]
      [Alias('DeploymentName')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Path')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='deploymentName', Required, PossibleTypes=([System.String]), Description='The name of the deployment.')]
      [System.String]
      # The name of the deployment.
      ${Name},

      [Parameter(Mandatory, HelpMessage='The ID of the target subscription.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Path')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='subscriptionId', Required, PossibleTypes=([System.String]), Description='The ID of the target subscription.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.DefaultInfo(Script='(Get-AzContext).Subscription.Id')]
      [System.String]
      # The ID of the target subscription.
      ${SubscriptionId},

      [Parameter(ParameterSetName='ValidateRGWithTemplateFileParameterFile', Mandatory, HelpMessage='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateFileParameterJson', Mandatory, HelpMessage='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateFileParameterObject', Mandatory, HelpMessage='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateJsonParameterFile', Mandatory, HelpMessage='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateJsonParameterJson', Mandatory, HelpMessage='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateJsonParameterObject', Mandatory, HelpMessage='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateObjectParameterFile', Mandatory, HelpMessage='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateObjectParameterJson', Mandatory, HelpMessage='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateObjectParameterObject', Mandatory, HelpMessage='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Path')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='resourceGroupName', Required, PossibleTypes=([System.String]), Description='The name of the resource group the template will be deployed to. The name is case insensitive.')]
      [System.String]
      # The name of the resource group the template will be deployed to. The name is case insensitive.
      ${ResourceGroupName},

      [Parameter(ParameterSetName='ValidateWithTemplateFileParameterFile', Mandatory, HelpMessage='Local path to the JSON template file.')]
      [Parameter(ParameterSetName='ValidateWithTemplateFileParameterJson', Mandatory, HelpMessage='Local path to the JSON template file.')]
      [Parameter(ParameterSetName='ValidateWithTemplateFileParameterObject', Mandatory, HelpMessage='Local path to the JSON template file.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateFileParameterFile', Mandatory, HelpMessage='Local path to the JSON template file.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateFileParameterJson', Mandatory, HelpMessage='Local path to the JSON template file.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateFileParameterObject', Mandatory, HelpMessage='Local path to the JSON template file.')]
      [System.String]
      # Local path to the JSON template file.
      ${TemplateFile},

      [Parameter(ParameterSetName='ValidateWithTemplateJsonParameterFile', Mandatory, HelpMessage='The string representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateWithTemplateJsonParameterJson', Mandatory, HelpMessage='The string representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateWithTemplateJsonParameterObject', Mandatory, HelpMessage='The string representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateJsonParameterFile', Mandatory, HelpMessage='The string representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateJsonParameterJson', Mandatory, HelpMessage='The string representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateJsonParameterObject', Mandatory, HelpMessage='The string representation of the JSON template.')]
      [System.String]
      # The string representation of the JSON template.
      ${TemplateJson},

      [Parameter(ParameterSetName='ValidateWithTemplateObjectParameterFile', Mandatory, HelpMessage='The hashtable representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateObjectParameterFile', Mandatory, HelpMessage='The hashtable representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateWithTemplateObjectParameterJson', Mandatory, HelpMessage='The hashtable representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateObjectParameterJson', Mandatory, HelpMessage='The hashtable representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateWithTemplateObjectParameterObject', Mandatory, HelpMessage='The hashtable representation of the JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateObjectParameterObject', Mandatory, HelpMessage='The hashtable representation of the JSON template.')]
      [System.Collections.Hashtable]
      # The hashtable representation of the JSON template.
      ${TemplateObject},

      [Parameter(ParameterSetName='ValidateWithTemplateFileParameterFile', Mandatory, HelpMessage='Local path to the parameter JSON template file.')]
      [Parameter(ParameterSetName='ValidateWithTemplateJsonParameterFile', Mandatory, HelpMessage='Local path to the parameter JSON template file.')]
      [Parameter(ParameterSetName='ValidateWithTemplateObjectParameterFile', Mandatory, HelpMessage='Local path to the parameter JSON template file.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateFileParameterFile', Mandatory, HelpMessage='Local path to the parameter JSON template file.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateJsonParameterFile', Mandatory, HelpMessage='Local path to the parameter JSON template file.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateObjectParameterFile', Mandatory, HelpMessage='Local path to the parameter JSON template file.')]
      [System.String]
      # Local path to the parameter JSON template file.
      ${TemplateParameterFile},

      [Parameter(ParameterSetName='ValidateWithTemplateFileParameterJson', Mandatory, HelpMessage='The string representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateWithTemplateJsonParameterJson', Mandatory, HelpMessage='The string representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateWithTemplateObjectParameterJson', Mandatory, HelpMessage='The string representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateFileParameterJson', Mandatory, HelpMessage='The string representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateJsonParameterJson', Mandatory, HelpMessage='The string representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateObjectParameterJson', Mandatory, HelpMessage='The string representation of the parameter JSON template.')]
      [System.String]
      # The string representation of the parameter JSON template.
      ${TemplateParameterJson},

      [Parameter(ParameterSetName='ValidateWithTemplateFileParameterObject', Mandatory, HelpMessage='The hashtable representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateFileParameterObject', Mandatory, HelpMessage='The hashtable representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateWithTemplateJsonParameterObject', Mandatory, HelpMessage='The hashtable representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateJsonParameterObject', Mandatory, HelpMessage='The hashtable representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateWithTemplateObjectParameterObject', Mandatory, HelpMessage='The hashtable representation of the parameter JSON template.')]
      [Parameter(ParameterSetName='ValidateRGWithTemplateObjectParameterObject', Mandatory, HelpMessage='The hashtable representation of the parameter JSON template.')]
      [System.Collections.Hashtable]
      # The hashtable representation of the parameter JSON template.
      ${TemplateParameterObject},

      [Parameter(HelpMessage='Specifies the type of information to log for debugging. The permitted values are none, requestContent, responseContent, or both requestContent and responseContent separated by a comma. The default is none. When setting this value, carefully consider the type of information you are passing in during deployment. By logging information about the request or response, you could potentially expose sensitive data that is retrieved through the deployment operations.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='detailLevel', PossibleTypes=([System.String]), Description='Specifies the type of information to log for debugging. The permitted values are none, requestContent, responseContent, or both requestContent and responseContent separated by a comma. The default is none. When setting this value, carefully consider the type of information you are passing in during deployment. By logging information about the request or response, you could potentially expose sensitive data that is retrieved through the deployment operations.')]
      [System.String]
      # Specifies the type of information to log for debugging. The permitted values are none, requestContent, responseContent, or both requestContent and responseContent separated by a comma. The default is none. When setting this value, carefully consider the type of information you are passing in during deployment. By logging information about the request or response, you could potentially expose sensitive data that is retrieved through the deployment operations.
      ${DebugSettingDetailLevel},

      [Parameter(HelpMessage='Name and value pairs that define the deployment parameters for the template. You use this element when you want to provide the parameter values directly in the request rather than link to an existing parameter file. Use either the parametersLink property or the parameters property, but not both. It can be a JObject or a well formed JSON string.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='parameters', PossibleTypes=([Microsoft.Azure.PowerShell.Cmdlets.Resources.Models.Api20180501.IDeploymentPropertiesParameters]), Description='Name and value pairs that define the deployment parameters for the template. You use this element when you want to provide the parameter values directly in the request rather than link to an existing parameter file. Use either the parametersLink property or the parameters property, but not both. It can be a JObject or a well formed JSON string.')]
      [System.Collections.Hashtable]
      # Name and value pairs that define the deployment parameters for the template. You use this element when you want to provide the parameter values directly in the request rather than link to an existing parameter file. Use either the parametersLink property or the parameters property, but not both. It can be a JObject or a well formed JSON string.
      ${DeploymentPropertyParameter},

      [Parameter(HelpMessage='The location to store the deployment data.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='location', PossibleTypes=([System.String]), Description='The location to store the deployment data.')]
      [System.String]
      # The location to store the deployment data.
      ${Location},

      [Parameter( Mandatory, HelpMessage='The mode that is used to deploy resources. This value can be either Incremental or Complete. In Incremental mode, resources are deployed without deleting existing resources that are not included in the template. In Complete mode, resources are deployed and existing resources in the resource group that are not included in the template are deleted. Be careful when using Complete mode as you may unintentionally delete resources.')]
      [ArgumentCompleter([Microsoft.Azure.PowerShell.Cmdlets.Resources.Support.DeploymentMode])]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='mode', Required, PossibleTypes=([Microsoft.Azure.PowerShell.Cmdlets.Resources.Support.DeploymentMode]), Description='The mode that is used to deploy resources. This value can be either Incremental or Complete. In Incremental mode, resources are deployed without deleting existing resources that are not included in the template. In Complete mode, resources are deployed and existing resources in the resource group that are not included in the template are deleted. Be careful when using Complete mode as you may unintentionally delete resources.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Support.DeploymentMode]
      # The mode that is used to deploy resources. This value can be either Incremental or Complete. In Incremental mode, resources are deployed without deleting existing resources that are not included in the template. In Complete mode, resources are deployed and existing resources in the resource group that are not included in the template are deleted. Be careful when using Complete mode as you may unintentionally delete resources.
      ${Mode},

      [Parameter(HelpMessage='The deployment to be used on error case.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='deploymentName', PossibleTypes=([System.String]), Description='The deployment to be used on error case.')]
      [System.String]
      # The deployment to be used on error case.
      ${OnErrorDeploymentName},

      [Parameter(HelpMessage='The deployment on error behavior type. Possible values are LastSuccessful and SpecificDeployment.')]
      [ArgumentCompleter([Microsoft.Azure.PowerShell.Cmdlets.Resources.Support.OnErrorDeploymentType])]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='type', PossibleTypes=([Microsoft.Azure.PowerShell.Cmdlets.Resources.Support.OnErrorDeploymentType]), Description='The deployment on error behavior type. Possible values are LastSuccessful and SpecificDeployment.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Support.OnErrorDeploymentType]
      # The deployment on error behavior type. Possible values are LastSuccessful and SpecificDeployment.
      ${OnErrorDeploymentType},

      [Parameter(HelpMessage='If included, must match the ContentVersion in the template.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='contentVersion', PossibleTypes=([System.String]), Description='If included, must match the ContentVersion in the template.')]
      [System.String]
      # If included, must match the ContentVersion in the template.
      ${ParameterLinkContentVersion},

      [Parameter(HelpMessage='The URI of the parameters file.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='uri', PossibleTypes=([System.String]), Description='The URI of the parameters file.')]
      [System.String]
      # The URI of the parameters file.
      ${ParameterLinkUri},

      [Parameter(HelpMessage='The template content. You use this element when you want to pass the template syntax directly in the request rather than link to an existing template. It can be a JObject or well-formed JSON string. Use either the templateLink property or the template property, but not both.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='template', PossibleTypes=([Microsoft.Azure.PowerShell.Cmdlets.Resources.Models.Api20180501.IDeploymentPropertiesTemplate]), Description='The template content. You use this element when you want to pass the template syntax directly in the request rather than link to an existing template. It can be a JObject or well-formed JSON string. Use either the templateLink property or the template property, but not both.')]
      [System.Collections.Hashtable]
      # The template content. You use this element when you want to pass the template syntax directly in the request rather than link to an existing template. It can be a JObject or well-formed JSON string. Use either the templateLink property or the template property, but not both.
      ${Template},

      [Parameter(HelpMessage='If included, must match the ContentVersion in the template.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='contentVersion', PossibleTypes=([System.String]), Description='If included, must match the ContentVersion in the template.')]
      [System.String]
      # If included, must match the ContentVersion in the template.
      ${TemplateLinkContentVersion},

      [Parameter(HelpMessage='The URI of the template to deploy.')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Body')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.Info(SerializedName='uri', PossibleTypes=([System.String]), Description='The URI of the template to deploy.')]
      [System.String]
      # The URI of the template to deploy.
      ${TemplateLinkUri},

      [Parameter(HelpMessage='The credentials, account, tenant, and subscription used for communication with Azure.')]
      [Alias('AzureRMContext', 'AzureCredential')]
      [ValidateNotNull()]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Azure')]
      [System.Management.Automation.PSObject]
      # The credentials, account, tenant, and subscription used for communication with Azure.
      ${DefaultProfile},

      [Parameter(DontShow, HelpMessage='Wait for .NET debugger to attach')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Runtime')]
      [System.Management.Automation.SwitchParameter]
      # Wait for .NET debugger to attach
      ${Break},

      [Parameter(DontShow, HelpMessage='SendAsync Pipeline Steps to be appended to the front of the pipeline')]
      [ValidateNotNull()]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Runtime')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.SendAsyncStep[]]
      # SendAsync Pipeline Steps to be appended to the front of the pipeline
      ${HttpPipelineAppend},

      [Parameter(DontShow, HelpMessage='SendAsync Pipeline Steps to be prepended to the front of the pipeline')]
      [ValidateNotNull()]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Runtime')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Runtime.SendAsyncStep[]]
      # SendAsync Pipeline Steps to be prepended to the front of the pipeline
      ${HttpPipelinePrepend},

      [Parameter(DontShow, HelpMessage='The URI for the proxy server to use')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Runtime')]
      [System.Uri]
      # The URI for the proxy server to use
      ${Proxy},

      [Parameter(DontShow, HelpMessage='Credentials for a proxy server to use for the remote call')]
      [ValidateNotNull()]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Runtime')]
      [System.Management.Automation.PSCredential]
      # Credentials for a proxy server to use for the remote call
      ${ProxyCredential},

      [Parameter(DontShow, HelpMessage='Use the default credentials for the proxy')]
      [Microsoft.Azure.PowerShell.Cmdlets.Resources.Category('Runtime')]
      [System.Management.Automation.SwitchParameter]
      # Use the default credentials for the proxy
      ${ProxyUseDefaultCredentials}
  )

  process {
      if ($PSBoundParameters.ContainsKey("TemplateFile"))
      {
          if (!(Test-Path -Path $TemplateFile))
          {
              throw "Unable to find template file '$TemplateFile'."
          }

          if (!$PSBoundParameters.ContainsKey("Name"))
          {
              $DeploymentName = (Get-Item -Path $TemplateFile).BaseName
              $null = $PSBoundParameters.Add("Name", $DeploymentName)
          }

          $TemplateJson = [System.IO.File]::ReadAllText($TemplateFile)
          $null = $PSBoundParameters.Add("Template", $TemplateJson)
          $null = $PSBoundParameters.Remove("TemplateFile")
      }
      elseif ($PSBoundParameters.ContainsKey("TemplateJson"))
      {
          $null = $PSBoundParameters.Add("Template", $TemplateJson)
          $null = $PSBoundParameters.Remove("TemplateJson")
      }
      elseif ($PSBoundParameters.ContainsKey("TemplateObject"))
      {
          $TemplateJson = ConvertTo-Json -InputObject $TemplateObject
          $null = $PSBoundParameters.Add("Template", $TemplateJson)
          $null = $PSBoundParameters.Remove("TemplateObject")
      }

      if ($PSBoundParameters.ContainsKey("TemplateParameterFile"))
      {
          if (!(Test-Path -Path $TemplateParameterFile))
          {
              throw "Unable to find template parameter file '$TemplateParameterFile'."
          }

          $ParameterJson = [System.IO.File]::ReadAllText($TemplateParameterFile)
          $ParameterObject = ConvertFrom-Json -InputObject $ParameterJson
          $ParameterHashtable = @{}
          $ParameterObject.PSObject.Properties | ForEach-Object { $ParameterHashtable[$_.Name] = $_.Value }
          $ParameterHashtable.Remove("`$schema")
          $ParameterHashtable.Remove("contentVersion")
          $NestedValues = $ParameterHashtable.parameters
          if ($null -ne $NestedValues)
          {
              $ParameterHashtable.Remove("parameters")
              $NestedValues.PSObject.Properties | ForEach-Object { $ParameterHashtable[$_.Name] = $_.Value }
          }

          $ParameterJson = ConvertTo-Json -InputObject $ParameterHashtable
          $null = $PSBoundParameters.Add("DeploymentPropertyParameter", $ParameterJson)
          $null = $PSBoundParameters.Remove("TemplateParameterFile")
      }
      elseif ($PSBoundParameters.ContainsKey("TemplateParameterJson"))
      {
          $null = $PSBoundParameters.Add("DeploymentPropertyParameter", $TemplateParameterJson)
          $null = $PSBoundParameters.Remove("TemplateParameterJson")
      }
      elseif ($PSBoundParameters.ContainsKey("TemplateParameterObject"))
      {
          $TemplateParameterObject.Remove("`$schema")
          $TemplateParameterObject.Remove("contentVersion")
          $NestedValues = $TemplateParameterObject.parameters
          if ($null -ne $NestedValues)
          {
              $TemplateParameterObject.Remove("parameters")
              $NestedValues.PSObject.Properties | ForEach-Object { $TemplateParameterObject[$_.Name] = $_.Value }
          }
          $TemplateParameterJson = ConvertTo-Json -InputObject $TemplateParameterObject
          $null = $PSBoundParameters.Add("DeploymentPropertyParameter", $TemplateParameterJson)
          $null = $PSBoundParameters.Remove("TemplateParameterObject")
      }

      if (!$PSBoundParameters.ContainsKey("Name"))
      {
          $DeploymentName = (New-Guid).Guid
          $null = $PSBoundParameters.Add("Name", $DeploymentName)
      }

      if ($PSBoundParameters.ContainsKey("ResourceGroupName"))
      {
          Az.Resources.private\Test-AzDeployment_ValidateExpanded1 @PSBoundParameters
      }
      else
      {
          Az.Resources.private\Test-AzDeployment_ValidateExpanded @PSBoundParameters
      }
  }
}
# SIG # Begin signature block
# MIIjhgYJKoZIhvcNAQcCoIIjdzCCI3MCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCZc8Pu7ndTkSUg
# VhEqiELIHJpHzlX12gwhBqJsv6/9q6CCDYEwggX/MIID56ADAgECAhMzAAABUZ6N
# j0Bxow5BAAAAAAFRMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMTkwNTAyMjEzNzQ2WhcNMjAwNTAyMjEzNzQ2WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQCVWsaGaUcdNB7xVcNmdfZiVBhYFGcn8KMqxgNIvOZWNH9JYQLuhHhmJ5RWISy1
# oey3zTuxqLbkHAdmbeU8NFMo49Pv71MgIS9IG/EtqwOH7upan+lIq6NOcw5fO6Os
# +12R0Q28MzGn+3y7F2mKDnopVu0sEufy453gxz16M8bAw4+QXuv7+fR9WzRJ2CpU
# 62wQKYiFQMfew6Vh5fuPoXloN3k6+Qlz7zgcT4YRmxzx7jMVpP/uvK6sZcBxQ3Wg
# B/WkyXHgxaY19IAzLq2QiPiX2YryiR5EsYBq35BP7U15DlZtpSs2wIYTkkDBxhPJ
# IDJgowZu5GyhHdqrst3OjkSRAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUV4Iarkq57esagu6FUBb270Zijc8w
# UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1
# ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDU0MTM1MB8GA1UdIwQYMBaAFEhu
# ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu
# bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w
# Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx
# MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAWg+A
# rS4Anq7KrogslIQnoMHSXUPr/RqOIhJX+32ObuY3MFvdlRElbSsSJxrRy/OCCZdS
# se+f2AqQ+F/2aYwBDmUQbeMB8n0pYLZnOPifqe78RBH2fVZsvXxyfizbHubWWoUf
# NW/FJlZlLXwJmF3BoL8E2p09K3hagwz/otcKtQ1+Q4+DaOYXWleqJrJUsnHs9UiL
# crVF0leL/Q1V5bshob2OTlZq0qzSdrMDLWdhyrUOxnZ+ojZ7UdTY4VnCuogbZ9Zs
# 9syJbg7ZUS9SVgYkowRsWv5jV4lbqTD+tG4FzhOwcRQwdb6A8zp2Nnd+s7VdCuYF
# sGgI41ucD8oxVfcAMjF9YX5N2s4mltkqnUe3/htVrnxKKDAwSYliaux2L7gKw+bD
# 1kEZ/5ozLRnJ3jjDkomTrPctokY/KaZ1qub0NUnmOKH+3xUK/plWJK8BOQYuU7gK
# YH7Yy9WSKNlP7pKj6i417+3Na/frInjnBkKRCJ/eYTvBH+s5guezpfQWtU4bNo/j
# 8Qw2vpTQ9w7flhH78Rmwd319+YTmhv7TcxDbWlyteaj4RK2wk3pY1oSz2JPE5PNu
# Nmd9Gmf6oePZgy7Ii9JLLq8SnULV7b+IP0UXRY9q+GdRjM2AEX6msZvvPCIoG0aY
# HQu9wZsKEK2jqvWi8/xdeeeSI9FN6K1w4oVQM4Mwggd6MIIFYqADAgECAgphDpDS
# AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0
# ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla
# MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT
# H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG
# OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S
# 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz
# y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7
# 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u
# M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33
# X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl
# XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP
# 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB
# l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF
# RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM
# CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ
# BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud
# DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO
# 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0
# LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
# Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
# Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw
# cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA
# XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY
# 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj
# 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd
# d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ
# Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf
# wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ
# aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j
# NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B
# xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96
# eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7
# r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I
# RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIVWzCCFVcCAQEwgZUwfjELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z
# b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAVGejY9AcaMOQQAAAAABUTAN
# BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor
# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgEFbzPLG3
# or5oLcvUWXwqAD/U3z8T6iqxwfPpkAau0f4wQgYKKwYBBAGCNwIBDDE0MDKgFIAS
# AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN
# BgkqhkiG9w0BAQEFAASCAQA6iE0Y1hE3SDawIRr9+7gQkmnuBfKNOTAeFdLvTJTx
# 9UymuidTGt5bg8K5C9HUOPzHjS+O+ROCxdwe5uAUdtD8oPie6cNEWiYKexRDD1bh
# Y+d2HEzlssfYav9wcmv122rSdq+dZLHtiHw3/4EGK0fLAVSO5pd2nu1MXVBoD31d
# bKQSSYA3Hji74janESifQhvwMT+c2iyttqfbEmtTdcF3G8sBpZuG4PsZE+yc9uE7
# WqsmzTmYyiOUSn/XCJx5NzBcCvY/jCitO7Bg8wobf077jVE5V/+5OWNYVLaBcveT
# A7DS/Si5V+4jXIjikyBGSyiHNA/z6cUwKkiOvQn/z+ZqoYIS5TCCEuEGCisGAQQB
# gjcDAwExghLRMIISzQYJKoZIhvcNAQcCoIISvjCCEroCAQMxDzANBglghkgBZQME
# AgEFADCCAVEGCyqGSIb3DQEJEAEEoIIBQASCATwwggE4AgEBBgorBgEEAYRZCgMB
# MDEwDQYJYIZIAWUDBAIBBQAEIDlmzpUclgmZRlS8C+22Y0VyJ+Bjh9XGEgS5d6R3
# caXYAgZd+9+Xs3YYEzIwMTkxMjIwMDk0NDE3LjIwNFowBIACAfSggdCkgc0wgcox
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1p
# Y3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxlcyBUU1Mg
# RVNOOjIyNjQtRTMzRS03ODBDMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt
# cCBTZXJ2aWNloIIOPDCCBPEwggPZoAMCAQICEzMAAAEY/jr32RvUsTMAAAAAARgw
# DQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
# b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcN
# MTkxMTEzMjE0MDM1WhcNMjEwMjExMjE0MDM1WjCByjELMAkGA1UEBhMCVVMxEzAR
# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg
# T3BlcmF0aW9uczEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046MjI2NC1FMzNFLTc4
# MEMxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0G
# CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC+ANcEX8/NRj1t5YkXYB1ZHPxQSwr
# hOOfXX1c5aes0t2gTI6OeH4ntcwpyTvSk7+9BBVoqTvHwfbDZmb15nQ94q+UPfBq
# a/8m1tes/6Fbt1AeVHy4By1AVFi6Yi1vWd3bVRyY2SAeVonIzEFGGtQveRv2Yj6j
# bCHE2+xP3Q+AcgxweE8l6/nAN5S/mTDKV2flHNQg+d5X9SSN7MdLC5OAJgSy374I
# i/AnYEKyIgnOFJVkIxkLDxOyrnV/gORloaxyVGlDemnLBNahwsxnmkrpChcwvDie
# Ax4g/Z1fJ0+C+wdA+EtA7rrgnRkjhKHfWkZj40bmx4GpQdJmF1zAZ0FxAgMBAAGj
# ggEbMIIBFzAdBgNVHQ4EFgQU8VvlsC4PYAnYOU/05iPr+LTHKD4wHwYDVR0jBBgw
# FoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENB
# XzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAx
# MC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDAN
# BgkqhkiG9w0BAQsFAAOCAQEAcyWdvg6cgs//AmxoQZm+WASpJzUXEPhMp30bWc5H
# yCwQB+Ma6YPncSoFdct/5V1K4p/rMcMLBn5LzELVH+uztg6ERK48YtbJb9A7Jp+f
# JZj7loXaP9mVP7tJs2tGuubcXpGbgo5HGCjn7gzMBHY45Q8LScfa1JFQEAiS2gCK
# KRlrKMsGaIbi+UuBtsbQ8JknvmiEwCCwSmRTX0viAZusm4mJVqKBe3Bmj+yBDJVW
# cv0MyrEYQ74oa0VSW3JBc+xSrqT2Jgm2Cc6IlSbm8AsiVE/Vc4yahfmLeeFHfTcr
# K0flu6VGzjf1GNA1SDXR4bUinrBli3lfhwtKhx6x5eRsSjCCBnEwggRZoAMCAQIC
# CmEJgSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRp
# ZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIx
# NDY1NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG
# A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3
# DQEBAQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF
# ++18aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRD
# DNdNuDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSx
# z5NMksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1
# rL2KQk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16Hgc
# sOmZzTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB
# 4jAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqF
# bVUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
# EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYD
# VR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv
# cHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEB
# BE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
# ZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCB
# kjCBjwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQe
# MiAdAEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQA
# LiAdMA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUx
# vs8F4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GAS
# inbMQEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1
# L3mBZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWO
# M7tiX5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4
# pm3S4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45
# V3aicaoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x
# 4QDf5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEe
# gPsbiSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKn
# QqLJzxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp
# 3lfB0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvT
# X4/edIhJEqGCAs4wggI3AgEBMIH4oYHQpIHNMIHKMQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP
# cGVyYXRpb25zMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjoyMjY0LUUzM0UtNzgw
# QzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcG
# BSsOAwIaAxUAzdeb1yAva2kJJ2mFfDdeSfFJMdyggYMwgYCkfjB8MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg
# VGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUFAAIFAOGnBtgwIhgPMjAx
# OTEyMjAxNjM3NDRaGA8yMDE5MTIyMTE2Mzc0NFowdzA9BgorBgEEAYRZCgQBMS8w
# LTAKAgUA4acG2AIBADAKAgEAAgIDjgIB/zAHAgEAAgIRjzAKAgUA4ahYWAIBADA2
# BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIB
# AAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBAHRBipC8kL/qJbw2YN+ktctP4IsBK16L
# KzwNFXIIhaFU6T4JnGEl5xmNy+ZCe9Qw+ONuEsiJmxNxj97mFPdOMj4Xo17XkNHc
# 2VnkK5S6LWg6WzabX2GzfYSldxdJ4TYqj+Nt3fPV/ATZd4OuG/haZtBnfyonzk96
# HFHBsmNCxxIkMYIDDTCCAwkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
# IDIwMTACEzMAAAEY/jr32RvUsTMAAAAAARgwDQYJYIZIAWUDBAIBBQCgggFKMBoG
# CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgv/kKr5Qt
# Ruo1UQ3CNQ4Bec80m6cfpVzHCWTSGzD/dJQwgfoGCyqGSIb3DQEJEAIvMYHqMIHn
# MIHkMIG9BCCgzwcUm6pSA48AVS+9m5Z+k6cHH7WyNjvPil0oMg0H9zCBmDCBgKR+
# MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT
# HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABGP4699kb1LEzAAAA
# AAEYMCIEIDtp22F5zb76pGLcxVoiE8/QOFmkLihdAeLdUHEA2Br7MA0GCSqGSIb3
# DQEBCwUABIIBAF8nzD//udhjxilbTom/CvXlMhhc7h1hq/4CehA0BI5hQA1KM7Eu
# WnuJYk6cXILPe8ucJSLl2jWRI5m/lEBbWdCl3b+HOF0yVaz6Zxevh6LVuzLbDhZj
# eYCge+XK61jYR8HLzUk/cha3VfjpvE9vKM6CrpLfUNZzmPvFSwENQwoO7L5z4ZbN
# 0dCUD3wS/1vQSDVknq0Ua3Rgq95pEKarxbiq1/CJl086IMkAgynBAFgO9LmkPkrJ
# PvwRK7qMmEcZBj7p76CQhIPOu1UalKKE+bOAz/PgJJZsDWF7y0Dmsb0UyqraSmBz
# +aNDKspC02i/lv8V3SiIFpjHA6PsrXDkdcM=
# SIG # End signature block