# People who have agreed to one of the CLAs and can contribute patches.
# The AUTHORS file lists the copyright holders; this file
# lists people.  For example, Google employees are listed here
# but not in AUTHORS, because Google holds the copyright.
#
# https://developers.google.com/open-source/cla/individual
# https://developers.google.com/open-source/cla/corporate
#
# Names should be added to this file as:
#     Name <email address>
Adam Sadovsky <sadovsky@google.com>
Alex Fandrianto <alexfandrianto@google.com>
Ali Ghassemi <aghassemi@google.com>
Andres Erbsen <andreser@google.com>
Ankur Taly <ataly@google.com>
Arup Mukherjee <arup@google.com>
Asim Shankar <ashankar@google.com>
Benjamin Prosnitz <bprosnitz@google.com>
Bogdan Caprita <caprita@google.com>
Cosmos Nicolaou <cnicolaou@google.com>
David Presotto <p@google.com>
Gautham Thambidorai <gauthamt@google.com>
Himabindu Pucha <hpucha@google.com>
Ivan Pilat <ivanpi@google.com>
James Ring <sjr@google.com>
Jason Hickey <jyh@google.com>
Jenkins Veyron <jenkins.veyron@gmail.com>
Jing Jin <jingjin@google.com>
Jiri Simsa <jsimsa@google.com>
Jungho Ahn <jhahn@google.com>
Ken Ashcraft <kash@google.com>
Matt Rosencrantz <mattr@google.com>
Mehrdad Afshari <leakycode@google.com>
Mike Burrows <m3b@google.com>
Nicolas LaCasse <nlacasse@google.com>
Robert Kroeger <rjkroege@google.com>
Robin Thellend <rthellend@google.com>
Ryan Brown <ribrdb@google.com>
Sergey Rogulenko <rogulenko@google.com>
Shyam Jayaraman <bjornick@google.com>
Srdjan Petrovic <spetrovic@google.com>
Suharsh Sivakumar <suharshs@google.com>
Tilak Sharma <tilaks@google.com>
Todd Wang <toddw@google.com>
