| # 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 | |
| ) | |
| Check-Project $project | |
| $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 | |
| ) | |
| Check-Project $project | |
| $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 | |
| ) | |
| Check-Project $project | |
| $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. | |
| #> | |
| 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 | |
| ) | |
| $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $ContextProjectName $null $ConnectionStringName $ConnectionString $ConnectionProviderName | |
| 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. | |
| #> | |
| 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) | |
| $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName | |
| 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. | |
| #> | |
| 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) | |
| $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName | |
| 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. | |
| #> | |
| 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) | |
| $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName | |
| 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) | |
| { | |
| $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) | |
| $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." | |
| } | |
| } | |
| Export-ModuleMember @( 'Enable-Migrations', 'Add-Migration', 'Update-Database', 'Get-Migrations', 'Add-EFProvider', 'Add-EFDefaultConnectionFactory', 'Initialize-EFConfiguration') -Variable InitialDatabase | |
| # SIG # Begin signature block | |
| # MIIarwYJKoZIhvcNAQcCoIIaoDCCGpwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB | |
| # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR | |
| # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUGD2nrGYv22CsZ8TVTLPYVoMj | |
| # HJGgghWCMIIEwzCCA6ugAwIBAgITMwAAACs5MkjBsslI8wAAAAAAKzANBgkqhkiG | |
| # 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G | |
| # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw | |
| # HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTIwOTA0MjExMjM0 | |
| # WhcNMTMxMjA0MjExMjM0WjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp | |
| # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw | |
| # b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO | |
| # OkMwRjQtMzA4Ni1ERUY4MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT | |
| # ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAprYwDgNlrlBa | |
| # hmuFn0ihHsnA7l5JB4XgcJZ8vrlfYl8GJtOLObsYIqUukq3YS4g6Gq+bg67IXjmM | |
| # wjJ7FnjtNzg68WL7aIICaOzru0CKsf6hLDZiYHA5YGIO+8YYOG+wktZADYCmDXiL | |
| # NmuGiiYXGP+w6026uykT5lxIjnBGNib+NDWrNOH32thc6pl9MbdNH1frfNaVDWYM | |
| # Hg4yFz4s1YChzuv3mJEC3MFf/TiA+Dl/XWTKN1w7UVtdhV/OHhz7NL5f5ShVcFSc | |
| # uOx8AFVGWyiYKFZM4fG6CRmWgUgqMMj3MyBs52nDs9TDTs8wHjfUmFLUqSNFsq5c | |
| # QUlPtGJokwIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFKUYM1M/lWChQxbvjsav0iu6 | |
| # nljQMB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw | |
| # SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz | |
| # L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG | |
| # AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv | |
| # c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI | |
| # hvcNAQEFBQADggEBAH7MsHvlL77nVrXPc9uqUtEWOca0zfrX/h5ltedI85tGiAVm | |
| # aiaGXv6HWNzGY444gPQIRnwrc7EOv0Gqy8eqlKQ38GQ54cXV+c4HzqvkJfBprtRG | |
| # 4v5mMjzXl8UyIfruGiWgXgxCLBEzOoKD/e0ds77OkaSRJXG5q3Kwnq/kzwBiiXCp | |
| # uEpQjO4vImSlqOZNa5UsHHnsp6Mx2pBgkKRu/pMCDT8sJA3GaiaBUYNKELt1Y0Sq | |
| # aQjGA+vizwvtVjrs73KnCgz0ANMiuK8icrPnxJwLKKCAyuPh1zlmMOdGFxjn+oL6 | |
| # WQt6vKgN/hz/A4tjsk0SAiNPLbOFhDvioUfozxUwggTsMIID1KADAgECAhMzAAAA | |
| # 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 | |
| # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFHlP | |
| # wIpDUAGAnbgDrTywRVvTXuBEMFAGCisGAQQBgjcCAQwxQjBAoCKAIABFAG4AdABp | |
| # AHQAeQAgAEYAcgBhAG0AZQB3AG8AcgBroRqAGGh0dHA6Ly9tc2RuLmNvbS9kYXRh | |
| # L2VmIDANBgkqhkiG9w0BAQEFAASCAQBGhre2E1qw0m8EQgJBaVLi6CgwVn7+qSCY | |
| # WqIIcygRNohB5i3zj61/qTEa4DZLc0F3hvGC6aNwwjUbnoU4nZoqOSQgta2DaVul | |
| # uhm7Y+BTZsXvYY9q26UjgUbo1jdBrWelIbu+3YV+pE00UVuV0RabWkEdFBr9HeOV | |
| # nZYczzdVvnYkkkFxO25SVHZWT2nyWhYxMYv+HLoUBND1BmZzNYWnJqegL4BrczNm | |
| # exycbGbRVEO45QOJEK+3vA4o6GKPk09wcFEmkvlncGKTz4fGhYWf5ELykT0TSQuL | |
| # vP1PN35OUNzlpqc2FuWCDosVl8FUhphYXpiw/1sUnI5nPG8aGiUboYICKDCCAiQG | |
| # CSqGSIb3DQEJBjGCAhUwggIRAgEBMIGOMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQI | |
| # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv | |
| # ZnQgQ29ycG9yYXRpb24xITAfBgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD | |
| # QQITMwAAACs5MkjBsslI8wAAAAAAKzAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkD | |
| # MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMxMDEwMTgwNzQ5WjAjBgkq | |
| # hkiG9w0BCQQxFgQU0jwg1lgVl4Ydsz+7YfTew/L6w9EwDQYJKoZIhvcNAQEFBQAE | |
| # ggEAZQeQpORBQD+nK+FPIyoJuEszPWLcNzhEEJCollZIC69z5lBP2AVtdt7Q1I+F | |
| # t8zeexQTEKKskW/+06sLvdVjk7lRb3c0mVttfaggOXrObXpPx6b2TGfsn7TfeJR3 | |
| # NxNMIw8ljIk+t2ltN7WIsmIRJt2GEvZ8e5unRjdxxxvo3jfjoN8hP4o1Yi5RRBLE | |
| # 8vX5PnMGnP0h/XQQLZ/BY/FSjkSxqpaE+aYlSD9XZJ8xFHpKWBgSDCg2sCoZtZZS | |
| # vx2pVYtoOtNKnj1401p5VzmXeEGo6p5XzV+2qhkBlERzaQh8uD34t2ZQ7N+FJMx+ | |
| # WMbUNQvitmiS37oU8qZeYiKRTg== | |
| # SIG # End signature block | |