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