input: def create_basic_blockchain() -> Blockchain:
      """Create a basic blockchain system in Python. 
      The blockchain should be able to store blocks containing data and maintain a chain of hashes.
      Each block should contain an index, a timestamp, data, and a hash of the previous block.
      The blockchain should have methods to add new blocks and to get the entire blockchain in JSON format.
      
      Example:
      >>> blockchain = create_basic_blockchain()
      >>> blockchain.add_block({'timestamp': '2023-01-01 12:00:00', 'data': 'Genesis Block'})
      >>> blockchain.add_block({'timestamp': '2023-01-01 12:05:00', 'data': 'Second Block'})
      >>> blockchain.get_chain()
      '[{"index": 0, "timestamp": "2023-01-01 12:00:00", "data": "Genesis Block", "previous_hash": null, "hash": "..."}, {"index": 1, "timestamp": "2023-01-01 12:05:00", "data": "Second Block", "previous_hash": "...", "hash": "..."}]'
      """
output:     
      class Block:
          def __init__(self, index, timestamp, data, previous_hash):
              self.index = index
              self.timestamp = timestamp
              self.data = data
              self.previous_hash = previous_hash
              self.hash = self.calculate_hash()
          
          def calculate_hash(self):
              sha = hashlib.sha256()
              sha.update(f"{self.index}{self.timestamp}{self.data}{self.previous_hash}".encode('utf-8'))
              return sha.hexdigest()
  
      class Blockchain:
          def __init__(self):
              self.chain = [self.create_genesis_block()]
          
          def create_genesis_block(self):
              return Block(0, "2023-01-01 12:00:00", "Genesis Block", "0")
          
          def get_latest_block(self):
              return self.chain[-1]
          
          def add_block(self, new_block):
              new_block.index = self.get_latest_block().index + 1
              new_block.previous_hash = self.get_latest_block().hash
              new_block.hash = new_block.calculate_hash()
              self.chain.append(new_block)
          
          def get_chain(self):
              return json.dumps([block.__dict__ for block in self.chain], indent=4)
  
      return Blockchain()
  