MBR_LBA_GAP = 0x3f
BOOT_PARITION_SIZE = 0x300B85
RECOVER_PARTITION_SIZE = 0x300BC4
partitions = [
    0x102d83,
    0x403947,
    0x403947,
    0x48ed459,
    0x20014aa,
]


ext_offset = 0
offsets = [0] * len(partitions)
extended_base = MBR_LBA_GAP + BOOT_PARITION_SIZE + RECOVER_PARTITION_SIZE
for i in range(len(partitions)):
    offsets[i] = ext_offset + extended_base
    ext_offset += partitions[i] + MBR_LBA_GAP

# (Start, end, data)
accounted_for = [
    (0, 1, True),  # MBR
    (1, MBR_LBA_GAP, False),
    (MBR_LBA_GAP, MBR_LBA_GAP + BOOT_PARITION_SIZE, True),
    (MBR_LBA_GAP + BOOT_PARITION_SIZE, MBR_LBA_GAP + BOOT_PARITION_SIZE + RECOVER_PARTITION_SIZE, True),
]

for n, (i, j) in enumerate(zip(offsets, partitions)):
    accounted_for.append((
        i, i + 1, True
    ))
    if n == 0:
        # SBR
        accounted_for.append((
            i + 1, i + 4, True
        ))
        accounted_for.append((
            i + 4, i + MBR_LBA_GAP, False
        ))
    else:
        accounted_for.append((
            i + 1, i + MBR_LBA_GAP, False
        ))
    accounted_for.append((
        i + MBR_LBA_GAP, i + MBR_LBA_GAP + j, True
    ))

assert accounted_for[-1][1] == 0x77fa1d7
last = 0
for i in accounted_for:
    assert i[0] == last
    last = i[1]

with open(r"G:\finale_dd\finale_dd.img", "rb") as finale_dd:
    for i in accounted_for:
        if i[2]:
            continue
        nbytes = i[1] - i[0]
        finale_dd.seek(i[0] * 512)
        print(f"Checking at {i[0] * 512:012x}-{i[1] * 512:012x}")
        if any(finale_dd.read(nbytes * 512)):
            print("!! FAIL")
