<!--
   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

     https://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.    
-->
<ivy-module version="1.0">
    <info organisation="myorg" module="test" />
    <configurations>
        <conf name="runtime" />
        <conf name="test" extends="runtime" />
    </configurations>
    <dependencies>
        <dependency org="myorg" name="modB" rev="[1.0,2.0[" conf="runtime" />
        <dependency org="myorg" name="modA" rev="[1.0,2.0[" conf="test->runtime" />
    </dependencies>
</ivy-module>
