← all demos
// ***********************************************************************************************
// NuGet.targets
//
// WARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
// created a backup copy.  Incorrect changes to this file will make it
// impossible to load or build your projects from the command-line or the IDE.
//
// Copyright (c) .NET Foundation. All rights reserved.
// ***********************************************************************************************
//
// This target file contains the NuGet Restore target for walking the project and reference graph
// and restoring dependencies from the graph.
//
// Ways to use this targets file:
// 1. Invoke it directly and provide project file paths using $(RestoreGraphProjectInput).
// 2. With a solution this may be used as a target in the metaproj.
// 3. Import the targets file from a project.
//
// Restore flow summary:
// 1. Top level projects (entry points) are determined.
// 2. Each project and all of its project references are walked recursively.
// 3. The project is evaluated for each $(TargetFramework). Items are created
// for project properties and dependencies. Each item is marked
// with the project it came from so that it can be matched up later.
// 4. All restore items generated by the walk are grouped together by
// project and convert into a project spec.
//
// The result file contains:
// 1. A list of projects to restore.
// 2. The complete closure of all projects referenced (Includes project references that are not being restored directly).
// 3. Package and project dependencies for each project.
// 4. DotnetCliTool references
Project(xmlns="http://schemas.microsoft.com/developer/msbuild/2003")
  PropertyGroup
    // Mark that this target file has been loaded.
    IsRestoreTargetsFileLoaded = true
    // Load NuGet.Build.Tasks.dll, this can be overridden to use a different version with $(RestoreTaskAssemblyFile)
    if '$(RestoreTaskAssemblyFile)' == '':
      RestoreTaskAssemblyFile = NuGet.Build.Tasks.dll
    // Do not hide errors and warnings by default
    if '$(HideWarningsAndErrors)' == '':
      HideWarningsAndErrors = false
    // Recurse by default
    if '$(RestoreRecursive)' == '':
      RestoreRecursive = true
    if '$(RestoreUseSkipNonexistentTargets)' == '':
      RestoreUseSkipNonexistentTargets = true
    // RuntimeIdentifier compatibility check
    if '$(ValidateRuntimeIdentifierCompatibility)' == '':
      ValidateRuntimeIdentifierCompatibility = false
    // Error handling while walking projects
    if '$(RestoreContinueOnError)' == '':
      RestoreContinueOnError = WarnAndContinue
    // Build in parallel
    if '$(BuildInParallel)' != '':
      RestoreBuildInParallel = $(BuildInParallel)
    if '$(RestoreBuildInParallel)' == '':
      RestoreBuildInParallel = true
    // Check if the restore target was executed on a sln file
    if '$(_RestoreSolutionFileUsed)' == '' AND '$(SolutionDir)' != '' AND $(MSBuildProjectFullPath.EndsWith('.metaproj')) == 'true':
      _RestoreSolutionFileUsed = true
    // We default to MSBuildInteractive.
    if '$(NuGetInteractive)' == '':
      NuGetInteractive = $(MSBuildInteractive)
    // Mark that this targets file supports package download.
    PackageDownloadSupported = true
    // Mark that this targets file GetReferenceNearestTargetFrameworkTask task supports the TargetPlatformMoniker
    GetReferenceNearestTargetFrameworkTaskSupportsTargetPlatformParameter = true
    // Mark that this targets file GetReferenceNearestTargetFrameworkTask task supports the TargetFramework
    GetReferenceNearestTargetFrameworkTaskSupportsTargetFrameworkPropertyParameter = true
    // Flag if the Central package file is enabled
    if '$(ManagePackageVersionsCentrally)' == 'true' AND '$(CentralPackageVersionsFileImported)' == 'true':
      _CentralPackageVersionsEnabled = true
  // Visual Studio's project property page requires defaults to be set to inform customers what the default values are.
  // Project-system uses DefaultValueSourceLocation.AfterContext to detect when a customer's project changes the value, so these defaults must be set here in the targets file.
  PropertyGroup
    // Enable NuGetAudit by default
    if '$(NuGetAudit)' == '':
      NuGetAudit = true
    // Report all severity vulnerabilities (low severity and higher). Allowed values are: low, moderate, high, critical
    if '$(NuGetAuditLevel)' == '':
      NuGetAuditLevel = low
    // Report known vulnerabilities on direct and transitive dependencies for .NET 10 and higher, direct only otherwise
    if '$(NuGetAuditMode)' == '' AND '$(NuGetExeSkipSdkAnalysisLevelCheck)' != 'true' AND '$(TargetFrameworkIdentifier)' == '.NETCoreApp' AND $([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '10.0')):
      NuGetAuditMode = all
    if '$(NuGetAuditMode)' == '':
      NuGetAuditMode = direct
    // Analyzer assets restore defaults to off. An opt-in on the outer build or any target framework enables analyzer assets project-wide.
    if '$(RestoreEnableAnalyzerAssets)' == '' AND '$(TargetFrameworks)' == '':
      RestoreEnableAnalyzerAssets = false
  // Package pruning is enabled for all projects targeting .NET 10 or greater, including multi-targeted projects.
  PropertyGroup
    // We only set the RestoreEnablePackagePruning default for single TFM projects.
    // For multi-targeted projects that requires knowing the other inner builds, so we rely on RestorePackagePruningDefault.
    if '$(RestoreEnablePackagePruning)' == '' AND '$(UsingMicrosoftNETSdk)' == 'true' AND '$(TargetFrameworks)' == '' AND '$(NuGetExeSkipSdkAnalysisLevelCheck)' != 'true' AND '$(SdkAnalysisLevel)' != '' AND $([MSBuild]::VersionGreaterThanOrEquals('$(SdkAnalysisLevel)', '10.0.100')) AND ('$(TargetFrameworkIdentifier)' == '.NETCoreApp' AND '$(TargetFrameworkVersion)' != '' AND $([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '10.0'))):
      RestoreEnablePackagePruning = true
    if $(RestoreEnablePackagePruning) == '' AND '$(TargetFrameworks)' == '':
      RestoreEnablePackagePruning = false
    if '$(UsingMicrosoftNETSdk)' == 'true' AND '$(NuGetExeSkipSdkAnalysisLevelCheck)' != 'true' AND '$(SdkAnalysisLevel)' != '' AND $([MSBuild]::VersionGreaterThanOrEquals('$(SdkAnalysisLevel)', '10.0.100')) AND ('$(TargetFrameworkIdentifier)' == '.NETCoreApp' AND '$(TargetFrameworkVersion)' != '' AND $([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '10.0'))):
      RestorePackagePruningDefault = true
    if '$(RestorePackagePruningDefault)' == '':
      RestorePackagePruningDefault = false
  PropertyGroup
    // Exclude packages from changing restore inputs.
    _GenerateRestoreGraphProjectEntryInputProperties = ExcludeRestorePackageImports=true
    // Standalone mode
    // This is used by NuGet.exe to inject targets into the project that will be
    // walked next. In normal /t:Restore mode this causes a duplicate import
    // since NuGet.targets it loaded as part of MSBuild, there is should be
    // skipped.
    if '$(RestoreUseCustomAfterTargets)' == 'true':
      _GenerateRestoreGraphProjectEntryInputProperties =
        | $(_GenerateRestoreGraphProjectEntryInputProperties);
        |       NuGetRestoreTargets=$(MSBuildThisFileFullPath);
        |       RestoreUseCustomAfterTargets=$(RestoreUseCustomAfterTargets);
        |       CustomAfterMicrosoftCommonCrossTargetingTargets=$(MSBuildThisFileFullPath);
        |       CustomAfterMicrosoftCommonTargets=$(MSBuildThisFileFullPath);
    // Include SolutionDir and SolutionName for solution restores and persist these properties during the walk.
    if '$(_RestoreSolutionFileUsed)' == 'true':
      _GenerateRestoreGraphProjectEntryInputProperties =
        | $(_GenerateRestoreGraphProjectEntryInputProperties);
        |       _RestoreSolutionFileUsed=true;
        |       SolutionDir=$(SolutionDir);
        |       SolutionName=$(SolutionName);
        |       SolutionFileName=$(SolutionFileName);
        |       SolutionPath=$(SolutionPath);
        |       SolutionExt=$(SolutionExt);
  if '$(ManagePackageVersionsCentrally)' == 'true' And '$(RestoreEnableGlobalPackageReference)' != 'false':
    ItemGroup
      // Add GlobalPackageReference items to the PackageReference item group with no version.
      //
      // Global package references only include the same assets as a development dependency (runtime; build; native; contentfiles; analyzers)
      // because those kind of packages are the best candidate for a global package reference.  They are generally packages that
      // extend the build.
      //
      // Global package references have all assets private because central package references are generally packages that provide
      // versioning, signing, etc and should not flow to downstream dependencies.  Also, central package references are already
      // referenced by every project in the tree so they don't need to be transitive.
      PackageReference += "@(GlobalPackageReference)"(
          IncludeAssets="Runtime;Build;Native;contentFiles;Analyzers",
          PrivateAssets="All",
          Version="")
      // Add GlobalPackageReference items to the PackageVersion item group with the version.
      PackageVersion += "@(GlobalPackageReference)"(Version="%(Version)")
  // Tasks
  UsingTask NuGet.Build.Tasks.RestoreTask(AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.WriteRestoreGraphTask(AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestoreProjectReferencesTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestorePackageReferencesTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetCentralPackageVersionsTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestorePackageDownloadsTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestoreFrameworkReferencesTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestoreNuGetAuditSuppressionsTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestorePrunePackageReferencesTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestoreDotnetCliToolsTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetProjectTargetFrameworksTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestoreSolutionProjectsTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestoreSettingsTask(AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.WarnForInvalidProjectsTask(AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetReferenceNearestTargetFrameworkTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetRestoreProjectStyleTask(AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.NuGetMessageTask(AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.CheckForDuplicateNuGetItemsTask(
      AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.GetGlobalPropertyValueTask(AssemblyFile="$(RestoreTaskAssemblyFile)")
  UsingTask NuGet.Build.Tasks.RefreshNuGetStaticStateTask(AssemblyFile="$(RestoreTaskAssemblyFile)")
  // ============================================================
  // Restore
  // Main entry point for restoring packages
  // ============================================================
  Target Restore(DependsOnTargets="_GenerateRestoreGraph")
    // Drop any duplicate items
    RemoveDuplicates(Inputs="@(_RestoreGraphEntry)")
      Output(ItemName="_RestoreGraphEntryFiltered", TaskParameter="Filtered")
    // Call restore
    RestoreTask(
        EmbedFilesInBinlog="$(RestoreEmbedFilesInBinlog)",
        HideWarningsAndErrors="$(HideWarningsAndErrors)",
        Interactive="$(NuGetInteractive)",
        RestoreDisableParallel="$(RestoreDisableParallel)",
        RestoreForce="$(RestoreForce)",
        RestoreForceEvaluate="$(RestoreForceEvaluate)",
        RestoreGraphItems="@(_RestoreGraphEntryFiltered)",
        RestoreIgnoreFailedSources="$(RestoreIgnoreFailedSources)",
        RestoreNoCache="$(RestoreNoCache)",
        RestoreNoHttpCache="$(RestoreNoHttpCache)",
        RestorePackagesConfig="$(RestorePackagesConfig)",
        RestoreRecursive="$(RestoreRecursive)")
      Output(ItemName="EmbedInBinlog", TaskParameter="EmbedInBinlog")
      Output(PropertyName="RestoreProjectCount", TaskParameter="ProjectsRestored")
      Output(PropertyName="RestoreSkippedCount", TaskParameter="ProjectsAlreadyUpToDate")
      Output(PropertyName="RestoreProjectsAuditedCount", TaskParameter="ProjectsAudited")
  // ============================================================
  // GenerateRestoreGraphFile
  // Writes the output of _GenerateRestoreGraph to disk
  // ============================================================
  Target GenerateRestoreGraphFile(DependsOnTargets="_GenerateRestoreGraph")
    // Validate
    if $(RestoreGraphOutputPath) == '':
      Error(Text="Missing RestoreGraphOutputPath property!")
    // Drop any duplicate items
    RemoveDuplicates(Inputs="@(_RestoreGraphEntry)")
      Output(ItemName="_RestoreGraphEntryFiltered", TaskParameter="Filtered")
    // Write file
    WriteRestoreGraphTask(
        RestoreGraphItems="@(_RestoreGraphEntryFiltered)",
        RestoreGraphOutputPath="$(RestoreGraphOutputPath)",
        RestoreRecursive="$(RestoreRecursive)")
  // ============================================================
  // CollectPackageReferences
  // Gathers all PackageReference items from the project.
  // This target may be used as an extension point to modify
  // package references before NuGet reads them.
  // ============================================================
  Target CollectPackageReferences(Returns="@(PackageReference)")
    // NOTE for design-time builds we need to ensure that we continue on error.
    PropertyGroup
      CollectPackageReferencesContinueOnError = $(ContinueOnError)
      if '$(ContinueOnError)' == '':
        CollectPackageReferencesContinueOnError = false
    if '$(DisableCheckingDuplicateNuGetItems)' != 'true':
      CheckForDuplicateNuGetItemsTask(
          ContinueOnError="$(CollectPackageReferencesContinueOnError)",
          ItemName="PackageReference",
          Items="@(PackageReference)",
          LogCode="NU1504",
          MSBuildProjectFullPath="$(MSBuildProjectFullPath)",
          NoWarn="$(NoWarn)",
          TreatWarningsAsErrors="$(TreatWarningsAsErrors)",
          WarningsAsErrors="$(WarningsAsErrors)",
          WarningsNotAsErrors="$(WarningsNotAsErrors)")
        Output(ItemName="DeduplicatedPackageReferences", TaskParameter="DeduplicatedItems")
    if '@(DeduplicatedPackageReferences)' != '':
      ItemGroup
        PackageReference -= "@(PackageReference)"
        PackageReference += "@(DeduplicatedPackageReferences)"
  // ============================================================
  // CollectCentralPackageVersions
  // Gathers all PackageVersion items from the central package versions file.
  // ============================================================
  Target CollectCentralPackageVersions(Returns="@(PackageVersion)")
    // NOTE for design-time builds we need to ensure that we continue on error.
    PropertyGroup
      CollectCentralPackageVersionsContinueOnError = $(ContinueOnError)
      if '$(ContinueOnError)' == '':
        CollectCentralPackageVersionsContinueOnError = false
    if '$(DisableCheckingDuplicateNuGetItems)' != 'true':
      CheckForDuplicateNuGetItemsTask(
          ContinueOnError="$(CollectCentralPackageVersionsContinueOnError)",
          ItemName="PackageVersion",
          Items="@(PackageVersion)",
          LogCode="NU1506",
          MSBuildProjectFullPath="$(MSBuildProjectFullPath)",
          NoWarn="$(NoWarn)",
          TreatWarningsAsErrors="$(TreatWarningsAsErrors)",
          WarningsAsErrors="$(WarningsAsErrors)",
          WarningsNotAsErrors="$(WarningsNotAsErrors)")
        Output(ItemName="DeduplicatedPackageVersions", TaskParameter="DeduplicatedItems")
    if '@(DeduplicatedPackageVersions)' != '':
      ItemGroup
        PackageVersion -= "@(PackageVersion)"
        PackageVersion += "@(DeduplicatedPackageVersions)"
  // ============================================================
  // CollectPackageDownloads
  // Gathers all PackageDownload items from the project.
  // This target may be used as an extension point to modify
  // package downloads before NuGet reads them.
  // ============================================================
  Target CollectPackageDownloads(Returns="@(PackageDownload)")
    // NOTE for design-time builds we need to ensure that we continue on error.
    PropertyGroup
      CollectPackageDownloadsContinueOnError = $(ContinueOnError)
      if '$(ContinueOnError)' == '':
        CollectPackageDownloadsContinueOnError = false
    if '$(DisableCheckingDuplicateNuGetItems)' != 'true':
      CheckForDuplicateNuGetItemsTask(
          ContinueOnError="$(CollectPackageDownloadsContinueOnError)",
          ItemName="PackageDownload",
          Items="@(PackageDownload)",
          LogCode="NU1505",
          MSBuildProjectFullPath="$(MSBuildProjectFullPath)",
          NoWarn="$(NoWarn)",
          TreatWarningsAsErrors="$(TreatWarningsAsErrors)",
          WarningsAsErrors="$(WarningsAsErrors)",
          WarningsNotAsErrors="$(WarningsNotAsErrors)")
        Output(ItemName="DeduplicatedPackageDownloads", TaskParameter="DeduplicatedItems")
    if '@(DeduplicatedPackageDownloads)' != '':
      ItemGroup
        PackageDownload -= "@(PackageDownload)"
        PackageDownload += "@(DeduplicatedPackageDownloads)"
  // ============================================================
  // CollectFrameworkReferences
  // ============================================================
  Target CollectFrameworkReferences(Returns="@(_FrameworkReferenceForRestore)")
    ItemGroup
      if '%(FrameworkReference.IsTransitiveFrameworkReference)' != 'true':
        _FrameworkReferenceForRestore += "@(FrameworkReference)"
  // ============================================================
  // CollectNuGetAuditSuppressions
  // Gathers all NuGetAuditSuppress items from the project.
  // This target may be used as an extension point to modify
  // advisory suppressions before NuGet reads them.
  // ============================================================
  Target CollectNuGetAuditSuppressions(Returns="@(NuGetAuditSuppress)")
    // NOTE for design-time builds we need to ensure that we continue on error.
    PropertyGroup
      CollectNuGetAuditSuppressionsContinueOnError = $(ContinueOnError)
      if '$(ContinueOnError)' == '':
        CollectNuGetAuditSuppressionsContinueOnError = false
    CheckForDuplicateNuGetItemsTask(
        ContinueOnError="$(CollectNuGetAuditSuppressionsContinueOnError)",
        ItemName="NuGetAuditSuppress",
        Items="@(NuGetAuditSuppress)",
        LogCode="NU1508",
        MSBuildProjectFullPath="$(MSBuildProjectFullPath)",
        NoWarn="$(NoWarn)",
        TreatWarningsAsErrors="$(TreatWarningsAsErrors)",
        WarningsAsErrors="$(WarningsAsErrors)",
        WarningsNotAsErrors="$(WarningsNotAsErrors)")
      Output(ItemName="DeduplicatedNuGetAuditSuppressions", TaskParameter="DeduplicatedItems")
    if '@(DeduplicatedNuGetAuditSuppressions)' != '':
      ItemGroup
        NuGetAuditSuppress -= "@(NuGetAuditSuppress)"
        NuGetAuditSuppress += "@(DeduplicatedNuGetAuditSuppressions)"
  Target CollectPrunePackageReferences(Returns="@(PrunePackageReference)")
    // NOTE for design-time builds we need to ensure that we continue on error.
    PropertyGroup
      CollectPrunePackageReferencesContinueOnError = $(ContinueOnError)
      if '$(ContinueOnError)' == '':
        CollectPrunePackageReferencesContinueOnError = false
    if '$(DisableCheckingDuplicateNuGetItems)' != 'true':
      CheckForDuplicateNuGetItemsTask(
          ContinueOnError="$(CollectPrunePackageReferencesContinueOnError)",
          ItemName="PrunePackageReference",
          Items="@(PrunePackageReference)",
          LogCode="NU1509",
          MSBuildProjectFullPath="$(MSBuildProjectFullPath)",
          NoWarn="$(NoWarn)",
          TreatWarningsAsErrors="$(TreatWarningsAsErrors)",
          WarningsAsErrors="$(WarningsAsErrors)",
          WarningsNotAsErrors="$(WarningsNotAsErrors)")
        Output(ItemName="DeduplicatedPrunePackageReference", TaskParameter="DeduplicatedItems")
    if '@(DeduplicatedPrunePackageReference)' != '':
      ItemGroup
        PrunePackageReference -= "@(PrunePackageReference)"
        PrunePackageReference += "@(DeduplicatedPrunePackageReference)"
  // ============================================================
  // _CollectRestoreInputs
  // Runs all the 'Collect' targets
  // ============================================================
  Target _CollectRestoreInputs(
      DependsOnTargets=[
        CollectPackageReferences
        CollectPackageDownloads
        CollectFrameworkReferences
        CollectCentralPackageVersions
        CollectNuGetAuditSuppressions
        CollectPrunePackageReferences
      ])
  // ============================================================
  // _LoadRestoreGraphEntryPoints
  // Find project entry points and load them into items.
  // ============================================================
  Target _LoadRestoreGraphEntryPoints(Returns="@(RestoreGraphProjectInputItems)")
    // Allow overriding items with RestoreGraphProjectInput
    if @(RestoreGraphProjectInputItems) == '':
      ItemGroup
        RestoreGraphProjectInputItems += "$(RestoreGraphProjectInput)"
    // Project case
    if $(MSBuildProjectFullPath.EndsWith('.metaproj')) != 'true' AND @(RestoreGraphProjectInputItems) == '':
      ItemGroup
        RestoreGraphProjectInputItems += "$(MSBuildProjectFullPath)"
    // Solution case
    if $(MSBuildProjectFullPath.EndsWith('.metaproj')) == 'true' AND @(RestoreGraphProjectInputItems) == '':
      GetRestoreSolutionProjectsTask(
          ProjectReferences="@(ProjectReference)",
          SolutionFilePath="$(MSBuildProjectFullPath)")
        Output(ItemName="RestoreGraphProjectInputItems", TaskParameter="OutputProjectReferences")
  // ============================================================
  // _FilterRestoreGraphProjectInputItems
  // Filter out unsupported project entry points.
  // ============================================================
  Target _FilterRestoreGraphProjectInputItems(
      DependsOnTargets="_LoadRestoreGraphEntryPoints",
      Returns="@(FilteredRestoreGraphProjectInputItems)")
    PropertyGroup
      if '$(RestoreProjectFilterMode)' == '':
        RestoreProjectFilterMode = exclusionlist
    // Filter to a list of known supported types
    if '$(RestoreProjectFilterMode)' == 'inclusionlist':
      ItemGroup
        if '%(RestoreGraphProjectInputItems.Extension)' == '.csproj' Or '%(RestoreGraphProjectInputItems.Extension)' == '.vbproj' Or '%(RestoreGraphProjectInputItems.Extension)' == '.fsproj' Or '%(RestoreGraphProjectInputItems.Extension)' == '.nuproj' Or '%(RestoreGraphProjectInputItems.Extension)' == '.proj' Or '%(RestoreGraphProjectInputItems.Extension)' == '.msbuildproj' Or '%(RestoreGraphProjectInputItems.Extension)' == '.vcxproj':
          _FilteredRestoreGraphProjectInputItemsTmp += "@(RestoreGraphProjectInputItems)"
    // Filter out disallowed types
    if '$(RestoreProjectFilterMode)' == 'exclusionlist':
      ItemGroup
        if '%(RestoreGraphProjectInputItems.Extension)' != '.metaproj' AND '%(RestoreGraphProjectInputItems.Extension)' != '.shproj' AND '%(RestoreGraphProjectInputItems.Extension)' != '.vcxitems' AND '%(RestoreGraphProjectInputItems.Extension)' != '.vdproj' AND '%(RestoreGraphProjectInputItems.Extension)' != '':
          _FilteredRestoreGraphProjectInputItemsTmp += "@(RestoreGraphProjectInputItems)"
    // No filtering
    if '$(RestoreProjectFilterMode)' != 'exclusionlist' AND '$(RestoreProjectFilterMode)' != 'inclusionlist':
      ItemGroup
        _FilteredRestoreGraphProjectInputItemsTmp += "@(RestoreGraphProjectInputItems)"
    // Remove duplicates
    RemoveDuplicates(Inputs="@(_FilteredRestoreGraphProjectInputItemsTmp)")
      Output(
          ItemName="FilteredRestoreGraphProjectInputItemsWithoutDuplicates",
          TaskParameter="Filtered")
    // Remove projects that do not support restore.
    // With SkipNonexistentTargets support
    if '$(RestoreUseSkipNonexistentTargets)' == 'true':
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="@(FilteredRestoreGraphProjectInputItemsWithoutDuplicates)",
          Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
          SkipNonexistentTargets="true",
          Targets="_IsProjectRestoreSupported")
        Output(ItemName="FilteredRestoreGraphProjectInputItems", TaskParameter="TargetOutputs")
    // Without SkipNonexistentTargets support
    if '$(RestoreUseSkipNonexistentTargets)' != 'true':
      MSBuild(
          ContinueOnError="$(RestoreContinueOnError)",
          Projects="@(FilteredRestoreGraphProjectInputItemsWithoutDuplicates)",
          Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
          Targets="_IsProjectRestoreSupported")
        Output(ItemName="FilteredRestoreGraphProjectInputItems", TaskParameter="TargetOutputs")
    // Warn for projects that do not support restore.
    if '$(DisableWarnForInvalidRestoreProjects)' != 'true' AND '$(HideWarningsAndErrors)' != 'true':
      WarnForInvalidProjectsTask(
          AllProjects="@(FilteredRestoreGraphProjectInputItemsWithoutDuplicates)",
          ValidProjects="@(FilteredRestoreGraphProjectInputItems)")
  // ============================================================
  // _RefreshNuGetStaticState
  // Refreshes NuGet's environment-derived static caches before any other restore task runs. Relevant in
  // multithreaded MSBuild. It must run on every restore and never be skipped, so it declares no Inputs/Outputs.
  // ============================================================
  Target _RefreshNuGetStaticState
    RefreshNuGetStaticStateTask
  // ============================================================
  // _GenerateRestoreGraph
  // Entry point for creating the project to project restore graph.
  // ============================================================
  Target _GenerateRestoreGraph(
      DependsOnTargets=[
        _RefreshNuGetStaticState
        _FilterRestoreGraphProjectInputItems
        _GetAllRestoreProjectPathItems
      ],
      Returns="@(_RestoreGraphEntry)")
    Message(Importance="low", Text="Generating dg file")
    Message(Importance="low", Text="%(_RestoreProjectPathItems.Identity)")
    // Use all projects if RestoreRecursive is true. Otherwise use only the top level projects.
    ItemGroup
      if '$(RestoreRecursive)' != 'true':
        _GenerateRestoreGraphProjectEntryInput += "@(FilteredRestoreGraphProjectInputItems)"
      if '$(RestoreRecursive)' == 'true':
        _GenerateRestoreGraphProjectEntryInput += "@(_RestoreProjectPathItems)"
    // Add top level entries to the direct restore list. These projects will also restore tools.
    MSBuild(
        BuildInParallel="$(RestoreBuildInParallel)",
        Projects="@(_GenerateRestoreGraphProjectEntryInput)",
        Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
        Targets="_GenerateRestoreGraphProjectEntry")
      Output(ItemName="_RestoreGraphEntry", TaskParameter="TargetOutputs")
    // Generate a spec for every project including dependencies.
    MSBuild(
        BuildInParallel="$(RestoreBuildInParallel)",
        Projects="@(_RestoreProjectPathItems)",
        Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
        Targets="_GenerateProjectRestoreGraph")
      Output(ItemName="_RestoreGraphEntry", TaskParameter="TargetOutputs")
  // ============================================================
  // _GenerateRestoreGraphProjectEntry
  // Top level entry point within a project.
  // ============================================================
  Target _GenerateRestoreGraphProjectEntry(
      DependsOnTargets=[
        _GenerateRestoreSpecs
        _GenerateDotnetCliToolReferenceSpecs
      ],
      Returns="@(_RestoreGraphEntry)")
    // Returns restore graph entries for the project and all dependencies
  // ============================================================
  // _GenerateRestoreSpecs
  // Mark entry points for restore.
  // ============================================================
  Target _GenerateRestoreSpecs(
      DependsOnTargets="_GetRestoreProjectStyle",
      Returns="@(_RestoreGraphEntry)")
    Message(Importance="low", Text="Restore entry point $(MSBuildProjectFullPath)")
    // Mark entry point
    if '$(RestoreProjects)' == '' OR '$(RestoreProjects)' == 'true':
      ItemGroup
        if '$(RestoreProjectStyle)' != 'Unknown':
          _RestoreGraphEntry += "$([System.Guid]::NewGuid())"
            Type = RestoreSpec
            ProjectUniqueName = $(MSBuildProjectFullPath)
  // ============================================================
  // _GenerateDotnetCliToolReferenceSpecs
  // Collect DotnetCliToolReferences
  // ============================================================
  Target _GenerateDotnetCliToolReferenceSpecs(
      DependsOnTargets="_GetRestoreSettings",
      Returns="@(_RestoreGraphEntry)")
    PropertyGroup
      if '$(DotnetCliToolTargetFramework)' == '':
        DotnetCliToolTargetFramework = netcoreapp1.0
    // Write out tool references
    if '$(RestoreDotnetCliToolReferences)' == '' OR '$(RestoreDotnetCliToolReferences)' == 'true':
      GetRestoreDotnetCliToolsTask(
          DotnetCliToolReferences="@(DotnetCliToolReference)",
          ProjectPath="$(MSBuildProjectFullPath)",
          RestoreConfigFilePaths="$(_OutputConfigFilePaths)",
          RestoreFallbackFolders="$(_OutputFallbackFolders)",
          RestorePackagesPath="$(_OutputPackagesPath)",
          RestoreSources="$(_OutputSources)",
          ToolFramework="$(DotnetCliToolTargetFramework)")
        Output(ItemName="_RestoreGraphEntry", TaskParameter="RestoreGraphItems")
  // ============================================================
  // _GetRestoreProjectStyle
  // Determine the project restore type.
  // ============================================================
  Target _GetRestoreProjectStyle(
      DependsOnTargets="CollectPackageReferences",
      Returns="$(RestoreProjectStyle);$(PackageReferenceCompatibleProjectStyle)")
    // Older versions of MSBuild do not support the Count() item function which is an optimization.  Expanding the
    // entire item list into a semicolon delimited string is slower but older versions of MSBuild don't support it so
    // use the older logic if necessary
    if '$(MSBuildAssemblyVersion)' < '15.0':
      PropertyGroup
        if '@(PackageReference)' != '':
          _HasPackageReferenceItems = true
    if '$(MSBuildAssemblyVersion)' >= '15.0':
      PropertyGroup
        if @(PackageReference->Count()) > 0:
          _HasPackageReferenceItems = true
    GetRestoreProjectStyleTask(
        HasPackageReferenceItems="$(_HasPackageReferenceItems)",
        MSBuildProjectDirectory="$(MSBuildProjectDirectory)",
        MSBuildProjectName="$(MSBuildProjectName)",
        RestoreProjectStyle="$(RestoreProjectStyle)")
      Output(PropertyName="RestoreProjectStyle", TaskParameter="ProjectStyle")
      Output(
          PropertyName="PackageReferenceCompatibleProjectStyle",
          TaskParameter="IsPackageReferenceCompatibleProjectStyle")
    PropertyGroup
      _HasPackageReferenceItems
  // ============================================================
  // EnableIntermediateOutputPathMismatchWarning
  // If using PackageReference, enable an MSBuild warning if BaseIntermediateOutputPath is set to something different
  // than MSBuildProjectExtensionsPath, because it may be unexpected that the assets and related files wouldn't be written
  // to the BaseIntermediateOutputPath.
  // ============================================================
  if '$(RestoreProjectStyle)' == 'PackageReference':
    Target EnableIntermediateOutputPathMismatchWarning(
        BeforeTargets="_CheckForInvalidConfigurationAndPlatform",
        DependsOnTargets="_GetRestoreProjectStyle")
      if '$(EnableBaseIntermediateOutputPathMismatchWarning)' == '':
        PropertyGroup
          EnableBaseIntermediateOutputPathMismatchWarning = true
  // ============================================================
  // _GetRestoreTargetFrameworksOutput
  // Read target frameworks from the project.
  // Non-NETCore project frameworks will be returned.
  // ============================================================
  Target _GetRestoreTargetFrameworksOutput(
      DependsOnTargets=[
        _GetRestoreProjectStyle
        _GetRestoreTargetFrameworkOverride
      ],
      Returns="@(_RestoreTargetFrameworksOutputFiltered)")
    PropertyGroup
      _RestoreProjectFramework
      if '$(_TargetFrameworkOverride)' == '':
        _TargetFrameworkToBeUsed = $(TargetFrameworks)
    if '$(RestoreProjectStyle)' != 'ProjectJson':
      GetProjectTargetFrameworksTask(
          ProjectPath="$(MSBuildProjectFullPath)",
          TargetFramework="$(TargetFramework)",
          TargetFrameworkMoniker="$(TargetFrameworkMoniker)",
          TargetFrameworks="$(_TargetFrameworkToBeUsed)",
          TargetPlatformIdentifier="$(TargetPlatformIdentifier)",
          TargetPlatformMinVersion="$(TargetPlatformMinVersion)",
          TargetPlatformVersion="$(TargetPlatformVersion)")
        Output(PropertyName="_RestoreProjectFramework", TaskParameter="ProjectTargetFrameworks")
    if '$(_RestoreProjectFramework)' != '':
      ItemGroup
        _RestoreTargetFrameworksOutputFiltered += "$(_RestoreProjectFramework.Split(';'))"
  // ============================================================
  // _GetRestoreTargetFrameworksAsItems
  // Read $(TargetFrameworks) from the project as items.
  // Projects that do not have $(TargetFrameworks) will noop.
  // If $(TargetFramework) is specified globally, it'll be preferred over $(TargetFrameworks)
  // ============================================================
  Target _GetRestoreTargetFrameworksAsItems(
      DependsOnTargets=[
        _GetRestoreProjectStyle
        _GetRestoreTargetFrameworkOverride
      ],
      Returns="@(_RestoreTargetFrameworkItems)")
    if '$(TargetFrameworks)' != '' AND '$(_TargetFrameworkOverride)' == '':
      ItemGroup
        _RestoreTargetFrameworkItems += "$(TargetFrameworks.Split(';'))"
    if '$(TargetFrameworks)' != '' AND '$(_TargetFrameworkOverride)' != '':
      ItemGroup
        _RestoreTargetFrameworkItems += "$(_TargetFrameworkOverride)"
  // ============================================================
  // _GetRestoreSettings
  // ============================================================
  if '$(RestoreProjectStyle)' == 'PackageReference' OR '$(RestoreProjectStyle)' == 'ProjectJson' OR '$(RestoreProjectStyle)' == 'DotnetToolReference' OR '$(RestoreProjectStyle)' == 'PackagesConfig':
    Target _GetRestoreSettings(
        DependsOnTargets=[
          _GetRestoreSettingsOverrides
          _GetRestoreSettingsCurrentProject
          _GetRestoreSettingsAllFrameworks
        ],
        Returns="$(_OutputSources);$(_OutputPackagesPath);$(_OutputRepositoryPath);$(_OutputFallbackFolders);$(_OutputConfigFilePaths)")
      if '$(RestoreSolutionDirectory)' == '' AND '$(RestoreProjectStyle)' == 'PackagesConfig' AND '$(SolutionDir)' != '*Undefined*':
        PropertyGroup
          RestoreSolutionDirectory = $(SolutionDir)
      // For transitive project styles, we rely on evaluating all the settings and including them in the dg spec to faciliate no-op restore
      GetRestoreSettingsTask(
          MSBuildStartupDirectory="$(MSBuildStartupDirectory)",
          ProjectUniqueName="$(MSBuildProjectFullPath)",
          RestoreConfigFile="$(RestoreConfigFile)",
          RestoreFallbackFolders="$(RestoreFallbackFolders)",
          RestoreFallbackFoldersOverride="$(_RestoreFallbackFoldersOverride)",
          RestorePackagesPath="$(RestorePackagesPath)",
          RestorePackagesPathOverride="$(_RestorePackagesPathOverride)",
          RestoreProjectStyle="$(RestoreProjectStyle)",
          RestoreRepositoryPath="$(RestoreRepositoryPath)",
          RestoreRepositoryPathOverride="$(_RestoreRepositoryPathOverride)",
          RestoreRootConfigDirectory="$(RestoreRootConfigDirectory)",
          RestoreSettingsPerFramework="@(_RestoreSettingsPerFramework)",
          RestoreSolutionDirectory="$(RestoreSolutionDirectory)",
          RestoreSources="$(RestoreSources)",
          RestoreSourcesOverride="$(_RestoreSourcesOverride)")
        Output(PropertyName="_OutputSources", TaskParameter="OutputSources")
        Output(PropertyName="_OutputPackagesPath", TaskParameter="OutputPackagesPath")
        Output(PropertyName="_OutputRepositoryPath", TaskParameter="OutputRepositoryPath")
        Output(PropertyName="_OutputFallbackFolders", TaskParameter="OutputFallbackFolders")
        Output(PropertyName="_OutputConfigFilePaths", TaskParameter="OutputConfigFilePaths")
  // ============================================================
  // _GetRestoreSettingsCurrentProject
  // Generate items for a single framework.
  // ============================================================
  if '$(TargetFrameworks)' == '' AND '$(PackageReferenceCompatibleProjectStyle)' == 'true':
    Target _GetRestoreSettingsCurrentProject(
        DependsOnTargets="_GetRestoreSettingsPerFramework",
        Returns="@(_RestoreSettingsPerFramework)")
  // ============================================================
  // _GetRestoreSettingsAllFrameworks
  // Generate items for all frameworks.
  // ============================================================
  if '$(TargetFrameworks)' != '' AND '$(PackageReferenceCompatibleProjectStyle)' == 'true':
    Target _GetRestoreSettingsAllFrameworks(
        DependsOnTargets=[
          _GetRestoreTargetFrameworksAsItems
          _GetRestoreProjectStyle
        ],
        Returns="@(_RestoreSettingsPerFramework)")
      // Read additional sources and fallback folders for each framework
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="$(MSBuildProjectFullPath)",
          Properties="TargetFramework=%(_RestoreTargetFrameworkItems.Identity);
                  $(_GenerateRestoreGraphProjectEntryInputProperties)",
          Targets="_GetRestoreSettingsPerFramework")
        Output(ItemName="_RestoreSettingsPerFramework", TaskParameter="TargetOutputs")
  // ============================================================
  // _GetRestoreSettingsPerFramework
  // Generate items with framework specific settings.
  // ============================================================
  Target _GetRestoreSettingsPerFramework(Returns="@(_RestoreSettingsPerFramework)")
    ItemGroup
      _RestoreSettingsPerFramework += "$([System.Guid]::NewGuid())"
        copy properties:
          RestoreAdditionalProjectSources
          RestoreAdditionalProjectFallbackFolders
          RestoreAdditionalProjectFallbackFoldersExcludes
  // ============================================================
  // _GenerateRestoreProjectSpec
  // Generate a restore project spec for the current project.
  // ============================================================
  Target _GenerateRestoreProjectSpec(
      DependsOnTargets=[
        _GetRestoreProjectStyle
        _GetRestoreTargetFrameworksOutput
        _GetRestoreSettings
      ],
      Returns="@(_RestoreGraphEntry)")
    // Determine the restore output path
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true' OR '$(RestoreProjectStyle)' == 'ProjectJson':
      PropertyGroup
        if '$(RestoreOutputPath)' == '':
          RestoreOutputPath = $(MSBuildProjectExtensionsPath)
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true' OR '$(RestoreProjectStyle)' == 'ProjectJson':
      ConvertToAbsolutePath(Paths="$(RestoreOutputPath)")
        Output(PropertyName="RestoreOutputAbsolutePath", TaskParameter="AbsolutePaths")
    // Determine project name for the assets file.
    // Highest priority: PackageId
    // If PackageId does not exist use: AssemblyName
    // If AssemblyName does not exist fallback to the project file name without the extension: $(MSBuildProjectName)
    //
    // For non-PackageReference projects use only: $(MSBuildProjectName)
    PropertyGroup
      _RestoreProjectName = $(MSBuildProjectName)
      if '$(PackageReferenceCompatibleProjectStyle)' == 'true' AND '$(AssemblyName)' != '':
        _RestoreProjectName = $(AssemblyName)
      if '$(PackageReferenceCompatibleProjectStyle)' == 'true' AND '$(PackageId)' != '':
        _RestoreProjectName = $(PackageId)
    // Determine project version for .NETCore projects
    // Default to 1.0.0
    // Use Version if it exists
    // Override with PackageVersion if it exists (same as pack)
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true':
      PropertyGroup
        _RestoreProjectVersion = 1.0.0
        if '$(Version)' != '':
          _RestoreProjectVersion = $(Version)
        if '$(PackageVersion)' != '':
          _RestoreProjectVersion = $(PackageVersion)
    // Determine if this will use cross targeting
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true' AND '$(TargetFrameworks)' != '':
      PropertyGroup
        _RestoreCrossTargeting = true
    // Determine if ContentFiles should be written by NuGet
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true' AND '$(_RestoreSkipContentFileWrite)' == '':
      PropertyGroup
        if '$(TargetFrameworks)' == '' AND '$(TargetFramework)' == '':
          _RestoreSkipContentFileWrite = true
    // Write properties for the top level entry point
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true':
      ItemGroup
        _RestoreGraphEntry += "$([System.Guid]::NewGuid())"
          Type = ProjectSpec
          Version = $(_RestoreProjectVersion)
          ProjectUniqueName = $(MSBuildProjectFullPath)
          ProjectPath = $(MSBuildProjectFullPath)
          ProjectName = $(_RestoreProjectName)
          Sources = $(_OutputSources)
          FallbackFolders = $(_OutputFallbackFolders)
          PackagesPath = $(_OutputPackagesPath)
          ProjectStyle = $(RestoreProjectStyle)
          OutputPath = $(RestoreOutputAbsolutePath)
          RuntimeIdentifiers = $(RuntimeIdentifiers);$(RuntimeIdentifier)
          RuntimeSupports = $(RuntimeSupports)
          CrossTargeting = $(_RestoreCrossTargeting)
          RestoreLegacyPackagesDirectory = $(RestoreLegacyPackagesDirectory)
          ValidateRuntimeAssets = $(ValidateRuntimeIdentifierCompatibility)
          SkipContentFileWrite = $(_RestoreSkipContentFileWrite)
          ConfigFilePaths = $(_OutputConfigFilePaths)
          copy properties:
            TreatWarningsAsErrors
            WarningsAsErrors
            WarningsNotAsErrors
            NoWarn
            RestorePackagesWithLockFile
            NuGetLockFilePath
            RestoreLockedMode
            _CentralPackageVersionsEnabled
            CentralPackageFloatingVersionsEnabled
            CentralPackageVersionOverrideEnabled
            CentralPackageTransitivePinningEnabled
            NuGetAudit
            NuGetAuditLevel
            NuGetAuditMode
            SdkAnalysisLevel
            UsingMicrosoftNETSdk
            NETCoreSdkVersion
            RestoreUseLegacyDependencyResolver
            RestoreDoNotWriteDependencyGraphSpec
            RestoreEnableAnalyzerAssets
    // Use packages.config
    if '$(RestoreProjectStyle)' == 'PackagesConfig':
      ItemGroup
        _RestoreGraphEntry += "$([System.Guid]::NewGuid())"
          Type = ProjectSpec
          ProjectUniqueName = $(MSBuildProjectFullPath)
          ProjectPath = $(MSBuildProjectFullPath)
          ProjectName = $(_RestoreProjectName)
          ProjectStyle = $(RestoreProjectStyle)
          if Exists('$(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config'):
            PackagesConfigPath = $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config
          if Exists('$(MSBuildProjectDirectory)\packages.config'):
            PackagesConfigPath = $(MSBuildProjectDirectory)\packages.config
          copy properties:
            RestorePackagesWithLockFile
            NuGetLockFilePath
            RestoreLockedMode
          Sources = $(_OutputSources)
          SolutionDir = $(SolutionDir)
          RepositoryPath = $(_OutputRepositoryPath)
          ConfigFilePaths = $(_OutputConfigFilePaths)
          PackagesPath = $(_OutputPackagesPath)
          TargetFrameworks = @(_RestoreTargetFrameworksOutputFiltered)
          copy properties:
            NuGetAudit
            NuGetAuditLevel
    // Non-NuGet type
    if '$(RestoreProjectStyle)' == 'Unknown':
      ItemGroup
        _RestoreGraphEntry += "$([System.Guid]::NewGuid())"
          Type = ProjectSpec
          ProjectUniqueName = $(MSBuildProjectFullPath)
          ProjectPath = $(MSBuildProjectFullPath)
          ProjectName = $(_RestoreProjectName)
          ProjectStyle = $(RestoreProjectStyle)
          TargetFrameworks = @(_RestoreTargetFrameworksOutputFiltered)
  // ============================================================
  // _GenerateProjectRestoreGraph
  // Recursively walk project to project references.
  // ============================================================
  Target _GenerateProjectRestoreGraph(
      DependsOnTargets=[
        _GetRestoreProjectStyle
        _GenerateRestoreProjectSpec
        _GenerateRestoreDependencies
      ],
      Returns="@(_RestoreGraphEntry)")
    // Output from dependency targets
  // ============================================================
  // _GenerateRestoreDependencies
  // Generate items for package and project references.
  // ============================================================
  Target _GenerateRestoreDependencies(
      DependsOnTargets=[
        _GenerateProjectRestoreGraphAllFrameworks
        _GenerateProjectRestoreGraphCurrentProject
      ],
      Returns="@(_RestoreGraphEntry)")
  // ============================================================
  // _GenerateProjectRestoreGraphAllFrameworks
  // Walk dependencies for all frameworks.
  // ============================================================
  if '$(TargetFrameworks)' != '':
    Target _GenerateProjectRestoreGraphAllFrameworks(
        DependsOnTargets="_GetRestoreTargetFrameworksAsItems",
        Returns="@(_RestoreGraphEntry)")
      // Get project and package references
      // Evaluate for each framework
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="$(MSBuildProjectFullPath)",
          Properties="TargetFramework=%(_RestoreTargetFrameworkItems.Identity);
                  $(_GenerateRestoreGraphProjectEntryInputProperties)",
          Targets="_GenerateProjectRestoreGraphPerFramework")
        Output(ItemName="_RestoreGraphEntry", TaskParameter="TargetOutputs")
  // ============================================================
  // _GenerateProjectRestoreGraphCurrentProject
  // Walk dependencies with the current framework.
  // ============================================================
  if '$(TargetFrameworks)' == '':
    Target _GenerateProjectRestoreGraphCurrentProject(
        DependsOnTargets="_GenerateProjectRestoreGraphPerFramework",
        Returns="@(_RestoreGraphEntry)")
  // ============================================================
  // _GenerateProjectRestoreGraphPerFramework
  // Walk dependencies using $(TargetFramework)
  // ============================================================
  Target _GenerateProjectRestoreGraphPerFramework(
      DependsOnTargets=[
        _GetRestoreProjectStyle
        _CollectRestoreInputs
      ],
      Returns="@(_RestoreGraphEntry)")
    // Write out project references
    GetRestoreProjectReferencesTask(
        ParentProjectPath="$(MSBuildProjectFullPath)",
        ProjectReferences="@(ProjectReference)",
        ProjectUniqueName="$(MSBuildProjectFullPath)",
        TargetFrameworks="$(TargetFramework)")
      Output(ItemName="_RestoreGraphEntry", TaskParameter="RestoreGraphItems")
    // Write out package references
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true':
      GetRestorePackageReferencesTask(
          PackageReferences="@(PackageReference)",
          ProjectUniqueName="$(MSBuildProjectFullPath)",
          TargetFrameworks="$(TargetFramework)")
        Output(ItemName="_RestoreGraphEntry", TaskParameter="RestoreGraphItems")
    // Write out central package versions
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true' AND '$(_CentralPackageVersionsEnabled)' == 'true':
      GetCentralPackageVersionsTask(
          CentralPackageVersions="@(PackageVersion)",
          ProjectUniqueName="$(MSBuildProjectFullPath)",
          TargetFrameworks="$(TargetFramework)")
        Output(ItemName="_RestoreGraphEntry", TaskParameter="RestoreGraphItems")
    // Write out package downloads
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true':
      GetRestorePackageDownloadsTask(
          PackageDownloads="@(PackageDownload)",
          ProjectUniqueName="$(MSBuildProjectFullPath)",
          TargetFrameworks="$(TargetFramework)")
        Output(ItemName="_RestoreGraphEntry", TaskParameter="RestoreGraphItems")
    // Write out Framework References
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true':
      GetRestoreFrameworkReferencesTask(
          FrameworkReferences="@(FrameworkReference)",
          ProjectUniqueName="$(MSBuildProjectFullPath)",
          TargetFrameworks="$(TargetFramework)")
        Output(ItemName="_RestoreGraphEntry", TaskParameter="RestoreGraphItems")
    // Write out advisory suppressions
    GetRestoreNuGetAuditSuppressionsTask(
        NuGetAuditSuppressions="@(NuGetAuditSuppress)",
        ProjectUniqueName="$(MSBuildProjectFullPath)",
        TargetFrameworks="$(TargetFramework)")
      Output(ItemName="_RestoreGraphEntry", TaskParameter="RestoreGraphItems")
    // Write out pruned package references
    GetRestorePrunePackageReferencesTask(
        ProjectUniqueName="$(MSBuildProjectFullPath)",
        PrunePackageReferences="@(PrunePackageReference)",
        TargetFrameworks="$(TargetFramework)")
      Output(ItemName="_RestoreGraphEntry", TaskParameter="RestoreGraphItems")
    // Write out target framework information
    if '$(PackageReferenceCompatibleProjectStyle)' == 'true':
      ItemGroup
        _RestoreGraphEntry += "$([System.Guid]::NewGuid())"
          Type = TargetFrameworkInformation
          ProjectUniqueName = $(MSBuildProjectFullPath)
          copy properties:
            PackageTargetFallback
            AssetTargetFallback
            TargetFramework
            TargetFrameworkIdentifier
            TargetFrameworkVersion
            TargetFrameworkMoniker
            TargetFrameworkProfile
            TargetPlatformMoniker
            TargetPlatformIdentifier
            TargetPlatformVersion
            TargetPlatformMinVersion
            CLRSupport
            RuntimeIdentifierGraphPath
            WindowsTargetPlatformMinVersion
            RestoreEnablePackagePruning
            RestorePackagePruningDefault
            NuGetAuditMode
            RestoreEnableAnalyzerAssets
  // ============================================================
  // _GenerateRestoreProjectPathItemsCurrentProject
  // Get absolute paths for all project references.
  // ============================================================
  if '$(TargetFrameworks)' == '':
    Target _GenerateRestoreProjectPathItemsCurrentProject(
        DependsOnTargets="_GenerateRestoreProjectPathItemsPerFramework",
        Returns="@(_RestoreProjectPathItems)")
  // ============================================================
  // _GenerateRestoreProjectPathItemsPerFramework
  // Get absolute paths for all project references.
  // ============================================================
  Target _GenerateRestoreProjectPathItemsPerFramework(Returns="@(_RestoreProjectPathItems)")
    // Get the absolute paths to all projects
    ConvertToAbsolutePath(Paths="@(ProjectReference)")
      Output(PropertyName="_RestoreGraphAbsoluteProjectPaths", TaskParameter="AbsolutePaths")
    ItemGroup
      _RestoreProjectPathItems += "$(_RestoreGraphAbsoluteProjectPaths)"
  // ============================================================
  // _GenerateRestoreProjectPathItems
  // Get all project references regardless of framework
  // ============================================================
  Target _GenerateRestoreProjectPathItems(
      DependsOnTargets=[
        _GenerateRestoreProjectPathItemsAllFrameworks
        _GenerateRestoreProjectPathItemsCurrentProject
      ],
      Returns="@(_CurrentRestoreProjectPathItems)")
    // Drop any duplicate items
    RemoveDuplicates(Inputs="@(_RestoreProjectPathItems)")
      Output(ItemName="_CurrentRestoreProjectPathItems", TaskParameter="Filtered")
  // ============================================================
  // _GenerateRestoreProjectPathItemsAllFrameworks
  // Get all project references regardless of framework
  // ============================================================
  if '$(TargetFrameworks)' != '':
    Target _GenerateRestoreProjectPathItemsAllFrameworks(
        DependsOnTargets="_GetRestoreTargetFrameworksAsItems",
        Returns="@(_RestoreProjectPathItems)")
      // Get all project references for the current project
      // With SkipNonexistentTargets support
      if '$(RestoreUseSkipNonexistentTargets)' == 'true':
        MSBuild(
            BuildInParallel="$(RestoreBuildInParallel)",
            Projects="$(MSBuildProjectFullPath)",
            Properties="TargetFramework=%(_RestoreTargetFrameworkItems.Identity);
                  $(_GenerateRestoreGraphProjectEntryInputProperties)",
            SkipNonexistentProjects="true",
            SkipNonexistentTargets="true",
            Targets="_GenerateRestoreProjectPathItemsPerFramework")
          Output(ItemName="_RestoreProjectPathItems", TaskParameter="TargetOutputs")
      // Without SkipNonexistentTargets support
      if '$(RestoreUseSkipNonexistentTargets)' != 'true':
        MSBuild(
            ContinueOnError="$(RestoreContinueOnError)",
            Projects="$(MSBuildProjectFullPath)",
            Properties="TargetFramework=%(_RestoreTargetFrameworkItems.Identity);
                  $(_GenerateRestoreGraphProjectEntryInputProperties)",
            Targets="_GenerateRestoreProjectPathItemsPerFramework")
          Output(ItemName="_RestoreProjectPathItems", TaskParameter="TargetOutputs")
  // ============================================================
  // _GenerateRestoreProjectPathWalk
  // Recursively walk projects
  // ============================================================
  Target _GenerateRestoreProjectPathWalk(
      DependsOnTargets="_GenerateRestoreProjectPathItems",
      Returns="@(_RestoreProjectPathItems)")
    // Walk project references
    // With SkipNonexistentTargets
    if '$(RestoreUseSkipNonexistentTargets)' == 'true':
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="@(_CurrentRestoreProjectPathItems)",
          Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
          SkipNonexistentProjects="true",
          SkipNonexistentTargets="true",
          Targets="_GenerateRestoreProjectPathWalk")
        Output(ItemName="_GenerateRestoreProjectPathWalkOutputs", TaskParameter="TargetOutputs")
    // Without SkipNonexistentTargets
    if '$(RestoreUseSkipNonexistentTargets)' != 'true':
      MSBuild(
          ContinueOnError="$(RestoreContinueOnError)",
          Projects="@(_CurrentRestoreProjectPathItems)",
          Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
          Targets="_GenerateRestoreProjectPathWalk")
        Output(ItemName="_GenerateRestoreProjectPathWalkOutputs", TaskParameter="TargetOutputs")
    // Include the current project in the result
    ItemGroup
      _GenerateRestoreProjectPathWalkOutputs += "$(MSBuildProjectFullPath)"
    // Remove duplicates
    RemoveDuplicates(Inputs="@(_GenerateRestoreProjectPathWalkOutputs)")
      Output(ItemName="_RestoreProjectPathItems", TaskParameter="Filtered")
  // ============================================================
  // _GetAllRestoreProjectPathItems
  // Get the full list of known projects.
  // This includes all child projects from all target frameworks.
  // ============================================================
  Target _GetAllRestoreProjectPathItems(
      DependsOnTargets="_FilterRestoreGraphProjectInputItems",
      Returns="@(_RestoreProjectPathItems)")
    NuGetMessageTask(Importance="High", Name="DeterminingProjectsToRestore")
    // Walk projects
    // With SkipNonexistentTargets
    if '$(RestoreUseSkipNonexistentTargets)' == 'true':
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="@(FilteredRestoreGraphProjectInputItems)",
          Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
          SkipNonexistentProjects="true",
          SkipNonexistentTargets="true",
          Targets="_GenerateRestoreProjectPathWalk")
        Output(ItemName="_RestoreProjectPathItemsOutputs", TaskParameter="TargetOutputs")
    // Without SkipNonexistentTargets
    if '$(RestoreUseSkipNonexistentTargets)' != 'true':
      MSBuild(
          ContinueOnError="$(RestoreContinueOnError)",
          Projects="@(FilteredRestoreGraphProjectInputItems)",
          Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
          Targets="_GenerateRestoreProjectPathWalk")
        Output(ItemName="_RestoreProjectPathItemsOutputs", TaskParameter="TargetOutputs")
    // Remove duplicates
    RemoveDuplicates(Inputs="@(_RestoreProjectPathItemsOutputs)")
      Output(ItemName="_RestoreProjectPathItemsWithoutDupes", TaskParameter="Filtered")
    // Remove projects that do not support restore.
    // With SkipNonexistentTargets
    if '$(RestoreUseSkipNonexistentTargets)' == 'true':
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="@(_RestoreProjectPathItemsWithoutDupes)",
          Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
          SkipNonexistentProjects="true",
          SkipNonexistentTargets="true",
          Targets="_IsProjectRestoreSupported")
        Output(ItemName="_RestoreProjectPathItems", TaskParameter="TargetOutputs")
    // Without SkipNonexistentTargets
    if '$(RestoreUseSkipNonexistentTargets)' != 'true':
      MSBuild(
          ContinueOnError="$(RestoreContinueOnError)",
          Projects="@(_RestoreProjectPathItemsWithoutDupes)",
          Properties="$(_GenerateRestoreGraphProjectEntryInputProperties)",
          Targets="_IsProjectRestoreSupported")
        Output(ItemName="_RestoreProjectPathItems", TaskParameter="TargetOutputs")
  // ============================================================
  // _GetRestoreSettingsOverrides
  // Get global property overrides that should be resolved
  // against the current working directory instead of the project.
  // This is done by calling into NuGet.targets in a new scope,
  // project properties will not be returned by the calls below.
  // ============================================================
  Target _GetRestoreSettingsOverrides(
      Returns="$(_RestorePackagesPathOverride);$(_RestoreRepositoryPathOverride);$(_RestoreSourcesOverride);$(_RestoreFallbackFoldersOverride)")
    // RestorePackagesPathOverride
    if '$(RestorePackagesPath)' != '':
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="$(MSBuildThisFileFullPath)",
          Targets="_GetRestorePackagesPathOverride")
        Output(PropertyName="_RestorePackagesPathOverride", TaskParameter="TargetOutputs")
    // RestoreRepositoryPathOverride
    if '$(RestoreRepositoryPathOverride)' != '':
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="$(MSBuildThisFileFullPath)",
          Targets="_GetRestoreRepositoryPathOverride")
        Output(PropertyName="_RestoreRepositoryPathOverride", TaskParameter="TargetOutputs")
    // RestoreSourcesOverride
    if '$(RestoreSources)' != '':
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="$(MSBuildThisFileFullPath)",
          Targets="_GetRestoreSourcesOverride")
        Output(PropertyName="_RestoreSourcesOverride", TaskParameter="TargetOutputs")
    // RestoreFallbackFoldersOverride
    if '$(RestoreFallbackFolders)' != '':
      MSBuild(
          BuildInParallel="$(RestoreBuildInParallel)",
          Projects="$(MSBuildThisFileFullPath)",
          Targets="_GetRestoreFallbackFoldersOverride")
        Output(PropertyName="_RestoreFallbackFoldersOverride", TaskParameter="TargetOutputs")
  // ============================================================
  // _GetRestorePackagesPathOverride
  // ============================================================
  Target _GetRestorePackagesPathOverride(Returns="$(_RestorePackagesPathOverride)")
    PropertyGroup
      _RestorePackagesPathOverride = $(RestorePackagesPath)
  // ============================================================
  // _GetRestoreRepositoryPathOverride
  // ============================================================
  Target _GetRestoreRepositoryPathOverride(Returns="$(_RestoreRepositoryPathOverride)")
    PropertyGroup
      _RestorePackagesPathOverride = $(RestoreRepositoryPath)
  // ============================================================
  // _GetRestoreSourcesOverride
  // ============================================================
  Target _GetRestoreSourcesOverride(Returns="$(_RestoreSourcesOverride)")
    PropertyGroup
      _RestoreSourcesOverride = $(RestoreSources)
  // ============================================================
  // _GetRestoreFallbackFoldersOverride
  // ============================================================
  Target _GetRestoreFallbackFoldersOverride(Returns="$(_RestoreFallbackFoldersOverride)")
    PropertyGroup
      _RestoreFallbackFoldersOverride = $(RestoreFallbackFolders)
  // ============================================================
  // _GetRestoreTargetFrameworkOverride
  // ============================================================
  if '$(_DisableNuGetRestoreTargetFrameworksOverride)' != 'true':
    Target _GetRestoreTargetFrameworkOverride(Returns="$(_TargetFrameworkOverride)")
      if '$(TargetFrameworks)' != '':
        GetGlobalPropertyValueTask(PropertyName="TargetFramework")
          Output(PropertyName="_TargetFrameworkOverride", TaskParameter="GlobalPropertyValue")
      // Only set the override if TargetFrameworks has not been overriden as well. In that case, prefer it.
  // ============================================================
  // _GetTargetFrameworkOverrides
  // ============================================================
  Target _GetTargetFrameworkOverrides(Returns="$(_TargetFrameworkOverride)")
    PropertyGroup
      if '$(TargetFrameworks)' == '':
        _TargetFrameworkOverride = $(TargetFramework)
  // ============================================================
  // _IsProjectRestoreSupported
  // Verify restore targets exist in the project.
  // ============================================================
  Target _IsProjectRestoreSupported(Returns="@(_ValidProjectsForRestore)")
    ItemGroup
      _ValidProjectsForRestore += "$(MSBuildProjectFullPath)"
  // ============================================================
  // Import NuGet.RestoreEx.targets if the MSBuild property 'RestoreEnableStaticGraph'
  // is 'true'.  This file overrides the Restore target to use MSBuild Static Graph
  // to load and evaluate projects which is much faster.
  //
  // This feature is not supported for NuGet.exe scenarios and NuGet.RestoreEx.targets
  // won't exist in that case.
  // ============================================================
  if '$(RestoreUseStaticGraphEvaluation)' == 'true' And Exists('NuGet.RestoreEx.targets'):
    Import "NuGet.RestoreEx.targets"