def hexdump(data: bytes) -> None:
    """
    https://code.activestate.com/recipes/579064-hex-dump/

    >>> hexdump(b'\x7f\x7f\x7f\x7f\x7f')  #doctest: +NORMALIZE_WHITESPACE
    0000000000: 7F 7F 7F 7F 7F                                    .....
    """
    def _pack(a):
        """
        ['7F', '7F', '7F', '7F', '7F', '7F', '7F', '7F', '7F']
        ->
        [[['7F', '7F', '7F', '7F', '7F', '7F', '7F', '7F'], ['7F']]]
        """
        for n in (8, 2):
            a = [a[i:i + n] for i in range(0, len(a), n)]
        return a

    def _join(a, *cs):
        """
        [[['7F', '7F', '7F', '7F', '7F']]], '  ', ' '
        ->
        '7F 7F 7F 7F 7F'
        """
        return (cs[0].join(_join(t, *cs[1:])) for t in a) if cs else a

    _to_hex = lambda c: f'{c:02X}'
    _to_chr = lambda c: chr(c) if 32 <= c < 127 else '.'
    _make = lambda f, *cs: _join(_pack([*map(f, data)]), *cs)
    hs = _make(_to_hex, '  ', ' ')
    cs = _make(_to_chr, ' ', '')
    for i, (h, c) in enumerate(zip(hs, cs)):
        print(f"{i * 16:010X}: {h:48}  {c:16}")