function NearHalf(frc) {
    return Math.abs(frc % 1 - 0.5) < 0.000001;
}

function NearHole(frc) {
    return NearHalf(frc + 0.5);
}

function IntFrc(frc) {
    with (Math) {
            if (frc % 1 >= 0.5) {
                frc++;
            }
            return frc | 0;

    }
}

function CORE(X, N) {
    var int = Math.floor(X), frc = ((X - int) + 1) * Math.pow(10, N);
    frc = String(IntFrc(frc));
    return (int + +(frc.charAt(0) == "2")) + "." + frc.substring(1);
}

function NOGO(str) {
    return /[a-z-]/.test(str);
}

function STRU(X, M, N) {
    var str = CORE(X, N);
    if (NOGO(str)) {
        return SpcsTo(X, M + 1 + N);
    }
    return PrfxTo(str, M + 1 + N, "0");
}

function STRT(X, M, N) {
    var str = CORE(X, N);
    if (NOGO(str)) {
        str = String(X);
    }
    return SpcsTo(str, M + 1 + N);
}

function STRS(X, M, N) {
    return Sign(X) + STRU(Math.abs(X), M - 1, N);
}

function STRW(X, M, N) {
    return SpcsTo(STRS(X, 1, N), M + N + 1);
}


function PrfxTo(S, L, C) {
    S += "";
    if (C.length > 0) {
        while (S.length < L) {
            S = C + S;
        }
    }
    return S;
}

function SpcsTo(S, L) {
    S += "";
    while (S.length < L) {
        S = " " + S;
    }
    return S;
}

function Sign(X) {
    return X > 0 ? "+" : X < 0 ? "-" : " ";
}

// older code for comparison :-

function StrU(X, M, N) {
    var S = String(Math.round(X * Math.pow(10, N)));
    if (/\D/.test(S)) {
        return SpcsTo(X, M + N + 1);
    }
    S = PrfxTo(S, M + N, "0");
    var T = S.length - N;
    return S.substring(0, T) + "." + S.substring(T);
}

function StrT(X, M, N) {
    return SpcsTo(StrU(X, 1, N), M + N + 2);
}

function StrS(X, M, N) {
    return Sign(X) + StrU(Math.abs(X), M, N);
}

function StrW(X, M, N) {
    return SpcsTo(StrS(X, 1, N), M + N + 2);
}

function SetGlobals() {
    var undefined;
    U = undefined;
    n = null;
    P = +Infinity;
    M = -Infinity;
    N = NaN;
    CaseNo = N;
}