Apache Jena
Copyright 2011, 2012, 2013, 2014, 2015 The Apache Software Foundation

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

Portions of this software were originally based on the following:
  - Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP
  - Copyright 2010, 2011 Epimorphics Ltd.
  - Copyright 2010, 2011 Talis Systems Ltd.
These have been licensed to the Apache Software Foundation under a software grant.

This product includes software developed by
PluggedIn Software under a BSD license.

This product includes software developed by Mort Bay Consulting Pty. Ltd.
   Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd.
