// Generic Form Validation
// Jacob Hage (jacob@hage.dk)
var checkObjects	= new Array();
var errors			= "";
var returnVal		= false;
var language		= new Array();
language["header"]	= "The following error(s) occured:"
language["start"]	= "->";
language["field"]	= " Field ";
language["require"]	= " is required";
language["min"]		= " and must consist of at least ";
language["max"]		= " and must not contain more than ";
language["minValue"]= " and must be bigger than ";
language["maxValue"]= " and must be smaller than ";
language["minmax"]	= " and no more than ";
language["chars"]	= " characters";
language["num"]		= " and must contain a number";
language["email"]	= " must contain a valid e-mail address";
language["emaildomain"]	= " -- domain is not accepted";
language["combo"]	= " must select an option";
// -----------------------------------------------------------------------------
// define - Call this function in the beginning of the page. I.e. onLoad.
// n = name of the input field (Required)
// type= string, num, email (Required)
// min = the value must have at least [min] characters (Optional)
// max = the value must have maximum [max] characters (Optional)
// d = (Optional)
// -----------------------------------------------------------------------------
function define(n, type, HTMLname, min, max, minValue, maxValue, d) 
{
 var p;
 var i;
 var x;
	if (!d) 
		d = document;
	if ((p=n.indexOf("?"))>0&&parent.frames.length) 
	{
		d = parent.frames[n.substring(p+1)].document;
		n = n.substring(0,p);
	}
    if (!(x = d[n]) && d.all) x = d.all[n];
    for (i = 0; !x && i < d.forms.length; i++) 
    {
        x = d.forms[i][n];
    }
for (i = 0; !x && d.layers && i < d.layers.length; i++) {
x = define(n, type, HTMLname, min, max, d.layers[i].document);
return x;       
}
eval("V_"+n+" = new formResult(x, type, HTMLname, min, max, minValue, maxValue);");

    if (eval("V_"+n + ".form"))
    {
        checkObjects[eval(checkObjects.length)] = eval("V_"+n);
    }
    else
    {
    }
}

function undefine(n)
{
    var i;
    for (i=0; i<checkObjects.length; i++)
    {
        if (checkObjects[i]["form"]["name"] == n || checkObjects[i]["form"]["id"] == n)
        {
            for(j=i; j<checkObjects.length - 1; j++)
                checkObjects[j] = checkObjects[j+1];
            checkObjects[j] = null;
            checkObjects.length--;
            return;
        }
    }
}

function formResult(form, type, HTMLname, min, max, minValue, maxValue) {
this.form = form;
this.type = type;
this.HTMLname = HTMLname;
this.min  = min;
this.max  = max;
this.minValue = minValue;
this.maxValue = maxValue;
}

function validate() 
{
if (checkObjects.length > 0) 
{
errorObject = "";
for (i = 0; i < checkObjects.length; i++) 
{
validateObject = new Object();
validateObject.form = checkObjects[i].form;
validateObject.HTMLname = checkObjects[i].HTMLname;
validateObject.val = trim(checkObjects[i].form.value);
validateObject.len = trim(checkObjects[i].form.value).length;
validateObject.min = checkObjects[i].min;
validateObject.max = checkObjects[i].max;
validateObject.minValue = checkObjects[i].minValue;
validateObject.maxValue = checkObjects[i].maxValue;
validateObject.type = checkObjects[i].type;
    if (validateObject.type == "num" || 
		validateObject.type == "string")
	{
		if ((validateObject.type == "num" && validateObject.len <= 0) || 
		    (validateObject.type == "num" && isNaN(validateObject.val))) 
		{ 
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + "\n";
		} else 
		if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
		} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['chars'] + "\n";
		} else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['max'] + validateObject.max + language['chars'] + "\n";
		} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
	   	}
	   	if (validateObject.type == "num")
	   	{
	   		// validate value range
			if (validateObject.minValue && validateObject.maxValue && (validateObject.val < validateObject.minValue || validateObject.val > validateObject.maxValue)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['minValue'] + validateObject.minValue + language['maxValue'] + validateObject.maxValue + "\n";
			} else if (validateObject.minValue && !validateObject.maxValue && (validateObject.val < validateObject.minValue)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['minValue'] + validateObject.minValue + "\n";
			} else if (validateObject.maxValue && !validateObject.minValue &&(validateObject.val > validateObject.maxValue)) { errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['maxValue'] + validateObject.maxValue + "\n";
			}
	   	}
} else if(validateObject.type == "email") 
   {
	// Checking existense of "@" and ".". 
	// Length of must >= 5 and the "." must 
	// not directly precede or follow the "@"
	if ((validateObject.val.indexOf("@") == -1) || 
		(validateObject.val.charAt(0) == ".") || 
		(validateObject.val.charAt(0) == "@") || 
		(validateObject.len < 6) || 
		(validateObject.val.indexOf(".") == -1) || 
		(validateObject.val.charAt(validateObject.val.indexOf("@")+1) == ".") || 
		(validateObject.val.charAt(validateObject.val.indexOf("@")-1) == ".")) 
	 { 
		errors += language['start'] + language['field'] + validateObject.HTMLname + language['email'] + "\n"; 
	 }
	  else
	 {
		////////////////////////////////////////////!!!  scrub domains de email
		var emailDomain = validateObject.val.substring(validateObject.val.indexOf("@")+1);
		if (!CheckEmailDomain(emailDomain))
		{
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['emaildomain'] + "\n"; 
		}

	 }
   }
   else if (validateObject.type == "combo")
   {
		if ((validateObject.val == "DefaultValue") ||
			(validateObject.len < 1))
		{
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['combo'] + "\n";
		}
   }
}

	if (errors) 
	{
		alert(language["header"].concat("\n" + errors));
		errors = "";
		returnVal = false;
        return false;
    } 
	else 
	{
		returnVal = true;
        return true;
    }
}
else return true;
}

// Ionut 2002-12-03
// allow formats nnnn.nn,nnnnn,-nnn, -nn.nn
function isNum(param, allowPoint, allowMinus)
{	
	
    var strNum = param;  
	if (strNum.length == 0)
		return false;

	if (true == allowPoint)
	{
	
        if (strNum.indexOf('.') != strNum.lastIndexOf('.'))
	    {	
		    return false;
	    }
	}
	if ('.' == strNum.charAt(0))
	{
        return false;
    }
    if ('.' == strNum.charAt(strNum.length-1))
	{
        return false;
    }
    
    if (true == allowMinus)
    {
        if ('-' != strNum.charAt(0)) 
            if ((strNum.charAt(0)<'0')||(strNum.charAt(0)>'9'))
	        {
                return false;
            }
    }
    else
    {
        if ((strNum.charAt(0)<'0')||(strNum.charAt(0)>'9'))
	        {
                return false;
            }
    }
    
    for (j=1; j < strNum.length; j++)
	{	
		if (true == allowPoint)
		{
		
            if (strNum.charAt(j) != '.')
		    {
			    if((strNum.charAt(j)<'0')||(strNum.charAt(j)>'9'))
			    {
			    	return false;
			    }
		    }
        }
        else 
        {
             if((strNum.charAt(j)<'0')||(strNum.charAt(j)>'9'))
			    {
			    	return false;
			    }
        }
	}
	return true;
}


//Ionut 2002-12-04
//used to brands and events forms
function checkData(strFieldStringName, strFieldNumberName, strFieldStringHTMLName,  strFieldNumberHTMLName)
{
    if (trim(strFieldStringName).length == 0)
    {
        alert(strFieldStringHTMLName+' is required!');
        return false;
    }
    
    if (!isNum(strFieldNumberName, false, false))
    {
        alert(strFieldNumberHTMLName+' is required and must be a number!');
        return false;
    }
    
    return true;
}

function trim(strText) { 
    // this will get rid of leading spaces 
    while (strText.substring(0,1) == ' ') 
        strText = strText.substring(1, strText.length);

    // this will get rid of trailing spaces 
    while (strText.substring(strText.length-1,strText.length) == ' ')
        strText = strText.substring(0, strText.length-1);

   return strText;
} 
// This function replaces all instances of findStr in oldStr with repStr.

function replaceAll(oldStr,findStr,repStr) {
  var srchNdx = 0;  // srchNdx will keep track of where in the whole line
                    // of oldStr are we searching.
  var newStr = "";  // newStr will hold the altered version of oldStr.
  while (oldStr.indexOf(findStr,srchNdx) != -1)  
                    // As long as there are strings to replace, this loop
                    // will run. 
  {
    newStr += oldStr.substring(srchNdx,oldStr.indexOf(findStr,srchNdx));
                    // Put it all the unaltered text from one findStr to
                    // the next findStr into newStr.
    newStr += repStr;
                    // Instead of putting the old string, put in the
                    // new string instead. 
    srchNdx = (oldStr.indexOf(findStr,srchNdx) + findStr.length);
                    // Now jump to the next chunk of text till the next findStr.           
  }
  newStr += oldStr.substring(srchNdx,oldStr.length);
                    // Put whatever's left into newStr.             
  return newStr;
}
function toHTML(strVal)
{
	var strRet = strVal;
	if (strVal != null)
    {
        strRet = replaceAll(strRet, '&', '&amp;');
        strRet = replaceAll(strRet, '<', '&lt;');
        strRet = replaceAll(strRet, '>', '&gt;');
        strRet = replaceAll(strRet, '"', '&quot;');
        strRet = replaceAll(strRet, '\r\n', '<br>');
        strRet = replaceAll(strRet, '\n\r', '<br>');
        strRet = replaceAll(strRet, '\r', '<br>');
        strRet = replaceAll(strRet, '\n', '<br>');
        strRet = replaceAll(strRet, '<br>', '<br>\n');
    }
	return strRet;
}
function fromHTML(strVal)
{
	var strRet = strVal;
	if (strVal != null)
    {
        strRet = replaceAll(strRet, '&amp;','&');
        strRet = replaceAll(strRet, '&lt;', '<');
        strRet = replaceAll(strRet, '&gt;', '>');
        strRet = replaceAll(strRet, '&quot;', '"');
        strRet = replaceAll(strRet, '<br>', '\r\n');
        strRet = replaceAll(strRet, '<br>', '\n\r');
        strRet = replaceAll(strRet, '<br>', '\r');
        strRet = replaceAll(strRet, '<br>', '\n');
        strRet = replaceAll(strRet, '<br>\n', '<br>');
    }
	return strRet;
}
 
/*
BogdanB
*/ 

function checkIfContainsNumbers(strNum) 
{
	for (j=1; j < strNum.length; j++)
	{
	    if((strNum.charAt(j)>'0') && (strNum.charAt(j)<'9'))
	    {
	    	return true;
	    }				
	}
}

function checkABA(strNumber)
{
	n = 0;
  for (i = 0; i < strNumber.length; i += 3) {
    n += parseInt(strNumber.charAt(i),     10) * 3
      +  parseInt(strNumber.charAt(i + 1), 10) * 7
      +  parseInt(strNumber.charAt(i + 2), 10);
  }

  // If the resulting sum is an even multiple of ten (but not zero),
  // the aba routing number is good.

  if (n != 0 && n % 10 == 0)
    return true;
  else
    return false;
}

function validDate(dateStr)
{
	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;

	// To require a 4 digit year entry, use this line instead:
	// var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

	var matchArray = dateStr.match(datePat); // is the format ok?
	if (matchArray == null) 
	{
		alert("Date is not in a valid format.")
		return false;
	}
	month = matchArray[1]; // parse date into variables
	day = matchArray[3];
	year = matchArray[4];
	if (month < 1 || month > 12) 
	{ // check month range
		alert("Month must be between 1 and 12.");
		return false;
	}
	if (day < 1 || day > 31) {
		alert("Day must be between 1 and 31.");
		return false;
	}
	if ((month==4 || month==6 || month==9 || month==11) && day==31) 
	{
		alert("Day must be smaller than 31 for "+month+".")
		return false
	}
	if (month == 2) 
	{ // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day>29 || (day==29 && !isleap)) 
		{
			alert("The Day for February " + year + " must be less than  " + day + ".");
			return false;
		}
	}

return true;  // date is valid
}


function takeYear(theDate)
{
	x = theDate.getYear();
	var y = x % 100;
	y += (y < 38) ? 2000 : 1900;
	return y;
}
//<!-- STEP TWO: Include the .js file in the HEAD of your main document  -->

strValidChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_-";

function isValidChar(a)
{
	if (strValidChars.indexOf(a) > -1)
		return true;
	return false;
}

function isValidPassword(strPassword)
{
	if (strPassword == null)
	{
		return false;
	}
	if (strPassword.length < 4)
	{
		return false;
	}
	if (strPassword.length > 10)
	{
		return false;
	}

	for (i=0; i<strPassword.length; i++)
	{
		if (! isValidChar(strPassword.charAt(i)))
		{
			return false;
		}
	}

	return true;
}

function ResetValidation()
{
	checkObjects.length = new Array();
}


//Task 2893 - Scrub mobile domains 
var RejectedEmailDomains = "08-18-2008^TMAIL.COM,08-18-2008^rcsepager.com,08-18-2008^sprintpcs.com,08-18-2008^verizon.com,08-18-2008^verizonwireless.com,08-18-2008^wmg.tmomail.net,10-01-2007^comspeco.net,10-01-2007^ims.cingularme.com,10-01-2007^mms.att.net,10-01-2007^mms.myblueworks.com,10-01-2007^mobile.mycingular.com,10-01-2007^mobile.mycingular.net,10-01-2007^pics.cingularme.com,10-01-2007^sd.cingularme.com,10-01-2007^sd.mycingular.net,10-01-2007^sms.bluecell.com,10-01-2007^text.att.net,10-01-2007^txt.att.net,10-01-2007^wcmx.mycingular.net,06-18-2007^2pageme.net,06-18-2007^pageme.net,06-15-2007^1x.srtwireless.com,06-15-2007^2pagemci.com,06-15-2007^allbeep.com,06-15-2007^ccc3g.biz,06-15-2007^ccc3g.info,06-15-2007^ccc3g.net,06-15-2007^ccc3g.us,06-15-2007^cccomm.biz,06-15-2007^cellcom.quiktxt.com,06-15-2007^cellcom.us.blackberry.com,06-15-2007^evdo.srtwireless.com,06-15-2007^helio.com,06-15-2007^mms.att.com,06-15-2007^mms.srtwireless.com,06-15-2007^mobilcom.com,06-15-2007^mobile.kajeet.net,06-15-2007^mobilemessage.com,06-15-2007^myairmail.com,06-15-2007^myhelio.com,06-15-2007^mytelepage.com,06-15-2007^page.contactwireless.com,06-15-2007^page.mobilcom.com,06-15-2007^page.mobilcom.net,06-15-2007^page.selectpath.com,06-15-2007^pagemci.com,06-15-2007^pageme.teletouchpaging.com,06-15-2007^pageoneinc.com,06-15-2007^pager.ucom.com,06-15-2007^paging.nextel.com,06-15-2007^pm.sprint.com,06-15-2007^sk-earthlink.com,06-15-2007^skearthlink.com,06-15-2007^skymail.com,06-15-2007^skytel.com,06-15-2007^sms.myboostmobile.com,06-15-2007^txtpage.com,06-15-2007^union-tel.com,06-15-2007^vzwpix.com,08-08-2005^tuyomail.com,04-28-2005^message.alltel.com,04-19-2005^ipnpaging.com,04-19-2005^mycricket.com,04-19-2005^page-us.com,04-19-2005^qwtext.com,03-08-2005^awsms.com,03-08-2005^epageme.com,03-08-2005^imcingular.com,03-08-2005^myawi.com,02-18-2005^guamcell.com,02-07-2005^advmms.com,02-07-2005^agw-atl.pdg.bellsouth.net,02-07-2005^airlinkmobile.com,02-07-2005^airmessage.net,02-07-2005^airpage.net,02-07-2005^alaskadigitel.com,02-07-2005^archwireless.net,02-07-2005^atlmmg1.glr.cingular.net,02-07-2005^attmobility.com,02-07-2005^attmobility.net,02-07-2005^bellsouthtms.com,02-07-2005^bellsouthtms.net,02-07-2005^bellsouthwirelessemail.com,02-07-2005^bellsouthwirelessemail.net,02-07-2005^blswe.com,02-07-2005^blswe.net,02-07-2005^breweloquiwireless.net,02-07-2005^c1usa.com,02-07-2005^c1wi.com,02-07-2005^calnorth.net,02-07-2005^cell1net.net,02-07-2005^cell1wv.net,02-07-2005^cellcompage.com,02-07-2005^cellcomsms.com,02-07-2005^cellonemail.com,02-07-2005^cellular.ameritech.com,02-07-2005^cellular1.net,02-07-2005^cellularone.blackberry.net,02-07-2005^centennialcom.com,02-07-2005^centennialwireless.com,02-07-2005^cingularme.com,02-07-2005^cingularme.net,02-07-2005^cingularme.us,02-07-2005^clearlydigital.com,02-07-2005^clearpath.acswireless.com,02-07-2005^cookmail.com,02-07-2005^corrcomm.com,02-07-2005^corrwireless.com,02-07-2005^corrwireless.net,02-07-2005^csouth1.com,02-07-2005^csouth1.net,02-07-2005^cwemail.com,02-07-2005^cwemail.net,02-07-2005^cwmail2.glr.cingular.com,02-07-2005^cwwsms.com,02-07-2005^dcswi.com,02-07-2005^digitaledge.acswireless.com,02-07-2005^edgehiptop.com,02-07-2005^edgehiptopmail.com,02-07-2005^edgemobile.net,02-07-2005^edgesend.com,02-07-2005^edgesend.net,02-07-2005^edgewireless.com,02-07-2005^eloqui.net,02-07-2005^email.swbw.com,02-07-2005^email.uscc.net,02-07-2005^epage.lrps.com,02-07-2005^firstcellular.net,02-07-2005^glr.sbms.sbc.com,02-07-2005^gocbw.com,02-07-2005^gwteletech.com,02-07-2005^hiptop.suncom.net,02-07-2005^info2go.com,02-07-2005^ivcdata.com,02-07-2005^ivcel.net,02-07-2005^ivctext.com,02-07-2005^iwarn.com,02-07-2005^iwspcs.com,02-07-2005^iwspcs.net,02-07-2005^leaco.net,02-07-2005^leaco.org,02-07-2005^mail.data1source.com,02-07-2005^mail.pagespringfield.com,02-07-2005^mail.westlinkcom.com,02-07-2005^messaging.nextel.com,02-07-2005^messaging.sprintpcs.com,02-07-2005^mid-texcellular.com,02-07-2005^midwestwireless.net,02-07-2005^minncommpaging.com,02-07-2005^mmode.com,02-07-2005^mms.dobson.net,02-07-2005^mms.farmerswireless.com,02-07-2005^mms.suncom.net,02-07-2005^mms.uscc.net,02-07-2005^mms.westlinkcom.com,02-07-2005^mmseloquiwireless.net,02-07-2005^mobilcom.net,02-07-2005^mobile.att.net,02-07-2005^mobile.c1-slo.com,02-07-2005^mobile.celloneusa.com,02-07-2005^mobile.cellularone-slo.com,02-07-2005^mobile.cellularoneslo.com,02-07-2005^mobile.centralcoastdata.com,02-07-2005^mobile.dobson.net,02-07-2005^mobile.dobsoncellular.com,02-07-2005^mobile.fivestarwireless.com,02-07-2005^mobilecomm.net,02-07-2005^mohavewireless.com,02-07-2005^mpot.com,02-07-2005^my2way.com,02-07-2005^myblue.com,02-07-2005^myboostmobile.com,02-07-2005^myc29.net,02-07-2005^mycellone.net,02-07-2005^mycellonephone.com,02-07-2005^mycingular.com,02-07-2005^mycingular.net,02-07-2005^mydcs1.com,02-07-2005^mylyrix.net,02-07-2005^mymetropcs.com,02-07-2005^mymmode.com,02-07-2005^mymmsmail.com,02-07-2005^omnicom-paging.com,02-07-2005^onelinkpcs.com,02-07-2005^pacbellpcs.net,02-07-2005^page-all.com,02-07-2005^page.mobilfone.com,02-07-2005^page.nextel.com,02-07-2005^pageallcom.com,02-07-2005^pageme.teletouch.com,02-07-2005^pageme.teletouch.net,02-07-2005^pagenet.net,02-07-2005^pagerpeople.com,02-07-2005^paging.acswireless.com,02-07-2005^paging.mobilfone.com,02-07-2005^paging.sbc.com,02-07-2005^paging.telebeep.com,02-07-2005^pics.cellcom.com,02-07-2005^pim.infospace.com,02-07-2005^pioneerenidcellular.com,02-07-2005^pix.cellularsouth.com,02-07-2005^prestopaging.com,02-07-2005^quiktxt.com,02-07-2005^qwestmessagepack.com,02-07-2005^qwestmessagepak.com,02-07-2005^qwestmp.com,02-07-2005^racomm.com,02-07-2005^radiocommpaging.com,02-07-2005^radiocontrolit.com,02-07-2005^radiopaging.com,02-07-2005^rccpaging.com,02-07-2005^redicall.com,02-07-2005^satellink.net,02-07-2005^sbc2way.com,02-07-2005^sbcemail.com,02-07-2005^sbcpaging.com,02-07-2005^sbycomm.com,02-07-2005^sccvmail.com,02-07-2005^simmetrypcs.com,02-07-2005^simmetrypcs.net,02-07-2005^sms-bscc.bellsouth.com,02-07-2005^sms.bellsouth.com,02-07-2005^sms.cleartalk.net,02-07-2005^sms.corrwireless.com,02-07-2005^sms.cvalley.net,02-07-2005^sms.farmerswireless.com,02-07-2005^sms.petrocom.net,02-07-2005^sms.snakeriverpcs.com,02-07-2005^smseloquiwireless.net,02-07-2005^southernlinc.com,02-07-2005^srtwireless.com,02-07-2005^stenocall.com,02-07-2005^suncom.blackberry.net,02-07-2005^text.simplefreedom.net,02-07-2005^tmomail.net,02-07-2005^tms.bellsouth.com,02-07-2005^tms.suncom.com,02-07-2005^ubetwireless.com,02-07-2005^usamobility.net,02-07-2005^uscc.textmsg.com,02-07-2005^utext.com,02-07-2005^viaeromail.com,02-07-2005^viaeromms.com,02-07-2005^viaerosms.com,02-07-2005^vtext.com,02-07-2005^wireless.bellsouth.com,02-07-2005^wwtext.net,02-07-2005^zsend.com"; 


function CheckEmailDomain(emailDomain)
{
	try
	{
		arrDom = RejectedEmailDomains.split(",");
		var DomainsArray = arrDom.length;
		for (CounterDomainArray=0;CounterDomainArray<DomainsArray;CounterDomainArray++)
		{
			arrDom[CounterDomainArray] = arrDom[CounterDomainArray].substring(arrDom[CounterDomainArray].indexOf("^") + 1);
		}

		for (CounterDomainArray1 = 0;CounterDomainArray1 < DomainsArray ; CounterDomainArray1++)
		{
			if (arrDom[CounterDomainArray1].toLowerCase() == emailDomain.toLowerCase())
			{
			return false;
			}	
		}
		return true;
	}
	
	catch (err)
	{
		return false;
	}
}
