Written by Beau Kuiper Use, modification and distribution is allowed without limitation, warranty, or liability of any kind.