The primary authors of strace were:

	Paul Kranenburg <pk@cs.few.eur.nl>
	Branko Lankester <branko@hacktic.nl>
	Rick Sladkey <jrs@world.std.com>

These people have contributed to strace.  Some have reported problems, others
have contributed improvements to the documentation, actual code, provided
information, provided resources, or helped to port strace to new systems.
Those contributions are described in the version control logs and ChangeLog-CVS
file.  If your name has been left out, if you'd rather not be listed, or if
you'd prefer a different address be used, please send a note to the
strace-devel@lists.sourceforge.net mailing list.

##<
## There is no need to list here any name that appears as an Author in
## "git log" output.  Those are automatically added when this template
## is used to generate the CREDITS file.
##>
Aaron Ucko                      ucko@vax1.rockhurst.edu
Adrien Kunysz                   adrien@kunysz.be
Andi Kleen                      ak@suse.de
Anton Blanchard                 anton@samba.org
Arkadiusz Miskiewicz            misiek@pld.org.pl
Bai Weidong                     baiwd@cn.fujitsu.com
Bo Kullmar                      bk@kullmar.se
Cai Fei                         caifei@cn.fujitsu.com
D.J. Barrow                     djbarrow@de.ibm.com
David Mosberger-Tang            davidm@hpl.hp.com
David S. Miller                 davem@caip.rutgers.edu
David Wilder                    wilder@us.ibm.com
David Woodhouse                 dwmw2@redhat.com
Douglas Mencken                 dougmencken@gmail.com
Fernando Luis Vazquez Cao       fernando@oss.ntt.co.jp
Florian Lohoff                  flo@rfc822.org
Gabor Gombas                    gombasg@sztaki.hu
Ganesan Rajagopal               rganesan@myrealbox.com
Gaël Roualland                  gael.roualland@iname.com
Greg Banks                      gbanks@pocketpenguins.com
Henrik Storner                  storner@osiris.ping.dk
Jakub Jelinek                   jj@ultra.linux.cz
Jeff Mahoney                    jeffm@suse.com
Joe Ilacqua                     spike@world.std.com
Johannes Stezenbach             js@sig21.net
Ju"rgen Fluk                    louis@marco.de
Juergen Weigert                 jnweiger@immd4.informatik.uni-erlangen.de
Keith Thompson                  kst@alsys.com
Kyle McMartin                   kyle@mcmartin.ca
Lai JiangShan                   laijs@cn.fujitsu.com
Leonard N. Zubkoff              lnz@dandelion.com
Linus Torvalds                  Linus.Torvalds@cs.helsinki.fi
Lupe Christoph                  lupe@alanya.isar.muc.de
Marty Leisner                   leisner@sdsp.mc.xerox.com
Matt Day                        mday@artisoft.com
Matthias Pfaller                leo@dachau.marco.de
Maxim Shchetynin                maxim@de.ibm.com
Michael E Chastain              mec@duracef.shout.net
Michael Holzheu                 holzheu@de.ibm.com
Michail Litvak                  mci@owl.openwall.com
Mike Stroyan                    mike.stroyan@hp.com
Muttley Meen                    muttley.meen@gmail.com
Nate Eldredge                   nate@cartsys.com
Paul Mundt                      lethal@linux-sh.org
Peter Jones                     pjones@redhat.com
Pádraig Brady                   P@draigBrady.com
Rajeev V. Pillai                rajeevvp@gmail.com
Randolph Chung                  tausq@debian.org
Reuben Sumner                   rasumner@undergrad.math.uwaterloo.ca
Richard Braakman                dark@xs4all.nl
Richard Henderson               richard@twiddle.tamu.edu
Richard Hirst                   rhirst@linuxcare.com
Roland Borde                    bo@uebemc.siemens.de
Sami Farin                      safari@u.safari.iki.fi
Scott Tsai                      scottt958@yahoo.com.tw
Simon Murray                    simon@transitive.com
Solar Designer                  solar@openwall.com
Srinivasa Ds                    srinivasa@in.ibm.com
Steve Bennett                   steveb@workware.net.au
Thanh Ma                        tma@encore.com
Thiemo Seufer                   ths@networkno.de
Thomas Bogendoerfer             tsbogend@bigbug.franken.de
Tim Yamin                       plasmaroo@gentoo.org
Timo Lindfors                   timo.lindfors@iki.fi
Tom Dyas                        tdyas@eden.rutgers.edu
Tommi Rantala                   ext-tommi.1.rantala@nokia.com
Topi Miettinen                  Topi.Miettinen@nic.fi
Xiaoning Ding                   dingxn@gmail.com
Yang Zhiguo                     yzgcsu@cn.fujitsu.com
Zach Brown                      zach.brown@oracle.com
Zhang Le                        zhilg@users.sourceforge.net
Марк Коренберг                  socketpair@gmail.com
