function res = step(X, options, VaccinationRate)
S = X(1);
I = X(2);
Q = X(3);
R = X(4);

N = sum(X);

new_waiting = zeros(1, length(X) - 4);
for i=6:length(X)
    new_waiting(i - 4) = X(i - 1) * (1 - options.NaturalDeathRate);
end

if length(X) > 4
    % infection = S * (1 - 25 * options.InfectionRate / N) ^ I;
    infecter = sum(X(5:length(X)) + I);
    infection = options.InfectionRate * S * infecter/N;
    new_waiting(1) = infection;
    dS = -infection;
    dI = X(length(X));
else
    dS = -options.InfectionRate * S * I/N;
    dI = options.InfectionRate * S * I/N;
end

dS = dS - VaccinationRate * S + options.ImmunisationLossRate * R + options.NatalityRate * N - options.NaturalDeathRate * S;
dI = dI - options.ImmunisationRate * I - options.DeathRate * I - options.QuarantineRate * I;
dQ = -options.ImmunisationRate * Q - options.DeathRate * Q + options.QuarantineRate * I;
dR = options.ImmunisationRate * (I + Q) + VaccinationRate * S - options.ImmunisationLossRate * R - options.NaturalDeathRate * R;

res = [max(S + dS, 0), max(I + dI, 0), max(Q + dQ, 0), max(R + dR, 0), new_waiting];
end