Implements an image recognition captcha.

"; break; case 'admin/modules#description': case 'admin/modules/textimage': case 'admin/textimage': $output = t('Implements an image recognition captcha.'); break; } return $output; } function textimage_captchachallenge(&$form) { $form['captcha_response'] = array ( '#type' => 'textfield', '#title' => t('Captcha Validation'), '#default_value' => '', '#required' => TRUE, '#validate' => array('_captcha_validate' => array()), '#description' => t('Please type in the letters/numbers that are shown in the image above.'), '#prefix' => 'Captcha Image: you will need to recognize the text in it.', ); return $form; } function textimage_captchavalidate(&$captcha_word, &$correct) { $captcha_word = drupal_strtolower($captcha_word); if (($_SESSION['captcha'] != '') && $captcha_word == $_SESSION['captcha']) { $correct = true; } else { $correct = false; form_set_error('captcha_response', t('The image verification code you entered is incorrect.')); } } /** * Implementation of hook_menu(). */ function textimage_menu($may_cache) { $items = array(); $suffix = ''; if (arg(2)!=null) $suffix='/'.arg(2); $items[] = array( 'path' => '_textimage/image'.$suffix, 'title' => t('textimage'), 'callback' => '_textimage_image', 'access' => user_access('access textimages'), 'type' => MENU_CALLBACK ); return $items; } function textimage_perm() { return array('access textimages'); } function textimage_settings() { $fonts_path = variable_get("textimage_fonts_path", ""); $images_path = variable_get("textimage_images_path", ""); //check for GD if (!function_exists(imagecreate)) drupal_set_message(t('Image library not available. Textimage needs the GD library extension to be installed. Please install GD.')); //check for TTF support elseif (!function_exists(imagettftext)) drupal_set_message(t('Your image library does not seem to have TrueType font support. Textimage will work, but will use the default inbuilt font.'),'status'); //check for valid font path elseif ($fonts_path!="" && !is_dir($fonts_path)) drupal_set_message(t('The current font path is invalid. The default font will be used.')); //check for valid image path if ($images_path!="" && !is_dir($images_path)) drupal_set_message(t('The current images path is invalid. No images will be used.')); //Fonts settings $form['fonts'] = array( '#type' => 'fieldset', '#title' => t('Fonts settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['fonts']['textimage_use_only_upper'] = array( '#type' => 'checkbox', '#title' => t('Use only Uppercase'), '#default_value' => variable_get('textimage_use_only_upper',0) ); $form['fonts']['textimage_fonts_path'] = array( '#type' => 'textfield', '#title' => t('TrueType Fonts Path'), '#default_value' => $fonts_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the Truetype (.ttf) fonts are stored. If you do not provide any fonts, the module will use the default font for text. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['fonts']['textimage_font_size'] = array( '#type' => 'textfield', '#title' => t('Font Size'), '#default_value' => variable_get('textimage_font_size',24), '#size' => 5, '#maxlength' => 2, '#description' => t('Font size of Captcha text (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_font_size")), ); $form['fonts']['textimage_char_spacing_max'] = array( '#type' => 'textfield', '#title' => t('Character Spacing'), '#default_value' => variable_get('textimage_char_spacing_max',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the kerning between letters in Captcha. Higher numbers indicate more spacing.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_spacing_max")), ); $form['fonts']['textimage_char_jiggle_amount'] = array( '#type' => 'textfield', '#title' => t('Character Jiggle'), '#default_value' => variable_get('textimage_char_jiggle_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of up and down movement in the Captcha letters. Higher numbers indicate more jiggling.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_jiggle_amount")), ); $form['fonts']['textimage_char_rotate_amount'] = array( '#type' => 'textfield', '#title' => t('Character Rotation'), '#default_value' => variable_get('textimage_char_rotate_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of rotation in the Captcha letters (in degrees, only works with non-default fonts).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_rotate_amount")), ); $form['fonts']['textimage_char_size_amount'] = array( '#type' => 'textfield', '#title' => t('Character Size Adjustment'), '#default_value' => variable_get('textimage_char_size_amount',2), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of variation in size between the different letters in the Captcha (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_size_amount")), ); //Image settings $form['images'] = array( '#type' => 'fieldset', '#title' => t('Image settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['images']['textimage_images_path'] = array( '#type' => 'textfield', '#title' => t('Background Images Path'), '#default_value' => $images_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the background images are stored. If you do not provide a directory, solid colors will be used. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['images']['textimage_image_noise'] = array( '#type' => 'textfield', '#title' => t('Image Noise (pixels)'), '#default_value' => variable_get('textimage_image_noise',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random pixels) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_noise")), ); $form['images']['textimage_image_lines'] = array( '#type' => 'textfield', '#title' => t('Image Noise (lines)'), '#default_value' => variable_get('textimage_image_lines',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random lines) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_lines")), ); $form['images']['textimage_image_margin'] = array( '#type' => 'textfield', '#title' => t('Image Margin'), '#default_value' => variable_get('textimage_image_margin',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Set a distance between the Captcha letters and the edges of the image.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_margin")), ); $form['info'] = array( '#type' => 'fieldset', '#title' => t('Image and font information'), '#collapsible' => TRUE, '#collapsed' => FALSE ); if (isset($fonts_path)) { $imagefontinfo .= t('Number of fonts found: ').count(_textimage_font_list()); } if (isset($images_path)) { $imagefontinfo .= '
'.t('Number of background images found: ').count(_textimage_image_list()); } $gdinfo = gd_info(); $imagefontinfo .= '
'.t('GD Version: ').$gdinfo["GD Version"]; $imagefontinfo .= '
'.t(' FreeType Support: '); $imagefontinfo .= ($gdinfo["FreeType Support"]==true) ? 'True' : 'False'; $imagefontinfo .= '
'; $form['info']['captcha_info'] = array ( '#type' => 'item', '#value' => $imagefontinfo, ); return $form; } function textimage_settings_form_validate ($form_id,$form) { //check for valid font path if ($form['textimage_fonts_path'] !="" && !is_dir($form['textimage_fonts_path'])) form_set_error('textimage_fonts_path', t('The entered font path is invalid')); //check for valid image path if ($form['textimage_images_path'] !="" && !is_dir($form['textimage_images_path'])) form_set_error('textimage_images_path', t('The entered image path is invalid')); } function _textimage_number_validate ($field,$fieldName) { if (!is_numeric($field['#value'])) { form_set_error($fieldName,t("The value for")." ".t($field['#title'])." ".t("must be a number")); } } /** * Prints an image containing a textimage code. */ function _textimage_image() { //if we don't have GD2 functions, we can't generate the image if (!function_exists('imagecreatetruecolor')) return; // Set headers header('Expires: Mon, 01 Jan 1997 05:00:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); header('Content-type: image/png'); $string = _textimage_code(); // Get truetype font list $fonts = _textimage_font_list(); // Get the background images list $images = _textimage_image_list(); // Randomization amounts: $charSpacingMax = variable_get('textimage_char_spacing_max',10); // Letter spacing max (pixels) $charSpacingMin = max($charSpacingMax*.5,0); // Letter spacing minimum (pixels) $charJiggleAmount = variable_get('textimage_char_jiggle_amount',5); // Up and down randomization (pixels) $charRotateAmount = variable_get('textimage_char_rotate_amount',5); // Character rotation amount (degrees) $charSizeAmount = variable_get('textimage_char_size_amount',2); // Character size amount (pixels) $imageRotateAmount = variable_get('captcha_image_rotate_amount',12); // Image rotation amount (degrees) // Static amounts: $charInitialSize = variable_get('textimage_font_size',24); // Initial Font $imageNoise = variable_get('textimage_image_noise',4); // Amount of noise added to image $imageLines = variable_get('textimage_image_lines',4); // Amount of noise added to image $imageMargin = variable_get('textimage_image_margin',10); // Margin around image (pixels) // write text using a truetype font if (function_exists(imagettftext) && count($fonts) > 0) { // Initialize variables for the loop $characterDetails = array(); // contains the final info about each character // Build a list of character settings for the captcha string for ($i=0;$i $charSize, "angle" => $charAngle, "x" => $x, "y" => $y, "color" => $foreground, "font" => $font, "char" => $char ); // Increment the image size $imageWidth = $x + $charWidth; $imageHeight = max($imageHeight,$y+$charJiggleAmount); } // Create the image based off the string length and margin if (count($images) > 0) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Specify colors to be used in the image $foreground = imagecolorallocate($im, rand(0, 80), rand(0, 80), rand(0, 80)); foreach($characterDetails as $char) { // draw character imagettftext($im,$char['size'],$char['angle'],$char['x']+$imageMargin,$char['y']+$imageMargin,$foreground,$char['font'],$char['char']); } } else { // write text using a built-in font $x = 0; $y = 0; $imageWidth = 60 + drupal_strlen($string)*$charSpacingMax*.35; $imageHeight = 30 + $charJiggleAmount; // Create the image if (count($images) > 0 && function_exists(imagecolorallocatealpha)) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth, $imageHeight); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth, $imageHeight); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Add the text for ($i=0;$i 0) { // Prepare a larger image with a background image $im2 = _textimage_create_transparent_image($imageWidth, $imageHeight); } else { // Prepare a larger image with a solid color $im2 = imagecreatetruecolor($imageWidth, $imageHeight); imagefill($im2, 0, 0, $background); } $result = imagecopyresampled ($im2, $im, $imageMargin, $imageMargin, 0, 0, $imageWidth, $imageHeight, imagesx($im), imagesy($im)); $im = $im2; } // strikethrough imageline($im, rand(0, 120), rand(0, 120), rand(0, 120), rand(0, 120), $foreground); // Add Noise for ($x=0; $x<$imageWidth; $x++) { for ($row=0; $row<$imageNoise;$row++) { $y = rand(0,$imageHeight); imagesetpixel($im, $x, $y, $noisecolor); } } // Add Lines and Ellipses for ($x=0; $x<$imageLines;$x++) { imageline($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); imageellipse($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); } // Fill image with a random background image if available if (count($images) > 0) { $image = $images[rand(0,count($images)-1)]; _textimage_apply_background_image($im,$image); } //output to browser imagepng($im); imagedestroy($im); } /** * Returns a random string for use in a captcha */ function _textimage_code() { $consts='bcdgjxvmnprst'; $vowels='aeiou'; for ($x=0; $x < 6; $x++) { mt_srand ((double) microtime() * 1000000); $const[$x] = drupal_substr($consts,mt_rand(0,drupal_strlen($consts)-1),1); $vow[$x] = drupal_substr($vowels,mt_rand(0,drupal_strlen($vowels)-1),1); } $string = $const[0] . $vow[0] .$const[2] . $const[1] . $vow[1] . $const[3] . $vow[3] . $const[4]; $string = drupal_substr($string,0,rand(4,6)); //everytime we create a new code, we write it to session $_SESSION['captcha'] = drupal_strtolower($string); if(variable_get('textimage_use_only_upper',0)) $string = drupal_strtoupper($string); return $string; } /** * Returns an array of files with TTF extensions in the specified directory. */ function _textimage_font_list() { $fontdir = variable_get("textimage_fonts_path", ""); $filelist = array(); if (is_dir($fontdir) && $handle = opendir($fontdir)) { while ($file = readdir($handle)) { if (preg_match("/\.ttf$/i",$file) == 1) $filelist[] = $fontdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Returns an array of files with jpg, png, and gif extensions in the specified directory. */ function _textimage_image_list() { $imagesdir = variable_get("textimage_images_path", ""); $filelist = array(); if (is_dir($imagesdir) && $handle = opendir($imagesdir)) { while ($file = readdir($handle)) { if (preg_match("/\.gif|\.png|\.jpg$/i",$file) == 1) $filelist[] = $imagesdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Overlays an image to the supplied image resource */ function _textimage_apply_background_image (&$imageResource,$imageFile) { $backgroundResource = image_gd_open($imageFile,substr($imageFile,-3)); // Copy the text onto the background $backX = imagesx($backgroundResource); $backY = imagesy($backgroundResource); $textX = imagesx($imageResource); $textY = imagesy($imageResource); $randomBackX = rand(0,$backX-$textX); $randomBackY = rand(0,$backY-$textY); // Place the text onto a random location of the background image imagecopyresampled($backgroundResource,$imageResource,$randomBackX,$randomBackY,0,0,$textX,$textY,$textX,$textY); // Crop the background image to the original image size imagecopyresampled($imageResource,$backgroundResource,0,0,$randomBackX,$randomBackY,$textX,$textY,$textX,$textY); } /** * Creates transparent image resources for images with graphic backgrounds */ function _textimage_create_transparent_image($x, $y) { $i = imagecreatetruecolor($x, $y); $b = imagecreatefromstring(base64_decode(_text_image_blankpng())); imagealphablending($i, false); imagesavealpha($i, true); imagecopyresized($i, $b ,0 ,0 ,0 ,0 ,$x, $y, imagesx($b), imagesy($b)); return $i; } function _text_image_blankpng() { $c = "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m"; $c .= "dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADqSURBVHjaYvz//z/DYAYAAcTEMMgBQAANegcCBNCg"; $c .= "dyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAAN"; $c .= "egcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQ"; $c .= "oHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAA"; $c .= "DXoHAgTQoHcgQAANegcCBNCgdyBAgAEAMpcDTTQWJVEAAAAASUVORK5CYII="; return $c; } ?> Колонка редактора - Май | Odesskiy Listok

Колонка редактора - Май

user warning: Table './odessapage/cms_sessions' is marked as crashed and last (automatic?) repair failed query: SELECT COUNT(sid) AS count FROM cms_sessions WHERE timestamp >= 1555980615 AND uid = 0 in /home/hepa/public_html/new/includes/ on line 121.

Дорогие земляки!
В этом месяце на редакцию обрушился шквал читательских звонков, затрагивающих, в основном, две темы. Первая: «Почему до сих пор нет газеты?», а о второй мы поговорим немного позже.
Все, что мы могли ответить, – что отправили газету в срок. Но в связи с внутренними изменениями в почтовой системе на почте у нас отказались принять наши конверты, как письма (letters). Мол, они слишком толстые (хотя они были той же толщины, что и в предыдущие месяцы), не проходят в отверстие для автоматической сортировки, и почтовым работникам приходиться сортировать их вручную. Единственным выходом было, заплатив в полтора раза больше, отправить газеты, как бандероли (flats). Что мы и сделали, а потом долго звонили на почту с тем же вопросом, что и наши читатели: Ну и где же газеты? На что нам отвечали: Ждите, срок доставки мы не гарантируем. Вероятно, на этот раз их сортировали уже не руками, а ногами…
Первые звонки от читателей, получивших, наконец, газету, стали поступать через две с половиной недели после отправки. Но, насколько нам известно, некоторые не получили газету до сих пор. Так что если вы держите в руках этот номер, а предыдущий (№ 148) так до вас и не дошел, позвоните, пожалуйста, в редакцию, и мы по вашему желанию либо вышлем вам его повторно, либо продлим вашу подписку на месяц.
Как многие из вас, наверное, заметили, в этом месяце газета пришла в другом конверте. Эти конверты мы заказали по рекомендации почты. Надеемся, что это помогло решить возникшую проблему, и газеты будут доставляться бесперебойно, как раньше. Конечно, нельзя гарантировать, что через некоторое время «изощренные умы» почтовых работников не придумают что-нибудь новенькое, но будем надеяться на лучшее и решать проблемы по мере их поступления.
Одной из таких проблем является очередное (второе за последние полтора года) предстоящее 6-го мая повышение почтовых тарифов. Это, в совокупности с более высокой стоимостью конвертов, заставляет нас пойти на не очень популярную меру – повысить в ближайшее время цену подписки. Так что желающие подписаться – поторопитесь, потом будет дороже.
Теперь о других звонках, поступивших от наших читателей, – тех, кто газету получил. Они касались информации, размещенной в колонке редактора об ужасных событиях, произошедших с памятником Дюку де Ришелье. Эта информация никого не оставила равнодушным: одни хохотали, другие на нас кричали, третьи говорили, что за такие шуточки нас надо сослать а Крыжополь, четвертые жаловались, что с перепугу звонили в Одессу…
Дорогие читатели! Пожалуйста, не беспокойтесь – с Дюком все в порядке. Это была первоапрельская шутка. Мы не хотели никого обидеть или огорчить, все, чего нам хотелось, – продолжить славную традицию первоапрельской «утки».
Ежегодно в СМИ 1 апреля появляются шутки и розыгрыши, есть такие, жертвами которых становятся тысячи людей. В прессе газетная «утка» впервые появилась 1 апреля 1708 года. Джонатан Свифт под псевдонимом опубликовал альманах предсказаний, где наврал, что известный астролог Партридж умрет ровно через год. Через год Свифт сообщил, что так и случилось (хотя Партридж был жив и замучился убеждать всех, что не умер). С тех пор газеты и журналы радостно ухватились за возможность подурачиться. И теперь каждый год первого апреля люди, как говорил Марк Твен, «вспоминают, кто они такие все остальные 364 дня в году».
Один из самых «крутых» розыгрышей во Франции относится к 1 апреля 1986 года, когда на страницах газеты «Паризьен» появилось сообщение о решении парижского муниципалитета разобрать Эйфелеву башню и перенести ее в долину реки Марны, в тридцати километрах от столицы. В сообщении были подробно описаны работы по демонтажу башни с помощью вертолетов американской морской пехоты, технические расчеты по сборке и подъему, сроки осуществления проекта. Расстроенные парижане осаждали редакцию, телефоны надрывались от звонков. Лишь на следующий день газета остудила страсти, уведомив своих читателей, что все это – первоапрельская шутка.
Другая первоапрельская шутка была разыграна в программе «Панорама», показанной на английском канале Би-Би-Си в 1957 году. В одном из сюжетов рассказывалось об успехе швейцарских селекционеров, выведших сорт дерева, на котором растут макароны. На центральный офис Би-Би-Си обрушился шквал телефонных звонков от жителей Великобритании, желающих приобрести макаронное дерево.
Самым удачным норвежским первоапрельским розыгрышем считается объявление, данное в газете Bergens Tidene 31 марта 1987 года. Объявление гласило, что на следующий день через систему государственной винной торговли Vinmonopolet будет бесплатно распространяться конфискованная алкогольная продукция. Единственное требование к желающим получить бесплатно спиртные напитки состояло в том, что они должны были прийти в магазины со своей тарой. 1 апреля перед открытием магазинов Vinmonopolet выстроились огромные очереди из желающих получить бесплатный алкоголь людей, принесших с собой пустые бутылки, фляги и даже канистры.
В 1980 году BBC сообщила, что лондонский Биг Бен будет модернизирован, его циферблат, якобы, в скором времени будет заменен электронным. Японская служба BBC добавила, что стрелки часов будут проданы первым четырем счастливчикам, дозвонившимся в студию. Реакция не заставила себя ждать: один японский рыбак, находившийся где-то посреди Атлантики, немедленно заявил по рации о своей готовности участвовать в акции.
Китайские СМИ однажды пошутили над одним из самых животрепещущих законов для общества — в 1993 г. «Китайская молодежная газета» написала о том, что правительство решило освободить кандидатов наук от существующего в стране запрета иметь в семье больше одного ребенка. Несмотря на то, что прямо под статьей газета поместила опровержение, где разъяснялось, что это первоапрельская шутка, сообщение на полном серьезе повторили гонконгская газета «New Evening News» и международное информационное агентство «Agence France-Presse». Кстати, после этой истории, китайские власти заклеймили первое апреля как опасную западную традицию, а китайские СМИ расписали чрезвычайно вредное влияние «Дня Лжеца».
Были и «пророческие» шутки – в 1962 году в Швеции был всего один телевизионный канал, при этом черно-белый. В одном из выпусков новостей выступил технический специалист канала, который сообщил, что благодаря новой технологии все зрители могут быстро и легко сделать так, что их телевизоры станут цветными. Все, что нужно для этого, — натянуть нейлоновый чулок поверх телеэкрана. Как ни странно, сотни телезрителей так и поступили, но (на удивление!) это не сработало. А ровно через 8 лет первоапрельская шутка сбылась: 1 апреля 1970 года в Швеции появилось цветное телевидение…
Разумеется, шутить, смеяться, подтрунивать друг над другом можно и в любой другой день, можно и каждый день. Но разыграть кого-нибудь 1 апреля – это уже святое дело, особенно – для одесситов. Предлагаю всем нашим читателям придумать и прислать в редакцию свой вариант веселого первоапрельского розыгрыша. Лучшие шутки мы опубликуем в апрельском номере следующего года.
Пожелаем друг другу как можно чаще смеяться, радоваться веселым розыгрышам и шуткам. Ведь смех – это полезная штука. Мы смеемся: а значит, еще живем.



What about English?

All articles appear only in the language that they were submitted to us.

Смех -

Смех - действительно полезная штука и смеющийся человек - значит живущий. Поэтому первоапрельская шутка редакции очень уместна. Одесситы сразу же поняли её (шутку) и кто улыбался, кто хохотал. А некоторые были вынуждены с трудом успокаивать взволнованных не одесситов, доказывая им, что в газете пошутили.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <p> <br> <tr> <td> <table>
  • Lines and paragraphs break automatically.
  • Images can be added to this post.
More information about formatting options