Apache jclouds
Copyright 2009-2013 The Apache Software Foundation

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

This product includes software developed at
jclouds, Inc. (http://www.jclouds.org/).

This product includes Common Annotations (JSR 250, https://jsr250.dev.java.net/)
distributed under the CDDL Version 1.0 license.

This product includes Jersey (https://jersey.dev.java.net/)
distributed under the CDDL Version 1.0 license.

This product includes net.oauth.core 
distributed under the Apache Software License, Version 2.0.

This product includes Gson (http://code.google.com/p/google-gson)
distributed under the Apache Software License, Version 2.0.

This product includes Guice (http://code.google.com/p/google-guice)
distributed under the Apache Software License, Version 2.0.

This product includes Guava (http://code.google.com/p/guava-libraries)
distributed under the Apache Software License, Version 2.0.

org.jclouds.util.Suppliers2 and Suppliers2Test contain pieces of Guava's Suppliers
distributed under the Apache Software License, Version 2.0.
(c) 2010 Google Inc.

This product includes BouncyCastle (http://www.bouncycastle.org/licence.html)
distributed with the following notice:
  "Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)

   Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

   The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."

This product includes findbugs jsr305 (http://code.google.com/p/findbugs)
distributed under the GNU Lesser GPL License, Version 3.0.

This product includes aopalliance (http://aopalliance.sourceforge.net/)
distributed in the Public Domain

This product includes software developed at Hewlett-Packard
Copyright (c) 2011-2012 Hewlett-Packard Development Company, L.P

This product includes software developed at Cloudsoft
Copyright (c) 2011-2012 Cloudsoft Corporation, Ltd.

This product includes software developed at MuleSoft
Copyright (c) 2012 MuleSoft Inc.

