Объединение печатных плат с gerbmerge

    Мы — небольшой стартап, который занимается разработкой современной электроники. Разумеется, мы регулярно делаем тестовые партии небольшого размера, для изготовления которых заказывать полноценное производство не имеет смысла — стоимость подготовки будет самой крупной статьёй бюджета. Поэтому мы регулярно придумываем, как быстрее, дешевле и эффективнее собирать эти партии самостоятельно. Иногда в процессе рождается что-то новое или допиливается что-то старое. Результатом мы и будем с вами периодически делиться.

    Один из способов снизить себестоимость изготовления печатных плат — это объединение нескольких плат на одной заготовке и отправка на фабрику этой заготовки как единого проекта. Фокус в том, что серьёзные фабрики берут деньги за подготовку производства каждой платы, а ориентированные на DIY китайцы часто предлагают (Seeedstudio, например) фиксированную цену за фиксированный размер текстолита. В первом случае единый проект, даже если он в итоге разрезается на несколько плат, будет считаться как одна плата, а во втором — можно вместить на одну стандартную заготовку несколько небольших плат.

    Кроме того, объединение плат удобно, если вы делаете фиксированные комплекты — например, у вас в проекте один управляющий модуль и четыре исполнительных; в таком случае банально удобно положить их на одну заготовку и всегда заказывать именно таким комплектом.

    У нас в данном случае было и то, и другое — и комплект, и желание сэкономить на производстве пробной партии.



    Это — один проект. В нём 32 платы 13 разных видов. Как собрать такой проект за четверть часа — ниже.

    Как ни удивительно, но попытка найти готовый и хотя бы относительно доступный софт для такой операции довольно быстро доводит человека до депрессии — после первого пяточка сайтов, предлагающих позвонить по указанному номеру телефона для получения индивидуального предложения по цене. Проблема в том, что непосредственной работой с файлами формата Gerber RS-274X обычно занимаются фабрики, а потому и стоимость всего подобного софта — традиционная для коммерческого применения, от нескольких сотен долларов за рабочее место.

    Бюджетные же предложения либо умеют лишь размножать одну плату на много копий (в Eagle, например, это родная функция), но не собирать несколько файлов из разных проектов. либо — чаще — не умеют ничего. Из относительно дешёвого мне удалось найти лишь ViewMate Deluxe, стоящий хоть и не особо сильно, но всё же меньше $100 и умеющий редактировать герберы — вот только работа в нём местами уж очень сильно похожа на изощренную пытку.

    Помимо всего этого великолепия, есть один пакет, совершенно бесплатный — GPLv3 — и созданный ровно для этой задачи: проглотить пачку герберов от разных проектов и разместить их на одном листе.

    Это GerbMerge, скрипт на питоне. Сожрав ваши герберы, он несколько минут пытается расположить их тысячами разных способов, выбирая из них наилучший — с его точки зрения.

    GerbMerge умеет работать только с файлами формата Gerber RS-274X и Excellon, но это трудно считать недостатком — любой CAD, которым хотя бы теоретически можно пользоваться, умеет экспортировать платы в этих форматах, а любая фабрика умеет их принимать. Более того, если вы хотите максимальную гарантию результата и минимальный шанс на кривые руки фабрики — именно Gerber + Excellon, предварительно проверенные вами, и надо им отправлять.

    Я не даю сейчас ссылку на сайт GerbMerge, потому как непонятно, что считать его сайтом — судя по истории правок и копирайтов, он пару раз переходил из рук в руки с паузами в год-другой, и каждый раз оказывался заброшен. В результате, когда я попробовал его запустить, то быстро обнаружил, что:

    1. Он не устанавливается
    2. Будучи установленным, он не запускается
    3. Будучи запущенным, файлы DipTrace он не переваривает
    4. Будучи заставленным, файлы в метрических единицах он не переваривает
    5. Под Cygwin он не работает вообще
    6. Есть попытки привести в порядок установщик — в правильном направлении, но незавершённые
    7. Есть попытки привести в порядок метрические единицы — в правильном направлении, но незавершённые
    8. Все ссылки на готовые установочные пакеты под Windows вообще протухли годы тому назад


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

    А вот теперь — ссылка: github.com/unwireddevices/gerbmerge

    В версии 1.9.4, которая сейчас по данной ссылке и доступна, gerbmerge:

    • Успешно работает под Linux, Windows и Cygwin
    • Устанавливается под всеми системами штатными средствами без правки чего-либо руками
    • Понимает файлы, сгенерированные DipTrace
    • Работает и с дюймами, и с миллиметрами


    Установка GerbMerge



    GerbMerge — это скрипт на питоне, поэтому установка имеет свои особенности. Запущен он может быть на Linux и Windows (нативном и под Cygwin), теоретически также и на MacOS, но я не проверял — не на чем.

    Linux.

    Так как python, pip и gcc у вас почти наверняка уже установлены, остаётся поставить simpleparse — pip install simpleparse, а затем перейти к gerbmerge. Скачайте с гитхаба архив исходников, распакуйте, зайдите внутрь:

    python setup.py sdist
    sudo pip install dist/gerbmerge-1.9.4.tar_gz
    


    Первая команда подготовит установочный пакет под вашу систему, вторая его установит. Можно, конечно, сразу сделать sudo python setup.py install, но тогда при желании расстаться с gerbmerge или обновить его вы будете удалять его файлы ручками.

    Windows / Cygwin.

    Установите Cygwin с пакетами python, python-setuptools и gcc (последний нужен для сборки simpleparse). Скачайте архив исходников gerbmerge, распакуйте, запустите Cygwin и зайдите в каталог с исходниками.

    easy_install-x.y pip
    pip install simpleparse
    python setup.py sdist
    pip install dist/gerbmerge-1.9.4.tar_gz
    


    Первая команда (вместо x.y будет версия вашего питона, то есть, скорее всего 2.7) установит pip, остальное — так же, как в линуксе.

    Windows нативный.

    Скачайте инсталяшку питона под вашу систему и установите его — по умолчанию он ставится в C:\Python27\ и тащит нужный нам pip с собой. Скачайте gerbmerge, распакуйте. Запустите cmd.exe и проследуйте в папку с исходниками gerbmerge:

    c:\python27\scripts\pip.exe install simpleparse
    c:\python27\python.exe setyp.py sdist
    c:\python27\scripts\pip.exe istall dist\gerbmerge-1.9.4.zip
    


    Всё. Если в предыдущих случаях gerbmerge запускался, собственно, командой gerbmerge, то здесь для запуска надо позвать файл c:\Python27\gerbmerge.bat (если вы поставили Python в другую папку, то путь надо изменить соответственно).

    Использование GerbMerge



    Для работы gerbmerge требуется конфигурационный файл и наборы файлов с герберами исходных плат. На гитхабе в папке examples есть примеры и того, и другого — причём как для дюймовых герберов, так и для метрических.

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

    [DEFAULT]
    projdir = .
    
    [Options]
    ExcellonLeadingZeros = 1
    PanelWidth = 400
    PanelHeight = 300
    XSpacing = 2
    YSpacing = 2
    MeasurementUnits = mm
    AllowMissingLayers = 0
    
    [MergeOutputFiles]
    Prefix = %(projdir)s/merged
    *TopLayer=%(prefix)s/Top.gbr
    *BottomLayer=%(prefix)s/Bottom.gbr
    *TopSilkscreen=%(prefix)s/TopSilk.gbr
    *BottomSilkscreen=%(prefix)s/BottomSilk.gbr
    *TopSoldermask=%(prefix)s/TopMask.gbr
    *BottomSoldermask=%(prefix)s/BottomMask.gbr
    Drills=%(prefix)s/Drills.txt
    BoardOutline=%(prefix)s/BoardOutline.gbr
    ToolList = %(prefix)s/Tools.drl
    Placement = %(prefix)s/Placement.txt
    
    [aa]
    Prefix=%(projdir)s/aa
    *TopLayer=%(prefix)s/Top.gbr
    *BottomLayer=%(prefix)s/Bottom.gbr
    *TopSilkscreen=%(prefix)s/TopSilk.gbr
    *TopSoldermask=%(prefix)s/TopMask.gbr
    *BottomSilkscreen=%(prefix)s/BottomSilk.gbr
    *BottomSoldermask=%(prefix)s/BottomMask.gbr
    Drills=%(prefix)s/Through.drl
    BoardOutline=%(prefix)s/BoardOutline.gbr
    
    Repeat = 10
    
    [bb]
    Prefix=%(projdir)s/bb
    *TopLayer=%(prefix)s/Top.gbr
    *BottomLayer=%(prefix)s/Bottom.gbr
    *TopSilkscreen=%(prefix)s/TopSilk.gbr
    *TopSoldermask=%(prefix)s/TopMask.gbr
    *BottomSilkscreen=%(prefix)s/BottomSilk.gbr
    *BottomSoldermask=%(prefix)s/BottomMask.gbr
    Drills=%(prefix)s/Through.drl
    BoardOutline=%(prefix)s/BoardOutline.gbr
    
    Repeat = 6
    


    В этом примере — две платы, лежащие в папках aa и bb, файлы в них — со стандартными именами экспорта DipTrace. Папки лежат рядом, gerbmerge запускается тут же, поэтому каталог проекта — просто «.», а пути к папкам, соответственно, «./aa» и «./bb». Первой платы надо сделать 10 штук на одной заготовке, второй — шесть. Герберы — в миллиметрах, максимальный размер панели — 400×300 мм, между платами надо сделать зазоры 2 мм, чтобы фабрика прорезала их фрезой (размеры панелей и зазоров спрашивайте у конкретной фабрики). Формат Excellon для сверлильного станка записывать с нулями в начале, при отсутствии какого-либо файла из перечисленных — ругаться. Результат надо сохранить в папку merged с указанными именами файлов.

    Обратите внимание, что все файлы, кроме BoardOutline и Drills, начинаются со звёздочки — так надо. Если поставить AllowMissingLayers в единицу, файлы со звёздочками могут отсутствовать. Но звёздочка должна быть в любом случае (не сильно логично, но такие мелочи исправлять уже лень, они никому не мешают).

    После создания конфига остаётся только запустить gerbmerge с ним в качестве единственного параметра:

    gerbmerge layout.cfg
    


    Или, если вы до сих пор не примкнули к миру Свободы, Равенства и Братства (как я), а также не любите Cygwin (не как я), то:

    C:\Python27\gerbmerge.bat layout.cfg
    


    При запуске gerbmerge вывешивает простыню дисклеймера и ждёт нажатия «y», если вам это надоело — добавьте параметр «-s».



    Если иное не сказано в конфиге, gerbmerge работает вечно, периодически сообщая, что он не умер. Остановить его можно в любой момент, нажав Ctrl-C — он сохранит конфигурацию плат, которую на этот момент будет считать наиболее удачной, в файлы, и завершится. К сожалению, как-то отследить, насколько результат удачен, невозможно, поэтому просто давайте ему достаточно времени — от пяти минут на среднем Core i* до пятнадцати на AMD Sempron хватает для получения аккуратного размещения даже для проекта вроде описанного перед катом.

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

    Полученные файлы стоит привычно проверить любым Gerber-просмотрщиком (я обычно пользуюсь Viewplot) — и если ничего не разъехалось, то отправлять на фабрику.

    Ограничения



    • В общем случае в одну реку нельзя войти дважды: так как скрипт перебирает десятки тысяч комбинаций, то на сложных композициях у вас при каждом запуске будет получаться что-то новенькое.
      Тем не менее, если вам понравилась получившаяся раскладка, обратите внимание, что в папке с результатом есть файл Placement.txt — в нём она и записана. Этот файл не нужен фабрике, но если вы на следующем запуске gerbmerge с тем же набором плат подсунете его программе через командную строку (--place-file=), вместо поиска новой конфигурации она просто сложит платы в описанную в этом файле. Удобно для двух случаев: если вы хотите попробовать заставить gerbmerge сгенерировать пяток разных раскладок и выбрать лучшую и если вы хотите в уже готовой раскладке поменять одну из плат на другую такого же размера.
    • Скрипт не понимает микса из дюймовых и метрических файлов. Все входящие герберы должны быть в одной системе, совпадающей с указанной в конфиге. В принципе, это повод для дальнейшей доработки, но т.к. внутри gerbmerge с работой с единицами измерения сейчас та ещё каша, вряд ли я когда-либо за неё возьмусь.


    Пруфпик



    Тот самый проект из 32 плат 13 видов, исполненный в текстолите компанией «Микролит»:



    Вопросов у фабрики не возникло, на качество нареканий нет.

    F.A.Q.



    Q: На черта вам вообще столько плат???
    A: Вот для этого проекта.
    Метки:
    Unwired Devices LLC 28,29
    Мы делаем вещи для Интернета Вещей
    Поделиться публикацией
    Похожие публикации
    Комментарии 48
    • 0
      А не дешевле, сгруппировать по одинаковым размерам и существенно сэкономить на фрезеровании? Ну или хотя бы несколько типов плат с одинаковым размером сгруппировать?
      • +1
        Зависит от фабрики: делает ли она фрезеровку и берёт ли за неё дополнительные деньги.

        Разместив на листе платы одного размера, можно фрезеровку заменить скрайбированием. Иногда оно и технологически будет удобнее — платы с большим усилием друг от друга отламываются, но часто попросту всё равно.
        • 0
          На пробной партии почти не важно, там львиную долю цены составляет подготовка производства, а вот на рабочих партиях 50+ уже есть разница между скрабированием, рубкой и фрезерованием. Да и для тиражирования удобнее получать все платы одного типа в одной упаковке/ на одном листе, чем каждый раз разламывать такую простыню на кусочки.
      • 0
        Где вы заказывали? Какая стоимость 10х10 см 10 штук может выйти?
        • 0
          Да я-то практически всё заказываю в rezonit.ru, прайс-лист у них на сайте есть :) Пару тысяч рублей стоит подготовка производства, далее 230 руб/дм² на срочном производстве.

          Если речь о китайцах — популярный Seeedstudio делает 10 штук 10x10 за $22, плюс два-три доллара доставка почтой, но добавляют $10 за каждую дополнительный тип платы на панели (несколько одинаковых плат считаются за один тип). Остальные китайцы — надо индивидуально смотреть, у всех разные условия.
          • 0
            Китайцы же не фрезеруют — у них панелизация + 10$ за плату (на панели может быть до 5 плат). Выходит дороговато (дороже резонита).
            • 0
              Это от китайцев же зависит, а их как грязи за баней. Самые известные сервисы — да, за любой шаг в сторону плюс десятка.
              • 0
                Здесь посмотрите dirtypcbs.com. Заказывал у них 10х10 10шт. за $25, размещал на ней 4 платки с фрезерованием
              • 0
                тогда непонятен смысл, в Китае заказывал за $28 по курсу $ 50 руб. = 10 плат 10х10 в районе 1400 рублей, это еще за цвет доплатил.
                • 0
                  Смысл в надежности сроков и качества. Заказываю иногда сомнительный (с технологической точки зрения) дизайны плат, и если у них возникают вопросы, технолог звонит и уточняет, чего именно я хочу этим добиться. В итоге платы на руках всегда 100% соответствуют ожиданиям, даже если разведены «не по правилам» и тд.

                  Для хобби/штучном это, быть может, и не оправдано. Опять же, при высокой плотности монтажа цена платы просто тонет в цене деталей и сборки.
            • 0
              немного не в тему печатных плат: а почему в проекте управление силовой нагрузкой есть, а блока питания от 230В нет?
              • 0
                По соображениям безопасности, чтобы палец никто не сунул — блоки питания 230 В только внешние, в корпусах, стандартных типов.
                • 0
                  Вам виднее, но мне кажется более удачным подход (при)обретения всего в одном месте.
                  • 0
                    Обрести можно будет, просто БП будет обычный Meanwell в розетку, а не открытый модуль того же формата, что и остальные.
                    • 0
                      я подумывал об упаковке комплекта модулей в углубленный (удлиненный) подрозетник за выключатели и розетки
                      • 0
                        Для этого будет версия модулей специально для «умного дома», там будет интеграция с БП, конечно. Ну и вообще они будут компактнее, монолитнее и специализированнее.
                        • 0
                          ой, нам бы поскорее, подешевле и понадежнее
                          • 0
                            Выбирайте любые два пункта!
                            • 0
                              Можно выполнить все три если запустить на кухне полный цикл производства ПП.
                              • 0
                                Нет уж, спасибо. Мне уже хватило лаборатории на кухне :) Фабричный вариант куда быстрее и красивше выходит.

                                Раз
                                image

                                Два
                                image

                                Фабрика
                                image

                                P.S.: Двусторонние платы с металлизацией, переходные отверстия 0.6.
                                • 0
                                  Какие огромные переходные отверстия...
                                  • 0
                                    С учетом ручной сверловки и металлизации (особенно на маленькой плате) меньшие размеры приводили к плохой воспроизводимости результатов.

                                    Фабричный вариант нормальный, разумеется.

                                  • 0
                                    Фабричный вариант куда быстрее и красивше выходит.

                                    Конечно нет по обоим пунктам. По времени изготовление ПП с маской, металлизацией и маркировкой займет вечер. Фабричная по тарифу "суперсрочно" за сколько будет готова?
                                    Вот, например

                                    image
                                    В процесссе еще без маски и маркировки.
                                    Нет, это не моё, просто как пример что можно сделать в домашних условиях.
                                    Я конечно на металлизацию и маркировку часто ленюсь, но без маски даже макеты и прочее одноразовое уже давно не делаю.
                                    • 0
                                      Металлизацию чем праймите? А комплексообразователь ЭДТА или что-то фабричное? Плюс еще финишное покрытие надо где-то брать, не говоря уже про трафареты для шелкографии


                                      В целом, подтверждается стандартный тезис, что лабораторные вещи можно сделать и на кухне, только со временем кухня превращается в лабораторию :)
                                      • 0
                                        Металлизацию чем праймите?

                                        В смысле активатор? Вообще палладиевый процесс отработан для применения "на кухне", но под него я еще не все нашел и пока обхожусь гипофосфитным методом.
                                        Конкретно эта плата активирована палладием.

                                        Плюс еще финишное покрытие надо где-то брать,

                                        Хим. олово вполне устраивает. Но раз уж пошла такая пьянка, то хим золото на никель тоже можно делать дома, но там цианиды что совсем не радует. Хотя бесцианистые тоже существуют и даже встречал про "на кухне".

                                        не говоря уже про трафареты для шелкографии

                                        Зачем трафареты? И маска и маркировка УФ отверждаемой маской/краской наносятся. Процесс аналогичен фоторезисту.
                • 0
                  Вообще-то Eagle позволяет легко объединить платы в панели, без всех вот этих мучений с герберами.
                  Делается это конечно вручную, зато расположить можно так как удобней. И еще можно обеспечить большую жесткость панели, вручную нарисовав перемычки между платами, что необходимо для автоматического монтажа.
                  • +2
                    а) не все пользуются Eagle
                    б) не все хотят делать эту работу вручную
                    в) пробные партии далеко не всегда монтируются автоматически, серийные партии далеко не всегда удобно объединять на общую панель
                    • 0
                      с) freeware лицензия дает всего 2 листа
                      • 0
                        Ну это уже скорее пояснение к «a» :) Потому как далее смотрим на цены и берём DipTrace.

                        В DipTrace тоже, в принципе, можно Ctrl-C-Ctrl-V платы на один лист (поставив в опциях, чтобы он не перенумеровывал компоненты), а потом их ручками расставить, но это же адовый геморрой для проекта более чем из пары плат.
                  • 0
                    У вас в описании UMDK-GATE подозрительно похож на Black Swift. Это правда оно? А можно будет у вас заказать саму плату? Потому что первоначальные разработчики работают с оперативностью госструктур.
                    • 0
                      Правда. Можно. Первоначальные разработчики работают у нас, а если вы имеете в виду black-swift.ru, то там, кажется, уже никто не работает.
                      • 0
                        Ну там шевеление на сайте какое-то происходит, заказы рассылаются но такими темпами это еще год будет происходить.

                        А как можно сделать заказ? На сайте есть только описание продуктов но ни слова о покупке.
                        • 0
                          Из команды там остался ровно один человек — основатель проекта. Все остальные ушли. В форуме он под ником admin, последний раз там был в октябре. Текущее шевеление — это какие-то инициативные группы, которым перепало плат под обещание таки наконец их разослать.

                          Мы интернет-магазин не открываем, потому как и плат не так уж много, и, главное, времени на это сейчас совершенно нет. А вообще: Basic — 1500 руб., PRO — 2200 руб., адаптер 2,54 мм — 300 руб. Для себя можно купить у нас в офисе или с доставкой курьером (служба СДЭК, 300-500 рублей в среднем), на организацию — присылайте реквизиты мне на oleg@unwds.com, выставлю счёт.
                          • 0
                            Это не ваш магазин unwds.com/ru/about-us
                            • 0
                              Это адрес офиса. Магазина в офисе нет.
                    • 0
                      При такой подготовке вам удалось исключить те самые напряжные 2000-2200 руб, которые резонит берет за подготовку производства? Или эта сумма просто уменьшилась?
                      • 0
                        Это разовая сумма при первом заказе.
                        Если плату каждого вида оформлть в отдельный заказ, то за 13 видов плат это будет 13*2000 + плата за площадь. Сборка всех плат в одну панель расценивается заводом как одна большая сложная плата, в итоге получается 1*2000 + плата за площадь. Для прототипов и штучных деевайсов это крайней удобно, в серии выгоднее потом разбить это на части, тк разных плат можеет потребоваться разное не кратное количество.

                        Кроме того, есть нюанс, что платы с нестандартными параметрами (допустим, 70мкм фольга) могут иметь нижнюю планку заказа, равную 1 технологической единице. По-моему, это около 7-8 дециметров
                        • 0
                          Тогда не вижу смысла если честно. Не знаю как китайцы, но товарищи из Резонита сами бесплатно объединяют платы в один комплект. Просто выводу герберы и сверловку для каждой платы, а они уже сами максимально компактно формируют на одну заготовку. Оплачиваю стандартную сумму в 2000 (плюс-минус, точную цифру не помню).

                          Я уже обрадовался, что есть какая-то хитрость как избавиться вообще от платы за подготовку к производству при первом заказе))
                          • 0
                            300 рублей за одно объединение.

                            Но вопрос не в этом, а в том, что при сборке действительно сложного комплекта проще и надёжнее это сделать и проконтролировать самому, а не передавать на фабрику длинный список, каких плат сколько штук должно быть на панели.
                        • 0
                          Эта сумма уменьшилась в расчете на одну плату. Т.е. или 2200*13(видов) или просто 2200. Или 2200/13 в расчете на одну плату стоит стоимость подготовки.
                        • 0
                          Не думали уменьшить габариты модулей? Уж очень места много свободного. Или сделать несколько форм-факторов плат модулей.
                          • 0
                            А зачем? Это конструктор для проектирования и отладки системы, минимальные габариты платы de facto определяются разъёмами для их сопряжения (2x12-pin 2,45 мм). Несколько несовместимых форм-факторов ему только мешать будут.
                            • 0
                              Ну да, тут ограничение то что модули друг над другом. А не было задумки компоновать готовые устройства из этих модулей, или только для прототипирования? Хотя для готового модульного девайса нужен модульный корпус и оптимизация самих модулей по стоимости.
                              • 0
                                Для готового модули не имеют большого смысла, ибо тащат с собой много ненужного и неоптимального.

                                Так что готовые — на базе радиомодуля и кастомной платы.
                                • 0
                                  Ну почему же не имеют. Кому то захочется одно мощное реле и датчик движения, кому то датчик влажности и радио и т.д. Это же десятки плат надо плодить для всего разнообразия.
                                  • 0
                                    Так это не готовое, это каждый клепает сам для себя из конструктора, та же ардуина, только в приложении к IoT и меш-сетям. Ну и тремя десятками плат исчерпываются практически все возможные юзкейсы, вплоть до промышленных интерфейсов типа токовой петли.
                          • 0
                            У симисторного диммера не видно снаберных цепей. Не будет включаться от любой помехи?
                            • 0
                              На бесснабберных быстрых симисторах и нагрузках невысокой индуктивности — нормально.

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое