|
|
- # Copyright (c) Microsoft Corporation. All rights reserved.
-
- $InitialDatabase = '0'
-
- $knownExceptions = @(
- 'System.Data.Entity.Migrations.Infrastructure.MigrationsException',
- 'System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException',
- 'System.Data.Entity.Migrations.Infrastructure.AutomaticDataLossException',
- 'System.Data.Entity.Migrations.Infrastructure.MigrationsPendingException',
- 'System.Data.Entity.Migrations.ProjectTypeNotSupportedException'
- )
-
- <#
- .SYNOPSIS
- Adds or updates an Entity Framework provider entry in the project config
- file.
-
- .DESCRIPTION
- Adds an entry into the 'entityFramework' section of the project config
- file for the specified provider invariant name and provider type. If an
- entry for the given invariant name already exists, then that entry is
- updated with the given type name, unless the given type name already
- matches, in which case no action is taken. The 'entityFramework'
- section is added if it does not exist. The config file is automatically
- saved if and only if a change was made.
-
- This command is typically used only by Entity Framework provider NuGet
- packages and is run from the 'install.ps1' script.
-
- .PARAMETER Project
- The Visual Studio project to update. When running in the NuGet install.ps1
- script the '$project' variable provided as part of that script should be
- used.
-
- .PARAMETER InvariantName
- The provider invariant name that uniquely identifies this provider. For
- example, the Microsoft SQL Server provider is registered with the invariant
- name 'System.Data.SqlClient'.
-
- .PARAMETER TypeName
- The assembly-qualified type name of the provider-specific type that
- inherits from 'System.Data.Entity.Core.Common.DbProviderServices'. For
- example, for the Microsoft SQL Server provider, this type is
- 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'.
- #>
- function Add-EFProvider
- {
- param (
- [parameter(Position = 0,
- Mandatory = $true)]
- $Project,
- [parameter(Position = 1,
- Mandatory = $true)]
- [string] $InvariantName,
- [parameter(Position = 2,
- Mandatory = $true)]
- [string] $TypeName
- )
-
- if (!(Check-Project $project))
- {
- return
- }
-
- $runner = New-EFConfigRunner $Project
-
- try
- {
- Invoke-RunnerCommand $runner System.Data.Entity.ConnectionFactoryConfig.AddProviderCommand @( $InvariantName, $TypeName )
- $error = Get-RunnerError $runner
-
- if ($error)
- {
- if ($knownExceptions -notcontains $error.TypeName)
- {
- Write-Host $error.StackTrace
- }
- else
- {
- Write-Verbose $error.StackTrace
- }
-
- throw $error.Message
- }
- }
- finally
- {
- Remove-Runner $runner
- }
- }
-
- <#
- .SYNOPSIS
- Adds or updates an Entity Framework default connection factory in the
- project config file.
-
- .DESCRIPTION
- Adds an entry into the 'entityFramework' section of the project config
- file for the connection factory that Entity Framework will use by default
- when creating new connections by convention. Any existing entry will be
- overridden if it does not match. The 'entityFramework' section is added if
- it does not exist. The config file is automatically saved if and only if
- a change was made.
-
- This command is typically used only by Entity Framework provider NuGet
- packages and is run from the 'install.ps1' script.
-
- .PARAMETER Project
- The Visual Studio project to update. When running in the NuGet install.ps1
- script the '$project' variable provided as part of that script should be
- used.
-
- .PARAMETER TypeName
- The assembly-qualified type name of the connection factory type that
- implements the 'System.Data.Entity.Infrastructure.IDbConnectionFactory'
- interface. For example, for the Microsoft SQL Server Express provider
- connection factory, this type is
- 'System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework'.
-
- .PARAMETER ConstructorArguments
- An optional array of strings that will be passed as arguments to the
- connection factory type constructor.
- #>
- function Add-EFDefaultConnectionFactory
- {
- param (
- [parameter(Position = 0,
- Mandatory = $true)]
- $Project,
- [parameter(Position = 1,
- Mandatory = $true)]
- [string] $TypeName,
- [string[]] $ConstructorArguments
- )
-
- if (!(Check-Project $project))
- {
- return
- }
-
- $runner = New-EFConfigRunner $Project
-
- try
- {
- Invoke-RunnerCommand $runner System.Data.Entity.ConnectionFactoryConfig.AddDefaultConnectionFactoryCommand @( $TypeName, $ConstructorArguments )
- $error = Get-RunnerError $runner
-
- if ($error)
- {
- if ($knownExceptions -notcontains $error.TypeName)
- {
- Write-Host $error.StackTrace
- }
- else
- {
- Write-Verbose $error.StackTrace
- }
-
- throw $error.Message
- }
- }
- finally
- {
- Remove-Runner $runner
- }
- }
-
- <#
- .SYNOPSIS
- Initializes the Entity Framework section in the project config file
- and sets defaults.
-
- .DESCRIPTION
- Creates the 'entityFramework' section of the project config file and sets
- the default connection factory to use SQL Express if it is running on the
- machine, or LocalDb otherwise. Note that installing a different provider
- may change the default connection factory. The config file is
- automatically saved if and only if a change was made.
-
- In addition, any reference to 'System.Data.Entity.dll' in the project is
- removed.
-
- This command is typically used only by Entity Framework provider NuGet
- packages and is run from the 'install.ps1' script.
-
- .PARAMETER Project
- The Visual Studio project to update. When running in the NuGet install.ps1
- script the '$project' variable provided as part of that script should be
- used.
- #>
- function Initialize-EFConfiguration
- {
- param (
- [parameter(Position = 0,
- Mandatory = $true)]
- $Project
- )
-
- if (!(Check-Project $project))
- {
- return
- }
-
- $runner = New-EFConfigRunner $Project
-
- try
- {
- Invoke-RunnerCommand $runner System.Data.Entity.ConnectionFactoryConfig.InitializeEntityFrameworkCommand
- $error = Get-RunnerError $runner
-
- if ($error)
- {
- if ($knownExceptions -notcontains $error.TypeName)
- {
- Write-Host $error.StackTrace
- }
- else
- {
- Write-Verbose $error.StackTrace
- }
-
- throw $error.Message
- }
- }
- finally
- {
- Remove-Runner $runner
- }
- }
-
- <#
- .SYNOPSIS
- Enables Code First Migrations in a project.
-
- .DESCRIPTION
- Enables Migrations by scaffolding a migrations configuration class in the project. If the
- target database was created by an initializer, an initial migration will be created (unless
- automatic migrations are enabled via the EnableAutomaticMigrations parameter).
-
- .PARAMETER ContextTypeName
- Specifies the context to use. If omitted, migrations will attempt to locate a
- single context type in the target project.
-
- .PARAMETER EnableAutomaticMigrations
- Specifies whether automatic migrations will be enabled in the scaffolded migrations configuration.
- If omitted, automatic migrations will be disabled.
-
- .PARAMETER MigrationsDirectory
- Specifies the name of the directory that will contain migrations code files.
- If omitted, the directory will be named "Migrations".
-
- .PARAMETER ProjectName
- Specifies the project that the scaffolded migrations configuration class will
- be added to. If omitted, the default project selected in package manager
- console is used.
-
- .PARAMETER StartUpProjectName
- Specifies the configuration file to use for named connection strings. If
- omitted, the specified project's configuration file is used.
-
- .PARAMETER ContextProjectName
- Specifies the project which contains the DbContext class to use. If omitted,
- the context is assumed to be in the same project used for migrations.
-
- .PARAMETER ConnectionStringName
- Specifies the name of a connection string to use from the application's
- configuration file.
-
- .PARAMETER ConnectionString
- Specifies the the connection string to use. If omitted, the context's
- default connection will be used.
-
- .PARAMETER ConnectionProviderName
- Specifies the provider invariant name of the connection string.
-
- .PARAMETER Force
- Specifies that the migrations configuration be overwritten when running more
- than once for a given project.
-
- .PARAMETER ContextAssemblyName
- Specifies the name of the assembly which contains the DbContext class to use. Use this
- parameter instead of ContextProjectName when the context is contained in a referenced
- assembly rather than in a project of the solution.
-
- .PARAMETER AppDomainBaseDirectory
- Specifies the directory to use for the app-domain that is used for running Migrations
- code such that the app-domain is able to find all required assemblies. This is an
- advanced option that should only be needed if the solution contains several projects
- such that the assemblies needed for the context and configuration are not all
- referenced from either the project containing the context or the project containing
- the migrations.
-
- .EXAMPLE
- Enable-Migrations
- # Scaffold a migrations configuration in a project with only one context
-
- .EXAMPLE
- Enable-Migrations -Auto
- # Scaffold a migrations configuration with automatic migrations enabled for a project
- # with only one context
-
- .EXAMPLE
- Enable-Migrations -ContextTypeName MyContext -MigrationsDirectory DirectoryName
- # Scaffold a migrations configuration for a project with multiple contexts
- # This scaffolds a migrations configuration for MyContext and will put the configuration
- # and subsequent configurations in a new directory called "DirectoryName"
-
- #>
- function Enable-Migrations
- {
- [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
- param (
- [string] $ContextTypeName,
- [alias('Auto')]
- [switch] $EnableAutomaticMigrations,
- [string] $MigrationsDirectory,
- [string] $ProjectName,
- [string] $StartUpProjectName,
- [string] $ContextProjectName,
- [parameter(ParameterSetName = 'ConnectionStringName')]
- [string] $ConnectionStringName,
- [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
- Mandatory = $true)]
- [string] $ConnectionString,
- [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
- Mandatory = $true)]
- [string] $ConnectionProviderName,
- [switch] $Force,
- [string] $ContextAssemblyName,
- [string] $AppDomainBaseDirectory
- )
-
- $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $ContextProjectName $null $ConnectionStringName $ConnectionString $ConnectionProviderName $ContextAssemblyName $AppDomainBaseDirectory
-
- try
- {
- Invoke-RunnerCommand $runner System.Data.Entity.Migrations.EnableMigrationsCommand @( $EnableAutomaticMigrations.IsPresent, $Force.IsPresent ) @{ 'ContextTypeName' = $ContextTypeName; 'MigrationsDirectory' = $MigrationsDirectory }
- $error = Get-RunnerError $runner
-
- if ($error)
- {
- if ($knownExceptions -notcontains $error.TypeName)
- {
- Write-Host $error.StackTrace
- }
- else
- {
- Write-Verbose $error.StackTrace
- }
-
- throw $error.Message
- }
-
- $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]).Show()
- }
- finally
- {
- Remove-Runner $runner
- }
- }
-
- <#
- .SYNOPSIS
- Scaffolds a migration script for any pending model changes.
-
- .DESCRIPTION
- Scaffolds a new migration script and adds it to the project.
-
- .PARAMETER Name
- Specifies the name of the custom script.
-
- .PARAMETER Force
- Specifies that the migration user code be overwritten when re-scaffolding an
- existing migration.
-
- .PARAMETER ProjectName
- Specifies the project that contains the migration configuration type to be
- used. If omitted, the default project selected in package manager console
- is used.
-
- .PARAMETER StartUpProjectName
- Specifies the configuration file to use for named connection strings. If
- omitted, the specified project's configuration file is used.
-
- .PARAMETER ConfigurationTypeName
- Specifies the migrations configuration to use. If omitted, migrations will
- attempt to locate a single migrations configuration type in the target
- project.
-
- .PARAMETER ConnectionStringName
- Specifies the name of a connection string to use from the application's
- configuration file.
-
- .PARAMETER ConnectionString
- Specifies the the connection string to use. If omitted, the context's
- default connection will be used.
-
- .PARAMETER ConnectionProviderName
- Specifies the provider invariant name of the connection string.
-
- .PARAMETER IgnoreChanges
- Scaffolds an empty migration ignoring any pending changes detected in the current model.
- This can be used to create an initial, empty migration to enable Migrations for an existing
- database. N.B. Doing this assumes that the target database schema is compatible with the
- current model.
-
- .PARAMETER AppDomainBaseDirectory
- Specifies the directory to use for the app-domain that is used for running Migrations
- code such that the app-domain is able to find all required assemblies. This is an
- advanced option that should only be needed if the solution contains several projects
- such that the assemblies needed for the context and configuration are not all
- referenced from either the project containing the context or the project containing
- the migrations.
-
- .EXAMPLE
- Add-Migration First
- # Scaffold a new migration named "First"
-
- .EXAMPLE
- Add-Migration First -IgnoreChanges
- # Scaffold an empty migration ignoring any pending changes detected in the current model.
- # This can be used to create an initial, empty migration to enable Migrations for an existing
- # database. N.B. Doing this assumes that the target database schema is compatible with the
- # current model.
-
- #>
- function Add-Migration
- {
- [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
- param (
- [parameter(Position = 0,
- Mandatory = $true)]
- [string] $Name,
- [switch] $Force,
- [string] $ProjectName,
- [string] $StartUpProjectName,
- [string] $ConfigurationTypeName,
- [parameter(ParameterSetName = 'ConnectionStringName')]
- [string] $ConnectionStringName,
- [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
- Mandatory = $true)]
- [string] $ConnectionString,
- [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
- Mandatory = $true)]
- [string] $ConnectionProviderName,
- [switch] $IgnoreChanges,
- [string] $AppDomainBaseDirectory)
-
- $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName $null $AppDomainBaseDirectory
-
- try
- {
- Invoke-RunnerCommand $runner System.Data.Entity.Migrations.AddMigrationCommand @( $Name, $Force.IsPresent, $IgnoreChanges.IsPresent )
- $error = Get-RunnerError $runner
-
- if ($error)
- {
- if ($knownExceptions -notcontains $error.TypeName)
- {
- Write-Host $error.StackTrace
- }
- else
- {
- Write-Verbose $error.StackTrace
- }
-
- throw $error.Message
- }
- $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]).Show()
- }
- finally
- {
- Remove-Runner $runner
- }
- }
-
- <#
- .SYNOPSIS
- Applies any pending migrations to the database.
-
- .DESCRIPTION
- Updates the database to the current model by applying pending migrations.
-
- .PARAMETER SourceMigration
- Only valid with -Script. Specifies the name of a particular migration to use
- as the update's starting point. If omitted, the last applied migration in
- the database will be used.
-
- .PARAMETER TargetMigration
- Specifies the name of a particular migration to update the database to. If
- omitted, the current model will be used.
-
- .PARAMETER Script
- Generate a SQL script rather than executing the pending changes directly.
-
- .PARAMETER Force
- Specifies that data loss is acceptable during automatic migration of the
- database.
-
- .PARAMETER ProjectName
- Specifies the project that contains the migration configuration type to be
- used. If omitted, the default project selected in package manager console
- is used.
-
- .PARAMETER StartUpProjectName
- Specifies the configuration file to use for named connection strings. If
- omitted, the specified project's configuration file is used.
-
- .PARAMETER ConfigurationTypeName
- Specifies the migrations configuration to use. If omitted, migrations will
- attempt to locate a single migrations configuration type in the target
- project.
-
- .PARAMETER ConnectionStringName
- Specifies the name of a connection string to use from the application's
- configuration file.
-
- .PARAMETER ConnectionString
- Specifies the the connection string to use. If omitted, the context's
- default connection will be used.
-
- .PARAMETER ConnectionProviderName
- Specifies the provider invariant name of the connection string.
-
- .PARAMETER AppDomainBaseDirectory
- Specifies the directory to use for the app-domain that is used for running Migrations
- code such that the app-domain is able to find all required assemblies. This is an
- advanced option that should only be needed if the solution contains several projects
- such that the assemblies needed for the context and configuration are not all
- referenced from either the project containing the context or the project containing
- the migrations.
-
- .EXAMPLE
- Update-Database
- # Update the database to the latest migration
-
- .EXAMPLE
- Update-Database -TargetMigration Second
- # Update database to a migration named "Second"
- # This will apply migrations if the target hasn't been applied or roll back migrations
- # if it has
-
- .EXAMPLE
- Update-Database -Script
- # Generate a script to update the database from it's current state to the latest migration
-
- .EXAMPLE
- Update-Database -Script -SourceMigration Second -TargetMigration First
- # Generate a script to migrate the database from a specified start migration
- # named "Second" to a specified target migration named "First"
-
- .EXAMPLE
- Update-Database -Script -SourceMigration $InitialDatabase
- # Generate a script that can upgrade a database currently at any version to the latest version.
- # The generated script includes logic to check the __MigrationsHistory table and only apply changes
- # that haven't been previously applied.
-
- .EXAMPLE
- Update-Database -TargetMigration $InitialDatabase
- # Runs the Down method to roll-back any migrations that have been applied to the database
-
-
- #>
- function Update-Database
- {
- [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
- param (
- [string] $SourceMigration,
- [string] $TargetMigration,
- [switch] $Script,
- [switch] $Force,
- [string] $ProjectName,
- [string] $StartUpProjectName,
- [string] $ConfigurationTypeName,
- [parameter(ParameterSetName = 'ConnectionStringName')]
- [string] $ConnectionStringName,
- [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
- Mandatory = $true)]
- [string] $ConnectionString,
- [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
- Mandatory = $true)]
- [string] $ConnectionProviderName,
- [string] $AppDomainBaseDirectory)
-
- $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName $null $AppDomainBaseDirectory
-
- try
- {
- Invoke-RunnerCommand $runner System.Data.Entity.Migrations.UpdateDatabaseCommand @( $SourceMigration, $TargetMigration, $Script.IsPresent, $Force.IsPresent, $Verbose.IsPresent )
- $error = Get-RunnerError $runner
-
- if ($error)
- {
- if ($knownExceptions -notcontains $error.TypeName)
- {
- Write-Host $error.StackTrace
- }
- else
- {
- Write-Verbose $error.StackTrace
- }
-
- throw $error.Message
- }
- $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]).Show()
- }
- finally
- {
- Remove-Runner $runner
- }
- }
-
- <#
- .SYNOPSIS
- Displays the migrations that have been applied to the target database.
-
- .DESCRIPTION
- Displays the migrations that have been applied to the target database.
-
- .PARAMETER ProjectName
- Specifies the project that contains the migration configuration type to be
- used. If omitted, the default project selected in package manager console
- is used.
-
- .PARAMETER StartUpProjectName
- Specifies the configuration file to use for named connection strings. If
- omitted, the specified project's configuration file is used.
-
- .PARAMETER ConfigurationTypeName
- Specifies the migrations configuration to use. If omitted, migrations will
- attempt to locate a single migrations configuration type in the target
- project.
-
- .PARAMETER ConnectionStringName
- Specifies the name of a connection string to use from the application's
- configuration file.
-
- .PARAMETER ConnectionString
- Specifies the the connection string to use. If omitted, the context's
- default connection will be used.
-
- .PARAMETER ConnectionProviderName
- Specifies the provider invariant name of the connection string.
-
- .PARAMETER AppDomainBaseDirectory
- Specifies the directory to use for the app-domain that is used for running Migrations
- code such that the app-domain is able to find all required assemblies. This is an
- advanced option that should only be needed if the solution contains several projects
- such that the assemblies needed for the context and configuration are not all
- referenced from either the project containing the context or the project containing
- the migrations.
- #>
- function Get-Migrations
- {
- [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
- param (
- [string] $ProjectName,
- [string] $StartUpProjectName,
- [string] $ConfigurationTypeName,
- [parameter(ParameterSetName = 'ConnectionStringName')]
- [string] $ConnectionStringName,
- [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
- Mandatory = $true)]
- [string] $ConnectionString,
- [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
- Mandatory = $true)]
- [string] $ConnectionProviderName,
- [string] $AppDomainBaseDirectory)
-
- $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName $null $AppDomainBaseDirectory
-
- try
- {
- Invoke-RunnerCommand $runner System.Data.Entity.Migrations.GetMigrationsCommand
- $error = Get-RunnerError $runner
-
- if ($error)
- {
- if ($knownExceptions -notcontains $error.TypeName)
- {
- Write-Host $error.StackTrace
- }
- else
- {
- Write-Verbose $error.StackTrace
- }
-
- throw $error.Message
- }
- }
- finally
- {
- Remove-Runner $runner
- }
- }
-
- function New-MigrationsRunner($ProjectName, $StartUpProjectName, $ContextProjectName, $ConfigurationTypeName, $ConnectionStringName, $ConnectionString, $ConnectionProviderName, $ContextAssemblyName, $AppDomainBaseDirectory)
- {
- $startUpProject = Get-MigrationsStartUpProject $StartUpProjectName $ProjectName
- Build-Project $startUpProject
-
- $project = Get-MigrationsProject $ProjectName
- Build-Project $project
-
- $contextProject = $project
- if ($ContextProjectName)
- {
- $contextProject = Get-SingleProject $ContextProjectName
- Build-Project $contextProject
- }
-
- $installPath = Get-EntityFrameworkInstallPath $project
- $toolsPath = Join-Path $installPath tools
-
- $info = New-AppDomainSetup $project $installPath
-
- $domain = [AppDomain]::CreateDomain('Migrations', $null, $info)
- $domain.SetData('project', $project)
- $domain.SetData('contextProject', $contextProject)
- $domain.SetData('startUpProject', $startUpProject)
- $domain.SetData('configurationTypeName', $ConfigurationTypeName)
- $domain.SetData('connectionStringName', $ConnectionStringName)
- $domain.SetData('connectionString', $ConnectionString)
- $domain.SetData('connectionProviderName', $ConnectionProviderName)
- $domain.SetData('contextAssemblyName', $ContextAssemblyName)
- $domain.SetData('appDomainBaseDirectory', $AppDomainBaseDirectory)
-
- $dispatcher = New-DomainDispatcher $toolsPath
- $domain.SetData('efDispatcher', $dispatcher)
-
- return @{
- Domain = $domain;
- ToolsPath = $toolsPath
- }
- }
-
- function New-EFConfigRunner($Project)
- {
- $installPath = Get-EntityFrameworkInstallPath $Project
- $toolsPath = Join-Path $installPath tools
- $info = New-AppDomainSetup $Project $installPath
-
- $domain = [AppDomain]::CreateDomain('EFConfig', $null, $info)
- $domain.SetData('project', $Project)
-
- $dispatcher = New-DomainDispatcher $toolsPath
- $domain.SetData('efDispatcher', $dispatcher)
-
- return @{
- Domain = $domain;
- ToolsPath = $toolsPath
- }
- }
-
- function New-AppDomainSetup($Project, $InstallPath)
- {
- $info = New-Object System.AppDomainSetup -Property @{
- ShadowCopyFiles = 'true';
- ApplicationBase = $InstallPath;
- PrivateBinPath = 'tools';
- ConfigurationFile = ([AppDomain]::CurrentDomain.SetupInformation.ConfigurationFile)
- }
-
- $targetFrameworkVersion = (New-Object System.Runtime.Versioning.FrameworkName ($Project.Properties.Item('TargetFrameworkMoniker').Value)).Version
-
- if ($targetFrameworkVersion -lt (New-Object Version @( 4, 5 )))
- {
- $info.PrivateBinPath += ';lib\net40'
- }
- else
- {
- $info.PrivateBinPath += ';lib\net45'
- }
-
- return $info
- }
-
- function New-DomainDispatcher($ToolsPath)
- {
- $utilityAssembly = [System.Reflection.Assembly]::LoadFrom((Join-Path $ToolsPath EntityFramework.PowerShell.Utility.dll))
- $dispatcher = $utilityAssembly.CreateInstance(
- 'System.Data.Entity.Migrations.Utilities.DomainDispatcher',
- $false,
- [System.Reflection.BindingFlags]::Instance -bor [System.Reflection.BindingFlags]::Public,
- $null,
- $PSCmdlet,
- $null,
- $null)
-
- return $dispatcher
- }
-
- function Remove-Runner($runner)
- {
- [AppDomain]::Unload($runner.Domain)
- }
-
- function Invoke-RunnerCommand($runner, $command, $parameters, $anonymousArguments)
- {
- $domain = $runner.Domain
-
- if ($anonymousArguments)
- {
- $anonymousArguments.GetEnumerator() | %{
- $domain.SetData($_.Name, $_.Value)
- }
- }
-
- $domain.CreateInstanceFrom(
- (Join-Path $runner.ToolsPath EntityFramework.PowerShell.dll),
- $command,
- $false,
- 0,
- $null,
- $parameters,
- $null,
- $null) | Out-Null
- }
-
- function Get-RunnerError($runner)
- {
- $domain = $runner.Domain
-
- if (!$domain.GetData('wasError'))
- {
- return $null
- }
-
- return @{
- Message = $domain.GetData('error.Message');
- TypeName = $domain.GetData('error.TypeName');
- StackTrace = $domain.GetData('error.StackTrace')
- }
- }
-
- function Get-MigrationsProject($name, $hideMessage)
- {
- if ($name)
- {
- return Get-SingleProject $name
- }
-
- $project = Get-Project
- $projectName = $project.Name
-
- if (!$hideMessage)
- {
- Write-Verbose "Using NuGet project '$projectName'."
- }
-
- return $project
- }
-
- function Get-MigrationsStartUpProject($name, $fallbackName)
- {
- $startUpProject = $null
-
- if ($name)
- {
- $startUpProject = Get-SingleProject $name
- }
- else
- {
- $startupProjectPaths = $DTE.Solution.SolutionBuild.StartupProjects
-
- if ($startupProjectPaths)
- {
- if ($startupProjectPaths.Length -eq 1)
- {
- $startupProjectPath = $startupProjectPaths[0]
-
- if (!(Split-Path -IsAbsolute $startupProjectPath))
- {
- $solutionPath = Split-Path $DTE.Solution.Properties.Item('Path').Value
- $startupProjectPath = Join-Path $solutionPath $startupProjectPath -Resolve
- }
-
- $startupProject = Get-SolutionProjects | ?{
- try
- {
- $fullName = $_.FullName
- }
- catch [NotImplementedException]
- {
- return $false
- }
-
- if ($fullName -and $fullName.EndsWith('\'))
- {
- $fullName = $fullName.Substring(0, $fullName.Length - 1)
- }
-
- return $fullName -eq $startupProjectPath
- }
- }
- else
- {
- Write-Verbose 'More than one start-up project found.'
- }
- }
- else
- {
- Write-Verbose 'No start-up project found.'
- }
- }
-
- if (!($startUpProject -and (Test-StartUpProject $startUpProject)))
- {
- $startUpProject = Get-MigrationsProject $fallbackName $true
- $startUpProjectName = $startUpProject.Name
-
- Write-Warning "Cannot determine a valid start-up project. Using project '$startUpProjectName' instead. Your configuration file and working directory may not be set as expected. Use the -StartUpProjectName parameter to set one explicitly. Use the -Verbose switch for more information."
- }
- else
- {
- $startUpProjectName = $startUpProject.Name
-
- Write-Verbose "Using StartUp project '$startUpProjectName'."
- }
-
- return $startUpProject
- }
-
- function Get-SolutionProjects()
- {
- $projects = New-Object System.Collections.Stack
-
- $DTE.Solution.Projects | %{
- $projects.Push($_)
- }
-
- while ($projects.Count -ne 0)
- {
- $project = $projects.Pop();
-
- # NOTE: This line is similar to doing a "yield return" in C#
- $project
-
- if ($project.ProjectItems)
- {
- $project.ProjectItems | ?{ $_.SubProject } | %{
- $projects.Push($_.SubProject)
- }
- }
- }
- }
-
- function Get-SingleProject($name)
- {
- $project = Get-Project $name
-
- if ($project -is [array])
- {
- throw "More than one project '$name' was found. Specify the full name of the one to use."
- }
-
- return $project
- }
-
- function Test-StartUpProject($project)
- {
- if ($project.Kind -eq '{cc5fd16d-436d-48ad-a40c-5a424c6e3e79}')
- {
- $projectName = $project.Name
- Write-Verbose "Cannot use start-up project '$projectName'. The Windows Azure Project type isn't supported."
-
- return $false
- }
-
- return $true
- }
-
- function Build-Project($project)
- {
- $configuration = $DTE.Solution.SolutionBuild.ActiveConfiguration.Name
-
- $DTE.Solution.SolutionBuild.BuildProject($configuration, $project.UniqueName, $true)
-
- if ($DTE.Solution.SolutionBuild.LastBuildInfo)
- {
- $projectName = $project.Name
-
- throw "The project '$projectName' failed to build."
- }
- }
-
- function Get-EntityFrameworkInstallPath($project)
- {
- $package = Get-Package -ProjectName $project.FullName | ?{ $_.Id -eq 'EntityFramework' }
-
- if (!$package)
- {
- $projectName = $project.Name
-
- throw "The EntityFramework package is not installed on project '$projectName'."
- }
-
- return Get-PackageInstallPath $package
- }
-
- function Get-PackageInstallPath($package)
- {
- $componentModel = Get-VsComponentModel
- $packageInstallerServices = $componentModel.GetService([NuGet.VisualStudio.IVsPackageInstallerServices])
-
- $vsPackage = $packageInstallerServices.GetInstalledPackages() | ?{ $_.Id -eq $package.Id -and $_.Version -eq $package.Version }
-
- return $vsPackage.InstallPath
- }
-
- function Check-Project($project)
- {
- if (!$project.FullName)
- {
- throw "The Project argument must refer to a Visual Studio project. Use the '`$project' variable provided by NuGet when running in install.ps1."
- }
-
- return $project.CodeModel
- }
-
- Export-ModuleMember @( 'Enable-Migrations', 'Add-Migration', 'Update-Database', 'Get-Migrations', 'Add-EFProvider', 'Add-EFDefaultConnectionFactory', 'Initialize-EFConfiguration') -Variable InitialDatabase
-
- # SIG # Begin signature block
- # MIIarwYJKoZIhvcNAQcCoIIaoDCCGpwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
- # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
- # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU3poUYDlTlwf2GyqxNJ7CRJO4
- # tk2gghWCMIIEwzCCA6ugAwIBAgITMwAAADPlJ4ajDkoqgAAAAAAAMzANBgkqhkiG
- # 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
- # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw
- # HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTMwMzI3MjAwODIz
- # WhcNMTQwNjI3MjAwODIzWjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
- # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
- # b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO
- # OkY1MjgtMzc3Ny04QTc2MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT
- # ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyt7KGQ8fllaC
- # X9hCMtQIbbadwMLtfDirWDOta4FQuIghCl2vly2QWsfDLrJM1GN0WP3fxYlU0AvM
- # /ZyEEXmsoyEibTPgrt4lQEWSTg1jCCuLN91PB2rcKs8QWo9XXZ09+hdjAsZwPrsi
- # 7Vux9zK65HG8ef/4y+lXP3R75vJ9fFdYL6zSDqjZiNlAHzoiQeIJJgKgzOUlzoxn
- # g99G+IVNw9pmHsdzfju0dhempaCgdFWo5WAYQWI4x2VGqwQWZlbq+abLQs9dVGQv
- # gfjPOAAPEGvhgy6NPkjsSVZK7Jpp9MsPEPsHNEpibAGNbscghMpc0WOZHo5d7A+l
- # Fkiqa94hLwIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFABYGz7txfEGk74xPTa0rAtd
- # MvCBMB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw
- # SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz
- # L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG
- # AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv
- # c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI
- # hvcNAQEFBQADggEBAAL/44wD6u9+OLm5fJ87UoOk+iM41AO4alm16uBviAP0b1Fq
- # lTp1hegc3AfFTp0bqM4kRxQkTzV3sZy8J3uPXU/8BouXl/kpm/dAHVKBjnZIA37y
- # mxe3rtlbIpFjOzJfNfvGkTzM7w6ZgD4GkTgTegxMvjPbv+2tQcZ8GyR8E9wK/EuK
- # IAUdCYmROQdOIU7ebHxwu6vxII74mHhg3IuUz2W+lpAPoJyE7Vy1fEGgYS29Q2dl
- # GiqC1KeKWfcy46PnxY2yIruSKNiwjFOPaEdHodgBsPFhFcQXoS3jOmxPb6897t4p
- # sETLw5JnugDOD44R79ECgjFJlJidUUh4rR3WQLYwggTsMIID1KADAgECAhMzAAAA
- # sBGvCovQO5/dAAEAAACwMA0GCSqGSIb3DQEBBQUAMHkxCzAJBgNVBAYTAlVTMRMw
- # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
- # aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp
- # Z25pbmcgUENBMB4XDTEzMDEyNDIyMzMzOVoXDTE0MDQyNDIyMzMzOVowgYMxCzAJ
- # BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
- # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIx
- # HjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB
- # BQADggEPADCCAQoCggEBAOivXKIgDfgofLwFe3+t7ut2rChTPzrbQH2zjjPmVz+l
- # URU0VKXPtIupP6g34S1Q7TUWTu9NetsTdoiwLPBZXKnr4dcpdeQbhSeb8/gtnkE2
- # KwtA+747urlcdZMWUkvKM8U3sPPrfqj1QRVcCGUdITfwLLoiCxCxEJ13IoWEfE+5
- # G5Cw9aP+i/QMmk6g9ckKIeKq4wE2R/0vgmqBA/WpNdyUV537S9QOgts4jxL+49Z6
- # dIhk4WLEJS4qrp0YHw4etsKvJLQOULzeHJNcSaZ5tbbbzvlweygBhLgqKc+/qQUF
- # 4eAPcU39rVwjgynrx8VKyOgnhNN+xkMLlQAFsU9lccUCAwEAAaOCAWAwggFcMBMG
- # A1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBRZcaZaM03amAeA/4Qevof5cjJB
- # 8jBRBgNVHREESjBIpEYwRDENMAsGA1UECxMETU9QUjEzMDEGA1UEBRMqMzE1OTUr
- # NGZhZjBiNzEtYWQzNy00YWEzLWE2NzEtNzZiYzA1MjM0NGFkMB8GA1UdIwQYMBaA
- # FMsR6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j
- # cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8w
- # OC0zMS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6
- # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMx
- # LTIwMTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQAx124qElczgdWdxuv5OtRETQie
- # 7l7falu3ec8CnLx2aJ6QoZwLw3+ijPFNupU5+w3g4Zv0XSQPG42IFTp8263Os8ls
- # ujksRX0kEVQmMA0N/0fqAwfl5GZdLHudHakQ+hywdPJPaWueqSSE2u2WoN9zpO9q
- # GqxLYp7xfMAUf0jNTbJE+fA8k21C2Oh85hegm2hoCSj5ApfvEQO6Z1Ktwemzc6bS
- # Y81K4j7k8079/6HguwITO10g3lU/o66QQDE4dSheBKlGbeb1enlAvR/N6EXVruJd
- # PvV1x+ZmY2DM1ZqEh40kMPfvNNBjHbFCZ0oOS786Du+2lTqnOOQlkgimiGaCMIIF
- # vDCCA6SgAwIBAgIKYTMmGgAAAAAAMTANBgkqhkiG9w0BAQUFADBfMRMwEQYKCZIm
- # iZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQD
- # EyRNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwODMx
- # MjIxOTMyWhcNMjAwODMxMjIyOTMyWjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
- # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
- # IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBD
- # QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJyWVwZMGS/HZpgICBC
- # mXZTbD4b1m/My/Hqa/6XFhDg3zp0gxq3L6Ay7P/ewkJOI9VyANs1VwqJyq4gSfTw
- # aKxNS42lvXlLcZtHB9r9Jd+ddYjPqnNEf9eB2/O98jakyVxF3K+tPeAoaJcap6Vy
- # c1bxF5Tk/TWUcqDWdl8ed0WDhTgW0HNbBbpnUo2lsmkv2hkL/pJ0KeJ2L1TdFDBZ
- # +NKNYv3LyV9GMVC5JxPkQDDPcikQKCLHN049oDI9kM2hOAaFXE5WgigqBTK3S9dP
- # Y+fSLWLxRT3nrAgA9kahntFbjCZT6HqqSvJGzzc8OJ60d1ylF56NyxGPVjzBrAlf
- # A9MCAwEAAaOCAV4wggFaMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMsR6MrS
- # tBZYAck3LjMWFrlMmgofMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQAB
- # MCMGCSsGAQQBgjcVAgQWBBT90TFO0yaKleGYYDuoMW+mPLzYLTAZBgkrBgEEAYI3
- # FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQOrIJgQFYnl+UlE/wq4QpTlVnk
- # pDBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp
- # L2NybC9wcm9kdWN0cy9taWNyb3NvZnRyb290Y2VydC5jcmwwVAYIKwYBBQUHAQEE
- # SDBGMEQGCCsGAQUFBzAChjhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
- # cnRzL01pY3Jvc29mdFJvb3RDZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAgEAWTk+
- # fyZGr+tvQLEytWrrDi9uqEn361917Uw7LddDrQv+y+ktMaMjzHxQmIAhXaw9L0y6
- # oqhWnONwu7i0+Hm1SXL3PupBf8rhDBdpy6WcIC36C1DEVs0t40rSvHDnqA2iA6VW
- # 4LiKS1fylUKc8fPv7uOGHzQ8uFaa8FMjhSqkghyT4pQHHfLiTviMocroE6WRTsgb
- # 0o9ylSpxbZsa+BzwU9ZnzCL/XB3Nooy9J7J5Y1ZEolHN+emjWFbdmwJFRC9f9Nqu
- # 1IIybvyklRPk62nnqaIsvsgrEA5ljpnb9aL6EiYJZTiU8XofSrvR4Vbo0HiWGFzJ
- # NRZf3ZMdSY4tvq00RBzuEBUaAF3dNVshzpjHCe6FDoxPbQ4TTj18KUicctHzbMrB
- # 7HCjV5JXfZSNoBtIA1r3z6NnCnSlNu0tLxfI5nI3EvRvsTxngvlSso0zFmUeDord
- # EN5k9G/ORtTTF+l5xAS00/ss3x+KnqwK+xMnQK3k+eGpf0a7B2BHZWBATrBC7E7t
- # s3Z52Ao0CW0cgDEf4g5U3eWh++VHEK1kmP9QFi58vwUheuKVQSdpw5OPlcmN2Jsh
- # rg1cnPCiroZogwxqLbt2awAdlq3yFnv2FoMkuYjPaqhHMS+a3ONxPdcAfmJH0c6I
- # ybgY+g5yjcGjPa8CQGr/aZuW4hCoELQ3UAjWwz0wggYHMIID76ADAgECAgphFmg0
- # AAAAAAAcMA0GCSqGSIb3DQEBBQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAX
- # BgoJkiaJk/IsZAEZFgltaWNyb3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290
- # IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMx
- # MzAzMDlaMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
- # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf
- # BgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEB
- # BQADggEPADCCAQoCggEBAJ+hbLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn
- # 0UytdDAgEesH1VSVFUmUG0KSrphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0
- # Zxws/HvniB3q506jocEjU8qN+kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4n
- # rIZPVVIM5AMs+2qQkDBuh/NZMJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YR
- # JylmqJfk0waBSqL5hKcRRxQJgp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54
- # QTF3zJvfO4OToWECtR0Nsfz3m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8G
- # A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsG
- # A1UdDwQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJg
- # QFYnl+UlE/wq4QpTlVnkpKFjpGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcG
- # CgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3Qg
- # Q2VydGlmaWNhdGUgQXV0aG9yaXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJ
- # MEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1
- # Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYB
- # BQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9z
- # b2Z0Um9vdENlcnQuY3J0MBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEB
- # BQUAA4ICAQAQl4rDXANENt3ptK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1i
- # uFcCy04gE1CZ3XpA4le7r1iaHOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+r
- # kuTnjWrVgMHmlPIGL4UD6ZEqJCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGct
- # xVEO6mJcPxaYiyA/4gcaMvnMMUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/F
- # NSteo7/rvH0LQnvUU3Ih7jDKu3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbo
- # nXCUbKw5TNT2eb+qGHpiKe+imyk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0
- # NbhOxXEjEiZ2CzxSjHFaRkMUvLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPp
- # K+m79EjMLNTYMoBMJipIJF9a6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2J
- # oXZhtG6hE6a/qkfwEm/9ijJssv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0
- # eFQF1EEuUKyUsKV4q7OglnUa2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng
- # 9wFlb4kLfchpyOZu6qeXzjEp/w7FW1zYTRuh2Povnj8uVRZryROj/TGCBJcwggST
- # AgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
- # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAh
- # BgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBAhMzAAAAsBGvCovQO5/d
- # AAEAAACwMAkGBSsOAwIaBQCggbAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
- # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFFEE
- # zHuXOuYUdMMU6ccXv39TiFxTMFAGCisGAQQBgjcCAQwxQjBAoCKAIABFAG4AdABp
- # AHQAeQAgAEYAcgBhAG0AZQB3AG8AcgBroRqAGGh0dHA6Ly9tc2RuLmNvbS9kYXRh
- # L2VmIDANBgkqhkiG9w0BAQEFAASCAQBgQHCc01/cBLBTTzbmZi2C1McvIzYz9F4d
- # fvAc+d7VdsyfUcSRdl96k297wjgKtT8aS5ENWXs/NaZAIB1gBTu9nqzx3r8Rp7Pn
- # qr3Aosj7bahFVcjR9+UIgPqPtgQVQFU3eUxFcgXIyYz5Q7JZc2IY9kX7jj3Ma8uI
- # tO5VG45PYaDc5jjmZs1a8CYCUtdgZys+dtNSSw6mqpFZY80Be5s/+RVYd9sYu1sY
- # 1/Sh1sIsuqJwbqMJy96ZwvY11EgqwjX2pgm9wQ9DjFNl2PqZXiY1xTCko7uA4YvR
- # SysBXKEzByYev9KAbFV/wmZdhuyazTtrBuwflPKsxn1aVg1xtcFpoYICKDCCAiQG
- # CSqGSIb3DQEJBjGCAhUwggIRAgEBMIGOMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
- # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv
- # ZnQgQ29ycG9yYXRpb24xITAfBgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD
- # QQITMwAAADPlJ4ajDkoqgAAAAAAAMzAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkD
- # MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTQwMjI1MDkzMTQ0WjAjBgkq
- # hkiG9w0BCQQxFgQUXYYIPCdzaJx5E5wlK51Y/RoP9dowDQYJKoZIhvcNAQEFBQAE
- # ggEAkc2/P/rVvbGweFkA/ZaVqvKSdGn2Kc8q8dIrfQbnRjEGMrYSJvht2bjXnQHZ
- # cxyqyVRpHtWkGlYKnzZvmxuxC30TJ3MLOlDDmJok5QfrZe01NSXOZ1lWRg15dF6I
- # hFhpsAPLL+PFYUMrIWWvR/5qZ8m4+tqfY4lmxriDlQYve2PQv0YUh9Fx7frQxhSj
- # qAC0BPVNoSOsv5i182IZr5lqZh4Aae2DhTBjbHzT3Ibf1RiRI0p8/3Mz+RVby4Xv
- # WbdNDNkQMAefo37yVaDQHHR4n6ooAtU4WeRJX1/awlMwWViguzG2GVgKN7+1r3hL
- # 6EHKk+w0L9lxR2hthCkBn8+rCw==
- # SIG # End signature block
|