<!--
 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.
-->
﻿<?xml version="1.0" encoding="utf-8"?>
<FxCopProject Version="10.0" Name="Kafka">
 <ProjectOptions>
  <SharedProject>True</SharedProject>
  <Stylesheet Apply="False">$(FxCopDir)\Xml\FxCopReport.xsl</Stylesheet>
  <SaveMessages>
   <Project Status="None" NewOnly="False" />
   <Report Status="Active" NewOnly="False" />
  </SaveMessages>
  <ProjectFile Compress="True" DefaultTargetCheck="True" DefaultRuleCheck="True" SaveByRuleGroup="" Deterministic="True" />
  <EnableMultithreadedLoad>True</EnableMultithreadedLoad>
  <EnableMultithreadedAnalysis>True</EnableMultithreadedAnalysis>
  <SourceLookup>True</SourceLookup>
  <AnalysisExceptionsThreshold>10</AnalysisExceptionsThreshold>
  <RuleExceptionsThreshold>1</RuleExceptionsThreshold>
  <Spelling Locale="en-US" />
  <OverrideRuleVisibilities>False</OverrideRuleVisibilities>
  <CustomDictionaries SearchFxCopDir="True" SearchUserProfile="True" SearchProjectDir="True" />
  <SearchGlobalAssemblyCache>True</SearchGlobalAssemblyCache>
  <DeadlockDetectionTimeout>120</DeadlockDetectionTimeout>
  <IgnoreGeneratedCode>True</IgnoreGeneratedCode>
 </ProjectOptions>
 <Targets>
  <Target Name="$(ProjectDir)/Kafka.Client/bin/Integration/Kafka.Client.dll" Analyze="True" AnalyzeAllChildren="True" />
 </Targets>
 <Rules>
  <RuleFiles>
   <RuleFile Name="$(FxCopDir)\Rules\DesignRules.dll" Enabled="True" AllRulesEnabled="False">
    <Rule Name="AbstractTypesShouldNotHaveConstructors" Enabled="True" />
    <Rule Name="AvoidEmptyInterfaces" Enabled="True" />
    <Rule Name="AvoidExcessiveParametersOnGenericTypes" Enabled="True" />
    <Rule Name="AvoidNamespacesWithFewTypes" Enabled="True" />
    <Rule Name="AvoidOutParameters" Enabled="True" />
    <Rule Name="CollectionsShouldImplementGenericInterface" Enabled="True" />
    <Rule Name="ConsiderPassingBaseTypesAsParameters" Enabled="True" />
    <Rule Name="DeclareEventHandlersCorrectly" Enabled="True" />
    <Rule Name="DeclareTypesInNamespaces" Enabled="True" />
    <Rule Name="DefaultParametersShouldNotBeUsed" Enabled="True" />
    <Rule Name="DefineAccessorsForAttributeArguments" Enabled="True" />
    <Rule Name="DoNotCatchGeneralExceptionTypes" Enabled="True" />
    <Rule Name="DoNotDeclareProtectedMembersInSealedTypes" Enabled="True" />
    <Rule Name="DoNotDeclareStaticMembersOnGenericTypes" Enabled="True" />
    <Rule Name="DoNotDeclareVirtualMembersInSealedTypes" Enabled="True" />
    <Rule Name="DoNotDeclareVisibleInstanceFields" Enabled="True" />
    <Rule Name="DoNotExposeGenericLists" Enabled="True" />
    <Rule Name="DoNotHideBaseClassMethods" Enabled="True" />
    <Rule Name="DoNotNestGenericTypesInMemberSignatures" Enabled="True" />
    <Rule Name="DoNotOverloadOperatorEqualsOnReferenceTypes" Enabled="True" />
    <Rule Name="DoNotPassTypesByReference" Enabled="True" />
    <Rule Name="DoNotRaiseExceptionsInUnexpectedLocations" Enabled="True" />
    <Rule Name="EnumeratorsShouldBeStronglyTyped" Enabled="True" />
    <Rule Name="EnumsShouldHaveZeroValue" Enabled="True" />
    <Rule Name="EnumStorageShouldBeInt32" Enabled="True" />
    <Rule Name="ExceptionsShouldBePublic" Enabled="True" />
    <Rule Name="GenericMethodsShouldProvideTypeParameter" Enabled="True" />
    <Rule Name="ICollectionImplementationsHaveStronglyTypedMembers" Enabled="True" />
    <Rule Name="ImplementIDisposableCorrectly" Enabled="True" />
    <Rule Name="ImplementStandardExceptionConstructors" Enabled="True" />
    <Rule Name="IndexersShouldNotBeMultidimensional" Enabled="True" />
    <Rule Name="InterfaceMethodsShouldBeCallableByChildTypes" Enabled="True" />
    <Rule Name="ListsAreStronglyTyped" Enabled="True" />
    <Rule Name="MarkAssembliesWithAssemblyVersion" Enabled="True" />
    <Rule Name="MarkAssembliesWithClsCompliant" Enabled="True" />
    <Rule Name="MarkAssembliesWithComVisible" Enabled="True" />
    <Rule Name="MarkAttributesWithAttributeUsage" Enabled="True" />
    <Rule Name="MarkEnumsWithFlags" Enabled="True" />
    <Rule Name="MembersShouldNotExposeCertainConcreteTypes" Enabled="True" />
    <Rule Name="MovePInvokesToNativeMethodsClass" Enabled="True" />
    <Rule Name="NestedTypesShouldNotBeVisible" Enabled="True" />
    <Rule Name="OverloadOperatorEqualsOnOverloadingAddAndSubtract" Enabled="True" />
    <Rule Name="OverrideMethodsOnComparableTypes" Enabled="True" />
    <Rule Name="PropertiesShouldNotBeWriteOnly" Enabled="True" />
    <Rule Name="ProvideObsoleteAttributeMessage" Enabled="True" />
    <Rule Name="ReplaceRepetitiveArgumentsWithParamsArray" Enabled="True" />
    <Rule Name="StaticHolderTypesShouldBeSealed" Enabled="True" />
    <Rule Name="StaticHolderTypesShouldNotHaveConstructors" Enabled="True" />
    <Rule Name="StringUriOverloadsCallSystemUriOverloads" Enabled="True" />
    <Rule Name="TypesShouldNotExtendCertainBaseTypes" Enabled="True" />
    <Rule Name="TypesThatOwnDisposableFieldsShouldBeDisposable" Enabled="True" />
    <Rule Name="TypesThatOwnNativeResourcesShouldBeDisposable" Enabled="True" />
    <Rule Name="UriParametersShouldNotBeStrings" Enabled="True" />
    <Rule Name="UriPropertiesShouldNotBeStrings" Enabled="True" />
    <Rule Name="UriReturnValuesShouldNotBeStrings" Enabled="True" />
    <Rule Name="UseEventsWhereAppropriate" Enabled="True" />
    <Rule Name="UseGenericEventHandlerInstances" Enabled="True" />
    <Rule Name="UseGenericsWhereAppropriate" Enabled="True" />
    <Rule Name="UseIntegralOrStringArgumentForIndexers" Enabled="True" />
    <Rule Name="UsePropertiesWhereAppropriate" Enabled="True" />
   </RuleFile>
   <RuleFile Name="$(FxCopDir)\Rules\GlobalizationRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\InteroperabilityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\MobilityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\NamingRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\PerformanceRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\PortabilityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\SecurityRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\SecurityTransparencyRules.dll" Enabled="True" AllRulesEnabled="True" />
   <RuleFile Name="$(FxCopDir)\Rules\UsageRules.dll" Enabled="True" AllRulesEnabled="True" />
  </RuleFiles>
  <Groups />
  <Settings />
 </Rules>
 <FxCopReport Version="10.0" />
</FxCopProject>
