В этом блоге я сделал тест, который поможет вам определить, оптимален ли ваш сетап или нет. Ниже я напишу список критериев, по которым я буду его оценивать и разбаловку. И в конце вы сможете узнать, к какой "группе людей" вы относитесь, прямо как в тестиках на персонажа из аниме в Вконтакте.
Я сюда включил практически всё, что мне пришло в голову, если я что-то забыл, предложите в комментариях. Но добавлять вещи как У меня есть интернет и На моей клавиатуре есть большая часть клавиш я не буду :)
Это несерьёзный блог, но если вы новичок, вы, может быть, найдёте для себя что-то новое. Но это всё равно никак не поможет вам поднять рейтинг, для этого нужно решать задачи.
Вы можете компилировать код перед посылкой
- $$$0$$$ баллов: Я не знаю, как компилировать код самостоятельно, и просто отправляю его на проверку
- $$$10$$$ баллов: Я умею запускать код до отправки
Я видел много школьников, которые отправляют посылки никогда не запуская. Даже в институте такие встречались. На последнем див 4 соревновании [73 страницы Compilation Error] в задаче А (https://codeforces.net/contest/2009/status/page/1?order=BY_JUDGED_DESC) Кажется, таких людей даже больше, чем я ожидал)
Если вы не умеете это делать, вам нужно этому научиться. Даже турист проверяет свои решения на сэмплах, иногда даже в простых задачах
Ваша среда работает стабильно и без лагов
- $$$0$$$ баллов: Моя среда постоянно падает и зависает
- $$$2$$$ балла: Моя среда иногда глючит и даже иногда падает.
- $$$4$$$ балла: Моя среда работает отлично и никогда не глючит
Когда я в школьные годы участвовал в олимпиадах, я постоянно мучался с предложенным компьютером. Он зависал, крашился, несколько раз мне даже давали поменять компьютер. Но я тогда ничего не знал и зачем-то пользовался вижлой на слабых машинах. Это очень неудобно и тратит много времени
Вы можете запускать свой код без интернета
- $$$0$$$ баллов: Я пользуюсь онлайн редактором и при падении интернета не могу запускать свой код
- $$$2$$$ балла: Всё установлено на моём компьютере, и отсутствие интернета никак не повлияет на то, могу ли я запускать свой код
Существуют такие онлайн компиляторы, которыми я совсем не рекомендую пользоваться. Зависеть от посторонних сайтов или от интернет провайдера — странная проблема, её лучше избегать
Вам может быть полезна подсветка синтаксиса, и вы ей пользуетесь
- $$$0$$$ баллов: Я не использую подсветку синтаксиса, но если бы я знал как её включить, я бы пользовался
- $$$2$$$ балла: Я использую подсветку синтаксиса
- $$$2$$$ балла: Я не использую подсветку синтаксиса, хотя знаю как её включить.
Если вы дальтоник, или вы, как мой батя, просто привыкли писать синими буквами на синем фоне, то подсветка кода разными цветами должна вам помочь, это облегчает его чтение.
Вы можете проверить, сколько секунд работала ваша программа
- $$$0$$$ баллов: Я не могу проверить, сколько секунд работала моя программа
- $$$1$$$ балл: Я могу проверить, сколько секунд работала моя программа, и мне для этого не нужно писать ничего нового в коде
Полагаться на то, что если на вашем компьютере работает решение < 1 секунды, то на проверяющих серверах произойдёт то же самое — нельзя. Но иметь возможность сравнить, быстрее ли работает ваше решение или нет после какого-нибудь фикса — бывает очень полезно.
Вы можете проверить, сколько памяти потребила ваша программа
- $$$0$$$ баллов: Я не могу проверить, сколько мегабайт использовала моя программа
- $$$1$$$ балл: Я легко могу проверить, сколько мегабайт использовала моя программа
Иногда сложно точно сказать, сколько памяти потребляет ваша программа на макс тесте, и бывает удобно запустить её самому и проверить это, а не тратить лишнюю одну посылку
Вам подсвечиваются ошибки во время написания кода (другими словами, вы используете Language Server)
- $$$0$$$ баллов: Когда я допускаю ошибку в синтаксисе, я это вижу только после компиляции/запуска программы
- $$$3$$$ балла: Когда я допускаю описку в коде, то это место подсвечивается, чтобы я сразу мог это исправить.
Если у вас не включено подсвечивание ошибок на ходу, то тогда вам нужно перезапускать код несколько раз, чтобы исправить такие ошибки как vctor<int> A;
. Это тратит лишнее время
Ваш язык программирования легко решает все те задачи, до которых вы доходите в контесте
- $$$0$$$ баллов: Случалось, что я не смог решить задачи, и это произошло исключительно из-за языка программирования, который я выбрал
- $$$3$$$ балла: Мой язык программирования никогда не был причиной моего неуспеха
У некоторых задач слишком жёсткий тайм лимит, чтобы заливать её на медленных языках. Иногда это всё-таки можно сделать, но нужно приложить дополнительные усилия. Я не буду называть какие же языки нужно относить к "проблемным" — у меня нет такой компетенции, но если вы когда-нибудь сталкивались с похожими проблемами, вероятно, вы неоптимальны.
Вы можете быстро копировать к себе готовые алгоритмы/структуры данных
- $$$0$$$ баллов: Я никогда не копирую код и пишу всё руками / Я постоянно копирую код, который нахожу в интернете
- $$$2$$$ балла: У меня есть своя библиотека с алгоритмами/структурами данных, если мне что-то нужно, я ищу нужный алгоритм в ней и копирую его себе в код.
- $$$3$$$ балла: У меня есть своя библиотека и я могу горячими клавишами (сниппетами?) легко вставлять из неё в мой код, не покидая моего текстового редактора
Писать дерево отрезков руками 3 раза за контест — точно плохая идея. Скопировать его даже 1 раз всегда быстрее. Особенно если вы можете это сделать, не выходя из своего редактора. Часто приходится в алгоритмах что-то поменять, поэтому лучше пользоваться своей библиотекой, чтобы на 100% понимать, как всё работает, и если что быстро менять.
Вам не нужно копировать и вставлять тест каждый раз при запуске программы
- $$$0$$$ баллов: Каждый раз, когда я запускаю мой код, мне приходится скопировать тест из задачи и вставить его
- $$$2$$$ балла: Мой сетап позволяет запускать один и тот же тест несколько раз, не копируя его каждый раз.
- $$$3$$$ балла: Я могу вставить несколько тестов сразу, и по нажатию 1 кнопки запускать моё решение на всех из них
Копировать тест каждый раз при запуске программы — тратит очень много времени. Не стоит выполнять лишнюю работу. Также не стоит забывать, что иногда удобно иметь возможность вводить тест по частям, например в интерактивных задачах.
У вас удобное сообщения о ворнингах/ошибках
- $$$0$$$ баллов: Ворнинги/ошибки, которые я вижу после компиляции, мне не понятны и никогда мне не помогают
- $$$1$$$ балл: Ворнинги/ошибки, которые я вижу, мне иногда помогают, но я знаю что они могут быть лучше
- $$$2$$$ балла: Ворнинги/ошибки, которые я вижу, мне всегда помогают понять, что конкретно не так с моим кодом
Я использую C++ и после того, как я настроил флаги компиляции, стало намного удобней. Раньше сообщения мне совсем не помогали, а теперь я всегда смотрю на окошко ошибок. Я не смог настроить по-нормальному санитайзеры, так что знаю, что можно сделать ещё удобней. Если вам интересны такие вещи, советую почитать этот блог.
Использование авто-парсера контестов
- $$$0$$$ баллов: Мне приходится копировать тесты из задач руками
- $$$1$$$ балл: Я использую парсеры контестов, которые автоматически копируют тесты с контеста
Есть удобные тулы которые позволяют копировать тесты из контестов, очень удобно.
Ваш код легко прочитать, и как следствие легче взломать
- $$$0$$$ баллов: У меня большой темплейт (>50 строк), который делает мой код непонятным
- $$$1$$$ балл: У меня нет темплейта / он <= 50 строчек / он > 50 строчек, но я уверен, что он не мешает читаемости кода.
Из-за того, что на кодфосес всё ещё есть взломы, лучше делать код понятнее. Так как всегда лучше, если вас взломают на контесте и вы исправите ошибку, чем если вы упадёте на системных тестах. (Ну, кроме анти-хэш тестов и прочего)
У вас есть возможность запустить дебаггер (так, чтобы вам было удобно им пользоваться).
- $$$0$$$ баллов: У меня нет возможности запустить дебаггер / есть возможность, но им очень неудобно пользоваться
- $$$1$$$ балл: Если я захочу, я могу запустить удобный дебаггер, просто предпочитаю им никогда не пользоваться
- $$$1$$$ балл: Если я захочу, я могу запустить удобный дебаггер, и пользуюсь этим
Даже если вы не используете дебаггер, иметь возможность запустить его — точно плюс. Принтить в консольку не всегда быстрее.
Использование функций для принта в консоль для дебага
- $$$0$$$ баллов: Я использую стандартный
cout
илиprint
для дебага. - $$$1$$$ балл: Я использую продвинутые способы принтов для дебага, например использую макросы, чтобы выводить название переменных вместе с их значением, могу легко вывести содержимое массива одной строкой.
- $$$3$$$ балла: У меня есть большая библиотека для дебага, с помощью которой я даже могу выводить в удобном формате графы и структуры данных
У вас настроен удобный способ для стресс-тестирования
- $$$0$$$ баллов: Я не использую стресс тестирование и у меня нет сетапа, чтобы это делать.
- $$$2$$$ балла: Мой шаблон сделан так, чтобы я мог стресс тестировать свои решения
- $$$3$$$ балла: У меня есть скрипт, который позволяет мне стресс тестировать мои решения.
Если вы не слышали про стресс тестирование, то вы получаете 0 очков за этот пункт, но также вам стоит посмотреть это крутое видео, которое хорошо про это рассказывает.
Вы используете vim motions/ или другие продвинутые горячие клавиши для редактирования текста.
- $$$0$$$ баллов: Я не использую vim motions или другие похожие продвинутые горячие клавиши для редактирования текста
- $$$2$$$ балла: Я использую vim motions или другие похожие продвинутые горячие клавиши для редактирования текста.
Выделять тексты мышкой — точно не оптимально. Если вы убираете постоянно руки с клавиатуры, или вы перемещаетесь по тексту стрелочками, знайте, что есть способ лучше, vim motions очень вас ускорит.
WPM при печатаньи (Слов в минуту).
Если вы не знаете свою скорость, рекомендую затестить её тут. Я понимаю, что скорость печатанья это не совсем "сетап", но, мне кажется, это достаточно относится к делу, чтобы включить в блог.
Вообще я думаю, что скорость печатанья почти не влияет на результат, за исключением крайних случаев. Если вы печатаете уж слишком медленно, это может вам мешать. Также если вы очень очень быстрые, то тогда вы можете заработать много рейтинга в speedforces контестах.
Использование нескольких файлов для кода
- $$$0$$$ баллов: Я использую 1 файл, там я пишу все мои решения. Если мне нужно писать 2 решения параллельно, я сохраняю одно из них в блокнотике.
- $$$1$$$ балл: Я могу писать код в нескольких окнах параллельно.
Часто бывает, когда не дописав текущую задачу, вы начнёте писать другую. Если для этого вам нужно копировать куда-то ваш код, то тогда вы тратите лишнее время.
Использование класса для модульной арифметики
- $$$0$$$ баллов: Я не использую специальных классов для модульной арифметики и мой код выглядит примерно так
d = ((a+b)%mod - c + mod)%mod * e % mod
- $$$1$$$ балл: Я использую специальный класс для модульной арифметики и мой код выглядит примерно так
d = (a+b-c)*e
Сравнение результатов работы тестов и правильных ответов
- $$$0$$$ баллов: Когда я запускаю тесты, я вручную проверяю, совпадают ли они с ответами или нет .
- $$$1$$$ балл: Когда результат теста не совпадает с ожидаемым, в моём интерфейсе это подсвечивается
Когда в самплах большие тесты, сравнивать их вручную с правильными ответами похоже на игру "найди 5 отличий на картинке". Лучше автоматизировать этот процесс.
Считаем баллы
Теперь сложите все очки, которые вы получили, и найдите себя в табличке ниже, чтобы узнать какой же вы спортивный программист:
- 47-50) Либо у вас $$$\color{orange}{2300}+$$$ рейтинга и вы используете крутой удобный сетап, либо вы ~ $$$\color{green}{1200}$$$ и тратите слишком много времени на оптимизирование вашей среды, когда на самом деле вам просто нужно решать задачи
- 36-46) У вас неплохой сетап, бабушки называют вас "хакером".
- 20-35) В вашем сетапе есть проблемы, либо вы слишком близко к сердцу восприняли фразу "чтобы решать задачи, нужно просто решать задачи", либо вы панк $$$\color{black}{L}\color{red}{GM}$$$, которому без разницы, что использовать, чтобы выиграть контест.
- 13-19) Вы олимпиадный математик, и вы сидите на кодфорсес только потому, что математические олимпиады намного скучнее в онлайн формате.
- 0-12) Вы должны быть счастливее, чем остальные группы в этом списке, так как у вас реально есть способ повысить свой рейтинг, не решая задачи по программированию, потому что ваш сетап сравним с написанием контеста с кнопочного Нокиа.
Кстати я веду занятия по программированию, $$${1900}$$$ руб в час за индивидуальные, $$${600}$$$ рублей за групповые занятия (группы из 3х человек), бесплатное первое занятие. Напишите мне на Codeforces, если заинтересованы.
I have 36 points, I use the CP editor
i have 33 and i use cp editor either.
Got 39 pts using Neovim + LuaSnip + several LSP-related plugins. Vim motion is really useful (and cool), I highly recommend it if you have not tried it before!
I got 37!
A lot of zero points are actually done intentionally, because I'm practicing for online OI contests, where you should code everything from scratch, so a lot of options like having ready libraries or class for modular operation are just 0 points.
This is also my excuse for having a 32...
27 points....
Clion solves all problems!
how many points you get?
32 points here
I got 28 points.
you're one edit distance away from being wind_easle
25 points using default codeblocks
Codeblocks has a starting credit of -10.
Why? I do not understand... Is Codeblocks really so bad?
Got 32
I got 29
31 points.
A lot of advice here is actually bad for people practicing for onsite competitions.
You are able to see how many seconds your program took to run
This section probably has a mistake, since you get 1 point if you don't see how much time it took to run
Woops, thank you, fixed the mistake.
I wonder if I should swap the like buttons. I am not sure which one of them people clicked, the indented one with wrong amount of points, or the wrong one with the correct amount of points)
After the fix I personally got 45. Have room for improvement :)
i got 52 points
With vs code ?
use CP Editor to get 19pts 🤣
38
I received 19 points! I think a better setup would not change much about my performance which is mostly bottlenecked by a problem solving speed/skill issue.
33 points.
CPEditor + Almost no template + Bad debugging environment
Almost no template: I just remember a random problem(and its exact ID) then open the online judge for my code.
Bad debugging environment: in my opinion the common "print()" command is enough because what I want is just one or two critical value, it is easy to read the log without extra note.
25 points
Usually 10 points, except when I'm solving a very easy A very quickly.
4 points
2 points
2 points: I use syntax highlighting
0 points: I usually don't do this, but if I feel like my Python code might TLE, I use C++. If I think my C++ code might TLE, I'll go to custom invocation to see the time.
0 points: I never look at memory.
0 points, but it immediately tells me as soon as I try to run it, so I don't really waste any time.
0 points, but if Python is too slow, I'll use C++.
0 points
0 points
2 points: Unlike in C++, I know exactly which line the error occurred in and what caused the error.
0 points
1 point
1 point
0 points, but printing arrays is really easy.
0 points
0 points
2 points
1 point
0 points, but my code looks like this:
d = (a+b-c)*e%mod
0 points
40 points with vscode and cph :)
what's cph?
Competitive Programming Helper. A powerful extension for vscode. It can automatically download test cases and run and judge problems quickly. And you can even submit your code to codeforces just with one click on "submit" button(if codeforces server didn't crash)
28 points
I get 31 points and your debugger is far better, how?
How do you know that? Are you spying on me?
Hahaha just kidding, we are ICPC teammates
25 points using an online compiler
27 points
43 with nvim + Competitest.nvim + having my local library with oj-bundle instead of using snippets
Using debugger 1 point!? It should be at least 5
print works very well :)
It absolutely doesn't compared to gdb, which literally tells you the line with the RTE, while with prints you can often not even have an idea what kind of error may be happening in your code.
I remember I lost gold on IOI cause I wasn't able to debug my simple bruteforce solution within half an hour. After the competition my leader came to my workstation, ran the gdb and showed me the line with the error and that took like 15 seconds. Starting to use gdb might have been the single biggest improvement ever to my performances (ok, maybe the second one, beside #define int long long :))
python works very well
For some RTE I prefer "-fsanitize=undefined"(linux only), which also tell you not only the line with RTE but also the type of error(out of bounds, null pointer, integer overflow).
Yes, it's great too! I always have it and -fsanitize=address and -DGLIBCXX_DEBUG (it whatever it's called xd) as well. But I think gdb still gives you more information and is still very useful
I don't use a special class for modulo. My code looks like this:
d = mul(sub(add(a,b), c), e)
44 using cpeditor
I got 28 with ideone.com. The main challenge is solving/debugging interactive problems without any local testing.
How strange, right?
Whenever there be cheaters: kinds of this comment exist: "focus not on them yet persist and improve." And we do downvote those.
No we have this blog: stating: "you are a bit too hardcore about "to be better at solving problems I have to solve problems."" I did math. I calculated sum of points for the majority vote. It leads to 29 points. We notice it falls under this statement. And we do upvote this.
So why are we then saying: "merely you are functioning not optmially, you should try to improve:" however when it be cheaters (important issue in community), we downvote, when it be unhelpful survey (for just but entertainment purposes) we upvote?
I'm not sure whether I understand what you're trying to say correctly, but I think the community is rather reasonable.
As Mike said, entertaining content (like this one) can have a place on codeforces. I consider this one pretty interesting and helpful since it includes many tips regarding setup for beginners (although it might not be as good for onsite contests).
On the other hand, some people who talk about cheaters tend to blame Mike and other admins for not doing anything, when it's just that the plagiarism check hadn't run for that round yet.
If what you wanted to know is why those comments that tell one to focus on improving themselves rather than on cheating are downvoted, it's probably because these comments are considered more or less "inconsiderate" in the context. What's wrong with telling people they should practice more to obtain better results? The point is that these comments in cheating-related blogs make people feel what they mean is "it's your own skill issue, I don't care."
Nice post; there are a lot of things in here that I think are actually pretty valuable for beginners to fix. I'm somewhere around 44 points, +/- a bit depending on how generous you are. I'll share a few thoughts/suggestions for those working on their setups since I've enjoyed optimizing my setup over the years. If anyone wants to learn more about my setup, see here and here.
One big-picture note is that if you're on Windows, I think installing WSL is the easiest way to get a lot of these setup optimizations. In general, I find installing program tools much easier on the Linux terminal than on Windows; I'm a huge fan of the Windows/WSL setup because most of the programming tools I use for CP (e.g. Vim, g++, etc) feel jankier/more annoying to set up on Windows, while most other things I use feel jankier/more annoying to set up on Linux.
Agree with the OP that I've seen a lot of people not be able to do this. Seems pretty important...
If I were writing this survey, I would have added extra points for being able to compile quickly. There are some pitfalls that can cause compilation to be very slow (e.g. excessive debugging flags, iirc whether you use precompiled headers may contribute, etc).
Editor latency is the primary reason I originally switched away from CLion. I'm pretty latency-sensitive and CLion felt unresponsive to me. Vim, Geany, and Sublime Text are all reasonable options I've tried that feel better in this respect.
I think that using online compilers is a cause of a lot of the other issues discussed in this post, but not a symptom itself. I would be equally happy with my setup if I could only use it while connected to the internet; the problem is that most actual online compilers are far less smooth, easy to use, etc.
Absolutely zero syntax highlighting feels a little crazy to me, but you do you.
I think most times, displaying time is a waste of interface space--I don't really care whether my code took 5ms or 10ms on sample test 1. I do think being able to time your code when you run it on large tests is important, and I use the built-in Linux time command for that.
I gave myself -1 points here, I think there's a way to do this but I haven't learned it...
On a semi-related note, I do think there should be points for having a high/unlimited stack size limit. In most setups, the default behavior is for C++ to crash when you allocate a large data structure on the stack. This makes sense in real-world applications, but in competitive programming it's often useful to be able to define large variables globally (also, adjusting your overall memory limit is mandatory in Hacker Cup).
-3 points here. I honestly don't think this is that important once you have some experience with your programming language; at most it would save me a little time parsing C++ error messages? Any of the language servers I've checked out seem like they'd be annoying to configure in order to avoid warning me about any style issues/things I generally don't care about.
Back in high school, I spent a lot of energy trying to convince people that using C++ wasn't actually that big of an advantage. I gave up in around 2018, but certain people are still making other languages work :)
This is easy with Vim: I store my templates in a folder, I symlinked it to ~/cpl (CP library), and now I do :r ~/cpl/FILENAME.cpp to copy the file at my cursor. This is easy to remember and I don't have to set up snippets individually every time I add a template.
I wrote a custom tool for this--there are a lot of similar things out there, but none that were organized exactly how I wanted. I haven't released it publicly since the code is poorly written and contains a lot of hacks that only work on my PC, but if you want to learn more see the second video I linked.
I gave myself -1 here; it's close, but there's some undefined behavior my compiler doesn't catch. I think it's worth it to speed up compilation by several seconds, though.
This is done by my CLI.
I'll give myself the point here; my template is a bit over fifty lines but I think the resulting code is readable.
While I agree that some templates can go overboard, I think at the very least for loop templates (i.e.
FOR(i, a, b)
instead offor (int i = a; i < b; i++)
) are helpful. Before I had my template, I often wrote patterns likefor (int i = a; i < b; i++) for (int j = c; j < d; i++)
, and the resulting errors were a huge pain to debug.-1 point here. I think the CLion debugger is generally helpful (sadly, the editor is otherwise missing a lot of features that are important to me), but gdb is a slog to use imo and printline debugging is almost always faster for competitive programming use cases.
Giving myself the three points here, though I don't think the way I output graphs is necessarily optimal (open to hearing others' suggestions on this!). My debugging setup does output STL data structures in a way that makes sense, though. It'd be interesting to try to add functionality to print out some of my library data structures (e.g. segtrees).
I think that aside from being able to compile, stress testing is the single most important thing on this list, and I think anyone at an intermediate level (cyan/blue-ish) or above stands to gain tremendously from a good stress testing script. I estimate that my stress-testing setup is worth on the order of 200-300 rating for me, and it also makes CP much more fun not having to spend a huge amount of time staring at my code while debugging.
I like that you awarded extra points for using a stress testing command line script, as I think this is much faster in-contest than using a code template.
Stress testing is one of the main draws of WSL for me; my Linux stress testing script is on the order of 10x faster than my Windows stress testing script.
I use Vim, but I don't think not using it really slows you down that much.
160wpm on Monkeytype, probably more like 120-130 during everyday use.
This one is pretty important; with a lot of editors (mostly ones that try to organize your code into projects), the default setup is to code in one file and then you have to move all the code you aren't actively working on elsewhere. This is kind of a pain, and I think it's a good reason to prefer text editors over fancy IDEs (unless you've configured your fancy IDE to avoid these issues).
This is more valuable than I expected it to be; it makes code a lot more readable and it's nice not having to worry about missing MODs when debugging.
My CLI handles this. Linux diff is also helpful for really large cases.
Excuse me, I found this is offensive:
old ladies who have no clue about how computers work
The Hitchhiker's Guide to the Galaxy was correct. I got 42 points.
31 balls using cp editor with only language server
38 using CLion
34 points with Dev C++
44
34 using sublime text
24 using codeblocks
"I compile my code before submitting"
Does compiling on cf custom invocation count?
For most of my time all I use is cf custom invocation and its own code editor. No VS code, nothing fancy... I don't think that's a very optimal setup...
[PS this scores 14, so if you score below that then perhaps you should just switch to cf invocation]
[PPS the description is quite accurate, look at my username :)]
why don't you download something not fancy like geany for example
the simplest reason was that I never really encountered any problems with codeforces invocation, and they were good enough for my purposes. Also, I tried setting up VSCode but never managed to get it to work, so there's that.
I mean, codeforces invocation is slow during a contest, so you can't compile fast
i have 30, i use vim with my own custom setup
I am a punk master
Windows + MinGW + Far Manager without any configuration and prewritten code
33 points with CPEditor
41 point, I earn at least 10~ points by just using vim + families with console lol (ex. vim allow split screen inherently, vim motion, not laggy editor.../diff command in unix/using output redirection to not copy paste testcase everytime etc...)
40 points with vscode
I got 19 and you couldn't describe me better lmaoo
I got 34.