#######  ##     ##    ###    ##     ##     ########  ########
##     ## ###   ###   ## ##   ##     ##     ##     ## ##
       ## #### ####  ##   ##  ##     ##     ##     ## ##
 #######  ## ### ## ##     ## ##     ##     ##     ## ######
##        ##     ## ######### ##     ##     ##     ## ##
##        ##     ## ##     ## ##     ## ### ##     ## ##
######### ##     ## ##     ##  #######  ### ########  ########