Hareket işlem sistemi

**Hareket işlem sistemi** (*Alm.* Transaktionssystem; *İng.* transaction processing system; kısaca TPS) bir işletmede meydana gelen yapılandırılmış ve sürekli yinelenen olguları kaydetmek, izlemek, saklamak, işlemek ve yayımlamak için kullanılan bir bilgisayar tabanlı bilişim sistemidir. Bu olgulara örnek olarak arasında sipariş almak, fatura ve irsaliye hazırlamak, mal ve hizmet teslim almak ya da etmek, bordro hazırlamak gösterilebilir. Bir işletmede kullanılan kaynakların, işletme içinde ve dışındaki çıkar ve ilgi gruplarının her biri açısından anlamlı olan ve zamanla meydana gelen her bir değişimine *hareket* (ya da işlem) denir. Hareketler bir kurumun işleyişi sırasında meydana gelen olgulardır. Bu olgular fiziksel, parasal ya da kavramsal kaynakların özelliklerinden birinin, bir bölümünün ya da tümünün değişimini içerir. Kimi zaman bir hareket başka hareketlerin meydana gelmesine neden olur.

Her kaynak, kendisiyle ilgili çıkar grubu açısından anlamlı özelliklerini betimleyen bir veri kümesi kullanılarak tanımlanabilir. İşletme kaynaklarının geçirdikleri değişimler, kaynakları tanımlamakta ve soyutlamakta kullanılan verilerin de değişimini gerektirir.

## Bilgisayar bilimlerinde hareket işlem sistemleri

Bilgisayar bilimleri açısından, hareket, bir bilgisayar sisteminin yerine getireceği birbiriyle ilişkili bir dizi işlemden ibarettir. Bu işlemler bir bütün olarak görülür ve sonuçta bir hareket ya başarıyla gerçekleşir ya da gerçekleşmeyerek hareketin başlamasından hemen önceki noktaya dönülür. Bu işlemlerin gerçekleştirilmesiyle bir veritabanında yer alan bir dizi veri değişim geçirerek yeni değerler alır.

### Hareket bütünlüğü

Tüm işlemlerin sonuçları kalıcı olacak biçimde gerçekleştirildiğinde hareketin bütünlüğü korunmuş ve hareket başarıyla gerçekleşmiş demektir.

Hareketin bütünlüğü iki amaca hizmet eder:

# Hareketi talep eden kullanıcının isteğni yerine getirmek. 
# Veri bütünlüğünü korumak.

Bütünlüğü koruyabilmak için hareket sonuçları sistem arızalarından ya da çökmelerden etkilenmemelidir. En küçük bir aksaklık durumunda, sistem gerçekleşen tüm işlemleri geriye doğru iptal ederek başlangıç durumuna geri dönebilmelidir. Bir hareket bir ya da daha çok veri kaynağı üzerinden gerçekleşebilir. Yerel kaynaklar üzerinde gerçekleşen hareketler kolay yönetilebilir ve tek bir kaynak (veritabanı ya da ileti kuyruğu) kullanılarak hızla gerçekleşebilirken, dağıtılmış hareketler için birden çok kaynak kullanılır.

Bir sanal alışveriş merkezinden bilgisayar satın alındığında, birçok hesapta değişiklik yapmak gerekir. Önce alışveriş sepeti oluşturulur. Bilgisayar alışveriş sepetine konur. Ardından sanal kasaya gidildiğinde banka hesabı güncellenir ve bilgisayar stoktan düşülür. Banka hesabı güncellendiğinde bilgisayar stoktan düşülmezse banka hesabı da güncellenmeden önceki durumuna döndürülür. Hareketi oluşturan işlemlerin, veritabanı üzerinde değil de verilerin kopyaları üzerinde gerçekleştirilmesi geri dönüşü olanaklı kılar. İşlemlerden en az biri başarısız olursa tüm kopyalar silinir.

### Hareket özellikleri

Bir hareketin dört temel özelliği vardır:

# *Atomsallık*: Bir hareket ya bütünüyle gerçekleştirilir ya da sistem hareket başlamadan önceki durumuna döner. Hareketin gerçekleşmesi, onun başlangıcı ve bitimi arasındaki tüm işlemlerin başarıyla gerçekleşmesine bağlıdır. Atomsallık özelliği harekete kaynak olan amacın geçekleşmesini garanti eder. 
# *Tutarlılık*: Sistem (ya da harekete konu olan veriler) ya yeni ve anlambilimsel açıdan geçerli bir duruma geçer ya da eski geçerli durumunu korur. Böylelikle verilerin doğruluğu ve bütünlüğü güvence altına alınır. Sistemde tutarlılığı sağlayan kurallara bütünlük kısıtları adı verilir. 
# *Yalıtılmışlık*: İşlemlerin gerçekleşmesi sırasında hareket diğer tüm hareketlerden bağımsız olarak cereyan eder. İdeal olarak ardışık işlemler ve hareketler yalıtılmışlığı garanti altına alırsa da, eşzmanlı işlemler sistem performansını yükseltir. 
# *Devamlılık*: Sistem bir başarısızlık durumunda dahi geçerli durumda bulunur. Bir hareketin gerçekleşmesi sırasında sistem çökerse, veriler hareket başlamadan önceki geçerli değerlerine geri döner. Bir hareket bittikten sonra sistem çökerse, veriler kalıcı hale gelmiş bulunduklarından hareket bittiğinde aldıkları değerleri korurlar.

Bu özellikler ACID (‘esid’ okunur; *İng.* A: atomicity; C: consistency; I: isolation; D: durability) özellikleri olarak bilinir. Hareket işlem sistemlerinin bu dört özelliği sağlayabilesi, hareketlerin her koşulda geçerliliğini ve sonuçlarının öngörülebilirliğini sağlar; yönetim ve denetim yükünü azaltır. Aynı zamanda bu özellikler, hareket işlemeyi toplu işlemden (*İng.* batch processing) ayırır. Toplu işlem, hareketleri önce bir araya getirirek gruplar. Gruplanan hareketler belirli aralıklarla ya da belirli olguların gerçekleşmesinden sonra veritabanıının güncellenmesi için kullanılır. Toplu işlem yaklaşımının işletmecilikte kullanım alanı daha çok bordro vb. dönemsel hareketlerle sınırlıdır.

### Çevrimiçi hareket işleme (OLTP)

*Çevrimiçi hareket işleme* (*İng.* online transaction processing; kısaca OLTP) ise gerçek zamanlı olarak icra edilir. Bu sayede kurumsal verilerin güncelliği sürekli korunur. Kurumun işleyişinin haftanın yedi günü 24 saat süreyle (7 × 24) gerçek zamanlı olarak modellenebilmesi mümkün hale gelir. Bu üstünlüğüne karşın, çevrimiçi hareket işlemciliğinin güvenlik ve devamlılık giderleri çok daha yüksektir.

## Hareket işlem sistemlerinin yetenekleri

Günümüzde işletme operasyonlarının sürekliliği ve başarısı, hareket işlemlerinin sürekliliğine neredeyse tümüyle bağımlı duruma gelmiştir. Hareket işlem sistemlerinin bu niteliği onlarda üç temel yeteneğin aranmasına neden olmuştur:

# İki aşamalı üstlenim.
# Endüstriyel güçlülük. 
# Hataya dayanıklılık.

*İki aşamalı üstlenim* (*İng.* two-phase commit) bir hareketin iki aşamada oluştuğunu ifade eder. Birinci aşamada hareket için gereken tüm kaynakların oluşacak değişliklikleri üstenmeye hazır olup olmadıkları belirlenir. Bu aşamada gerekiyorsa harekete konu olan veriler kilitlenerek başka bir hareket tarafından kullanılmaları engellenebilir. Eğer veriler kilitlenmemişse ve hareket süresince başka hareketler tarafından değiştirilebiliyorsa hareket tamamlandığında bu durum hesaba katılmalıdır. İkinci aşamada tüm kaynaklar gereken değişiklikleri ve dolayısı ile de hareketi yerine getirirler. İki aşamalı üstlenim hareketin neden olduğu tüm değişikliklerin gerçekleşmesini sağlar; hareket başarısız olursa tüm kaynaklar hareket öncesi duruma dönerler.

*Endüstriyel güçteki yazılımlar*, çok miktarda verinin pek çok kullanıcı tarafından eşzamanlı olarak ve hatasız biçimde işlenebilmesini gerektirir. Program kusursuz çalışabilmeli ve sistem aksaklıklarından kaynaklanabilecek hatalara olanak vermemelidir. Veritabanı yönetim sistemlerinin endüstriyel güçte olmalarını sağlayan, bu iki aşamalı üstlenim özelliğidir.

*Hataya dayanıklı* (fault tolerant) hareket işlem sistemleri, donanımda bir hata oluştuğunda işlevlerini aksatmadan sürdürürler. Bu tür sistemlerin merkezi işlem birimi, bellek, sabit disk, dentim birimi, soğutucu fan ve güç kaynağı gibi kritik bileşenlerinin en az bir yedeği bulunur; asıl bileşende bir arıza oluştuğunda yedek bileşen kesintisiz olarak devreye girer.

## Hareket işlem sistemi mimarileri

Hareket işlem sistemleri için başlıca iki tür sistem mimarisi yaklaşımı kullanılmaktadır:

# Anabilgisayar mimarisi. 
# İstemci-sunucu mimarisi.

Anabilgisayar mimarisinde tüm iş kuralları ve veriler bir merkezi bilgisayarda toplanır; veriler bu bilgisayarda işlenir. Kullanıcılar anabilgisayarla bir ya da daha çok uçbirim (terminal) veya kişisel bilgisayarlarında çalışan bir uçbirim emülatörü aracılığı ile etkileşirler. Bilgisayar ağları üzerinden ana bilgisayara bağlanan iş istasyonları da emülatörler vasıtası ile yalnızca birer uçbirim işlevi görür. Uçbirimlerin ve emülatörlerin işlevi, klavye ile girilen verileri anabilgisayara iletmek ve anabilgisayardan gelen bilgileri göstermekten ibarettir. Anabilgisayar mimarisi grafik kullanıcı arayüzü kullanımını kısıtladığı gibi çoklu ve dağıtılmış veritabanılarının kullanımına olanak vermez.

Hareket işlem sistemlerinde en yaygın olarak kullanılan mimari yaklaşım istemci-sunucu modelidir. İstemci-sunucu mimarisi iki bilgisayar programı arasındaki hizmet talebi ve hizmet arzı ilişkisine dayanır. İstemci sunucudan bir hizmet ya da veri talep eder; sunucu da istemciye talep ettiği hizmet ya da veriyi arzeder. İstemci belirli bir uygulama için özel olarak tasarlanmış ve o uygulamaya özgü bir kullanıcı arayüzü olabildiği gibi bir Web sayfası da olabilir. Web sayfaları, iş mantığından daha çok kullanıcı arayüzü öğelerini içerdiğinden, *zayıf istemci* olarak adlandırılır. Buna karşılık bir *şişman istemci*, veri işlemlerinin hemen tümünü yerine getirir; yalnızca iletişim ve depolama için veri iletimine gerek duyar. Kullanıcı, istemci arayüzü aracılığı ile bir uygulama sunucusu ya da veritabanından gereksindiği hizmet ya da verileri alır, işler ve kimi zaman da geri dönerek sunucuyu günceller.

İstemci-sunucu yaklaşımı özellikle bilgisayar ağlarının yaygınlaşması sonucunda farklı bilgisayarların farklı roller üstlenmesi biçimini almıştır. Bir yerel ya da geniş alan ağında yer alan bazı bilgisayarlar istemci, diğerleri ise sunucu görevleri üstlenmişlerdir. İstemci-sunucu modeli özellikle farklı coğrafi noktalara dağıtılmış sistem bileşenlerinin birbiriyle ilişkilendirilmesini kolaylaştırmıştır.

İstemci-sunucu mimarisi en az iki katmandan oluşur: Birinci katman sunuş katmanı olarak adlandırılır ve istemci tarafında yer alır. İkinci katman veri katmanıdır. Veri katmanı ya bir veritabanından ya da tek katmandan oluşan bir uygulama programından ibarettir ve sunucu tarafında yer alır. İki katmandan oluşan istemci-sunucu uygulamaları iki katmanlı istemci-sunucu mimarisi modeli üzerine kurulmuştur.

Üç katmanlı istemci-sunucu mimarisi modelinde, sunuş ve veri katmanlarının arasında bir uygulama katmanı bulunur. Uygulama katmanı iş mantığını barındırır ve iş mantığının verilerden ve istemci arayüzünden ayrılmasını sağlar. Bu katmanda yer alan bir uygulama sunucusu, belirli uygulama yazılımlarını üzerinde barındıran bir platformdur.

Zayıf istemcili istemci-sunucu uygulamaları dört katmanlı model çerçevesinde oluşturulur. Bu modelde uygulama katmanı, sunuş ve veri katmanları arsındaki geçişi sağlar. Web tarayıcısının meydana getirdiği sunuş ve veritabanı sunucusunun meydana getirdiği veri katmalarının arasında Web ve uygulama katmanları bulunmaktadır. Kullanıcı arayüzü olarak Web tarayıcısından yararlanıldığından, dört katmanlı model zayıf istemci-sunucu kategorisine girmektedir. Genel istemci-sunucu modeli ise çok katmanlı (n-katmanlı) olarak nitelendirilir.

Zayıf istemcili sistemler, daha ucuz ve kolay yönetilebilir olmalarına karşın, hem iş hem de sunuş verilerini aynı zamanda gereksindiklerinden bilgisayar ağı üzerinde daha yüksek veri iletim hızlarına gereksinim duyarlar. Zayıf istemcilere hizmet veren sunucular diğerlerinden daha masraflı olmakla birlikte, sunuş katmanı her bir istemci üzerinde ayrı ayrı değil de, bir defaya mahsus olmak üzere yalnızca Web sunucusu üzerinde kurulur ve güncellenir. Arayüzdeki değişimler kurum içi ve dışındaki tüm kullanıcılara eşzamanlı olarak yansır.

## Hareket işlem yönetimi yazılımları

Yerel ve yalın hareket işlem uygulamalarda, uygulama sunucusu hareketin sınırlarını belirleyip denetleyebilir. Fakat bir bilgisayar ağı üzerinde dağıtılmış sistemlerde karmaşıklığın azaltılması ve alt sistemlerin eşgüdümlenmesi için daha yetkin bir uygulama ortamına gereksinme duyulmaktadır.

Büyük işletmelerde çok katmanlı sistemler çok sayıda veri, uygulama ve Web sunucusu ile kurum içi ve dışı kullanıcılara şişman ve zayıf istemciler üzerinden hizmet verirler. Kurumsal veriler ve iş mantığı sistemi oluşturan sunucular arasında dağıtılır. Sonuçta sunucular arasında karmaşık bir ilişkiler yumağı ve veri alışverişi ortamı meydana gelir. Bu durum, sistemden yararlanan iç ve dış kullanıcı sayısının dönem dönem azalıp artmasıyla daha da karmaşık bir hal alır. Sunuculardan veri ve hizmet talebinin düzensiz ve öngörülemez olması, bilgisayar ağı üzerinde iletişim ve işlem yükünün dengelenmesini, sunuculara olabildiğince eşit ölçüde dağıtılmasını önemli kılar. Bir sunucuya olan talebin aşırı artması, benzer taleplerin aynı işleve sahip başka bir sunucuya yönlendirilmesini gerektirir.

Hareketlerin işlem sırasında bir aşamadan diğerine geçişini gözeten, yönlendiren, hareketlerin kaybolmasını ya da hatalı oluşmasını engelleyen ve sistemde yük dengesi oluşturan [ara yazılımlarına (''İng.' middleware) hareket işlem yöneticisi (''İng. '' transaction processing monitor) denir. Bir hareket işlem yöneticisi üç amaca hizmet eder:

# Dağıtılmış bir yapıda ve pek çok kaynak kullanılarak gerçekleşen karmaşık hareketlerin atomsallık, tutarlılık, yalıtılmışlık ve dayanıklılığını sağlamak.
# Sistem üzerinde kullanıcı taleplerindeki değişimlerinden kaynaklanan yükleri, sistem işlevini ve performansını olumsuz yönde etkilemesine engel olacak biçimde sistem kaynaklarına dağıtmak.
# Bir veri ya da uygulama sunucusu devreden çıktığında başarısız olan hareketi başka bir sunucuya yönlendirerek sistemin yararlanılabilirliğini yükseltmek.

Kavramsal olarak bir hareketin bağlamı, o hareket hakkındaki bilgileri içeren bir veri yapısıdır. Hareket bağlamı, hareketin özgün bir tanımını, kapsamını ve hangi koşullarda zaman aşımına uğrayacağını içerir. Gerekirse hareketi parallel görevlere böler; işlemin parallel ilmekler halinde gerçekleşmesini sağlar. Birden fazla hareket işlem yöneticisinin yer aldığı ortamlarda, bağlamın bir yöneticiden diğerine aktarılabilmesi gerekir.

Hareket işlem yönetimi teknolojisi, iletilerin sıraya sokulmasını, işlem zamanlaması ve işlem önceliklerinin belirlenmesini sağlar. İstemciler, uygulama sunucuları ya da veritabanları yerine, önce hareket işlem yöneticisine bağlanırlar. Yönetici işlem sorumluluklarını üzerine alarak istemciyi serbest bırakır; hareket tamamlanıncaya dek tüm işlemlerin gerçekleşmesini gözetir; birden çok veritabanıını günceller; hareketin başarılı ya da başarısız olduğunu istemciye iletir. Hareket işlem yönetimi yazılımları bir hareket işlem sisteminin ölçeklenebilirliğini büyük ölçüde artırır. Sistem her biri farklı hareketleri gerçekleştiren binlerce kullanıcıya aynı anda hizmet verebilir. Yönetici büyük ölçekli çevrimiçi hareket işlem uygulamalarının etkin ve güvenilir biçimde çalışmasını sağlar.

Hareket işlem yönetimi pazarında bulunan belli başlı yazılımevleri ve ürünleri şunlardır:

* [Unix işletim sistemi için Oracle Tuxedo; eskiden BEA Tuxedo idi.
* IBM CICS, Encina ve IMS.
* Oracle EJB JTS (Java Transaction Service); eskiden Sun JTS idi.
* Microsoft COM+.
* Software AG Adabas TPF.

Günümüzde uygulama sunucularının çoğu Web uygulamaları barındırdığından, hem bu sunucuların hem de hareket işlem yöneticilerinin C ve COBOL gibi geleneksel programlama dillerinin yanı sıra Java ve C# gibi modern dilleri desteklemesi gerekmektedir.

## İşletmecilikte hareket işlem sistemleri

### Hareket işlem sistemlerinin özellikleri

Hareket işlem sistemleri doğaları gereği büyük miktarlarda veri barındırır ve barındırdıkları bu verileri neredeyse sürekli olarak işlerler. Verilerin çoğunluğu kurum içinden kaynaklanır ve kullanıcılar da çoğunlukla kurumsaldır. Veriler hareketlerin ayrıntılarını betimler ve son derece biçimlenmiştir; tüm girdiler ve hemen hemen tüm çıktılar hareketlerin ayrıntılarını gösterir. Hareketlerin mantıkları görece basit olduğundan, işlemsel karmaşıklık düzeyleri oldukça düşüktür. Yüksek miktarda veriyi barındırmak için veri depolama kapasitelerinin yüksek olması gerektiği gibi, bu verileri işleyerek çok sayıda hareketi gerçekleştirmek zorunda olduklarından yüksek hızlara da gereksinme duyarlar. Son olarak, kurumsal operasyonların sürekliliği, doğruluğu ve geçerliliğini sağlayabilmek için hareket işlem sistemlerinin güvenilirlik, bütünlük, süreklilik ve yararlanılabilirliklerinin yüksek olması gerekir.

### Hareket işlem sistemlerinin amacı ve önemi

Hareket işlem sistemlerinin ana amacı kurum içi ve dışındaki paydaşların gereksindiği her türlü veri ve bilgiyi doğru, hızlı ve ekonomik biçimde işlemek ve sunmaktır. Bu veri ve bilgilerin bir bölümü yasa gereği saklanırken, diğer bölümü ise kurumsal politikalar çerçevesinde belirlenir. Hareket işlem sistemlerinin iki özelliği onları önenli kılmaktadır:

# Yönetim bilişim sistemleri ve karar destek sistemleri gibi sistemlerin hareket işlem verilerine gereksinim duyması. 
# Hareket işlem sistemlerinin kurum dışındaki paydaşlara kısmen açık ve onlarla ilişkide olması.

Birinci özelliğin önemi, kurumsal raporların doğruluğu ve yönetim kararlarının isabetliliğinin hareket işlem sisteminin tasarımının yetkinliğine ve işleyişinin sağlıklılığına bağlı olmasından kaynaklanmaktadır. Hareket işlem sistemi yasal ve kurumsal belge ve raporların hazırlanmasında olduğu gibi stratejik ve operasyonel kararların alınabilmesi için gereken verilerin bir bölümünü de içlerinde barındırır.

Müşteriler, tedarikçiler ya da diğer ilgi ve çıkar grupları sistemlerle doğrudan ya da dolaylı olarak etkileşimde bulunduklarında, bu deneyimlerinden yola çıkarak işletmenin niteliği ve yönetiminin yetkinliği hakkında vardıkları yargıyı etkilemesi ikinci özelliği önemli kılmaktadır. İyi çalışan bir hareket işlem sistemi yalnızca veri doğruluğu, bütünlüğü ve güvenliğini sağlamakla kalmaz, müşteri hizmetlerinin daha hızlı ve etkin bir biçimde yürütülmesine olanak verir. Bu yolla müşterilerin işletmeye bağlılığının artmasına katkıda bulunur.

### Hareket işlem sistemi yönetimi

Hareket işlem sistemi yönetiminde temel amaç sistemin performansının yanı sıra güvenilirlik, bütünlük, süreklilik ve yararlanılabilirliğinin kurumsal hedeflere uygun düzeylerde olmasının sağlanmasıdır. Sistemlerin kritiklikleri ve işletmelerin olanakları ölçüsünde farklı politika ve yordamlar uygulanarak, bu amaçların gerçekleştirilmesi gerekir. Alınacak önlemlerin en temel olanı, yerinde ve uzakta veri yedeklemedir. Doğal veya insan eliyle meydana gelecek yıkımlar karşısında sistemin en kısa sürede ve en az iş yitimiyle devreye girmesini sağlayacak yıkım onarımı planları hareket işlem sistemi yönetiminin bir parçasıdır. Yıkım onarımı seçenekleri arasında uzak bir yerde—örneğin bir başka kentte—başka bir işletme tarafından sağlanan sistemin ve ofis düzeninin çalışır durumda bir benzeri olan *sıcak tesisler*; veya diğer işletmenin yalnızca bilişim altyapısını sağladığı, yazılım ve donanımın bizzat işletmenin kendisi tarafından sağlandığı *soğuk tesisler* sayılabilir.

## Kaynakça

### Kitaplar

#### Hareket işlem sistemleri

* Bernstein, P. A. ve E. Newcomer. (2009). *Principles of Transaction Processing. 2. Basım.* Morgan Kaufmann. 
* Chorafas, D. N. (1998). *Transaction Management: Managing Complex Transactions and Sharing Distributed Databases.* Macmillan.
* Claybrook, B. G. (1992). *OLTP: Online Transaction Processing Systems.* Wiley. 
* Gray, J. ve A. Reuter. (1992). *Transaction Processing: Concepts and Techniques.* Morgan Kaufmann.
* Weikum, G. ve G. Vossen. (2001). *Transactional Information Systems: Theory, Algorithms, and the Practice of Concurrency Control and Recovery.* Morgan Kaufmann.

#### Dağıtılmış sistemler

* Kshemkalyani, A. J. ve M. Singhal. (2011). *Distributed Computing: Principles, Algorithms, and Systems.* Cambridge University Press.
* Mandl, P. (2008). *Masterkurs Verteilte Betriebliche Informationssysteme: Prinzipien, Architekturen und Technologien.* Vieweg + Teubner.
* Mullender, S. (1993). *Distributed Systems. 2. Basım.* Longman. 
* Özsu, M. T. ve P. Valduriez. (2011). *Principles of Distributed Database Systems. 3. Basım.* Springer. 
* Tanenbaum, A. S. ve M. Van Steen. (2006). *Distributed Systems: Principles and Paradigms. 2.* Basım. Prentice Hall.

#### veritabanları ve hareket işlemleri
* Bernstein, P, V. Radzilacos ve V. Hadzilacos. (1987). ''Concurrency Control and Recovery in Database Systems.'' Addison Wesley . 
* Elmasri, R. ve S. B. Navathe. (2007). *Fundamentals of Database Systems. 5. Basım.* S.596-680. Addison Wesley.
* Silberschatz, A., H. F. Korth ve S. Sudarshan. (2006). *Database System Concepts. 5. Basım*. S. 609-718. McGraw-Hill.