Apache Quickstep (incubating)
Copyright 2016 The Apache Software Foundation.

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

Portions Copyright (c) 2011-2015, Quickstep Technologies, LLC.
Portions Copyright (c) 2015-2016, Pivotal Software, Inc.

[Copyright for third_party/benchmark]
Portions Copyright (c) Arne Beer <arne@twobeer.de>
Portions Copyright (c) Christopher Seymour <chris.j.seymour@hotmail.com>
Portions Copyright (c) David Coeurjolly <david.coeurjolly@liris.cnrs.fr>
Portions Copyright (c) Dominic Hamon <dma@stripysock.com>
Portions Copyright (c) Eugene Zhuk <eugene.zhuk@gmail.com>
Portions Copyright (c) Evgeny Safronov <division494@gmail.com>
Portions Copyright (c) Felix Homann <linuxaudio@showlabor.de>
Portions Copyright (c) Google Inc.
Portions Copyright (c) JianXiong Zhou <zhoujianxiong2@gmail.com>
Portions Copyright (c) Lei Xu <eddyxu@gmail.com>
Portions Copyright (c) Matt Clarkson <mattyclarkson@gmail.com>
Portions Copyright (c) Oleksandr Sochka <sasha.sochka@gmail.com>
Portions Copyright (c) Paul Redmond <paul.redmond@gmail.com>
Portions Copyright (c) Shuo Chen <chenshuo@chenshuo.com>
Portions Copyright (c) Yusuke Suzuki <utatane.tea@gmail.com>

[Copyright for third_party/cpplint]
Portions Copyright (c) 2009 Google Inc

[Copyright for third_party/farmhash]
Copyright (c) 2014 Google, Inc.

[Copyright for third_party/gflags]
Copyright (c) 2006, Google Inc.

[Copyright for third_party/glog]
Copyright (c) 2008, Google Inc.

[Copyright for third_party/gpertools]
Copyright (c) 2005, Google Inc.

[Copyright for third_party/linenoise]
Copyright (c) 2010-2014, Salvatore Sanfilippo <antirez at gmail dot com>
Copyright (c) 2010-2013, Pieter Noordhuis <pcnoordhuis at gmail dot com>
