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