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