Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AkelPad (часть 2)

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

Открыть новую тему     Написать ответ в эту тему

gyra

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
 AkelPad
текстовый редактор с открытым исходным кодом, созданный, чтобы быть маленьким и быстрым
Авторы: Шенгальц А. А. (aka Instructor; версии 3–4); Кузнецов А. И. (версии 1–2)

Последний релиз: 4.9.8 от 18 июля 2016


Скачать
Программа 4.9.8 многоязычный инсталлятор: x86 | x64; zip русской версии: x86 | x64; zip английской версии: x86 | x64    
Плагины полный авторский комплект: x86 | x64    
Скрипты авторская подборка: Instructor | KDJ | VladSh | Infocatcher    
Синтаксические файлы авторские дополнения к комплектным: akelpad.sf.net    
Шрифты авторская модификация для использования с плагином Fonts.dll: akelpad.sf.net    
Обновления авторская утилита AkelUpdater v6.8

Дополнения от сообщества
Программа Неофициальная компиляция из последних исходников 4.9.9 r4435 от 13.11.2023    
Плагины SpellCheck: проверка орфографии на движке Hunspell, подробнее. Автор: random6_2020. Скачать: x64 (1.3.0.4) | x86 (1.3.0.5) | исходники    
TagsView: разбор исходного кода при помощи ctags, подробнее: akelpad.sf.net | github. Автор: DV. Скачать: 0.5b github | sf.net    
Скрипты akelpad.sf.net | Infocatcher :: github | DV :: github | AZJIO | Andrey_A_A    
Синтаксические файлы • подборки: Lenchik & Skif_off | cuprum | Infocatcher :: github | VladSh | Andrey_A_A    
единым списком по расширениям (включая авторские)    
Утилиты ShellExt: пункт в контекстное меню проводника, подробнее. Автор: Ralph Shane. Скачать: 4.8.3.0    
Help: вызов справки с поиском выделенного текста, подробнее. Автор: AZJIO. Скачать: YaD    
AnotherFileNearby: создание слепка редактируемого файла, подробнее. Автор: AZJIO. Скачать: YaD    
Цветовые темы Atom One Dark Pro    
Сборки местная коллекция    
в составе сборок часто содержатся скрипты и синтаксические файлы, не имеющие самостоятельных ссылок, и потому не перечисленные в шапке

Помощь
Справка из исходников | FAQ 1 | FAQ 2
Справка от AZJIO
Coder-файл: справочные комментарии на русском языке
Установка AkelPad 4 на Windоws 7 с заменой Блокнота Windows

Всего записей: 7932 | Зарегистр. 18-02-2006 | Отправлено: 22:03 10-07-2017 | Исправлено: yozhic, 13:27 20-02-2024
Andrea



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обратил внимание, что AkelPad в некоторых случаях полагает, что строки в простом текстовом файле являются дублирующимися, хотя идентичными (по крайней мере визуально) они не являются. Получилось так, что в обычном txt-файле, сохранённом в кодировке UTF-16 LE, я выделил два списка, в которых построчно были перечислены строчные и заглавные буквы греческого алфавита - выше шёл список строчных букв, ниже - заглавных (каждая буква на отдельной строке). Так вот: при команде "Удалить дублирующиеся строки" редактор удалял заглавные греческие буквы, а строчные оставлял. Аналогичным образом выдавал результаты при других командах - получить уникальные строки / получить дублирующиеся строки. Невероятно, но факт - ведь греческие строчные и заглавные буквы имеют совершенно разные начертания. Проверял в версии 4.9.8 на Win 7x32

Всего записей: 1087 | Зарегистр. 24-12-2015 | Отправлено: 12:17 05-06-2020 | Исправлено: Andrea, 12:49 05-06-2020
yozhic



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrea
Это плагин Format. Просто единичку поставьте в строке вызова из меню:

Код:
"Remove Duplicate Lines" Call("Format::LineRemoveDuplicates", 1)

Подробнее в справке по плагину:
Call("Format::LineRemoveDuplicates", 1)
  Параметры:
    1
      Учитывать регистр символов.
...
Call("Format::LineSortStrAsc", FLAGS)
  Параметры:
    FLAGS (сумма членов):
      1  Учитывать регистр символов.
      2  Учитывать локализацию (медленнее).
      По умолчанию: 0.

 
Добавлено:
Но, кстати, спасибо, что обратили внимание. Я раньше туда не вглядывался, а теперь и у себя поправил.
 
Добавлено:
Andrea
И есть ещё скрипт SortLines от KDJ с дополнительными возможностями по фильтрации строк (в том числе и операций с дубликатами).

Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 12:41 05-06-2020 | Исправлено: yozhic, 12:43 05-06-2020
Andrea



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yozhic

Цитата:
Просто единичку поставьте в строке вызова из меню

А где находится строка вызова плагина "Format"? При клике по нему в плагинах он не вызывается (точнее, не предоставляет доступ к своим настройкам). Редактировать его настройки нужно в меню ContextMenu::Main? (у меня стоит официальная версия AkelPad - не сборка)

Всего записей: 1087 | Зарегистр. 24-12-2015 | Отправлено: 13:42 05-06-2020 | Исправлено: Andrea, 14:09 05-06-2020
yozhic



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrea
Щёлкните мышкой по строке меню "Удалить дублирующиеся строки" при зажатой клавише Ctrl (где бы ни находилась у вас эта строка, сейчас это не имеет значения, но где-то она у вас должна быть, поскольку вы писали, что вызывали эту команду). У вас откроется окошко плагина ContextMenu и в нём будет выделена нужная вам строчка. Добавляете там единичку.

Цитата:
у меня стоит официальная версия AkelPad - не сборка

Тут, наверное, неплохо было бы уточнить значения терминов. Но не в этом суть. Интересно, с того момента, когда пользователь начинает менять настройки в программе, как программу правильней называть «официальная версия» или «сборка»? Я, к примеру, скачал официальную версию, а потом читал справку и менял те настройки, которые меня заинтересовали.
 
Добавлено:
По ContextMenu::Main открывается окно настроек плагина ContextMenu. Но там ещё есть выпадающий список с 6ю пунктами выбора. Поэтому я не стал всё это расписывать, это много и можно прочитать самостоятельно в справке к плагину. Инструкция выше должна быть рабочей в любом случае.

Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 14:56 05-06-2020 | Исправлено: yozhic, 15:04 05-06-2020
Andrea



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yozhic
Теперь понятно, как вызывать настройки конкретного пункта, не копаясь в ContextMenu::Main. Пока решил ничего не менять - просто на будущее буду знать, что может быть такое, о чём я написал выше. Ведь может быть полезен и один вариант настройки, и другой (в зависимости от конкретной задачи). Тем более, что в
Код:
"Получить уникальные строки" Call("Format::LineGetUnique")
"Получить дублирующиеся строки" Call("Format::LineGetDuplicates")
возможно тоже понадобится поставить единички аналогично "Format::LineRemoveDuplicates", 1
Цитата:
«официальная версия» или «сборка»  

Просто в сборках их авторы нередко переносят пункты в другие места и различные подменю, и найти их порой бывает затруднительно, особенно когда привыкаешь к стандартному интерфейсу

Всего записей: 1087 | Зарегистр. 24-12-2015 | Отправлено: 15:33 05-06-2020 | Исправлено: Andrea, 15:40 05-06-2020
yozhic



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrea (пост)
Цитата:
может быть полезен и один вариант настройки, и другой

Согласен. Как вариант, если потребуется регулярно пользоваться и тем, и другим вариантом, можно добавить дополнительные строчки:

Код:
"Получить уникальные строки" Call("Format::LineGetUnique")
"Получить дублирующиеся строки" Call("Format::LineGetDuplicates")
SEPARATOR
"Получить уникальные строки (с учётом регистра)" Call("Format::LineGetUnique", 1)
"Получить дублирующиеся строки (с учётом регистра)" Call("Format::LineGetDuplicates, 1")

 
Добавлено:

Цитата:
авторы нередко переносят пункты

Если автор вежлив, то о таком переносе обязательно упомянет ))

Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 15:41 05-06-2020
AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yozhic
Кстати, у нас разное понятие "Уникальные строки", мне пришлось тестить, чтобы понять, что под этим подразумевает автор. В моей сборке я назвал их в своём понимании и значки дорисовал, чтобы было понятно что отсекается. Автор подразумевает уникальность строк в исходном тексте,  я подразумеваю в результате. То есть когда строка в исходном имеет дубликат значит она не уникальна  и удаляется вместе с дубликатами, но она могла бы стать уникальной после удаления её дубликатов, то есть она становится не похожа ни на какую строку и становится уникальна. То есть я хочу получить по одной копии всех строк, а по итогу получал потерю некоторых строк навсегда. По сути пункт "Удалить дубликаты" и "Уникальные строки" для меня означает одно и тоже.
 
Andrea
Для сравнения строк попробуй мою прогу. Когда кажется что уже можно ограничится AkelPad и вдруг необходимо подсчитать дубликаты и сортировать по частоте и использования и вдруг опять нужна своя прога. Можно подсчитать даже количество слов или частота использования, понятие строка там условное, оно определяется пользователем, если надо разделителем указать пробел, то уже подсчитываются слова, если точка, то количество предложений, причём возврат слов можно вывести именно в многострочный текст, одно слово - одна строка.

Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 16:34 05-06-2020 | Исправлено: AZJIO, 16:46 05-06-2020
YuS 2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gyra

Цитата:
Никто не в курсе, как сделать, чтобы при выборе нужного шрифта, ставилась галка? С помощью SET(128, If... или ещё как?

Да, только так и можно, если это не стандартная команда, в которой уже "зашит" триггер...
Т.е. необходимо определиться с выражением, по результату которого и будет выставляться птица.
Подсказка: сам метод Font, возвращает ноль.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 16:57 05-06-2020
Andrea



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZJIO
Compare strings и Compare_dir уже давно в моей коллекции - иногда пользуюсь.. Хотел бы спросить, нет ли в AkelPad возможности подсветки одинаковых / однокоренных слов - не при выделении, а просто одинаковых? Примерно так, как это реализовано в старой доброй программе "Свежий взгляд". Временами нужно, чтобы такие слова выделялись среди прочих без необходимости прибегать к поиску с использованием регулярок, в которых я не силён. Например, имеется очень длинный построчный список типа
Код:
#FFFFFF - White (белый)
#000000 - Black (чёрный)
#FFFFFF - белый
#000000 - чёрный
#FFFFFF -- белый
#FFFFFF
#000000
Такие строки дубликатами в прямом смысле не являются, однако лишние не нужны. Когда список небольшой, одинаковые слова видно сразу. Но если большой, то найти и удалить все такие "дубликаты" очень даже проблематично, не затратив для этого кучу времени. Более того, опция подсветки одинаковых / однокоренных слов очень бы пригодилась при составлении стилистически грамотных текстов
 
Добавлено:

Цитата:
"Уникальные строки"  

Кстати, если в нескольких "дублирующихся" строках после них имеются разное кол-во пробелов, AkelPad не считает их клонами. Поэтому, перед тем как запускать функцию, я чищу текст от мусора - удаляю все табы/пробелы в концах и началах строк

Всего записей: 1087 | Зарегистр. 24-12-2015 | Отправлено: 17:07 05-06-2020 | Исправлено: Andrea, 17:57 05-06-2020
AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrea
Тогда надо учить программирование. В данном случае я бы сделал связанный список, захвалил бы от начала строк 7 символов используя как ключ, которому бы присвоил  строку как параметр, при добавлении ключа проверил есть ли ключ в списке, то есть семизначное число, если есть, то перешёл к следующей строке. И так получился бы список, в котором дубликатность определяется по началу строки, потом соединил бы параметры ключей в сплошной текст, вот и получилось бы. Но каждая задача не бывает одинаковой и в ней надо искать именно составление алгоритма. Так что косвенным примером не придумать универсальный инструмент. Я использовал описание объекта Scripting.Dictionary, его можно использовать в AutoIt3 (по ссылке), он также используется в JS, в справке wsh.chm -> Script Runtime\Dictionary Object. В PureBasic аналог Map.

Цитата:
Временами нужно, чтобы такие слова выделялись среди прочих без необходимости прибегать к поиску с использованием регулярок, в которых я не силён.
Подсветка тоже эффективнее на рег.выр., всё равно придётся учить. Причём это упростит часть задач, но не всё можно сделать рег.вырами. Но не думаю что это сделано рег.вырами. Проще найти список корней, разделить текст на слова (список слов), потом прогнать поиск корней (каждого корня) по списку слов, получить списки однокоренных слов, как только у слова появляется аналог, то создаётся список от 2-х и более слов. Потом искать точное слово по тексту. Можно усложнить-упростить получив позиции слов сразу красить по позициям. Но это говорить легко, на каждую хотелку надо тратить уйму времени, если я с этого получаю только трату времени то не возьмусь, а то что мне интересно я делаю.
 
VSHY

Цитата:
Сделайте уж, чтобы можно было делать разные наборы! То ли в одном ini, то ли в разных, - не принципиально.

Я пока переводил WinAPI примеры наткнулся на практически готовое, но времени пока нет. То есть можно добавить параметр который будет вызывать меню, а пункты меню определяются количеством добавленных правил замены. Так что логически понятно как делать. Но я предложил сразу практический вариант, вы же не пользуетесь транслитерацией, она нужна только иностранным диссидентам, чтобы на англоязычной клаве писать буквы и конвертировать в итоге в русские, а так как это бесполезная фича, то зачем мне напрягаться если эта возможность у вас есть, вы уже можете это сделать хоть сейчас, а я буду добавлять, когда будет интерес и время.
 
Andrea

Цитата:
AkelPad не считает их клонами.
это правильно. При учитывании регистра вообще происходит бинарное сравнение - совпадение нолей и единиц, так что там нет пост-обработки, текст сравнивается как есть.

Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 17:50 05-06-2020 | Исправлено: AZJIO, 18:15 05-06-2020
gyra

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS 2
Цитата:
Т.е. необходимо определиться с выражением, по результату которого и будет выставляться птица.  
Вот и хотелось бы увидеть пример этого выражения, если это возможно.

Всего записей: 7932 | Зарегистр. 18-02-2006 | Отправлено: 18:48 05-06-2020
VSHY

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZJIO
Цитата:
То есть можно добавить параметр который будет вызывать меню, а пункты меню определяются количеством добавленных правил замены. Так что логически понятно как делать.

У меня уже реализована автогенерация меню)
Пример (хоть далеко и не единственный) - строка запуска:
Код:
"Запрос шаблона для упаковки..." Call("Scripts::Main", 1, "pack7zip.js")

Там внутри вызывается мой ShowMenuEx.js, и дальше такая красота!..))
Все настройки в json-файлах. Раньше пользовался ini, но потом почти полностью перешёл на json, т.к. там много чего можно настроить. В моей сборке есть примеры, как это всё работает, и с json, и с ini - все настройки лежат в ...\Scripts\Params\.
Обещал когда-то на официальном форуме примеры подробнее расписать, но всё руки не доходят...

Всего записей: 1090 | Зарегистр. 19-05-2008 | Отправлено: 19:13 05-06-2020 | Исправлено: VSHY, 19:17 05-06-2020
YuS 2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gyra

Цитата:
Вот и хотелось бы увидеть пример этого выражения, если это возможно.

Сам я не экспериментировал с меню, но получить значение переменной, содержащей цифровое значение текущего шрифта, можно через SendMessage, примерно так:

Код:
var hMWnd = AkelPad.GetMainWnd();
var hFont = AkelPad.SendMessage(hMWnd, 1231 /*AKD_GETFONT*/, 0, 0);

поэкспериментируйте...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:49 05-06-2020
yozhic



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS 2
hFont возвращает хэндл "-385216755". Можно при помощи хэндла теперь узнать FontName и FontSize?

Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 19:53 05-06-2020 | Исправлено: yozhic, 20:01 05-06-2020
YuS 2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yozhic

Цитата:
Можно при помощи хэндла теперь узнать FontName и FontSize?

Сильно тему не штудировал, но скорее всего, как-то можно... но зачем?
Для задачи достаточно получить хэндлы шрифтов из меню и далее:
Если не равно, то взводим птицу и включаем необходимый шрифт, если равно - снимаем птицу и включаем стандартный шрифт... как-то так.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:18 05-06-2020
yozhic



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS 2
Так, хэндлы же меняются при каждом перезапуске. Или я чего-то недопонимаю...
gyra
Если у вас получится, отпишитесь, пожалуйста, как сделали. Мне тоже интересно.

Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 20:55 05-06-2020
YuS 2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yozhic

Цитата:
Так, хэндлы же меняются при каждом перезапуске.


Код:
var hMainWnd    = AkelPad.GetMainWnd();
var hWndEdit    = AkelPad.GetEditWnd();
var lpLogFont   = AkelPad.MemAlloc(92 /*sizeof(LOGFONTW)*/);
AkelPad.SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, hWndEdit, lpLogFont);
var pFontName   = AkelPad.MemRead(_PtrAdd(lpLogFont, 28) /*offsetof(LOGFONTW, lfFaceName)*/, 1 /*DT_UNICODE*/);
WScript.Echo(pFontName);

 

Цитата:
AKD_GETFONT, AKD_GETFONTA, AKD_GETFONTW
___________  ____________  ____________
Get font.
(HWND)wParam      == edit window, NULL for current edit window.
(LOGFONT *)lParam == pointer to a LOGFONT structure. Can be NULL.
Return Value
 HFONT handle. If wParam is NULL and no frame windows exist, then returned last collected font handle.
Example:
 See AKD_SETFONT example.
AKD_SETFONT, AKD_SETFONTA, AKD_SETFONTW
___________  ____________  ____________
Set font.
(HWND)wParam      == edit window, NULL for current edit window.
(LOGFONT *)lParam == pointer to a LOGFONT structure.
Return Value
 TRUE   success.
 FALSE  failed.
Example (Unicode):
 LOGFONTW lfFont;
 SendMessage(pd->hMainWnd, AKD_GETFONTW, (WPARAM)NULL, (LPARAM)&lfFont);
 lfFont.lfHeight-=2;
 lstrcpynW(lfFont.lfFaceName, L"Courier New", LF_FACESIZE);
 SendMessage(pd->hMainWnd, AKD_SETFONTW, (WPARAM)NULL, (LPARAM)&lfFont);

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:09 05-06-2020 | Исправлено: YuS 2, 21:21 05-06-2020
yozhic



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS 2
   Эх, я так не умею. Теперь понятно.
 
Добавлено:
Про AKD_GETFONT то в AkelDLL.h я читал, и lstrcpynW видел, а вот как оттуда данные достать — это знать надо. Я не знал.

Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 21:22 05-06-2020
YuS 2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yozhic

Цитата:
Эх, я так не умею.

Всё уже придумано до нас
http://akelpad.sourceforge.net/forum/viewtopic.php?p=18278#18278

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:47 05-06-2020
Andrea



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZJIO

Цитата:
разное понятие "Уникальные строки",  

Цитата:
когда строка в исходном имеет дубликат значит она не уникальна  и удаляется вместе с дубликатами,

Пожалуйста, поясните. Ради интереса я создал 10 абсолютно одинаковых строк. Результат, который выдал AkelPad: кол-во уникальных строк - 0; кол-во дубликатов - 10. После команды "Удалить дублирующиеся строки" осталась лишь одна строка, которая и стала в уникальной. Считаю, что так и должно быть. А вы пишите, что когда строка в исходном файле имеет дубликат, то "она удаляется вместе с дубликатами".

Цитата:
По сути пункт "Удалить дубликаты" и "Уникальные строки" для меня означает одно и тоже.  

Из примера, который я привёл, следует, что это не одно и то же, поскольку если бы было одно и то же, то из файла бы удалились 10 строк (то есть, все). Поэтому не вполне понятно, каким образом вы могли потерять важные для вас единичные строки - вероятно вы нажали кнопку "Получить уникальные строки" вместо "Удалить дублирующиеся строки".

Всего записей: 1087 | Зарегистр. 24-12-2015 | Отправлено: 01:01 06-06-2020 | Исправлено: Andrea, 01:24 06-06-2020
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

Компьютерный форум Ru.Board » Компьютеры » Программы » AkelPad (часть 2)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru