<Project>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->
  <PropertyGroup>
    <Version>0.16.0</Version>
    <Authors>Apache Software Foundation</Authors>
    <Owners>The Apache REEF project</Owners>
    <Product>Apache REEF</Product>
    <ProductId>$(AssemblyName)</ProductId>
    <AssemblyVersion>$(Version)</AssemblyVersion>
    <FileVersion>$(Version)</FileVersion>
    <NeutralLanguage>en</NeutralLanguage>
    <Copyright>The Apache Software Foundation</Copyright>
    <PackageLicenseUrl>https://www.apache.org/licenses/LICENSE-2.0</PackageLicenseUrl>
    <PackageProjectUrl>https://reef.apache.org</PackageProjectUrl>
    <PackageIconUrl>https://reef.apache.org/ApacheREEF_logo_no_margin_small.png</PackageIconUrl>
    <RepositoryUrl>https://github.com/apache/reef.git</RepositoryUrl>
    <PackageReleaseNotes>Contact the Apache REEF development alias dev@reef.apache.org for questions or issues.</PackageReleaseNotes>
    <DefaultItemExcludes>$(DefaultItemExcludes);**/AssemblyInfo.cs;packages.config;*.nuspec</DefaultItemExcludes>
  </PropertyGroup>

  <PropertyGroup>
    <PlatformTarget>x64</PlatformTarget>
    <DefineConstants>DOTNET_BUILD</DefineConstants>
    <OutputPath>..\bin\$(AssemblyName)</OutputPath>
    <AvroVersion>1.5.6</AvroVersion>
    <NewtonsoftJsonVersion>10.0.1</NewtonsoftJsonVersion>
    <NSubstituteVersion>1.8.2.0</NSubstituteVersion>
    <ProtobufVersion>2.0.0.668</ProtobufVersion>
    <RxVersion>2.2.5</RxVersion>
    <StyleCopVersion>4.7.49.1</StyleCopVersion>
    <TransientFaultHandlingVersion>1.0.0</TransientFaultHandlingVersion>
    <RxVersion>3.0.0</RxVersion>
    <NSubstituteVersion>2.0.3</NSubstituteVersion>
  </PropertyGroup>

</Project>
