Source: https://cs.au.dk/~gerth/slides/cctd18ipsa.pdf