From: <Saved by Windows Internet Explorer 7>
Subject: nrich.maths.org :: Mathematics Enrichment :: Ratio Sudoku 1
Date: Thu, 11 Jun 2009 10:43:58 +0100
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0000_01C9EA81.8633EB00"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579

This is a multi-part message in MIME format.

------=_NextPart_000_0000_01C9EA81.8633EB00
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://nrich.maths.org/public/viewer.php?obj_id=4827&part=index&nomenu=1

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML lang=3Den xml:lang=3D"en" =
xmlns=3D"http://www.w3.org/1999/xhtml"><HEAD><TITLE>nrich.maths.org :: =
Mathematics Enrichment :: Ratio Sudoku 1</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META=20
content=3D"nrich,enrichment,mathematics,math,maths,school,geometry,algebr=
a,trigonometry,number,shape,arithmetic,symmetry,pattern,education,cambrid=
ge,maths,children,curriculum,teachers,teaching,primary,secondary,Ratio,Wo=
rking systematically,Games"=20
name=3Dkeywords>
<META content=3D"A Sudoku with clues as ratios." =
name=3DDescription><LINK=20
title=3DNRICH! href=3D"../public/rss.php?feed=3Dall" =
type=3Dapplication/rss+xml=20
rel=3Dalternate>
<SCRIPT src=3D"http://nrich.maths.org/javascript/jquery.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://nrich.maths.org/javascript/jquery.nrichNoCache.js" =

type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://nrich.maths.org/javascript/air.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://nrich.maths.org/javascript/jsMath/easy/load.js"=20
type=3Dtext/javascript></SCRIPT>

<STYLE type=3Dtext/css>BODY {
	FONT-FAMILY: Arial; BACKGROUND-COLOR: #fff
}
#jsMath_PrintWarning {
	DISPLAY: none
}
</STYLE>

<META content=3D"MSHTML 6.00.6000.16825" name=3DGENERATOR></HEAD>
<BODY>
<DIV id=3Dbodydiv>
<DIV id=3Dcontentwrapper>
<H2>'Ratio Sudoku 1' printed from http://nrich.maths.org/</H2>
<H3><A=20
href=3D"http://nrich.maths.org/public/viewer.php?obj_id=3D4827&amp;part=3D=
index&amp;nomenu=3D0">Show=20
menu</A></H3>
<DIV id=3Dproblemview><BR>Produced by Henry Kwok<BR><IMG height=3D600 =
alt=3D""=20
src=3D"http://nrich.maths.org/content/id/4827/sudokumar.gif" =
width=3D600><BR>
<H4>Basic Rules of "Ratio Sudoku"</H4>
<P>The special clue-numbers in this Sudoku variant are fractions or =
ratios in=20
the lowest terms, hence the name for the puzzle.</P>
<P>The clue-numbers are always placed on the border lines between =
selected pairs=20
of neighbouring cells of the grid.</P>
<P>Each clue-number is the fraction of the two numbers in adjacent cells =
(to the=20
left and right). Each fraction is written in its lowest terms, with the =
smaller=20
number denoted as the numerator. Thus $1/2$ can stand for the following=20
combinations of numbers in the two adjacent cells: $1$ and $2$, $2$ and =
$1$, $2$=20
and $4$, $4$ and $2$, $3$ and $6$, $6$ and $3$, $4$ and $8$, $8$ and =
$4$.</P>
<P>Suppose the answers in the two adjacent cells of a puzzle are =
actually $7$=20
and $5$, the clue-number will be written in the form $5/7$ instead of =
$7/5$,=20
otherwise this would give away the answer and the puzzle would be too =
easy to=20
solve!</P>
<P>When fractions are placed on consecutive border lines, a number of=20
combinations are possible. For example:</P>
<UL>
  <LI>
  <P>if two fractions, $2/3$ and $1/4$, are placed consecutively from =
left to=20
  right, the possible combinations of answers in the three neighbouring =
cells=20
  would be the following two sets of numbers $3$, $2$ and $8$, and $6$, =
$4$ and=20
  $1$;</P>
  <LI>
  <P>if three fractions are placed on the consecutive border lines in =
the=20
  following order $2/3, 1/4$ and $1/2$, the combinations of answers in =
the four=20
  neighbouring cells would be $3, 2, 8$ and $4$, and $6, 4, 1$ and=20
$2$.</P></LI></UL>
<P>The remaining rules are as in a "standard" Sudoku, and the object of =
the=20
puzzle is to fill in the whole $9 \times 9$ grid with numbers $1$ =
through $9$=20
(one number per cell) so that each horizontal line, each vertical line, =
and each=20
of the nine $3 \times 3$ squares (outlined with the bold lines) must =
contain all=20
the nine different numbers $1$ through $9$.</P><BR></DIV>
<DIV style=3D"CLEAR: both"></DIV></DIV><!-- end contentwrapper div -->
<DIV id=3DinfoBar>
<UL>
  <LI><A href=3D"http://www.adobe.com/go/getflash"><IMG alt=3D"get flash =
player"=20
  =
src=3D"http://nrich.maths.org/media/mountain/get_flash_player.png"></A>=20
  <LI>
  <P><A=20
  =
href=3D"http://www.math.union.edu/~dpvc/jsmath/download/jsMath-fonts.html=
">Download=20
  Mathematical Fonts for better quality.</A></P></LI></UL></DIV>
<DIV id=3Dfooter>
<DIV class=3Dpadder>
<DIV class=3DleftPanel><A class=3Dcamlogo =
href=3D"http://www.cam.ac.uk/"><IMG=20
height=3D46 alt=3D"Cambridge University logo"=20
src=3D"http://nrich.maths.org/media/camlogo.gif" width=3D192></A>=20
<P><A href=3D"http://nrich.maths.org/public/terms.php">Copyright =A9 =
2007.=20
University of Cambridge. All rights reserved.</A> </P>
<P>NRICH is part of the family of activities in the <A=20
href=3D"http://mmp.maths.org/">Millennium Mathematics Project</A>, which =
also=20
includes the <A href=3D"http://plus.maths.org/">Plus</A> and <A=20
href=3D"http://motivate.maths.org/">Motivate</A> sites. </P>
<P>email: <A =
href=3D"mailto:nrich@damtp.cam.ac.uk">nrich@damtp.cam.ac.uk</A>=20
&nbsp; </P></DIV>
<DIV class=3DrightPanel><A title=3D"The Queen's anniversary prizes"=20
href=3D"http://mmp.maths.org/news/first.html"><IMG=20
alt=3D"The Queen's anniversary prizes"=20
src=3D"http://nrich.maths.org/media/qlogo.jpg"></A> </DIV><!--=0A=
<p><a href=3D"/public/login.php">Login</a><br />=0A=
<a href=3D"/public/login.php?logout=3Dyes">Logout</a></p>=0A=
-->
<DIV style=3D"CLEAR: =
both"></DIV><!--padder--></DIV><!--footer--></DIV><!-- end bodydiv =
--></DIV></BODY></HTML>

------=_NextPart_000_0000_01C9EA81.8633EB00
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://nrich.maths.org/content/id/4827/sudokumar.gif

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

------=_NextPart_000_0000_01C9EA81.8633EB00
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://nrich.maths.org/media/mountain/get_flash_player.png

iVBORw0KGgoAAAANSUhEUgAAAHsAAAAjCAMAAACDxIXXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAAYBQTFRFTE1NdnV2+Ojm8fHwuLi4jAcGcgYF4eHi3NzczgoK9PLr5eXl
+XJzxsbG6enprWZh9q6u7u7u+jI0+/v7+Y+Ph4eHMTEx+k1P+/Py9sbDpaSk9PT09O3vl5eXuQkJ
7PHsvX997fPypAcH8/n01NPU5bu5z7u65AwN9Pn59/X54trT+/X4+/n1+OPk+NvYXgQE+MG+8fH1
7/b2xnJz2tnV9fTx7u3x9vDv8vXw2NTVqkZE9zg/kDQ37+3o5urq6+vr3+He9/H11tbW9vT26u7t
7+rq5szL7eru9vb23dPR+l1g7Onl1tjX+GRl2dfY1tna3dzh6ezr6ebk5ujm5OTk9dvh3NjX8/T2
qysv9/fyshgc2d3d2trd5eDe7dfOoAoN+PPx+c7N4uTi8/b04ODg4+PjsLCwu7289ff25OTmjo6O
wMDA6OjoW1tbYmJi5uLkvoeCxYSG2Z+m0aCd+p2fxFdaz9LQz87O2ODb29vb3Nza9dLQ19fX3t7e
2dnZ9/f31w6RXgAACDhJREFUeNqslf9/0sYfxw8OGiSQkgBHIUGkrQoDLaAUFLsItIJY6pBsDOek
FSgICdtnH2eHAvnX974EKn55+IPzRXKXu3vf+3nvd+4COsSHkpSmarVa2WzZUJxK1/VYrBzT42X9
W5Uwp1bNVtWUuBKq8BVnFGNM0S3aUx1Wl7YxQCcTCV3PfjP882Wv0RHPRw8OnFT5fP4UlM2KYgKk
l6vV01OnNx7bSej/QcPYcJ27Hrd08OTmpa4sdXWp7U5nK1lOxL6ZOyyv5fyzuBtYunnzY/rVJXt7
G9jZxLC68x+iTm4VE1+OG0PO+c/iXqEpva0nEt/MLurD8q2fi8Mvhi0i+fBD3FdurpGNuLc7YB+H
pHllt3tqzKUe2smEV2wnbgfPYC9YU8GgdWtnp11NnKWsO1vD98HU7a22FAwGU++9rrrPlfjSNscY
2EeXQd/8OOwOZVcpW1ctBOQw31y1d77TjSX0lksQrPFEXSgUhPrP8XIwIBQE31ZQgKpuhUoo1G/X
hFrgZfXT40XRwG7IH22zJfn5/ftm3NWyHq+KExKWRXdVr2KxqkMrnczEE3ogIHj0fL3gtL4RAtbb
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
fU+VVvpXgAEAXf/OCX7BBuQAAAAASUVORK5CYII=

------=_NextPart_000_0000_01C9EA81.8633EB00
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://nrich.maths.org/media/camlogo.gif

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
t8rVrnr1q2ANq1jHStaymvWsYI0AADs=

------=_NextPart_000_0000_01C9EA81.8633EB00
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://nrich.maths.org/media/qlogo.jpg

/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPAAA/+4ADkFkb2JlAGTAAAAAAf/b
AIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxsc
Hx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f
Hx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAtwCBAwERAAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAA
AAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIG
AnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6Oz
NhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dn
d4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQID
BQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LC
B3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaW
prbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq
+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWndI0Z3YIiglmY0AA6kk4qkepeZ7JLa
Zbc85OLJHJIRDFzow+25So5LSq+2KoPy35jt4tIt4bw/vYY/3skTCdQBypy4s7AhV32oMVZNDNDN
GJIXEkZ6MpqMVX4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlXmf0V0eaSYsI4yrMyjlx3pyZKjmgr
VlPUYqxq2ufJscdwJ6Xn7gM2pTKzM7szRlF5L8FNuNMVUrG68mPpFlEYeDryE1yvITQEK0hb1kUE
70AxVkPk82r2Mz2073MfqlfrDL6auQAeSp2+18R/aNTiqfYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
YqpXltHdWk1tIKxzI0bD2YUxV503lLzx64lDRFlXgDyjAIr1pSle9euKrU8o+d4/S4elSJeCLyjI
K0pRgRRtvHFWe6Dp8lhpUFvMQbihe4Yb1lclnNf9Y4qj8VdirsVdirsVdirsVdirsVdirsVdirsV
diqF1DUYLJIy6tJLM3pwQRjk7tStADToBUk7DFVDStdtNRkngRHgu7Y8Z7aYAOteh2JBHuDiqY4q
7FXYq7FXYq7FXYq7FXYq7FXYq7FXEgdTirsVdiqVSAP5og57iKzkaIeDNIqsfuAxVKKiP8yKR7er
Zfvvcg7f8RGKssxV2KuqK0rv4Yq7FXYq7FXYq7FXYq7FXYq7FUr17/ebJwYyecapr+s6bMZLO7kj
4/sV5IfmrVGZkYA82mUiEz8tfnJptxcLY6+FsZ2PFLwV9Bj/AJVfsH8PlkMmkI3jumOcciy/WZVt
bzTdUBHoI5t7hx0EdwAFYnwEirmG3pP5YJ1PzZq2sje3j/0a3bsaUFR9CV+nFUF5t/NzRtJuH0/T
OOo6khKyFT+5iYbUZh9ph/Kv35lYtKZbnYNE8wGwY3Zeate1aYPd3blWP91H8CD/AGK0/HLpYox5
BjGZL0Ty0SYwT1pmJkb4p9lTJ2KuxV2KuxV2KuxV2KuxVCajZNdxcFYL7nfJRNIIYdq/5c3t7yMV
5GpPQMrU+8VzIjqAOjVLHby/zl+VnnKxhkuEtPrsC1LPaH1CB48KB/wzMxamB6042TDIKv5ZedvM
U2gX3le6g+s2pZbfT7mVqGNpGCmGjfaA24/yn6Mo10IggjmWzSykQQeSL/Mjz5qXlby5B5S02GSz
1C4eVNQ1BTsFFDSNhvykVh4UX57DRYRIknp0TqspiKHVj/kn8tPOOrQR3MVkbe1fdbi5PpKw8VB+
Mj3C5l5tRCO1tGPFIvV9H/LHUbMKZr2HkOoRWI+88cwZ6kHo5ccRDNNK0t7JeLSB/cCmY8pW2gUm
OQS7FXYq7FXYq7FXYq7FVG9vbeytnuLhuMaUrQEkkmgVQNySdgMVQAv9ekHOLTESM9FmuAshHuqo
4H34qtfX5Lb/AI6VhPaJ3nQCeIfNo6sPpXFULrvnHT7G2QWLrfXtwP8ARoYjzrXozce3t1xV5/59
/K/X9a8oXWpRXTw+ZUl/SC28dFSQxDkImoPt7VXtUAe+ZWkyiE/Vy5NGoxmUdkB+Vn5e+ZLrQn83
6/ILzW9UuRqlrp92itEK1+NlYfC8imq0oFFPos1mWIlww24dmvTYzw3Lru9e0vXbO/t3dj9Wng2u
raUhXiYdeVe3gcwXLS2/8/aHbyGG2Ml9MNuNutR/wRoPuriqDH5gXI+KTQ7tYf56Hp9KgfjirI9I
1iw1a1+s2b8kB4urCjIw/ZYeOKo3FXYq7FXYq7FXYq7FUv1zS31KwMEUpguEdZbeYb8ZIzyU4qka
6h+YcA9OTTba5I2EyuFB9yOY/UMVU5LT8wdTPCeeDS4D9r0TV6exBY/8MMVVYfI66YiXekXDfpWG
p9SejJKD9pGX9mviN8VUfMf5maP5e8s3mq6r/ot9aVi/RzGsj3BUlEj/AJlbry6U3y3DhOSVBry5
BCNlLPy4/ODRPM3k5dUvJlh1WyVY9Us1FG9U7K0a91kpUeG47ZZqtOccvLowwZhOPmrxaDf+brs6
rqI+o2BXhaxIB6rL2JJHT5/RmM3p5pmn6roqC3hsra7txsJoKQTH3dWqrH/ZYqmJ1S56DTbkyfyn
0gP+C9SmKrNH0+aCa8vbhUiuL51Z4YzVUVF4qK7cm7scVTPFXYq7FXYq7FXYq7FXYqpXF1Dbrylb
ivjQn9WEC1tKL3zr5cswTNcmo/ZWNyf1ZYMMiwMwGD+Z/wA9rCxiddIsHuZxsJLgiOMe/FSzH8My
ceiJ5lpnqAOTzfQ281fmZrmoXOt2yX2kWaJPcUHpJEYW5JFAQPtOvKoJ6dTl+aMcIBjtL72nGTlJ
EvpVvOcK+XjeeZvLelfV7TVdQ+O5dVaONgOfHh0Acgmn2dz7ZTg/fECZ2iGzL+6FxG5LNPKX5+rc
wpFrmncJBQGezPwnt/dudvobDk0VfSVx6m+b0Gw8/eWL0AxXLKT+y8bg/gCMxJYJByBkBTm2v7W6
3gfmPGhH68rMSGQKIwJdirsVdirsVdirsVdirsVSzXv95snDmxk8n8zdWzPxuPNJ9E/KvXPMt2r3
CPYaXWslzItHYeESHqT49MnPUxgO8tccJl7npeuaZp3lnyvbeXdChFuL6UQgDd3rQSO7dWZtgTmt
nkMjZcyMBEUExsNE08R3/la/hW701kWaCKYcg0Umzj/YyrX2rkYyINhJAIovK/M/5OanoV291oiv
faSx5CMfFPCOvFgN3UfzD6c2ePVCQqWxcOWAx5cl3l1SrhWBDA0IOxGORlB615Z/ux8swMjkxT/K
mTsVdirsVdirsVdirsVdiqjdWcVynCSvH2NMINIIQlv5e0eCQSrao0o3EjjmwPtyrT6MkchK8ITH
IJYf5h/eeetCif8Au0VpF/1qsf8AjQYqn10oGv2Dj7bQ3CN/q1jb9YxVMsVQN5oWk3j+pcWqNL/v
0Di//BLQ5ITIQYhUs9NtrT+55AeBNcTIlQEVkUuxV2KuxV2KuxV2KuxV2KuxV2KuxVI/Meh3F7NZ
6hYsq6jYPziD7I6k1KMR0xVEafa38t6dR1BEhlEfo29tG3MIrEM7M1BVmKjoNgMVTTFXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqh9QsYb+yns5ywhuEM
chjYo3FtjRl3H0YYmjaCLFPMvLESwr52v4HuEvNMvruTRmczMBALRFjCJJVXjMvOgp1zMyfwjvAv
5uND+I9x2U7rzr56j0m7nZzFdR+X7K+tUSES+pfTSMJQR6S0agA9IV41wjFCx/WI+CDknX+a9E8t
Xk93ppknm9eVZZEMm1KBvhoypCrfDTcL7ZiZBRciBsPMtVu520rzPa6xPNb+e2vbo+WI43dJ5FFD
p/1IAgPF09Tjt9rnmZEbxI+it/0240jsb+vp+imUw635mXW9Q0q+uHiufV006esduCrwyIhvSjlC
rKrepUk/DT76TCNAjz/Y2iUrIPl+1IG86ebx5b1i7W7ZtRguJY7CP0FJaJNQ9FW9MQinK3o1SW5f
aFKZb4MOIDp+xr8SXCT1/aml95m82wKtzp7nVIbe0nkvrGONTcOBMyLNbSenEjvEtD6ZWjjpv1gM
cDsdt/xbMzl03TG5sdUstKvPMdpfMms6haWKOLkP9XV4yAzNGocRs4cqWCUXYkGhyAkCREjYEsiC
BxDnsnvlTUrrU/Lthf3cUsFzcRcpIp1VJAakfEFovyIG432yrJECRAZ4zYBKbZBm7FXYq7FXYqlX
mfzLpXlrRbjWNUZ1s7bjz9NDI55MFHFBuetT7b5PHjM5UObCcxEWUamo2Di3pcR1u152qlgDIvHl
VATVvh32yPCWVhamq6W5IS8gYrGZmpIhpEDxLmh+zUUr0w8J7l4g0dY0kPwN7bhwyx8fVSvOQVRa
V6sNwO+PCe5eINPrOkIwR763VjyAUyoDVDR+p/ZOx8MeA9y8QXRarpc1y1rDeQyXKEq8CSIzgruw
Kg1qK74DEjel4ggNZtPKet6eW1Q2t1ZWbiYTtIoEEibrIsqkGNh/MGGTgZROzGQjIbo6XVNKtJY7
We8hhmZQY4pZVDsteINGPI1O1fHIiJO9MuIBeNR08uUF1CXWUQMvqLUSkVEZFft0349cHCVsJfrf
mey0e80+zmguJ7jU3kis0gQPyeKNpWUksoB4Ix+jJwxmQJ7mMpgEDvW6T5z8sarYW19a6hCIbpWa
JJmEUnwOYnBjfiwKyAoduuMsUomiFjkiRdpi+qaYjyI93CrwsqSqZFBRnFVVhXYkdK5DhPcy4gpj
XNFKowv7YrLy9IiaOjcDxfjvvxOx8MPAe5HEO9XjvbOWd4Ip43nj/vIlZSy023ANR1wUU2FbAl2K
uxVIPMnluXXL2xW4ZG0i2ErzWweWOSSaSMxIecZX4VR2BHfl7ZbjycIPe1zhxHyY9YflrfN5d0fR
dXvkn/QscsdlqFuHjuYSChtZImJajwhONejDqNyMtOoHEZAc/wAFrGE8IB6Lrr8srq7sIVl1BItZ
s7KO3s9agj4SrMDKZi0f2GhmE1Hi6fTQhGoAPLa+SnDY5796vffl7cXkXmFWuo4ptUks7nTLhEJe
1urCGNIZTU/FSSENt2qMAz1w+V38UnDd+f6G9T8hX099o9zbXMY/Rlpd28xYyxvNNetE8krNERsX
i5Fe/LBHMKI7yPsWWI2PJZZeQdWtPNMuvC9hkEl/PefUmVvSCXNtHbMy9xMoh2boVYqR3wnMDHhr
p+lRiIlfmp2n5bXEWjXGhvcoui3c6SS6fEXKRwpH8UUDS+oyI81H9M1VR8I64TqN+LqgYdq6IDUP
yt1/UrfTFvNWge407TVsHcxMyXTRXMU6/WEJ+KNxbhXUGtTUHtko6mIuhzNoOAmrPIMmg8pyr50/
xJIYVWWySG4tU50N2hIFyK0UsI2MYYjlxyk5fRw+bYMfq4nebfKlzrup6FcrLGlvpNxJcTxMZVaQ
SwPBxV4mUrQSE/hjiy8II71yY+IjySXzJ+Vi6hPCmkzQaVp1tpz2ENpHGShLXMdzxkQUDROYuLrU
E8ia1yzHqa57m7YTwXy2FIm/8meZLhtfmtb+3sbnXZLRnmjR2eGOCAQTCJz0d1B4PT4a9K4I5Yir
F8NpOOW+/NTm/L69Emi/Uvqlja6Nb3drBaW5njHC59MD41IY09KrV+0TviM43uzdL4R2romuieU5
9N8z6hq0cyRWt+rmezhMnpyTvIrC4KOWWOTgvF+Gz9TuMhPLcQO5lHHUiWTZS2uxV2KuxV2KuxV2
KuxV2KuqMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqVeaHtU0K6e6s59QgVQWsbZJJJJjU
UThECxUn7W1Kddsnjvi2NMJ8nlbaB5nXRre30+O/lgh024XTfUhnhaHUX1GOUcElAkjRIm4RM9P3
anM3jje9c/spxeGVbXy+21bUdO/MWCPUbjTo7kasU10T3CK3xrLeQfUDET8LslvzMIH2aEYxljNA
8vT9xv7eaSJ71z9X37PQPIo1KPTLq0vbb0I7O8lgsZTG8TXFuoUrO6SEtyZmYEn7VK98xc1XY7nI
xXVFkeUtjsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdirsVdirsVdir//Z

------=_NextPart_000_0000_01C9EA81.8633EB00
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://nrich.maths.org/javascript/jquery.js

(function(){=0A=
/*=0A=
 * jQuery 1.2.3 - New Wave Javascript=0A=
 *=0A=
 * Copyright (c) 2008 John Resig (jquery.com)=0A=
 * Dual licensed under the MIT (MIT-LICENSE.txt)=0A=
 * and GPL (GPL-LICENSE.txt) licenses.=0A=
 *=0A=
 * $Date: 2008/06/09 08:59:32 $=0A=
 * $Rev: 4663 $=0A=
 */=0A=
=0A=
// Map over jQuery in case of overwrite=0A=
if ( window.jQuery )=0A=
	var _jQuery =3D window.jQuery;=0A=
=0A=
var jQuery =3D window.jQuery =3D function( selector, context ) {=0A=
	// The jQuery object is actually just the init constructor 'enhanced'=0A=
	return new jQuery.prototype.init( selector, context );=0A=
};=0A=
=0A=
// Map over the $ in case of overwrite=0A=
if ( window.$ )=0A=
	var _$ =3D window.$;=0A=
	=0A=
// Map the jQuery namespace to the '$' one=0A=
window.$ =3D jQuery;=0A=
=0A=
// A simple way to check for HTML strings or ID strings=0A=
// (both of which we optimize for)=0A=
var quickExpr =3D /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;=0A=
=0A=
// Is it a simple selector=0A=
var isSimple =3D /^.[^:#\[\.]*$/;=0A=
=0A=
jQuery.fn =3D jQuery.prototype =3D {=0A=
	init: function( selector, context ) {=0A=
		// Make sure that a selection was provided=0A=
		selector =3D selector || document;=0A=
=0A=
		// Handle $(DOMElement)=0A=
		if ( selector.nodeType ) {=0A=
			this[0] =3D selector;=0A=
			this.length =3D 1;=0A=
			return this;=0A=
=0A=
		// Handle HTML strings=0A=
		} else if ( typeof selector =3D=3D "string" ) {=0A=
			// Are we dealing with HTML string or an ID?=0A=
			var match =3D quickExpr.exec( selector );=0A=
=0A=
			// Verify a match, and that no context was specified for #id=0A=
			if ( match && (match[1] || !context) ) {=0A=
=0A=
				// HANDLE: $(html) -> $(array)=0A=
				if ( match[1] )=0A=
					selector =3D jQuery.clean( [ match[1] ], context );=0A=
=0A=
				// HANDLE: $("#id")=0A=
				else {=0A=
					var elem =3D document.getElementById( match[3] );=0A=
=0A=
					// Make sure an element was located=0A=
					if ( elem )=0A=
						// Handle the case where IE and Opera return items=0A=
						// by name instead of ID=0A=
						if ( elem.id !=3D match[3] )=0A=
							return jQuery().find( selector );=0A=
=0A=
						// Otherwise, we inject the element directly into the jQuery object=0A=
						else {=0A=
							this[0] =3D elem;=0A=
							this.length =3D 1;=0A=
							return this;=0A=
						}=0A=
=0A=
					else=0A=
						selector =3D [];=0A=
				}=0A=
=0A=
			// HANDLE: $(expr, [context])=0A=
			// (which is just equivalent to: $(content).find(expr)=0A=
			} else=0A=
				return new jQuery( context ).find( selector );=0A=
=0A=
		// HANDLE: $(function)=0A=
		// Shortcut for document ready=0A=
		} else if ( jQuery.isFunction( selector ) )=0A=
			return new jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( =
selector );=0A=
=0A=
		return this.setArray(=0A=
			// HANDLE: $(array)=0A=
			selector.constructor =3D=3D Array && selector ||=0A=
=0A=
			// HANDLE: $(arraylike)=0A=
			// Watch for when an array-like object, contains DOM nodes, is passed =
in as the selector=0A=
			(selector.jquery || selector.length && selector !=3D window && =
!selector.nodeType && selector[0] !=3D undefined && =
selector[0].nodeType) && jQuery.makeArray( selector ) ||=0A=
=0A=
			// HANDLE: $(*)=0A=
			[ selector ] );=0A=
	},=0A=
	=0A=
	// The current version of jQuery being used=0A=
	jquery: "1.2.3",=0A=
=0A=
	// The number of elements contained in the matched element set=0A=
	size: function() {=0A=
		return this.length;=0A=
	},=0A=
	=0A=
	// The number of elements contained in the matched element set=0A=
	length: 0,=0A=
=0A=
	// Get the Nth element in the matched element set OR=0A=
	// Get the whole matched element set as a clean array=0A=
	get: function( num ) {=0A=
		return num =3D=3D undefined ?=0A=
=0A=
			// Return a 'clean' array=0A=
			jQuery.makeArray( this ) :=0A=
=0A=
			// Return just the object=0A=
			this[ num ];=0A=
	},=0A=
	=0A=
	// Take an array of elements and push it onto the stack=0A=
	// (returning the new matched element set)=0A=
	pushStack: function( elems ) {=0A=
		// Build a new jQuery matched element set=0A=
		var ret =3D jQuery( elems );=0A=
=0A=
		// Add the old object onto the stack (as a reference)=0A=
		ret.prevObject =3D this;=0A=
=0A=
		// Return the newly-formed element set=0A=
		return ret;=0A=
	},=0A=
	=0A=
	// Force the current matched set of elements to become=0A=
	// the specified array of elements (destroying the stack in the process)=0A=
	// You should use pushStack() in order to do this, but maintain the =
stack=0A=
	setArray: function( elems ) {=0A=
		// Resetting the length to 0, then using the native Array push=0A=
		// is a super-fast way to populate an object with array-like properties=0A=
		this.length =3D 0;=0A=
		Array.prototype.push.apply( this, elems );=0A=
		=0A=
		return this;=0A=
	},=0A=
=0A=
	// Execute a callback for every element in the matched set.=0A=
	// (You can seed the arguments with an array of args, but this is=0A=
	// only used internally.)=0A=
	each: function( callback, args ) {=0A=
		return jQuery.each( this, callback, args );=0A=
	},=0A=
=0A=
	// Determine the position of an element within =0A=
	// the matched set of elements=0A=
	index: function( elem ) {=0A=
		var ret =3D -1;=0A=
=0A=
		// Locate the position of the desired element=0A=
		this.each(function(i){=0A=
			if ( this =3D=3D elem )=0A=
				ret =3D i;=0A=
		});=0A=
=0A=
		return ret;=0A=
	},=0A=
=0A=
	attr: function( name, value, type ) {=0A=
		var options =3D name;=0A=
		=0A=
		// Look for the case where we're accessing a style value=0A=
		if ( name.constructor =3D=3D String )=0A=
			if ( value =3D=3D undefined )=0A=
				return this.length && jQuery[ type || "attr" ]( this[0], name ) || =
undefined;=0A=
=0A=
			else {=0A=
				options =3D {};=0A=
				options[ name ] =3D value;=0A=
			}=0A=
		=0A=
		// Check to see if we're setting style values=0A=
		return this.each(function(i){=0A=
			// Set all the styles=0A=
			for ( name in options )=0A=
				jQuery.attr(=0A=
					type ?=0A=
						this.style :=0A=
						this,=0A=
					name, jQuery.prop( this, options[ name ], type, i, name )=0A=
				);=0A=
		});=0A=
	},=0A=
=0A=
	css: function( key, value ) {=0A=
		// ignore negative width and height values=0A=
		if ( (key =3D=3D 'width' || key =3D=3D 'height') && parseFloat(value) =
< 0 )=0A=
			value =3D undefined;=0A=
		return this.attr( key, value, "curCSS" );=0A=
	},=0A=
=0A=
	text: function( text ) {=0A=
		if ( typeof text !=3D "object" && text !=3D null )=0A=
			return this.empty().append( (this[0] && this[0].ownerDocument || =
document).createTextNode( text ) );=0A=
=0A=
		var ret =3D "";=0A=
=0A=
		jQuery.each( text || this, function(){=0A=
			jQuery.each( this.childNodes, function(){=0A=
				if ( this.nodeType !=3D 8 )=0A=
					ret +=3D this.nodeType !=3D 1 ?=0A=
						this.nodeValue :=0A=
						jQuery.fn.text( [ this ] );=0A=
			});=0A=
		});=0A=
=0A=
		return ret;=0A=
	},=0A=
=0A=
	wrapAll: function( html ) {=0A=
		if ( this[0] )=0A=
			// The elements to wrap the target around=0A=
			jQuery( html, this[0].ownerDocument )=0A=
				.clone()=0A=
				.insertBefore( this[0] )=0A=
				.map(function(){=0A=
					var elem =3D this;=0A=
=0A=
					while ( elem.firstChild )=0A=
						elem =3D elem.firstChild;=0A=
=0A=
					return elem;=0A=
				})=0A=
				.append(this);=0A=
=0A=
		return this;=0A=
	},=0A=
=0A=
	wrapInner: function( html ) {=0A=
		return this.each(function(){=0A=
			jQuery( this ).contents().wrapAll( html );=0A=
		});=0A=
	},=0A=
=0A=
	wrap: function( html ) {=0A=
		return this.each(function(){=0A=
			jQuery( this ).wrapAll( html );=0A=
		});=0A=
	},=0A=
=0A=
	append: function() {=0A=
		return this.domManip(arguments, true, false, function(elem){=0A=
			if (this.nodeType =3D=3D 1)=0A=
				this.appendChild( elem );=0A=
		});=0A=
	},=0A=
=0A=
	prepend: function() {=0A=
		return this.domManip(arguments, true, true, function(elem){=0A=
			if (this.nodeType =3D=3D 1)=0A=
				this.insertBefore( elem, this.firstChild );=0A=
		});=0A=
	},=0A=
	=0A=
	before: function() {=0A=
		return this.domManip(arguments, false, false, function(elem){=0A=
			this.parentNode.insertBefore( elem, this );=0A=
		});=0A=
	},=0A=
=0A=
	after: function() {=0A=
		return this.domManip(arguments, false, true, function(elem){=0A=
			this.parentNode.insertBefore( elem, this.nextSibling );=0A=
		});=0A=
	},=0A=
=0A=
	end: function() {=0A=
		return this.prevObject || jQuery( [] );=0A=
	},=0A=
=0A=
	find: function( selector ) {=0A=
		var elems =3D jQuery.map(this, function(elem){=0A=
			return jQuery.find( selector, elem );=0A=
		});=0A=
=0A=
		return this.pushStack( /[^+>] [^+>]/.test( selector ) || =
selector.indexOf("..") > -1 ?=0A=
			jQuery.unique( elems ) :=0A=
			elems );=0A=
	},=0A=
=0A=
	clone: function( events ) {=0A=
		// Do the clone=0A=
		var ret =3D this.map(function(){=0A=
			if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {=0A=
				// IE copies events bound via attachEvent when=0A=
				// using cloneNode. Calling detachEvent on the=0A=
				// clone will also remove the events from the orignal=0A=
				// In order to get around this, we use innerHTML.=0A=
				// Unfortunately, this means some modifications to =0A=
				// attributes in IE that are actually only stored =0A=
				// as properties will not be copied (such as the=0A=
				// the name attribute on an input).=0A=
				var clone =3D this.cloneNode(true),=0A=
					container =3D document.createElement("div");=0A=
				container.appendChild(clone);=0A=
				return jQuery.clean([container.innerHTML])[0];=0A=
			} else=0A=
				return this.cloneNode(true);=0A=
		});=0A=
=0A=
		// Need to set the expando to null on the cloned set if it exists=0A=
		// removeData doesn't work here, IE removes it from the original as =
well=0A=
		// this is primarily for IE but the data expando shouldn't be copied =
over in any browser=0A=
		var clone =3D ret.find("*").andSelf().each(function(){=0A=
			if ( this[ expando ] !=3D undefined )=0A=
				this[ expando ] =3D null;=0A=
		});=0A=
		=0A=
		// Copy the events from the original to the clone=0A=
		if ( events =3D=3D=3D true )=0A=
			this.find("*").andSelf().each(function(i){=0A=
				if (this.nodeType =3D=3D 3)=0A=
					return;=0A=
				var events =3D jQuery.data( this, "events" );=0A=
=0A=
				for ( var type in events )=0A=
					for ( var handler in events[ type ] )=0A=
						jQuery.event.add( clone[ i ], type, events[ type ][ handler ], =
events[ type ][ handler ].data );=0A=
			});=0A=
=0A=
		// Return the cloned set=0A=
		return ret;=0A=
	},=0A=
=0A=
	filter: function( selector ) {=0A=
		return this.pushStack(=0A=
			jQuery.isFunction( selector ) &&=0A=
			jQuery.grep(this, function(elem, i){=0A=
				return selector.call( elem, i );=0A=
			}) ||=0A=
=0A=
			jQuery.multiFilter( selector, this ) );=0A=
	},=0A=
=0A=
	not: function( selector ) {=0A=
		if ( selector.constructor =3D=3D String )=0A=
			// test special case where just one selector is passed in=0A=
			if ( isSimple.test( selector ) )=0A=
				return this.pushStack( jQuery.multiFilter( selector, this, true ) );=0A=
			else=0A=
				selector =3D jQuery.multiFilter( selector, this );=0A=
=0A=
		var isArrayLike =3D selector.length && selector[selector.length - 1] =
!=3D=3D undefined && !selector.nodeType;=0A=
		return this.filter(function() {=0A=
			return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this !=3D =
selector;=0A=
		});=0A=
	},=0A=
=0A=
	add: function( selector ) {=0A=
		return !selector ? this : this.pushStack( jQuery.merge( =0A=
			this.get(),=0A=
			selector.constructor =3D=3D String ? =0A=
				jQuery( selector ).get() :=0A=
				selector.length !=3D undefined && (!selector.nodeName || =
jQuery.nodeName(selector, "form")) ?=0A=
					selector : [selector] ) );=0A=
	},=0A=
=0A=
	is: function( selector ) {=0A=
		return selector ?=0A=
			jQuery.multiFilter( selector, this ).length > 0 :=0A=
			false;=0A=
	},=0A=
=0A=
	hasClass: function( selector ) {=0A=
		return this.is( "." + selector );=0A=
	},=0A=
	=0A=
	val: function( value ) {=0A=
		if ( value =3D=3D undefined ) {=0A=
=0A=
			if ( this.length ) {=0A=
				var elem =3D this[0];=0A=
=0A=
				// We need to handle select boxes special=0A=
				if ( jQuery.nodeName( elem, "select" ) ) {=0A=
					var index =3D elem.selectedIndex,=0A=
						values =3D [],=0A=
						options =3D elem.options,=0A=
						one =3D elem.type =3D=3D "select-one";=0A=
					=0A=
					// Nothing was selected=0A=
					if ( index < 0 )=0A=
						return null;=0A=
=0A=
					// Loop through all the selected options=0A=
					for ( var i =3D one ? index : 0, max =3D one ? index + 1 : =
options.length; i < max; i++ ) {=0A=
						var option =3D options[ i ];=0A=
=0A=
						if ( option.selected ) {=0A=
							// Get the specifc value for the option=0A=
							value =3D jQuery.browser.msie && =
!option.attributes.value.specified ? option.text : option.value;=0A=
							=0A=
							// We don't need an array for one selects=0A=
							if ( one )=0A=
								return value;=0A=
							=0A=
							// Multi-Selects return an array=0A=
							values.push( value );=0A=
						}=0A=
					}=0A=
					=0A=
					return values;=0A=
					=0A=
				// Everything else, we just grab the value=0A=
				} else=0A=
					return (this[0].value || "").replace(/\r/g, "");=0A=
=0A=
			}=0A=
=0A=
			return undefined;=0A=
		}=0A=
=0A=
		return this.each(function(){=0A=
			if ( this.nodeType !=3D 1 )=0A=
				return;=0A=
=0A=
			if ( value.constructor =3D=3D Array && /radio|checkbox/.test( =
this.type ) )=0A=
				this.checked =3D (jQuery.inArray(this.value, value) >=3D 0 ||=0A=
					jQuery.inArray(this.name, value) >=3D 0);=0A=
=0A=
			else if ( jQuery.nodeName( this, "select" ) ) {=0A=
				var values =3D value.constructor =3D=3D Array ?=0A=
					value :=0A=
					[ value ];=0A=
=0A=
				jQuery( "option", this ).each(function(){=0A=
					this.selected =3D (jQuery.inArray( this.value, values ) >=3D 0 ||=0A=
						jQuery.inArray( this.text, values ) >=3D 0);=0A=
				});=0A=
=0A=
				if ( !values.length )=0A=
					this.selectedIndex =3D -1;=0A=
=0A=
			} else=0A=
				this.value =3D value;=0A=
		});=0A=
	},=0A=
	=0A=
	html: function( value ) {=0A=
		return value =3D=3D undefined ?=0A=
			(this.length ?=0A=
				this[0].innerHTML :=0A=
				null) :=0A=
			this.empty().append( value );=0A=
	},=0A=
=0A=
	replaceWith: function( value ) {=0A=
		return this.after( value ).remove();=0A=
	},=0A=
=0A=
	eq: function( i ) {=0A=
		return this.slice( i, i + 1 );=0A=
	},=0A=
=0A=
	slice: function() {=0A=
		return this.pushStack( Array.prototype.slice.apply( this, arguments ) =
);=0A=
	},=0A=
=0A=
	map: function( callback ) {=0A=
		return this.pushStack( jQuery.map(this, function(elem, i){=0A=
			return callback.call( elem, i, elem );=0A=
		}));=0A=
	},=0A=
=0A=
	andSelf: function() {=0A=
		return this.add( this.prevObject );=0A=
	},=0A=
=0A=
	data: function( key, value ){=0A=
		var parts =3D key.split(".");=0A=
		parts[1] =3D parts[1] ? "." + parts[1] : "";=0A=
=0A=
		if ( value =3D=3D null ) {=0A=
			var data =3D this.triggerHandler("getData" + parts[1] + "!", =
[parts[0]]);=0A=
			=0A=
			if ( data =3D=3D undefined && this.length )=0A=
				data =3D jQuery.data( this[0], key );=0A=
=0A=
			return data =3D=3D null && parts[1] ?=0A=
				this.data( parts[0] ) :=0A=
				data;=0A=
		} else=0A=
			return this.trigger("setData" + parts[1] + "!", [parts[0], =
value]).each(function(){=0A=
				jQuery.data( this, key, value );=0A=
			});=0A=
	},=0A=
=0A=
	removeData: function( key ){=0A=
		return this.each(function(){=0A=
			jQuery.removeData( this, key );=0A=
		});=0A=
	},=0A=
	=0A=
	domManip: function( args, table, reverse, callback ) {=0A=
		var clone =3D this.length > 1, elems; =0A=
=0A=
		return this.each(function(){=0A=
			if ( !elems ) {=0A=
				elems =3D jQuery.clean( args, this.ownerDocument );=0A=
=0A=
				if ( reverse )=0A=
					elems.reverse();=0A=
			}=0A=
=0A=
			var obj =3D this;=0A=
=0A=
			if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( =
elems[0], "tr" ) )=0A=
				obj =3D this.getElementsByTagName("tbody")[0] || this.appendChild( =
this.ownerDocument.createElement("tbody") );=0A=
=0A=
			var scripts =3D jQuery( [] );=0A=
=0A=
			jQuery.each(elems, function(){=0A=
				var elem =3D clone ?=0A=
					jQuery( this ).clone( true )[0] :=0A=
					this;=0A=
=0A=
				// execute all scripts after the elements have been injected=0A=
				if ( jQuery.nodeName( elem, "script" ) ) {=0A=
					scripts =3D scripts.add( elem );=0A=
				} else {=0A=
					// Remove any inner scripts for later evaluation=0A=
					if ( elem.nodeType =3D=3D 1 )=0A=
						scripts =3D scripts.add( jQuery( "script", elem ).remove() );=0A=
=0A=
					// Inject the elements into the document=0A=
					callback.call( obj, elem );=0A=
				}=0A=
			});=0A=
=0A=
			scripts.each( evalScript );=0A=
		});=0A=
	}=0A=
};=0A=
=0A=
// Give the init function the jQuery prototype for later instantiation=0A=
jQuery.prototype.init.prototype =3D jQuery.prototype;=0A=
=0A=
function evalScript( i, elem ) {=0A=
	if ( elem.src )=0A=
		jQuery.ajax({=0A=
			url: elem.src,=0A=
			async: false,=0A=
			dataType: "script"=0A=
		});=0A=
=0A=
	else=0A=
		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || =
"" );=0A=
=0A=
	if ( elem.parentNode )=0A=
		elem.parentNode.removeChild( elem );=0A=
}=0A=
=0A=
jQuery.extend =3D jQuery.fn.extend =3D function() {=0A=
	// copy reference to target object=0A=
	var target =3D arguments[0] || {}, i =3D 1, length =3D =
arguments.length, deep =3D false, options;=0A=
=0A=
	// Handle a deep copy situation=0A=
	if ( target.constructor =3D=3D Boolean ) {=0A=
		deep =3D target;=0A=
		target =3D arguments[1] || {};=0A=
		// skip the boolean and the target=0A=
		i =3D 2;=0A=
	}=0A=
=0A=
	// Handle case when target is a string or something (possible in deep =
copy)=0A=
	if ( typeof target !=3D "object" && typeof target !=3D "function" )=0A=
		target =3D {};=0A=
=0A=
	// extend jQuery itself if only one argument is passed=0A=
	if ( length =3D=3D 1 ) {=0A=
		target =3D this;=0A=
		i =3D 0;=0A=
	}=0A=
=0A=
	for ( ; i < length; i++ )=0A=
		// Only deal with non-null/undefined values=0A=
		if ( (options =3D arguments[ i ]) !=3D null )=0A=
			// Extend the base object=0A=
			for ( var name in options ) {=0A=
				// Prevent never-ending loop=0A=
				if ( target =3D=3D=3D options[ name ] )=0A=
					continue;=0A=
=0A=
				// Recurse if we're merging object values=0A=
				if ( deep && options[ name ] && typeof options[ name ] =3D=3D =
"object" && target[ name ] && !options[ name ].nodeType )=0A=
					target[ name ] =3D jQuery.extend( target[ name ], options[ name ] );=0A=
=0A=
				// Don't bring in undefined values=0A=
				else if ( options[ name ] !=3D undefined )=0A=
					target[ name ] =3D options[ name ];=0A=
=0A=
			}=0A=
=0A=
	// Return the modified object=0A=
	return target;=0A=
};=0A=
=0A=
var expando =3D "jQuery" + (new Date()).getTime(), uuid =3D 0, =
windowData =3D {};=0A=
=0A=
// exclude the following css properties to add px=0A=
var exclude =3D /z-?index|font-?weight|opacity|zoom|line-?height/i;=0A=
=0A=
jQuery.extend({=0A=
	noConflict: function( deep ) {=0A=
		window.$ =3D _$;=0A=
=0A=
		if ( deep )=0A=
			window.jQuery =3D _jQuery;=0A=
=0A=
		return jQuery;=0A=
	},=0A=
=0A=
	// See test/unit/core.js for details concerning this function.=0A=
	isFunction: function( fn ) {=0A=
		return !!fn && typeof fn !=3D "string" && !fn.nodeName && =0A=
			fn.constructor !=3D Array && /function/i.test( fn + "" );=0A=
	},=0A=
	=0A=
	// check if an element is in a (or is an) XML document=0A=
	isXMLDoc: function( elem ) {=0A=
		return elem.documentElement && !elem.body ||=0A=
			elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;=0A=
	},=0A=
=0A=
	// Evalulates a script in a global context=0A=
	globalEval: function( data ) {=0A=
		data =3D jQuery.trim( data );=0A=
=0A=
		if ( data ) {=0A=
			// Inspired by code by Andrea Giammarchi=0A=
			// =
http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom=
.html=0A=
			var head =3D document.getElementsByTagName("head")[0] || =
document.documentElement,=0A=
				script =3D document.createElement("script");=0A=
=0A=
			script.type =3D "text/javascript";=0A=
			if ( jQuery.browser.msie )=0A=
				script.text =3D data;=0A=
			else=0A=
				script.appendChild( document.createTextNode( data ) );=0A=
=0A=
			head.appendChild( script );=0A=
			head.removeChild( script );=0A=
		}=0A=
	},=0A=
=0A=
	nodeName: function( elem, name ) {=0A=
		return elem.nodeName && elem.nodeName.toUpperCase() =3D=3D =
name.toUpperCase();=0A=
	},=0A=
	=0A=
	cache: {},=0A=
	=0A=
	data: function( elem, name, data ) {=0A=
		elem =3D elem =3D=3D window ?=0A=
			windowData :=0A=
			elem;=0A=
=0A=
		var id =3D elem[ expando ];=0A=
=0A=
		// Compute a unique ID for the element=0A=
		if ( !id ) =0A=
			id =3D elem[ expando ] =3D ++uuid;=0A=
=0A=
		// Only generate the data cache if we're=0A=
		// trying to access or manipulate it=0A=
		if ( name && !jQuery.cache[ id ] )=0A=
			jQuery.cache[ id ] =3D {};=0A=
		=0A=
		// Prevent overriding the named cache with undefined values=0A=
		if ( data !=3D undefined )=0A=
			jQuery.cache[ id ][ name ] =3D data;=0A=
		=0A=
		// Return the named cache data, or the ID for the element	=0A=
		return name ?=0A=
			jQuery.cache[ id ][ name ] :=0A=
			id;=0A=
	},=0A=
	=0A=
	removeData: function( elem, name ) {=0A=
		elem =3D elem =3D=3D window ?=0A=
			windowData :=0A=
			elem;=0A=
=0A=
		var id =3D elem[ expando ];=0A=
=0A=
		// If we want to remove a specific section of the element's data=0A=
		if ( name ) {=0A=
			if ( jQuery.cache[ id ] ) {=0A=
				// Remove the section of cache data=0A=
				delete jQuery.cache[ id ][ name ];=0A=
=0A=
				// If we've removed all the data, remove the element's cache=0A=
				name =3D "";=0A=
=0A=
				for ( name in jQuery.cache[ id ] )=0A=
					break;=0A=
=0A=
				if ( !name )=0A=
					jQuery.removeData( elem );=0A=
			}=0A=
=0A=
		// Otherwise, we want to remove all of the element's data=0A=
		} else {=0A=
			// Clean up the element expando=0A=
			try {=0A=
				delete elem[ expando ];=0A=
			} catch(e){=0A=
				// IE has trouble directly removing the expando=0A=
				// but it's ok with using removeAttribute=0A=
				if ( elem.removeAttribute )=0A=
					elem.removeAttribute( expando );=0A=
			}=0A=
=0A=
			// Completely remove the data cache=0A=
			delete jQuery.cache[ id ];=0A=
		}=0A=
	},=0A=
=0A=
	// args is for internal usage only=0A=
	each: function( object, callback, args ) {=0A=
		if ( args ) {=0A=
			if ( object.length =3D=3D undefined ) {=0A=
				for ( var name in object )=0A=
					if ( callback.apply( object[ name ], args ) =3D=3D=3D false )=0A=
						break;=0A=
			} else=0A=
				for ( var i =3D 0, length =3D object.length; i < length; i++ )=0A=
					if ( callback.apply( object[ i ], args ) =3D=3D=3D false )=0A=
						break;=0A=
=0A=
		// A special, fast, case for the most common use of each=0A=
		} else {=0A=
			if ( object.length =3D=3D undefined ) {=0A=
				for ( var name in object )=0A=
					if ( callback.call( object[ name ], name, object[ name ] ) =
=3D=3D=3D false )=0A=
						break;=0A=
			} else=0A=
				for ( var i =3D 0, length =3D object.length, value =3D object[0]; =0A=
					i < length && callback.call( value, i, value ) !=3D=3D false; value =
=3D object[++i] ){}=0A=
		}=0A=
=0A=
		return object;=0A=
	},=0A=
	=0A=
	prop: function( elem, value, type, i, name ) {=0A=
			// Handle executable functions=0A=
			if ( jQuery.isFunction( value ) )=0A=
				value =3D value.call( elem, i );=0A=
				=0A=
			// Handle passing in a number to a CSS property=0A=
			return value && value.constructor =3D=3D Number && type =3D=3D =
"curCSS" && !exclude.test( name ) ?=0A=
				value + "px" :=0A=
				value;=0A=
	},=0A=
=0A=
	className: {=0A=
		// internal only, use addClass("class")=0A=
		add: function( elem, classNames ) {=0A=
			jQuery.each((classNames || "").split(/\s+/), function(i, className){=0A=
				if ( elem.nodeType =3D=3D 1 && !jQuery.className.has( =
elem.className, className ) )=0A=
					elem.className +=3D (elem.className ? " " : "") + className;=0A=
			});=0A=
		},=0A=
=0A=
		// internal only, use removeClass("class")=0A=
		remove: function( elem, classNames ) {=0A=
			if (elem.nodeType =3D=3D 1)=0A=
				elem.className =3D classNames !=3D undefined ?=0A=
					jQuery.grep(elem.className.split(/\s+/), function(className){=0A=
						return !jQuery.className.has( classNames, className );	=0A=
					}).join(" ") :=0A=
					"";=0A=
		},=0A=
=0A=
		// internal only, use is(".class")=0A=
		has: function( elem, className ) {=0A=
			return jQuery.inArray( className, (elem.className || =
elem).toString().split(/\s+/) ) > -1;=0A=
		}=0A=
	},=0A=
=0A=
	// A method for quickly swapping in/out CSS properties to get correct =
calculations=0A=
	swap: function( elem, options, callback ) {=0A=
		var old =3D {};=0A=
		// Remember the old values, and insert the new ones=0A=
		for ( var name in options ) {=0A=
			old[ name ] =3D elem.style[ name ];=0A=
			elem.style[ name ] =3D options[ name ];=0A=
		}=0A=
=0A=
		callback.call( elem );=0A=
=0A=
		// Revert the old values=0A=
		for ( var name in options )=0A=
			elem.style[ name ] =3D old[ name ];=0A=
	},=0A=
=0A=
	css: function( elem, name, force ) {=0A=
		if ( name =3D=3D "width" || name =3D=3D "height" ) {=0A=
			var val, props =3D { position: "absolute", visibility: "hidden", =
display:"block" }, which =3D name =3D=3D "width" ? [ "Left", "Right" ] : =
[ "Top", "Bottom" ];=0A=
		=0A=
			function getWH() {=0A=
				val =3D name =3D=3D "width" ? elem.offsetWidth : elem.offsetHeight;=0A=
				var padding =3D 0, border =3D 0;=0A=
				jQuery.each( which, function() {=0A=
					padding +=3D parseFloat(jQuery.curCSS( elem, "padding" + this, =
true)) || 0;=0A=
					border +=3D parseFloat(jQuery.curCSS( elem, "border" + this + =
"Width", true)) || 0;=0A=
				});=0A=
				val -=3D Math.round(padding + border);=0A=
			}=0A=
		=0A=
			if ( jQuery(elem).is(":visible") )=0A=
				getWH();=0A=
			else=0A=
				jQuery.swap( elem, props, getWH );=0A=
			=0A=
			return Math.max(0, val);=0A=
		}=0A=
		=0A=
		return jQuery.curCSS( elem, name, force );=0A=
	},=0A=
=0A=
	curCSS: function( elem, name, force ) {=0A=
		var ret;=0A=
=0A=
		// A helper method for determining if an element's values are broken=0A=
		function color( elem ) {=0A=
			if ( !jQuery.browser.safari )=0A=
				return false;=0A=
=0A=
			var ret =3D document.defaultView.getComputedStyle( elem, null );=0A=
			return !ret || ret.getPropertyValue("color") =3D=3D "";=0A=
		}=0A=
=0A=
		// We need to handle opacity special in IE=0A=
		if ( name =3D=3D "opacity" && jQuery.browser.msie ) {=0A=
			ret =3D jQuery.attr( elem.style, "opacity" );=0A=
=0A=
			return ret =3D=3D "" ?=0A=
				"1" :=0A=
				ret;=0A=
		}=0A=
		// Opera sometimes will give the wrong display answer, this fixes it, =
see #2037=0A=
		if ( jQuery.browser.opera && name =3D=3D "display" ) {=0A=
			var save =3D elem.style.outline;=0A=
			elem.style.outline =3D "0 solid black";=0A=
			elem.style.outline =3D save;=0A=
		}=0A=
		=0A=
		// Make sure we're using the right name for getting the float value=0A=
		if ( name.match( /float/i ) )=0A=
			name =3D styleFloat;=0A=
=0A=
		if ( !force && elem.style && elem.style[ name ] )=0A=
			ret =3D elem.style[ name ];=0A=
=0A=
		else if ( document.defaultView && =
document.defaultView.getComputedStyle ) {=0A=
=0A=
			// Only "float" is needed here=0A=
			if ( name.match( /float/i ) )=0A=
				name =3D "float";=0A=
=0A=
			name =3D name.replace( /([A-Z])/g, "-$1" ).toLowerCase();=0A=
=0A=
			var getComputedStyle =3D document.defaultView.getComputedStyle( elem, =
null );=0A=
=0A=
			if ( getComputedStyle && !color( elem ) )=0A=
				ret =3D getComputedStyle.getPropertyValue( name );=0A=
=0A=
			// If the element isn't reporting its values properly in Safari=0A=
			// then some display: none elements are involved=0A=
			else {=0A=
				var swap =3D [], stack =3D [];=0A=
=0A=
				// Locate all of the parent display: none elements=0A=
				for ( var a =3D elem; a && color(a); a =3D a.parentNode )=0A=
					stack.unshift(a);=0A=
=0A=
				// Go through and make them visible, but in reverse=0A=
				// (It would be better if we knew the exact display type that they =
had)=0A=
				for ( var i =3D 0; i < stack.length; i++ )=0A=
					if ( color( stack[ i ] ) ) {=0A=
						swap[ i ] =3D stack[ i ].style.display;=0A=
						stack[ i ].style.display =3D "block";=0A=
					}=0A=
=0A=
				// Since we flip the display style, we have to handle that=0A=
				// one special, otherwise get the value=0A=
				ret =3D name =3D=3D "display" && swap[ stack.length - 1 ] !=3D null ?=0A=
					"none" :=0A=
					( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) =
|| "";=0A=
=0A=
				// Finally, revert the display styles back=0A=
				for ( var i =3D 0; i < swap.length; i++ )=0A=
					if ( swap[ i ] !=3D null )=0A=
						stack[ i ].style.display =3D swap[ i ];=0A=
			}=0A=
=0A=
			// We should always get a number back from opacity=0A=
			if ( name =3D=3D "opacity" && ret =3D=3D "" )=0A=
				ret =3D "1";=0A=
=0A=
		} else if ( elem.currentStyle ) {=0A=
			var camelCase =3D name.replace(/\-(\w)/g, function(all, letter){=0A=
				return letter.toUpperCase();=0A=
			});=0A=
=0A=
			ret =3D elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];=0A=
=0A=
			// From the awesome hack by Dean Edwards=0A=
			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291=0A=
=0A=
			// If we're not dealing with a regular pixel number=0A=
			// but a number that has a weird ending, we need to convert it to =
pixels=0A=
			if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {=0A=
				// Remember the original values=0A=
				var style =3D elem.style.left, runtimeStyle =3D =
elem.runtimeStyle.left;=0A=
=0A=
				// Put in the new values to get a computed value out=0A=
				elem.runtimeStyle.left =3D elem.currentStyle.left;=0A=
				elem.style.left =3D ret || 0;=0A=
				ret =3D elem.style.pixelLeft + "px";=0A=
=0A=
				// Revert the changed values=0A=
				elem.style.left =3D style;=0A=
				elem.runtimeStyle.left =3D runtimeStyle;=0A=
			}=0A=
		}=0A=
=0A=
		return ret;=0A=
	},=0A=
	=0A=
	clean: function( elems, context ) {=0A=
		var ret =3D [];=0A=
		context =3D context || document;=0A=
		// !context.createElement fails in IE with an error but returns typeof =
'object'=0A=
		if (typeof context.createElement =3D=3D 'undefined') =0A=
			context =3D context.ownerDocument || context[0] && =
context[0].ownerDocument || document;=0A=
=0A=
		jQuery.each(elems, function(i, elem){=0A=
			if ( !elem )=0A=
				return;=0A=
=0A=
			if ( elem.constructor =3D=3D Number )=0A=
				elem =3D elem.toString();=0A=
			=0A=
			// Convert html string into DOM nodes=0A=
			if ( typeof elem =3D=3D "string" ) {=0A=
				// Fix "XHTML"-style tags in all browsers=0A=
				elem =3D elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, =
tag){=0A=
					return =
tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?=0A=
						all :=0A=
						front + "></" + tag + ">";=0A=
				});=0A=
=0A=
				// Trim whitespace, otherwise indexOf won't work as expected=0A=
				var tags =3D jQuery.trim( elem ).toLowerCase(), div =3D =
context.createElement("div");=0A=
=0A=
				var wrap =3D=0A=
					// option or optgroup=0A=
					!tags.indexOf("<opt") &&=0A=
					[ 1, "<select multiple=3D'multiple'>", "</select>" ] ||=0A=
					=0A=
					!tags.indexOf("<leg") &&=0A=
					[ 1, "<fieldset>", "</fieldset>" ] ||=0A=
					=0A=
					tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&=0A=
					[ 1, "<table>", "</table>" ] ||=0A=
					=0A=
					!tags.indexOf("<tr") &&=0A=
					[ 2, "<table><tbody>", "</tbody></table>" ] ||=0A=
					=0A=
				 	// <thead> matched above=0A=
					(!tags.indexOf("<td") || !tags.indexOf("<th")) &&=0A=
					[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||=0A=
					=0A=
					!tags.indexOf("<col") &&=0A=
					[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||=0A=
=0A=
					// IE can't serialize <link> and <script> tags normally=0A=
					jQuery.browser.msie &&=0A=
					[ 1, "div<div>", "</div>" ] ||=0A=
					=0A=
					[ 0, "", "" ];=0A=
=0A=
				// Go to html and back, then peel off extra wrappers=0A=
				div.innerHTML =3D wrap[1] + elem + wrap[2];=0A=
				=0A=
				// Move to the right depth=0A=
				while ( wrap[0]-- )=0A=
					div =3D div.lastChild;=0A=
				=0A=
				// Remove IE's autoinserted <tbody> from table fragments=0A=
				if ( jQuery.browser.msie ) {=0A=
					=0A=
					// String was a <table>, *may* have spurious <tbody>=0A=
					var tbody =3D !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 =
?=0A=
						div.firstChild && div.firstChild.childNodes :=0A=
						=0A=
						// String was a bare <thead> or <tfoot>=0A=
						wrap[1] =3D=3D "<table>" && tags.indexOf("<tbody") < 0 ?=0A=
							div.childNodes :=0A=
							[];=0A=
				=0A=
					for ( var j =3D tbody.length - 1; j >=3D 0 ; --j )=0A=
						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j =
].childNodes.length )=0A=
							tbody[ j ].parentNode.removeChild( tbody[ j ] );=0A=
					=0A=
					// IE completely kills leading whitespace when innerHTML is used	=0A=
					if ( /^\s/.test( elem ) )	=0A=
						div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), =
div.firstChild );=0A=
				=0A=
				}=0A=
				=0A=
				elem =3D jQuery.makeArray( div.childNodes );=0A=
			}=0A=
=0A=
			if ( elem.length =3D=3D=3D 0 && (!jQuery.nodeName( elem, "form" ) && =
!jQuery.nodeName( elem, "select" )) )=0A=
				return;=0A=
=0A=
			if ( elem[0] =3D=3D undefined || jQuery.nodeName( elem, "form" ) || =
elem.options )=0A=
				ret.push( elem );=0A=
=0A=
			else=0A=
				ret =3D jQuery.merge( ret, elem );=0A=
=0A=
		});=0A=
=0A=
		return ret;=0A=
	},=0A=
	=0A=
	attr: function( elem, name, value ) {=0A=
		// don't set attributes on text and comment nodes=0A=
		if (!elem || elem.nodeType =3D=3D 3 || elem.nodeType =3D=3D 8)=0A=
			return undefined;=0A=
=0A=
		var fix =3D jQuery.isXMLDoc( elem ) ?=0A=
			{} :=0A=
			jQuery.props;=0A=
=0A=
		// Safari mis-reports the default selected property of a hidden option=0A=
		// Accessing the parent's selectedIndex property fixes it=0A=
		if ( name =3D=3D "selected" && jQuery.browser.safari )=0A=
			elem.parentNode.selectedIndex;=0A=
		=0A=
		// Certain attributes only work when accessed via the old DOM 0 way=0A=
		if ( fix[ name ] ) {=0A=
			if ( value !=3D undefined )=0A=
				elem[ fix[ name ] ] =3D value;=0A=
=0A=
			return elem[ fix[ name ] ];=0A=
=0A=
		} else if ( jQuery.browser.msie && name =3D=3D "style" )=0A=
			return jQuery.attr( elem.style, "cssText", value );=0A=
=0A=
		else if ( value =3D=3D undefined && jQuery.browser.msie && =
jQuery.nodeName( elem, "form" ) && (name =3D=3D "action" || name =3D=3D =
"method") )=0A=
			return elem.getAttributeNode( name ).nodeValue;=0A=
=0A=
		// IE elem.getAttribute passes even for style=0A=
		else if ( elem.tagName ) {=0A=
=0A=
			if ( value !=3D undefined ) {=0A=
				// We can't allow the type property to be changed (since it causes =
problems in IE)=0A=
				if ( name =3D=3D "type" && jQuery.nodeName( elem, "input" ) && =
elem.parentNode )=0A=
					throw "type property can't be changed";=0A=
=0A=
				// convert the value to a string (all browsers do this but IE) see =
#1070=0A=
				elem.setAttribute( name, "" + value );=0A=
			}=0A=
=0A=
			if ( jQuery.browser.msie && /href|src/.test( name ) && =
!jQuery.isXMLDoc( elem ) ) =0A=
				return elem.getAttribute( name, 2 );=0A=
=0A=
			return elem.getAttribute( name );=0A=
=0A=
		// elem is actually elem.style ... set the style=0A=
		} else {=0A=
			// IE actually uses filters for opacity=0A=
			if ( name =3D=3D "opacity" && jQuery.browser.msie ) {=0A=
				if ( value !=3D undefined ) {=0A=
					// IE has trouble with opacity if it does not have layout=0A=
					// Force it by setting the zoom level=0A=
					elem.zoom =3D 1; =0A=
	=0A=
					// Set the alpha filter to set the opacity=0A=
					elem.filter =3D (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) =
+=0A=
						(parseFloat( value ).toString() =3D=3D "NaN" ? "" : =
"alpha(opacity=3D" + value * 100 + ")");=0A=
				}=0A=
	=0A=
				return elem.filter && elem.filter.indexOf("opacity=3D") >=3D 0 ?=0A=
					(parseFloat( elem.filter.match(/opacity=3D([^)]*)/)[1] ) / =
100).toString() :=0A=
					"";=0A=
			}=0A=
=0A=
			name =3D name.replace(/-([a-z])/ig, function(all, letter){=0A=
				return letter.toUpperCase();=0A=
			});=0A=
=0A=
			if ( value !=3D undefined )=0A=
				elem[ name ] =3D value;=0A=
=0A=
			return elem[ name ];=0A=
		}=0A=
	},=0A=
	=0A=
	trim: function( text ) {=0A=
		return (text || "").replace( /^\s+|\s+$/g, "" );=0A=
	},=0A=
=0A=
	makeArray: function( array ) {=0A=
		var ret =3D [];=0A=
=0A=
		// Need to use typeof to fight Safari childNodes crashes=0A=
		if ( typeof array !=3D "array" )=0A=
			for ( var i =3D 0, length =3D array.length; i < length; i++ )=0A=
				ret.push( array[ i ] );=0A=
		else=0A=
			ret =3D array.slice( 0 );=0A=
=0A=
		return ret;=0A=
	},=0A=
=0A=
	inArray: function( elem, array ) {=0A=
		for ( var i =3D 0, length =3D array.length; i < length; i++ )=0A=
			if ( array[ i ] =3D=3D elem )=0A=
				return i;=0A=
=0A=
		return -1;=0A=
	},=0A=
=0A=
	merge: function( first, second ) {=0A=
		// We have to loop this way because IE & Opera overwrite the length=0A=
		// expando of getElementsByTagName=0A=
=0A=
		// Also, we need to make sure that the correct elements are being =
returned=0A=
		// (IE returns comment nodes in a '*' query)=0A=
		if ( jQuery.browser.msie ) {=0A=
			for ( var i =3D 0; second[ i ]; i++ )=0A=
				if ( second[ i ].nodeType !=3D 8 )=0A=
					first.push( second[ i ] );=0A=
=0A=
		} else=0A=
			for ( var i =3D 0; second[ i ]; i++ )=0A=
				first.push( second[ i ] );=0A=
=0A=
		return first;=0A=
	},=0A=
=0A=
	unique: function( array ) {=0A=
		var ret =3D [], done =3D {};=0A=
=0A=
		try {=0A=
=0A=
			for ( var i =3D 0, length =3D array.length; i < length; i++ ) {=0A=
				var id =3D jQuery.data( array[ i ] );=0A=
=0A=
				if ( !done[ id ] ) {=0A=
					done[ id ] =3D true;=0A=
					ret.push( array[ i ] );=0A=
				}=0A=
			}=0A=
=0A=
		} catch( e ) {=0A=
			ret =3D array;=0A=
		}=0A=
=0A=
		return ret;=0A=
	},=0A=
=0A=
	grep: function( elems, callback, inv ) {=0A=
		var ret =3D [];=0A=
=0A=
		// Go through the array, only saving the items=0A=
		// that pass the validator function=0A=
		for ( var i =3D 0, length =3D elems.length; i < length; i++ )=0A=
			if ( !inv && callback( elems[ i ], i ) || inv && !callback( elems[ i =
], i ) )=0A=
				ret.push( elems[ i ] );=0A=
=0A=
		return ret;=0A=
	},=0A=
=0A=
	map: function( elems, callback ) {=0A=
		var ret =3D [];=0A=
=0A=
		// Go through the array, translating each of the items to their=0A=
		// new value (or values).=0A=
		for ( var i =3D 0, length =3D elems.length; i < length; i++ ) {=0A=
			var value =3D callback( elems[ i ], i );=0A=
=0A=
			if ( value !=3D=3D null && value !=3D undefined ) {=0A=
				if ( value.constructor !=3D Array )=0A=
					value =3D [ value ];=0A=
=0A=
				ret =3D ret.concat( value );=0A=
			}=0A=
		}=0A=
=0A=
		return ret;=0A=
	}=0A=
});=0A=
=0A=
var userAgent =3D navigator.userAgent.toLowerCase();=0A=
=0A=
// Figure out what browser is being used=0A=
jQuery.browser =3D {=0A=
	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || =
[])[1],=0A=
	safari: /webkit/.test( userAgent ),=0A=
	opera: /opera/.test( userAgent ),=0A=
	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),=0A=
	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( =
userAgent )=0A=
};=0A=
=0A=
var styleFloat =3D jQuery.browser.msie ?=0A=
	"styleFloat" :=0A=
	"cssFloat";=0A=
	=0A=
jQuery.extend({=0A=
	// Check to see if the W3C box model is being used=0A=
	boxModel: !jQuery.browser.msie || document.compatMode =3D=3D =
"CSS1Compat",=0A=
	=0A=
	props: {=0A=
		"for": "htmlFor",=0A=
		"class": "className",=0A=
		"float": styleFloat,=0A=
		cssFloat: styleFloat,=0A=
		styleFloat: styleFloat,=0A=
		innerHTML: "innerHTML",=0A=
		className: "className",=0A=
		value: "value",=0A=
		disabled: "disabled",=0A=
		checked: "checked",=0A=
		readonly: "readOnly",=0A=
		selected: "selected",=0A=
		maxlength: "maxLength",=0A=
		selectedIndex: "selectedIndex",=0A=
		defaultValue: "defaultValue",=0A=
		tagName: "tagName",=0A=
		nodeName: "nodeName"=0A=
	}=0A=
});=0A=
=0A=
jQuery.each({=0A=
	parent: function(elem){return elem.parentNode;},=0A=
	parents: function(elem){return jQuery.dir(elem,"parentNode");},=0A=
	next: function(elem){return jQuery.nth(elem,2,"nextSibling");},=0A=
	prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},=0A=
	nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},=0A=
	prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},=0A=
	siblings: function(elem){return =
jQuery.sibling(elem.parentNode.firstChild,elem);},=0A=
	children: function(elem){return jQuery.sibling(elem.firstChild);},=0A=
	contents: function(elem){return =
jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.d=
ocument:jQuery.makeArray(elem.childNodes);}=0A=
}, function(name, fn){=0A=
	jQuery.fn[ name ] =3D function( selector ) {=0A=
		var ret =3D jQuery.map( this, fn );=0A=
=0A=
		if ( selector && typeof selector =3D=3D "string" )=0A=
			ret =3D jQuery.multiFilter( selector, ret );=0A=
=0A=
		return this.pushStack( jQuery.unique( ret ) );=0A=
	};=0A=
});=0A=
=0A=
jQuery.each({=0A=
	appendTo: "append",=0A=
	prependTo: "prepend",=0A=
	insertBefore: "before",=0A=
	insertAfter: "after",=0A=
	replaceAll: "replaceWith"=0A=
}, function(name, original){=0A=
	jQuery.fn[ name ] =3D function() {=0A=
		var args =3D arguments;=0A=
=0A=
		return this.each(function(){=0A=
			for ( var i =3D 0, length =3D args.length; i < length; i++ )=0A=
				jQuery( args[ i ] )[ original ]( this );=0A=
		});=0A=
	};=0A=
});=0A=
=0A=
jQuery.each({=0A=
	removeAttr: function( name ) {=0A=
		jQuery.attr( this, name, "" );=0A=
		if (this.nodeType =3D=3D 1) =0A=
			this.removeAttribute( name );=0A=
	},=0A=
=0A=
	addClass: function( classNames ) {=0A=
		jQuery.className.add( this, classNames );=0A=
	},=0A=
=0A=
	removeClass: function( classNames ) {=0A=
		jQuery.className.remove( this, classNames );=0A=
	},=0A=
=0A=
	toggleClass: function( classNames ) {=0A=
		jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" =
: "add" ]( this, classNames );=0A=
	},=0A=
=0A=
	remove: function( selector ) {=0A=
		if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {=0A=
			// Prevent memory leaks=0A=
			jQuery( "*", this ).add(this).each(function(){=0A=
				jQuery.event.remove(this);=0A=
				jQuery.removeData(this);=0A=
			});=0A=
			if (this.parentNode)=0A=
				this.parentNode.removeChild( this );=0A=
		}=0A=
	},=0A=
=0A=
	empty: function() {=0A=
		// Remove element nodes and prevent memory leaks=0A=
		jQuery( ">*", this ).remove();=0A=
		=0A=
		// Remove any remaining nodes=0A=
		while ( this.firstChild )=0A=
			this.removeChild( this.firstChild );=0A=
	}=0A=
}, function(name, fn){=0A=
	jQuery.fn[ name ] =3D function(){=0A=
		return this.each( fn, arguments );=0A=
	};=0A=
});=0A=
=0A=
jQuery.each([ "Height", "Width" ], function(i, name){=0A=
	var type =3D name.toLowerCase();=0A=
	=0A=
	jQuery.fn[ type ] =3D function( size ) {=0A=
		// Get window width or height=0A=
		return this[0] =3D=3D window ?=0A=
			// Opera reports document.body.client[Width/Height] properly in both =
quirks and standards=0A=
			jQuery.browser.opera && document.body[ "client" + name ] || =0A=
			=0A=
			// Safari reports inner[Width/Height] just fine (Mozilla and Opera =
include scroll bar widths)=0A=
			jQuery.browser.safari && window[ "inner" + name ] ||=0A=
			=0A=
			// Everyone else use document.documentElement or document.body =
depending on Quirks vs Standards mode=0A=
			document.compatMode =3D=3D "CSS1Compat" && document.documentElement[ =
"client" + name ] || document.body[ "client" + name ] :=0A=
		=0A=
			// Get document width or height=0A=
			this[0] =3D=3D document ?=0A=
				// Either scroll[Width/Height] or offset[Width/Height], whichever is =
greater=0A=
				Math.max( =0A=
					Math.max(document.body["scroll" + name], =
document.documentElement["scroll" + name]), =0A=
					Math.max(document.body["offset" + name], =
document.documentElement["offset" + name]) =0A=
				) :=0A=
=0A=
				// Get or set width or height on the element=0A=
				size =3D=3D undefined ?=0A=
					// Get width or height on the element=0A=
					(this.length ? jQuery.css( this[0], type ) : null) :=0A=
=0A=
					// Set the width or height on the element (default to pixels if =
value is unitless)=0A=
					this.css( type, size.constructor =3D=3D String ? size : size + "px" =
);=0A=
	};=0A=
});=0A=
=0A=
var chars =3D jQuery.browser.safari && parseInt(jQuery.browser.version) =
< 417 ?=0A=
		"(?:[\\w*_-]|\\\\.)" :=0A=
		"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",=0A=
	quickChild =3D new RegExp("^>\\s*(" + chars + "+)"),=0A=
	quickID =3D new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),=0A=
	quickClass =3D new RegExp("^([#.]?)(" + chars + "*)");=0A=
=0A=
jQuery.extend({=0A=
	expr: {=0A=
		"": function(a,i,m){return m[2]=3D=3D"*"||jQuery.nodeName(a,m[2]);},=0A=
		"#": function(a,i,m){return a.getAttribute("id")=3D=3Dm[2];},=0A=
		":": {=0A=
			// Position Checks=0A=
			lt: function(a,i,m){return i<m[3]-0;},=0A=
			gt: function(a,i,m){return i>m[3]-0;},=0A=
			nth: function(a,i,m){return m[3]-0=3D=3Di;},=0A=
			eq: function(a,i,m){return m[3]-0=3D=3Di;},=0A=
			first: function(a,i){return i=3D=3D0;},=0A=
			last: function(a,i,m,r){return i=3D=3Dr.length-1;},=0A=
			even: function(a,i){return i%2=3D=3D0;},=0A=
			odd: function(a,i){return i%2;},=0A=
=0A=
			// Child Checks=0A=
			"first-child": function(a){return =
a.parentNode.getElementsByTagName("*")[0]=3D=3Da;},=0A=
			"last-child": function(a){return =
jQuery.nth(a.parentNode.lastChild,1,"previousSibling")=3D=3Da;},=0A=
			"only-child": function(a){return =
!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},=0A=
=0A=
			// Parent Checks=0A=
			parent: function(a){return a.firstChild;},=0A=
			empty: function(a){return !a.firstChild;},=0A=
=0A=
			// Text Check=0A=
			contains: function(a,i,m){return =
(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=3D0;},=0A=
=0A=
			// Visibility=0A=
			visible: function(a){return =
"hidden"!=3Da.type&&jQuery.css(a,"display")!=3D"none"&&jQuery.css(a,"visi=
bility")!=3D"hidden";},=0A=
			hidden: function(a){return =
"hidden"=3D=3Da.type||jQuery.css(a,"display")=3D=3D"none"||jQuery.css(a,"=
visibility")=3D=3D"hidden";},=0A=
=0A=
			// Form attributes=0A=
			enabled: function(a){return !a.disabled;},=0A=
			disabled: function(a){return a.disabled;},=0A=
			checked: function(a){return a.checked;},=0A=
			selected: function(a){return a.selected||jQuery.attr(a,"selected");},=0A=
=0A=
			// Form elements=0A=
			text: function(a){return "text"=3D=3Da.type;},=0A=
			radio: function(a){return "radio"=3D=3Da.type;},=0A=
			checkbox: function(a){return "checkbox"=3D=3Da.type;},=0A=
			file: function(a){return "file"=3D=3Da.type;},=0A=
			password: function(a){return "password"=3D=3Da.type;},=0A=
			submit: function(a){return "submit"=3D=3Da.type;},=0A=
			image: function(a){return "image"=3D=3Da.type;},=0A=
			reset: function(a){return "reset"=3D=3Da.type;},=0A=
			button: function(a){return =
"button"=3D=3Da.type||jQuery.nodeName(a,"button");},=0A=
			input: function(a){return =
/input|select|textarea|button/i.test(a.nodeName);},=0A=
=0A=
			// :has()=0A=
			has: function(a,i,m){return jQuery.find(m[3],a).length;},=0A=
=0A=
			// :header=0A=
			header: function(a){return /h\d/i.test(a.nodeName);},=0A=
=0A=
			// :animated=0A=
			animated: function(a){return =
jQuery.grep(jQuery.timers,function(fn){return a=3D=3Dfn.elem;}).length;}=0A=
		}=0A=
	},=0A=
	=0A=
	// The regular expressions that power the parsing engine=0A=
	parse: [=0A=
		// Match: [@value=3D'test'], [@foo]=0A=
		/^(\[) *@?([\w-]+) *([!*$^~=3D]*) *('?"?)(.*?)\4 *\]/,=0A=
=0A=
		// Match: :contains('foo')=0A=
		/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,=0A=
=0A=
		// Match: :even, :last-chlid, #id, .class=0A=
		new RegExp("^([:.#]*)(" + chars + "+)")=0A=
	],=0A=
=0A=
	multiFilter: function( expr, elems, not ) {=0A=
		var old, cur =3D [];=0A=
=0A=
		while ( expr && expr !=3D old ) {=0A=
			old =3D expr;=0A=
			var f =3D jQuery.filter( expr, elems, not );=0A=
			expr =3D f.t.replace(/^\s*,\s*/, "" );=0A=
			cur =3D not ? elems =3D f.r : jQuery.merge( cur, f.r );=0A=
		}=0A=
=0A=
		return cur;=0A=
	},=0A=
=0A=
	find: function( t, context ) {=0A=
		// Quickly handle non-string expressions=0A=
		if ( typeof t !=3D "string" )=0A=
			return [ t ];=0A=
=0A=
		// check to make sure context is a DOM element or a document=0A=
		if ( context && context.nodeType !=3D 1 && context.nodeType !=3D 9)=0A=
			return [ ];=0A=
=0A=
		// Set the correct context (if none is provided)=0A=
		context =3D context || document;=0A=
=0A=
		// Initialize the search=0A=
		var ret =3D [context], done =3D [], last, nodeName;=0A=
=0A=
		// Continue while a selector expression exists, and while=0A=
		// we're no longer looping upon ourselves=0A=
		while ( t && last !=3D t ) {=0A=
			var r =3D [];=0A=
			last =3D t;=0A=
=0A=
			t =3D jQuery.trim(t);=0A=
=0A=
			var foundToken =3D false;=0A=
=0A=
			// An attempt at speeding up child selectors that=0A=
			// point to a specific element tag=0A=
			var re =3D quickChild;=0A=
			var m =3D re.exec(t);=0A=
=0A=
			if ( m ) {=0A=
				nodeName =3D m[1].toUpperCase();=0A=
=0A=
				// Perform our own iteration and filter=0A=
				for ( var i =3D 0; ret[i]; i++ )=0A=
					for ( var c =3D ret[i].firstChild; c; c =3D c.nextSibling )=0A=
						if ( c.nodeType =3D=3D 1 && (nodeName =3D=3D "*" || =
c.nodeName.toUpperCase() =3D=3D nodeName) )=0A=
							r.push( c );=0A=
=0A=
				ret =3D r;=0A=
				t =3D t.replace( re, "" );=0A=
				if ( t.indexOf(" ") =3D=3D 0 ) continue;=0A=
				foundToken =3D true;=0A=
			} else {=0A=
				re =3D /^([>+~])\s*(\w*)/i;=0A=
=0A=
				if ( (m =3D re.exec(t)) !=3D null ) {=0A=
					r =3D [];=0A=
=0A=
					var merge =3D {};=0A=
					nodeName =3D m[2].toUpperCase();=0A=
					m =3D m[1];=0A=
=0A=
					for ( var j =3D 0, rl =3D ret.length; j < rl; j++ ) {=0A=
						var n =3D m =3D=3D "~" || m =3D=3D "+" ? ret[j].nextSibling : =
ret[j].firstChild;=0A=
						for ( ; n; n =3D n.nextSibling )=0A=
							if ( n.nodeType =3D=3D 1 ) {=0A=
								var id =3D jQuery.data(n);=0A=
=0A=
								if ( m =3D=3D "~" && merge[id] ) break;=0A=
								=0A=
								if (!nodeName || n.nodeName.toUpperCase() =3D=3D nodeName ) {=0A=
									if ( m =3D=3D "~" ) merge[id] =3D true;=0A=
									r.push( n );=0A=
								}=0A=
								=0A=
								if ( m =3D=3D "+" ) break;=0A=
							}=0A=
					}=0A=
=0A=
					ret =3D r;=0A=
=0A=
					// And remove the token=0A=
					t =3D jQuery.trim( t.replace( re, "" ) );=0A=
					foundToken =3D true;=0A=
				}=0A=
			}=0A=
=0A=
			// See if there's still an expression, and that we haven't already=0A=
			// matched a token=0A=
			if ( t && !foundToken ) {=0A=
				// Handle multiple expressions=0A=
				if ( !t.indexOf(",") ) {=0A=
					// Clean the result set=0A=
					if ( context =3D=3D ret[0] ) ret.shift();=0A=
=0A=
					// Merge the result sets=0A=
					done =3D jQuery.merge( done, ret );=0A=
=0A=
					// Reset the context=0A=
					r =3D ret =3D [context];=0A=
=0A=
					// Touch up the selector string=0A=
					t =3D " " + t.substr(1,t.length);=0A=
=0A=
				} else {=0A=
					// Optimize for the case nodeName#idName=0A=
					var re2 =3D quickID;=0A=
					var m =3D re2.exec(t);=0A=
					=0A=
					// Re-organize the results, so that they're consistent=0A=
					if ( m ) {=0A=
						m =3D [ 0, m[2], m[3], m[1] ];=0A=
=0A=
					} else {=0A=
						// Otherwise, do a traditional filter check for=0A=
						// ID, class, and element selectors=0A=
						re2 =3D quickClass;=0A=
						m =3D re2.exec(t);=0A=
					}=0A=
=0A=
					m[2] =3D m[2].replace(/\\/g, "");=0A=
=0A=
					var elem =3D ret[ret.length-1];=0A=
=0A=
					// Try to do a global search by ID, where we can=0A=
					if ( m[1] =3D=3D "#" && elem && elem.getElementById && =
!jQuery.isXMLDoc(elem) ) {=0A=
						// Optimization for HTML document case=0A=
						var oid =3D elem.getElementById(m[2]);=0A=
						=0A=
						// Do a quick check for the existence of the actual ID attribute=0A=
						// to avoid selecting by the name attribute in IE=0A=
						// also check to insure id is a string to avoid selecting an =
element with the name of 'id' inside a form=0A=
						if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof =
oid.id =3D=3D "string" && oid.id !=3D m[2] )=0A=
							oid =3D jQuery('[@id=3D"'+m[2]+'"]', elem)[0];=0A=
=0A=
						// Do a quick check for node name (where applicable) so=0A=
						// that div#foo searches will be really fast=0A=
						ret =3D r =3D oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] =
: [];=0A=
					} else {=0A=
						// We need to find all descendant elements=0A=
						for ( var i =3D 0; ret[i]; i++ ) {=0A=
							// Grab the tag name being searched for=0A=
							var tag =3D m[1] =3D=3D "#" && m[3] ? m[3] : m[1] !=3D "" || m[0] =
=3D=3D "" ? "*" : m[2];=0A=
=0A=
							// Handle IE7 being really dumb about <object>s=0A=
							if ( tag =3D=3D "*" && ret[i].nodeName.toLowerCase() =3D=3D =
"object" )=0A=
								tag =3D "param";=0A=
=0A=
							r =3D jQuery.merge( r, ret[i].getElementsByTagName( tag ));=0A=
						}=0A=
=0A=
						// It's faster to filter by class and be done with it=0A=
						if ( m[1] =3D=3D "." )=0A=
							r =3D jQuery.classFilter( r, m[2] );=0A=
=0A=
						// Same with ID filtering=0A=
						if ( m[1] =3D=3D "#" ) {=0A=
							var tmp =3D [];=0A=
=0A=
							// Try to find the element with the ID=0A=
							for ( var i =3D 0; r[i]; i++ )=0A=
								if ( r[i].getAttribute("id") =3D=3D m[2] ) {=0A=
									tmp =3D [ r[i] ];=0A=
									break;=0A=
								}=0A=
=0A=
							r =3D tmp;=0A=
						}=0A=
=0A=
						ret =3D r;=0A=
					}=0A=
=0A=
					t =3D t.replace( re2, "" );=0A=
				}=0A=
=0A=
			}=0A=
=0A=
			// If a selector string still exists=0A=
			if ( t ) {=0A=
				// Attempt to filter it=0A=
				var val =3D jQuery.filter(t,r);=0A=
				ret =3D r =3D val.r;=0A=
				t =3D jQuery.trim(val.t);=0A=
			}=0A=
		}=0A=
=0A=
		// An error occurred with the selector;=0A=
		// just return an empty set instead=0A=
		if ( t )=0A=
			ret =3D [];=0A=
=0A=
		// Remove the root context=0A=
		if ( ret && context =3D=3D ret[0] )=0A=
			ret.shift();=0A=
=0A=
		// And combine the results=0A=
		done =3D jQuery.merge( done, ret );=0A=
=0A=
		return done;=0A=
	},=0A=
=0A=
	classFilter: function(r,m,not){=0A=
		m =3D " " + m + " ";=0A=
		var tmp =3D [];=0A=
		for ( var i =3D 0; r[i]; i++ ) {=0A=
			var pass =3D (" " + r[i].className + " ").indexOf( m ) >=3D 0;=0A=
			if ( !not && pass || not && !pass )=0A=
				tmp.push( r[i] );=0A=
		}=0A=
		return tmp;=0A=
	},=0A=
=0A=
	filter: function(t,r,not) {=0A=
		var last;=0A=
=0A=
		// Look for common filter expressions=0A=
		while ( t && t !=3D last ) {=0A=
			last =3D t;=0A=
=0A=
			var p =3D jQuery.parse, m;=0A=
=0A=
			for ( var i =3D 0; p[i]; i++ ) {=0A=
				m =3D p[i].exec( t );=0A=
=0A=
				if ( m ) {=0A=
					// Remove what we just matched=0A=
					t =3D t.substring( m[0].length );=0A=
=0A=
					m[2] =3D m[2].replace(/\\/g, "");=0A=
					break;=0A=
				}=0A=
			}=0A=
=0A=
			if ( !m )=0A=
				break;=0A=
=0A=
			// :not() is a special case that can be optimized by=0A=
			// keeping it out of the expression list=0A=
			if ( m[1] =3D=3D ":" && m[2] =3D=3D "not" )=0A=
				// optimize if only one selector found (most common case)=0A=
				r =3D isSimple.test( m[3] ) ?=0A=
					jQuery.filter(m[3], r, true).r :=0A=
					jQuery( r ).not( m[3] );=0A=
=0A=
			// We can get a big speed boost by filtering by class here=0A=
			else if ( m[1] =3D=3D "." )=0A=
				r =3D jQuery.classFilter(r, m[2], not);=0A=
=0A=
			else if ( m[1] =3D=3D "[" ) {=0A=
				var tmp =3D [], type =3D m[3];=0A=
				=0A=
				for ( var i =3D 0, rl =3D r.length; i < rl; i++ ) {=0A=
					var a =3D r[i], z =3D a[ jQuery.props[m[2]] || m[2] ];=0A=
					=0A=
					if ( z =3D=3D null || /href|src|selected/.test(m[2]) )=0A=
						z =3D jQuery.attr(a,m[2]) || '';=0A=
=0A=
					if ( (type =3D=3D "" && !!z ||=0A=
						 type =3D=3D "=3D" && z =3D=3D m[5] ||=0A=
						 type =3D=3D "!=3D" && z !=3D m[5] ||=0A=
						 type =3D=3D "^=3D" && z && !z.indexOf(m[5]) ||=0A=
						 type =3D=3D "$=3D" && z.substr(z.length - m[5].length) =3D=3D =
m[5] ||=0A=
						 (type =3D=3D "*=3D" || type =3D=3D "~=3D") && z.indexOf(m[5]) =
>=3D 0) ^ not )=0A=
							tmp.push( a );=0A=
				}=0A=
				=0A=
				r =3D tmp;=0A=
=0A=
			// We can get a speed boost by handling nth-child here=0A=
			} else if ( m[1] =3D=3D ":" && m[2] =3D=3D "nth-child" ) {=0A=
				var merge =3D {}, tmp =3D [],=0A=
					// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', =
'-n+6'=0A=
					test =3D /(-?)(\d*)n((?:\+|-)?\d*)/.exec(=0A=
						m[3] =3D=3D "even" && "2n" || m[3] =3D=3D "odd" && "2n+1" ||=0A=
						!/\D/.test(m[3]) && "0n+" + m[3] || m[3]),=0A=
					// calculate the numbers (first)n+(last) including if they are =
negative=0A=
					first =3D (test[1] + (test[2] || 1)) - 0, last =3D test[3] - 0;=0A=
 =0A=
				// loop through all the elements left in the jQuery object=0A=
				for ( var i =3D 0, rl =3D r.length; i < rl; i++ ) {=0A=
					var node =3D r[i], parentNode =3D node.parentNode, id =3D =
jQuery.data(parentNode);=0A=
=0A=
					if ( !merge[id] ) {=0A=
						var c =3D 1;=0A=
=0A=
						for ( var n =3D parentNode.firstChild; n; n =3D n.nextSibling )=0A=
							if ( n.nodeType =3D=3D 1 )=0A=
								n.nodeIndex =3D c++;=0A=
=0A=
						merge[id] =3D true;=0A=
					}=0A=
=0A=
					var add =3D false;=0A=
=0A=
					if ( first =3D=3D 0 ) {=0A=
						if ( node.nodeIndex =3D=3D last )=0A=
							add =3D true;=0A=
					} else if ( (node.nodeIndex - last) % first =3D=3D 0 && =
(node.nodeIndex - last) / first >=3D 0 )=0A=
						add =3D true;=0A=
=0A=
					if ( add ^ not )=0A=
						tmp.push( node );=0A=
				}=0A=
=0A=
				r =3D tmp;=0A=
=0A=
			// Otherwise, find the expression to execute=0A=
			} else {=0A=
				var fn =3D jQuery.expr[ m[1] ];=0A=
				if ( typeof fn =3D=3D "object" )=0A=
					fn =3D fn[ m[2] ];=0A=
=0A=
				if ( typeof fn =3D=3D "string" )=0A=
					fn =3D eval("false||function(a,i){return " + fn + ";}");=0A=
=0A=
				// Execute it against the current filter=0A=
				r =3D jQuery.grep( r, function(elem, i){=0A=
					return fn(elem, i, m, r);=0A=
				}, not );=0A=
			}=0A=
		}=0A=
=0A=
		// Return an array of filtered elements (r)=0A=
		// and the modified expression string (t)=0A=
		return { r: r, t: t };=0A=
	},=0A=
=0A=
	dir: function( elem, dir ){=0A=
		var matched =3D [];=0A=
		var cur =3D elem[dir];=0A=
		while ( cur && cur !=3D document ) {=0A=
			if ( cur.nodeType =3D=3D 1 )=0A=
				matched.push( cur );=0A=
			cur =3D cur[dir];=0A=
		}=0A=
		return matched;=0A=
	},=0A=
	=0A=
	nth: function(cur,result,dir,elem){=0A=
		result =3D result || 1;=0A=
		var num =3D 0;=0A=
=0A=
		for ( ; cur; cur =3D cur[dir] )=0A=
			if ( cur.nodeType =3D=3D 1 && ++num =3D=3D result )=0A=
				break;=0A=
=0A=
		return cur;=0A=
	},=0A=
	=0A=
	sibling: function( n, elem ) {=0A=
		var r =3D [];=0A=
=0A=
		for ( ; n; n =3D n.nextSibling ) {=0A=
			if ( n.nodeType =3D=3D 1 && (!elem || n !=3D elem) )=0A=
				r.push( n );=0A=
		}=0A=
=0A=
		return r;=0A=
	}=0A=
});=0A=
=0A=
/*=0A=
 * A number of helper functions used for managing events.=0A=
 * Many of the ideas behind this code orignated from =0A=
 * Dean Edwards' addEvent library.=0A=
 */=0A=
jQuery.event =3D {=0A=
=0A=
	// Bind an event to an element=0A=
	// Original by Dean Edwards=0A=
	add: function(elem, types, handler, data) {=0A=
		if ( elem.nodeType =3D=3D 3 || elem.nodeType =3D=3D 8 )=0A=
			return;=0A=
=0A=
		// For whatever reason, IE has trouble passing the window object=0A=
		// around, causing it to be cloned in the process=0A=
		if ( jQuery.browser.msie && elem.setInterval !=3D undefined )=0A=
			elem =3D window;=0A=
=0A=
		// Make sure that the function being executed has a unique ID=0A=
		if ( !handler.guid )=0A=
			handler.guid =3D this.guid++;=0A=
			=0A=
		// if data is passed, bind to handler =0A=
		if( data !=3D undefined ) { =0A=
			// Create temporary function pointer to original handler =0A=
			var fn =3D handler; =0A=
=0A=
			// Create unique handler function, wrapped around original handler =0A=
			handler =3D function() { =0A=
				// Pass arguments and context to original handler =0A=
				return fn.apply(this, arguments); =0A=
			};=0A=
=0A=
			// Store data in unique handler =0A=
			handler.data =3D data;=0A=
=0A=
			// Set the guid of unique handler to the same of original handler, so =
it can be removed =0A=
			handler.guid =3D fn.guid;=0A=
		}=0A=
=0A=
		// Init the element's event structure=0A=
		var events =3D jQuery.data(elem, "events") || jQuery.data(elem, =
"events", {}),=0A=
			handle =3D jQuery.data(elem, "handle") || jQuery.data(elem, "handle", =
function(){=0A=
				// returned undefined or false=0A=
				var val;=0A=
=0A=
				// Handle the second event of a trigger and when=0A=
				// an event is called after a page has unloaded=0A=
				if ( typeof jQuery =3D=3D "undefined" || jQuery.event.triggered )=0A=
					return val;=0A=
		=0A=
				val =3D jQuery.event.handle.apply(arguments.callee.elem, arguments);=0A=
		=0A=
				return val;=0A=
			});=0A=
		// Add elem as a property of the handle function=0A=
		// This is to prevent a memory leak with non-native=0A=
		// event in IE.=0A=
		handle.elem =3D elem;=0A=
			=0A=
			// Handle multiple events seperated by a space=0A=
			// jQuery(...).bind("mouseover mouseout", fn);=0A=
			jQuery.each(types.split(/\s+/), function(index, type) {=0A=
				// Namespaced event handlers=0A=
				var parts =3D type.split(".");=0A=
				type =3D parts[0];=0A=
				handler.type =3D parts[1];=0A=
=0A=
				// Get the current list of functions bound to this event=0A=
				var handlers =3D events[type];=0A=
=0A=
				// Init the event handler queue=0A=
				if (!handlers) {=0A=
					handlers =3D events[type] =3D {};=0A=
		=0A=
					// Check for a special event handler=0A=
					// Only use addEventListener/attachEvent if the special=0A=
					// events handler returns false=0A=
					if ( !jQuery.event.special[type] || =
jQuery.event.special[type].setup.call(elem) =3D=3D=3D false ) {=0A=
						// Bind the global event handler to the element=0A=
						if (elem.addEventListener)=0A=
							elem.addEventListener(type, handle, false);=0A=
						else if (elem.attachEvent)=0A=
							elem.attachEvent("on" + type, handle);=0A=
					}=0A=
				}=0A=
=0A=
				// Add the function to the element's handler list=0A=
				handlers[handler.guid] =3D handler;=0A=
=0A=
				// Keep track of which events have been used, for global triggering=0A=
				jQuery.event.global[type] =3D true;=0A=
			});=0A=
		=0A=
		// Nullify elem to prevent memory leaks in IE=0A=
		elem =3D null;=0A=
	},=0A=
=0A=
	guid: 1,=0A=
	global: {},=0A=
=0A=
	// Detach an event or set of events from an element=0A=
	remove: function(elem, types, handler) {=0A=
		// don't do events on text and comment nodes=0A=
		if ( elem.nodeType =3D=3D 3 || elem.nodeType =3D=3D 8 )=0A=
			return;=0A=
=0A=
		var events =3D jQuery.data(elem, "events"), ret, index;=0A=
=0A=
		if ( events ) {=0A=
			// Unbind all events for the element=0A=
			if ( types =3D=3D undefined || (typeof types =3D=3D "string" && =
types.charAt(0) =3D=3D ".") )=0A=
				for ( var type in events )=0A=
					this.remove( elem, type + (types || "") );=0A=
			else {=0A=
				// types is actually an event object here=0A=
				if ( types.type ) {=0A=
					handler =3D types.handler;=0A=
					types =3D types.type;=0A=
				}=0A=
				=0A=
				// Handle multiple events seperated by a space=0A=
				// jQuery(...).unbind("mouseover mouseout", fn);=0A=
				jQuery.each(types.split(/\s+/), function(index, type){=0A=
					// Namespaced event handlers=0A=
					var parts =3D type.split(".");=0A=
					type =3D parts[0];=0A=
					=0A=
					if ( events[type] ) {=0A=
						// remove the given handler for the given type=0A=
						if ( handler )=0A=
							delete events[type][handler.guid];=0A=
			=0A=
						// remove all handlers for the given type=0A=
						else=0A=
							for ( handler in events[type] )=0A=
								// Handle the removal of namespaced events=0A=
								if ( !parts[1] || events[type][handler].type =3D=3D parts[1] )=0A=
									delete events[type][handler];=0A=
=0A=
						// remove generic event handler if no more handlers exist=0A=
						for ( ret in events[type] ) break;=0A=
						if ( !ret ) {=0A=
							if ( !jQuery.event.special[type] || =
jQuery.event.special[type].teardown.call(elem) =3D=3D=3D false ) {=0A=
								if (elem.removeEventListener)=0A=
									elem.removeEventListener(type, jQuery.data(elem, "handle"), =
false);=0A=
								else if (elem.detachEvent)=0A=
									elem.detachEvent("on" + type, jQuery.data(elem, "handle"));=0A=
							}=0A=
							ret =3D null;=0A=
							delete events[type];=0A=
						}=0A=
					}=0A=
				});=0A=
			}=0A=
=0A=
			// Remove the expando if it's no longer used=0A=
			for ( ret in events ) break;=0A=
			if ( !ret ) {=0A=
				var handle =3D jQuery.data( elem, "handle" );=0A=
				if ( handle ) handle.elem =3D null;=0A=
				jQuery.removeData( elem, "events" );=0A=
				jQuery.removeData( elem, "handle" );=0A=
			}=0A=
		}=0A=
	},=0A=
=0A=
	trigger: function(type, data, elem, donative, extra) {=0A=
		// Clone the incoming data, if any=0A=
		data =3D jQuery.makeArray(data || []);=0A=
=0A=
		if ( type.indexOf("!") >=3D 0 ) {=0A=
			type =3D type.slice(0, -1);=0A=
			var exclusive =3D true;=0A=
		}=0A=
=0A=
		// Handle a global trigger=0A=
		if ( !elem ) {=0A=
			// Only trigger if we've ever bound an event for it=0A=
			if ( this.global[type] )=0A=
				jQuery("*").add([window, document]).trigger(type, data);=0A=
=0A=
		// Handle triggering a single element=0A=
		} else {=0A=
			// don't do events on text and comment nodes=0A=
			if ( elem.nodeType =3D=3D 3 || elem.nodeType =3D=3D 8 )=0A=
				return undefined;=0A=
=0A=
			var val, ret, fn =3D jQuery.isFunction( elem[ type ] || null ),=0A=
				// Check to see if we need to provide a fake event, or not=0A=
				event =3D !data[0] || !data[0].preventDefault;=0A=
			=0A=
			// Pass along a fake event=0A=
			if ( event )=0A=
				data.unshift( this.fix({ type: type, target: elem }) );=0A=
=0A=
			// Enforce the right trigger type=0A=
			data[0].type =3D type;=0A=
			if ( exclusive )=0A=
				data[0].exclusive =3D true;=0A=
=0A=
			// Trigger the event=0A=
			if ( jQuery.isFunction( jQuery.data(elem, "handle") ) )=0A=
				val =3D jQuery.data(elem, "handle").apply( elem, data );=0A=
=0A=
			// Handle triggering native .onfoo handlers=0A=
			if ( !fn && elem["on"+type] && elem["on"+type].apply( elem, data ) =
=3D=3D=3D false )=0A=
				val =3D false;=0A=
=0A=
			// Extra functions don't get the custom event object=0A=
			if ( event )=0A=
				data.shift();=0A=
=0A=
			// Handle triggering of extra function=0A=
			if ( extra && jQuery.isFunction( extra ) ) {=0A=
				// call the extra function and tack the current return value on the =
end for possible inspection=0A=
				ret =3D extra.apply( elem, val =3D=3D null ? data : data.concat( val =
) );=0A=
				// if anything is returned, give it precedence and have it overwrite =
the previous value=0A=
				if (ret !=3D=3D undefined)=0A=
					val =3D ret;=0A=
			}=0A=
=0A=
			// Trigger the native events (except for clicks on links)=0A=
			if ( fn && donative !=3D=3D false && val !=3D=3D false && =
!(jQuery.nodeName(elem, 'a') && type =3D=3D "click") ) {=0A=
				this.triggered =3D true;=0A=
				try {=0A=
					elem[ type ]();=0A=
				// prevent IE from throwing an error for some hidden elements=0A=
				} catch (e) {}=0A=
			}=0A=
=0A=
			this.triggered =3D false;=0A=
		}=0A=
=0A=
		return val;=0A=
	},=0A=
=0A=
	handle: function(event) {=0A=
		// returned undefined or false=0A=
		var val;=0A=
=0A=
		// Empty object is for triggered events with no data=0A=
		event =3D jQuery.event.fix( event || window.event || {} ); =0A=
=0A=
		// Namespaced event handlers=0A=
		var parts =3D event.type.split(".");=0A=
		event.type =3D parts[0];=0A=
=0A=
		var handlers =3D jQuery.data(this, "events") && jQuery.data(this, =
"events")[event.type], args =3D Array.prototype.slice.call( arguments, 1 =
);=0A=
		args.unshift( event );=0A=
=0A=
		for ( var j in handlers ) {=0A=
			var handler =3D handlers[j];=0A=
			// Pass in a reference to the handler function itself=0A=
			// So that we can later remove it=0A=
			args[0].handler =3D handler;=0A=
			args[0].data =3D handler.data;=0A=
=0A=
			// Filter the functions by class=0A=
			if ( !parts[1] && !event.exclusive || handler.type =3D=3D parts[1] ) {=0A=
				var ret =3D handler.apply( this, args );=0A=
=0A=
				if ( val !=3D=3D false )=0A=
					val =3D ret;=0A=
=0A=
				if ( ret =3D=3D=3D false ) {=0A=
					event.preventDefault();=0A=
					event.stopPropagation();=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		// Clean up added properties in IE to prevent memory leak=0A=
		if (jQuery.browser.msie)=0A=
			event.target =3D event.preventDefault =3D event.stopPropagation =3D=0A=
				event.handler =3D event.data =3D null;=0A=
=0A=
		return val;=0A=
	},=0A=
=0A=
	fix: function(event) {=0A=
		// store a copy of the original event object =0A=
		// and clone to set read-only properties=0A=
		var originalEvent =3D event;=0A=
		event =3D jQuery.extend({}, originalEvent);=0A=
		=0A=
		// add preventDefault and stopPropagation since =0A=
		// they will not work on the clone=0A=
		event.preventDefault =3D function() {=0A=
			// if preventDefault exists run it on the original event=0A=
			if (originalEvent.preventDefault)=0A=
				originalEvent.preventDefault();=0A=
			// otherwise set the returnValue property of the original event to =
false (IE)=0A=
			originalEvent.returnValue =3D false;=0A=
		};=0A=
		event.stopPropagation =3D function() {=0A=
			// if stopPropagation exists run it on the original event=0A=
			if (originalEvent.stopPropagation)=0A=
				originalEvent.stopPropagation();=0A=
			// otherwise set the cancelBubble property of the original event to =
true (IE)=0A=
			originalEvent.cancelBubble =3D true;=0A=
		};=0A=
		=0A=
		// Fix target property, if necessary=0A=
		if ( !event.target )=0A=
			event.target =3D event.srcElement || document; // Fixes #1925 where =
srcElement might not be defined either=0A=
				=0A=
		// check if target is a textnode (safari)=0A=
		if ( event.target.nodeType =3D=3D 3 )=0A=
			event.target =3D originalEvent.target.parentNode;=0A=
=0A=
		// Add relatedTarget, if necessary=0A=
		if ( !event.relatedTarget && event.fromElement )=0A=
			event.relatedTarget =3D event.fromElement =3D=3D event.target ? =
event.toElement : event.fromElement;=0A=
=0A=
		// Calculate pageX/Y if missing and clientX/Y available=0A=
		if ( event.pageX =3D=3D null && event.clientX !=3D null ) {=0A=
			var doc =3D document.documentElement, body =3D document.body;=0A=
			event.pageX =3D event.clientX + (doc && doc.scrollLeft || body && =
body.scrollLeft || 0) - (doc.clientLeft || 0);=0A=
			event.pageY =3D event.clientY + (doc && doc.scrollTop || body && =
body.scrollTop || 0) - (doc.clientTop || 0);=0A=
		}=0A=
			=0A=
		// Add which for key events=0A=
		if ( !event.which && ((event.charCode || event.charCode =3D=3D=3D 0) ? =
event.charCode : event.keyCode) )=0A=
			event.which =3D event.charCode || event.keyCode;=0A=
		=0A=
		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for =
Macs)=0A=
		if ( !event.metaKey && event.ctrlKey )=0A=
			event.metaKey =3D event.ctrlKey;=0A=
=0A=
		// Add which for click: 1 =3D=3D left; 2 =3D=3D middle; 3 =3D=3D right=0A=
		// Note: button is not normalized, so don't use it=0A=
		if ( !event.which && event.button )=0A=
			event.which =3D (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( =
event.button & 4 ? 2 : 0 ) ));=0A=
			=0A=
		return event;=0A=
	},=0A=
	=0A=
	special: {=0A=
		ready: {=0A=
			setup: function() {=0A=
				// Make sure the ready event is setup=0A=
				bindReady();=0A=
				return;=0A=
			},=0A=
			=0A=
			teardown: function() { return; }=0A=
		},=0A=
		=0A=
		mouseenter: {=0A=
			setup: function() {=0A=
				if ( jQuery.browser.msie ) return false;=0A=
				jQuery(this).bind("mouseover", =
jQuery.event.special.mouseenter.handler);=0A=
				return true;=0A=
			},=0A=
		=0A=
			teardown: function() {=0A=
				if ( jQuery.browser.msie ) return false;=0A=
				jQuery(this).unbind("mouseover", =
jQuery.event.special.mouseenter.handler);=0A=
				return true;=0A=
			},=0A=
			=0A=
			handler: function(event) {=0A=
				// If we actually just moused on to a sub-element, ignore it=0A=
				if ( withinElement(event, this) ) return true;=0A=
				// Execute the right handlers by setting the event type to mouseenter=0A=
				arguments[0].type =3D "mouseenter";=0A=
				return jQuery.event.handle.apply(this, arguments);=0A=
			}=0A=
		},=0A=
	=0A=
		mouseleave: {=0A=
			setup: function() {=0A=
				if ( jQuery.browser.msie ) return false;=0A=
				jQuery(this).bind("mouseout", =
jQuery.event.special.mouseleave.handler);=0A=
				return true;=0A=
			},=0A=
		=0A=
			teardown: function() {=0A=
				if ( jQuery.browser.msie ) return false;=0A=
				jQuery(this).unbind("mouseout", =
jQuery.event.special.mouseleave.handler);=0A=
				return true;=0A=
			},=0A=
			=0A=
			handler: function(event) {=0A=
				// If we actually just moused on to a sub-element, ignore it=0A=
				if ( withinElement(event, this) ) return true;=0A=
				// Execute the right handlers by setting the event type to mouseleave=0A=
				arguments[0].type =3D "mouseleave";=0A=
				return jQuery.event.handle.apply(this, arguments);=0A=
			}=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
jQuery.fn.extend({=0A=
	bind: function( type, data, fn ) {=0A=
		return type =3D=3D "unload" ? this.one(type, data, fn) : =
this.each(function(){=0A=
			jQuery.event.add( this, type, fn || data, fn && data );=0A=
		});=0A=
	},=0A=
	=0A=
	one: function( type, data, fn ) {=0A=
		return this.each(function(){=0A=
			jQuery.event.add( this, type, function(event) {=0A=
				jQuery(this).unbind(event);=0A=
				return (fn || data).apply( this, arguments);=0A=
			}, fn && data);=0A=
		});=0A=
	},=0A=
=0A=
	unbind: function( type, fn ) {=0A=
		return this.each(function(){=0A=
			jQuery.event.remove( this, type, fn );=0A=
		});=0A=
	},=0A=
=0A=
	trigger: function( type, data, fn ) {=0A=
		return this.each(function(){=0A=
			jQuery.event.trigger( type, data, this, true, fn );=0A=
		});=0A=
	},=0A=
=0A=
	triggerHandler: function( type, data, fn ) {=0A=
		if ( this[0] )=0A=
			return jQuery.event.trigger( type, data, this[0], false, fn );=0A=
		return undefined;=0A=
	},=0A=
=0A=
	toggle: function() {=0A=
		// Save reference to arguments for access in closure=0A=
		var args =3D arguments;=0A=
=0A=
		return this.click(function(event) {=0A=
			// Figure out which function to execute=0A=
			this.lastToggle =3D 0 =3D=3D this.lastToggle ? 1 : 0;=0A=
			=0A=
			// Make sure that clicks stop=0A=
			event.preventDefault();=0A=
			=0A=
			// and execute the function=0A=
			return args[this.lastToggle].apply( this, arguments ) || false;=0A=
		});=0A=
	},=0A=
=0A=
	hover: function(fnOver, fnOut) {=0A=
		return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);=0A=
	},=0A=
	=0A=
	ready: function(fn) {=0A=
		// Attach the listeners=0A=
		bindReady();=0A=
=0A=
		// If the DOM is already ready=0A=
		if ( jQuery.isReady )=0A=
			// Execute the function immediately=0A=
			fn.call( document, jQuery );=0A=
			=0A=
		// Otherwise, remember the function for later=0A=
		else=0A=
			// Add the function to the wait list=0A=
			jQuery.readyList.push( function() { return fn.call(this, jQuery); } );=0A=
	=0A=
		return this;=0A=
	}=0A=
});=0A=
=0A=
jQuery.extend({=0A=
	isReady: false,=0A=
	readyList: [],=0A=
	// Handle when the DOM is ready=0A=
	ready: function() {=0A=
		// Make sure that the DOM is not already loaded=0A=
		if ( !jQuery.isReady ) {=0A=
			// Remember that the DOM is ready=0A=
			jQuery.isReady =3D true;=0A=
			=0A=
			// If there are functions bound, to execute=0A=
			if ( jQuery.readyList ) {=0A=
				// Execute all of them=0A=
				jQuery.each( jQuery.readyList, function(){=0A=
					this.apply( document );=0A=
				});=0A=
				=0A=
				// Reset the list of functions=0A=
				jQuery.readyList =3D null;=0A=
			}=0A=
		=0A=
			// Trigger any bound ready events=0A=
			jQuery(document).triggerHandler("ready");=0A=
		}=0A=
	}=0A=
});=0A=
=0A=
var readyBound =3D false;=0A=
=0A=
function bindReady(){=0A=
	if ( readyBound ) return;=0A=
	readyBound =3D true;=0A=
=0A=
	// Mozilla, Opera (see further below for it) and webkit nightlies =
currently support this event=0A=
	if ( document.addEventListener && !jQuery.browser.opera)=0A=
		// Use the handy event callback=0A=
		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );=0A=
	=0A=
	// If IE is used and is not in a frame=0A=
	// Continually check to see if the document is ready=0A=
	if ( jQuery.browser.msie && window =3D=3D top ) (function(){=0A=
		if (jQuery.isReady) return;=0A=
		try {=0A=
			// If IE is used, use the trick by Diego Perini=0A=
			// http://javascript.nwbox.com/IEContentLoaded/=0A=
			document.documentElement.doScroll("left");=0A=
		} catch( error ) {=0A=
			setTimeout( arguments.callee, 0 );=0A=
			return;=0A=
		}=0A=
		// and execute any waiting functions=0A=
		jQuery.ready();=0A=
	})();=0A=
=0A=
	if ( jQuery.browser.opera )=0A=
		document.addEventListener( "DOMContentLoaded", function () {=0A=
			if (jQuery.isReady) return;=0A=
			for (var i =3D 0; i < document.styleSheets.length; i++)=0A=
				if (document.styleSheets[i].disabled) {=0A=
					setTimeout( arguments.callee, 0 );=0A=
					return;=0A=
				}=0A=
			// and execute any waiting functions=0A=
			jQuery.ready();=0A=
		}, false);=0A=
=0A=
	if ( jQuery.browser.safari ) {=0A=
		var numStyles;=0A=
		(function(){=0A=
			if (jQuery.isReady) return;=0A=
			if ( document.readyState !=3D "loaded" && document.readyState !=3D =
"complete" ) {=0A=
				setTimeout( arguments.callee, 0 );=0A=
				return;=0A=
			}=0A=
			if ( numStyles =3D=3D=3D undefined )=0A=
				numStyles =3D jQuery("style, link[rel=3Dstylesheet]").length;=0A=
			if ( document.styleSheets.length !=3D numStyles ) {=0A=
				setTimeout( arguments.callee, 0 );=0A=
				return;=0A=
			}=0A=
			// and execute any waiting functions=0A=
			jQuery.ready();=0A=
		})();=0A=
	}=0A=
=0A=
	// A fallback to window.onload, that will always work=0A=
	jQuery.event.add( window, "load", jQuery.ready );=0A=
}=0A=
=0A=
jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +=0A=
	"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + =0A=
	"submit,keydown,keypress,keyup,error").split(","), function(i, name){=0A=
	=0A=
	// Handle event binding=0A=
	jQuery.fn[name] =3D function(fn){=0A=
		return fn ? this.bind(name, fn) : this.trigger(name);=0A=
	};=0A=
});=0A=
=0A=
// Checks if an event happened on an element within another element=0A=
// Used in jQuery.event.special.mouseenter and mouseleave handlers=0A=
var withinElement =3D function(event, elem) {=0A=
	// Check if mouse(over|out) are still within the same parent element=0A=
	var parent =3D event.relatedTarget;=0A=
	// Traverse up the tree=0A=
	while ( parent && parent !=3D elem ) try { parent =3D =
parent.parentNode; } catch(error) { parent =3D elem; }=0A=
	// Return true if we actually just moused on to a sub-element=0A=
	return parent =3D=3D elem;=0A=
};=0A=
=0A=
// Prevent memory leaks in IE=0A=
// And prevent errors on refresh with events like mouseover in other =
browsers=0A=
// Window isn't included so as not to unbind existing unload events=0A=
jQuery(window).bind("unload", function() {=0A=
	jQuery("*").add(document).unbind();=0A=
});=0A=
jQuery.fn.extend({=0A=
	load: function( url, params, callback ) {=0A=
		if ( jQuery.isFunction( url ) )=0A=
			return this.bind("load", url);=0A=
=0A=
		var off =3D url.indexOf(" ");=0A=
		if ( off >=3D 0 ) {=0A=
			var selector =3D url.slice(off, url.length);=0A=
			url =3D url.slice(0, off);=0A=
		}=0A=
=0A=
		callback =3D callback || function(){};=0A=
=0A=
		// Default to a GET request=0A=
		var type =3D "GET";=0A=
=0A=
		// If the second parameter was provided=0A=
		if ( params )=0A=
			// If it's a function=0A=
			if ( jQuery.isFunction( params ) ) {=0A=
				// We assume that it's the callback=0A=
				callback =3D params;=0A=
				params =3D null;=0A=
=0A=
			// Otherwise, build a param string=0A=
			} else {=0A=
				params =3D jQuery.param( params );=0A=
				type =3D "POST";=0A=
			}=0A=
=0A=
		var self =3D this;=0A=
=0A=
		// Request the remote document=0A=
		jQuery.ajax({=0A=
			url: url,=0A=
			type: type,=0A=
			dataType: "html",=0A=
			data: params,=0A=
			complete: function(res, status){=0A=
				// If successful, inject the HTML into all the matched elements=0A=
				if ( status =3D=3D "success" || status =3D=3D "notmodified" )=0A=
					// See if a selector was specified=0A=
					self.html( selector ?=0A=
						// Create a dummy div to hold the results=0A=
						jQuery("<div/>")=0A=
							// inject the contents of the document in, removing the scripts=0A=
							// to avoid any 'Permission Denied' errors in IE=0A=
							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))=0A=
=0A=
							// Locate the specified elements=0A=
							.find(selector) :=0A=
=0A=
						// If not, just inject the full result=0A=
						res.responseText );=0A=
=0A=
				self.each( callback, [res.responseText, status, res] );=0A=
			}=0A=
		});=0A=
		return this;=0A=
	},=0A=
=0A=
	serialize: function() {=0A=
		return jQuery.param(this.serializeArray());=0A=
	},=0A=
	serializeArray: function() {=0A=
		return this.map(function(){=0A=
			return jQuery.nodeName(this, "form") ?=0A=
				jQuery.makeArray(this.elements) : this;=0A=
		})=0A=
		.filter(function(){=0A=
			return this.name && !this.disabled && =0A=
				(this.checked || /select|textarea/i.test(this.nodeName) || =0A=
					/text|hidden|password/i.test(this.type));=0A=
		})=0A=
		.map(function(i, elem){=0A=
			var val =3D jQuery(this).val();=0A=
			return val =3D=3D null ? null :=0A=
				val.constructor =3D=3D Array ?=0A=
					jQuery.map( val, function(val, i){=0A=
						return {name: elem.name, value: val};=0A=
					}) :=0A=
					{name: elem.name, value: val};=0A=
		}).get();=0A=
	}=0A=
});=0A=
=0A=
// Attach a bunch of functions for handling common AJAX events=0A=
jQuery.each( =
"ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(",=
"), function(i,o){=0A=
	jQuery.fn[o] =3D function(f){=0A=
		return this.bind(o, f);=0A=
	};=0A=
});=0A=
=0A=
var jsc =3D (new Date).getTime();=0A=
=0A=
jQuery.extend({=0A=
	get: function( url, data, callback, type ) {=0A=
		// shift arguments if data argument was ommited=0A=
		if ( jQuery.isFunction( data ) ) {=0A=
			callback =3D data;=0A=
			data =3D null;=0A=
		}=0A=
		=0A=
		return jQuery.ajax({=0A=
			type: "GET",=0A=
			url: url,=0A=
			data: data,=0A=
			success: callback,=0A=
			dataType: type=0A=
		});=0A=
	},=0A=
=0A=
	getScript: function( url, callback ) {=0A=
		return jQuery.get(url, null, callback, "script");=0A=
	},=0A=
=0A=
	getJSON: function( url, data, callback ) {=0A=
		return jQuery.get(url, data, callback, "json");=0A=
	},=0A=
=0A=
	post: function( url, data, callback, type ) {=0A=
		if ( jQuery.isFunction( data ) ) {=0A=
			callback =3D data;=0A=
			data =3D {};=0A=
		}=0A=
=0A=
		return jQuery.ajax({=0A=
			type: "POST",=0A=
			url: url,=0A=
			data: data,=0A=
			success: callback,=0A=
			dataType: type=0A=
		});=0A=
	},=0A=
=0A=
	ajaxSetup: function( settings ) {=0A=
		jQuery.extend( jQuery.ajaxSettings, settings );=0A=
	},=0A=
=0A=
	ajaxSettings: {=0A=
		global: true,=0A=
		type: "GET",=0A=
		timeout: 0,=0A=
		contentType: "application/x-www-form-urlencoded",=0A=
		processData: true,=0A=
		async: true,=0A=
		data: null,=0A=
		username: null,=0A=
		password: null,=0A=
		accepts: {=0A=
			xml: "application/xml, text/xml",=0A=
			html: "text/html",=0A=
			script: "text/javascript, application/javascript",=0A=
			json: "application/json, text/javascript",=0A=
			text: "text/plain",=0A=
			_default: "*/*"=0A=
		}=0A=
	},=0A=
	=0A=
	// Last-Modified header cache for next request=0A=
	lastModified: {},=0A=
=0A=
	ajax: function( s ) {=0A=
		var jsonp, jsre =3D /=3D\?(&|$)/g, status, data;=0A=
=0A=
		// Extend the settings, but re-extend 's' so that it can be=0A=
		// checked again later (in the test suite, specifically)=0A=
		s =3D jQuery.extend(true, s, jQuery.extend(true, {}, =
jQuery.ajaxSettings, s));=0A=
=0A=
		// convert data if not already a string=0A=
		if ( s.data && s.processData && typeof s.data !=3D "string" )=0A=
			s.data =3D jQuery.param(s.data);=0A=
=0A=
		// Handle JSONP Parameter Callbacks=0A=
		if ( s.dataType =3D=3D "jsonp" ) {=0A=
			if ( s.type.toLowerCase() =3D=3D "get" ) {=0A=
				if ( !s.url.match(jsre) )=0A=
					s.url +=3D (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || =
"callback") + "=3D?";=0A=
			} else if ( !s.data || !s.data.match(jsre) )=0A=
				s.data =3D (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + =
"=3D?";=0A=
			s.dataType =3D "json";=0A=
		}=0A=
=0A=
		// Build temporary JSONP function=0A=
		if ( s.dataType =3D=3D "json" && (s.data && s.data.match(jsre) || =
s.url.match(jsre)) ) {=0A=
			jsonp =3D "jsonp" + jsc++;=0A=
=0A=
			// Replace the =3D? sequence both in the query string and the data=0A=
			if ( s.data )=0A=
				s.data =3D (s.data + "").replace(jsre, "=3D" + jsonp + "$1");=0A=
			s.url =3D s.url.replace(jsre, "=3D" + jsonp + "$1");=0A=
=0A=
			// We need to make sure=0A=
			// that a JSONP style response is executed properly=0A=
			s.dataType =3D "script";=0A=
=0A=
			// Handle JSONP-style loading=0A=
			window[ jsonp ] =3D function(tmp){=0A=
				data =3D tmp;=0A=
				success();=0A=
				complete();=0A=
				// Garbage collect=0A=
				window[ jsonp ] =3D undefined;=0A=
				try{ delete window[ jsonp ]; } catch(e){}=0A=
				if ( head )=0A=
					head.removeChild( script );=0A=
			};=0A=
		}=0A=
=0A=
		if ( s.dataType =3D=3D "script" && s.cache =3D=3D null )=0A=
			s.cache =3D false;=0A=
=0A=
		if ( s.cache =3D=3D=3D false && s.type.toLowerCase() =3D=3D "get" ) {=0A=
			var ts =3D (new Date()).getTime();=0A=
			// try replacing _=3D if it is there=0A=
			var ret =3D s.url.replace(/(\?|&)_=3D.*?(&|$)/, "$1_=3D" + ts + "$2");=0A=
			// if nothing was replaced, add timestamp to the end=0A=
			s.url =3D ret + ((ret =3D=3D s.url) ? (s.url.match(/\?/) ? "&" : "?") =
+ "_=3D" + ts : "");=0A=
		}=0A=
=0A=
		// If data is available, append data to url for get requests=0A=
		if ( s.data && s.type.toLowerCase() =3D=3D "get" ) {=0A=
			s.url +=3D (s.url.match(/\?/) ? "&" : "?") + s.data;=0A=
=0A=
			// IE likes to send both get and post data, prevent this=0A=
			s.data =3D null;=0A=
		}=0A=
=0A=
		// Watch for a new set of requests=0A=
		if ( s.global && ! jQuery.active++ )=0A=
			jQuery.event.trigger( "ajaxStart" );=0A=
=0A=
		// If we're requesting a remote document=0A=
		// and trying to load JSON or Script with a GET=0A=
		if ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && s.dataType =
=3D=3D "script" && s.type.toLowerCase() =3D=3D "get" ) {=0A=
			var head =3D document.getElementsByTagName("head")[0];=0A=
			var script =3D document.createElement("script");=0A=
			script.src =3D s.url;=0A=
			if (s.scriptCharset)=0A=
				script.charset =3D s.scriptCharset;=0A=
=0A=
			// Handle Script loading=0A=
			if ( !jsonp ) {=0A=
				var done =3D false;=0A=
=0A=
				// Attach handlers for all browsers=0A=
				script.onload =3D script.onreadystatechange =3D function(){=0A=
					if ( !done && (!this.readyState || =0A=
							this.readyState =3D=3D "loaded" || this.readyState =3D=3D =
"complete") ) {=0A=
						done =3D true;=0A=
						success();=0A=
						complete();=0A=
						head.removeChild( script );=0A=
					}=0A=
				};=0A=
			}=0A=
=0A=
			head.appendChild(script);=0A=
=0A=
			// We handle everything using the script element injection=0A=
			return undefined;=0A=
		}=0A=
=0A=
		var requestDone =3D false;=0A=
=0A=
		// Create the request object; Microsoft failed to properly=0A=
		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject =
when it is available=0A=
		var xml =3D window.ActiveXObject ? new =
ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();=0A=
=0A=
		// Open the socket=0A=
		xml.open(s.type, s.url, s.async, s.username, s.password);=0A=
=0A=
		// Need an extra try/catch for cross domain requests in Firefox 3=0A=
		try {=0A=
			// Set the correct header, if data is being sent=0A=
			if ( s.data )=0A=
				xml.setRequestHeader("Content-Type", s.contentType);=0A=
=0A=
			// Set the If-Modified-Since header, if ifModified mode.=0A=
			if ( s.ifModified )=0A=
				xml.setRequestHeader("If-Modified-Since",=0A=
					jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );=0A=
=0A=
			// Set header so the called script knows that it's an XMLHttpRequest=0A=
			xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");=0A=
=0A=
			// Set the Accepts header for the server, depending on the dataType=0A=
			xml.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?=0A=
				s.accepts[ s.dataType ] + ", */*" :=0A=
				s.accepts._default );=0A=
		} catch(e){}=0A=
=0A=
		// Allow custom headers/mimetypes=0A=
		if ( s.beforeSend )=0A=
			s.beforeSend(xml);=0A=
			=0A=
		if ( s.global )=0A=
			jQuery.event.trigger("ajaxSend", [xml, s]);=0A=
=0A=
		// Wait for a response to come back=0A=
		var onreadystatechange =3D function(isTimeout){=0A=
			// The transfer is complete and the data is available, or the request =
timed out=0A=
			if ( !requestDone && xml && (xml.readyState =3D=3D 4 || isTimeout =
=3D=3D "timeout") ) {=0A=
				requestDone =3D true;=0A=
				=0A=
				// clear poll interval=0A=
				if (ival) {=0A=
					clearInterval(ival);=0A=
					ival =3D null;=0A=
				}=0A=
				=0A=
				status =3D isTimeout =3D=3D "timeout" && "timeout" ||=0A=
					!jQuery.httpSuccess( xml ) && "error" ||=0A=
					s.ifModified && jQuery.httpNotModified( xml, s.url ) && =
"notmodified" ||=0A=
					"success";=0A=
=0A=
				if ( status =3D=3D "success" ) {=0A=
					// Watch for, and catch, XML document parse errors=0A=
					try {=0A=
						// process the data (runs the xml through httpData regardless of =
callback)=0A=
						data =3D jQuery.httpData( xml, s.dataType );=0A=
					} catch(e) {=0A=
						status =3D "parsererror";=0A=
					}=0A=
				}=0A=
=0A=
				// Make sure that the request was successful or notmodified=0A=
				if ( status =3D=3D "success" ) {=0A=
					// Cache Last-Modified header, if ifModified mode.=0A=
					var modRes;=0A=
					try {=0A=
						modRes =3D xml.getResponseHeader("Last-Modified");=0A=
					} catch(e) {} // swallow exception thrown by FF if header is not =
available=0A=
	=0A=
					if ( s.ifModified && modRes )=0A=
						jQuery.lastModified[s.url] =3D modRes;=0A=
=0A=
					// JSONP handles its own success callback=0A=
					if ( !jsonp )=0A=
						success();	=0A=
				} else=0A=
					jQuery.handleError(s, xml, status);=0A=
=0A=
				// Fire the complete handlers=0A=
				complete();=0A=
=0A=
				// Stop memory leaks=0A=
				if ( s.async )=0A=
					xml =3D null;=0A=
			}=0A=
		};=0A=
		=0A=
		if ( s.async ) {=0A=
			// don't attach the handler to the request, just poll it instead=0A=
			var ival =3D setInterval(onreadystatechange, 13); =0A=
=0A=
			// Timeout checker=0A=
			if ( s.timeout > 0 )=0A=
				setTimeout(function(){=0A=
					// Check to see if the request is still happening=0A=
					if ( xml ) {=0A=
						// Cancel the request=0A=
						xml.abort();=0A=
	=0A=
						if( !requestDone )=0A=
							onreadystatechange( "timeout" );=0A=
					}=0A=
				}, s.timeout);=0A=
		}=0A=
			=0A=
		// Send the data=0A=
		try {=0A=
			xml.send(s.data);=0A=
		} catch(e) {=0A=
			jQuery.handleError(s, xml, null, e);=0A=
		}=0A=
		=0A=
		// firefox 1.5 doesn't fire statechange for sync requests=0A=
		if ( !s.async )=0A=
			onreadystatechange();=0A=
=0A=
		function success(){=0A=
			// If a local callback was specified, fire it and pass it the data=0A=
			if ( s.success )=0A=
				s.success( data, status );=0A=
=0A=
			// Fire the global callback=0A=
			if ( s.global )=0A=
				jQuery.event.trigger( "ajaxSuccess", [xml, s] );=0A=
		}=0A=
=0A=
		function complete(){=0A=
			// Process result=0A=
			if ( s.complete )=0A=
				s.complete(xml, status);=0A=
=0A=
			// The request was completed=0A=
			if ( s.global )=0A=
				jQuery.event.trigger( "ajaxComplete", [xml, s] );=0A=
=0A=
			// Handle the global AJAX counter=0A=
			if ( s.global && ! --jQuery.active )=0A=
				jQuery.event.trigger( "ajaxStop" );=0A=
		}=0A=
		=0A=
		// return XMLHttpRequest to allow aborting the request etc.=0A=
		return xml;=0A=
	},=0A=
=0A=
	handleError: function( s, xml, status, e ) {=0A=
		// If a local callback was specified, fire it=0A=
		if ( s.error ) s.error( xml, status, e );=0A=
=0A=
		// Fire the global callback=0A=
		if ( s.global )=0A=
			jQuery.event.trigger( "ajaxError", [xml, s, e] );=0A=
	},=0A=
=0A=
	// Counter for holding the number of active queries=0A=
	active: 0,=0A=
=0A=
	// Determines if an XMLHttpRequest was successful or not=0A=
	httpSuccess: function( r ) {=0A=
		try {=0A=
			// IE error sometimes returns 1223 when it should be 204 so treat it =
as success, see #1450=0A=
			return !r.status && location.protocol =3D=3D "file:" ||=0A=
				( r.status >=3D 200 && r.status < 300 ) || r.status =3D=3D 304 || =
r.status =3D=3D 1223 ||=0A=
				jQuery.browser.safari && r.status =3D=3D undefined;=0A=
		} catch(e){}=0A=
		return false;=0A=
	},=0A=
=0A=
	// Determines if an XMLHttpRequest returns NotModified=0A=
	httpNotModified: function( xml, url ) {=0A=
		try {=0A=
			var xmlRes =3D xml.getResponseHeader("Last-Modified");=0A=
=0A=
			// Firefox always returns 200. check Last-Modified date=0A=
			return xml.status =3D=3D 304 || xmlRes =3D=3D =
jQuery.lastModified[url] ||=0A=
				jQuery.browser.safari && xml.status =3D=3D undefined;=0A=
		} catch(e){}=0A=
		return false;=0A=
	},=0A=
=0A=
	httpData: function( r, type ) {=0A=
		var ct =3D r.getResponseHeader("content-type");=0A=
		var xml =3D type =3D=3D "xml" || !type && ct && ct.indexOf("xml") >=3D =
0;=0A=
		var data =3D xml ? r.responseXML : r.responseText;=0A=
=0A=
		if ( xml && data.documentElement.tagName =3D=3D "parsererror" )=0A=
			throw "parsererror";=0A=
=0A=
		// If the type is "script", eval it in global context=0A=
		if ( type =3D=3D "script" )=0A=
			jQuery.globalEval( data );=0A=
=0A=
		// Get the JavaScript object, if JSON is used.=0A=
		if ( type =3D=3D "json" )=0A=
			data =3D eval("(" + data + ")");=0A=
=0A=
		return data;=0A=
	},=0A=
=0A=
	// Serialize an array of form elements or a set of=0A=
	// key/values into a query string=0A=
	param: function( a ) {=0A=
		var s =3D [];=0A=
=0A=
		// If an array was passed in, assume that it is an array=0A=
		// of form elements=0A=
		if ( a.constructor =3D=3D Array || a.jquery )=0A=
			// Serialize the form elements=0A=
			jQuery.each( a, function(){=0A=
				s.push( encodeURIComponent(this.name) + "=3D" + encodeURIComponent( =
this.value ) );=0A=
			});=0A=
=0A=
		// Otherwise, assume that it's an object of key/value pairs=0A=
		else=0A=
			// Serialize the key/values=0A=
			for ( var j in a )=0A=
				// If the value is an array then the key names need to be repeated=0A=
				if ( a[j] && a[j].constructor =3D=3D Array )=0A=
					jQuery.each( a[j], function(){=0A=
						s.push( encodeURIComponent(j) + "=3D" + encodeURIComponent( this ) =
);=0A=
					});=0A=
				else=0A=
					s.push( encodeURIComponent(j) + "=3D" + encodeURIComponent( a[j] ) =
);=0A=
=0A=
		// Return the resulting serialization=0A=
		return s.join("&").replace(/%20/g, "+");=0A=
	}=0A=
=0A=
});=0A=
jQuery.fn.extend({=0A=
	show: function(speed,callback){=0A=
		return speed ?=0A=
			this.animate({=0A=
				height: "show", width: "show", opacity: "show"=0A=
			}, speed, callback) :=0A=
			=0A=
			this.filter(":hidden").each(function(){=0A=
				this.style.display =3D this.oldblock || "";=0A=
				if ( jQuery.css(this,"display") =3D=3D "none" ) {=0A=
					var elem =3D jQuery("<" + this.tagName + " />").appendTo("body");=0A=
					this.style.display =3D elem.css("display");=0A=
					// handle an edge condition where css is - div { display:none; } or =
similar=0A=
					if (this.style.display =3D=3D "none")=0A=
						this.style.display =3D "block";=0A=
					elem.remove();=0A=
				}=0A=
			}).end();=0A=
	},=0A=
	=0A=
	hide: function(speed,callback){=0A=
		return speed ?=0A=
			this.animate({=0A=
				height: "hide", width: "hide", opacity: "hide"=0A=
			}, speed, callback) :=0A=
			=0A=
			this.filter(":visible").each(function(){=0A=
				this.oldblock =3D this.oldblock || jQuery.css(this,"display");=0A=
				this.style.display =3D "none";=0A=
			}).end();=0A=
	},=0A=
=0A=
	// Save the old toggle function=0A=
	_toggle: jQuery.fn.toggle,=0A=
	=0A=
	toggle: function( fn, fn2 ){=0A=
		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?=0A=
			this._toggle( fn, fn2 ) :=0A=
			fn ?=0A=
				this.animate({=0A=
					height: "toggle", width: "toggle", opacity: "toggle"=0A=
				}, fn, fn2) :=0A=
				this.each(function(){=0A=
					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();=0A=
				});=0A=
	},=0A=
	=0A=
	slideDown: function(speed,callback){=0A=
		return this.animate({height: "show"}, speed, callback);=0A=
	},=0A=
	=0A=
	slideUp: function(speed,callback){=0A=
		return this.animate({height: "hide"}, speed, callback);=0A=
	},=0A=
=0A=
	slideToggle: function(speed, callback){=0A=
		return this.animate({height: "toggle"}, speed, callback);=0A=
	},=0A=
	=0A=
	fadeIn: function(speed, callback){=0A=
		return this.animate({opacity: "show"}, speed, callback);=0A=
	},=0A=
	=0A=
	fadeOut: function(speed, callback){=0A=
		return this.animate({opacity: "hide"}, speed, callback);=0A=
	},=0A=
	=0A=
	fadeTo: function(speed,to,callback){=0A=
		return this.animate({opacity: to}, speed, callback);=0A=
	},=0A=
	=0A=
	animate: function( prop, speed, easing, callback ) {=0A=
		var optall =3D jQuery.speed(speed, easing, callback);=0A=
=0A=
		return this[ optall.queue =3D=3D=3D false ? "each" : "queue" =
](function(){=0A=
			if ( this.nodeType !=3D 1)=0A=
				return false;=0A=
=0A=
			var opt =3D jQuery.extend({}, optall);=0A=
			var hidden =3D jQuery(this).is(":hidden"), self =3D this;=0A=
			=0A=
			for ( var p in prop ) {=0A=
				if ( prop[p] =3D=3D "hide" && hidden || prop[p] =3D=3D "show" && =
!hidden )=0A=
					return jQuery.isFunction(opt.complete) && opt.complete.apply(this);=0A=
=0A=
				if ( p =3D=3D "height" || p =3D=3D "width" ) {=0A=
					// Store display property=0A=
					opt.display =3D jQuery.css(this, "display");=0A=
=0A=
					// Make sure that nothing sneaks out=0A=
					opt.overflow =3D this.style.overflow;=0A=
				}=0A=
			}=0A=
=0A=
			if ( opt.overflow !=3D null )=0A=
				this.style.overflow =3D "hidden";=0A=
=0A=
			opt.curAnim =3D jQuery.extend({}, prop);=0A=
			=0A=
			jQuery.each( prop, function(name, val){=0A=
				var e =3D new jQuery.fx( self, opt, name );=0A=
=0A=
				if ( /toggle|show|hide/.test(val) )=0A=
					e[ val =3D=3D "toggle" ? hidden ? "show" : "hide" : val ]( prop );=0A=
				else {=0A=
					var parts =3D val.toString().match(/^([+-]=3D)?([\d+-.]+)(.*)$/),=0A=
						start =3D e.cur(true) || 0;=0A=
=0A=
					if ( parts ) {=0A=
						var end =3D parseFloat(parts[2]),=0A=
							unit =3D parts[3] || "px";=0A=
=0A=
						// We need to compute starting value=0A=
						if ( unit !=3D "px" ) {=0A=
							self.style[ name ] =3D (end || 1) + unit;=0A=
							start =3D ((end || 1) / e.cur(true)) * start;=0A=
							self.style[ name ] =3D start + unit;=0A=
						}=0A=
=0A=
						// If a +=3D/-=3D token was provided, we're doing a relative =
animation=0A=
						if ( parts[1] )=0A=
							end =3D ((parts[1] =3D=3D "-=3D" ? -1 : 1) * end) + start;=0A=
=0A=
						e.custom( start, end, unit );=0A=
					} else=0A=
						e.custom( start, val, "" );=0A=
				}=0A=
			});=0A=
=0A=
			// For JS strict compliance=0A=
			return true;=0A=
		});=0A=
	},=0A=
	=0A=
	queue: function(type, fn){=0A=
		if ( jQuery.isFunction(type) || ( type && type.constructor =3D=3D =
Array )) {=0A=
			fn =3D type;=0A=
			type =3D "fx";=0A=
		}=0A=
=0A=
		if ( !type || (typeof type =3D=3D "string" && !fn) )=0A=
			return queue( this[0], type );=0A=
=0A=
		return this.each(function(){=0A=
			if ( fn.constructor =3D=3D Array )=0A=
				queue(this, type, fn);=0A=
			else {=0A=
				queue(this, type).push( fn );=0A=
			=0A=
				if ( queue(this, type).length =3D=3D 1 )=0A=
					fn.apply(this);=0A=
			}=0A=
		});=0A=
	},=0A=
=0A=
	stop: function(clearQueue, gotoEnd){=0A=
		var timers =3D jQuery.timers;=0A=
=0A=
		if (clearQueue)=0A=
			this.queue([]);=0A=
=0A=
		this.each(function(){=0A=
			// go in reverse order so anything added to the queue during the loop =
is ignored=0A=
			for ( var i =3D timers.length - 1; i >=3D 0; i-- )=0A=
				if ( timers[i].elem =3D=3D this ) {=0A=
					if (gotoEnd)=0A=
						// force the next step to be the last=0A=
						timers[i](true);=0A=
					timers.splice(i, 1);=0A=
				}=0A=
		});=0A=
=0A=
		// start the next in the queue if the last step wasn't forced=0A=
		if (!gotoEnd)=0A=
			this.dequeue();=0A=
=0A=
		return this;=0A=
	}=0A=
=0A=
});=0A=
=0A=
var queue =3D function( elem, type, array ) {=0A=
	if ( !elem )=0A=
		return undefined;=0A=
=0A=
	type =3D type || "fx";=0A=
=0A=
	var q =3D jQuery.data( elem, type + "queue" );=0A=
=0A=
	if ( !q || array )=0A=
		q =3D jQuery.data( elem, type + "queue", =0A=
			array ? jQuery.makeArray(array) : [] );=0A=
=0A=
	return q;=0A=
};=0A=
=0A=
jQuery.fn.dequeue =3D function(type){=0A=
	type =3D type || "fx";=0A=
=0A=
	return this.each(function(){=0A=
		var q =3D queue(this, type);=0A=
=0A=
		q.shift();=0A=
=0A=
		if ( q.length )=0A=
			q[0].apply( this );=0A=
	});=0A=
};=0A=
=0A=
jQuery.extend({=0A=
	=0A=
	speed: function(speed, easing, fn) {=0A=
		var opt =3D speed && speed.constructor =3D=3D Object ? speed : {=0A=
			complete: fn || !fn && easing || =0A=
				jQuery.isFunction( speed ) && speed,=0A=
			duration: speed,=0A=
			easing: fn && easing || easing && easing.constructor !=3D Function && =
easing=0A=
		};=0A=
=0A=
		opt.duration =3D (opt.duration && opt.duration.constructor =3D=3D =
Number ? =0A=
			opt.duration : =0A=
			{ slow: 600, fast: 200 }[opt.duration]) || 400;=0A=
	=0A=
		// Queueing=0A=
		opt.old =3D opt.complete;=0A=
		opt.complete =3D function(){=0A=
			if ( opt.queue !=3D=3D false )=0A=
				jQuery(this).dequeue();=0A=
			if ( jQuery.isFunction( opt.old ) )=0A=
				opt.old.apply( this );=0A=
		};=0A=
	=0A=
		return opt;=0A=
	},=0A=
	=0A=
	easing: {=0A=
		linear: function( p, n, firstNum, diff ) {=0A=
			return firstNum + diff * p;=0A=
		},=0A=
		swing: function( p, n, firstNum, diff ) {=0A=
			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;=0A=
		}=0A=
	},=0A=
	=0A=
	timers: [],=0A=
	timerId: null,=0A=
=0A=
	fx: function( elem, options, prop ){=0A=
		this.options =3D options;=0A=
		this.elem =3D elem;=0A=
		this.prop =3D prop;=0A=
=0A=
		if ( !options.orig )=0A=
			options.orig =3D {};=0A=
	}=0A=
=0A=
});=0A=
=0A=
jQuery.fx.prototype =3D {=0A=
=0A=
	// Simple function for setting a style value=0A=
	update: function(){=0A=
		if ( this.options.step )=0A=
			this.options.step.apply( this.elem, [ this.now, this ] );=0A=
=0A=
		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );=0A=
=0A=
		// Set display property to block for height/width animations=0A=
		if ( this.prop =3D=3D "height" || this.prop =3D=3D "width" )=0A=
			this.elem.style.display =3D "block";=0A=
	},=0A=
=0A=
	// Get the current size=0A=
	cur: function(force){=0A=
		if ( this.elem[this.prop] !=3D null && this.elem.style[this.prop] =
=3D=3D null )=0A=
			return this.elem[ this.prop ];=0A=
=0A=
		var r =3D parseFloat(jQuery.css(this.elem, this.prop, force));=0A=
		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, =
this.prop)) || 0;=0A=
	},=0A=
=0A=
	// Start an animation from one number to another=0A=
	custom: function(from, to, unit){=0A=
		this.startTime =3D (new Date()).getTime();=0A=
		this.start =3D from;=0A=
		this.end =3D to;=0A=
		this.unit =3D unit || this.unit || "px";=0A=
		this.now =3D this.start;=0A=
		this.pos =3D this.state =3D 0;=0A=
		this.update();=0A=
=0A=
		var self =3D this;=0A=
		function t(gotoEnd){=0A=
			return self.step(gotoEnd);=0A=
		}=0A=
=0A=
		t.elem =3D this.elem;=0A=
=0A=
		jQuery.timers.push(t);=0A=
=0A=
		if ( jQuery.timerId =3D=3D null ) {=0A=
			jQuery.timerId =3D setInterval(function(){=0A=
				var timers =3D jQuery.timers;=0A=
				=0A=
				for ( var i =3D 0; i < timers.length; i++ )=0A=
					if ( !timers[i]() )=0A=
						timers.splice(i--, 1);=0A=
=0A=
				if ( !timers.length ) {=0A=
					clearInterval( jQuery.timerId );=0A=
					jQuery.timerId =3D null;=0A=
				}=0A=
			}, 13);=0A=
		}=0A=
	},=0A=
=0A=
	// Simple 'show' function=0A=
	show: function(){=0A=
		// Remember where we started, so that we can go back to it later=0A=
		this.options.orig[this.prop] =3D jQuery.attr( this.elem.style, =
this.prop );=0A=
		this.options.show =3D true;=0A=
=0A=
		// Begin the animation=0A=
		this.custom(0, this.cur());=0A=
=0A=
		// Make sure that we start at a small width/height to avoid any=0A=
		// flash of content=0A=
		if ( this.prop =3D=3D "width" || this.prop =3D=3D "height" )=0A=
			this.elem.style[this.prop] =3D "1px";=0A=
		=0A=
		// Start by showing the element=0A=
		jQuery(this.elem).show();=0A=
	},=0A=
=0A=
	// Simple 'hide' function=0A=
	hide: function(){=0A=
		// Remember where we started, so that we can go back to it later=0A=
		this.options.orig[this.prop] =3D jQuery.attr( this.elem.style, =
this.prop );=0A=
		this.options.hide =3D true;=0A=
=0A=
		// Begin the animation=0A=
		this.custom(this.cur(), 0);=0A=
	},=0A=
=0A=
	// Each step of an animation=0A=
	step: function(gotoEnd){=0A=
		var t =3D (new Date()).getTime();=0A=
=0A=
		if ( gotoEnd || t > this.options.duration + this.startTime ) {=0A=
			this.now =3D this.end;=0A=
			this.pos =3D this.state =3D 1;=0A=
			this.update();=0A=
=0A=
			this.options.curAnim[ this.prop ] =3D true;=0A=
=0A=
			var done =3D true;=0A=
			for ( var i in this.options.curAnim )=0A=
				if ( this.options.curAnim[i] !=3D=3D true )=0A=
					done =3D false;=0A=
=0A=
			if ( done ) {=0A=
				if ( this.options.display !=3D null ) {=0A=
					// Reset the overflow=0A=
					this.elem.style.overflow =3D this.options.overflow;=0A=
				=0A=
					// Reset the display=0A=
					this.elem.style.display =3D this.options.display;=0A=
					if ( jQuery.css(this.elem, "display") =3D=3D "none" )=0A=
						this.elem.style.display =3D "block";=0A=
				}=0A=
=0A=
				// Hide the element if the "hide" operation was done=0A=
				if ( this.options.hide )=0A=
					this.elem.style.display =3D "none";=0A=
=0A=
				// Reset the properties, if the item has been hidden or shown=0A=
				if ( this.options.hide || this.options.show )=0A=
					for ( var p in this.options.curAnim )=0A=
						jQuery.attr(this.elem.style, p, this.options.orig[p]);=0A=
			}=0A=
=0A=
			// If a callback was provided, execute it=0A=
			if ( done && jQuery.isFunction( this.options.complete ) )=0A=
				// Execute the complete function=0A=
				this.options.complete.apply( this.elem );=0A=
=0A=
			return false;=0A=
		} else {=0A=
			var n =3D t - this.startTime;=0A=
			this.state =3D n / this.options.duration;=0A=
=0A=
			// Perform the easing function, defaults to swing=0A=
			this.pos =3D jQuery.easing[this.options.easing || =
(jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, =
this.options.duration);=0A=
			this.now =3D this.start + ((this.end - this.start) * this.pos);=0A=
=0A=
			// Perform the next step of the animation=0A=
			this.update();=0A=
		}=0A=
=0A=
		return true;=0A=
	}=0A=
=0A=
};=0A=
=0A=
jQuery.fx.step =3D {=0A=
	scrollLeft: function(fx){=0A=
		fx.elem.scrollLeft =3D fx.now;=0A=
	},=0A=
=0A=
	scrollTop: function(fx){=0A=
		fx.elem.scrollTop =3D fx.now;=0A=
	},=0A=
=0A=
	opacity: function(fx){=0A=
		jQuery.attr(fx.elem.style, "opacity", fx.now);=0A=
	},=0A=
=0A=
	_default: function(fx){=0A=
		fx.elem.style[ fx.prop ] =3D fx.now + fx.unit;=0A=
	}=0A=
};=0A=
// The Offset Method=0A=
// Originally By Brandon Aaron, part of the Dimension Plugin=0A=
// http://jquery.com/plugins/project/dimensions=0A=
jQuery.fn.offset =3D function() {=0A=
	var left =3D 0, top =3D 0, elem =3D this[0], results;=0A=
	=0A=
	if ( elem ) with ( jQuery.browser ) {=0A=
		var parent       =3D elem.parentNode, =0A=
		    offsetChild  =3D elem,=0A=
		    offsetParent =3D elem.offsetParent, =0A=
		    doc          =3D elem.ownerDocument,=0A=
		    safari2      =3D safari && parseInt(version) < 522 && =
!/adobeair/i.test(userAgent),=0A=
		    fixed        =3D jQuery.css(elem, "position") =3D=3D "fixed";=0A=
	=0A=
		// Use getBoundingClientRect if available=0A=
		if ( elem.getBoundingClientRect ) {=0A=
			var box =3D elem.getBoundingClientRect();=0A=
		=0A=
			// Add the document scroll offsets=0A=
			add(box.left + Math.max(doc.documentElement.scrollLeft, =
doc.body.scrollLeft),=0A=
				box.top  + Math.max(doc.documentElement.scrollTop,  =
doc.body.scrollTop));=0A=
		=0A=
			// IE adds the HTML element's border, by default it is medium which =
is 2px=0A=
			// IE 6 and 7 quirks mode the border width is overwritable by the =
following css html { border: 0; }=0A=
			// IE 7 standards mode, the border is always 2px=0A=
			// This border/offset is typically represented by the clientLeft and =
clientTop properties=0A=
			// However, in IE6 and 7 quirks mode the clientLeft and clientTop =
properties are not updated when overwriting it via CSS=0A=
			// Therefore this method will be off by 2px in IE while in quirksmode=0A=
			add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop =
);=0A=
	=0A=
		// Otherwise loop through the offsetParents and parentNodes=0A=
		} else {=0A=
		=0A=
			// Initial element offsets=0A=
			add( elem.offsetLeft, elem.offsetTop );=0A=
			=0A=
			// Get parent offsets=0A=
			while ( offsetParent ) {=0A=
				// Add offsetParent offsets=0A=
				add( offsetParent.offsetLeft, offsetParent.offsetTop );=0A=
			=0A=
				// Mozilla and Safari > 2 does not include the border on offset =
parents=0A=
				// However Mozilla adds the border for table or table cells=0A=
				if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || =
safari && !safari2 )=0A=
					border( offsetParent );=0A=
					=0A=
				// Add the document scroll offsets if position is fixed on any =
offsetParent=0A=
				if ( !fixed && jQuery.css(offsetParent, "position") =3D=3D "fixed" )=0A=
					fixed =3D true;=0A=
			=0A=
				// Set offsetChild to previous offsetParent unless it is the body =
element=0A=
				offsetChild  =3D /^body$/i.test(offsetParent.tagName) ? offsetChild =
: offsetParent;=0A=
				// Get next offsetParent=0A=
				offsetParent =3D offsetParent.offsetParent;=0A=
			}=0A=
		=0A=
			// Get parent scroll offsets=0A=
			while ( parent && parent.tagName && =
!/^body|html$/i.test(parent.tagName) ) {=0A=
				// Remove parent scroll UNLESS that parent is inline or a table to =
work around Opera inline/table scrollLeft/Top bug=0A=
				if ( !/^inline|table.*$/i.test(jQuery.css(parent, "display")) )=0A=
					// Subtract parent scroll offsets=0A=
					add( -parent.scrollLeft, -parent.scrollTop );=0A=
			=0A=
				// Mozilla does not add the border for a parent that has overflow =
!=3D visible=0A=
				if ( mozilla && jQuery.css(parent, "overflow") !=3D "visible" )=0A=
					border( parent );=0A=
			=0A=
				// Get next parent=0A=
				parent =3D parent.parentNode;=0A=
			}=0A=
		=0A=
			// Safari <=3D 2 doubles body offsets with a fixed position =
element/offsetParent or absolutely positioned offsetChild=0A=
			// Mozilla doubles body offsets with a non-absolutely positioned =
offsetChild=0A=
			if ( (safari2 && (fixed || jQuery.css(offsetChild, "position") =3D=3D =
"absolute")) || =0A=
				(mozilla && jQuery.css(offsetChild, "position") !=3D "absolute") )=0A=
					add( -doc.body.offsetLeft, -doc.body.offsetTop );=0A=
			=0A=
			// Add the document scroll offsets if position is fixed=0A=
			if ( fixed )=0A=
				add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),=0A=
					Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));=0A=
		}=0A=
=0A=
		// Return an object with top and left properties=0A=
		results =3D { top: top, left: left };=0A=
	}=0A=
=0A=
	function border(elem) {=0A=
		add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, =
"borderTopWidth", true) );=0A=
	}=0A=
=0A=
	function add(l, t) {=0A=
		left +=3D parseInt(l) || 0;=0A=
		top +=3D parseInt(t) || 0;=0A=
	}=0A=
=0A=
	return results;=0A=
};=0A=
})();=0A=

------=_NextPart_000_0000_01C9EA81.8633EB00
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://nrich.maths.org/javascript/jquery.nrichNoCache.js

jQuery.fn.slidingPanel =3D function(showText, hideText) {=0A=
    return this.each(function() {=0A=
	//if(jQuery.browser.safari) // hide() and show() fail in Safari=0A=
	//    return;=0A=
	var closed =3D true;=0A=
	var $button =3D =
$(this).addClass("panel-up").removeClass('panel-down').css('cursor','poin=
ter');=0A=
	var $link =3D $button.find('a:first');=0A=
	if($link.length =3D=3D 0) {=0A=
	    // There is no hyperlink we can use for styling purposes =0A=
	    $link =3D $button.css('color','blue');=0A=
	    $link.hover(=0A=
		function() {=0A=
		    $(this).css('color','red');=0A=
		},=0A=
		function() {=0A=
		    $(this).css('color', 'blue');=0A=
		});=0A=
	}=0A=
	$link.html(showText).prepend('<img =
src=3D"../media/mountain/menu-collapsed.png" alt=3D"collapsed-menu" =
title=3D"expand" style=3D"padding:3px;" />');=0A=
=0A=
	// The sliding panel is assumed to be directly after the button=0A=
        var $panel =3D $button.next();=0A=
	//console.log("panel css1 =3D "+$panel.css('display'));=0A=
	$panel.addClass("panel-closed").hide("fast");=0A=
=0A=
	$link.click(function() {=0A=
		//console.log("panel css2 =3D "+$panel.css('display'));=0A=
	    if(closed) {=0A=
		$button.addClass("panel-down").removeClass("panel-up");=0A=
		$link.html(hideText).prepend('<img =
src=3D"../media/mountain/menu-expanded.png" alt=3D"expanded-menu" =
title=3D"collapse" style=3D"padding:3px;" />');=0A=
		=
$panel.addClass("panel-open").removeClass("panel-closed").show("normal");=0A=
		closed=3Dfalse;=0A=
	    }=0A=
	    else {=0A=
		$button.addClass("panel-up").removeClass("panel-down");=0A=
		$link.html(showText).prepend('<img =
src=3D"../media/mountain/menu-collapsed.png" alt=3D"collapsed-menu" =
title=3D"expand" style=3D"padding:3px;" />');=0A=
		=
$panel.addClass("panel-closed").removeClass("panel-open").hide("normal");=0A=
		closed=3Dtrue;=0A=
	    }=0A=
	    return false; // cancel default link behaviour=0A=
	});=0A=
=0A=
    });=0A=
}=0A=

------=_NextPart_000_0000_01C9EA81.8633EB00
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://nrich.maths.org/javascript/air.js

/**=0A=
 * Give AIR NRICH Editor access to bits and pieces it needs through the =
child sandbox bridge.=0A=
 */=0A=
/* For test purposes only...=0A=
=0A=
$(document).ready(function() {=0A=
    // Disable all links. (Used in editor preview)=0A=
	$("a").addClass("disabledLink").click(function(event) {=0A=
	    event.preventDefault();=0A=
	    //alert("Oops - use the Site View to follow links");=0A=
	    //return false;=0A=
	});=0A=
});=0A=
*/=0A=
=0A=
window.childSandboxBridge =3D {=0A=
=0A=
    // These functions provides AIR access to the HTML problemview.=0A=
    getHTML: function() {=0A=
	return $("#problemview").html();=0A=
    },=0A=
    setHTML: function(s) {=0A=
	$("#problemview").html(s);=0A=
    },=0A=
=0A=
    // Automated login from AIR=0A=
    login: function(username, password, referrer) {=0A=
	// =0A=
	// We insert the hidden login parameter because login.php expects it, =
and it=0A=
	// is normally generated by pressing the login button on the page. We =
have=0A=
	// to simulate that bit...=0A=
	//=0A=
	$("input[name=3D'username']").attr("value", username)=0A=
	.before('<input type=3D"hidden" name=3D"login" value=3D"submit" />');=0A=
	$("input[name=3D'password']").attr("value", password);=0A=
	$("input[name=3D'referrer']").attr("value", referrer);=0A=
	$("#loginform > form").submit();=0A=
    },=0A=
=0A=
    // Reload the current page=0A=
    refresh: function() {=0A=
	jsMath.ConvertTeX();=0A=
	jsMath.Process();=0A=
    },=0A=
=0A=
    // Upload an edited part=0A=
    upload: function(objId, part, source, action) {=0A=
	//var =
action=3D"https://nrich.local/admin/upload.php";//?sendXML=3D1&amp;obj_id=
=3D"+objId+"&amp;part=3D"+part;=0A=
	//alert("url =3D "+parent.location);=0A=
	//alert("uploading to:"+objId+ " part=3D"+part + " source empty?" + =
(source=3D=3Dnull || source =3D=3D""));=0A=
	$.post(action, =0A=
	       {=0A=
		   sendXML : 1,=0A=
		   obj_id : objId,=0A=
		   part : part,=0A=
		   data : source=0A=
	       }, =0A=
	       function(data) {=0A=
		   // We'll only receive this callback if the page upload was =
successful=0A=
=0A=
		   //alert("objId=3D"+objId+" part=3D"+part);=0A=
		   url =3D '../public/viewer.php?obj_id=3D'+objId+'&part=3D'+part;=0A=
		   //alert("redirect to: " + url);=0A=
		   parent.location =3D url;=0A=
		   return data;=0A=
	       }=0A=
	      );=0A=
    },=0A=
=0A=
    // Disable all links. (Used in editor preview)=0A=
    disableAllLinks: function() {=0A=
	$("a").addClass("disabledLink").click(function(event) {=0A=
	    event.preventDefault();=0A=
	    //alert("Oops - use the Site View to follow links");=0A=
	    //return false;=0A=
	});=0A=
    }=0A=
};=0A=

------=_NextPart_000_0000_01C9EA81.8633EB00
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://nrich.maths.org/javascript/jsMath/easy/load.js

/**********************************************************************=0A=
 *=0A=
 *   Customize the values given below to suit your needs.=0A=
 *   You can make additional copies of this file with=0A=
 *   different customizated settings if you need to load=0A=
 *   jsMath with different parameters.=0A=
 *   =0A=
 *   Load this page via:=0A=
 *   =0A=
 *   <SCRIPT SRC=3D"path-to-jsMath/easy/load.js"></SCRIPT>=0A=
 *   =0A=
 *   (If you are including this file into your page via Server-Side=0A=
 *   Includes, you should remove line above.)=0A=
 *   =0A=
 *   You can make copies of this file with different settings=0A=
 *   if you need to have several different configurations.=0A=
 *   =0A=
 **********************************************************************/=0A=
=0A=
if (!window.jsMath) {window.jsMath =3D {}}=0A=
=0A=
jsMath.Easy =3D {=0A=
  //=0A=
  //  The URL of the root jsMath directory on your server=0A=
  //  (it must be in the same domain as the HTML page).=0A=
  //  It should include "http://yoursite.com/", or should=0A=
  //  be relative to the root of your server.  It is possible=0A=
  //  to be a relative URL, but it will be relative to the=0A=
  //  HTML page loading this file.=0A=
  //  =0A=
  //  If you leave this blank, jsMath will try to look it up from=0A=
  //  the URL where it loaded this file, but that may not work.=0A=
  //=0A=
  root: "",=0A=
  =0A=
  //=0A=
  //  The default scaling factor for mathematics compared to the=0A=
  //  surrounding text.=0A=
  //=0A=
  scale: 120,=0A=
  =0A=
  //=0A=
  //  1 means use the autoload plug-in to decide if jsMath should be =
loaded=0A=
  //  0 means always load jsMath=0A=
  //=0A=
  autoload: 0,=0A=
=0A=
  //=0A=
  //  Setting any of these will cause the tex2math plugin to be used=0A=
  //  to add the <DIV> and <SPAN> tags that jsMath needs.  See the=0A=
  //  documentation for the tex2math plugin for more information.=0A=
  //=0A=
  processSlashParens: 1,       // process \(...\) in text?=0A=
  processSlashBrackets: 1,     // process \[...\] in text?=0A=
  processDoubleDollars: 1,     // process $$...$$ in text?=0A=
  processSingleDollars: 1,     // process $...$ in text?=0A=
  processLaTeXenvironments: 1, // process \begin{xxx}...\end{xxx} =
outside math mode?=0A=
  fixEscapedDollars: 1,        // convert \$ to $ outside of math mode?=0A=
  doubleDollarsAreInLine: 0,   // make $$...$$ be in-line math?=0A=
  allowDisableTag: 1,          // allow ID=3D"tex2math_off" to disable =
tex2math?=0A=
  //=0A=
  //  If you want to use your own custom delimiters for math instead=0A=
  //  of the usual ones, then uncomment the following four lines and=0A=
  //  insert your own delimiters within the quotes.  You may want to=0A=
  //  turn off processing of the dollars and other delimiters above=0A=
  //  as well, though you can use them in combination with the=0A=
  //  custom delimiters if you wish.  See the tex2math documentation=0A=
  //  for more details.=0A=
  //  =0A=
  //customDelimiters: [=0A=
  //  '[math]','[/math]',        // to begin and end in-line math=0A=
  //  '[display]','[/display]'   // to begin and end display math=0A=
  //],=0A=
=0A=
  //=0A=
  //  Show TeX source when mathematics is double-clicked?=0A=
  //=0A=
  allowDoubleClicks: 1,=0A=
  =0A=
  //=0A=
  //  Show jsMath font warning messages?  (Disabling this prevents yours=0A=
  //  users from finding out that they can have a better experience on =
your=0A=
  //  site by installing some fonts, so don't disable this).=0A=
  //=0A=
  showFontWarnings: 0,=0A=
  =0A=
  //=0A=
  //  Use "Process" or "ProcessBeforeShowing".  See the jsMath=0A=
  //  author's documentation for the difference between these=0A=
  //  two routines.=0A=
  //=0A=
  method: "Process",=0A=
=0A=
  //=0A=
  //  List of plug-ins and extensions that you want to be=0A=
  //  loaded automatically.  E.g.=0A=
  //      ["plugins/mimeTeX.js","extensions/AMSsymbols.js"]=0A=
  //  =0A=
  loadFiles: ["plugins/MSIE-zoom-fix.js", "extensions/AMSsymbols.js"],=0A=
  =0A=
  //=0A=
  //  List of fonts to load automatically.  E.g.=0A=
  //      ["cmmib10"]=0A=
  //=0A=
  loadFonts: ["msam10","msbm10"],=0A=
  =0A=
  //=0A=
  //  Allow jsMath to enter global mode?=0A=
  //  (Uses frames, so may not always work with complex web sites)=0A=
  //=0A=
  allowGlobal: 0,=0A=
  =0A=
  //=0A=
  //  Disable image fonts?  (In case you don't load them on your server.)=0A=
  //=0A=
  noImageFonts: 0=0A=
  =0A=
};=0A=
=0A=
/****************************************************************/=0A=
/****************************************************************/=0A=
//=0A=
//            DO NOT MAKE CHANGES BELOW THIS=0A=
//=0A=
/****************************************************************/=0A=
/****************************************************************/=0A=
=0A=
if (jsMath.Easy.root =3D=3D "") {=0A=
  jsMath.Easy.root =3D document.getElementsByTagName("script");=0A=
  jsMath.Easy.root =3D jsMath.Easy.root[jsMath.Easy.root.length-1].src=0A=
  if (jsMath.Easy.root.match(/\/easy\/[^\/]*$/)) {=0A=
    jsMath.Easy.root =3D jsMath.Easy.root.replace(/\/easy\/[^\/]*$/,"");=0A=
  } else {=0A=
    jsMath.Easy.root =3D =
jsMath.Easy.root.replace(/\/(jsMath\/(easy\/)?)?[^\/]*$/,"/jsMath");=0A=
  }=0A=
}=0A=
jsMath.Easy.root =3D jsMath.Easy.root.replace(/\/$/,""); // trim =
trailing "/" if any=0A=
=0A=
document.write('<SCRIPT =
SRC=3D"'+jsMath.Easy.root+'/jsMath-easy-load.js"><'+'/SCRIPT>');=0A=
=0A=

------=_NextPart_000_0000_01C9EA81.8633EB00--

