::::::::::     :::::::::::::::::::      ::::::::::::::::: :::::::::::::::: ::
:::::: ::::::::::::::::::::::::::::::::::::::::::     ::::::::::::::::::::  ::
:::::::::::::::::::::::::::::::::::::::::          ::::::::::::::::::::::::::::
  ::::::::::::::::::::::::::::::::::::::::::  :::::      :::::::::::::::::::: :
 :::::::::::::::::::::::::::::::::::::::::::::::ooooo            ::::::::::::::
::::::::::::::::::::::::::::::::  :::::::XXXXooooooooooooo          :::::::::::
::  ::::::::::::: :::::::::::: ::::::::     oooo  ooo ooooo            ::X:::::
 ::::::::::::  :::::::::::::::ooooooo      oooo  oooo  oooo             :::::::
::::::::::::::::::::::::::::ooooooooooo     oooo   o   ooo              ::: :::
::::::::::::::::::::::::::ooooo     oooo    oooo     ooooooooooo        :::  ::
::: :::::::::::::::::::: ooooo  oooooooo    oooo ooooooooo  oooooo      ::::  :
   :::::::::::::::::::: ooooooo    oooooo       ooooooo   oooooo oo    :::::: :
 ::::::::::::::::::::  ::oooooooooooooooo          oo    oooo oooooo    :::::::
:::::::::::::::::::    :::    ooooooooo             oooo oooo ooo ooo    ::::::
::::::::::::::::::   ::::                           ooo    oooo     o    ::::::
::::::     ::::::  ::::: ...ooooooooooooooo....     ooooooooooo  oooo    ::::::
::::      :::::::::::::ooooXXXXXXXXXXXXoooooooo...   oooooooooooooo      :: :::
          :::::::::: XXXXXXXXXXXXXXXXXXXXXXXooooooo.   oooooo          ::::  ::
          ::::::    .XXXXXXXXXXXXXXXXXXXXXXoooooo:oo.                    ::: ::
                   .XXXXXXXXXXXXXXXXXXXXXXooooooooo:::                    :: ::
                   XXXXXXXXXXXXXXXXXXXXXXooooooooo::::.                    : ::
                  .XXXXXXXXXXXXXXXXXXXXXXooooooooo:::::                    ::::
                  XXXXXXXXXXXXXXXXXXXXXXXoooooooo::::::                     :::
                  XXXXXXXXXXXXXXXXXXXXXXXXXXoooooo:::::                   : ::
                 '      `+XXXXXXXXX+'         `4o:::::::                  : ::
                 XooXXXo..  `XX''  _.ooXXXXXXXXboXXX::::                 :: ::
                 4XXXXXoob`o.,:_.odXXXXXXXXXXX88XXXXXXX        ..oooo.  ::: ::
                   .no'"+4X XXXXXoXX.xxP+4XXX888XXXXXXXX    .dXXXXX XXX ::::::
                  .d@@. .dP d88ooob.<@@( `)PXXXXXXXXoo:oX  .XXXX XXX XX; ::::
                  XXXXXXX; d88oXXXXXXbnbodXXXXXXXooooooo:::XXXX . XX XX::::::::
                  ooooXXf d88oXXXXXXXXXXXXXXXXXXoooooooo:::XXX .X  X XX::::::::
                  oooooX j88oXXXXXXXXXXXXXXXXXXoooooooo::::XX  XP  X X   :::
                  `ooooX 488oXX+XgXXXXXXXXXXXXoooooooo::: ::  "  .XXX'
                   Xoooo._`""" a  dXXXXXXXXXXoooooooo::::::: XXXXXXX'
                    XXooXXXhhXXXXXXXXXXXXXXXoooooooo:::::::::XXXXXP
                    XXoooXXoooXooXXXXXXXXXXXooooooo:::::: :::""""
                     XooXP'"+""`4XooXXXXXXXXooooooo:::::   ::
                      Xb'--._...__`4XXXXXXXooooooo:::::   :::
                      XXo._     _.odXXXXXXXooooooo:::   .::::
                       XXXooooooooXXXXooXXooooooo:::  .:::::::
                       XXXXooooooooXXXooooooo:o:::   .::::::::
                        XXXX888888XXXXXoooooooo:   .:ooo:::::::
                         XXXXXXXXXXXXXooooX:::   .ooooooo::::::
                          `XXXXXXXXXXoooX      .XXooooo:o::::::
                            `XXXxx"""      ...XXXXooooooo::::::
                             ` X     ....XXXXXXXXoooooooo::::::
                               XXXXXXXXXXXXXXXXXXoooooooo:::::::
                               XXXXXXXXXXXXXXXXXXXoooooooo:::::::
                               XXXXXXXXXXXXXXXXXXXoooooooo:::::::::
                               XXXXXXXXXXXXXXXXXXXXooooo:oo::::::::