Komplett: A@H 1.5 mit Capi und HFC-Karte im NT-Modus 1/3

fairydoc

Neuer User
Mitglied seit
23 Nov 2004
Beiträge
43
Punkte für Reaktionen
0
Punkte
0
Hi an Alle,

nachdem ich nun aus diversen Quellen Informationen zusammen getragen habe, möchte ich hier eine Komplettlösung für Asterisk@Home 1.5 mit Fritz!Card PCI und HFC-Karte im NT-Modus zum Besten geben. Dabei kann man (zumindest Stand 14.09.2005) einfach die unter Zitat geschriebenen Bereich mit copy and paste z.B. in einer Terminal-Session einfügen.

Weils ein bisschen länger ist, habe ich das in drei Teile gepackt 8)

Los gehts:

<---- Allgemein --->

Nach dem ISO-Boot:
--> Neues Passwort, besser ist das!

-> Netzwerk einrichten
-> System Services
-> zaptel deaktivieren

<---- Capi-Teil ---> (mit Dank an swissvoip)

Zunächst Capi-Support von A@H installieren:

install-AVMB1ISDN

Dabei wird auch das komplette System geupdatet, incl. Kernel und -Sources (kernel-2.4.21-32.0.1.EL)
Deshalb müssen wir die Header-Dateien neu generieren.

--> jetzt noch Kaffee machen, Kuchen backen und was sonst noch zum Wohlbefinden gehört, denn das kann dauern :)

sollte 2.4.21-32.EL ergeben


sollte jetzt 2.4.21-32.0.1.EL sein

cd /usr/src
ln -s linux-2.4 linux
cd linux
make mrproper
make menuconfig
--> gleich wieder raus -> mit yes Speichern der Konfiguration bestätigen
make dep
vi Makefile
(oder beliebiger anderer Editor, nano z.B.)
EXTRAVERSION = -32.0.1.ELcustom
in
EXTRAVERSION = -32.0.1.EL
umbennen und speichern (für vi: ESC :wq)

make && make modules modules install

--> Jetzt den Kaffee und Kuchen verzehren, denn das dauert noch länger!

Jetzt sollten auch alle weiteren Compilate mit den aktuellen Headern und Modulen klappen ...

cd /usr/src
mkdir avm
cd avm
wget ftp://ftp.avm.de/cardware/fritzcrd.pci/linux/suse.82/fcpci-suse8.2-03.11.02.tar.gz
tar -xzvf fcpci-suse8.2-03.11.02.tar.gz
cd fritz

vi src.drv/makefile

folgendes ersetzen:

CARD_PATH = /lib/modules/`uname -r`/misc

mit:

CARD_PATH = /lib/modules/`uname -r`/kernel/drivers/isdn/fritz

und folgendes ersetzen:

DEFINES = -DMODULE -D__KERNEL__ -DNDEBUG \
-D__$(CARD)__ -DTARGET=\"$(CARD)\"
CCFLAGS = -c $(DEFINES) -O2 -Wall -I $(KRNLINCL)

mit:

DEFINES = -DMODULE -DMODVERSIONS -D__KERNEL__ -DNDEBUG -D__$(CARD)__ -DTARGET=\"$(CARD)\"

CCFLAGS = -c $(DEFINES) -march=i686 -O2 -Wall -I $(KRNLINCL) -include $(KRNLINCL)/linux/modversions.h

--> speichern

vi src.drv/defs.h

folgendes ändern:
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
in:
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 23)

--> speichern

cd src.drv

make clean
make CARD=fcpci
make install CARD=fcpci

depmod

jetzt müssen ein paar config's angepasst werden:

cd /etc
vi capi.conf

folgendes ersetzen:
b1pci b1.t4 DSS1 - - - - P2P

mit:

# card file proto io irq mem cardnr options
fcpci - - - - - 1

--> speichern

cd /etc/asterisk
vi capi.conf

meine capi.conf sieht dann so aus:

Code:
;
; CAPI config
;
;
[general]
nationalprefix=0
internationalprefix=00
rxgain=1
txgain=1
language=de

[interfaces]
msn=1234567,1234568,1234569,1234560,9876543,9876544,9876545,9876546
incomingmsn=1234567,1234568,1234569,1234560,9876543,9876544,9876545,9876546
controller=1
softdtmf=1
accountcode=
context=from-pstn
devices=2

Die MSN's müssen natürlich den eigenen angepasst werden :)

weiter geht's:

vi /etc/asterisk/modules.conf

hinter:

load => res_musiconhold.so

folgendes einfügen:

load => res_features.so
load => chan_capi.so

und speichern.

dann:


und hinzufügen:

asterisk ALL=(ALL) NOPASSWD:/sbin/capiinit start

dann wird jetzt noch die rc.local angepasst:

vi /etc/rc.d/rc.local

ganz vorne einfügen: (wenn es schon an letzter Stelle eingetragen ist nach vorne setzen)


jetzt noch die capi für den User asterisk verfügbar machen:

entweder:

chmod 666 /dev/capi*

oder

chown asterisk:asterisk /dev/capi*

was einem lieber ist :)

dann:


Warnungen über tainted modules sind normal, können ignoriert werden.

jetzt ein Zwischentest:

amportal start
asterisk -r

capi info --> Contr1: 2 B channels total, 2 B channels free.

Das war der erste Streich, der zweite folgt in Teil 2
 
Komplett: A@H 1.5 mit Capi und HFC-Karte im NT-Modus 2/3

So nun kommt der zweite Streich:

<---- HFC-Teil ---> (mit Dank an DonDisperato)

raus aus asterisk und

amportal stop

cd /usr/src
mkdir junghanns
cd junghanns

wget http://www.junghanns.net/downloads/bristuff-0.2.0-RC8n.tar.gz
Dies ist Stand 14.09.2005. Wenn ein neueres Bristuff vorhanden ist, dann sollte es auch mit dem klappen! (Es müssen dann natürlich die Dateinamen angepasst werden :lol: )

tar -xvzf bristuff-0.2.0-RC8n.tar.gz
cd bristuff-0.2.0-RC8n

./download.sh

cd zaphfc
wget http://zaphfc.florz.dyndns.org/zaphfc_0.2.0-RC8j_florz-8.diff.gz

Der Patch ist zwar für Bristuff RC8j, geht aber auch mit RC8n

gunzip -v zaphfc_0.2.0-RC8j_florz-8.diff.gz
patch < zaphfc_0.2.0-RC8j_florz-8.diff

cd ..
cd zaptel-1.0.9
make clean
make
make install
cd ..
cd libpri-1.0.9
make clean
make
make install
cd ..
cd zaphfc
make clean
make

cp zaptel.conf /etc/zaptel.conf
--> yes, overwrite


dann die rc.local anpassen:

vi /etc/rc.d/rc.local

nach 'capiinit start' als neue Zeilen einfügen:

modprobe zaptel
insmod /usr/src/junghanns/bristuff/zaphfc/zaphfc.o modes=1
ztcfg -vv

und speichern!

! wichtig ist modes=1 damit die HFC-Karte in den NT-Modus geht.

Ausserdem habe ich den aktuellen Bristuff Ordner mit

ln -s /usr/src/junghanns/bristuff-0.2.0-RC8n /usr/src/junghanns/bristuff

verlinkt, so dass die rc.local nicht mehr verändert werden muss, wenn ein neues Bristuff raus kommt.

dann die zapata.conf:

vi /etc/asterisk/zapata.conf

so sieht meine aus:

Code:
; Zapata telephony interface
;
; Configuration file



[general]

disallow = all
allow = speex
allow = g729
allow = g.711
allow = gsm
allow = ulaw
allow = alaw

#include zapata_additional.conf

[channels]
;
language=de
;
switchtype = euroisdn
signalling = bri_net_ptmp
rxwink=300

pridialplan=local
prilocaldialplan=local

echocancel=yes
echocancelwhenbridged=yes
echotraining=no

immediate=no
overlapdial=no

usecallerid = yes

group = 0
context=from-internal
channel => 1-2

dann wird der Asterisk neu kompiliert:
Zuvor muss das Makefile angepasst werden:

cd ../asterisk-1.0.9
vi Makefile

Folgendes ersetzen:

ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run

mit:
ASTVARRUNDIR=$(INSTALL_PREFIX)/var/run/asterisk

und komplilieren

make clean
make
make install

reboot

das war's auch schon mit Teil 2
 
Komplett: A@H 1.5 mit Capi und HFC-Karte im NT-Modus 3/3

Zum Abschluss noch die Eingaben, welche im AMP gemacht werden müssen, damit der Capi-Trunk und der Zap-Trunk auch korrekt angesprochen werden:

<---- AMP-Teil --->
Um ausgehende Gespräche zu tätigen muss ein Custom-Trunk eingerichtet werden. ('Add Custom Trunk'). Dort muss man für Custom Dial String folgendes eingeben:

CAPI/XXXXXXXX:$OUTNUM$

wobei das XXXXXXXX eine der in die capi.conf eingetragenen MSN sein muß, sonst geht da gar nix :). Diese MSN wird dann fest als ausgehende MSN verwendet.

Will man nicht nur eine feste ausgehende MSN haben, sondern individuelle MSN's, muss man folgendes machen:

Der ausgehende Dialstring wird in der extensions.conf im macro [macro-dialout-trunk] zusammengestellt:

; This is a custom trunk. Substitute $OUTNUM$ with the actual number and rebuild the dialstring
; example trunks: "AMP:CAPI/XXXXXXXX:b$OUTNUM$,30,r", "AMP:OH323/[email protected]:XXXX"
exten => s,19,Cut(pre_num=OUT_${ARG1},$,1)
exten => s,20,Cut(the_num=OUT_${ARG1},$,2) ; this is where we expect to find string OUTNUM
exten => s,21,Cut(post_num=OUT_${ARG1},$,3)
exten => s,22,GotoIf($[${the_num} = OUTNUM]?23:24) ; if we didn't find "OUTNUM", then skip to Dial
exten => s,23,SetVar(the_num=${OUTNUM}) ; replace "OUTNUM" with the actual number to dial
exten => s,24,Dial(${pre_num:4}${the_num}${post_num})
exten => s,25,Goto(s-${DIALSTATUS},1)

Hier muss man die Variable 'the_msn' einfügen, welcher die ${CALLERIDNUM} zugewiesen wird:

; This is a custom trunk. Substitute $OUTNUM$ with the actual number and rebuild the dialstring
; example trunks: "AMP:CAPI/XXXXXXXX:b$OUTNUM$,30,r", "AMP:OH323/[email protected]:XXXX"
exten => s,19,Cut(pre_num=OUT_${ARG1},$,1)
exten => s,20,Cut(the_num=OUT_${ARG1},$,2) ; this is where we expect to find string OUTNUM
exten => s,21,Cut(post_num=OUT_${ARG1},$,3)
exten => s,22,GotoIf($[${the_num} = OUTNUM]?23:25) ; if we didn't find "OUTNUM", then skip to Dial
exten => s,23,SetVar(the_num=${OUTNUM}) ; replace "OUTNUM" with the actual number to dial

' here is where the outgoing MSN is added
exten => s,24,SetVar(the_msn=${CALLERIDNUM}:)

exten => s,25,Dial(${pre_num:4}${the_msn}${the_num}${post_num})
exten => s,26,Goto(s-${DIALSTATUS},1)

Damit das Ganze läuft muss man im Trunk unter Custom Dial String folgendes eingeben:

CAPI/$OUTNUM$

Jetzt muss nur darauf geachtet werden, das alle über capi ausgehenden Extensions eine gültige MSN besitzen. In den Extensions (AMP) kann man das bei outbound callerid setzen.

Natürlich kann mann auch Trunks mit fester MSN und/oder Zieladresse eingeben:

CAPI/12345678:03099887766

Ganz nützlich z.B., wenn man eine feste Weiterleitung auf seine HomeZone von O2 machen möchte.
Man legt dann nur einen Custom Trunk an und definiert die entsprechende Wahlregel (z.B. mit DID oder Outbound Routing).

Die ZAP-Channel werden folgendermaßen angesprochen:

Im AMP bei der Zap-Extension unter channel folgendes eingeben:

g0/XXXXXXX

wobei XXXXXXX die MSN des Telefons ist

So, jetzt müsste es eigentlich klappen, wenn ich was vergessen habe, einfach dazu posten!

Viel Spaß
 
alle ACHTUNG!!!!!!!!!,

dann hoffe ich für meinen Teil nächstes Wochenende regnet es.....
 
Klasse @fairydoc,

da kann garnix mehr schiefgehen, glaube ich.

Nur eine Frage:

Mal angenommen, ich brauch kein CAPI, sonder nur die HFC im NT Mode. Kan ich dann den Capi Teil einfach weglassen und direkt zum HFC Teil der Anleitung wechseln?

Oder ist das Update fester Bestandteil für das Funktionieren aller folgenden Schritte?

Vielen Dank für diese Vereinfachung!!


stan73
 
@Heini66

hab ich wohl vergessen, hast natürlich recht. Habe ich im Original eingefügt. Hats denn sonst soweit geklappt?

@stan73

Ne, die Capi wird dafür nicht benötigt. Lediglich den allgemeinen Teil, wo Du im setup den Eintrag Zaptel abwählst, musst Du machen und den Link auf /usr/src/linux. Ob das mit dem kompilieren des bristuff alles klappt, kann ich nicht hundertprozentig sagen. Schlimmstenfalls muss man den Kernel incl. Module neu builden...

Wenn Du zwei HFC-Karten hast (TE und NT), musst Du die zaptel.conf und die zapata.conf entsprechend anpassen:

zaptel.conf:
Code:
# hfc-s pci a span definition
# most of the values should be bogus because we are not really zaptel
loadzone=nl
defaultzone=nl

span=1,1,3,ccs,ami
bchan=1-2
dchan=3

span=2,1,3,ccs,ami
bchan=4-5
dchan=6

zapata.conf:
Code:
;
; Zapata telephony interface
;
; Configuration file

[trunkgroups]


[channels]

language=de
switchtype = euroisdn

; p2mp TE mode (for connecting ISDN lines in point-to-multipoint mode)
; signalling = bri_cpe_ptmp
; p2p TE mode (for connecting ISDN lines in point-to-point mode)
; signalling = bri_cpe
; p2mp NT mode (for connecting ISDN phones in point-to-multipoint mode)
; signalling = bri_net_ptmp
; p2p NT mode (for connecting an ISDN pbx in point-to-point mode)
; signalling = bri_cpe

pridialplan = dynamic
prilocaldialplan = local
nationalprefix = 0
internationalprefix = 00

overlapdial=yes
usecallerid=yes
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=no
echotraining=no
rxgain=0.0
txgain=0.0
immediate=no

;-------------------------------
; ptmp NT mode
;-------------------------------

signalling = bri_net_ptmp
context = from-internal

group = 0
channel => 1-2

;-------------------------------------------
; p2mp TE
; Amts-Leitungen Point-to-multi-point
;-------------------------------------------
signalling = bri_cpe_ptmp
context = from-pstn

group = 1

channel => 4-5

Viel Erfolg
 
stan73 schrieb:
Mal angenommen, ich brauch kein CAPI, sonder nur die HFC im NT Mode. Kan ich dann den Capi Teil einfach weglassen und direkt zum HFC Teil der Anleitung wechseln?
Du könntest Dich an die folgende Anleitung halten:
http://dondisperato.blogspot.com/
Und dann noch etwas, was ich unter http://www.ip-phone-forum.de/forum/viewtopic.php?t=22413 gefunden habe:
Also, damit NT und TE Modus funktioniert, muss unbedingt die Zeile lauten:

insmod /usr/src/bristuff-0.2.0-RC8j/zaphfc/zaphfc.o modes=1
Ich habe A@H und HFC so installiert. Allerdings nicht im NT-Modus.
 
Was willst Du denn noch per GUI konfigurieren, was nicht schon per GUI geht?
 
da ich nen absoluter newbee mit dem kollogen asterisk bin, wünsche ich mir einfach etwas "dau" geeignetes zum configurieren der kiste...

:(

oder nimmt mich hier einer and die hand dabei??? :)

geht mir primär um 2 hfc karten im nt modus, um 2 isdn telefonanlagen, nen bestehendes lan und dann weiter per voip mit 1und1 ins festnetz.
häng hier halt im lan in ner wg mit 6 mietparteien und wir haben 0 festnetzanschluss,der ist beim nachbarn... auf anderen grundstück. wlan sei dank! hausinterne telefonierei sollte über den asterisk kostenfrei laufen...

der heini
 
Hallo,

nach zweimaligen "Kaffee und Kuchenverzehr" komme ich hier:

cd src.drv

make clean
make CARD=fcpci
make install CARD=fcpci

depmod

nicht weiter. Nach dem "make CARD=fcpci" kommt folgende Meldung:

[root@asterisk1 src.drv]# make CARD=fcpci
cc -c -DMODULE -DMODVERSIONS -D__KERNEL__ -DNDEBUG -march=i686 -O2 -Wall -I /lib/modules/`uname -r`/build/include -include /lib/modules/`uname -r`/build/include/linux/modversions.h main.c -o main.o
main.c:60: syntax error before "PRODUCT_LOGO"
main.c: In function `fritz_init':
main.c:140: `PRODUCT_LOGO' undeclared (first use in this function)
main.c:140: (Each undeclared identifier is reported only once
main.c:140: for each function it appears in.)
main.c:140: syntax error before string constant
main.c:141: `TARGET' undeclared (first use in this function)
make: *** [main.o] Error 1
[root@asterisk1 src.drv]#


da ich in Linux noch nicht so bewandert bin, fehlen mir die Lösungsansätze. Vermute aber mal, daß der Fehler in der main.c Datei liegt???

versucht mit der akt. A@H V1.5 und einer passiven Fritz Card.
Danke
 
@LJDirk, ich hatte die selben Probleme mit der Fritz passiv, bin nochmal alle Schritte durchgelaufen (incl. Kuchen backen und essen...) dann hat es funktioniert mit dem Treiber, ich vermute einen Tippfehler in einer conf oder eingabe....,
 
hm, das Problem: ich habe es schon zwei mal neu inst. Und jetzt - beim dritten mal (das meiste mit "copy & paste" und doppelt kontrolliert) klappt es immer noch nicht und jedes mal an der selben stelle...
 
Hallo,

habe etwas bizarres.

Installiere nun aah1.5 zum vierten mal. Immer nach Anleitung von @fairydoc.

Beim ersten mal klappte die Install problemlos. Da hab ich aber irgendwie in den Konfigs so viel scheisse gebaut, dass ich mich kurzerhand entschloss dat dingen neu zu installen.

Gesagt, (nichts) getan. Leider krieg ich jetzt den HFC Treiber nicht geladen.

Ich hole mir nach Installation den Bristuff per wget von Junghanns ab.

entpacke ihn und führe ./download.sh aus.
Lade den patch von florz.dyndns und patche die Files,

dann gehe ich wie beschrieben in die jeweiligen ordner "zaptel-1.0.9", "libpri-1.0.9" und "zaphfc". Ich führe dort make clean, make und make install aus ausser bei zaphfc; dort ohne make install.

Dann editiere ich die rc.local in /etc/rc.d:

[zitat:]
modprobe zaptel
insmod /usr/src/junghanns/bristuff/zaphfc/zaphfc.o modes=1
ztcfg -vv
[/zitat:]

DABEI GIBT ES ABER DOCH GAR KEINE zaphfc.o im Ordner /usr/src/junghanns/bristuff/zaphfc .

Oder ist das totaler schwachsinn, was ich da erzähle???


Jedenfalls jetzt lässt sich auf einmal die HFC Karte nicht einsetzen, und der asterisk server startet nicht.

ALSO Nochmal zur INFO: Ich bin mir ziemlich sicher, dass ich alles strikt nach Anleitung gemacht habe, und zwar mittlerweile zum 4. Mal.


Wer hat ne zaphfc.o für mich??
 
hallo und danke nochmal,


ich kenne mich zwar [edit] NICHT [/EDIT] sehr gut mit dem make befehl aus, aber kann es daran liegen, dass ich vorher den Link auf "/usr/src/linux" nicht gesetzt hab? Es hat immer die Datei zaphfc.o gefehlt. Jetzt ist sie da.

Aber ob das an dem Link liegt, weis ich nicht. Jedenfalls hab ich sonst meines wissens nicht anders gemacht, als vorher!!

EGAL:

Jetzt confe ich erstmal dat dingen. Mal sehen,was dabei rauskommt .-)



stan73
 
stan73 schrieb:
Aber ob das an dem Link liegt, weis ich nicht. Jedenfalls hab ich sonst meines wissens nicht anders gemacht, als vorher!!
Naja, das ist etwa so, als wenn man eine Sauce machen möchte und alles strikt nach Anleitung macht - aber das Aufkochen ausläßt.

Anweisungen haben schon ihren Sinn, Auslassen einiger Anweisungen kann ungeahnte Folgen haben, wie Du am eigenen Leib erfahren hast ;-)
 
ich frag auch nochml leise nach, ob jemand eine Lösung für mein Prob kennt?
Danke
 
Hi Leute,

meine Konfiguration:

Dell Dimension 4100 <> A@H 1.5 <> Kernel = 2.4.21-37.EL <> HFC-S Karte (ConradElektronik) <> Fritz PCI 2.0 <> NTBA -> A@H <> MSN:7243020,7245847 <> noch kein VoIP-Provider <> noch kein ISDN-Phone <> SIP = X-Lite
################################################
;capi.conf
[general]
nationalprefix=0
internationalprefix=00
rxgain=0.8
txgain=0.8
language=de
[interfaces]
msn=7243020,7245847
incomingmsn=*
controller=1
softdtmf=1
accountcode=
context=from-pstn
devices=2
################################################
; extensions.conf
[general]
static=yes
writeprotect=yes
[default]
include=> 200
include=> 201
exten =>_XXX.,1,Dial,CAPI/@7243020:${EXTEN}
exten =>_XXX.,2,Congestion
[from-pstn]
exten =>7243020,1,Dial(SIP/201)
exten =>7245847,1,Dial(SIP/200)
[200]
exten =>200,1,Dial(SIP/200,10)
[201]
exten =>201,1,Dial(SIP/201,10)
################################################
;zapata.conf
[trunkgroups]

[channels]
language=de
context=from-isdn
signalling=bri_net_ptmp
rxwink=300
usecallerid=yes
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=no
echotraining=800
rxgain=0.0
txgain=0.0
group=0
callgroup=1
pickupgroup=1
immediate=no
;faxdetect=both
faxdetect=incoming
;faxdetect=outgoing
;faxdetect=no
;Include genzaptelconf configs
#include zapata-auto.conf
;Include AMP configs
#include zapata_additional.conf
################################################

Calls:
PSTN -> A@H -> SIP = funktioniert
SIP -> A@H -> PSTN = funktioniert nicht ! X-Lite:Anruf nicht anerkannt!
SIP -> A@H -> SIP = funktioniert nicht ! X-Lite:Anruf nicht anerkannt!
Voicemail ?????

liegts an dem trunc?
kann mir bitte jemand helfen?

Ich schnall das mit den trunks nicht. fairydoc schreibt:
>>>> Um den capi-trunk anzusprechen muss man im AMP unter custom Dialstring folgendes eingeben:

CAPI/XXXXXXXX:$OUTNUM$

wobei das XXXXXXXX eine der in die capi.conf eingetragenen MSN sein muß, sonst geht da gar nix :) <<<<

=>CAPI/7243020:$OUTNUM$

Wo wird das gespeichert ( ?.conf)? ohne amp-gui mein ich.
Das mit dem OutboundRouting blick ich auch nicht!
Geroutet wird doch anhand der extensions.conf, oder nicht?


danke schon mal
greez gilligan23 :?:
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.