<!--

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.

-->
<ivysettings>

    <settings defaultResolver="maven"/>

    <property name="maven" value="https://repo1.maven.org/maven2/"/>
    <property name="maven-mirror" value="http://uk.maven.org/maven2/"/>
    <!--<property name="confluent" value="http://packages.confluent.io/maven/"/>
    <property name="nexus" value="https://oss.sonatype.org/content/groups/public/"/>-->
    <resolvers>
        <ibiblio name="maven" m2compatible="true" root="${maven}"/>
        <ibiblio name="maven-mirror" m2compatible="true" root="${maven-mirror}"/>
        <!--<ibiblio name="confluent" m2compatible="true" root="${confluent}"/>
        <ibiblio name="nexus" m2compatible="true" root="${nexus}"/>-->
    </resolvers>

</ivysettings>