Created by xavier c
Contributed by Stephen Coles
Contributed by Richard Baird
Contributed by Rafael Nobre
Contributed by Nathaniel Hebert