input: def HashTable:
      def __init__(self):
          self.table = [[] for _ in range(256)]
   
      def insert(self, key, value):
          h = hash(key) % 256
          for i, kv in enumerate(self.table[h]):
              if kv[0] == key:
                  self.table[h][i] = (key, value)
                  return
          self.table[h].append((key, value))
   
      def retrieve(self, key):
          h = hash(key) % 256
          for kv in self.table[h]:
              if kv[0] == key:
                  return kv[1]
   
      def delete(self, key):
          h = hash(key) % 256
          for i, kv in enumerate(self.table[h]):
              if kv[0] == key:
                  del self.table[h][i]
  
  ### Example:
  # Create a new hash table
  ht = HashTable()
  
  # Insert key-value pairs
  ht.insert('key1', 'value1')
  ht.insert('key2', 'value2')
  
  # Retrieve values
  assert ht.retrieve('key1') == 'value1'
  assert ht.retrieve('key2') == 'value2'
  
  # Delete a key-value pair
  ht.delete('key1')
  assert ht.retrieve('key1') is None
  
  # Check the hash table structure after deletion
  assert len(ht.table) == 256
output:     def __str__(self):
          result = []
          for bucket in self.table:
              for key, value in bucket:
                  result.append(f"{key}: {value}")
          return "{" + ", ".join(result) + "}"
  
      def __len__(self):
          count = 0
          for bucket in self.table:
              count += len(bucket)
          return count
  
      def __contains__(self, key):
          h = hash(key) % 256
          for kv in self.table[h]:
              if kv[0] == key:
                  return True
          return False