Author: Kent Sibilev Contributors: Markus Barchfeld R. Bernstein Contributor and maintainer: Mark Moseley