Created by beining wang
Contributed by Nick Sherman
Contributed by Ben Mingo
Contributed by Martin Vácha