Contributed by Kirill Gluschenko
Contributed by Yevgeniy Anfalov
Contributed by Lucas Descroix
Contributed by Stephen Coles