Перейти к содержанию

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Записи блога, опубликованные MasterGH

  1. MasterGH
    Для тех кому интересно, вопрос к ним. Какие критерии можно добавить спрашивая оценку плагина?
    Например, по 5-ти бальной шкале спрашивать оценку у пользователей:
     
    Необходимость плагина в Cheat Engine Работает без ошибок                            Понятно как пользоваться Интерфейс плагина Удобство плагина Нравится Простая установка  
    Думаю, прикрутить аналитику прямо в плагины. Там будет как аналитика использования плагина, так и будет опросник выше.
    Ну и пользовательское соглашение об анонимном сборе данных для улучшения качества приложения. Чтобы можно было улучшать только те плагины, которые устанавливают и которыми пользуются.
  2. MasterGH
    Планируется улучшать и дорабатывать плагины, показать как с ними работать.
     
    1. Вывод данных в окно логов: сканирование, подключение к процессу, опции сканирования, состояния активации и деактивации записией в таблице CE и другие 
    2. Запись действий из пункта 1, сохранение этих действий и воспроизведение по кнопке или горячим клавишам
    3. Показ в дизассемблере CE ветвлений кода при проходе потоками разными цветами (можно видеть код, который не был пройден в разных ситуациях)
    4. Дополнительное окно дизассемблера с опциями подсветки инструкций по типу в градации черно-белых цветов: математические инструкции, логические инструкции, инструкции ветвления, на чтение и запись. 
    5. Улучшение плагина "Dessect Data Scanner" с DBVM или на 4-HW брекйпоинта. В случае DBVM количество брейкпоинтов не ограничено и можно определить тип данных одновременно для каждого байта в структуре по смещениям, а в случае 4-х байтов это в режиме без DBVM одновременно задействуются все 4 hw брейкпоинта, а не 1 hw как сейчас.
     
    Extensions: 
  3. MasterGH
    У меня бывают такие случаи, когда увидишь простой пример кода после которого захочется заняться разработкой какой-нибудь игры. 
    Вот один из таких примеров о том, как сделать подъем и опускание предмета и затем его вращение. Это 5 строчек "таких" и 5 строчек "таких", вот подъем и вращение
     
    На видео код можно применять для левитации предметов и вражеских персонажей, которых  можем поднимать, удерживать и бросать. 
  4. MasterGH
    Отличная книга по изучению паттернов проектирования. Ее можно читать со шпаргалкой по паттернам (иллюстрацию по паттернам можно загуглить).
    Перед этим еще загуглить SOLID + Unity .
    До кучи еще алгоритмы и структуры данных. 
    Все это  пригодится, чтобы пойти работать на программиста игр или приложений с разными типами реальности: дополненная, виртуальная и смешанная. А так же сейчас можно встретить вакансии по программированию не только Android, iOS устройств, шлемов и очков, но различных устройств и дронов.
    Об алгоритмах может быть позже напишу
  5. MasterGH
    Нет времени, пока напишу заметки.
     
    1. Можно сделать плагин с визуализацией счетчиков обращений к видимым данным в MemoryView с подключенным DBVM.
    2. По аналогии в Dessect Data Scanner сделать выбор DBVM режима.
     
    DBVM позволяет обойти ограничение в 4 аппаратных брейкопинта и в реальном времени визуализировать данные, которые обращаются к памяти на чтение, запись. Показывать счетчик обращения и даже показывать спискок инструкций при наведении курсором на байт или иные данные в MemoryView. В случае c Dessect Data Scanner может ускорить расструктуризацию, а не по 1-ому брейкпоинту снимать показания X секунд пробегаясь по структуре.
     
    Кстати, кто-нибудь шарит в алгоритмах, структурах данных и паттернах проектирования? Если шарите, поделитесь в каких задачах применяли.
     
  6. MasterGH
    Unity + ARKit 2.0 + Apple Device + iOS > 12.x  позволят сканировать через визуальную одометрию реальный мир и расставлять в нем виртуальные объекты и загружать их в точные места, куда раньше поставили. Особенность в том, что чем больше информации собрали физической камерой из разных положений и углов, тем больше шансов, что увидим объекты именно там куда их поставили. Это еще классно тем, что карту мира можно расширять, сохранять, загружать, передавать в реальном времени на разные устройства в мультиплеере. Далее ArKit похож на ArCore и Vuforia, EasyAR и т.п. сканируя изображения - маркеры, 3d-фигуры, сканирование плоскостей... И короче говоря,  могу добавить, что ARKit интересная штука. 
     
    Шлем и система виртуальной реальности + Unity. Стоит такая штука за 100К в России. Хотя цены бывают разные. На работе есть такая система и в ней очень круто. Манипуляторами как реальными руками можно делать много интересных вещей в 3д-комнате, при чем отфотканной с высоким качеством. Брать 3д-вещи в руки как реальные. Вращать, менять положение, бросать и так далее. Также было интересно на крыше в демке  "человека-паука". Это пейзаж с крыши, надевание маски, стрельба, звуки. В общем можно в шлеме путешествовать просто сидя дома. Если на Unity шаришь, можешь что хочешь сделать с этим шлемом. 3д- двери открывать,  делать механику разную, делать игры, так и что-то с пользой придумать, если конечно придумать.
     
    HaloLens - очки смешанной реальность. Стоят за 300К.  Они интересны тем можно связать обучение работы с приборами (с 30-той секунды). Сейчас тут взрослые люди обучаются, а могут так обучаться и дети, и студенты и взрослые.  Можно придумать:
    1) куда идти в аэропорте, могут показать очки (а это для смартфонов, а не для очков, таскаться с ними еще)
    1) как пользоваться плитой, стиральной машиной. телевизором... и другой техникой
    3) как приготовить еду
    4) ну и так далее... 
    Обучение программируется судя по видео
    С выставки. Самое интересное где-то с пятой минуты
     
    Все идет к тому, что у всех вместо телефонов могут быть очки, а передвигаться мы будем все на колесе, самокате или летающей машине, или индивидуальном пропеллере. Если сейчас можно видеть как все гоняют на самокатах и некоторые на колесе, то может лет через 100-300 люди могут летать на работу на пропеллерах за спиной.  Также все идет к том, что работа будет для большинства становится удаленной или роботы будут заменять людей, или люди будут управлять роботами как аватарами. Ну а путешествовать на пропеллере лучше на отдыхе чем на работу)
  7. MasterGH
    Вступление
     
    В CE выделим участок кода и функцию
    Sub eax,edx - вычитание и наиболее значимее чем запись и чтение.
    После декомпиляции
    Если выделили две инструкции
     
    Обращать внимание будем на математику, логику, условия и потом на чтение и запись.
    В данном случае, нужно найти вычитание из адреса "eax4->f1152 = eax4->f1152 - (eax3 + 1)"
     
     
    Как поставить декомпилятор
    1. С форума Cheat Engine качаем архив
    2. Распаковываем в папку с Cheat Engine
    3. В настройках открываем плагин cesmartdec.dll
    4. Идем на инструкцию, выделяем функцию 
    5. Декомпилируем на первой выделенной инструкции из всех выделенных
     
  8. MasterGH
    Пост для тех, кто интересуется Lua в Cheat Engine. 
     
    Можно подхватить разные моменты активации и деактивации записи в таблице CE и рассчитать размер кода между метками
     
    1. По шаблону вставляем АА код для туториала Cheat Engine
    2. Регистрируем метки-маркеры в АА коде
    3. Этими метками в Lua считаем и выводим ""endCode - startCode" размер байтов
     
    Пример, который подсчитал 15 байтов

     
     
     
    Пример скрипта
     
    Документация кому интересно
     
  9. MasterGH
    Дополненная реальность похоже на спецэффекты в кино, только на экране видим изображение получаемое с видео камеры, которой управляет пользователь. 
     
    Что интересно. Камера, которая есть у многих на телефоне и допустим некоторая программа с API(какой-нибудь дополненной реальности написанная вами) определяет, что происходит на изображении и по этим данным можно
     
    1) определить плоскости реальные в нашем мире
    2) определить положение объектов относительно друг друга в нашем мире
    3) определить уникальные маркеры и изображения
     
    Это было чтение данных, затем идет запись данных. На изображение накладывается поверх другое.
     
    Чтение данных с реального мира и запись данных поверх изображения по данным чтения это основные процессы.
     
    Что меня заинтересовало. Так это, что можно что-то делать в реальности, а камера будет писать программу. Самый простой пример. Берем маркер - бумагу с рисунком. Камера увидела и поставила на нем 3д-дом или светофор. Резко убираем маркер и дом остается в этом месте. Таким образом можно построить виртуальный город. Есть на Ютубе.
     
    Теперь можно взять вместо 3д-дома, 3д-светофоров маркеры для выстраивания алгоритма программы. Таким образом направив камеру можно что-то подхватывать из дополненной реальности, вытаскивать,  размещать таким образом программируя действия без строчки кода.
     
    Берем маркер А и рядом с ним ставим маркер S. Означает, чтобы запомнилось положение макера А в пространстве. Убираем маркер S. Далее ставим маркер R, означает запись движения. Далее перемещаем А на точку2. Убираем маркер R, что означает остановку слежеия за маркеромА. Далее ставим маркер P, который запускает движение 3д объекта связанного с маркером А.
     
    Ну и так далее. Это очень интересно в плане программирования маркерами...
     
    Видео по построению объектов в городе
     
  10. MasterGH
    Плагин ведет историю поиска, отсева, отмены. Логи выглядят следующим образом
    Для чего может применятся
    На шаге отсева посмотреть в логах, какое значение искали до этого и какой способ поиска использовали. При неудачных поисках мы просматриваем как и что мы сканировали раньше. Если вообще ничего не получается при сканировании, то логами можно обмениваться. Горячие клавиши, которые настраиваются из окна настроек CE работают и в логах.  
    Установка: скопировать GHL_log.lua в директорию "/autorun" Lua скрипт: 
    В комментариях можно написать про ошибки или про идеи улучшения плагина.
  11. MasterGH
    1. Открываем trainme Dark Byte.
    2. Проходим первый шаг (там нужно сделать One Hit Kill чит через прогресс бар, количество патронов тоже интересно поломать)
    3. Так вот на Step2  ищем адрес здоровья нашего космического корабля.
    Ставим брейкпоинт на доступ, стреляем.
    Видим, три адреса и вот теперь новые функции в контекстном меню как на скриншоте

     
    На "(1)-(2)" - вызываем контекстное меню выделив адрес своего корабля и добавляем его в группу1. Тоже самое делаем для красных адресов кораблей противников
    На "(2)" вызываем опцию сканирования и видим "(3)"
    На (3) выбираем скан по RAX или по другим значениям. Например, когда по RAX не нашли ничего.
     
    Дальше видим окно и галку ставим "Only find matching groups" и сканим. Видим результат 

     
    Т.е. по +70 и другим смещениям можно сделать фильтр свой - чужой.
     В общем замечательный инструмент для работы со структурами с заданием уровня сканирования по оффестам
  12. MasterGH
    Новые директивы try/except в AA доступны Cheat Engine 6.8 Beta2
     
    Задача  try/except в AA обработать исключение, не допустить crash. Чтобы игра продолжалась, а чит в лучшем случае не закрыл бы процесс.
    В теории возможно определить, что был crash и что-то сделать. Например, отправить логи в свой или иной удаленный сервис аналитики, что такой-то чит не сработал...
     
    Пример от DarkByte для  try/except с счетчиком crashes
     
     
  13. MasterGH
    pcall() функция может вызывать функцию, которая может вызывать исключение.
    Возвращает статус в виде булевой о том, есть ли исключение или нет и возвращает текст исключения. 
     
    Источник
     
    Как этим пользоваться? Если вдруг знаем, что может произойти ошибка, то можно её обработать и выполнить правильное действие не останавливая работу Lua скрипта.
    Или например если  не выполняется условие, то можем сами создать ошибку с помощью функции error, что остановит скрипт.
  14. MasterGH
    1. WebSite-Watcher позволяет отслеживать изменения на веб-страницах в том числе по по регулярным выражениям. Можно отслеживать изменения на сайтах Cheat Engine и других. Форум отслеживать смысла особого нет. Проще подписаться на обновление и почтовый клиент поставить.
    2. Программы тестирования и автоматизации под разные ОС:
        Sikuli — открытая кросс-платформенная визуальная среда создания сценариев-скриптов
        AirTest IDE — почти как Sikuli и более того, китайские разработчики были вдохновлены Sikili и решили взять из него многое и использоваться  в QA тестировании. 
    3. Автоматический скрывать значков на рабочем столе AutoHideDesctopIcons
    4. LightShot - быстро делаем скриншоты и заметки к ним. Можно еще использовать SnagIt, он еще и видео может снимать
    5. f.lux — софтина регулирующее цветовую температуру компьютерного монитора
    6. VerseQ — лучший на мой взгляд клавиатурный тренажер. Есть плагины тренировки на языки программирования
    7. Scanner — показывает график в виде секторов о данных на жестком диске
    8. ProcessExplorer, ProcessMonitor, WinScanner, API Monitor... все по системе
    9. Возможно понравится XYplorer как замена или дополнение к файловому браузеру
    10. NotePad ++ и sublime_text - на мой взгляд хорошие редакторы текста, может быть даже одни из лучших
     
    Как-то раз нужно было поставить пробелы между китайскими иероглифами в гугл таблице (все для игры на Unity), чтобы в игре разрядить текст и он не был мелким. На notepad++ это выгладило так

  15. MasterGH
    UserData в Lua это пользовательский тип.  Точно не знаю, но я думаю  в документации в CE Lua (celua.txt или здесь на офф. сайте) тип userData у всех классов или большинства классов. Например,  проверим, что главная форма CE это userData тип
    local mainFormCE = getMainForm() print(type(mainFormCE)) > userdata (вывод из консоли) Выводим список свойств следующим образом через getmetatable функцию. Метатаблица — это  особая  таблица свойств Lua-переменной (подробнее здесь)
    local mainForm = getMainForm() local listUserData = createStringlist() for k,_ in pairs(getmetatable(mainForm)) do listUserData.add(k) end local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listUserData, allowCustomInput) print ('Index: '..id..", Name: "..name) listUserData.destroy()  
    Результат в виде списка свойство переменной mainForm
     
    Чтобы наглядно было. Свойства эти похожи на свойства из Дельфи. Можно загуглить, они поддробно описываются.
    Берем например свойство цвет. Прочитаем оригинальное и запишем свое любое
     
    local mainFormCE = getMainForm() print(mainFormCE.getColor()) > 536870912 -- в hex-е это 0x20000000. Можно перевести в калькуляторе или через print(string.format("%08X", 536870912)) Случайное свое впишем ради наглядного примера
    mainFormCE.setColor(546484)
     
     
  16. MasterGH
    Довольно интересная функция, мне понравилась. 
    showSelectionList() позволяет просмотреть список класса Strings и выбрать свойство через список.
     
    Как пример посмотрим список свойств главной формы и выберем любое свойство
    local mainForm = getMainForm() local listProperties = getPropertyList(mainForm) local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listProperties, allowCustomInput) print ('Index: '..id..", Name: "..name) --> Примеры выполнения: --> Index: 55, Name: ShowHint --> Index: 10, Name: Top После исполнения Lua скрипта вот такой диалог появится. Можно искать свойство через ввод текста

     
     
    Список строк (Stringlist Class) используют:
    createStringlist(): Strings  - постой список
    getAutoAttachList(): Strings  - список имен процессов для автоподключения
    getPropertyList(class) : Strings - список свойств
    getCommonModuleList(): Strings  - список пропускаемых при сканировании модулей
    getProcesslist(Strings) - список процессов
    getWindowlist(Strings) - список окон
    getThreadlist(Strings) - список потоков
    Database.Params: Strings  - свойство  базы данных SQL
    ListItem.SubItems: Strings - свойство подстрок в визуальном компоненте списка
    ComboBox.Items: Strings - комбобокс
    Memo.Lines: Strings  - мемо компонент
    RadioGroup.Items: Strings  - компонент RadioGroup
    ListBox.Items: Strings - компонент ListBox
    FileDialog.Files: Strings  -  выбранные файлы в диалоге
  17. MasterGH
    В оригинале, если нет всех компонентов рецепта, то нельзя скрафтить вещь.

    Цель: скрафтить без компонетов по нажатию кнопки
     
    Игра на Unity и можно пробовать использовать в dnSpy модифицировать файл Assembly-CSharp.dll
    Открываем файлик и смотрим на классы связанные с крафтом
     
    Так находим кнопку, которая создаст указанное количество вещей крафта в CreateItem
       
    Задача скрафтить по имеющемуся рецепту любую вещь. Для этого я добавляю проверку количества вещей  и удаляю лишний код. Под сполерами оригинальный и модифицированный код
     
    Визуальное сравнение
     
    Модифицированный код
     
    Оригинальный
     
    Изменяем весь класс или метов в этом окне
     
    Если выводит ошибки при компяляции, то скачиваем IlSpy и его код вставляем в код в dnSpy. Или качаем DnSpy 3.2.0 или ранее
     
    Изменения сохраняем в модуль, запускаем игру и крафтим.
     
    Получить все рецепты (не проверял правда, попробуйте если хотите)
     
    Вещи не ломаются. Убрать отнятие "здоровья" у вещи
     
     
  18. MasterGH
    В версии Unity 2018 довольно много интересного.
     
    1. Это Unity Hub. Та штука, которая позволяет быть в курсе новых версий Unity. 
    2. PackageManager. Покажет пакаджи установленный в проекте.
    3. Pro Builder. Довольно интересный инструмент, который позволяет моделить оркужение в Unity и творить простые локации, здания и создавать примитивы с наложением текстур... там очень много чего, я не не смотрел особо. Это альтернатива террейну. Фишка в том, что мы не являясь художниками (2д, 3д артистами), на Pro Buildere можем вполне сносное сделать окружение в нереалистичном стиле.  И не очень мультяшный и не похожий на реалистичный стиль. В таком стиле в теории можно сделать быстро игру. Встроить туда рекламы и инаппов, ну и если все будет ок, то будет приносить прибыль на маркетах. Важнее продвинуть аппу вверх, на вид, чем сделать её;
    4. У Unity развиваются мощные системы сервисов. Есть поддержка иннпов, рекламы, аналитики, багрепорты (альфа версия), стеки крашей и исключений с характеристиками устройств пользователей. Не все баги там можно увидеть. Google Play консоль ловит больше багов, крашей и ANR (диалоги с "подождите ваша программа что-то долго делает или не отвечает, или будет закрыта").
    5. Запомнился 2d аниматор с ригом. Т.е. риг это склет обычно на 3д модель, а теперь риг можно делать на 2д модели.
    6. Пока больше не помню, что такого интересно... 
     
    В 2017 версии появилась возможность скрипты связывать с отдельными dll сборками. В теории это позволит увеличить скорость компиляции. Например, у нас в проекте на младших версиях Unity на правку уходит 8 секунд компиляции на мощном компе,т.к. все скрипты в одной сборке dll. Пока не тестили эту фичу...
  19. MasterGH
    Почти месяц ковыряюсь со сборкой апк, которая не запускается на инструментальном тестировании в Firebase
     

    Рис.1 Сборка апк на инструментальное тестирование TestLab  от Firebase. Окно AirTest IDE
     
    Две апк-шки создается.
    1. В Unity, с иvпортом Poco SDK 
    2. В Плагине как на рисунке
     
    Затем обе апк-шки отправляются на инструметальное тестирование в Firebase 

    Запускаю тест. Шесть секунд видео со стандартной заставкой и конец теста.
     
    На данный момент тестирование проводим через GameLoop тест, а не через инструментальный тест от AirTest IDE. Продолжаю искать решение, пока не понятно.
    Также в AirTest IDE еще не закончили свою документацию и в Firebase ничего не сказано про этот инструмент. Однако, известно что этот замечательный инструмент тестирования будет участвовать в FireBase TestLab. В 2018 году китайские разработчики официально договорились с гуглом об участии их продукта в тестировании на удаленных устройствах сервиса TestLab
  20. MasterGH
    Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше
     
    В утилите, которую я делал "Lua Regular Expressions (v. 1.0)"

     
    Текст во вкладке "gmatch"
     
    Game1
    gameCompany
    DAU
    53.21k
    -20%
    Game2
    gameCompany
    DAU
    20.35k
    -20%
     
    Поиск элемента после строки
     
    "DAU "DAU%c%c(.-)%c%c""
     > 53.21k;20.35k;
     
    Поиск элемента до строки
    Вот такой паттерн со двигом скобок для поиска прыдыдущеей фразы
     
    "%c%c(.-)gameCompany%c%c"
     
    не прокатит для вывода списка игр над фразой gameCompany
      
     > ;53.21k
     > -20%
     > 
     > Game2
     > ;
     
    Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз. 
     
    Для просты сначала добавим первую пустую строку и видим повторяющиеся фрагменты
     
    %c%cGame1%c%cgameCompany%c%c
     
    пишем шаблон ".*%c%c(.-)%c%cgameCompany%c%c" и опять мимо
     
     > Game1;53.21k
     > -20%
     > 
     > Game2;
     
    Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем
     
    "%c%c(%w-)%c%cgameCompany%c%c"
     > Game1;Game2;
     
    И тогда все ок.
     
    Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда
     
    "%c%c(%w-)%c%cgameCompany%c%c"
     > Game2;
     
     Не видит Game1.
     
     Значит мы можем  убрать %c%c,
     
     "(%w-)%c%cgameCompany
     > Game1;Game2;
     
    Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет
     
    My Game1: my Game
    gameCompany
    DAU
    53.21k
    -20%
    My Game2: my Game
    gameCompany
    DAU
    20.35k
    -20%
     
    Пробуем
    (%w-)%c%cgameCompany
    > Game;Game;
     
    Что не верно, т.к. захват одним (%w-)
     
    Мы должны в скобках развернуть фразу имени игры. В ней могут быть пробелы, числа, текст и двоеточие
     
    ([%w%s]-)%c%cgameCompany
    >  my Game; my Game;
     
    Затем

    ([:%w%s]-)%c%cgameCompany

    > My Game1: my Game;

    > My Game2: my Game;
     
    Затем
    %c?%c?([:%w%s]-)%c%cgameCompany

    > My Game1: my Game;
    > My Game2: my Game;
     
    Вот и все. Если  попариться один раз, то тексты уже парсить будет гораздо быстрее.
     
    Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк
     
    p.s. Текст в консоли Lua отличается %c%c, а %с
    p.s.p.s. Можно разсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"
  21. MasterGH
    Долго не могу решить проблему
    Traceback (most recent call last): File "C:\air test\plugins\firebase\build.py", line 124, in run self.SIGNAL_INSERT_LOGVIEW.emit(_str.decode("GB2312").encode("utf-8")) UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 11-12: illegal multibyte sequence QObject::~QObject: Timers cannot be stopped from another thread Если кто шарит на питоне просьба помочь. Питон 2.7
     
    Основная строка
    self.SIGNAL_INSERT_LOGVIEW.emit(_str.decode("GB2312").encode("utf-8")) При билде апк в firebase через плагин в AirTest (QA-тестирование на Unity)
     
    Среда разработки от уважаемых китайских разработчиков Я думаю в связи с этим ошибки с кодировкой GB2312. Гуглил, искал... пока безтолку
     
     
    Исходники
    Билд
  22. MasterGH
    Уже была запись про тестирование производительности.
    В этом примере тестируем разное обращение к функции со средним арифметическим значением
     
     
    Результаты при 4-х запусках
    avg = 0.93333998758048 avg = 1.0322099291325 avg = 0.92657961891689 avg = 1.1883763135947  
    Вывод. Разница не существенная.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.