Йкестендіру ұстанымы. 1 страница
Сәйкестендіру аспектілерінің бірі басқа операциялық жүйелер үшін жазылған немесе берілген операциялық жүйенің алғашқы жазылған версиясы, сонымен қатар басқа да операциялық платформалар үшін операциялық жүйе бағдарламаларын орындау қабілеті болып табылады. Екілік сәйкестікті қосымшалардың негізгі мәтіндерінің деңгейінде бөлу қажет .
Орындалып жатқан бағдарламаны алуға болған жағдайда және оны басқа операциялық жүйеге жібреген кезде, екілік сәйкестендіруге жетеді.
Ол үшін процессор командаларының деңгейіндегі сәйкестік және жүйелік шақырулар деңгейіндегі тіпті динамикалық байланыста болған жағдайдағы кітапханалық шақырулардың деңгейіндегі сәйкестік қажет. Негізгі мәтіндердің деңгейіндегі сәйкестік жүйелік бағдарламалық қамтамасыз ету құрамындағы транслятордың лайықты көрсетілімін, сонымен қатар кітапханалар деңгейі мен жүйелік шақырулардың болуын талап етеді. Сонымен қатар жаңа орындалатын модульге бар болатын негізгі мәтіндерді перекомпиляциялау қажетті . Әртүрлі архитектураларға негізделген процессорлар аралығында екілік сәйкестікке жету, анағұрлым қиынырақ.
Бір компьютер басқалардың бағдарламаларын орындау үшін (мысалы, IBM PC типіндегі ПК бағдарламасын Macintosh типіндегі Apple фирмасына арналған бағдарламада орындау қажет), мұндай компьютерлер өзіне басынан түсініксіз машиналы командалармен жұмыс істеуге тиісті.
Мұндай жағдайда 680×0 типті процессор (немесе PowerPC) 80×86 процессорына арналған екілік кодты орындауға тиісті.
80×86 процессорында озінің 80×86 екілік кодын иеленеді, сондықтан оның не үшін арналғаның анықтау үшін, содан соң 680×0 үшін жазылған эквиволентті бағдарламаны жүзеге асыру әрбір команданы тандауға тиісті.
Бағдарламалық және пайдаланушылық интерфейстердің сәйкестікті қамтамасыз ету құралдарының бірі болып, бір жүйеден басқа жүйеге жеңіл көшірілу нәтежиесінде UNIX стилінде бағдарламалар жасауға рұқсат ететін POSIX стандартымен сәйкестігі болып табылады.
ТАҚЫРЫП 2. UNIX ОЖ НЕГІЗГІ ЖҮЙЕЛІК
ШАҚЫРТУЛАРЫ
Мақсаты:UNIX ОЖ негізгі жүйелік шақыртуларын ұйымдастыру тәсілдерін қарастыру
Кілттік сөздер:файл, каталог, метадеректер, виртуалды файлдық жүйе, команда, шақырту, уақытты бөлу ядросы, ресурс, үрдіс, командалық интерпретатор, ядро, пароль, аутентификация, идентификация
Дәріс жоспары (1 сағат)
- Файлдар, каталогтар, бағдарламалық каналдармен жұмысқа арналған жүйелік шақыртулар.
- Файлдық жүйелердің әр түрлі типтерінде деректердің және метадеректердің сақталуын ұйымдастыру.
- UNIX, Linux ОЖ файл типтері. Магниттік дискілерде томдарды ұйымдастыру. UNIX, MS DOS/Windows ОЖ файлдармен жұмысқа арналған жүйелік шақыртулар.
- Файл метадеректерін өзгертуге арналған ОЖ жүйелік шақыртулары мен командалары. Linux және Solaris ОЖ виртуалды файлдық жүйелері(VFS).
UNIX – бұл амалдық жүйенің уақытты бөлу ядросы, яғни есептеуіш машинаның ресурстарына иелік ететін және оларды қолданушыға жеткізетін бағдарлама. Ол қолданушыға оз бағдарламасын іске қосуға және перифериялық құрылғыларды басқаруға мүмкіндік береді, файлдық жүйенің жұмысын қамтамасыз етеді. UNIX көптапсырмалы, көпқолданбалы амалдық жүйе болып табылады.
UNIX АЖ-нің жұмысын көптеген өзара байланысты үрдістерді функциялау ретінде көрсетуге болады. Жүйені іске қосқан кезде алдымен shell (үрдіс 1) командалық интерпретаторын іске қосатын ядро (үрдіс 0) іске қосылады.
Қолданушының UNIX жүйесімен үйлесімділігі командалық тіл құралымен интерактивті режимде орындалады. Амалдық жүйенің қаптамасы - shell – енгізілетін командаларды интерпретациялайды, сәйкес бағдарламаларды (үрдістерді) іске қосады, жауапты хабарламаларды қалыптастырады және шығарады.
UNIX-тің негізгі құрылымдық бөлімі болып файлдық жүйе табылады. Ол файлдар мен каталогтар ағашынан тұратын иерархиялық құрылымға ие. Түбірлі каталог "/" символымен ерекшеленеді, каталог ағашына жол "/" символымен ажыратылатын каталогтар аты бойынша беріледі, мысалы:
/usr/include/sys
Әр уақытта кез келген қолданушымен ағымдағы каталог байланысты, яғни қолданушының иерархиялық файлдық жүйеде орналасуы.
UNIX АЖ-нің әрбір файлы файлдарды жазушы (дескриптор) деп аталатын деректердің кейбір құрылымымен анықталуы мүмкін. Онда файл жөніндегі барлық ақпарат бар: файл типі, қатынау режимі, қолданушы идентификаторы, өлшемі, файл адресі, сонғы қатынау және соңғы модификация уақыты, құру уақыты және т.б.
Файлға қатынау аты бойынша орындалады. Файлдың локальді аты 1-ден 14-ке дейінгі өлшемі бар System V нұсқасында таңбалар жиынынан тұрады. Таңбалар ретінде сандарды, латын алфавитінің әріптерін және ‘_’ таңбасын қолданған жөн. Файлдың локальді аты сәйкескаталогта сақталады. Түбірлі каталогтан файлға дейінгі жол файлдың толық аты деп аталады. Егер файлға қатынау "/" таңбасынан басталса, онда толық ат көрсетілген деп есептеледі және оны іздеу түбірлі каталогтан басталады, ал басқа жағдайда файлды іздеу ағымдағы каталогтан басталады.
Кез келген файлда бір неше ат болуы мүмкін. Жалпы файл аты оған сілтеме болып табылады.
Жүйеде тіркелу
Қолданушының жүйеде жұмыс жасауы қолданушыдан аты мен паролін сұрайтын login бағдарламасын іске қосатын getty терминалды рұқсат серверінің активизациялануынанбасталады.
Одан кейін қолданушының /etc/passwd файлында сақталатын ақпаратпен аутентификациясы тексеріледі. Бұл файлда келесі жазбалар сақталады:
- қолданушының тіркелген аты;
- шифрленген пароль;
- қолданушы идентификаторы;
- топ идентификаторы;
- парольдің минималды қолданылу мерзімі жөніндегі ақпарат;
- қолданушы жөніндегі жалпы ақпарат
- қолданушының бастапқы каталогы
- қолданушының shell тіркелімі
Егер қолданушы жүйеде тіркелген болса және дұрыс пароль енгізсе, login /etc/passwd - қолданушының shell тіркелімінде көрсетілген бағдарламаны іске қосады.
Жүйе қолданушылары және файл иелері
Жүйені қолданушы – бұл бағдарламаның іске қосылу мүмкіндігін анықтайтын және файлдарға иелік ететін негізгі құқықтарға ие объект. Шексіз құқықтарға ие жалғыз ғана қолданушы, ол – суперқолданушы немесе жүйе администраторы.
Жүйе қолданушыларды қолданушы идентификаторы (UID - User Identifier) бойынша идентификациялайды. Әрбір қолданушы ұқсас тапсырмалары бар қолданушылар тізімінің бір немесе бірнеше топтарының мүшесі болып табылады. Әрбір топтың өзінің ерекше топтық идентификаторы (GID - Group Identifier) бар. Топқа жату осы топ мүшелеріне тән ортақ құқықтарды анықтайды.
UNIX қолданушысының құқығы – бұл ең алдымен файлдармен жұмыс істеу құқығы. Файлдардың екі иесі болады – қолданушы (user owner) және топ (group owner).
Сәйкесінше файлдарды қорғау атрибуттары файлдың қолданушы-иесінің (u), құқығын, топ-иесі (g) мүшесінің құқығын және басқаларының (o).құқықтарын анықтайды.
Ағындардың бағытталуы және бағдарламалық каналдар
UNIX АЖ-де үш стандартты ағындар бар: енгізу ағыны, шығару ағыны және стандартты протокол ағыны (қателер ағыны).
Ағындардың бағытталуы стандартты енгізу/шығаруды өзгертуге мүмкіндік береді: < - стандартты енгізу көздерінің өзгеруі; >, >> - стандартты шығару қабылдамасының өзгеруі.
Мысалдар:
cat > filename - cat бағдарлама шығарылуының filename файлына бағытталуы (егер бұл файл бар болса, онда оның ішіндегілер жойылады);
cat >> filename - cat бағдарламасының шығарылу құрамын filename файлының құрамына қосу;
cat < filename - filename файлының құрамынан cat бағдарламасының стандартты енгізілуін қалыптастыру.
Стандартты ағындар – енгізу ағыны, шығару ағыны және қателер ағыны (протоколдар ағыны) нөмірленеді – 0, 1 және сәйкесінше 2. Бұл нөмірлерді (ағындар дескрипторларының нөмірлері) анық түрде қолдануға болады. Мысалы:
prog 1>file жазбасы
prog >file жазбасының эквиваленті
Ағын атын файл атынан ажырату үшін, ағын нөмірінің алдына ‘&’ таңбасы қойылады:
prog >file 2>&1
Бұл жерде шығу стандартты ағынының file (>file) файлына қайта бағытталуы орындалып жатыр. Сондай-ақ қате жөніндегі хабарлама да file файлына қайта бағытталатын болады: 2>&1 жазбасы қателер ағынының өз кезегінде файлға қайта бағытталған шығу стандартты ағынына қайта бағытталуын білдіреді.
Ескерту: командалар анализі интерпретатормен оңнан солға қарай орындалады: алдымен ағындардың бірігуі (2>&1) орындалады, содан кейін шығу стандартты ағыны (1) file файлға қайта бағытталады.
Осыған байланыстыоған енгізілген барлық таңбаларды жоятын /dev/null құрылғыларын қолдануда өте пайдалы. Бұл шығу ағындарын толығымен өшірген кезде қолданылады.
Канал – бұлUNIX АЖ-нің үрдістерін енгізу/шығару буферімен байланыстыратын бағдарламалық құрал. Үрдістің осы түрде іске қосылуы
$ үрдіс_1 | үрдіс_2 | ... | үрдіс_n
үрдіс_1-дің стандартты шығысы үрдіс_2 стандартты енгізуге жабық, үрдіс_2-нің стандартты шығысы үрдіс_3 стандартты енгізуге жабық және т.б. болатынын білдіреді.Осыған байланысты бірінші канал, содан кейін бірмезетте барлық үрдістер іске қосылады және олардың орындалуының жалпы уақыты бәсең жүретін үрдіспен анықталады.
Мысал: ls | wc -l
Дәл осы амалды келесідей орындауға болады:
ls > buffer
wc -l < buffer
rm -f buffer
ls командасы экранға ағымдағы каталогтың файлдар тізімін (шығудың стандартты ағынын) шығарады, ал wc -l командасы кіріс ағынындағы жолдар санын есептейді (файлдағы, егер файл көрсетілмесе – стандартты кіріс ағынында). Осылайша, осы екі команданың бағдарламалық каналмен бірігуі ағымдағы каталогтың файлдар санын есептеуге мүмкіндік береді.
Қорытынды кесте:
> file | Шығару стандартты ағынының file файлына бағытталуы |
>> file | file файлына шығару стандарты ағынынан деректер қосу |
< file | file файлынан енгізу стандартты ағынын алу |
p1 | p2 | p1 бағдарламасының шығу стандартты ағынының p2 бағдарламасының енгізу ағынына берілуі |
n > file | Шығу ағынының n дескрипторы бар файлдан file файлына қосылуы |
n >> file | Шығу ағынының n дескрипторы бар файлдан file файлына жазбалар қосу |
n > &m | Ағындардың n және &m дескрипторларының бірігуі |
UNIX жүйесінің командалық тілі
Команданы пернетақтадан енгізу промптың (шақыру), әдетте, - $ пайда болуынан кейін орындалады.
UNIX жүйесімен жұмыс жасауды жеңілдету үшін файлдар атының шаблондарын (немесе метасимволдарды) қолдануға болады.
? – бір кез келген символ;
* - кез-келген символдардың еркін түрдегі сандары
Мысалы:
*.c - "c" кеңейтіліміндегі барлық файлдарды береді;
pr???.* - аты "pr"-ден басталатын файлдарды береді, бес таңбадан тұрады және кез келген кеңейтілімде болады.
Анықтамалық командалар
date – күн мен уақыт тізімін алу.
who – осы сәтте жүйеде жұмыс істеп отырған қолданушылар тізімін алу.
Мысал:
$ who
petr tty4i Mar 11 18:46
ann tty12 Mar 11 16:29
Қолданушы аты, терминал нөмірі, қолданушының жұмыс істеу күні мен уақыты шығарылады. Who am iқолданушының өзі туралы ақпарат шығарады.
man – анықтамалық ақпаратты алу:
$ man [команда аты]
man командасының баламасы ретінде UNIX кейбір түрлерінде use командасы қолданылады:
use [команда аты]
Каталогпен жұмыс істеу командалары
pwd – ағымдағы каталог атын шығару. Мысалы:
$ pwd
/usr/work/petr
ls – каталог ішіндегісін экранға шығару:
$ ls [-кілттер] [каталог аты]
Егер каталог аты көрсетілмесе ағымдағы каталогтын ішкі құрамы көрсетіледі. Кілттер шығару форматын анықтайды, мысалы:
-l - әрбір файл жөніндегі толық ақпаратты шығару;
-a - "." и ".." қоса алғанда, барлық файлдар тізімін шығару;
-t – тізімнің құрылу уақыты бойынша сұрыпталуы;
-C – тізімді алфавит бойынша бір неше колонкада шығару.
Мысал:
$ ls –l
total 5
drwxrwxrwx 6 petr user1 496 Mar 10 12:01 tmp
-rw-rw-r-- 1 petr user1 156 Mar 12 15:26 file.c
-rwxrwx--x 2 root root 4003 Apr 01 11:44 pe.out
рұқсат сілтеме қолд. қолд. файл соңғы файлдың
алу құқығы саны аты группа өлщемі, модифика локальді
аты байт ция уақыты аты
cd – директория ауысуы (каталогтың):
$ cd [каталогтың толық аты]
Бұл жағдайда көрсетілген каталог ағымдағы болады. cd командасы аргументсіз қолданушының бастапқы каталогын ағымдағы каталог ретінде қалыпқа келтіреді.
mkdir – жаңа каталог құру:
$ mkdir [-кілттер] жаңа каталог аты
Жаңа каталог құру үшін қолданушы ағымдағы каталогтың аталық каталогына жазу құқығына ие болу керек.
rmdir – директорияны өшіру:
$ rmdir каталогтар тізімі
Егер қолданушының каталогқа жазу құқығы болмаса немесе ол бос болмаса, жүйе каталогты өшіруге жол бермейді. Ағымдағы каталог өшірілген каталогтар тізбегінде болмауы керек.
Файлмен жұмыс істеу командалары
rm - файлдарды (файлға сілтемені) өшіру:
$ rm [-кілттер] файлдар тізімі
Бұл команда егер қолданушының осы атауы бар каталогқа жазу құқығы болса файлға сілтемелерді өшіреді (яғни файлдың локальді атауына). Егер өшірілетін файл жазудан қорғалған болса, онда команда файлды өшіруге келісім сұрайды.
Кілттер:
-i – әрбір өшірілетін файл үшін келісу қажеттілігін енгізеді ;
-f – кез келген өшірілетін файл үшін келісу қажеттілігін кейінге қалдырады;
-r – барлық файлдың және берілген каталогтың ішкі каталогтарының, кейіннен сол каталогтың өзінің рекурсивті өшіру режимін береді.
chmod – файлды қорғау атрибутының өзгеруі:
$ chmod файлдар тізімінің атрибуты
Файл атрибуттары әр түрлі жолмен берілуі мүмкін:
1) әріптік кодировкамен. Қорғау атрибуттары келесідей белгіленеді:
r – оқылуы бойынша рұқсат;
w – жазылуы бойынша рұқсат;
x – орындалуы бойынша рұқсат.
Қолданушылар категориясы келесідей беріледі:
u – фай иесіне арналған атрибуттар;
g – файл иелерінің топтарына арналған атрибуттар;
o – өзге де қолданушыларға арналған атрибуттар;
a – қолданушылардың барлық категорияларына арналған атрибуттар.
Орындалатын операция келесідей таңбалармен кодталады:
= - берілген қолданушылар категориясы үшін барлық атрибуттар мағынасын орнату;
+ - берілген қолданушылар категориясына атрибут қосу;
- - берілген қолданушылар категориясынан атрибут алып тастау.
Мысал. mar атауы бар қолданушыға және топ-қолданушыға файлдан ооқуға және жазуға рұқсат беру:
$ chmod ug+rw mar.*
2) сегіздік сан ретінде. Қорғау атрибуттарының сандық мағынасы үшөлшемді сегіздік санмен кодталады. Мысалы:
Таңбалық көрініс rwx r-x r--
Екілік көрініс 111 101 100
сегіздік көрініс 7 5 4
Мысал. Қолданушы мен топ-қолданушылар үшін оқужәне жазу атрибуттарын және басқа қолданушылар үшін тек оқу атрибуттарын орнату:
$ chmod 0664 gb??.doc
cat – шығу стандартты құрылғысына файлдардың шығарылуы және қосылуы:
$ cat [-кілттер] [кіріс_файл1[кіріс_файл2...]]
Команда көрсетілген файлдарды кезегімен оқиды, егер олар бірнешеу болса, оларды біріктіріп және есептелген берілгендерді шығудың стандартты ағынына (экранға) шығарады. Ағындарды қайта бағыттау (бағдарламалық каналдарды) көмегімен cat командасы әр түрлі амалдарды орындауда қолданылуы мүмкін.
Мысалдар:
1) $ cat > file1
- file1 файлында пернетақтадан терген мәтін жазылады.
Егер осыған дейін file1 файлы құрылмаған болса, ол құрылады; егер құрылған болса, оның бастапқы мәліметтері өшіріледі. Мәтінді енгізу Ctrl+D пернелер комбинациясын басқан кезде аяқталады.
2) $ cat file1 > file2
- file1 файлындағы мәліметтер file2 файлына көшіріледі. Бұл кезде file1 өзгеріссіз қалады.
3) $ cat file1 file2 > result
- file2 файлындағы мәліметтер file1-ге қосылады және result файлына көшіріледі.
4) $ cat file1 >> file2
- file1 файлының мәліметтері file2 файлының соңына қосылады.
cp – файлды көшіру:
$ cp кір_файл_1 [кір_файл_2 [...кір_файл_n]] шығ_файл
Бұл команда екі режимде қолданылады:
1. егер шығыс файл қарапайым файл болса, онда кіріс файл тек біре ғана болады; оның ішіндегісі шығыс файлына көшіріледі. Егер шығыс файлы құрылған болса, онда оның бастапқы мәліметтері өшіріледі, ал қорғау атрибуттары қалады; егер шығыс файлы құрылмаған болса, онда ол құрылып, кіріс файлының атрибуттарына ие болады.
2. егер шығыс файлы каталог болса, онда оған барлық көрсетілгенкіріс файлдары көшіріледі, бірақ каталог міндетті түрде алдын ала құрылған болуы керек.
Мысал. Ағымдағы каталогтан өз көрсетілген аттарымен екі файлды көшіру:
$ cp f1.txt f2.txt ../usr/petr
$ ls ../usr/petr
f1.txt
f2.txt
mv – файлдар сілтемесі:
$ mv кір_файл_1 [кір_файл_2 [...кір_файл_n]] шығ_файл
Сілтеме командасының көшіру командасынан айырмашылығы кіріс файлының команда орындалғаннан кейін жойылады.
Мысал. Көрсетілген каталогтан "c" кеңейтілімі бар файлды ағымдағы каталогқа көшіру:
$ mv petr/*.c
ln – файлға жаңа сілтемелер жасау:
$ ln вх_файл_1 [вх_файл_2 [...вх_файл_n]] вых_файл
Бұл команда екі режимде қолданылады:
1. егер шығыс файл қарапайым файл болса, онда кіріс файлы біреу ғана болады; бұл жағдайда оған шығ_файл деген атпен сілтеме жасалады және оған кір_файл_1 деген атпен, сондай-ақ шығ_фаайл атымен қатынауға болады. Файлға сілтемелер саны жазбада 1-ге көбейіп отырады.
2. Егер шығыс файл каталог болса, онда атаулары бар барлық кіріс файлдары және оларға сілтемелерде элементтер құрылады.
Мысал:
$ ls
file1
$ ln file1 file2
$ ls
file1
file2
ТАҚЫРЫП 3-4. ОПЕРАЦИЯЛЫҚ ЖҮЙЕ
ҮЗІЛІСТЕРІН ӨҢДЕУ
Мақсаты:ОЖ үзілістерін өңдеу мен нақты уақыт операциялық жүйелерін үзілістердің дамыған жүйелерін құрастыруын және үзілістерді өңдеу кезектілігін қарастыру
Кілттік сөздер:үзілістер механизмі, үзілістер диспетчері , модуль, кодтық сегмент, режим, аппараттық платформа
Дәріс жоспары (2 сағат)
- Бағдарламалық үзілістер және эмуляторлардың құрылысы.
- Орталық процессормен орындалатын амалдар құрамын кеңейту үшін бағдарламалық үзілістер командаларын пайдалану.
- Аппараттық үзілістер. Нақты уақыт операциялық жүйелерін үзілістердің дамыған жүйелерін құрастыру.
- X11 және Photon графикалық ішкі жүйелері. Қашықталған сервермен жұмыс мүмкіндіктері. Графикалық ішкі жүйелерде қосымшаларды құрастыру құралдары.
- Үзілістерді өңдеу кезектілігі. Үзілістерді өңдеу бағдарламаларының Fork-деңгейі.
Үзілістер механизмі
Үзілістер механизмі компьютердің аппараттық құрылғылар мен және ОЖ-н бағдарламалық құралдарымен қолданады. Аппараттық қолдаудың процесордың типінен тәуелді және басқа аппараттық құрылғыларға тәуелді өзінің ерекшеліктері бар. Үзілістердің аппараттық жүзеге асу ерекшеліктері операциялық жүйе құралында жұмыс істейтін бағдарламалық құрылғыларға әсер етеді.
Үзілістерді орындаудың екі негізгі тәсілі бар:
- Vectored вектолық
- Сұрау бойынша (Опрашиваемый polled)
2 тәсілде де процессорде сыртқы құрылғылар қосылған шинаның үзілістер үстемдігі туралы ақпарат беріледі. Векторлық үзілістерді қолданатын құруларға үзілістер векторы тағайындалады. Ол процессордың сәйкес шиналарында болатын электрлік сигнал. Онда құрылғыға берілген сәйкес номерін анықтайды. Үзілістер векторы бекітілген конфигурацияланатын немесе бағдарламаланатын болады. Сұрау бойынша орындалатын үзілістерді қолданғанда процессор тек үзіліс үстемдігі туралы ақпарат алады. Үстемділіктің әрбір деңгейімен бірнеше құрылғы және сәйкес бірнеше бағдарламалар байланысуы мүмкін. Үзіліс пайда болған кезде процессор қай құрылғы үзді сұрағының анықтау керек.
ОЖ-де үзілістер диспетчері деп аталатын үзілістерді өңдеуді басқаратын арнайы бағдарламалық модуль бар. Үзіліс пайда болғанда үзіліс диспечері ең алдымен шақырылады. Ол басқа үзілісге тиым салады. Үзіліс себебін агнықтайды. Содан соң диспечер үзіліс приоритетін және процессор орныдап жатқан үрдістің үстемділігін салыстырып процессорға керекті әрекетті орындауға мүмкіндік береді.
Үзілістер негізінде мультибағдарламалау
Үзілістер операциялық жүйенің басты жүргізуші күші болып табылады. Үзілістер жүйесін сөндірсеңіз, ОЖ-дегі «өмір» қолма-қол тоқтап қалады. Периодтық немесе кезеңдік үзілістер таймерден мультибағдарламадағы ОЖ-ң ауысымдық үрдісін шақырады, ал үзілістер енгізу-шығару құрылғысынан берілген ағымдарды басқарады, осылардағы есептуіш жүйе сыртқы дүниемен алмасып отырады.