473,396 Members | 1,777 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

session_start/session_end

We are attempting to automatically log users off from the Session_End event
in global.asax and set some values on session_start. It is not a critical
task, more of a housekeeping task so that we know if users have closed down
their browsers without logging off first. However, although the code seems
to run OK on our development servers (WinXP ASP.NET v. 1.1, SQL Server 2000,
IIS6), they don't seem to be firing on the live server despite sessions
working fine.

We are using ASP.NET v. 1.1 and SQL Server 2000 on a W2K3 server running IIS
6.

Here is the c# code we used:-

/// <summary>

/// We can log the user out here so that the database will
reflect the correct number

/// users logged in.

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void Session_End(object sender, EventArgs e)

{

// If user id is not null, log them out automatically...

object oId = Session["CurrentUserId"];

try

{

if (oId != null)

{

SqlInt32 intUserId =
SqlInt32.Parse(oId.ToString());

SessionServer.LogOut(intUserId,
Session.SessionID);

LogWriter.InsertAuditTrail(TypeServer.AuditLevel.I NFO,
intUserId, "Session logged out automatically.");

}

}

catch (Exception ex)
{LogWriter.InsertAuditTrail(TypeServer.AuditLevel. INFO, (null ==
oId)?SqlInt32.Null:(SqlInt32)oId, "Error logging session out
automatically.");}

}

Any ideas?

Apr 3 '06 #1
7 9253
Hello bruno,

Session_End is not called even if browser is closed by user because HTTP
is stateless and server dont know whether you close browser.
It's is called when u call it explicit or session is expired by timeline

PS: Session_End is available onle in InProc mode

b> We are attempting to automatically log users off from the Session_End
b> event in global.asax and set some values on session_start. It is not
b> a critical task, more of a housekeeping task so that we know if users
b> have closed down their browsers without logging off first. However,
b> although the code seems to run OK on our development servers (WinXP
b> ASP.NET v. 1.1, SQL Server 2000, IIS6), they don't seem to be firing
b> on the live server despite sessions working fine.
b>
b> We are using ASP.NET v. 1.1 and SQL Server 2000 on a W2K3 server
b> running IIS 6.
b>
b> Here is the c# code we used:-
b>
b> /// <summary>
b>
b> /// We can log the user out here so that the database
b> will reflect the correct number
b>
b> /// users logged in.
b>
b> /// </summary>
b>
b> /// <param name="sender"></param>
b>
b> /// <param name="e"></param>
b>
b> protected void Session_End(object sender, EventArgs e)
b>
b> {
b>
b> // If user id is not null, log them out
b> automatically...
b>
b> object oId = Session["CurrentUserId"];
b>
b> try
b>
b> {
b>
b> if (oId != null)
b>
b> {
b>
b> SqlInt32 intUserId =
b> SqlInt32.Parse(oId.ToString());
b>
b> SessionServer.LogOut(intUserId,
b> Session.SessionID);
b>
b>
b> LogWriter.InsertAuditTrail(TypeServer.AuditLevel.I NFO, intUserId,
b> "Session logged out automatically.");
b>
b> }
b>
b> }
b>
b> catch (Exception ex)
b> {LogWriter.InsertAuditTrail(TypeServer.AuditLevel. INFO, (null ==
b> oId)?SqlInt32.Null:(SqlInt32)oId, "Error logging session out
b> automatically.");}
b>
b> }
b>
b> Any ideas?
b>
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche
Apr 3 '06 #2
We are using InProc and we are aware of how it is supposed to function.

To clarify. It _is_ working on our development servers but _not_ on the live
server.
"Michael Nemtsev" <ne*****@msn.com> wrote in message
news:9c**************************@msnews.microsoft .com...
Hello bruno,

Session_End is not called even if browser is closed by user because HTTP
is stateless and server dont know whether you close browser.
It's is called when u call it explicit or session is expired by timeline

PS: Session_End is available onle in InProc mode

b> We are attempting to automatically log users off from the Session_End
b> event in global.asax and set some values on session_start. It is not
b> a critical task, more of a housekeeping task so that we know if users
b> have closed down their browsers without logging off first. However,
b> although the code seems to run OK on our development servers (WinXP
b> ASP.NET v. 1.1, SQL Server 2000, IIS6), they don't seem to be firing
b> on the live server despite sessions working fine.
b> b> We are using ASP.NET v. 1.1 and SQL Server 2000 on a W2K3 server
b> running IIS 6.
b> b> Here is the c# code we used:-
b> b> /// <summary>
b> b> /// We can log the user out here so that the database
b> will reflect the correct number
b> b> /// users logged in.
b> b> /// </summary>
b> b> /// <param name="sender"></param>
b> b> /// <param name="e"></param>
b> b> protected void Session_End(object sender, EventArgs e)
b> b> {
b> b> // If user id is not null, log them out
b> automatically...
b> b> object oId = Session["CurrentUserId"];
b> b> try
b> b> {
b> b> if (oId != null)
b> b> {
b> b> SqlInt32 intUserId =
b> SqlInt32.Parse(oId.ToString());
b> b> SessionServer.LogOut(intUserId,
b> Session.SessionID);
b> b> b> LogWriter.InsertAuditTrail(TypeServer.AuditLevel.I NFO, intUserId,
b> "Session logged out automatically.");
b> b> }
b> b> }
b> b> catch (Exception ex)
b> {LogWriter.InsertAuditTrail(TypeServer.AuditLevel. INFO, (null ==
b> oId)?SqlInt32.Null:(SqlInt32)oId, "Error logging session out
b> automatically.");}
b> b> }
b> b> Any ideas?
b> ---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do
not cease to be insipid." (c) Friedrich Nietzsche

Apr 3 '06 #3
Hello bruno,

Sorry, missed it
Have u tried this one http://support.microsoft.com/?kbid=827164 ?
b> We are using InProc and we are aware of how it is supposed to
b> function.
b>
b> To clarify. It _is_ working on our development servers but _not_ on
b> the live server.
b>
b> "Michael Nemtsev" <ne*****@msn.com> wrote in message
b> news:9c**************************@msnews.microsoft .com...
b>
Hello bruno,

Session_End is not called even if browser is closed by user because
HTTP
is stateless and server dont know whether you close browser.
It's is called when u call it explicit or session is expired by
timeline
PS: Session_End is available onle in InProc mode

b> We are attempting to automatically log users off from the
Session_End
b> event in global.asax and set some values on session_start. It is
not
b> a critical task, more of a housekeeping task so that we know if
users
b> have closed down their browsers without logging off first.
However,
b> although the code seems to run OK on our development servers
(WinXP
b> ASP.NET v. 1.1, SQL Server 2000, IIS6), they don't seem to be
firing
b> on the live server despite sessions working fine.
b> b> We are using ASP.NET v. 1.1 and SQL Server 2000 on a W2K3
server
b> running IIS 6.
b> b> Here is the c# code we used:-
b> b> /// <summary>
b> b> /// We can log the user out here so that the database
b> will reflect the correct number
b> b> /// users logged in.
b> b> /// </summary>
b> b> /// <param name="sender"></param>
b> b> /// <param name="e"></param>
b> b> protected void Session_End(object sender, EventArgs e)
b> b> {
b> b> // If user id is not null, log them out
b> automatically...
b> b> object oId = Session["CurrentUserId"];
b> b> try
b> b> {
b> b> if (oId != null)
b> b> {
b> b> SqlInt32 intUserId =
b> SqlInt32.Parse(oId.ToString());
b> b> SessionServer.LogOut(intUserId,
b> Session.SessionID);
b> b> b> LogWriter.InsertAuditTrail(TypeServer.AuditLevel.I NFO,
intUserId,
b> "Session logged out automatically.");
b> b> }
b> b> }
b> b> catch (Exception ex)
b> {LogWriter.InsertAuditTrail(TypeServer.AuditLevel. INFO, (null ==
b> oId)?SqlInt32.Null:(SqlInt32)oId, "Error logging session out
b> automatically.");}
b> b> }
b> b> Any ideas?
b> ---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its opponents
do not cease to be insipid." (c) Friedrich Nietzsche

---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche
Apr 3 '06 #4
Hello bruno,

And check if correct version of ASP.net 1.1 is set in the Virtual Folder
properties of your site in IIS

b> We are using InProc and we are aware of how it is supposed to
b> function.
b>
b> To clarify. It _is_ working on our development servers but _not_ on
b> the live server.
b>
b> "Michael Nemtsev" <ne*****@msn.com> wrote in message
b> news:9c**************************@msnews.microsoft .com...
b>
Hello bruno,

Session_End is not called even if browser is closed by user because
HTTP
is stateless and server dont know whether you close browser.
It's is called when u call it explicit or session is expired by
timeline
PS: Session_End is available onle in InProc mode

b> We are attempting to automatically log users off from the
Session_End
b> event in global.asax and set some values on session_start. It is
not
b> a critical task, more of a housekeeping task so that we know if
users
b> have closed down their browsers without logging off first.
However,
b> although the code seems to run OK on our development servers
(WinXP
b> ASP.NET v. 1.1, SQL Server 2000, IIS6), they don't seem to be
firing
b> on the live server despite sessions working fine.
b> b> We are using ASP.NET v. 1.1 and SQL Server 2000 on a W2K3
server
b> running IIS 6.
b> b> Here is the c# code we used:-
b> b> /// <summary>
b> b> /// We can log the user out here so that the database
b> will reflect the correct number
b> b> /// users logged in.
b> b> /// </summary>
b> b> /// <param name="sender"></param>
b> b> /// <param name="e"></param>
b> b> protected void Session_End(object sender, EventArgs e)
b> b> {
b> b> // If user id is not null, log them out
b> automatically...
b> b> object oId = Session["CurrentUserId"];
b> b> try
b> b> {
b> b> if (oId != null)
b> b> {
b> b> SqlInt32 intUserId =
b> SqlInt32.Parse(oId.ToString());
b> b> SessionServer.LogOut(intUserId,
b> Session.SessionID);
b> b> b> LogWriter.InsertAuditTrail(TypeServer.AuditLevel.I NFO,
intUserId,
b> "Session logged out automatically.");
b> b> }
b> b> }
b> b> catch (Exception ex)
b> {LogWriter.InsertAuditTrail(TypeServer.AuditLevel. INFO, (null ==
b> oId)?SqlInt32.Null:(SqlInt32)oId, "Error logging session out
b> automatically.");}
b> b> }
b> b> Any ideas?
b> ---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its opponents
do not cease to be insipid." (c) Friedrich Nietzsche

---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche
Apr 3 '06 #5
It's definately using the right version.

"Michael Nemtsev" <ne*****@msn.com> wrote in message
news:9c**************************@msnews.microsoft .com...
Hello bruno,

And check if correct version of ASP.net 1.1 is set in the Virtual Folder
properties of your site in IIS

b> We are using InProc and we are aware of how it is supposed to
b> function.
b> b> To clarify. It _is_ working on our development servers but _not_ on
b> the live server.
b> b> "Michael Nemtsev" <ne*****@msn.com> wrote in message
b> news:9c**************************@msnews.microsoft .com...
b>
Hello bruno,

Session_End is not called even if browser is closed by user because
HTTP
is stateless and server dont know whether you close browser.
It's is called when u call it explicit or session is expired by
timeline
PS: Session_End is available onle in InProc mode

b> We are attempting to automatically log users off from the
Session_End
b> event in global.asax and set some values on session_start. It is
not
b> a critical task, more of a housekeeping task so that we know if
users
b> have closed down their browsers without logging off first.
However,
b> although the code seems to run OK on our development servers
(WinXP
b> ASP.NET v. 1.1, SQL Server 2000, IIS6), they don't seem to be
firing
b> on the live server despite sessions working fine.
b> b> We are using ASP.NET v. 1.1 and SQL Server 2000 on a W2K3
server
b> running IIS 6.
b> b> Here is the c# code we used:-
b> b> /// <summary>
b> b> /// We can log the user out here so that the database
b> will reflect the correct number
b> b> /// users logged in.
b> b> /// </summary>
b> b> /// <param name="sender"></param>
b> b> /// <param name="e"></param>
b> b> protected void Session_End(object sender, EventArgs e)
b> b> {
b> b> // If user id is not null, log them out
b> automatically...
b> b> object oId = Session["CurrentUserId"];
b> b> try
b> b> {
b> b> if (oId != null)
b> b> {
b> b> SqlInt32 intUserId =
b> SqlInt32.Parse(oId.ToString());
b> b> SessionServer.LogOut(intUserId,
b> Session.SessionID);
b> b> b> LogWriter.InsertAuditTrail(TypeServer.AuditLevel.I NFO,
intUserId,
b> "Session logged out automatically.");
b> b> }
b> b> }
b> b> catch (Exception ex)
b> {LogWriter.InsertAuditTrail(TypeServer.AuditLevel. INFO, (null ==
b> oId)?SqlInt32.Null:(SqlInt32)oId, "Error logging session out
b> automatically.");}
b> b> }
b> b> Any ideas?
b> ---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its opponents
do not cease to be insipid." (c) Friedrich Nietzsche

---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do
not cease to be insipid." (c) Friedrich Nietzsche

Apr 4 '06 #6
Session is firing on your dev server but not in production, is that right?

--
Regards,
Alvin Bruney [MVP ASP.NET]

[Shameless Author plug]
The Microsoft Office Web Components Black Book with .NET
Now Available @ www.lulu.com/owc
Forth-coming VSTO.NET - Wrox/Wiley 2006
-------------------------------------------------------

"Bruno" <de********@hotmail.com> wrote in message
news:44*********************@news.zen.co.uk...
It's definately using the right version.

"Michael Nemtsev" <ne*****@msn.com> wrote in message
news:9c**************************@msnews.microsoft .com...
Hello bruno,

And check if correct version of ASP.net 1.1 is set in the Virtual Folder
properties of your site in IIS

b> We are using InProc and we are aware of how it is supposed to
b> function.
b> b> To clarify. It _is_ working on our development servers but _not_ on
b> the live server.
b> b> "Michael Nemtsev" <ne*****@msn.com> wrote in message
b> news:9c**************************@msnews.microsoft .com...
b>
Hello bruno,

Session_End is not called even if browser is closed by user because
HTTP
is stateless and server dont know whether you close browser.
It's is called when u call it explicit or session is expired by
timeline
PS: Session_End is available onle in InProc mode

b> We are attempting to automatically log users off from the
Session_End
b> event in global.asax and set some values on session_start. It is
not
b> a critical task, more of a housekeeping task so that we know if
users
b> have closed down their browsers without logging off first.
However,
b> although the code seems to run OK on our development servers
(WinXP
b> ASP.NET v. 1.1, SQL Server 2000, IIS6), they don't seem to be
firing
b> on the live server despite sessions working fine.
b> b> We are using ASP.NET v. 1.1 and SQL Server 2000 on a W2K3
server
b> running IIS 6.
b> b> Here is the c# code we used:-
b> b> /// <summary>
b> b> /// We can log the user out here so that the database
b> will reflect the correct number
b> b> /// users logged in.
b> b> /// </summary>
b> b> /// <param name="sender"></param>
b> b> /// <param name="e"></param>
b> b> protected void Session_End(object sender, EventArgs e)
b> b> {
b> b> // If user id is not null, log them out
b> automatically...
b> b> object oId = Session["CurrentUserId"];
b> b> try
b> b> {
b> b> if (oId != null)
b> b> {
b> b> SqlInt32 intUserId =
b> SqlInt32.Parse(oId.ToString());
b> b> SessionServer.LogOut(intUserId,
b> Session.SessionID);
b> b> b> LogWriter.InsertAuditTrail(TypeServer.AuditLevel.I NFO,
intUserId,
b> "Session logged out automatically.");
b> b> }
b> b> }
b> b> catch (Exception ex)
b> {LogWriter.InsertAuditTrail(TypeServer.AuditLevel. INFO, (null ==
b> oId)?SqlInt32.Null:(SqlInt32)oId, "Error logging session out
b> automatically.");}
b> b> }
b> b> Any ideas?
b> ---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its opponents
do not cease to be insipid." (c) Friedrich Nietzsche

---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do
not cease to be insipid." (c) Friedrich Nietzsche


Apr 5 '06 #7
Yes that is right.

"Alvin Bruney" <va******@hotmail.com> wrote in message
news:%2****************@TK2MSFTNGP04.phx.gbl...
Session is firing on your dev server but not in production, is that right?

--
Regards,
Alvin Bruney [MVP ASP.NET]

[Shameless Author plug]
The Microsoft Office Web Components Black Book with .NET
Now Available @ www.lulu.com/owc
Forth-coming VSTO.NET - Wrox/Wiley 2006
-------------------------------------------------------

"Bruno" <de********@hotmail.com> wrote in message
news:44*********************@news.zen.co.uk...
It's definately using the right version.

"Michael Nemtsev" <ne*****@msn.com> wrote in message
news:9c**************************@msnews.microsoft .com...
Hello bruno,

And check if correct version of ASP.net 1.1 is set in the Virtual Folder
properties of your site in IIS

b> We are using InProc and we are aware of how it is supposed to
b> function.
b> b> To clarify. It _is_ working on our development servers but _not_
on
b> the live server.
b> b> "Michael Nemtsev" <ne*****@msn.com> wrote in message
b> news:9c**************************@msnews.microsoft .com...
b>
> Hello bruno,
>
> Session_End is not called even if browser is closed by user because
> HTTP
> is stateless and server dont know whether you close browser.
> It's is called when u call it explicit or session is expired by
> timeline
> PS: Session_End is available onle in InProc mode
>
> b> We are attempting to automatically log users off from the
> Session_End
> b> event in global.asax and set some values on session_start. It is
> not
> b> a critical task, more of a housekeeping task so that we know if
> users
> b> have closed down their browsers without logging off first.
> However,
> b> although the code seems to run OK on our development servers
> (WinXP
> b> ASP.NET v. 1.1, SQL Server 2000, IIS6), they don't seem to be
> firing
> b> on the live server despite sessions working fine.
> b> b> We are using ASP.NET v. 1.1 and SQL Server 2000 on a W2K3
> server
> b> running IIS 6.
> b> b> Here is the c# code we used:-
> b> b> /// <summary>
> b> b> /// We can log the user out here so that the database
> b> will reflect the correct number
> b> b> /// users logged in.
> b> b> /// </summary>
> b> b> /// <param name="sender"></param>
> b> b> /// <param name="e"></param>
> b> b> protected void Session_End(object sender, EventArgs e)
> b> b> {
> b> b> // If user id is not null, log them out
> b> automatically...
> b> b> object oId = Session["CurrentUserId"];
> b> b> try
> b> b> {
> b> b> if (oId != null)
> b> b> {
> b> b> SqlInt32 intUserId =
> b> SqlInt32.Parse(oId.ToString());
> b> b> SessionServer.LogOut(intUserId,
> b> Session.SessionID);
> b> b> b> LogWriter.InsertAuditTrail(TypeServer.AuditLevel.I NFO,
> intUserId,
> b> "Session logged out automatically.");
> b> b> }
> b> b> }
> b> b> catch (Exception ex)
> b> {LogWriter.InsertAuditTrail(TypeServer.AuditLevel. INFO, (null ==
> b> oId)?SqlInt32.Null:(SqlInt32)oId, "Error logging session out
> b> automatically.");}
> b> b> }
> b> b> Any ideas?
> b> ---
> WBR,
> Michael Nemtsev :: blog: http://spaces.msn.com/laflour
> "At times one remains faithful to a cause only because its opponents
> do not cease to be insipid." (c) Friedrich Nietzsche
>
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do
not cease to be insipid." (c) Friedrich Nietzsche



Apr 5 '06 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: Steve Donnelly | last post by:
I have an HttpModule that gets the SessionStateModule and registers for the Start and End events. Global receives both Start and End events (both timeout and when Session.Abandon() is called),...
3
by: Guadala Harry | last post by:
Just wondering if Session_End *always fires* for every Session. I know that IIS times out sessions after a default 20 min (unless changed) and there's no way to know when a user actually closed a...
4
by: Kim Bach Petersen | last post by:
I would like to record user behavior data stored in session variables. Since the data is modified throughout each session it seemed obvious to store the data when the session terminates - using...
7
by: Henry | last post by:
I have a question on session_end. I'm trying to log into my database when the session times out, it will store user info into a table. When I got step into a line where I was trying to open...
8
by: Roger | last post by:
When I call the session.abandon() method, it calls the session_end event. When a user closes the browser or clicks the log off button, I can dispose of objects and abandon the session cleaning....
1
by: =?Utf-8?B?YnJlbnQ5NjA=?= | last post by:
Environment: ASP.NET 2.0, SQL Server 2005, C#, Visual Studio 2005 In my Session_End event, I am executing a stored procedure to update a database table that is used to log user sessions. When...
12
by: =?Utf-8?B?QWxleCBNYWdoZW4=?= | last post by:
Hi. I am trying to maintain a list of people who are currently "online" in SQL. I do this by adding a simple entry to a simple PeopleOnline table whenever someone logs in to my site. If they...
3
by: Mufasa | last post by:
I have code in my session_start to create a temp directory for the session. On session_end it is supposed to delete the directory but doesn't seem to be firing. I've enclosed the code below. ...
5
by: greg | last post by:
Written in Asp.Net 2.0 The session_start fires on Development server running withing Visual Studio 2005 and also if access web site via localhost on development machine. But if copy to...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.