diff --git a/English/Graph/roadmap.graphml b/English/Graph/roadmap.graphml new file mode 100644 index 0000000..afbfc2f --- /dev/null +++ b/English/Graph/roadmap.graphml @@ -0,0 +1,9640 @@ + + + + + + + + + + + + + + + + + + + + + + + + C++ developer + + + + + + + + + + + + Soft skills + + + + + + + + + + + + Hard skills + + + + + + + + + + + Сначала может показаться, что некоторые из навыков +развивать невозможно. Однако мы считаем иначе. +Над каждым из пунктов возможно работать. Всё +упирается в желание и внутренние блоки. Всё +индивидуально, и зависит от вас. :) + + + + + + + + + + + Умение учиться + + + + + + + + + + + Работа с ошибками + + + + + + + + + + + Мышление + + + + + + + + + + + Ответственность + + + + + + + + + + + Управление ресурсами + + + + + + + + + + + Коммуникация + + + + + + + + + + + Командная работа + + + + + + + + + + + Эмоциональный интелект + + + + + + + + + + + Понимание контекста разработки + + + + + + + + + + + Клиентоориентированность + + + + + + + + + + + Технологии + + + + + + + + + + + Тренды + + + + + + + + + + + Эмпатия + + + + + + + + + + + Концентрация + + + + + + + + + + + Открытость новому + + + + + + + + + + + Адаптируемость + + + + + + + + + + + Стрессоустойчивость + + + + + + + + + + + Работа в неопределённости + + + + + + + + + + + Понимание распределения ролей в команде + + + + + + + + + + + Помощь + + + + + + + + + + + Работа в распределённой команде + + + + + + + + + + + Предоставление обратной связи + + + + + + + + + + + Лидерство + + + + + + + + + + + Наставничество + + + + + + + + + + + Делегирование + + + + + + + + + + + Постановка задач сотрудникам + + + + + + + + + + + Планирование и целеполагание + + + + + + + + + + + Переговорческие навыки + + + + + + + + + + + Английский язык + + + + + + + + + + + Презентация + + + + + + + + + + + Навык переписки + + + + + + + + + + + Нетворкинг + + + + + + + + + + + Умение слушать + + + + + + + + + + + Убеждение + + + + + + + + + + + Умение доносить мысль/идеи внутри команды + + + + + + + + + + + Поиск компромиссов + + + + + + + + + + + Регулирование споров + + + + + + + + + + + Подача информации людям вне команды + + + + + + + + + + + Тайм-менеджмент + + + + + + + + + + + Приоритезация + + + + + + + + + + + Принятие решений + + + + + + + + + + + Слепая печать + + + + + + + + + + + Многозадачность + + + + + + + + + + + Дисциплина + + + + + + + + + + + Упорство + + + + + + + + + + + Инициативность + + + + + + + + + + + Самостоятельность + + + + + + + + + + + Решение проблем + + + + + + + + + + + Логическое + + + + + + + + + + + Критическое + + + + + + + + + + + Креативное + + + + + + + + + + + Стратегическое + + + + + + + + + + + Системное + + + + + + + + + + + Восприятие критики + + + + + + + + + + + Своевременное сигнализирование об ошибках + + + + + + + + + + + Признание своих ошибок + + + + + + + + + + + Анализ ошибок + + + + + + + + + + + Умение задавать правильные вопросы + + + + + + + + + + + Экспериментирование + + + + + + + + + + + Управление знаниями + + + + + + + + + + + Работа с информацией + + + + + + + + + + + Умение собирать информацию, +анализировать её и выдавать +взвешенное  решение. + + + + + + + + + + + Рефлексия + + + + + + + + + + + Cпокойно реагировать на то, что люди говорят. +Скорее всего, они учитывают только собственный +контекст, когда что-то пытаются доказать. Это +нормально. Оценивайте полезность их точки зрения. + + + + + + + + + + + Брать сложные задачи, чтобы развивать свои +навыки и компетенции, даже когда недостаточно +знаний/опыта (через такие задачи гораздо быстрее +развиваются навыки). Главное отличить реально +полезную сложную задачу, которая прокачает, +от задачи, на которую ищут крайнего. + + + + + + + + + + + Быть ответственным за профессиональное развитие. Не ждать +пока тимлид решит, что изучать. Не стоит забывать, что слепое +следование чужому плану заточит под задачи конкретной компании. +Стоит обсуждать и встраивать свои интересы в план. Если этого +не сделать - высокий риск получить "непереносимые" компетенции, +что ударит по карьерным возможностям. Но и не стоит ударятся в +крайности: изучать абсолютно всё подряд или пассивно ждать, пока +выдадут план развития. + + + + + + + + + + + Самоорганизация + + + + + + + + + + + Способность предоставлять тот объем информации, +который необходим для общения с людьми разного +бекграунда. + + + + + + + + + + + Решение конфликтов + + + + + + + + + + + Достаточно уверенного чтения документации и статей, +но для более перспективных вакансий +разговорный/письменный навык становится обязательным. + + + + + + + + + + + Искать единомышленников и присоединяться/создавать +комьюнити для общения и передачи опыта. + + + + + + + + + + + Чтобы быть конкурентоспособным, стоит изучать и наблюдать +за новыми веяниями, а также уметь адаптироваться под них. + + + + + + + + + + + Опытному разработчику стоит развивать навыки управления и +общения с бизнесом для эффективного выполнения задач. +Это легче делать, если развит эмоциональный интеллект. +Для джуниора навык также полезен, чтобы лучше +взаимодействовать с коллегами. + + + + + + + + + + + + + + 1 этап + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + Базовые операции + + + + + + + + + + + Арфиметические операции + + + + + + + + + + + Циклы for/while + + + + + + + + + + + Логические операции + + + + + + + + + + + Битовые операции + + + + + + + + + + + Функции + + + + + + + + + + + lambda + + + + + + + + + + + Операторы + + + + + + + + + + + Типы данных + + + + + + + + + + + Динамическая типизация + + + + + + + + + + + Статическая типизация + + + + + + + + + + + RTTI + + + + + + + + + + + Указатели и ссылки + + + + + + + + + + + Организация кодовой базы + + + + + + + + + + + Ссылки + + + + + + + + + + + Модель памяти + + + + + + + + + + + Умные указатели + + + + + + + + + + + Сырые Указатели + + + + + + + + + + + Разделение кода на headers/cpp юниты + + + + + + + + + + + Область видимости + + + + + + + + + + + Утечки памяти + + + + + + + + + + + Forward declaration + + + + + + + + + + + unique_ptr + + + + + + + + + + + shared_ptr + + + + + + + + + + + Время жизни + + + + + + + + + + + Операторы new/delete + + + + + + + + + + + weak_ptr + + + + + + + + + + + Пространство имён + + + + + + + + + + + Перегрузка стандартных операторов для +различных типов/структур/классов. + + + + + + + + + + + Чтобы избежать проблем с управлением памятью, +старайтесь писать код используя ссылки и умные +указатели. + + + + + + + + + + + + + + + + 2 этап + + + + + + + + + + Folder 2 + + + + + + + + + + + + + + + + Структуры и классы + + + + + + + + + + + Обработка ошибок + + + + + + + + + + + Перегрузка методов + + + + + + + + + + + Таблица вирутальных методов + + + + + + + + + + + ООП + + + + + + + + + + + Исключения + + + + + + + + + + + Access violation + + + + + + + + + + + Динамический полиморфизм + + + + + + + + + + + Виртуальные методы + + + + + + + + + + + Правило нуля/трех/пяти + + + + + + + + + + + Статический полиморфизм + + + + + + + + + + + Множественное наследование + + + + + + + + + + + Ромбовидное наследование + + + + + + + + + + + Коды возврата + + + + + + + + + + + Не используйте +множественное наследование + + + + + + + + + + + + + + + + 3 этап + + + + + + + + + + Folder 3 + + + + + + + + + + + + + + + + auto (автоматическое выведение типов) + + + + + + + + + + + Концепции языка + + + + + + + + + + + type casting + + + + + + + + + + + static_cast + + + + + + + + + + + const_cast + + + + + + + + + + + dynamic_cast + + + + + + + + + + + reinterpret_cast + + + + + + + + + + + Неопределённое поведение (Undefined Behavior) + + + + + + + + + + + Поиск, зависящий от аргумента (ADL) + + + + + + + + + + + Макросы + + + + + + + + + + + Name mangling + + + + + + + + + + + Стандартная библиотека + + + + + + + + + + + Поток ввода/вывода + + + + + + + + + + + Алгоритмы стандартной библиотеки + + + + + + + + + + + Итераторы + + + + + + + + + + + Контейнеры + + + + + + + + + + + Дата/время + + + + + + + + + + + Многопоточность + + + + + + + + + + + Языковые конструкции для которых отсутствуют прописанные +требования в стандартах. В случае ошибки дальнейшее +поведение будет предсказать невозможно, и всецело будет +зависеть от контекста выполнения или платформы, где запущено +приложение. + + + + + + + + + + + + + + + + Этап 4 + + + + + + + + + + Folder 4 + + + + + + + + + + + + + + + + Шаблоны + + + + + + + + + + + Variadic templates + + + + + + + + + + + Специализация шаблона + + + + + + + + + + + type traits + + + + + + + + + + + SFINAE + + + + + + + + + + + Полная специализация + + + + + + + + + + + Частичная специализация + + + + + + + + + + + RAII + + + + + + + + + + + pimpl + + + + + + + + + + + Erase-Remove + + + + + + + + + + + Non-Copyable/Non-Moveable + + + + + + + + + + + Copy and swap + + + + + + + + + + + Copy on write + + + + + + + + + + + CRTP + + + + + + + + + + + Стандарты + + + + + + + + + + + C++11/14 + + + + + + + + + + + C++17 + + + + + + + + + + + C++20 + + + + + + + + + + + newest + + + + + + + + + + + C++0x + + + + + + + + + + + Идиомы + + + + + + + + + + + + + + + + 1 этап + + + + + + + + + + + + + + + + + + Folder 5 + + + + + + + + + + + + + + + + Работа с исходным кодом + + + + + + + + + + + Текстовый редактор + + + + + + + + + + + IDE + + + + + + + + + + + Редакторы исходного кода + + + + + + + + + + + Отладчик + + + + + + + + + + + Линтеры + + + + + + + + + + + Знание о базовых возможностях (shortcuts, tools, plugins) + + + + + + + + + + + Умение читать сообщения отладчика + + + + + + + + + + + Отладочные символы + + + + + + + + + + + WinDbg + + + + + + + + + + + GDB + + + + + + + + + + + Выберите один из понравившихся популярных IDE +и хорошо освойте его: Eclipse, MS Visual Studio, +Qt Creator, JetBrains Clion, XCode и т.д. + + + + + + + + + + + Научитесь пользоваться отладчиком. Изучите его +возможности. + + + + + + + + + + + Выберите один из популярных редакторов и хорошо +освойте его. К примеру: Notepad++, Atom, и т.д. + + + + + + + + + + + Навык работы с отладчиком в через командную строку - +узконаправленный навык. В регулярной работе достаточно +уметь работать с отладчиком в рамках IDE. + + + + + + + + + + + Ознакомьтесь с самыми распространёнными ошибками +(segfault, out of memory, access violation) и концепцией  +неопределённого поведения (undefined behavior) + + + + + + + + + + + Выберите один из популярных редакторов и и хорошо +освойте его: Visual Code, Atom, Sublime Text и т.д. + + + + + + + + + + + + + + + + 3 этап + + + + + + + + + + Folder 6 + + + + + + + + + + + + + + + + Компиляторы + + + + + + + + + + + Базовые знания работы компиляторов + + + + + + + + + + + Компиляция кода в объектные файлы + + + + + + + + + + + Компоновка объектных файлов в приложение (линковка) + + + + + + + + + + + Этапы работы компилятора + + + + + + + + + + + Платформозависимые компиляторы + + + + + + + + + + + У компиляторов есть свои особенности, о которых +хорошо бы знать: Clang++/LLVM, Intel C++, MSVS C++, +GCC, MinGW + + + + + + + + + + + Есть несколько этапов работы компилятора, которые +хорошо бы знать. Это помогает ошибки решать +проблемы сборки на разных этапах. Достаточно базово +понимать, что происходит. Детали работы нужны +разработчикам компиляторов + + + + + + + + + + + + + + + + 5 этап + + + + + + + + + + Folder 7 + + + + + + + + + + + + + + + + Системы сборки + + + + + + + + + + + CMake + + + + + + + + + + + Makefile + + + + + + + + + + + ninja + + + + + + + + + + + Пакетные менеджеры + + + + + + + + + + + vcpkg + + + + + + + + + + + spack + + + + + + + + + + + Conan + + + + + + + + + + + nuget + + + + + + + + + + + Библиотеки + + + + + + + + + + + boost + + + + + + + + + + + opencv + + + + + + + + + + + poco + + + + + + + + + + + Подключение библиотек + + + + + + + + + + + protobuf + + + + + + + + + + + gRPC + + + + + + + + + + + fmt + + + + + + + + + + + pybindll + + + + + + + + + + + spdlog + + + + + + + + + + + ranges_v3 + + + + + + + + + + + tensorflow + + + + + + + + + + + opencl + + + + + + + + + + + Фреймворки + + + + + + + + + + + gtest/gmock + + + + + + + + + + + Qt + + + + + + + + + + + catch2 + + + + + + + + + + + google profiler + + + + + + + + + + + pytorch c++ + + + + + + + + + + + + + + + + 1 этап + + + + + + + + + + Folder 8 + + + + + + + + + + + + + + + + Информатика + + + + + + + + + + + Информатика + + + + + + + + + + + Алгоритмы + + + + + + + + + + + Булева алгебра + + + + + + + + + + + Конечные автоматы + + + + + + + + + + + Также необходимо понимать, как вычислить сложность +и потребление памяти у алгоритмов. + + + + + + + + + + + + + + + + 4 этап + + + + + + + + + + Folder 9 + + + + + + + + + + + + + + + + Системы контроля версий + + + + + + + + + + + Распределенные + + + + + + + + + + + Централизованные + + + + + + + + + + + SVN + + + + + + + + + + + git + + + + + + + + + + + Mercurial + + + + + + + + + + + Практики разработки + + + + + + + + + + + Качество кода + + + + + + + + + + + Правило оформления кода + + + + + + + + + + + Принципы разработки + + + + + + + + + + + KISS (Keep It Simple, Stupid) + + + + + + + + + + + DRY (Don't Repeat Yourself) + + + + + + + + + + + YAGNI (You Aren't Gonna Need It) + + + + + + + + + + + APO (Avoid Premature Optimization) + + + + + + + + + + + BDUF (Big Design Up Front) + + + + + + + + + + + Композиция предпочтительнее наследования + + + + + + + + + + + Бритва Оккама + + + + + + + + + + + Разделяй и властвуй + + + + + + + + + + + Логирование и телеметрия + + + + + + + + + + + Ревью кода + + + + + + + + + + + Умение читать чужой код + + + + + + + + + + + Ревью чужого кода + + + + + + + + + + + Понимание жизненного цикла производства ПО + + + + + + + + + + + Реализация + + + + + + + + + + + Тестирование + + + + + + + + + + + Поддержка + + + + + + + + + + + Версионирование ПО + + + + + + + + + + + Юнит тесты + + + + + + + + + + + Интеграционное + + + + + + + + + + + Функциональное + + + + + + + + + + + Производительность + + + + + + + + + + + Формирование архитектуры и дизайн компонентов + + + + + + + + + + + Интеграция компонентов + + + + + + + + + + + Выпуск + + + + + + + + + + + Сбор требований + + + + + + + + + + + Окончание жизненного цикла + + + + + + + + + + + Анализаторы кода + + + + + + + + + + + Статические + + + + + + + + + + + Динамические + + + + + + + + + + + Профайлеры + + + + + + + + + + + C++ core guidelines + + + + + + + + + + + Промышленные стандарты + + + + + + + + + + + MISRA + + + + + + + + + + + Autosar + + + + + + + + + + + Работа с командной строкой + + + + + + + + + + + batch + + + + + + + + + + + Powershell + + + + + + + + + + + bash + + + + + + + + + + + CI/CD + + + + + + + + + + + Trunk Based Development + + + + + + + + + + + Zero downtime deployment + + + + + + + + + + + Создание пакета поставки ПО + + + + + + + + + + + Документация + + + + + + + + + + + Инсталлятор + + + + + + + + + + + Использование других языков программирования + + + + + + + + + + + Межязыковое взаимодействие + + + + + + + + + + + Правила именования переменных, пробелы vs табы, +положение фигурных скобок и т.д. + + + + + + + + + + + Настроить форматирование и автоматически проверять + в одной из утилит: clang-format, Resharper - стиль кода, +MSVS - стиль кода. + + + + + + + + + + + - Скриптовые +- Функциональные +- SQL like +- NoSQL +- Брагилевский :) + + + + + + + + + + + Иногда требуется предоставить обертку к библиотеке, написанной +на C++ для другого ЯП, например Python или C#. Для этого +применяют специальные библиотеки/фреймворки. + + + + + + + + + + + Обратная совместимость + + + + + + + + + + + + + Проектирование ПО + + + + + + + + + + + Архитектурные стили + + + + + + + + + + + Component-based + + + + + + + + + + + Monolithic application + + + + + + + + + + + Layered + + + + + + + + + + + Client-server + + + + + + + + + + + Microservices architecture + + + + + + + + + + + Event-driven + + + + + + + + + + + Plug-ins + + + + + + + + + + + REST + + + + + + + + + + + Service-oriented architecture + + + + + + + + + + + + + + этап 2 + + + + + + + + + + Folder 10 + + + + + + + + + + + + + + + + Паттерны проектирования (GoF) + + + + + + + + + + + Поведенческие + + + + + + + + + + + Структурные + + + + + + + + + + + Порождающие + + + + + + + + + + + ООП + + + + + + + + + + + SOLID + + + + + + + + + + + UML + + + + + + + + + + + + + Архитектурные паттерны + + + + + + + + + + + MVC + + + + + + + + + + + MVVM + + + + + + + + + + + Three-tier + + + + + + + + + + + Onion + + + + + + + + + + + Hexagon + + + + + + + + + + + Методологии + + + + + + + + + + + Test Driven Development + + + + + + + + + + + Behavior Driven Development + + + + + + + + + + + Domain Driven Design + + + + + + + + + + + Память + + + + + + + + + + + Абстракции памяти + + + + + + + + + + + Выравнивание памяти + + + + + + + + + + + Управление памятью + + + + + + + + + + + Бинарные единицы + + + + + + + + + + + Исполняемый файл + + + + + + + + + + + Статическая библиотека + + + + + + + + + + + Динамическая библиотека + + + + + + + + + + + Стек + + + + + + + + + + + Глобальная память + + + + + + + + + + + Куча + + + + + + + + + + + Память приложения + + + + + + + + + + + Виртуальная память + + + + + + + + + + + Операционные системы + + + + + + + + + + + Многопоточность + + + + + + + + + + + Ошибки + + + + + + + + + + + Dead lock + + + + + + + + + + + Race condition + + + + + + + + + + + Live lock + + + + + + + + + + + Starvation + + + + + + + + + + + Потоки + + + + + + + + + + + Конкуренция + + + + + + + + + + + Мьютексы + + + + + + + + + + + Семафоры + + + + + + + + + + + Алгоритмы без блокировок (lock-free) + + + + + + + + + + + Обработка событий + + + + + + + + + + + Синхронные + + + + + + + + + + + Асинхронные + + + + + + + + + + + Процессы + + + + + + + + + + + Межпроцессное взаимодействие + + + + + + + + + + + Shared memory + + + + + + + + + + + Pipes + + + + + + + + + + + Сериализация + + + + + + + + + + + json + + + + + + + + + + + XML + + + + + + + + + + + Сетевой стек + + + + + + + + + + + TCP/IP + + + + + + + + + + + OSI + + + + + + + + + + + Сокеты + + + + + + + + + + + HTTP + + + + + + + + + + + TCP + + + + + + + + + + + UDP + + + + + + + + + + + Файловая система + + + + + + + + + + + Планировщик + + + + + + + + + + + Виртуализация + + + + + + + + + + + VirtualBox + + + + + + + + + + + VMware Workstation + + + + + + + + + + + Контейнеризация + + + + + + + + + + + Hyper-V + + + + + + + + + + + Docker + + + + + + + + + + + Облачные сервисы + + + + + + + + + + + Kubernetes + + + + + + + + + + + Безопасность + + + + + + + + + + + Шифрование + + + + + + + + + + + Многопроцессорные системы + + + + + + + + + + + Multicore CPU + + + + + + + + + + + NUMA + + + + + + + + + + + Ввод и вывод информации + + + + + + + + + + + Драйверы + + + + + + + + + + + Аудио + + + + + + + + + + + Графическое вычисление/отображение + + + + + + + + + + + Печать + + + + + + + + + + + DirectSound + + + + + + + + + + + OpenAL + + + + + + + + + + + DirectX + + + + + + + + + + + Vulkan + + + + + + + + + + + OpenGL + + + + + + + + + + + CUDA + + + + + + + + + + + Общие навыки + + + + + + + + + + + Языковые инструменты + + + + + + + + + + + Синтаксис языка + + + + + + + + + + + C++ Developer Roadmap + + + + + + + + + + + About: + + + + + + + + + + + C ++ is still one of the most popular development languages. There is quite a number of people that want to start learning it +and become a C++ developer. They face questions like: "Where should I start? What and in what order should I study? What +books should I read?" + +We tried to answer these questions in the presented roadmap. The map focuses on general competencies and skills that +could be found in most projects. It is designed to help those who are just starting their education or have little experience. +You can create a more productive learning plan without being distracted by side information if you study the set of listed +materials. It will help you to master C++ at the level that is used in many commercial projects. + + + + + + + + + + + How to use: + + + + + + + + + + + Если у вас есть замечания, вопросы или предложения, будем +рады получить любую помощь и поддержку. Мы открыты для +общения :) + +Для этого используйте следующие механизмы Github: +- Предложения/правки по репозиторию - создавайте и +присылайте новый PR в Pull Requests + + + + + + + + + + + + Feedback: + + + + + + + + + + + Optional + + + + + + + + + + + Junior + + + + + + + + + + + Middle + + + + + + + + + + + Senior + + + + + + + + + + + The middle developer has the +skills to create a design for +new functionality as a part of +a component/application if +even there're not enough +requirements or information +presented. + + + + + + + + + + + The senior developer has the +skills to create a design and +make decisions for a +solution/component taking +into account business area +context. + + + + + + + + + + + The junior must acquire the +following skill as soon as +possible: to write +easy-readable and +well-structured code. + + + + + + + + + + + The juniors should be aware +of middle/senior skills. It's +enough to have a basic +understanding of them. + + + + + + + + + + + The "steps" are presented on +this map. They're intended to +show an easy for newbies to +be able to get confident base +knowledge about the language +at the beginning. + + + + + + + + + + + Repository: + + + + + + + + + + + + https://github.com/salmer/CppDeveloperRoadmap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +