docs: async def get_object(self, Bucket: str, Key: str, **kwargs) -> dict:
          """
          S3 GetObject. Takes same args as Boto3 documentation
  
          Decrypts any CSE
  
          :param Bucket: S3 Bucket
          :param Key: S3 Key (filepath)
          :return: returns same response as a normal S3 get_object
          """
          if self._s3_client is None:
              await self.setup()
  
          # Ok so if we are doing a range get. We need to align the range start/end with AES block boundaries
          # 9223372036854775806 is 8EiB so I have no issue with hardcoding it.
          # We pass the actual start, desired start and desired end to the decrypt function so that it can
          # generate the correct IV's for starting decryption at that block and then chop off the start and end of the
          # AES block so it matches what the user is expecting.
          _range = kwargs.get('Range')
          actual_range_start = None
          desired_range_start = None
          desired_range_end = None
          if _range:
              range_match = RANGE_REGEX.match(_range)
              if not range_match:
                  raise ValueError('Dont understand this range value {0}'.format(_range))
  
              desired_range_start = int(range_match.group(1))
              desired_range_end = range_match.group(2)
              if desired_range_end is None:
                  desired_range_end = 9223372036854775806
              else:
                  desired_range_end = int(desired_range_end)
  
              actual_range_start, actual_range_end = _get_adjusted_crypto_range(desired_range_start, desired_range_end)
  
              # Update range with actual start_end
              kwargs['Range'] = 'bytes={0}-{1}'.format(actual_range_start, actual_range_end)
  
          s3_response = await self._s3_client.get_object(Bucket=Bucket, Key=Key, **kwargs)
          file_data = await s3_response['Body'].read()
          metadata = s3_response['Metadata']
          whole_file_length = int(s3_response['ResponseMetadata']['HTTPHeaders']['content-length'])
  
          if 'x-amz-key' not in metadata and 'x-amz-key-v2' not in metadata:
              # No crypto
              return s3_response
  
          if 'x-amz-key' in metadata:
              # Crypto V1
              body = await self._decrypt_v1(file_data, metadata, actual_range_start)
          else:
              # Crypto V2
              body = await self._decrypt_v2(file_data, metadata, whole_file_length,
                                            actual_range_start, desired_range_start,
                                            desired_range_end)
  
          s3_response['Body'] = DummyAIOFile(body)
  
          return s3_response