nicolosiRaw = function(λ, φ) {
const π = Math.PI,
pi2 = π / 2,
p = Math.sin(φ),
q = Math.cos(φ),
s = Math.sign(λ);
if (λ === 0 || Math.abs(φ) === pi2) return [0, φ];
else if (φ === 0) return [λ, 0];
else if (Math.abs(λ) === pi2) return [λ * q, pi2 * p];
const b = π / (2 * λ) - 2 * λ / π,
c = 2 * φ / π,
d = (1 - c * c) / (p - c);
const b2 = b * b,
d2 = d * d,
b2d2 = 1 + b2 / d2,
d2b2 = 1 + d2 / b2;
const M = (b * p / d - b / 2) / b2d2,
N = (d2 * p / b2 + d / 2) / d2b2,
m = M * M + (q * q / b2d2),
n = N * N - (d2 * p * p / b2 + d * p - 1) / d2b2;
return [
pi2 * (M + Math.sqrt(m) * s),
pi2 * (N + Math.sqrt(n < 0 ? 0 : n) * Math.sign(-φ * b) * s)
]
}