Apache Avro
Copyright 2010-2015 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

Based upon the representations of upstream licensors, it is understood that
portions of the mapreduce API included in the Java implementation are licensed
from various contributors under one or more contributor license agreements to
Odiago, Inc. and were then contributed by Odiago to Apache Avro, which has now
made them available under the Apache 2.0 license. The original file header text
is:

| Licensed to Odiago, Inc. under one or more contributor license
| agreements.  See the NOTICE file distributed with this work for
| additional information regarding copyright ownership.  Odiago, Inc.
| 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.

The Odiago NOTICE at the time of the contribution:

| This product includes software developed by Odiago, Inc.
| (http://www.wibidata.com).

The documentation contains the default Apache Forrest skin.
Apache Forrest includes the following in its NOTICE file:

| Apache Forrest
| Copyright 2002-2007 The Apache Software Foundation.
|
| This product includes software developed at
| The Apache Software Foundation (http://www.apache.org/).
|
| See also the file LICENSE.txt
|
| ------------------------------------------------------------------------
| The purpose of this NOTICE.txt file is to contain notices that are
| required by the copyright owner and their license. Some of the
| accompanying products have an attribution requirement, so see below.
| Other accompanying products do not require attribution, so are not listed.
|
| ------------------------------------------------------------------------
| This product includes software developed by the OpenSymphony Group
| http://www.opensymphony.com/
|
| This product includes software developed for project Krysalis
| http://www.krysalis.org/
|
| This product includes software developed by Andy Clark.
| http://people.apache.org/~andyc/neko/
|
| This product includes software developed by the ExoLab Project
| http://www.exolab.org/
|
| This product includes software developed by TouchGraph LLC
| http://www.touchgraph.com/
|
| This product includes software developed by Marc De Scheemaecker
| http://nanoxml.cyberelf.be/
|
| This product includes software developed by the ANTLR project
| http://www.antlr.org/
|
| This product includes software developed by Chaperon
| http://chaperon.sourceforge.net/
|
| This product includes software developed by Sal Mangano (included in the XSLT Cookbook published by O'Reilly)
| http://www.oreilly.com/catalog/xsltckbk/
|
| This product includes software developed by The Werken Company.
| http://jaxen.werken.com/
|
| This product includes software developed by the jfor project
| http://www.jfor.org/
