docs: def Dumper(obj, indent=0, increase=4, encoding='utf-8'):
      """appropriately view a given dict/list/tuple/object data structure"""
      ##############################################################################
      def p(given):
          """ensure proper decoding from unicode, if necessary"""
          if isinstance(given, str):  return given.encode(encoding)
          else:                       return given
      ##############################################################################
      try:
          if isinstance(obj, dict):
              for k,v in obj.items():
                  if hasattr(v, "__iter__"):
                      print("%s%s"%(" "*(indent), p(k)))
                      Dumper(v, indent=indent+increase, increase=increase)
                  else: print("%s%s=%s"%(" "*(indent), p(k), p(v)))
          elif isinstance(obj, list):
              for o in obj:
                  Dumper(o, indent=indent, increase=increase) # didn't print anything this go-round
          elif isinstance(obj, tuple):
              print("%s%s"%(" "*(indent), p(obj[0])))
              next = list(obj)[1:]
              if len(next) == 1:  next = next[0]
              else:               next = tuple(next)
              Dumper(next, indent=indent+increase, increase=increase)
          elif isinstance(obj, str):
              print("%s%s"%(" "*(indent), p(obj))) # universally convert back to str for printing
          elif obj!=None:
              print("%s%s"%(" "*(indent), p(obj)))
      except Exception:
          print(type(obj), obj)