Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Оцените тестовое задание?

Лучший ответ:
Самого задания не будет? Оценивать то нечего толком. В описании куча грамматических ошибок. На этом можно закончить, это уже говорит о плохом подходе. Вот это вообще без комментариев. 


Много коммитов с изменением ридми, можно ведь один раз написать грамотно и не редачить по 10 (буквально) раз. Честно говоря, уже на этом бы моменте даже не стал дальше смотреть. Сама "документация" написана тожн абсолютно никак. 

SQL запросы составлены неверно. Нейминги переменных разные. Некоторые переменные вообще непонятно зачем существуют, как, например, error в методе авторизации. 
https://github.com/chigan0/apptrix.test/blob/main/...

`utils` откуда-то слизаны, там везде почему-то табы, когда в остальном коде пробелы. 
Красиво


Английские слова точно так же написаны с ошибками. 

Дока не соответствует коду. 
 ?lastname фильтрация по фамилии 
В коде:
"last_name" in request.args

JS разработкой не занимаюсь, но первый раз вижу, чтобы форму формировали не через тег form и/или с использованием ajax, а просто пложив инпуты на страницу, без атрибута name и потом собрав их руками в formdata, и через fetch бросить на сервер. 

Лишние комментарии в коде, остатки от каких-то тестов. Отступы скачут. И так далее И так далее И так далее. И всё это до теста главного функционала приложения

Худший ответ:
Потому что все очень плохо, буквально в каждой строчке кода. Полное несоблюдение PEP8 везде, где только можно.
main.py и settings.py принято держать в корне проекта.
Хранить какие либо ключи и/или пароли прямо в .py файле и тем более заливать это в github - отвратительная практика.

Структура проекта отсутствует в принципе:
- Почему у тебя в папке models конфигурация БД?
- Почему у тебя параметр подключения к БД прямо в файле, где происходит подключение, а не в конфиге?
- Зачем вообще файл create_database.py?

Пробежавшись по остальным файлам разбирать их чисто для комментария нет никакого желания - там полный мрак.
Вопрос: Как вывести в console.log букву P и A звёздочками *?

Лучший ответ:
const stars = (n) => {
  for (let r = 4; r >= 0; r--) {
    const shift = r * 5;
    const bits = (n & 31 << shift) >> shift;
    console.log(Array(5).fill('').map((_, i) => bits & 1 << i ? '*' : ' ').reverse().join(''));
  }
}
  
stars(0x1e8fa10); // P
stars(0x457e31); // A
Вывод****
*   *
****
*   
*   
  * 
 * *
*****
*   *
*   *

Худший ответ:
Взять файл с каким-нибудь растровым шрифтом. Загуглить (или заяндексить) формат. Прочитать файл, собрать матрицу для буквы. Распечатать.
Можно и векторный шрифт, но там не обойтись без математики.
Вопрос: Нужно как то убрать пробелы в конце кода. Можно ли это сделать с текущем кодом или написать его по другому?

Лучший ответ:
Изучите метод join() у строк. Вам это поможет.

Худший ответ:
Ну так логично. У вас в print(x[i][j],end=" ") пробел между кавычками

Сделал за васn=int(input())
x=[[0]*n for i in range(n)]

for i in range(n):
    for j in range(n):
        x[i][j]=1
        x[i][n-1]=5
        print(x[i][j],end="")
    print()
Вопрос: Произвольная перезагрузка ПК в нескольких играх, что делать?

Лучший ответ:
Я бы, в первую очередь, грешил на БП. Наверняка перегруз по питанию видеокарты, если проблема только в играх. Если видеокарта сейчас подключена к БП одним жгутом, то можно попробовать специально подключить двумя разными, от разных разъемов БП.

Худший ответ:
Перезагрузка под нагрузкой - первая причина, перегрев процессора. Поставь какой-нибудь OpenHardwareMonitor включи там логи в файл и смотри что с момент перезагрузки

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

В догонку, драйвера, вирусы и т.п. проверяй. Надеюсь ты не майнишь фоном?
Вопрос: Почему грузит один из дисков на 100% в Windows 10?

Лучший ответ:
С учётом того, что наверху висит SearchApp.exe, проверьте не занимается ли виндоус постоянной индексацией содержимого. Если нет особой потребности в ней, попробуйте отключить индексацию вообще.

Также проверьте вариант, что индексацию не удаётся нормально выполнить из-за проблем с диском. Начать проще всего с просмотра SMART, например, в R.tester'е: https://rlab.ru/tools/rtester.html

Худший ответ:
ну он не грузит диск, а юзает его...

пробуйте
отключить индексацию, как выше пишут
отключить Sysmain
возможно - windows search (тогда перестанет работать поиск в пуске)
Вопрос: Где тренировать навыки HTML?

Лучший ответ:
Поставь себе задачу сверстать что-то нетривиальное и пользуйся https://www.w3schools.com/

Худший ответ:
можете попробовать тут
Вопрос: Как правильно пушить коммиты?

Лучший ответ:
Никаких "должен одним коммитом или не должен" не существует 

Если ты один, ты можешь вести только один мастер.

Если команда - вы договариваетесь в команде, как вам удобнее, оформляете это в правила и следуете.

Продукты бывают разные.
Довольно распространет git-flow, но его бездумное применение приводит к бардаку и оверинжинерингу.

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

Второй вариант использования фича-бренча - это pull request, если вы используете какой-нить code review, и перед пушем в мастер должны быть выполнены дополнительные действия - ручной код ревью или какие-от автоматические тесты, в общем что там в вашем CI наделаете.

Бывает, что одновременно разрабатывается несколько версий, тогда и "мастеров" может быть несколько (релизные ветки).

В простых проектах, обычно просто договариваются о name-convention для веток, с которыми потом проще генерировать различные release-notes, или в названии ветки включать номер тикета в багтрекере.

Худший ответ:
1) Когда продукт не сделан окончательно - это можно сравнить с твоими учебными проектами. Также хоть в мастер пуш. Вся "правильная" работа с git начинается, когда проект уже зарелизили. Потому что теперь продакшн нельзя ломать.
2) В остальном логика верна. Делаешь ветку для фичи и ведешь ее.

должен ли разработчик коммитить все что сделал одним коммитом? или ему нужно к примеру, models папку - закоммитить как "models / entities" и тд прочие папки с файлами?
такого я не встречал, но это обычно обговаривается или даже создается свод правил работы с git, чтобы все разработчики его придерживались.

Нужно ли делать merge разработчику после проверки высшего по рангу товарища? И куда это должно быть в dev?
ну тут также как обговорите.
Вопрос: Как помощью grid сделать таблицу из двух колонок сжимающеюся в одну?

Лучший ответ:
Тут надо определиться, что тебе надо конкретно. Если тебе на разных размерах окна браузера нужны конкретное количество колонок, то гриды тебе тут не помогут, используй @media запросы и выставляй нужное число колонок grid-template-columns: 1fr 1fr 1fr. Если тебе не важно сколько будет колонок, а важно чтоб сами колонки не были меньше заданного размера, то вот тут тебе и надо использовать repeat(auto-fit, minmax(500px, 1fr))

Худший ответ:
Используйте media запросы тогда. Чтобы по дефолту было две колонки, а после определенного разрешения оставлять одну колонку:

.grid {
  grid-template-columns: 1fr 1fr;

  @media (max-width: 767px) {
    grid-template-columns: 1fr;
  }
}
Вопрос: Как убрать описание сайта, когда делишься ссылкой?

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

Худший ответ:
css тут не при чем
https://search.google.com/structured-data/testing-...
https://developers.facebook.com/docs/sharing/webma...
https://ogp.me/
В вашем случае скорее всего описание закешировалось
Вопрос: Как в теге title убрать слово Архив?

Лучший ответ:
// удаляем "Рубрика: ", "Метка: " и т.д. из заголовка архива
add_filter( 'get_the_archive_title', function( $title ){
	return preg_replace('~^[^:]+: ~', '', $title );
});

Худший ответ:
вот еще вариант для разнообразия, но первый и мне нравится больше
function x_theme__remove_name_cat( $title ){
	if ( is_category() ) {
		$title = single_cat_title( '', false );
	} elseif ( is_tag() ) {
		$title = single_tag_title( '', false );
	}
	return $title;
}
add_filter( 'get_the_archive_title', 'x_theme__remove_name_cat' );
Вопрос: Как отослать иллюстрацию по почте?

Лучший ответ:
Письма поддерживают верстку HTML
Как сверстать письмо: инструкция для чайников
Дизайн
Как верстать email письма — особенности и п...
Как сверстать email рассылку с картинками

Худший ответ:
Зачем? Ухудшить доставку и увеличить попадание в спам?
Вопрос: Можно ли подключить к Андройду клавиатуру?

Лучший ответ:
Можно подключить практически любую клавиатуру через USB-OTG, если он есть.
Если нету - Bluetooth к вашим услугам

Худший ответ:
Можно по блютусу подключить. По usb не пробовал лично, но тоже наверняка будет работать.
Вопрос: Чем можно заменить a href?

Лучший ответ:
Правильнее будет сделать кнопкой, то есть тегом </button>. При использовании данного тега есть свои плюсы и одним из них является поддержка фокуса по дефолту, т.е если юзать например </div>, то тогда придётся делать дополнительные телодвижения чтобы кнопка слепленная из тега  </div> - корректно принимала на себя фокус, например, с клавиатуры. Да и к тому же более семантично использовать </button> для подобных целей. Хотя можно использовать и тег <input>, но в данной ситуации, он совершенно не к месту.

Худший ответ:
Ничем, если ваc это раздражает, просто заблокируйте контекстное меню на таких ссылках. Пример:
<a oncontextmenu="event.preventDefault();" href="#">Тест</a>
Попробуйте нажать такую ссылку правой кнопкой мыши... ничего не будет происходить.

Немного доработав пример, можно сделать так, чтобы правый клик был равноценен клику левому:
<a oncontextmenu="event.preventDefault(); this.click();" href="#">Тест</a>
А значит будет открываться модалка даже при клике правой кнопкой мыши.
Вопрос: Как зарегистрировать глобальную переменную или получить данные по API единожды при загрузке странице?

Лучший ответ:
1. кэш
2. синглтон
3. тупо статическая переменная в классе.

Худший ответ:
1 и 2 варик самые норм, но насчет второго - обычный класс, который регистрируется в контейнере как синглтон
Вопрос: Почему после установки пакета nvidia система не грузится?

Лучший ответ:
Решил. Надо было прописать ibt=off
Due to FS#74886/FS#74891, nvidia doesn't boot on Linux 5.18 on systems with Intel CPUs. Until this is fixed, a workaround is disabling the Indirect Branch Tracking CPU security feature by setting the ibt=off kernel parameter from the bootloader. This security feature is responsible for mitigating a class of exploit techniques, but is deemed safe as a temporary stopgap solution

Худший ответ:
Та же проблема была с Debian'ом, решается выключением в BIOS/UEFI Secure Boot перед установкой проприетарного драйвера от NVidia, это при условии что железо под Виндой работает нормально, т.е. нет физически проблем с ним и запускается Live-CD с Linux'ом на видеодрайвере от nouveau, а так же благополучно зависает на нем.
Вопрос: С помощью чего сделать шаблон для страницы html?

Лучший ответ:
Ну раз есть php на нём и делайте. Он в общем-то как шаблонизатор и начинался. Отдельные блоки (навигация, подвал и тд) выносите в файлы и вставляете в нужном месте через include. А под отдельные элементы, как телефон например, можно создать один общий файлик с переменными и выводить в нужных местах через echo.

Худший ответ:
Я бы рыл в сторону Twig темплейтов.
Если помимо PHP запускали Composer.
Вопрос: Как обслуживать юзеров по очереди телебот?

Лучший ответ:
global user_id
Ну как бы вот виновник. Глобальные переменные. Они общие на всего бота и на всех пользователей. Если тебе нужно дифференцировать пользователей - делай это сам.
Делай хранилище "ключ-значение", где ключ - ID пользователя, значение - хранимые для этого пользователя данные. При обработке сообщения читай ID пользователя, доставай из хранилища данные, и уже сообразно им обрабатывай сообщение.
Таким хранилищем может быть простой словарь (если не нужно сохранять состояние между перезапусками бота), БД или ещё что.

Не знаю, есть ли в telebot реализация Finite State Machine, но обычно для реализации сценариев используют её. Идея та же - для каждого юзера храним его текущее состояние (шаг в сценарии) и ассоциированные с ним данные.

Худший ответ:
Проблема в этой строке:
global user_id
Вам надо построить код так, чтобы не использовать global.
Вопрос: Как разогнать пк?

Лучший ответ:
В вашем случае - никак.

Разгон вообще сто лет как потерял всякий смысл.

Худший ответ:
карту можно с помощью MSI afteburn
Проц можно попробовать по шине(вроде), если биос материнки позволяет. завсисит от чипсета материнки

а смысл разгона то?
Вопрос: Что выбрать для хранения файлов?

Лучший ответ:
но здесь и возникает вопрос, куда все это загружать?На сервер, в любом случае хранить вы будете на сервере, это может быть даже не "ваш" сервер, а какое-то облачное хранилище, но в любом случае загрузка пройдет через ваш сервер приложения.

Я пробовал FTP Server FileZilla,То есть вы предлагаете пользователям загружать аватарки по ftp? Часто видели такое решение на других сайтах? Думаю нет. Кроме того,  ftp - это метод загрузки, а не способ хранения. Вы бы определились что вы хотите.

Худший ответ:
Допустим, есть у нас пользователь и аватарка которою он загружает, но здесь и возникает вопрос, куда все это загружать?
Сервисы вроде Firebase store норм.
Вопрос: Почему индекс нулей в списке равен нулю?

Лучший ответ:
У тебя в строках массива несколько нулей. Метод index() по умолчанию находит только первое искомое значение. Если бы ты почитал документацию, ты бы это понял, и увидел, как это обойти.

list.index(x[, start[, end]])

    Return zero-based index in the list of the first item whose value is equal to x. Raises a ValueError if there is no such item.

    The optional arguments start and end are interpreted as in the slice notation and are used to limit the search to a particular subsequence of the list. The returned index is computed relative to the beginning of the full sequence rather than the start argument.


Вообще, раз уж ты ручками перебираешь строки и ячейки матрицы, используй enumerate().
for i_row, row in enumerate(grid):  # row == grid[i_row]
    for i_col, value in enumerate(row):  # value == row[i_col]
        # далее сам

Худший ответ:
Перебирать данные циклами и сравнивать с нулем. Тогда индекс будет получаться автоматически.
Вопрос: Может ли облачный провайдер обойти защиту клиента на своем ресурсе?

Лучший ответ:
Может!
Хостер (у которого размещено физическое железо, на котором крутятся твоя ос или виртуальные машины) имеет возможность получить доступ даже если ты зашифровал файловую систему а пароль вводишь подключившись в initramfs по ssh при перезапуске, так как имеет возможность подменить загрузчик со своим трояном, который способен украсть ключи шифрования (это я не говорю про возможность сделать копию оперативной памяти - штатная фишка виртуальных машин и зашифрованного диска, извлечь из дампа ключи шифрования и расшифровать диск).

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

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

p.s. и даже в этом случае нужно будет очень очень сильно доверять производителю оборудования, биоса, прошивок (например прошивки сетевой карты, m2 диска и всего что имеет доступ к pcie) и конечно же самой ос, что там нет закладок (а они там очевидно есть).

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

p.p.s. но маловероятно что подобная атака выполняется хостером для каждого клиента (хотя такой вариант не исключен, ведь инструментарий достаточно написать один раз и поддерживать его для новых версий ядер, а потом массово взламывать все машины, так как получение снапшота диска почти бесплатная процедура, почему бы и нет)

Так вот если это не проводится на автомате с каждым клиентом, то шифрования диска со вводом пароля в момент загрузки, подключившись по IP KVM или аналогам либо в initramfs ssh либо к примеру свой гипервизор ... то твои файлы достаточно защищены (настоятельно рекомендую арендовать для таких задач физическое железо а не vps-ку и устанавливать на него свой гипервизор а задачи запускать в виртуальной машине, атака на такой конфиг тупо дороже)

Худший ответ:
Может. А зачем ему это?
Вопрос: Как в Windows создать файл с кириллицей в названии файла?

Лучший ответ:
Может быть так сработает?
with open('f.txt') as file:
    lines = file.read().splitlines()

for line in lines:
    print(line)
    with open(line.encode('utf-8'), 'w') as file:
        file.write('')

Тут мы явно указываем, что имя файла в кодировке UTF-8, а не в однобайтной кодировке OEM.

Худший ответ:
 The default encoding is platform dependent (whatever locale.getpreferredencoding() returns), but any text encoding supported by Python can be used.
Так что Ultra-Bad Coder прав. По дефолту на винде у тебя f.txt открывается с кодировкой windows-1251, а в линуксе по дефолту юникод поди.
Лучше всегда при открытии явно указывать режим и ожидаемую кодировку файла.
Вопрос: Зачем 2 Microsoft Visual C++, x86 И x64?

Лучший ответ:
это общие библиотеки для 32 и 64 битных приложений. 
удалять не стоит

Худший ответ:
x86 приложения не могут потреблять библиотеки от x64 и наоборот.
По тому и есть сразу два варианта
Вопрос: Где хранится код сайта?

Лучший ответ:
Разово заплатите старому программисту, хостеру или фрилансеру, которому можете доверять за работу.

получите архив и памятку как и куда разворачивать можно

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

Худший ответ:
Я уверен что ваш предыдущий разработчик делал бекапы (все делают) - вот и попросите его последний бекап Вам переслать. Гадать что там и как у Вам на сервере бессмысленно.
Вопрос: Почему токен недействителен?

Лучший ответ:
Ответ выше является устаревшим.

Параметр bot=False удален поскольку это нарушает условия дискорда. 

Если хотите использовать селф бота либо используйте устаревшие не поддерживаемые библиотеки или пишите взаимодействия с апи дискорда самостоятельно.

Худший ответ:
потому что у тебя нет значения bot=False в bot.run
фулл готовый код
import discord
from discord.ext import commands

intents = discord.Intents.all()

bot = commands.Bot(command_prefix='>', intents=intents, self_bot=True)

@bot.command()
async def ping(ctx):
    await ctx.send('pong')

bot.run('Токен Аккаунта дискорд',bot=False)
Вопрос: Собираюсь создать интернет-магазин. Выбор лег на WordPress, какой плагин выбрать?

Лучший ответ:
Из вариантов это самый банальный - WooCommerce, а также Ecwid Ecommerce.
Woocommerce. Что-то мне подсказывает, что он не просто так  стал самым "банальным" вариантом...

В современных реалиях первый вариант может быть вполне пригоден для реализации?
Интересно, чем отличаются Ваши реалии?)

И стоит ли вообще делать сайт на WordPress, если в планах серьезный упор будет на SEO-продвижение
Да, как и любой другой движок, вопрос в умении пользоваться.

Худший ответ:
Используйте OpenCart. Функционал до боли легкий и специально заточен под интернет магазин. В плане SEO нет проблем.
У Вас в WooCommerce ноль опыта. Время только потеряете.
Вопрос: Восстановление закрытого PUBG Lite?

Лучший ответ:
Да, возможно.

Проще всего - купить проект. Он же остался, хоть и закрытый. Осталось связаться с разработчиками и обсудить, какая цена их устроит. Оба действия: связаться и обсудить - вполне возможны. Конечно, нужны будут деньги. А кто говорил, что будет легко? Речь о том, что это возможно.

Может даже оказаться, если не договоритесь о цене, что ещё дешевле будет переписать и сервер, и клиент с нуля. Из незащищённого клиента будет не очень сложно выковырять полюбившиеся текстуры и модельки. Но такая разработка тоже стоит денег. Всё делать одному будет слишком долго. А кто говорил, что будет легко? Речь о том, что это возможно.

Худший ответ:
Сервер вы сами не реализуете. Можете забыть про данную глупую затею
Вопрос: Чем отличается язык программирования?

Лучший ответ:
Могу ли я использовать свой опыт C# .NETFramework 4.8 в остальных реализациях?
Да. Хотя не уверен, что у тебя есть какой-то значимый опыт, судя по вопросам.
В интернете есть 3 версии языка программирования
Версии самого C# идут от 1 до 10, включая ещё дробные 7.1 и 7.2
А ты перечислил разные версии конкретных реализаций рантайма (mono, netcore, .net framework)
Да и вообще сейчас актуальная - .NET 6 (без слова "framework")

Худший ответ:
Существенно ни чем не отличаются.
Вопрос: Как шифровать на C++ при помощи MD5?

Лучший ответ:
MD5 - это не алгоритм шифрования, шифровать при помощи него не получится.
А по поводу хеширования на С++ - что мешает нагуглить готовые решения?
https://www.google.com/search?q=MD5+C%2B%2B

Худший ответ:
3десь два файла md5.cpp,md5.h https://github.com/Beginerok/Tropic-Island/tree/ma...
#include "MD5.h"
std::string query;
md5(pass);
Вопрос: Как в Grafana (zabbix) чекать интернет соединение?

Лучший ответ:
Ничего не понятно, но очень интересно (с)

В заббиксе есть стандартные элементы данных для подобных случаев - icmpping и net.tcp/udp.service. Их недостаточно?

Худший ответ:
просто пингаешь раз в минуту через icmpping твой IP
Я бы добавил еще ближайший роутер твоего провайдера, какой-нить айпи в городе и какой-нить айпи зарубежом.
И в графане уже рисуешь табличку по всем, будет наглядно видно на каком этапе проблема.
Вопрос: Swift. Как с помощью цикла найти min и max в массиве?

Лучший ответ:
Извините, но это - "школьная" программа. Тут не решают за других "домашку". Тут помогают понять то что не понятно. 

Покажите что вы делали и что у вас не получилось, и мы вам поможем понять почему не получилось.

Худший ответ:
import Foundation

let numbers = [5, 1, 6, 2, 4, 3]
print(numbers.min) // 1
print(numbers.max) // 6

В общем, цикл здесь не нужен.

Но если очень хочется цикл:

var minNumber: Int = 0
var maxNumber: Int = 0

for number in numbers {
    if number < minNumber {
        minNumber = number
    }
    else if maxNumber < number {
        maxNumber = number
    }
}

print(minNumber) // 1
print(maxNumber) // 6

Или:

var minNumber: Int = 0
var maxNumber: Int = 0

numbers.forEach { number in
    if number < minNumber {
        minNumber = number
    }
    else if maxNumber < number {
        maxNumber = number
    }
}

print(minNumber) // 1
print(maxNumber) // 6
Вопрос: Как удалить дубликаты IP-адресов с разными портами?

Лучший ответ:
1. Отчекрыжьте всё, что после двоеточия, например, как-нибудь так: cut -f1 -d":"
2. Натравите на sort -u

Добро пожаловать в линукс (либо поменяйте тэги).

Худший ответ:
Можно наверное загрузить в sqlite и там применить оконную функцию. Взять в группе первый попавшийся адрес. 

Если автору нужно быстро готовое решение - то пускай публикует весь список адресов здесь. Ему какая-то добрая душа поможет.

Так... эта задача балансирует на грани - sed/sort - писать лениво. SQLite - оверхед получается для одного раза.