';
$svg .= '';
// 3–5 шумовых кривых (кубические Безье через всё поле).
$curves = random_int(3, 5);
for ($i = 0; $i < $curves; $i++) {
$x1 = random_int(-10, 30);
$y1 = random_int(0, 60);
$x2 = random_int(60, 140);
$y2 = random_int(0, 60);
$x3 = random_int(170, 210);
$y3 = random_int(0, 60);
$color = $palette[random_int(0, count($palette) - 1)];
$width = random_int(1, 2);
$svg .= '';
}
// Glyph'ы: случайные поворот, сдвиг и размер каждого символа.
for ($i = 0; $i < 5; $i++) {
$x = 22 + $i * 36 + random_int(-4, 4);
$y = random_int(34, 44);
$angle = random_int(-25, 25);
$size = random_int(26, 34);
$color = $palette[random_int(0, count($palette) - 1)];
$svg .= ''
. $code[$i] . '';
}
$svg .= '';
header('Content-Type: image/svg+xml');
if (getenv('GOLEARN_TEST') === '1') {
// Только тестовый режим: отладочная выдача кода smoke-тесту.
header('X-Captcha-Debug: ' . $code);
}
echo $svg;
} catch (Throwable $e) {
error_log('captcha: ' . $e->getMessage());
error_out(500, 'internal');
}