Permission to use, copy, modify, and/or distribute this code for any purpose with or without fee is hereby granted. There is no warranty.