function giveBirth(uint256 _matronId)
        external
        whenNotPaused
        returns(uint256)
    {
        Ninja storage matron = ninjas[_matronId];
        require(matron.birthTime != 0);
        require(_isReadyToGiveBirth(matron));
        uint256 sireId = matron.siringWithId;
        Ninja storage sire = ninjas[sireId];
        uint16 parentGen = matron.generation;
        if (sire.generation > matron.generation) {
            parentGen = sire.generation;
        }
        uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);
        address owner = ninjaIndexToOwner[_matronId];
        uint256 ninjaId = _createNinja(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);
        delete matron.siringWithId;
        pregnantNinjas--;
        msg.sender.send(autoBirthFee);
        return ninjaId;
    }